Docs/ORB Multicharacter/Configuration

Configuration

Everything lives in config.lua, which is not escrowed and can be freely edited. Framework, clothing system and HUD are auto-detected — never set them here.

Core

lua
Config.Debug        = false                 -- verbose console prints (also enables the dev commands)
Config.Language     = 'en'                  -- 'en' | 'es' (add more in locales/)
Config.ServerName   = 'YOUR SERVER NAME'    -- big title shown on the welcome screen

Config.WelcomeCam        = vector4(-992.45, -2659.96, 31.95, 152.83)  -- global fallback welcome camera
Config.WelcomeDurationMs = 5500             -- how long the intro plays
Config.LicenseType  = 'license'             -- account identifier that owns the slots
Config.StartupDelay = 500                   -- ms after session start before the UI opens
`Config.WelcomeCam` and `Config.WelcomeDurationMs` are only the **global fallback**. Each scene can define its own `welcome` and `welcomeDuration` (see Scenes & Garage).

UI Theme

lua
Config.UI = {
    PrimaryColor = 'FF0CD7F2',        -- any HEX; mid/dark shades are derived automatically
    AllowPlayerCustomization = true,  -- true = each player picks their own accent in Settings
}
FieldTypeDefaultDescription
PrimaryColorstring'FF0CD7F2'Accent colour of the whole interface (buttons, glows, active states, pins)
AllowPlayerCustomizationbooleantrueWhen true, players pick their own accent colour from a palette in Settings. When false, PrimaryColor is the single source of truth and the colour option is hidden

Surfaces, text, borders and fonts are themed separately in html/config_ui.js — no rebuild needed, just restart the resource.

Social Buttons

Shown top-left under the brand. Leave a URL empty ('') to hide that button; all empty means no socials are shown at all.

lua
Config.Socials = {
    Discord = 'https://discord.gg/yourserver',
    YouTube = 'https://youtube.com/@yourserver',
    Store   = 'https://your-store.tebex.io',
}

Characters

lua
Config.Characters = {
    DefaultSlots  = 4,               -- how many characters a player can own
    SlotOverrides = {                -- per-license overrides: ['license:xxxx'] = 6
    },
    EnableDelete    = true,          -- allow deleting characters from the selector
    ConfirmDelete   = true,          -- require typing the name to confirm deletion
    MinNameLength   = 2,
    MaxNameLength   = 20,
    LogoutCommand   = 'logout',      -- chat command to return to character select ('' to disable)
    LogoutAdminOnly = false,         -- true = restrict /logout to admins (ACE 'command.<name>')
}
FieldTypeDefaultDescription
DefaultSlotsnumber4Character slots per player
SlotOverridestable{}Per-license slot grants, e.g. ['license:xxxx'] = 6
EnableDeletebooleantrueShow the delete action in the selector
ConfirmDeletebooleantrueRequire typing the character's name to confirm
MinNameLengthnumber2Minimum name length (enforced server-side)
MaxNameLengthnumber20Maximum name length (enforced server-side)
LogoutCommandstring'logout'Command name; '' disables the command
LogoutAdminOnlybooleanfalseRestrict logout to ACE command. holders
Slot availability and name validation are re-checked **server-side** on creation — the client is never trusted.

Spawn

lua
Config.Spawn = {
    UseSelector       = true,        -- show the aerial location selector before spawning
    AllowLastLocation = true,        -- inject the character's last position as an option
    DefaultLocation   = 'legion',    -- fallback location key if the selector is disabled
    FadeMs            = 800,         -- screen fade duration when teleporting in
}

Spawn Locations

The destinations shown on the aerial map after picking a character. icon is one of: city, beach, plane, tree, sun, home, star.

lua
Config.SpawnLocations = {
    { key = 'legion',  labelKey = 'spawn_legion',  coords = vector4( 215.76,  -810.10, 30.73, 340.0), icon = 'city'  },
    { key = 'beach',   labelKey = 'spawn_beach',   coords = vector4(-1223.5, -1560.2,  4.44,  30.0),  icon = 'beach' },
    { key = 'airport', labelKey = 'spawn_airport', coords = vector4(-1037.0, -2737.0, 20.17, 150.0),  icon = 'plane' },
    { key = 'paleto',  labelKey = 'spawn_paleto',  coords = vector4(-150.10,  6318.5, 31.49, 220.0),  icon = 'tree'  },
    { key = 'sandy',   labelKey = 'spawn_sandy',   coords = vector4( 1853.2,  3689.5, 34.27, 210.0),  icon = 'sun'   },
}

Config.SpawnCameraHeight = 260.0   -- aerial fly-cam height in metres above the target

labelKey resolves through locales/ — add the key to en.lua and es.lua when you add a location.

The server only accepts a configured location, or the character's own saved last position (within a 2 m tolerance, and only when `AllowLastLocation` is on). Anything else falls back to `DefaultLocation`.

Lineup

lua
Config.PreviewRowSpacing = 1.7     -- metres between characters in the lineup
Config.CameraGlideFactor = 0.09    -- per-frame lerp toward the active character (higher = snappier)
Config.InactivePedAlpha  = 178     -- alpha (0-255) of the non-selected characters (~70%)
Config.LineupAnchor      = 'right' -- 'right' | 'left' | 'center'

LineupAnchor decides how the row grows out of a scene's coords: 'right' (the default) makes coords the rightmost character with the row extending to its left. Flip it if the row grows the wrong way for the spot you captured.

Preview Cameras

Player-selectable in Settings and saved per player. Framing is in ped-local space: +Y is ped forward, +X is ped right, +Z is up. Heights are metres above the feet (face is about 1.65, chest 1.0, waist 0.9).

lua
Config.CameraDefaultFov = 30.0
Config.CameraEasing     = { 0.16, 1.0, 0.3, 1.0 }   -- bezier shared by CSS and the spawn cam

Config.PreviewCameras = {
    {
        key = 'cinematic', labelKey = 'cam_cinematic',
        base  = { pos = vector3(-0.70, 2.55, 1.48), look = vector3(0.0, 0.0, 1.42) },
        intro = { pos = vector3(-1.85, 3.75, 1.70) },   -- eases into base.pos on every reveal
        fov = 36.0,
    },
    -- portrait, fullbody, dramatic
}
Config.DefaultCamera = 'cinematic'
KeyLabelFOV
cinematicCinematic36.0
portraitPortrait24.0
fullbodyFull body42.0
dramaticDramatic38.0

Depth of Field

lua
Config.DOF = {
    Enabled   = true,
    NearDof   = 0.4,
    FarDof    = 8.5,
    Strength  = 1.0,
}

Poses

18 poses ship out of the box: 16 animations (13 of them with props streamed from this resource's stream/ folder) and 2 scenarios. Players pick one in Settings and it is saved per character.

lua
Config.PreviewAnimations = {
    -- Animation with attached props
    { key = 'guitar', label = 'Guitar', dict = 'amb@world_human_musician@guitar@male@idle_a', anim = 'idle_b', props = {
        { model = 'prop_acc_guitar_01', bone = 24818, pos = vector3(-0.1, 0.31, 0.1), rot = vector3(0.0, 20.0, 150.0) },
    }},

    -- Animation without props
    { key = 'crossarms', label = 'Arms Crossed', dict = 'amb@world_human_hang_out_street@male_c@idle_a', anim = 'idle_b' },

    -- Scenario (played in place)
    { key = 'lean', label = 'Lean', scenario = 'WORLD_HUMAN_LEANING' },
}
Config.DefaultAnimation = 'guitar'
TypePoses
With propsGuitar, Basketball Pose, Selfie, Cigar, Beach Floatie, Birthday Cake, Bongo Drums, Book, Boombox, Candy Apple, Doggy, Frappe, Old Man
No propsGang Sign, Gang Sign 2, Arms Crossed
ScenariosLean, Smoke

Audio

SFX are synthesised in the NUI with the Web Audio API — no sound files are shipped. Music is optional.

lua
Config.Audio = {
    SfxEnabled     = true,
    SfxVolume      = 0.5,          -- 0.0 - 1.0
    MusicFile      = 'music.mp3',  -- LOCAL mp3 relative to html/ (e.g. 'sounds/lobby.mp3')
    MusicUrl       = '',           -- or a stream URL
    MusicVolume    = 0.35,         -- 0.0 - 1.0
    AmbientPad     = true,         -- synth ambient drone when no file/URL is set
    MusicDefaultOn = true,         -- music ON by default (players can still toggle it)
    MusicFadeOutMs = 2500,         -- fade-out duration when the player spawns (ms)
}
Music priority is **`MusicFile`, then `MusicUrl`, then `AmbientPad`**. On top of that, a player's own custom track (set in Settings) overrides the server default for that player only.

Localization

Every user-facing string lives in locales/en.lua and locales/es.lua. Add a language by copying en.lua to e.g. locales/de.lua, translating the values, registering it in the shared_scripts block of fxmanifest.lua, and setting Config.Language = 'de'.