Skip to content

Map Editor Configuration ​

config.lua is shared — the client and the server both read it. Restart the resource after editing:

restart rm_mapeditor

Owner-only settings live separately in server_config.lua; see Server setup.

The basics ​

KeyDefault
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.DebugfalseExtra 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.

lua
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 ​

lua
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.

lua
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
SpawnDistanceHow close a player gets before objects appear
HysteresisExtra distance before they despawn, so they do not flicker at the boundary
Interval / IdleIntervalHow often the loader checks, moving and standing still
MoveThresholdHow far a player moves before a recheck
MaxEntitiesCeiling across everything loaded. The one that truncates a dense build
SpawnBudgetPerTickHow many objects may appear per tick — higher is faster and stuttery
FreezeByDefaultPlaced 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 ​

lua
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.

KeyDefault
CameraSpeed0.35Base fly speed, between 0.02 and 4.00
CameraFov55.0Field of view
PlaceDistance6.0Starting distance, between 0.5 and 100.0
RayDistance250.0How far the placement ray reaches
PreviewAlpha210Preview opacity
GroupPreviewMax150Objects previewed for a prop group
HoverSpinSpeed45.0Preview turn rate — 0 stops it
PreviewFacesCameratruePreview orients towards you
UndoDepth60Undo steps
MaxBulkSelection400Cap on one selection
BoxSelectRange50.0How 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 ​

lua
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 ​

KeyDefaultRange
DefaultRadius6.00.5 – 60.0
DefaultDensity61 – 60
DefaultSpacing1.5
DefaultRandomYawtrue
DefaultSnapToGroundtrue
DefaultScatterCount501 – 500
DefaultScatterRadius25.0

Pitch and roll jitter both default to 0.0.

Maps ​

lua
Config.Maps = {
    MaxObjectsPerMap = 0,   -- 0 = unlimited
    MaxObjectsTotal = 0,
    MaxMaps = 0,
    DefaultTemporaryMinutes = 120,
    ExpirySweepInterval = 60000,
    AutoEnableNew = true,
}

The catalogue ​

lua
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 ​

lua
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 keys

prints 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:

lua
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)
end

kind is the severity and duration is milliseconds. Keep the IsDuplicityVersion() branch — the server calls this too, and it has no interface to draw in.

Documentation for RedMorrow. Scripts are licensed per server — redistribution is not permitted.