QBCore Backend Update — Performance & Stability
· QBCore Team

QBcore just pushed a major under-the-hood update to the core. No flashy new mechanics this time — this one is focused on memory usage, network traffic, and long-term stability so the city runs smoother for everyone.
Here’s what changed:
- Lower Memory Footprint: The player system has been rebuilt to share method tables across players instead of duplicating them per-instance. Less memory used per connected player means more headroom during peak hours.
- Faster Player Lookups: Added a citizen ID index so lookups are now instant instead of scanning through every connected player. Background systems like billing, jobs, and database checks benefit directly.
- Lighter Network Traffic: Survival stats (hunger, thirst, etc.) are now bundled more efficiently and protected with server-side cooldowns. Fewer wasted packets, and a harder target for abuse.
- Lighter Client Performance: The notification system has been rewritten to be much more lightweight on your PC.
- Stability Fixes: Patched several memory leaks and an infinite loop that could trigger during vehicle spawning.
- Unified Developer Events: Scattered update events have been consolidated into two clean ones:
QBCore:Client:OnPlayerUpdatedQBCore:Server:OnPlayerUpdated
Code Examples
-- Getting a player
local Player = exports['qb-core']:GetPlayer(source) -- Online, by server ID
local Player = exports['qb-core']:GetPlayerByCitizenId(cid) -- Online, by citizen ID
-- Calling functions
Player.AddMoney('cash', 500, 'reason')
Player.RemoveMoney('bank', 200, 'reason')
Player.SetJob('police', 2)
Player.SetMetaData('hunger', 100)
Player.Save()
-- Old style still works:
Player.Functions.AddMoney('cash', 500, 'reason')
-- Listening for changes server-side
AddEventHandler('QBCore:Server:OnPlayerUpdated', function(source, key, value)
if key == 'job' then ... end -- Full job table
if key == 'gang' then ... end -- Full gang table
if key == 'money' then ... end -- Full money table
if key == 'metadata' then ... end -- Full metadata table
if key == 'all' then ... end -- Full PlayerData, fires on spawn
end)
-- Listening for changes client-side
AddEventHandler('QBCore:Client:OnPlayerUpdated', function(key, value)
if key == 'job' then ... end
if key == 'gang' then ... end
if key == 'money' then ... end
if key == 'metadata' then ... end
if key == 'all' then ... end -- Full PlayerData on spawn
end)
This is groundwork — the kind of update you notice by not noticing hitches and rubber-banding. Get out there and enjoy the smoother city!

