diff --git a/client/events.lua b/client/events.lua index 8259c98bb..2a61e1f87 100644 --- a/client/events.lua +++ b/client/events.lua @@ -1,3 +1,17 @@ +RegisterNetEvent('qbx_core:client:onPlayerDataChanged', function(key, value) + -- only allowed from server side + if source == '' then return end + QBX.PlayerData[key] = value + TriggerEvent('QBCore:Player:SetPlayerData', QBX.PlayerData) +end) + +RegisterNetEvent('QBCore:Client:SetPlayerData', function(val) + -- only allowed from server side + if source == '' then return end + QBX.PlayerData = val + TriggerEvent('QBCore:Player:SetPlayerData', QBX.PlayerData) +end) + -- Player load and unload handling RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() ShutdownLoadingScreenNui() diff --git a/modules/playerdata.lua b/modules/playerdata.lua index 4acaefde8..79d310ff9 100644 --- a/modules/playerdata.lua +++ b/modules/playerdata.lua @@ -9,5 +9,7 @@ RegisterNetEvent('QBCore:Client:OnPlayerUnload', function() end) RegisterNetEvent('QBCore:Player:SetPlayerData', function(value) + local invoke = GetInvokingResource() + if invoke and invoke ~= 'qbx_core' then return end QBX.PlayerData = value end) diff --git a/server/player.lua b/server/player.lua index 2d38a4ed2..16b98c3c5 100644 --- a/server/player.lua +++ b/server/player.lua @@ -144,7 +144,7 @@ function SetJobDuty(identifier, onDuty) TriggerEvent('QBCore:Server:SetDuty', player.PlayerData.source, player.PlayerData.job.onduty) TriggerClientEvent('QBCore:Client:SetDuty', player.PlayerData.source, player.PlayerData.job.onduty) - UpdatePlayerData(identifier) + UpdatePlayerData(identifier, 'job', player.PlayerData.job) end exports('SetJobDuty', SetJobDuty) @@ -206,7 +206,7 @@ function SetPlayerPrimaryJob(citizenid, jobName) SaveOffline(player.PlayerData) else Save(player.PlayerData.source) - UpdatePlayerData(player.PlayerData.source) + UpdatePlayerData(player.PlayerData.source, 'job', player.PlayerData.job) TriggerEvent('QBCore:Server:OnJobUpdate', player.PlayerData.source, player.PlayerData.job) TriggerClientEvent('QBCore:Client:OnJobUpdate', player.PlayerData.source, player.PlayerData.job) end @@ -430,7 +430,7 @@ function SetPlayerPrimaryGang(citizenid, gangName) SaveOffline(player.PlayerData) else Save(player.PlayerData.source) - UpdatePlayerData(player.PlayerData.source) + UpdatePlayerData(player.PlayerData.source, 'gang', player.PlayerData.gang) TriggerEvent('QBCore:Server:OnGangUpdate', player.PlayerData.source, player.PlayerData.gang) TriggerClientEvent('QBCore:Client:OnGangUpdate', player.PlayerData.source, player.PlayerData.gang) end @@ -807,7 +807,7 @@ function CreatePlayer(playerData, Offline) self.PlayerData.metadata[self.PlayerData.job.name].reputation += amount ---@diagnostic disable-next-line: param-type-mismatch - UpdatePlayerData(self.Offline and self.PlayerData.citizenid or self.PlayerData.source) + UpdatePlayerData(self.Offline and self.PlayerData.citizenid or self.PlayerData.source, 'metadata', self.PlayerData.metadata) end ---@param moneytype MoneyType @@ -917,7 +917,7 @@ function CreatePlayer(playerData, Offline) self.PlayerData.charinfo.card = cardNumber ---@diagnostic disable-next-line: param-type-mismatch - UpdatePlayerData(self.Offline and self.PlayerData.citizenid or self.PlayerData.source) + UpdatePlayerData(self.Offline and self.PlayerData.citizenid or self.PlayerData.source, 'charinfo', self.PlayerData.charinfo) end ---@deprecated use Save or SaveOffline instead @@ -973,7 +973,7 @@ function CreatePlayer(playerData, Offline) end if not self.Offline then - UpdatePlayerData(self.PlayerData.source) + UpdatePlayerData(self.PlayerData.source, 'job', self.PlayerData.job) TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) end @@ -1013,7 +1013,7 @@ function CreatePlayer(playerData, Offline) end if not self.Offline then - UpdatePlayerData(self.PlayerData.source) + UpdatePlayerData(self.PlayerData.source, 'gang', self.PlayerData.gang) TriggerEvent('QBCore:Server:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang) TriggerClientEvent('QBCore:Client:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang) end @@ -1104,18 +1104,26 @@ function SetPlayerData(identifier, key, value) player.PlayerData[key] = value - UpdatePlayerData(identifier) + UpdatePlayerData(identifier, key, value) end exports('SetPlayerData', SetPlayerData) ---@param identifier Source | string -function UpdatePlayerData(identifier) +---@param key? string +---@param value any +function UpdatePlayerData(identifier, key, value) local player = type(identifier) == 'string' and (GetPlayerByCitizenId(identifier) or GetOfflinePlayer(identifier)) or GetPlayer(identifier) if not player or player.Offline then return end - TriggerEvent('QBCore:Player:SetPlayerData', player.PlayerData) + local source = player.PlayerData.source --[[@as integer]] + if key then + TriggerClientEvent('qbx_core:client:onPlayerDataChanged', source, key, value) + else + TriggerClientEvent('qbx_core:client:setPlayerData', source, player.PlayerData) + end + TriggerClientEvent('QBCore:Player:SetPlayerData', player.PlayerData.source, player.PlayerData) end @@ -1151,7 +1159,7 @@ function SetMetadata(identifier, metadata, value) player.PlayerData.metadata[metadata] = value end - UpdatePlayerData(identifier) + UpdatePlayerData(identifier, 'metadata', player.PlayerData.metadata) if not player.Offline then local playerState = Player(player.PlayerData.source).state @@ -1222,7 +1230,7 @@ function SetCharInfo(identifier, charInfo, value) player.PlayerData.charinfo[charInfo] = value - UpdatePlayerData(identifier) + UpdatePlayerData(identifier, 'charinfo', player.PlayerData.charinfo) end exports('SetCharInfo', SetCharInfo) @@ -1279,7 +1287,7 @@ function AddMoney(identifier, moneyType, amount, reason) if player.Offline then SaveOffline(player.PlayerData) else - UpdatePlayerData(identifier) + UpdatePlayerData(identifier, 'money', player.PlayerData.money) local tags = amount > 100000 and config.logging.role or nil local resource = GetInvokingResource() or cache.resource @@ -1336,7 +1344,7 @@ function RemoveMoney(identifier, moneyType, amount, reason) if player.Offline then SaveOffline(player.PlayerData) else - UpdatePlayerData(identifier) + UpdatePlayerData(identifier, 'money', player.PlayerData.money) local tags = amount > 100000 and config.logging.role or nil local resource = GetInvokingResource() or cache.resource @@ -1386,7 +1394,7 @@ function SetMoney(identifier, moneyType, amount, reason) if player.Offline then SaveOffline(player.PlayerData) else - UpdatePlayerData(identifier) + UpdatePlayerData(identifier, 'money', player.PlayerData.money) local difference = amount - oldAmount local dirChange = difference < 0 and 'removed' or 'added'