BetterElevator
Real-block elevators with smooth motion and solid walls
What it does
Build a cabin out of any blocks you want, register floors by standing in them, and ride between them with proper vertical motion. Not a teleport — the cabin physically rises with you in it, complete with smooth animation and (if ProtocolLib is installed) solid walls so passengers can't walk out mid-ride.
Works on Spigot, Paper, and Folia. Same jar, no extra setup.
Features
- Build any cabin shape — left/right-click two corners with a blaze rod, run /bet create <name>, done. Hollow, sparse, irregular — all valid.
- Smooth motion — uses FallingBlock with server-controlled velocity. The player rides on top through vanilla physics (no teleport jank, no fall-through).
- Solid walls via ProtocolLib — passengers can't walk through cabin walls horizontally. Implemented with client-only block-change packets, so the server world is never modified and non-passengers see nothing. Predictive packet scheduling compensates for network latency. Requires ProtocolLib (softdepend — works without, walls just won't be solid).
- Per-elevator speed levels — /bet speed <elevator> <level> switches between configurable speeds. Defaults: lv.1 = 2.5 b/s, lv.2 = 5, lv.3 = 10, lv.4 = 20. Persists per elevator.
- Sign triggers — write [BET] / <elevator> / <floor> on a sign and right-click. Or [BET] / <elevator> / 5F:+6 to auto-register a new floor 6 blocks above the highest.
- Button GUI — bind any block as a call-button with /bet bind <elevator>. Right-clicking opens a chest GUI with all floors.
- Permission groups — limit max owned elevators, max cabin size, max speed per group. Configure in permissions/groups.yml.
- World filtering — whitelist or blacklist worlds where elevators work.
- Multi-backend storage — YAML, SQLite, or MySQL. SQL backends auto-create and migrate their schema.
- i18n — bundled English and Traditional Chinese. Per-player locale (each player sees their own client locale). Drop in your own lang/<locale>.yml.
- Mixed color syntax — every configurable message accepts MiniMessage tags, legacy &-codes, and hex (&#FFAA00 or #FFAA00) freely combined.
- Auto config migration — missing keys from updates are merged into your live config (with their comments) on reload. Your existing values are never touched.
Compatibility
- Minecraft 1.21+
- Spigot / Paper / Folia (same jar)
- Java 21+
- Softdepend: ProtocolLib (for solid walls — optional)
Quick start
- Drop the jar into plugins/. Optionally drop ProtocolLib too.
- Restart the server.
- In-game: grab 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:
Code (Text):
[BET]
lobby
2F:+5
Right-click it. The cabin moves 5 blocks up. Walk back in, right-click again to come back.
Commands
- /bet create <name> — create an 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 the 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
- /bet door add <elevator> — Enter door-tagging mode (then click two opposite corners with the blaze rod to define a door rectangle; repeat for multiple doors)
- /bet door done — Exit door-tagging mode and save
- /bet door clear <elevator> — Remove every door of this elevator
- /bet door test <elevator> — Trigger one open → close cycle for testing
Permissions
- betterelevator.admin — full management (default: op)
- betterelevator.use — ride elevators via signs / buttons (default: true)
- betterelevator.speed — change elevator speed (default: op)
- betterelevator.group.<name> — per-group limits configured in permissions/groups.yml
Configuration highlights
Code (Text):
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 — block writes go through the region scheduler, entity work through the entity scheduler. Cross-region rides work.
- Passenger detection — the cabin carries the player plus any mobs and dropped items in its AABB by default. Toggle via passengers.carry-mobs / passengers.carry-items.
- Storage upgrades — SQL backends auto-add new columns on first run. No manual migration needed.
- Existing setups — config keys from new versions are auto-merged into your existing config (with their comments). Just drop the new jar in.
Issues & suggestions
Open a discussion thread or PM. Reproducible bug reports get fixed fastest. Include server software / version, MC version, and a minimal cabin setup that triggers the issue.