Configuration

Per-key reference for every setting in the oxide-multichar config.lua — spawns, camera, scenes, slot grants, creation rules, and more.

Every setting lives in one file: config.lua in the resource's main folder. You can open it with any plain text editor. After changing it, restart the oxide-multichar resource (or your whole server) for the changes to take effect.

A note on coordinates: many settings use map coordinates. A vector4(x, y, z, w) is a position with a directionx, y, z is where, and w is the heading (which way the character or camera faces, 0–360). A vector3(x, y, z) is a position with no direction. If you are not comfortable finding coordinates in-game, the built-in defaults work fine and you can leave most of this file alone.

Spawn Locations

Config.Spawn

Fallback spawn positions. These are used when the spawn picker is turned off, or when a character has no saved position to return to.

SettingTypeDefaultDescription
Config.Spawn.newvector4vector4(-1037.71, -2737.82, 20.17, 327.53)Where a brand-new character spawns if no other spawn point applies (the LSIA airport by default).
Config.Spawn.useLastPositionbooleantrueWhen true, existing characters return to where they logged off. When false, they always use the fallback below.
Config.Spawn.fallbackvector4vector4(-1037.71, -2737.82, 20.17, 327.53)Used when a character's last position is missing or invalid.
Config.Spawn = {
    new = vector4(-1037.71, -2737.82, 20.17, 327.53),
    useLastPosition = true,
    fallback = vector4(-1037.71, -2737.82, 20.17, 327.53),
}

Camera

Config.Camera

Controls where the camera sits during selection and creation. Each pose is a position, a rotation (the three numbers are pitch, roll, and yaw in degrees), and a field of view (fov — lower numbers zoom in, higher numbers zoom out).

SettingTypeDefaultDescription
Config.Camera.selection.coordsvector3vector3(-35.52, -584.42, 83.91)Camera position on the selection screen.
Config.Camera.selection.rotationvector3vector3(-5.0, 0.0, 68.95)Camera angle on the selection screen.
Config.Camera.selection.fovnumber45.0Camera zoom on the selection screen.
Config.Camera.creation.coordsvector3vector3(-36.52, -584.10, 84.30)Camera position while creating a character.
Config.Camera.creation.rotationvector3vector3(-5.0, 0.0, 68.95)Camera angle while creating a character.
Config.Camera.creation.fovnumber40.0Camera zoom while creating a character.
Config.Camera.creatorPresetstablesee belowThe four framing buttons (Full / Upper / Face / Feet) in the appearance editor. Each is a full camera pose.

The creatorPresets are what the camera buttons in the appearance editor jump to. Each one is named (fullbody, upper, face, feet) and is a complete camera pose. Tune the fov of each to frame the right part of the character.

Config.Camera = {
    selection = {
        coords = vector3(-35.52, -584.42, 83.91),
        rotation = vector3(-5.0, 0.0, 68.95),
        fov = 45.0,
    },
    creation = {
        coords = vector3(-36.52, -584.10, 84.30),
        rotation = vector3(-5.0, 0.0, 68.95),
        fov = 40.0,
    },
    creatorPresets = {
        fullbody = { coords = vector3(-36.52, -584.10, 84.30), rotation = vector3(-5.0, 0.0, 68.95), fov = 50.0 },
        upper    = { coords = vector3(-36.52, -584.10, 84.30), rotation = vector3(-3.0, 0.0, 68.95), fov = 32.0 },
        face     = { coords = vector3(-36.52, -584.10, 84.30), rotation = vector3(0.0, 0.0, 68.95),  fov = 20.0 },
        feet     = { coords = vector3(-36.52, -584.10, 84.30), rotation = vector3(-18.0, 0.0, 68.95), fov = 30.0 },
    },
}

Preview Characters

Config.PedPreview

Where the character being created stands, and the spacing used if multiple preview characters are shown.

SettingTypeDefaultDescription
Config.PedPreview.coordsvector4vector4(-39.07, -583.17, 84.17, 245.61)Standing position (and facing direction) of the character in the creator.
Config.PedPreview.spacingnumber1.5Distance, in meters, between preview characters when more than one is shown.
Config.PedPreview = {
    coords = vector4(-39.07, -583.17, 84.17, 245.61),
    spacing = 1.5,
}

Hover Behavior

Config.Hover

Controls how the screen responds when a player moves the mouse over a character and clicks to select.

SettingTypeDefaultDescription
Config.Hover.maxDistancenumber100.0How far, in meters, the cursor can reach to detect a character.
Config.Hover.resetFramesnumber3How many frames the cursor must miss every character before the hover clears. Higher values prevent flicker.
Config.Hover.smoothingnumber8.0How fast the camera moves when selecting a character. Higher is snappier.
Config.Hover.nudgenumber0.1How far the camera eases toward a character on hover, before a click. 0 means no reaction; 1 means a full move. Keep it subtle.
Config.Hover = {
    maxDistance = 100.0,
    resetFrames = 3,
    smoothing = 8.0,
    nudge = 0.1,
}

Info Card

Config.HeadCard

Tunes the floating card shown above a character's head.

SettingTypeDefaultDescription
Config.HeadCard.heightOffsetnumber0.45Height, in meters, above the character's head where the card sits.
Config.HeadCard.nearDistnumber2.0At or closer than this camera distance, the card is at its largest.
Config.HeadCard.farDistnumber6.0At or beyond this camera distance, the card is at its smallest.
Config.HeadCard.scaleMinnumber0.8Smallest the card shrinks to.
Config.HeadCard.scaleMaxnumber1.0Largest the card grows to.
Config.HeadCard = {
    heightOffset = 0.45,
    nearDist = 2.0,
    farDist = 6.0,
    scaleMin = 0.8,
    scaleMax = 1.0,
}

Create Slot

Config.CreateSlot

The dimmed "ghost" figure shown in an empty spot that players click to create a new character.

SettingTypeDefaultDescription
Config.CreateSlot.modelstring'mp_m_freemode_01'The character model used for the ghost figure.
Config.CreateSlot.alphanumber130How see-through the ghost is, from 0 (invisible) to 255 (solid). Lower is more transparent.
Config.CreateSlot = {
    model = 'mp_m_freemode_01',
    alpha = 130,
}

Character Management

SettingTypeDefaultDescription
Config.AllowDeletebooleantrueWhether players can delete their characters.
Config.RequireDeleteConfirmationbooleantrueWhether deleting asks for confirmation first. Strongly recommended to leave on.
Config.MaxCharactersnumber5The base number of characters every player gets, on any framework. Individual players can be granted more with Config.SlotGrants below.
Config.AllowDelete = true
Config.RequireDeleteConfirmation = true
Config.MaxCharacters = 5

Config.MaxCharacters replaces whatever per-character limit your framework's old multichar resource used. Change it here, in one place.

Extra Slots for VIPs / Staff

Config.SlotGrants

This is how you give specific players more character slots than the base Config.MaxCharacters — for example, donators get 7 slots and staff get 12, while everyone else stays at 5.

A player's final slot count is the highest number they qualify for. Grants never lower the base, and they do not add together: a player who matches both a 7-slot grant and a 12-slot grant gets 12, not 19.

There are two ways to grant extra slots. You can use either or both.

1. By permission (recommended). You list a permission name and how many slots it unlocks. You then give that permission to players using your server's normal permission setup.

Config.SlotGrants = {
    ace = {
        ['multichar.vip']     = 7,
        ['multichar.vipplus'] = 10,
        ['group.admin']       = 12,
    },
    identifiers = {},
}

To hand a permission to a player or a group, add lines like these to your server.cfg (these use FiveM's built-in permission system — no extra resources needed):

server.cfg
# Make a "vip" group that gets the 7-slot permission
add_ace group.vip multichar.vip allow

# Put a specific player into that vip group (use their license, found in your player list)
add_principal identifier.license:abc123... group.vip

The player gets the extra slots the next time they reconnect.

2. By a specific player ID. If you just want to bump one person without setting up a group, list their identifier and the slot count directly:

Config.SlotGrants = {
    ace = {},
    identifiers = {
        ['license:abc123...'] = 8,
        ['discord:1122334455'] = 6,
    },
}

You can find a player's license: identifier in your server's player list, or in your framework's database. Any identifier your server hands out works (license:, discord:, fivem:, steam:, etc.) — it must match exactly.

Leave Config.SlotGrants exactly as shipped and nobody gets extra slots — everyone simply uses Config.MaxCharacters. The limit is checked on the server, so it can't be bypassed by a modified game client.

Character Creation

Config.AllowCreation

Controls whether players can make new characters. Their existing characters are unaffected — they can still log in, play, and delete; they just can't create more while this is off.

SettingTypeDefaultDescription
Config.AllowCreationbooleantrueMaster switch. When false, the create option disappears and the server refuses new characters.
Config.CreationAcestring or nilnilAn optional permission that may still create while AllowCreation is off. Leave nil for none.
Config.CreationDisabledMessagestring"Character creation is currently closed."The message shown when someone who isn't allowed tries to create.
Config.AllowCreation = true
Config.CreationAce = nil  -- e.g. 'multichar.create'
Config.CreationDisabledMessage = 'Character creation is currently closed.'

Two common uses:

  • Pause creation for everyone (e.g. during an event or a lore wipe): set Config.AllowCreation = false. Existing players keep playing; nobody can make new characters.

  • Whitelist-only creation: set Config.AllowCreation = false and set Config.CreationAce = 'multichar.create', then grant that permission to your whitelisted players in server.cfg:

    server.cfg
    add_ace group.whitelist multichar.create allow
    add_principal identifier.license:abc123... group.whitelist

    Only players with the permission can create; everyone else sees the closed message.

Like the slot limit, this is enforced on the server, so it can't be bypassed by a modified game client.

Spawn Picker

Config.SpawnSelector

The sky-view screen where players choose where to spawn after picking a character.

SettingTypeDefaultDescription
Config.SpawnSelector.enabledbooleantrueTurn the spawn picker on or off. When off, players spawn straight at their last (or default) position with no extra screen.
Config.SpawnSelector.allowLastLocationbooleantrueOffer the character's last logged-off position as a spawn choice.
Config.SpawnSelector.presetstablethree presetsThe public spawn points everyone can choose. Each has an id, a label, and coords.
Config.SpawnSelector.markerHeightnumber80.0How many meters above the ground each marker card floats.
Config.SpawnSelector.camera.idletablesee belowThe high overview shot the camera rests at.
Config.SpawnSelector.camera.focustablesee belowHow the camera frames a location after the player clicks its marker.

Each preset in presets is a row with an id (an internal name with no spaces), a label (what the player sees), coords (a vector4 with heading), and optionally its own cam to hand-tune the sky view for that destination. If presets is left empty, Config.Spawn.new is used as the only public spawn.

The camera.focus block is not a camera position but a recipe: height meters above the target, back meters south of it, pitched down by pitch degrees, at the given fov.

Config.SpawnSelector = {
    enabled = true,
    allowLastLocation = true,

    presets = {
        { id = 'legion',  label = 'Legion Square', coords = vector4(195.17, -933.77, 30.69, 144.0) },
        { id = 'airport', label = 'LSIA',          coords = vector4(-1037.71, -2737.82, 20.17, 327.53) },
        { id = 'paleto',  label = 'Paleto Bay',    coords = vector4(-275.93, 6635.06, 7.43, 42.0) },
    },

    markerHeight = 80.0,
    camera = {
        idle  = { coords = vector3(-200.0, -1600.0, 1000.0), rotation = vector3(-42.0, 0.0, 0.0), fov = 60.0 },
        focus = { height = 220.0, back = 90.0, pitch = -55.0, fov = 50.0 },
    },
}

Starter Apartment

Config.StarterApartment

A free apartment given to new characters, where the housing system supports it.

SettingTypeDefaultDescription
Config.StarterApartment.enabledbooleantrueWhether new characters get a free starter apartment.
Config.StarterApartment.qbtable{ type = 'apartment1', label = 'South Rockford Drive' }Fallback definition for qb-apartments. type must match a key in that resource's own apartment config.
Config.StarterApartment.qbxtablesee belowThe apartment row written for qbx_properties. Copied from that resource's config; mirror it if you change theirs.

How this behaves on each housing system is explained in Features. The qb entry is only a fallback — when qb-apartments can list its apartments, the player picks one in the spawn screen instead.

Config.StarterApartment = {
    enabled = true,
    qb = { type = 'apartment1', label = 'South Rockford Drive' },
    qbx = {
        label = 'Del Perro Heights Apt',
        interior = 'DellPerroHeightsApt4',
        enter = vec3(-1447.35, -537.84, 34.74),
        interact = {
            { type = 'logout',   coords = vec3(-1454.08, -553.25, 72.84) },
            { type = 'clothing', coords = vec3(-1449.88, -549.25, 72.84) },
            { type = 'exit',     coords = vec4(-1453.02, -539.5, 74.04, 35.33) },
        },
        stash = { coords = vec3(-1466.83, -527.03, 73.44), slots = 50, maxWeight = 150000 },
    },
}

Appearance Editor

Config.CustomCreator

The built-in editor where new players design their full look.

SettingTypeDefaultDescription
Config.CustomCreator.enabledbooleantrueTurn the built-in appearance editor on or off. When off, your framework's native first-time editor is used.
Config.CustomCreator.allowTattoosbooleantrueInclude the Tattoos section in the editor.

The editor only works with supported clothing resources (oxide-identity, illenium-appearance, qb-clothing, fivem-appearance). On any other clothing resource it is skipped automatically and the native editor is used — see Features.

Config.CustomCreator = {
    enabled = true,
    allowTattoos = true,
}

Name and Age Rules

Config.NameLength

SettingTypeDefaultDescription
Config.NameLength.minnumber2Minimum characters allowed in a first or last name.
Config.NameLength.maxnumber20Maximum characters allowed in a first or last name.

Config.AgeRange

SettingTypeDefaultDescription
Config.AgeRange.minnumber18Youngest age a character may be, based on date of birth.
Config.AgeRange.maxnumber80Oldest age a character may be.
Config.NameLength = { min = 2, max = 20 }
Config.AgeRange   = { min = 18, max = 80 }

Config.NameRules

Extra rules applied to names on top of the length and character checks above. These are checked on the server when a character is created, so they cannot be bypassed.

SettingTypeDefaultDescription
Config.NameRules.uniquebooleantrueWhen on, a player can't give two of their own characters the same first + last name. Different players may still share a name.
Config.NameRules.blacklistlista few wordsNames that aren't allowed. The check is whole-word: listing admin blocks the name "Admin" but allows "Benjamin". Matching ignores capitalization.
Config.NameRules = {
    unique = true,
    blacklist = { 'admin', 'staff', 'owner', 'moderator' },
}

Add or remove words in blacklist to suit your community. If a player picks a blocked or duplicate name, they're told right away and sent back to the name screen — before they build the character's look.

Scenes

Config.Scenes

The backdrops the selection screen can be set in. This is the largest part of the config.

SettingTypeDefaultDescription
Config.Scenes.modestring'saved'Which scene the screen opens on. See the options below.
Config.Scenes.defaultstring'apartment'Which scene to use as the fallback / for 'default' mode. Must match a key in list.
Config.Scenes.listtablefour scenesAll available scenes, keyed by an internal name.

Scene mode controls which backdrop a player sees when the screen opens. The in-screen scene switcher still works in every mode — this only sets the starting scene.

modeWhat happens
'saved'Each player returns to the last scene they picked (remembered on their PC). This is the original behavior.
'random'A random scene from the list is shown every time the screen opens.
'default'Everyone always starts on Config.Scenes.default, ignoring any saved pick.

Each entry in list describes one scene:

FieldTypeDescription
namestringThe display name players see when choosing scenes.
camtableThe overview camera pose (coords, rotation, fov).
pedtableThe first character standing spot: coords (vector4) and an optional animation ({ dict, name }). May also carry its own rotation/fov to frame the camera when this character is selected.
ped_2, ped_3, …tableAdditional standing spots, numbered upward. Each may have its own animation, rotation, and fov. The number of spots sets how many characters show at once.
vehicletable or nilAn optional decorative vehicle: { model, coords }. Set to nil for none.
weatherstringThe weather forced while in this scene (for example 'EXTRASUNNY').
timetableThe time forced while in this scene: { hour, minute }.

To add a scene, copy an existing entry, give it a new key, and adjust the camera, standing spots, weather, and time. To remove one, delete its entry (and make sure Config.Scenes.default doesn't point at it). The weather and time changes only affect the player viewing the screen — they do not change the live server world.

Config.Scenes = {
    mode = 'saved',         -- 'saved' | 'random' | 'default'
    default = 'apartment',
    list = {
        apartment = {
            name = 'Apartment',
            cam = { coords = vector3(-784.7750, 340.0801, 211.3950), rotation = vector3(0.682074, 0.0, 224.007968), fov = 43.0 },
            ped = { coords = vector4(-781.3235, 336.4592, 210.1991, 355.3351), animation = { dict = 'timetable@ron@ig_3_couch', name = 'base' }, fov = 25 },
            -- ped_2 ... ped_5 define additional standing spots
            vehicle = nil,
            weather = 'EXTRASUNNY',
            time = { hour = 20, minute = 0 },
        },
        -- garage, pier, sinner ...
    },
}

Logout

Config.Logout

The command that returns a player to character selection.

SettingTypeDefaultDescription
Config.Logout.enabledbooleantrueWhether the logout command is registered at all.
Config.Logout.commandstring'logout'The command word, without the slash. Change it to anything you like.
Config.Logout.fadeOutDurationnumber500How long, in milliseconds, the screen takes to fade to black.
Config.Logout.holdDurationnumber1500How long, in milliseconds, the screen stays black before fading back in.
Config.Logout.fadeInDurationnumber500How long, in milliseconds, the screen takes to fade back in.
Config.Logout = {
    enabled = true,
    command = 'logout',
    fadeOutDuration = 500,
    holdDuration = 1500,
    fadeInDuration = 500,
}
SettingTypeDefaultDescription
Config.Links.discordstring'https://discord.gg/dZ6q8FyGhm'The Discord invite link shown on the selection screen. Change this to your own server's invite.
Config.Links = {
    discord = 'https://discord.gg/dZ6q8FyGhm',
}

Announcements

Config.Announcements

A list of news items shown on the selection screen. Each item is a row with these fields:

FieldTypeDescription
titlestringThe headline, shown as a single line.
bodystringThe full text. Long bodies are previewed and expand when clicked. Use \n for line breaks.
typestringThe color/category: 'info', 'update', or 'warning'.
datestringThe date shown on the item, in YYYY-MM-DD format.

Edit, add, or remove entries freely. To show no announcements, set this to an empty list (Config.Announcements = {}).

Config.Announcements = {
    {
        title = 'Server Restart Tonight',
        body = 'Scheduled restart at 3 AM EST. Expect ~5 minutes of downtime.',
        type = 'info',
        date = '2026-01-24',
    },
    -- more announcements ...
}

Next Steps