Jixryo Characters

Character select over a real scene with one gliding camera; the server decides every character, slot and spawn, and builds new characters itself.

Version 0.5.0 Updated See it on its script page

On this page

Jixryo Characters is the resource jixryo_multicharacter, version 0.5.0. It is the character screen: choosing a character and arriving in the city, making a character (who they are, their first home, their look) and deleting one. It replaces amzn_multicharacter and qbx_spawn's picker. The server decides everything from the database before anyone is loaded: which characters belong to the account, what each card says, the slots, and where each character may arrive. The page only ever sends a citizen id or an id the server handed out, never a place, a slot or a price.

What players get

  • Your characters in a real scene. Every character stands in their saved look and a pose from their job, in a shallow arc facing the camera: slot 1 front and centre, the rest alternating left and right 1.2 m apart, every other one half a step back, the ends bending away. Each is snapped to the ground and moved to the nearest clear spot if a pillar, car or prop is in the way. A see-through stand-in marks the free slot ("New · slot N"). Cars, props and people dress the scene around them.
  • The scenes. The first scene that is really there in your game: the car meet (inside a custom map, skipped on a server without it), then Legion Square, then Del Perro Pier on GTA's own map. Each has its own time and weather while you choose.
  • One camera, no fades, no shake. A wide shot of everyone that backs off until all fit (and widens the lens when a wall is behind it), then a 0.9 s glide to whoever you highlight: a three-quarter close shot, them sharp and the rest soft, their head turned to the camera, a soft light on them at night.
  • Cards. Name, age, job and grade (short names like "LSPD"), gang, cash, bank, phone, minutes played, and "Last seen" with the street and area and how long ago they logged out. A character who left in prison, hurt or in cuffs says so.
  • Where to? Play flies the camera up out of the scene. Each place is a flight high over it with a ring, a light beam, a slow turn and "You'll arrive here": where you left (inside your home if you logged out there), your homes, your job's spot and the city's spots. In prison, only Bolingbroke; hurt or cuffed when you left, only where you were, and the page says why.
  • Arriving. The server checks again and logs you in. Your character loads (look, inventory, HUD) while the camera is still in the air, then a 2.6 s dive and a 1.2 s blend into the game's own camera. A home spawn lands you at the door and Jixryo Housing takes you inside (or qbx_properties does, without it). An inmate is put in their cell by Jixryo Prison.
  • Making a character. The camera goes to the free spot while you fill in who you are; a resident card fills in as you type, and holding E makes them. Names are letters with spaces, hyphens or apostrophes, 2 to 16 long, capitalised for you; age 18 to 80 from a date that exists; a nationality from qbx_core's own list; a story up to 500 characters. Then your first home: the camera flies over each building and Enter moves in. With no home to pick you arrive at the airport and your look comes there. New characters get qbx_core's starter items.
  • Deleting a character. Type the first name and hold E. They walk out of the lineup and fade, and the others walk over to close up the arc. qbx_core deletes them with everything they own.
  • Logging out brings you back to the scene after a short fade.
  • The loading screen shows each real step on its last stage ("Found 3 characters", "Setting the scene · The Meet", "Dressing Marcus Reid") and clears onto the scene once it is built.

What staff get

  • /charscene lays the lineup out where you stand, to find a scene's anchor: stand where the front-centre character should be, face where the camera should be, and run it. Stand-ins take the arc's spots (moved where something is in the way) and the camera shows the wide shot players will see, with the same wall check. The left and right arrows turn the group 5 degrees, up and down set how many people (1 to 8), Enter copies anchor = vec4(...) for config.lua to the clipboard and prints it in F8 with whether everyone fits and how far back the camera is, Backspace leaves.
  • Debug lines in F8 (Config.debug): spots that were moved, dressing left out, a wide shot that could not fit everyone.

Install

  1. Stop amzn_multicharacter (only one character screen may run) and qbx_spawn (the spawning is done here). qbx_core's useExternalCharacters = true stays as it is.

  2. Upload the folder whole. The page is already built in web/build.

  3. Order in server.cfg. After what it uses:

    server.cfg
    ensure ox_lib
    ensure oxmysql
    ensure qbx_core
    ensure jixryo_core
    ensure jixryo_loadingscreen
    ensure jixryo_multicharacter

    It reads Jixryo Housing (its Homes, Place, StarterBuildings, FirstHome and the client's WakeInside), or else qbx_properties' properties table and its starting apartments, and Jixryo Prison's GetInmate, when those run. Without Jixryo Prison, qbx's injail months lock a character to Bolingbroke. With Jixryo Housing running, qbx_properties' apartments are not on the spawn screen. Looks come from the playerskins table through the illenium-appearance export setPedAppearance, which Jixryo Clothing provides.

  4. qbx_core's startingApartment can stay true: new characters pick their apartment here first. If you set Config.homes = false, set startingApartment = false too, or qbx_properties opens its board on top of the new character's look.

  5. Items. None of its own. Starter items are qbx_core's, from its own config.

  6. The database. The table jixryo_characters (minutes played, last street and area) is made on the first start through Jixryo Core's migrations. qbx_core's players and the playerskins table are read, never made.

  7. Full restart.

Rolling back: stop jixryo_multicharacter, put ensure amzn_multicharacter (and qbx_spawn if you used it) back, and restart. The table can stay.

How other scripts' calls behave

Jixryo Characters provides no other resource's name. It calls other resources rather than standing in for them:

  • qbx_core. Login happens only when the player arrives (or when a new character is made), after the player is moved back to routing bucket 0, so going back from "Where to?" needs no logout. If a script hooked into qbx_core's load throws, what counts is whether the character is in: loaded, they carry on; not loaded, they are refused and back in their own bucket. Either way the error is printed (qbx_core Login for ... threw). qbx_core's DeleteCharacter deletes a character; its /logout brings the scene back.
  • Jixryo Loading. Stage('characters', done, total, label) for each step and Handoff(ms) once the scene is built and the camera is live. Without Jixryo Loading this resource closes whatever loading screen is up itself.
  • Jixryo Housing. Homes, "inside, where you left" (its housingInside metadata) and first homes. A new character's unit is theirs the moment they pick (FirstHome with its key); a building that filled up meanwhile leaves the pick open. Its WakeInside takes them inside once the camera has landed.
  • qbx_properties (without Jixryo Housing). Homes from properties, currentPropertyId for where you left, enterProperty on a home spawn, apartmentSelect for a new character's apartment.
  • Jixryo Prison. GetInmate(citizenid) for every inmate, online or not. An inmate's only spot is the front gate; the prison takes them to their cell.
  • The look creator. After a new character arrives or moves in, the event qb-clothes:client:CreateFirstCharacter opens the creator (Jixryo Clothing's, or illenium's).
  • spawnmanager. Auto spawn is switched off when the game joins the session.

Its own API

Callbacks (ox_lib, client to server), each rate limited:

CallbackWhat
jixryo_multicharacter:server:openThe account's characters as cards, their looks for the scene, the slots, whether deleting is on, whether there are homes to pick, and the form rules. Refused while a character is loaded (loaded). Moves the player into their private bucket.
jixryo_multicharacter:server:playA citizen id: the "Where to?" list (labels and ids only) and, for the camera, each spot's coordinates. Only this account's characters.
jixryo_multicharacter:server:spawnA spot id the server offered: checks again how they left, logs them in, and answers where to arrive and how. One at a time.
jixryo_multicharacter:server:createThe form: every field checked again (the field to fix comes back with the page's words), the slots, refused and taken names; the character built and loaded; then the homes to pick or the arrival. One at a time.
jixryo_multicharacter:server:homeA home id from the list, only right after making the character and only if they have none.
jixryo_multicharacter:server:deleteA citizen id and the typed first name. Only your own, not while playing, and only when Config.allowDelete is on.

Events:

EventDirectionWhat
jixryo_multicharacter:server:backGame to serverBack from "Where to?": the offer is gone.
jixryo_multicharacter:server:seenGame to serverThe street and area, every 2 minutes while playing (rate limited to one per 20 s), for "Last seen".
jixryo_multicharacter:client:toolServer to a gameOpens or closes the scene tool.

Export (client): IsChoosing() is true while the character screen is up or being built.

Database: jixryo_characters (citizen id, minutes played, last street, last area, seen at). Minutes are counted from load to logout and every 10 minutes while playing.

Audit actions: characters.play, characters.create, characters.home, characters.delete.

Commands and keybinds

Command or keyWhoWhat
/charsceneStaff (group.admin)The scene tool where you stand.
Left and right arrows, up and down arrows, Enter, BackspaceStaff, in the scene toolTurn the group 5 degrees, set how many people (1 to 8), copy the anchor line, leave.
Hold EPlayers, on the pageMake the character; confirm a delete after typing the first name.
EnterPlayers, on the pageMove into the chosen first home.

There are no key mappings; the tool reads the arrows, Enter and Backspace directly while it is open.

Configuration

KeyDefaultWhat it does
Config.slots.default5Characters per account.
Config.slots.licensesone license at 8Accounts allowed more, by license or license2.
Config.register.minAge, .maxAge18, 80Age on the server's date.
Config.register.nameMin, .nameMax2, 16Letters per name.
Config.register.storyMax500Characters in the story.
Config.register.dateOrder'mdy'How the page shows dates ('mdy' or 'dmy').
Config.register.uniqueNamestrueNo two people in the city with the same full name (any account, any case).
Config.register.blockedadmin, administrator, moderator, staff, owner, developer, server, police, sheriff, test, tester, john doe, jane doe, firstname, lastname, unknownNames, or words in a name, the city refuses.
Config.allowDeletetruePlayers may delete their own characters.
Config.homestrueNew characters pick a first home (a Jixryo Housing starter building, or a qbx_properties starting apartment without it). false: they arrive at Config.newSpawn.
Config.newSpawnLS InternationalWhere a new character with no home to pick arrives.
Config.jobShortpolice LSPD, bcso BCSO, sasp SASP, ambulance EMS, mechanic MechanicShort job names on the cards.
Config.bucketBase131072Where the private routing buckets start (bucket = base + server id; Jixryo Clothing uses 65536 + id).
Config.sceneMode'first'The first scene that is there, or 'random' for a random one first.
Config.scenesThe Meet (La Mesa, interior, 23:00, clear, night, camera 14 m / 40°, dressed with 4 cars, 8 props, 5 people), Legion Square (Downtown, 21:30), Del Perro Pier (Del Perro, 19:15, extra sunny)Each scene: anchor, interior, time, weather, night, camera, dressing.
Config.posesleo, ems, mechanic, gang, defaultPoses by job type or gang; a character always gets the same one of their list.
Config.spotsLegion Square, Alta Apartments, LS International, Mega Mall, Sandy Shores, Paleto BayThe city's arrival spots everyone may pick.
Config.jobSpotspolice: Mission Row PD; ambulance: Pillbox MedicalA job's own spot, by job name.
Config.prisonBolingbroke, the front gateWhere an inmate arrives.
Config.fallbackSpawnqbx_core's default spawnFor a character with no saved position.
Config.handoffMs1800The loading screen's outro.
Config.seenEvery120Seconds between street reports for "Last seen".
Config.debugfalseF8 lines for spots moved, dressing left out, a wide shot that did not fit.

Security

  • The server decides everything from the database before anyone is loaded. The page gets labels and ids, never coordinates; the camera's coordinates go to the client only, and how to arrive (the property, whether housing takes them in) stays on the server.
  • Only your own characters. Every citizen id is checked against the account's license or license2; odd ids are refused before any query.
  • Login only on arriving, only at a spot the server offered, once, after checking again how the character left (jailed from another session meanwhile means "Things changed while you looked. Pick again."). A refused or failed login puts the player back in their own bucket to try again.
  • Alone while choosing. Each player waits in a routing bucket of their own with traffic and NPCs off, and goes back to bucket 0 just before Login.
  • Making a character is checked again on the server: names, the date, age, sex, the nationality against qbx_core's list, the story, refused and taken names, the slots. The character is built on the server (the page cannot set a slot, a phone or an account number), and two creates at once make one. Starter items come from qbx_core's own config.
  • Deleting needs the typed first name, your own character, and not while playing.
  • Rate limits through Jixryo Core on every callback, and the spawn, create and delete calls run one at a time per player.
  • Audit of play, create, home and delete.
  • One thing this resource cannot close: qbx_core's own qbx_core:server:createCharacter callback. Any client can still call it, and on the live qbx_core 1.23.0 it takes the client's character data as sent and checks no limit. The Jixryo qbx_core 1.24.0 port fixes it (a limit and cleaned data); putting the port live closes it.

Tests

The suite runs the real server on a real database (SQLite) with Jixryo Core's real validate, rate and db modules and stand-ins for qbx_core's Login and delete, qbx_properties, Jixryo Prison and Jixryo Housing, then the real client in a recorded stand-in game. Run on 2026-10-31.

SuiteResultWhat it covers
jixryo_multicharacter.lua64 passed, 0 failedThe account's characters and slots, the cards, looks and poses, the private bucket, "Where to?" with homes, job and city and no coordinates to the page, inside a home, prison, hurt and cuffs, arriving with Login once and only where offered, things changed meanwhile, Login throwing before and after loading, back, minutes played and last seen, the form rules, making a character (every field, taken names, slots, two at once, starter items, the first home, no homes), Jixryo Housing's homes, walk-ins, inside records, a failing export, starter buildings, a race for the last unit, deleting, the staff command, and the player's game (the loading screen's steps and hand-off, a missing custom map or floor, the lineup and dressing, the camera's glide and labels, play and where to, no black screen, arriving home, logging out, something in the way, a wall in front, a new character with and without homes, arriving with housing, housing gone meanwhile, deleting, the scene tool).
bash
cd dev-tools/luarun && node run.mjs ../../jixryo_scripts/jixryo_multicharacter tests/jixryo_multicharacter.lua

The README lists what is written to GTA's rules but not yet seen in game: the anim names on women's peds, that GTA's lens is measured up and down (the framing assumes it), and the ring marker's look from the sky.

Check it in game

  1. The hand-off: the loading screen's last stage counts the real steps, then clears straight onto the scene with no black frame. The camera pushes in, then glides to your first character.
  2. Placement: everyone on the floor, none inside a car or a pillar, nobody under the panel. Try accounts with 1, 3 and 5 characters.
  3. The camera: the glide between characters, the soft focus on the others, the head turn, the light at night. On a server without the car meet's map, Legion Square is used and F8 says why.
  4. Where to?: where you left is right (or inside your home), your homes and job are listed, the city spots are right. An inmate gets only Bolingbroke and lands in their cell. A character who logged out downed or cuffed gets only where they were.
  5. Arriving: look, inventory and HUD are all there; the weather and time go back to the city's. A home spawn puts you inside. /logout brings you back to the scene.
  6. A new character: the form refuses a bad name or date in the field itself, then the server refuses "Admin" and a name someone already has. "Where do you live?" flies over each apartment with its area named. Moving in takes you inside, then the creator opens, then you are playing with qbx_core's starter items. With Config.homes = false, you arrive at the airport and the creator opens there.
  7. With Jixryo Housing: your housing homes are listed (not qbx_properties'), a new character picks a starter building with room and gets its lowest free unit and key, and logging out inside puts "Inside · where you left" on the list.
  8. Deleting: the wrong name does nothing; the right name and E held walks the character out and the others step over.
  9. Cards: "Played" rises, and "Last seen" shows the street after a few minutes of play.
  10. /charscene as staff: the stand-ins, the arrows, Enter copies the anchor line, Backspace leaves.
Next step

Ready to look around?

Browse the suite, or paste your server.cfg and see what each script does to your server.