All versions
0.3.0
Beta
BetterElevator 0.3.05 months ago 137
Compatibility
Minecraft: Java Edition
26.1.x
1.21.x
Platforms
Folia
Paper
Purpur
Changes
BetterElevator
Real-block elevators with smooth motion, solid walls, and per-elevator speed control. Folia and Paper safe.
Features
- Build your own cabin — select any shape with a blaze rod, run
/bet create <name>, done. No restrictive templates. - Smooth, real-block motion — the cabin moves as actual FallingBlocks with vanilla physics carrying you up/down. No teleport jank, no "fall through floor" bugs.
- Solid walls (via ProtocolLib) — passengers can't walk through cabin walls horizontally. Implemented with client-only block packets — server world untouched, non-passengers see nothing. Predictive packet scheduling compensates for network latency.
- Per-elevator speed levels —
/bet speed <elevator> <level>switches between configurable speeds (default 2.5 / 5 / 10 / 20 blocks/sec). Persisted per elevator. - Sign and button triggers — write
[BET] / <elevator> / <floor>on a sign and right-click rides. Or/bet bind <elevator>to turn any block into a call button (opens a floor-picker chest GUI). - Auto floor registration — writing
[BET] / <elevator> / 5F:+6on a sign auto-registers a new floor 6 blocks above the highest existing one. - Per-player permission groups — limit max cabin size, max elevators owned, max speed per group via
permissions/groups.yml. - World filtering — whitelist/blacklist worlds where elevators work.
- Multi-backend storage — YAML (default), SQLite, or MySQL. SQL backends auto-migrate schema.
- i18n — bundled
zh_twanden_us; each player sees their client locale automatically. Drop in your ownlang/<locale>.yml. - Mixed colour syntax — every message accepts MiniMessage tags, legacy
&6codes, and hex&#FFAA00/#FFAA00freely mixed. - Auto config migration — new config keys from updates are merged into your existing config on reload, with comments. Existing values are never overwritten.
Requirements
- Paper 1.21+ (or any Folia build)
- ProtocolLib (soft dependency — only needed for solid walls; without it the plugin runs fine and walls fall back to walk-through)
- Java 21+
Quick start
- Drop the jar in
plugins/. - Restart.
- Get a blaze rod. Left-click one corner of your cabin, right-click the opposite corner.
- Stand inside the cabin. Run
/bet create lobby. - Place a sign somewhere with: [BET] lobby 2F:+5
Right-click it. Cabin moves 5 blocks up.
Commands
| Command | Description |
|---|---|
/bet create <name> |
Create elevator from current selection + standing position |
/bet floor add <elevator> <floor> |
Register your current position as a floor |
/bet floor remove <elevator> <floor> |
Remove a floor |
/bet bind <elevator> |
Bind the block you're looking at as a call button |
/bet unbind |
Remove the call-button binding from the targeted block |
/bet goto <elevator> <floor> |
Force-call elevator to a floor |
/bet speed <elevator> <level> |
Switch speed level |
/bet list |
List all elevators |
/bet info <elevator> |
Inspect an elevator |
/bet delete <elevator> |
Delete an elevator |
/bet reset <elevator|all> |
Clear stuck ride state / orphan blocks |
/bet reload |
Reload config, lang, permissions |
Permissions
betterelevator.admin— full management (default: op)betterelevator.use— ride elevators via signs/buttons (default: true)betterelevator.speed— change elevator speed level (default: op)betterelevator.group.<name>— per-group limits inpermissions/groups.yml
Configuration highlights
motion:
default-blocks-per-second: 2.5
speed-levels: [2.5, 5.0, 10.0, 20.0]
passengers:
fake-wall-blocks: true # solid walls via ProtocolLib
fake-wall-lookahead-ticks: 2 # latency compensation
inride-friction: 0.6 # X/Z friction while riding
worlds:
mode: all # all / whitelist / blacklist
list: []
storage:
type: yaml # yaml / sqlite / mysql
Notes
Folia: the plugin uses per-region scheduling for block writes and entity work. Cross-region rides work.
Passenger limits: by default the cabin carries the player plus any mobs and dropped items inside it. Toggle via passengers.carry-mobs / passengers.carry-items.
Storage migrates from older versions automatically. Don't lose any existing data.
Bug reports and PRs welcome.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:hRLFdx8l:OoIbY7WH"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:hRLFdx8l:OoIbY7WH"
}

