diff --git a/server/classes/status.lua b/server/classes/status.lua deleted file mode 100644 index 0ec74da..0000000 --- a/server/classes/status.lua +++ /dev/null @@ -1,56 +0,0 @@ -function CreateStatus(xPlayer, name, default, color, visible, tickCallback, clientAction) - - local self = {} - - self.val = default - self.xPlayer = xPlayer - self.name = name - self.default = default - self.color = color - self.visible = visible - self.tickCallback = tickCallback - self.clientAction = clientAction - - function self._set(k, v) - self[k] = v - end - - function self._get(k) - return self[k] - end - - function self.onTick() - self.tickCallback(self) - end - - function self.set(val) - self.val = val - end - - function self.add(val) - if self.val + val > Config.StatusMax then - self.val = Config.StatusMax - else - self.val = self.val + val - end - end - - function self.remove(val) - if self.val - val < 0 then - self.val = 0 - else - self.val = self.val - val - end - end - - function self.getPercent() - return (self.val / Config.StatusMax) * 100 - end - - function self.updateClient() - TriggerEvent('esx_status:updateClient', self.xPlayer.source) - end - - return self - -end diff --git a/server/main.lua b/server/main.lua index 0b8f582..33945aa 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,39 +1,36 @@ -local function setPlayerStatus(xPlayer, data) - data = data and json.decode(data) or {} +---@param src number +---@param xPlayer table +AddEventHandler('esx:playerLoaded', function(src, xPlayer) + local status = MySQL.scalar.await('SELECT `status` FROM `users` WHERE `identifier` = ? LIMIT 1', { xPlayer.getIdentifier() }) - xPlayer.set('status', data) - ESX.Players[xPlayer.source] = data - TriggerClientEvent('esx_status:load', xPlayer.source, data) -end + status = status and json.decode(status) or {} + xPlayer.set('status', status) -AddEventHandler('onResourceStart', function(resourceName) - if (GetCurrentResourceName() ~= resourceName) then - return - end + TriggerClientEvent('esx_status:load', xPlayer.source, status) +end) - for _, xPlayer in pairs(ESX.Players) do - MySQL.scalar('SELECT status FROM users WHERE identifier = ?', { xPlayer.identifier }, function(result) - setPlayerStatus(xPlayer, result) - end) +---@param src number +---@param reason string +AddEventHandler('esx:playerDropped', function(src, reason) + local xPlayer = ESX.GetPlayerFromId(src) + if not xPlayer then + return end -end) -AddEventHandler('esx:playerLoaded', function(playerId, xPlayer) - MySQL.scalar('SELECT status FROM users WHERE identifier = ?', { xPlayer.identifier }, function(result) - setPlayerStatus(xPlayer, result) - end) + local status = xPlayer.get('status') or {} + MySQL.update('UPDATE users SET status = ? WHERE identifier = ?', { json.encode(status), xPlayer.getIdentifier() }) end) -AddEventHandler('esx:playerDropped', function(playerId, reason) - local xPlayer = ESX.GetPlayerFromId(playerId) - local status = ESX.Players[xPlayer.source] - - MySQL.update('UPDATE users SET status = ? WHERE identifier = ?', { json.encode(status), xPlayer.identifier }) - ESX.Players[xPlayer.source] = nil -end) +---@param src number +---@param statusName string +---@param cb function|table +AddEventHandler('esx_status:getStatus', function(src, statusName, cb) + local xPlayer = ESX.GetPlayerFromId(src) + if not xPlayer then + return + end -AddEventHandler('esx_status:getStatus', function(playerId, statusName, cb) - local status = ESX.Players[playerId] + local status = xPlayer.get('status') or {} for i = 1, #status do if status[i].name == statusName then return cb(status[i]) @@ -41,27 +38,12 @@ AddEventHandler('esx_status:getStatus', function(playerId, statusName, cb) end end) -RegisterServerEvent('esx_status:update') -AddEventHandler('esx_status:update', function(status) +---@param status table +RegisterNetEvent('esx_status:update', function(status) local xPlayer = ESX.GetPlayerFromId(source) - if xPlayer then - xPlayer.set('status', status) -- save to xPlayer for compatibility - ESX.Players[xPlayer.source] = status -- save locally for performance + if not xPlayer then + return end -end) -CreateThread(function() - while true do - Wait(10 * 60 * 1000) - local parameters = {} - for _, xPlayer in pairs(ESX.GetExtendedPlayers()) do - local status = ESX.Players[xPlayer.source] - if status and next(status) then - parameters[#parameters+1] = {json.encode(status), xPlayer.identifier} - end - end - if #parameters > 0 then - MySQL.prepare('UPDATE users SET status = ? WHERE identifier = ?', parameters) - end - end + xPlayer.set('status', status) end)