diff --git a/bridge/qb/client/events.lua b/bridge/qb/client/events.lua index 9c3f2cf4c..28ba721cc 100644 --- a/bridge/qb/client/events.lua +++ b/bridge/qb/client/events.lua @@ -1,4 +1,5 @@ local config = require 'config.client' +local useExternalPlayerState = require 'config.shared'.useExternalPlayerState -- Trigger Command --- @deprecated @@ -24,6 +25,8 @@ RegisterNetEvent('QBCore:Client:VehicleInfo', function(info) TriggerEvent('QBCore:Client:'..info.event..'Vehicle', data) end) +if useExternalPlayerState then return end + AddStateBagChangeHandler('hunger', ('player:%s'):format(cache.serverId), function(_, _, value) TriggerEvent('hud:client:UpdateNeeds', value, LocalPlayer.state.thirst) end) diff --git a/client/loops.lua b/client/loops.lua index 75ecd4420..5dc30507c 100644 --- a/client/loops.lua +++ b/client/loops.lua @@ -1,3 +1,6 @@ +local useExternalPlayerState = require 'config.shared'.useExternalPlayerState +if useExternalPlayerState then return end + local statusInterval = require 'config.client'.statusIntervalSeconds local playerState = LocalPlayer.state diff --git a/config/shared.lua b/config/shared.lua index 105df3683..1ffea93c0 100644 --- a/config/shared.lua +++ b/config/shared.lua @@ -1,6 +1,7 @@ return { serverName = 'Server', defaultSpawn = vec4(-540.58, -212.02, 37.65, 208.88), + useExternalPlayerState = false, notifyPosition = 'top-right', -- 'top' | 'top-right' | 'top-left' | 'bottom' | 'bottom-right' | 'bottom-left' ---@type { name: string, amount: integer, metadata: fun(source: number): table }[] starterItems = { -- Character starting items diff --git a/server/events.lua b/server/events.lua index a8b4fc277..28e5a03c1 100644 --- a/server/events.lua +++ b/server/events.lua @@ -3,6 +3,7 @@ local loggingConfig = require 'config.server'.logging local serverName = require 'config.shared'.serverName local logger = require 'modules.logger' local queue = require 'server.queue' +local useExternalPlayerState = require 'config.shared'.useExternalPlayerState -- Event Handler @@ -196,6 +197,8 @@ RegisterNetEvent('QBCore:ToggleDuty', function() end end) +if useExternalPlayerState then return end + ---Syncs the player's hunger, thirst, and stress levels with the statebags ---@param bagName string ---@param meta 'hunger' | 'thirst' | 'stress' diff --git a/server/loops.lua b/server/loops.lua index eb64c5502..992079da2 100644 --- a/server/loops.lua +++ b/server/loops.lua @@ -1,26 +1,5 @@ local config = require 'config.server' - -local function removeHungerAndThirst(src, player) - local playerState = Player(src).state - if not playerState.isLoggedIn then return end - local newHunger = playerState.hunger - config.player.hungerRate - local newThirst = playerState.thirst - config.player.thirstRate - - player.Functions.SetMetaData('thirst', math.max(0, newThirst)) - player.Functions.SetMetaData('hunger', math.max(0, newHunger)) - - player.Functions.Save() -end - -CreateThread(function() - local interval = 60000 * config.updateInterval - while true do - Wait(interval) - for src, player in pairs(QBX.Players) do - removeHungerAndThirst(src, player) - end - end -end) +local useExternalPlayerState = require 'config.shared'.useExternalPlayerState local function pay(player) local job = player.PlayerData.job @@ -53,3 +32,27 @@ CreateThread(function() end end end) + +if useExternalPlayerState then return end + +local function removeHungerAndThirst(src, player) + local playerState = Player(src).state + if not playerState.isLoggedIn then return end + local newHunger = playerState.hunger - config.player.hungerRate + local newThirst = playerState.thirst - config.player.thirstRate + + player.Functions.SetMetaData('thirst', math.max(0, newThirst)) + player.Functions.SetMetaData('hunger', math.max(0, newHunger)) + + player.Functions.Save() +end + +CreateThread(function() + local interval = 60000 * config.updateInterval + while true do + Wait(interval) + for src, player in pairs(QBX.Players) do + removeHungerAndThirst(src, player) + end + end +end) diff --git a/server/player.lua b/server/player.lua index df2398cd0..0469ae78e 100644 --- a/server/player.lua +++ b/server/player.lua @@ -8,6 +8,7 @@ local setJobReplaces = GetConvar('qbx:setjob_replaces', 'true') == 'true' local setGangReplaces = GetConvar('qbx:setgang_replaces', 'true') == 'true' local accounts = json.decode(GetConvar('inventory:accounts', '["money"]')) local accountsAsItems = table.create(0, #accounts) +local useExternalPlayerState = require 'config.shared'.useExternalPlayerState for i = 1, #accounts do accountsAsItems[accounts[i]] = 0 @@ -454,7 +455,7 @@ function CheckPlayerData(source, playerData) playerData.metadata.hunger = playerData.metadata.hunger or 100 playerData.metadata.thirst = playerData.metadata.thirst or 100 playerData.metadata.stress = playerData.metadata.stress or 0 - if playerState then + if playerState and not useExternalPlayerState then playerState:set('hunger', playerData.metadata.hunger, true) playerState:set('thirst', playerData.metadata.thirst, true) playerState:set('stress', playerData.metadata.stress, true) @@ -549,9 +550,11 @@ function Logout(source) local player = GetPlayer(source) if not player then return end local playerState = Player(source)?.state - player.PlayerData.metadata.hunger = playerState?.hunger or player.PlayerData.metadata.hunger - player.PlayerData.metadata.thirst = playerState?.thirst or player.PlayerData.metadata.thirst - player.PlayerData.metadata.stress = playerState?.stress or player.PlayerData.metadata.stress + if playerState and not useExternalPlayerState then + player.PlayerData.metadata.hunger = playerState?.hunger or player.PlayerData.metadata.hunger + player.PlayerData.metadata.thirst = playerState?.thirst or player.PlayerData.metadata.thirst + player.PlayerData.metadata.stress = playerState?.stress or player.PlayerData.metadata.stress + end TriggerClientEvent('QBCore:Client:OnPlayerUnload', source) TriggerEvent('QBCore:Server:OnPlayerUnload', source) @@ -678,7 +681,7 @@ function CreatePlayer(playerData, Offline) TriggerClientEvent('qbx_core:client:onSetMetaData', self.PlayerData.source, meta, oldVal, val) TriggerEvent('qbx_core:server:onSetMetaData', meta, oldVal, val, self.PlayerData.source) - if (meta == 'hunger' or meta == 'thirst' or meta == 'stress') then + if (meta == 'hunger' or meta == 'thirst' or meta == 'stress') and playerState and not useExternalPlayerState then val = lib.math.clamp(val, 0, 100) if playerState[meta] ~= val then playerState:set(meta, val, true) @@ -1023,7 +1026,7 @@ function Save(source) playerData.metadata.health = GetEntityHealth(ped) playerData.metadata.armor = GetPedArmour(ped) - if playerState.isLoggedIn then + if playerState.isLoggedIn and not useExternalPlayerState then playerData.metadata.hunger = playerState.hunger or 0 playerData.metadata.thirst = playerState.thirst or 0 playerData.metadata.stress = playerState.stress or 0