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
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
Config.UI = {
PrimaryColor = 'FF0CD7F2', -- any HEX; mid/dark shades are derived automatically
AllowPlayerCustomization = true, -- true = each player picks their own accent in Settings
}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.
Config.Socials = {
Discord = 'https://discord.gg/yourserver',
YouTube = 'https://youtube.com/@yourserver',
Store = 'https://your-store.tebex.io',
}Characters
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>')
}Slot availability and name validation are re-checked **server-side** on creation — the client is never trusted.
Spawn
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.
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 targetlabelKey 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
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).
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'Depth of Field
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.
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'Audio
SFX are synthesised in the NUI with the Web Audio API — no sound files are shipped. Music is optional.
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'.