Configuration
Everything is in cfg.lua, and it is short: what follows is every setting in it, in the order they appear.
Locale
cfg.locale = 'en'A file under locales/. See Translate the Strings.
Commands
cfg.commands = {
editor = 'map_editor',
inspect = 'prop_inspect',
details = 'prop_details',
join = 'map_join',
leave = 'map_leave',
}Each one is the word it answers to, and false registers none at all, which is useful when a menu or an item opens the editor instead. See Exports.
/map_editor [playerId]
opens the editor. With an id, on that player's screen instead of yours.
/prop_inspect [model|hash] [playerId]
the viewer. - in the first slot to reach the second.
prop_details <model|hash>
server console only: everything known about one prop.
/map_join [no]
answers the last session invitation.
/map_leave
stops watching somebody's session.
The first three need a permission below. /map_join and /map_leave answer an invitation, so they ask for none: whoever sent it has the permission.
Permissions
Two tiers, because opening the editor and running the map are different jobs.
editorPermission opens the editor. A builder with this sees their own layouts and nothing of anybody else's: they cannot read, rename, overwrite or delete somebody else's, and they cannot stand one up for the server.
adminPermission sees every layout and can activate one. The broad command ace counts as both, which is what an admin panel or a server recipe usually grants.
authorizedIdentifiers is the first tier without an ace, for one or two people:
Either permission can be false, which switches that tier off entirely.
The Editor
reach
300.0
how far the placement ray reaches from the camera, in metres
area
250.0
how far from where a session opens it may place things. The host can widen it or switch it off in the session settings; a caller's own zone or shell overrides it. false for no boundary
limit
200
objects one session may place. false for no cap
gridStep
0.25
where the grid button starts. It walks 0.1, 0.25, 0.5, 1 and back to off
rotateStep
1.5
degrees per rotate press
snapDistance
0.25
how close a dragged prop's edge comes to a neighbour's before it snaps flush. 0 to never snap
tiers
all three
what the standalone editor browses
allowCustomModels
true
whether a player may type a model the catalogue does not carry
Keys
Defaults only. Each is a key mapping, so a player can rebind it under Settings → Key Bindings → FiveM, and the on-screen guide reads their own binding back.
Tiers
prop
standalone objects: furniture, clutter, gear
structure
walls, ceilings, floors, window frames, building shells
element
glass panes, light rigs, decals, emissive strips, vfx planes
Narrowing this changes browsing only. Every row still ships, the server still answers about it by name or hash, and a resource calling openEditor still asks for what it wants.
The Picker
primaryColor is the accent of the picker, the panels and the gizmo.
imageBaseUrl empty ships the thumbnails with the resource: about 80 MB the first time a player opens the picker, cached by hash after. A URL serves them from a host you control instead. Mirror either layout. The picker asks for atlas.json and takes the answer:
sheets
atlas.json + atlas_000.webp … (copy assets/props/ across)
files
<model>.webp, one per prop, no atlas.json present
The Layout Library
On: the browser, the rm_mapeditor_layouts table, and the switch that stands a layout up for the whole server. See Layouts.
Off: this resource writes nothing down. It becomes an editor other resources call, and none of the layout handlers are registered for a client to reach.
Your Own Props
Props your own resources stream, added by hand, go in data/custom.json:
tierdefaults toprop;structureorelementkeeps it out of furnishing sessionstagsare optional, and are what the picker's Where menu filters onthumbnail:
assets/custom/<model>.webp, or none and the tile draws emptya model this server does not stream never appears, and says nothing
A whole prop pack goes in data/custom/ instead, one file per pack. See Adding Props.
Both are yours: copy cfg.lua, data/custom.json and data/custom/ forward when you replace the folder with a new version.