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 direction — x, 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Spawn.new | vector4 | vector4(-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.useLastPosition | boolean | true | When true, existing characters return to where they logged off. When false, they always use the fallback below. |
Config.Spawn.fallback | vector4 | vector4(-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).
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Camera.selection.coords | vector3 | vector3(-35.52, -584.42, 83.91) | Camera position on the selection screen. |
Config.Camera.selection.rotation | vector3 | vector3(-5.0, 0.0, 68.95) | Camera angle on the selection screen. |
Config.Camera.selection.fov | number | 45.0 | Camera zoom on the selection screen. |
Config.Camera.creation.coords | vector3 | vector3(-36.52, -584.10, 84.30) | Camera position while creating a character. |
Config.Camera.creation.rotation | vector3 | vector3(-5.0, 0.0, 68.95) | Camera angle while creating a character. |
Config.Camera.creation.fov | number | 40.0 | Camera zoom while creating a character. |
Config.Camera.creatorPresets | table | see below | The 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.PedPreview.coords | vector4 | vector4(-39.07, -583.17, 84.17, 245.61) | Standing position (and facing direction) of the character in the creator. |
Config.PedPreview.spacing | number | 1.5 | Distance, 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Hover.maxDistance | number | 100.0 | How far, in meters, the cursor can reach to detect a character. |
Config.Hover.resetFrames | number | 3 | How many frames the cursor must miss every character before the hover clears. Higher values prevent flicker. |
Config.Hover.smoothing | number | 8.0 | How fast the camera moves when selecting a character. Higher is snappier. |
Config.Hover.nudge | number | 0.1 | How 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.HeadCard.heightOffset | number | 0.45 | Height, in meters, above the character's head where the card sits. |
Config.HeadCard.nearDist | number | 2.0 | At or closer than this camera distance, the card is at its largest. |
Config.HeadCard.farDist | number | 6.0 | At or beyond this camera distance, the card is at its smallest. |
Config.HeadCard.scaleMin | number | 0.8 | Smallest the card shrinks to. |
Config.HeadCard.scaleMax | number | 1.0 | Largest 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.CreateSlot.model | string | 'mp_m_freemode_01' | The character model used for the ghost figure. |
Config.CreateSlot.alpha | number | 130 | How 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
| Setting | Type | Default | Description |
|---|---|---|---|
Config.AllowDelete | boolean | true | Whether players can delete their characters. |
Config.RequireDeleteConfirmation | boolean | true | Whether deleting asks for confirmation first. Strongly recommended to leave on. |
Config.MaxCharacters | number | 5 | The 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 = 5Config.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):
# 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.vipThe 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.AllowCreation | boolean | true | Master switch. When false, the create option disappears and the server refuses new characters. |
Config.CreationAce | string or nil | nil | An optional permission that may still create while AllowCreation is off. Leave nil for none. |
Config.CreationDisabledMessage | string | "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 = falseand setConfig.CreationAce = 'multichar.create', then grant that permission to your whitelisted players inserver.cfg:server.cfg add_ace group.whitelist multichar.create allow add_principal identifier.license:abc123... group.whitelistOnly 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.SpawnSelector.enabled | boolean | true | Turn the spawn picker on or off. When off, players spawn straight at their last (or default) position with no extra screen. |
Config.SpawnSelector.allowLastLocation | boolean | true | Offer the character's last logged-off position as a spawn choice. |
Config.SpawnSelector.presets | table | three presets | The public spawn points everyone can choose. Each has an id, a label, and coords. |
Config.SpawnSelector.markerHeight | number | 80.0 | How many meters above the ground each marker card floats. |
Config.SpawnSelector.camera.idle | table | see below | The high overview shot the camera rests at. |
Config.SpawnSelector.camera.focus | table | see below | How 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.StarterApartment.enabled | boolean | true | Whether new characters get a free starter apartment. |
Config.StarterApartment.qb | table | { 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.qbx | table | see below | The 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.CustomCreator.enabled | boolean | true | Turn the built-in appearance editor on or off. When off, your framework's native first-time editor is used. |
Config.CustomCreator.allowTattoos | boolean | true | Include 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
| Setting | Type | Default | Description |
|---|---|---|---|
Config.NameLength.min | number | 2 | Minimum characters allowed in a first or last name. |
Config.NameLength.max | number | 20 | Maximum characters allowed in a first or last name. |
Config.AgeRange
| Setting | Type | Default | Description |
|---|---|---|---|
Config.AgeRange.min | number | 18 | Youngest age a character may be, based on date of birth. |
Config.AgeRange.max | number | 80 | Oldest 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.NameRules.unique | boolean | true | When 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.blacklist | list | a few words | Names 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Scenes.mode | string | 'saved' | Which scene the screen opens on. See the options below. |
Config.Scenes.default | string | 'apartment' | Which scene to use as the fallback / for 'default' mode. Must match a key in list. |
Config.Scenes.list | table | four scenes | All 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.
mode | What 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:
| Field | Type | Description |
|---|---|---|
name | string | The display name players see when choosing scenes. |
cam | table | The overview camera pose (coords, rotation, fov). |
ped | table | The 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, … | table | Additional standing spots, numbered upward. Each may have its own animation, rotation, and fov. The number of spots sets how many characters show at once. |
vehicle | table or nil | An optional decorative vehicle: { model, coords }. Set to nil for none. |
weather | string | The weather forced while in this scene (for example 'EXTRASUNNY'). |
time | table | The 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.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Logout.enabled | boolean | true | Whether the logout command is registered at all. |
Config.Logout.command | string | 'logout' | The command word, without the slash. Change it to anything you like. |
Config.Logout.fadeOutDuration | number | 500 | How long, in milliseconds, the screen takes to fade to black. |
Config.Logout.holdDuration | number | 1500 | How long, in milliseconds, the screen stays black before fading back in. |
Config.Logout.fadeInDuration | number | 500 | How long, in milliseconds, the screen takes to fade back in. |
Config.Logout = {
enabled = true,
command = 'logout',
fadeOutDuration = 500,
holdDuration = 1500,
fadeInDuration = 500,
}Links
Config.Links
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Links.discord | string | '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:
| Field | Type | Description |
|---|---|---|
title | string | The headline, shown as a single line. |
body | string | The full text. Long bodies are previewed and expand when clicked. Use \n for line breaks. |
type | string | The color/category: 'info', 'update', or 'warning'. |
date | string | The 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
Installation Guide
Take oxide-multichar from a fresh download to a working character screen, with per-framework steps for disabling the native character menu.
Features
How each part of oxide-multichar works in-game — the selection screen, scenes, info card, creation wizard, appearance editor, spawn picker, and more.