QBCore Shop

QBCore Backend Update — Performance & Stability

· QBCore Team

QBCore Backend Update

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:OnPlayerUpdated
  • QBCore: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!

More from the blog