How do you handle multi-character and routing bucket systems? RAX Development treats them as two related layers: multi-character decides which identity a player uses (slots, spawn, inventory, job data), and routing buckets decide which instance of the world that player occupies (apartments, shells, private scenes) without other players clipping through the same interior.
Quick answer: Characters = DB rows + framework load on select. Buckets = SetPlayerRoutingBucket (+ entities) so each interior is isolated. Always validate bucket changes server-side. Get help · Server build
Multi-character (what it is)
One license can own multiple character slots (e.g. 1–5). On connect the player sees a character selector, picks a slot, and the server loads that citizen's data from MySQL.
- QBCore —
qb-multicharacter (or successors) + players / characters tables
- ESX —
esx_multicharacter or equivalent identity flow
- Custom — We build slot limits, delete rules, and spawn logic from scratch
Framework choice locks your stack — see QBCore, ESX, and QBCore vs ESX before buying character-screen Tebex packs.
Routing buckets (what they are)
A routing bucket is a logical dimension ID. Players (and optionally entities) in bucket 0 see each other; players in bucket 5001 only see others in 5001. FiveM API:
SetPlayerRoutingBucket(source, bucketId)
SetEntityRoutingBucket(entity, bucketId)
GetPlayerRoutingBucket(source) for checks
Used for: apartments, housing shells, instanced heists, private businesses, character creation rooms, and event scenes. Without buckets, every player shares one MLO interior and props collide visually and logically.
How multi-character and buckets work together
| Stage |
Multi-character |
Routing bucket |
| Connect | Show slot UI; no framework job loaded yet | Often bucket 0 or dedicated char-select bucket |
| Select character | Load citizenid/identifier, inventory, metadata | Move to spawn bucket; reset state |
| Enter apartment | Same character; housing tied to citizen id | Unique bucket per unit (e.g. 1000 + propertyId) |
| Logout / swap | Save position, unload player data | Return to 0 or char-select bucket |
Bugs usually come from desync: client thinks bucket 12, server still has 0, or housing script sets bucket without saving on disconnect.
How RAX Development handles it
- Audit — Which multichar, housing, and garage resources you run; map every bucket change
- Server authority — Bucket changes only from server events after checks (owner, key, job)
- ID strategy — Documented formula (property id, apartment id) so buckets never collide
- Entity cleanup — Vehicles/peds in instanced buckets despawn or move on exit
- Database — Store last bucket only if needed; prefer deriving from property ownership (DB at peak)
- Character limits — Slot count, VIP extra slots via Tebex with server validation
- Test matrix — Two players, same apartment building, different units; swap character; crash mid-bucket
- Deploy on staging then live with Git
Security rules (non-negotiable)
- Never trust client-triggered bucket jumps for restricted areas
- Validate character ownership before loading slot data
- Block economy events while in char-select or wrong bucket
- Log suspicious bucket spam (staff webhooks)
- Pair with secure server triggers on housing stash open
Common problems we fix
- Players see each other inside “private” apartments (bucket not set on enter)
- Stuck in invisible char-select after crash (bucket 0 not restored)
- Duplicate characters or merged inventories (bad unload on swap)
- Garage vehicles visible in wrong bucket
- Housing Tebex scripts fighting qb-apartments / ox_property bucket logic
- Texture/stream issues when bucket changes mid-load (texture loss guide)
Framework and housing stacks
- qb-apartments / ps-housing / ox_property — Each has different bucket patterns; we align one standard
- ESX housing ports — Often need bucket layer added during ESX → QBCore
- Custom shells — Bucket per enter event + exit restore to world bucket
0
Pricing and scope
- Debug existing multichar + one housing script — Quoted after logs (often customization tier)
- Configure standard QBCore/ESX multichar on new build — Included in server build scope
- Custom slot system + instanced properties — Advanced script ($99+) or larger quote
Ranges: How much does a FiveM developer cost?
How RAX Development helps
- Install and wire multichar + housing with consistent buckets
- Fix desync, duplicate items, and cross-bucket visibility bugs
- Custom Lua for slot limits and VIP slots
- Documentation for staff: which bucket IDs mean what
- Part of launch-ready and dev standby
US Navy Veteran, 13 years IT. Reviews · Shop · Contact
Related: Client spawn & routing ·
OneSync Infinity ·
Database security ·
Before starting a community ·
Text menus → target
Conclusion
How do you handle multi-character and routing bucket systems? With server-authoritative character loading, documented bucket IDs for every interior, and staging tests so players never share the wrong instance. RAX Development configures, fixes, and custom-builds multichar and routing bucket flows on QBCore, ESX, and custom servers.