From 22efa318c1d0911f22a0105f4c9b11c4a919a8eb Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Thu, 30 May 2024 17:54:20 +0200 Subject: [PATCH] convert: esx_status > bpt_status --- .../bpt_status/server/classes/status.lua | 54 +++++++++++++++ .../[bpt_addons]/bpt_status/server/main.lua | 67 +++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 server-data/resources/[bpt_addons]/bpt_status/server/classes/status.lua create mode 100644 server-data/resources/[bpt_addons]/bpt_status/server/main.lua diff --git a/server-data/resources/[bpt_addons]/bpt_status/server/classes/status.lua b/server-data/resources/[bpt_addons]/bpt_status/server/classes/status.lua new file mode 100644 index 000000000..4ce4a8c1f --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_status/server/classes/status.lua @@ -0,0 +1,54 @@ +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('bpt_status:updateClient', self.xPlayer.source) + end + + return self +end diff --git a/server-data/resources/[bpt_addons]/bpt_status/server/main.lua b/server-data/resources/[bpt_addons]/bpt_status/server/main.lua new file mode 100644 index 000000000..2d3e1590b --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_status/server/main.lua @@ -0,0 +1,67 @@ +local function setPlayerStatus(xPlayer, data) + data = data and json.decode(data) or {} + + xPlayer.set('status', data) + ESX.Players[xPlayer.source] = data + TriggerClientEvent('bpt_status:load', xPlayer.source, data) +end + +AddEventHandler('onResourceStart', function(resourceName) + if (GetCurrentResourceName() ~= resourceName) then + return + end + + for _, xPlayer in pairs(ESX.Players) do + MySQL.scalar('SELECT status FROM users WHERE identifier = ?', { xPlayer.identifier }, function(result) + setPlayerStatus(xPlayer, result) + end) + end +end) + +AddEventHandler('esx:playerLoaded', function(playerId, xPlayer) + MySQL.scalar('SELECT status FROM users WHERE identifier = ?', { xPlayer.identifier }, function(result) + setPlayerStatus(xPlayer, result) + end) +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) + +AddEventHandler('bpt_status:getStatus', function(playerId, statusName, cb) + local status = ESX.Players[playerId] + for i = 1, #status do + if status[i].name == statusName then + return cb(status[i]) + end + end +end) + +RegisterServerEvent('bpt_status:update') +AddEventHandler('bpt_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 + 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 +end)