Map Editor Configuration
config.lua is shared — the client and the server both read it. Restart the resource after editing:
restart rm_mapeditorOwner-only settings live separately in server_config.lua; see Server setup.
The basics
| Key | Default | |
|---|---|---|
Config.Command | 'mapeditor' | The command that opens the editor |
Config.CommandAliases | { 'mapedit', 'medit' } | Extra names for it |
Config.Locale | 'en' | Interface language. Only en ships |
Config.OpenEvent | 'rm_mapeditor:openEditor' | Client event another resource can trigger to open it |
Config.Debug | false | Extra console output |
Do not point OpenEvent at a name the resource already uses
It checks at start-up and prints a red warning naming the clash rather than failing silently — but the editor will not open from it. Pick a name of your own.
Features
Every major feature has a switch. false removes it from the interface and refuses it on the server.
Config.Features = {
people = true, -- people, animals and wagons
scenarios = true, -- scenarios for placed people
gameEntities = true, -- select and move the game's own entities
deleteEntity = true, -- the Delete entity tool
takeWorldProps = true, -- take game props into a map
removeWorldProps = true, -- Remove world prop tool
brush = true, -- Brush tool
scatter = true, -- Scatter tool
outlineOrder = true, -- drag to reorder in the Outline
copyTransform = true, -- copy position / rotation
pasteTransform = true, -- paste position / rotation
cameraSlow = true, -- hold Alt to fly slowly
themeColors = true, -- custom theme colours
themePresets = true, -- theme presets
copyToMap = true, -- Outline: Copy to map
doors = true, -- Entity tab: This is a door
customOrientation = true, -- Entity tab: Capture / Align
exportUnchanged = true, -- Entity tab: Export even if unchanged
exportHidden = true, -- Export window: list of hidden world props
mloDoors = true, -- ymap export: MLO doors go into its .ytyp
keepInYmap = true, -- Entity tab: In the ymap
}The two worth considering turning off on a live server are removeWorldProps — the only action with server-wide consequences — and mloDoors, which can generate a file that overrides a game interior for everyone. See Doors.
Permissions
Config.Permission = {
Mode = 'both', -- 'ace' | 'vorp' | 'both' | 'everyone'
Ace = 'rm_mapeditor.use',
VorpGroups = { 'admin', 'moderator' },
Delete = 'rm_mapeditor.delete',
DeleteWorld = 'rm_mapeditor.world',
Export = 'rm_mapeditor.export',
Import = 'rm_mapeditor.import',
Manage = 'rm_mapeditor.manage',
}Full detail, including the fallback that catches people out, in Permissions.
The loader
This runs for every player, not just builders
These are the settings with a real cost on a busy server. Everything else in this file affects the handful of people with the editor open; this affects everyone.
Config.Loader = {
SpawnDistance = 250.0,
Hysteresis = 40.0,
CellSize = 128.0,
Interval = 400,
IdleInterval = 1500,
MoveThreshold = 8.0,
MaxEntities = 900,
SpawnBudgetPerTick = 12,
DefaultLodDistance = 500,
FreezeByDefault = true,
}| Key | |
|---|---|
SpawnDistance | How close a player gets before objects appear |
Hysteresis | Extra distance before they despawn, so they do not flicker at the boundary |
Interval / IdleInterval | How often the loader checks, moving and standing still |
MoveThreshold | How far a player moves before a recheck |
MaxEntities | Ceiling across everything loaded. The one that truncates a dense build |
SpawnBudgetPerTick | How many objects may appear per tick — higher is faster and stuttery |
FreezeByDefault | Placed objects cannot be pushed around |
If a map looks complete in the editor and incomplete to players, MaxEntities is the first thing to check.
Removed world props
Config.WorldProps = {
Distance = Config.Loader.SpawnDistance,
Interval = 1200,
SearchRadius = 0.5,
UseModelHide = false,
}Also runs for every player. The sweep looks for recorded removals within SearchRadius of their stored position every 1.2 seconds.
The editor
Camera, placing and selection. Only loaded for people with the editor open.
| Key | Default | |
|---|---|---|
CameraSpeed | 0.35 | Base fly speed, between 0.02 and 4.00 |
CameraFov | 55.0 | Field of view |
PlaceDistance | 6.0 | Starting distance, between 0.5 and 100.0 |
RayDistance | 250.0 | How far the placement ray reaches |
PreviewAlpha | 210 | Preview opacity |
GroupPreviewMax | 150 | Objects previewed for a prop group |
HoverSpinSpeed | 45.0 | Preview turn rate — 0 stops it |
PreviewFacesCamera | true | Preview orients towards you |
UndoDepth | 60 | Undo steps |
MaxBulkSelection | 400 | Cap on one selection |
BoxSelectRange | 50.0 | How far a box select reaches |
Config.Editor.Defaults sets what a newly placed object gets — lodDistance 500, collision on, frozen on, visible, alpha 255, not dynamic, saved.
Snapping
Config.Snap = {
GridSizes = { 0.05, 0.1, 0.25, 0.5, 1.0, 2.0, 5.0 },
DefaultGrid = 0.25,
AngleSteps = { 1.0, 5.0, 15.0, 22.5, 45.0, 90.0 },
DefaultAngle = 15.0,
AngleByDefault = false,
MoveSteps = { 0.001, 0.01, 0.05, 0.1, 0.25, 0.5, 1.0, 5.0 },
DefaultMoveStep = 0.05,
RotateSteps = { 0.1, 0.5, 1.0, 5.0, 15.0, 45.0, 90.0 },
DefaultRotateStep = 5.0,
ObjectSnapRadius = 8.0,
ObjectSnapThreshold = 0.45,
SurfaceAlignByDefault = false,
}Angle snap and surface align are both off by default — they help when you want them and fight you when you do not.
Brush and Scatter
| Key | Default | Range |
|---|---|---|
DefaultRadius | 6.0 | 0.5 – 60.0 |
DefaultDensity | 6 | 1 – 60 |
DefaultSpacing | 1.5 | |
DefaultRandomYaw | true | |
DefaultSnapToGround | true | |
DefaultScatterCount | 50 | 1 – 500 |
DefaultScatterRadius | 25.0 |
Pitch and roll jitter both default to 0.0.
Maps
Config.Maps = {
MaxObjectsPerMap = 0, -- 0 = unlimited
MaxObjectsTotal = 0,
MaxMaps = 0,
DefaultTemporaryMinutes = 120,
ExpirySweepInterval = 60000,
AutoEnableNew = true,
}The catalogue
Config.Catalog = {
ChunkBytes = 48000,
ChunkDelay = 20,
HideSystemCategories = true,
VanillaOnlyByDefault = true,
}17,473 entries cannot be sent in one message, so the catalogue is chunked. ChunkBytes and ChunkDelay trade how fast it arrives against how much it interrupts the client.
Custom props
Config.CustomProps = {
{ model = 'my_prop', label = 'My Prop', category = 'Custom', sub = 'Buildings' },
}Start the prop's own resource before rm_mapeditor
A model that is not streamed yet cannot be previewed or placed, and lands in rm_mapeditor_unavailable.
Key bindings
Server-wide defaults; each player rebinds their own in Help → Controls. The full table is in Controls.
/rm_diag keysprints what every binding resolved to — the way to find a name the game did not recognise.
Notifications
Config.Notify is a plain function. Replace the body to route the editor's messages into your own notification resource:
function Config.Notify(message, kind, duration)
if IsDuplicityVersion() then
print(('[rm_mapeditor] [%s] %s'):format(kind or 'info', message))
return
end
TriggerEvent('my_notify:show', message, kind, duration or 4000)
endkind is the severity and duration is milliseconds. Keep the IsDuplicityVersion() branch — the server calls this too, and it has no interface to draw in.