Features
The Character Lineup
Instead of cycling one ped in and out, all of a player's characters are spawned side by side as local peds at once. A single camera glides between them with eased per-frame motion as the player navigates, and the characters that are not selected are dimmed to Config.InactivePedAlpha so the focus stays where it should.
Welcome Cinematic
Before the lineup appears, a live camera move (a slow forward dolly with a slight zoom) plays behind a "WELCOME TO" title carrying your Config.ServerName. Each scene defines its own welcome camera and duration, so the first impression matches the mood of the scene the player last used.
Returning players are greeted with a personalised "Welcome back" message and their last-played character is pre-selected.
Player Settings
Settings are persisted client-side and restored on the next connect:
Music
The server sets a default track — a local mp3 (Config.Audio.MusicFile) or a stream URL (Config.Audio.MusicUrl), falling back to a synthesised ambient pad. On top of that, each player can paste their own YouTube link in Settings, which overrides the default for them only. Music fades out when the player spawns, over Config.Audio.MusicFadeOutMs.
All UI sound effects are generated in the browser with the Web Audio API — zero shipped sound files.
Social Buttons
Discord, YouTube and Store buttons sit under the brand mark, driven entirely by Config.Socials. Any button whose URL is left empty is hidden.
Aerial Spawn Selector
After choosing a character, the camera lifts into a bird's-eye view and flies over the map between floating pins projected onto each configured spawn location. The locations, their icons and the fly-cam height are all configurable, and the character's last position can be injected as an extra option.
Set Config.Spawn.UseSelector = false to skip it entirely and always spawn at Config.Spawn.DefaultLocation.
Logout
/logout returns a player to the character selector without disconnecting — the current character is unloaded and saved first. The command name is configurable, and it can be restricted to admins via ACE (command.).
It also answers the standard qb-multicharacter:client:chooseChar event, so qb-houses, admin menus and other logout scripts keep working unchanged.
Security
The selector is server-authoritative from end to end:
- Routing-bucket isolation — every player is moved into their own bucket for the duration of the selection, so nobody sees the lineup
- Source validation — every callback validates the calling player and never trusts client-supplied ids or coordinates
- Ownership checks — selecting, deleting and looking up vehicles all verify that the character actually belongs to the requester
- No teleport abuse — a player who is already spawned into the world is refused re-selection. Without this, the spawn picker would be a free teleport (escape a chase, skip a trip, bail out of a robbery). The only legitimate routes back to the selector are a reconnect and a logout
- Spawn validation — the server only accepts a configured spawn location or the character's own saved position within a 2 m tolerance; anything else falls back to the default
- Protected logout event — the
requestLogoutnet event enforces the same admin-only ACE rule as the/logoutcommand, soLogoutAdminOnlycannot be bypassed by triggering the event directly - Server-side name validation — names are sanitised and length-checked against
MinNameLength/MaxNameLength, and slot limits are re-checked on creation
Commands
`/multichar` is deliberately debug-only: the server refuses to select a character for anyone already in the world, so re-opening the menu during normal play would only strand the player.