Support partial player data updates

Add support for sending single-field player data updates to clients to reduce bandwidth. Added a new client event QBCore:Player:UpdatePlayerDataField that updates a single key on QBCore.PlayerData. Modified server QBCore.Player.CreatePlayer UpdatePlayerData to accept an optional key and value; when provided it triggers the new per-field client event, otherwise it falls back to sending the full player data. Updated various player functions to call UpdatePlayerData with specific keys (job, gang, metadata, money, etc.) instead of always triggering a full sync. Files changed: client/events.lua, server/player.lua.
This commit is contained in:
Kakarot
2026-04-20 19:18:48 -05:00
parent 17da7688f0
commit 1cee09a394
2 changed files with 22 additions and 12 deletions
+6
View File
@@ -186,6 +186,12 @@ RegisterNetEvent('QBCore:Player:SetPlayerData', function(val)
QBCore.PlayerData = val QBCore.PlayerData = val
end) end)
RegisterNetEvent('QBCore:Player:UpdatePlayerDataField', function(key, val)
if QBCore.PlayerData and key then
QBCore.PlayerData[key] = val
end
end)
RegisterNetEvent('QBCore:Player:UpdatePlayerData', function() RegisterNetEvent('QBCore:Player:UpdatePlayerData', function()
TriggerServerEvent('QBCore:UpdatePlayer') TriggerServerEvent('QBCore:UpdatePlayer')
end) end)
+16 -12
View File
@@ -179,10 +179,14 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
self.PlayerData = PlayerData self.PlayerData = PlayerData
self.Offline = Offline self.Offline = Offline
function self.Functions.UpdatePlayerData() function self.Functions.UpdatePlayerData(key, val)
if self.Offline then return end if self.Offline then return end
TriggerEvent('QBCore:Player:SetPlayerData', self.PlayerData) TriggerEvent('QBCore:Player:SetPlayerData', self.PlayerData)
TriggerClientEvent('QBCore:Player:SetPlayerData', self.PlayerData.source, self.PlayerData) if key and val then
TriggerClientEvent('QBCore:Player:UpdatePlayerDataField', self.PlayerData.source, key, val)
else
TriggerClientEvent('QBCore:Player:SetPlayerData', self.PlayerData.source, self.PlayerData)
end
end end
function self.Functions.SetJob(job, grade) function self.Functions.SetJob(job, grade)
@@ -212,7 +216,7 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
end end
if not self.Offline then if not self.Offline then
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('job', self.PlayerData.job)
TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job)
TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job)
end end
@@ -243,7 +247,7 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
end end
if not self.Offline then if not self.Offline then
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('gang', self.PlayerData.gang)
TriggerEvent('QBCore:Server:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang) TriggerEvent('QBCore:Server:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang)
TriggerClientEvent('QBCore:Client:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang) TriggerClientEvent('QBCore:Client:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang)
end end
@@ -268,13 +272,13 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
self.PlayerData.job.onduty = not not onDuty self.PlayerData.job.onduty = not not onDuty
TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job)
TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job)
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('job', self.PlayerData.job)
end end
function self.Functions.SetPlayerData(key, val) function self.Functions.SetPlayerData(key, val)
if not key or type(key) ~= 'string' then return end if not key or type(key) ~= 'string' then return end
self.PlayerData[key] = val self.PlayerData[key] = val
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData(key, val)
end end
function self.Functions.SetMetaData(meta, val) function self.Functions.SetMetaData(meta, val)
@@ -283,7 +287,7 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
val = val > 100 and 100 or val val = val > 100 and 100 or val
end end
self.PlayerData.metadata[meta] = val self.PlayerData.metadata[meta] = val
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('metadata', self.PlayerData.metadata)
end end
function self.Functions.GetMetaData(meta) function self.Functions.GetMetaData(meta)
@@ -296,7 +300,7 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
local addAmount = tonumber(amount) local addAmount = tonumber(amount)
local currentRep = self.PlayerData.metadata['rep'][rep] or 0 local currentRep = self.PlayerData.metadata['rep'][rep] or 0
self.PlayerData.metadata['rep'][rep] = currentRep + addAmount self.PlayerData.metadata['rep'][rep] = currentRep + addAmount
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('metadata', self.PlayerData.metadata)
end end
function self.Functions.RemoveRep(rep, amount) function self.Functions.RemoveRep(rep, amount)
@@ -308,7 +312,7 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
else else
self.PlayerData.metadata['rep'][rep] = currentRep - removeAmount self.PlayerData.metadata['rep'][rep] = currentRep - removeAmount
end end
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('metadata', self.PlayerData.metadata)
end end
function self.Functions.GetRep(rep) function self.Functions.GetRep(rep)
@@ -325,7 +329,7 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] + amount self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] + amount
if not self.Offline then if not self.Offline then
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('money', self.PlayerData.money)
if amount > 100000 then if amount > 100000 then
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true) TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true)
else else
@@ -356,7 +360,7 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] - amount self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] - amount
if not self.Offline then if not self.Offline then
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('money', self.PlayerData.money)
if amount > 100000 then if amount > 100000 then
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true) TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true)
else else
@@ -383,7 +387,7 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline)
self.PlayerData.money[moneytype] = amount self.PlayerData.money[moneytype] = amount
if not self.Offline then if not self.Offline then
self.Functions.UpdatePlayerData() self.Functions.UpdatePlayerData('money', self.PlayerData.money)
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'SetMoney', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') set, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason) TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'SetMoney', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') set, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, math.abs(difference), difference < 0) TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, math.abs(difference), difference < 0)
TriggerClientEvent('QBCore:Client:OnMoneyChange', self.PlayerData.source, moneytype, amount, 'set', reason) TriggerClientEvent('QBCore:Client:OnMoneyChange', self.PlayerData.source, moneytype, amount, 'set', reason)