Build elevators in game. No config editing. No restarts.
Walk into any MLO, point at the wall where the call button goes, name your floors, save. It's live for every player on your server a second later.
Most elevator scripts hand you a config file and a coordinate list.
This one hands your admins a tool.
Open /elevator, create an elevator, and place your floors by aiming at them.
π― Aim at a wall and the interact point lands on that wall, facing out into the room.
That's how a real call button works β and something you simply cannot do by standing where the button goes. Press G to switch to stand mode for arrival points, where the player actually stands.
A live HUD shows exact coordinates, which way the zone will face, and every control. Arrow keys nudge height and rotation until it sits right.
β»οΈ Reopen any elevator later to rename floors, move them, reorder them, or add new ones. Every change reaches players immediately β no restart, ever.
π Panel A clean floor list. Best for a lot of floors, or long floor names. | π’ Keypad A cab button plate with a lit readout that follows your cursor. |
Each elevator picks its own. Buttons are numbered like a real lift β ground reads G, the one above it 1, basements read B1.
Selecting a floor doesn't cut straight there. The screen goes black, the destination floor is named, a progress bar runs, a motor hums, and a chime lands on arrival.
It reads as an elevator instead of a teleport.
π« Restrict a whole elevator so outsiders can't open it β a gang hideout, a PD back-of-house lift.
π₯ Or restrict individual floors. A hospital where reception and the ward are public, but surgery and the morgue are doctor, ems only. One elevator, mixed access.
Restricted floors stay visible. Pressing one tells the player which badge it needs, rather than pretending the floor doesn't exist.
β Minimum grades supported β police:3 means grade 3 and everything above it.
π Dead, downed and handcuffed players can't use elevators.
π Escorted prisoners ride along. Drag a cuffed suspect in and take them upstairs β they arrive with you instead of being left on the ground floor. Same for a medic carrying a casualty.
π Proximity blips that appear only as you approach β not permanent map clutter.
π Four sounds β press, refusal, ride, arrival β synthesised in the UI. No audio files to stream, nothing to go silent on a slow load.
Server-side proximity checks. The server refuses to teleport a player who isn't actually standing at the elevator. Without this, a modified client could fire the travel event from anywhere on the map and land on any floor it has access to β and a public elevator needs no job at all.
Every access check is re-validated server-side before any move.
Anticheat integration. Every teleport is registered before it happens, so your anticheat can confirm the jump was legitimate instead of banning for it:
if exports['riddle-elevator']:IsExpectedTeleport(src, x, y, z) then
return -- legitimate elevator travel
endAlso available as an event and a state bag. Every client-triggerable event is rate limited.
β‘ Performance. One client thread, idle unless you're using the built-in prompt. Interact points are spatially bucketed, so cost tracks how many floors are near you β not how many exist on the map.
| Floors server-wide | Points checked per frame |
|---|---|
| 50 | ~8 |
| 1000 | ~8 |
Elevator edits push single-elevator deltas rather than rebroadcasting the whole table to every player.
cl_edit.lua and sv_edit.lua are never overwritten by an update.
Plug in your own notification resource, text UI, target system, sounds, permission checks, or store elevators in MySQL instead of JSON. Your integrations survive every future version.
config.lua stays open source too, split into Setup, Text and Advanced β so you're not scrolling past marker colours to find the settings you need.
| βοΈ Frameworks | QBCore Β· QBox Β· ESX β auto-detected |
| π― Targets | ox_target Β· qb-target Β· built-in prompt β auto-detected |
| π¬ Text UI | ox_lib Β· qb-core Β· esx_textui Β· built-in Β· your own |
| π¦ Requires | OneSync (on, legacy or infinity) |
Detection waits for your target resource to finish starting, so start order doesn't matter.
Questions, bug reports and update announcements.
Full documentation, integration guide and licence included with the download.