From 58ab6be31e51320eaa099e54c657356d6736feb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Sat, 2 Sep 2017 12:15:18 +0200 Subject: [PATCH] Fix lags --- __resource.lua | 2 +- client/classes/status.lua | 50 +++++++++++ client/main.lua | 176 +++++++++++++++++++++++++++----------- config.lua | 7 +- server/main.lua | 129 +++------------------------- 5 files changed, 194 insertions(+), 170 deletions(-) create mode 100644 client/classes/status.lua diff --git a/__resource.lua b/__resource.lua index f3fe55e6..6db3c800 100644 --- a/__resource.lua +++ b/__resource.lua @@ -5,12 +5,12 @@ description 'ESX Status' server_scripts { '@mysql-async/lib/MySQL.lua', 'config.lua', - 'server/classes/status.lua', 'server/main.lua' } client_scripts { 'config.lua', + 'client/classes/status.lua', 'client/main.lua' } diff --git a/client/classes/status.lua b/client/classes/status.lua new file mode 100644 index 00000000..c478a98d --- /dev/null +++ b/client/classes/status.lua @@ -0,0 +1,50 @@ +function CreateStatus(name, default, color, visible, tickCallback) + + local self = {} + + self.val = default + self.name = name + self.default = default + self.color = color + self.visible = visible + self.tickCallback = tickCallback + + self._set = function(k, v) + self[k] = v + end + + self._get = function(k) + return self[k] + end + + self.onTick = function() + self.tickCallback(self) + end + + self.set = function(val) + self.val = val + end + + self.add = function(val) + if self.val + val > Config.StatusMax then + self.val = Config.StatusMax + else + self.val = self.val + val + end + end + + self.remove = function(val) + if self.val - val < 0 then + self.val = 0 + else + self.val = self.val - val + end + end + + self.getPercent = function() + return (self.val / Config.StatusMax) * 100 + end + + return self + +end diff --git a/client/main.lua b/client/main.lua index 4db12de3..140d79ed 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,21 +1,126 @@ local Status = {} -local loaded = false -RegisterNetEvent('esx_status:update') -AddEventHandler('esx_status:update', function(status) +function GetStatusData(minimal) + + local status = {} + + for i=1, #Status, 1 do + + if minimal then + + table.insert(status, { + name = Status[i].name, + val = Status[i].val, + }) + + else + + table.insert(status, { + name = Status[i].name, + val = Status[i].val, + color = Status[i].color, + visible = Status[i].visible(Status[i]), + max = Status[i].max, + }) + + end + + end + + return status + +end + +AddEventHandler('esx_status:registerStatus', function(name, default, color, visible, tickCallback) + local s = CreateStatus(name, default, color, visible, tickCallback) + table.insert(Status, s) +end) + +RegisterNetEvent('esx_status:load') +AddEventHandler('esx_status:load', function(status) + + for i=1, #Status, 1 do + for j=1, #status, 1 do + if Status[i].name == status[j].name then + Status[i].set(status[j].val) + end + end + end + + Citizen.CreateThread(function() + while true do + + for i=1, #Status, 1 do + Status[i].onTick() + end + + SendNUIMessage({ + update = true, + status = GetStatusData() + }) + + Citizen.Wait(Config.TickTime) + + end + end) + +end) + +RegisterNetEvent('esx_status:set') +AddEventHandler('esx_status:set', function(name, val) - Status = status + for i=1, #Status, 1 do + if Status[i].name == name then + Status[i].set(val) + break + end + end SendNUIMessage({ update = true, - status = Status + status = GetStatusData() }) - if not loaded then - TriggerEvent('esx_status:loaded') - loaded = true + TriggerServerEvent('esx_status:update', GetStatusData(true)) + +end) + +RegisterNetEvent('esx_status:add') +AddEventHandler('esx_status:add', function(name, val) + + for i=1, #Status, 1 do + if Status[i].name == name then + Status[i].add(val) + break + end end + SendNUIMessage({ + update = true, + status = GetStatusData() + }) + + TriggerServerEvent('esx_status:update', GetStatusData(true)) + +end) + +RegisterNetEvent('esx_status:remove') +AddEventHandler('esx_status:remove', function(name, val) + + for i=1, #Status, 1 do + if Status[i].name == name then + Status[i].remove(val) + break + end + end + + SendNUIMessage({ + update = true, + status = GetStatusData() + }) + + TriggerServerEvent('esx_status:update', GetStatusData(true)) + end) AddEventHandler('esx_status:getStatus', function(name, cb) @@ -38,48 +143,6 @@ AddEventHandler('esx_status:setDisplay', function(val) end) --- Calculate status -Citizen.CreateThread(function() - while true do - - for i=1, #Status, 1 do - - if Status[i].clientAction.add ~= nil then - - local val = math.floor(Status[i].clientAction.add / (Config.TickTime / Config.ClientTickTime)) - - if Status[i].val + val > Config.StatusMax then - Status[i].val = StatusMax - else - Status[i].val = Status[i].val + val - end - - end - - if Status[i].clientAction.remove ~= nil then - - local val = math.floor(Status[i].clientAction.remove / (Config.TickTime / Config.ClientTickTime)) - - if Status[i].val - val < 0 then - Status[i].val = 0 - else - Status[i].val = Status[i].val - val - end - - end - - end - - SendNUIMessage({ - update = true, - status = Status - }) - - Citizen.Wait(Config.ClientqTickTime) - - end -end) - -- Pause menu disable hud display local isPaused = false @@ -94,4 +157,17 @@ Citizen.CreateThread(function() TriggerEvent('esx_status:setDisplay', 0.5) end end +end) + +-- Loaded event +Citizen.CreateThread(function() + TriggerEvent('esx_status:loaded') +end) + +-- Update server +Citizen.CreateThread(function() + while true do + Citizen.Wait(Config.UpdateInterval) + TriggerServerEvent('esx_status:update', GetStatusData(true)) + end end) \ No newline at end of file diff --git a/config.lua b/config.lua index 1baf3075..3b444340 100644 --- a/config.lua +++ b/config.lua @@ -1,6 +1,5 @@ Config = {} -Config.StatusMax = 1000000 -Config.TickTime = 30000 -Config.ClientTickTime = 1000 -Config.UpdateClientTime = 65000 \ No newline at end of file +Config.StatusMax = 1000000 +Config.TickTime = 1000 +Config.UpdateInterval = 10000 \ No newline at end of file diff --git a/server/main.lua b/server/main.lua index 493065cd..29d75b17 100644 --- a/server/main.lua +++ b/server/main.lua @@ -3,19 +3,6 @@ local RegisteredStatus = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) -AddEventHandler('esx_status:registerStatus', function(name, default, color, visible, tickCallback, clientAction) - - table.insert(RegisteredStatus, { - name = name, - default = default, - color = color, - visible = visible, - tickCallback = tickCallback, - clientAction = clientAction - }) - -end) - AddEventHandler('esx:playerLoaded', function(source) local _source = source @@ -28,36 +15,15 @@ AddEventHandler('esx:playerLoaded', function(source) }, function(result) - local data = {} - local savedStatus = {} + local data = {} if result[1].status ~= nil then data = json.decode(result[1].status) end - for i=1, #data, 1 do - savedStatus[data[i].name] = data[i] - end + xPlayer.set('status', data) - local status = {} - - for i=1, #RegisteredStatus, 1 do - - local s = RegisteredStatus[i] - local default = nil - - if savedStatus[s.name] ~= nil then - default = savedStatus[s.name].val - else - default = s.default - end - - table.insert(status, CreateStatus(xPlayer, s.name, default, s.color, s.visible, s.tickCallback, s.clientAction)) - end - - xPlayer.set('status', status) - - TriggerEvent('esx_status:updateClient', _source) + TriggerClientEvent('esx_status:load', _source, data) end ) @@ -71,20 +37,10 @@ AddEventHandler('esx:playerDropped', function(source) local data = {} local status = xPlayer.get('status') - for i=1, #status, 1 do - - local s = status[i] - - table.insert(data, { - name = s._get('name'), - val = s._get('val') - }) - end - MySQL.Async.execute( 'UPDATE users SET status = @status WHERE identifier = @identifier', { - ['@status'] = json.encode(data), + ['@status'] = json.encode(status), ['@identifier'] = xPlayer.identifier } ) @@ -97,7 +53,7 @@ AddEventHandler('esx_status:getStatus', function(playerId, statusName, cb) local status = xPlayer.get('status') for i=1, #status, 1 do - if status[i]._get('name') == statusName then + if status[i].name == statusName then cb(status[i]) break end @@ -105,61 +61,16 @@ AddEventHandler('esx_status:getStatus', function(playerId, statusName, cb) end) -AddEventHandler('esx_status:updateClient', function(playerId) - - local xPlayer = ESX.GetPlayerFromId(playerId) - local data = {} - local status = xPlayer.get('status') - - for i=1, #status, 1 do - table.insert(data, { - name = status[i]._get('name'), - val = status[i]._get('val'), - color = status[i]._get('color'), - visible = status[i]._get('visible')(status[i]), - clientAction = status[i]._get('clientAction'), - max = Config.StatusMax - }) - end - - TriggerClientEvent('esx_status:update', playerId, data) +RegisterServerEvent('esx_status:update') +AddEventHandler('esx_status:update', function(status) + + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) + + xPlayer.set('status', status) end) -function TickStatus() - - local xPlayers = ESX.GetPlayers() - - for i=1, #xPlayers, 1 do - - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) - local status = xPlayer.get('status') - - if status ~= nil then - for i=1, #status, 1 do - status[i]._get('onTick')() - end - end - - end - - SetTimeout(Config.TickTime, TickStatus) - -end - -function UpdateClients() - - local xPlayers = ESX.GetPlayers() - - for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) - TriggerEvent('esx_status:updateClient', xPlayer.source) - end - - SetTimeout(Config.UpdateClientTime, UpdateClients) - -end - function SaveData() local xPlayers = ESX.GetPlayers() @@ -170,30 +81,18 @@ function SaveData() local data = {} local status = xPlayer.get('status') - for i=1, #status, 1 do - - local s = status[i] - - table.insert(data, { - name = s._get('name'), - val = s._get('val') - }) - end - MySQL.Async.execute( 'UPDATE users SET status = @status WHERE identifier = @identifier', { - ['@status'] = json.encode(data), + ['@status'] = json.encode(status), ['@identifier'] = xPlayer.identifier } ) end - SetTimeout(60000, SaveData) + SetTimeout(10 * 60 * 1000, SaveData) end -TickStatus() -UpdateClients() SaveData() \ No newline at end of file