From ae9cde16e8c34acf9f563089d8417ba4bcccb476 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 28 May 2021 09:55:32 +1000 Subject: [PATCH 01/10] improvement(server/main): Use the new xPlayer loop when using ESX Legacy --- server/main.lua | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/server/main.lua b/server/main.lua index 57b5b6f4..55223566 100644 --- a/server/main.lua +++ b/server/main.lua @@ -84,7 +84,17 @@ Citizen.CreateThread(function() end) function SaveData() - local xPlayers = ESX.GetPlayers() + + local xPlayers + if ESX.GetExtendedPlayers then + xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) + else + xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) + end + + for i=1, 100 do + xPlayers[#xPlayers+1] = xPlayers[1] + end -- Example of a bulk update statement that we are building below --[[ @@ -102,24 +112,39 @@ function SaveData() local firstItem = true local playerCount = 0 - for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) - local status = xPlayer.get('status') + if ESX.GetExtendedPlayers then -- Retrieve all xPlayer data directly (ESX Legacy) + for k,v in pairs(xPlayers) do + local status = v.get('status') - whenList = whenList .. string.format('when identifier = \'%s\' then \'%s\' ', xPlayer.identifier, json.encode(status)) + whenList = whenList .. string.format('when identifier = \'%s\' then \'%s\' ', v.identifier, json.encode(status)) - if firstItem == false then - whereList = whereList .. ', ' + if firstItem == false then + whereList = whereList .. ', ' + end + whereList = whereList .. string.format('\'%s\'', v.identifier) + + firstItem = false + playerCount = playerCount + 1 end - whereList = whereList .. string.format('\'%s\'', xPlayer.identifier) + else + for i=1, #xPlayers, 1 do + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + local status = xPlayer.get('status') - firstItem = false - playerCount = playerCount + 1 + whenList = whenList .. string.format('when identifier = \'%s\' then \'%s\' ', xPlayer.identifier, json.encode(status)) + + if firstItem == false then + whereList = whereList .. ', ' + end + whereList = whereList .. string.format('\'%s\'', xPlayer.identifier) + + firstItem = false + playerCount = playerCount + 1 + end end if playerCount > 0 then local sql = string.format(updateStatement, whenList, whereList) - MySQL.Async.execute(sql) end From b823e7d5578a7028adab44c848b773387887fd7c Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 28 May 2021 09:58:24 +1000 Subject: [PATCH 02/10] fix(legacy/multichar): Clear player status when logging out --- client/main.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/main.lua b/client/main.lua index 178073de..0f6fa6ce 100644 --- a/client/main.lua +++ b/client/main.lua @@ -47,6 +47,11 @@ AddEventHandler('esx_status:unregisterStatus', function(name) end end) +RegisterNetEvent('esx:onPlayerLogout') +AddEventHandler('esx:onPlayerLogout', function() + Status = {} +end) + RegisterNetEvent('esx_status:load') AddEventHandler('esx_status:load', function(status) TriggerEvent('esx_status:loaded') From d876399babdaaa21fcdc12f19d7d8e0ff59da097 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 28 May 2021 10:08:26 +1000 Subject: [PATCH 03/10] chore(server/main): Removed leftover debug code --- server/main.lua | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/main.lua b/server/main.lua index 55223566..85f15982 100644 --- a/server/main.lua +++ b/server/main.lua @@ -92,10 +92,6 @@ function SaveData() xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) end - for i=1, 100 do - xPlayers[#xPlayers+1] = xPlayers[1] - end - -- Example of a bulk update statement that we are building below --[[ UPDATE users From ee3d1d024f64d54ee7a8500a97752fe12609b9dd Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 28 May 2021 10:29:02 +1000 Subject: [PATCH 04/10] improvement(server/main): Use the new xPlayer loop when restarting the resource --- server/main.lua | 54 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/server/main.lua b/server/main.lua index 85f15982..ceba0e04 100644 --- a/server/main.lua +++ b/server/main.lua @@ -7,23 +7,45 @@ AddEventHandler('onResourceStart', function(resourceName) return end - local players = ESX.GetPlayers() + local xPlayers + if ESX.GetExtendedPlayers then + xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) + else + xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) + end - for _,playerId in ipairs(players) do - local xPlayer = ESX.GetPlayerFromId(playerId) - - MySQL.Async.fetchAll('SELECT status FROM users WHERE identifier = @identifier', { - ['@identifier'] = xPlayer.identifier - }, function(result) - local data = {} - - if result[1].status then - data = json.decode(result[1].status) - end - - xPlayer.set('status', data) - TriggerClientEvent('esx_status:load', playerId, data) - end) + if ESX.GetExtendedPlayers then + for k,v in pairs(xPlayers) do + MySQL.Async.fetchAll('SELECT status FROM users WHERE identifier = @identifier', { + ['@identifier'] = v.identifier + }, function(result) + local data = {} + + if result[1].status then + data = json.decode(result[1].status) + end + + v.set('status', data) + TriggerClientEvent('esx_status:load', k, data) + end) + end + else + for _,playerId in ipairs(xPlayers) do + local xPlayer = ESX.GetPlayerFromId(playerId) + + MySQL.Async.fetchAll('SELECT status FROM users WHERE identifier = @identifier', { + ['@identifier'] = xPlayer.identifier + }, function(result) + local data = {} + + if result[1].status then + data = json.decode(result[1].status) + end + + xPlayer.set('status', data) + TriggerClientEvent('esx_status:load', playerId, data) + end) + end end end) From 0cc776dfc3d88fab9650001ba9b1ac24f1216c1d Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Thu, 3 Jun 2021 07:12:09 +1000 Subject: [PATCH 05/10] refactor(server/main): Removed duplicate code and use type when defining xPlayer --- server/main.lua | 93 +++++++++++++++---------------------------------- 1 file changed, 29 insertions(+), 64 deletions(-) diff --git a/server/main.lua b/server/main.lua index ceba0e04..7334224b 100644 --- a/server/main.lua +++ b/server/main.lua @@ -13,39 +13,21 @@ AddEventHandler('onResourceStart', function(resourceName) else xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) end - - if ESX.GetExtendedPlayers then - for k,v in pairs(xPlayers) do - MySQL.Async.fetchAll('SELECT status FROM users WHERE identifier = @identifier', { - ['@identifier'] = v.identifier - }, function(result) - local data = {} - - if result[1].status then - data = json.decode(result[1].status) - end - - v.set('status', data) - TriggerClientEvent('esx_status:load', k, data) - end) - end - else - for _,playerId in ipairs(xPlayers) do - local xPlayer = ESX.GetPlayerFromId(playerId) - MySQL.Async.fetchAll('SELECT status FROM users WHERE identifier = @identifier', { - ['@identifier'] = xPlayer.identifier - }, function(result) - local data = {} + for k,v in pairs(xPlayers) do + local xPlayer = type(v) ~= 'table' and v or ESX.GetPlayerFromId(k) + MySQL.Async.fetchAll('SELECT status FROM users WHERE identifier = @identifier', { + ['@identifier'] = xPlayer.identifier + }, function(result) + local data = {} + + if result[1].status then + data = json.decode(result[1].status) + end - if result[1].status then - data = json.decode(result[1].status) - end - - xPlayer.set('status', data) - TriggerClientEvent('esx_status:load', playerId, data) - end) - end + xPlayer.set('status', data) + TriggerClientEvent('esx_status:load', k, data) + end) end end) @@ -106,14 +88,6 @@ Citizen.CreateThread(function() end) function SaveData() - - local xPlayers - if ESX.GetExtendedPlayers then - xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) - else - xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) - end - -- Example of a bulk update statement that we are building below --[[ UPDATE users @@ -130,35 +104,26 @@ function SaveData() local firstItem = true local playerCount = 0 - if ESX.GetExtendedPlayers then -- Retrieve all xPlayer data directly (ESX Legacy) - for k,v in pairs(xPlayers) do - local status = v.get('status') - - whenList = whenList .. string.format('when identifier = \'%s\' then \'%s\' ', v.identifier, json.encode(status)) - - if firstItem == false then - whereList = whereList .. ', ' - end - whereList = whereList .. string.format('\'%s\'', v.identifier) - - firstItem = false - playerCount = playerCount + 1 - end + local xPlayers + if ESX.GetExtendedPlayers then + xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) else - for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) - local status = xPlayer.get('status') + xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) + end + + for k,v in pairs(xPlayers) do + local xPlayer = type(v) ~= 'table' and v or ESX.GetPlayerFromId(k) + local status = xPlayer.get('status') - whenList = whenList .. string.format('when identifier = \'%s\' then \'%s\' ', xPlayer.identifier, json.encode(status)) + whenList = whenList .. string.format('when identifier = \'%s\' then \'%s\' ', xPlayer.identifier, json.encode(status)) - if firstItem == false then - whereList = whereList .. ', ' - end - whereList = whereList .. string.format('\'%s\'', xPlayer.identifier) - - firstItem = false - playerCount = playerCount + 1 + if firstItem == false then + whereList = whereList .. ', ' end + whereList = whereList .. string.format('\'%s\'', xPlayer.identifier) + + firstItem = false + playerCount = playerCount + 1 end if playerCount > 0 then From 97289e615b5f693382ab4d66f1b32826a39df76d Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 4 Jun 2021 11:41:57 +1000 Subject: [PATCH 06/10] fix(client/main): Prevent multiple onTick threads from running at once after relogging --- client/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index 0f6fa6ce..86c54175 100644 --- a/client/main.lua +++ b/client/main.lua @@ -64,7 +64,7 @@ AddEventHandler('esx_status:load', function(status) end Citizen.CreateThread(function() - while true do + while #Status > 0 do for i=1, #Status, 1 do Status[i].onTick() end From 5a8e750287304323f6fc61dde6dc1ab719e48321 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 4 Jun 2021 11:45:22 +1000 Subject: [PATCH 07/10] fix(client/main): Disable status bars after relogging --- client/main.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/main.lua b/client/main.lua index 86c54175..ad629ff4 100644 --- a/client/main.lua +++ b/client/main.lua @@ -50,6 +50,10 @@ end) RegisterNetEvent('esx:onPlayerLogout') AddEventHandler('esx:onPlayerLogout', function() Status = {} + SendNUIMessage({ + update = true, + status = Status + }) end) RegisterNetEvent('esx_status:load') From 98687c3b380cb7a492e3ec194c595ec5abc1f173 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 4 Jun 2021 12:59:15 +1000 Subject: [PATCH 08/10] fix(nui/js): Use the percent value already being sent by Lua --- html/scripts/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html/scripts/app.js b/html/scripts/app.js index 8e01f20c..a5a53575 100644 --- a/html/scripts/app.js +++ b/html/scripts/app.js @@ -25,7 +25,7 @@ statusDiv.find('.status_val') .css({ 'background-color': status[i].color, - 'width': (status[i].val / 10000) + '%' + 'width': (status[i].percent) + '%' }) ; @@ -56,4 +56,4 @@ }); }; -})(); \ No newline at end of file +})(); From 20b2319e977e195242555a5d5ddd14524e1823d0 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 4 Jun 2021 13:14:56 +1000 Subject: [PATCH 09/10] refactor(client/main): Remove unused variable; optimisations - Status.max was never defined anywhere (always nil) and was not referenced anywhere - Add a toggle for status bars (Config.Display); setting to false reduces CPU usage - onTick thread no longer retrieves StatusData twice; receives the minimal data then adds the other variables if Display is enabled --- client/main.lua | 95 +++++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/client/main.lua b/client/main.lua index ad629ff4..0d233df4 100644 --- a/client/main.lua +++ b/client/main.lua @@ -13,20 +13,19 @@ function GetStatusData(minimal) for i=1, #Status, 1 do if minimal then - table.insert(status, { + status[#status+1] = { name = Status[i].name, val = Status[i].val, percent = (Status[i].val / Config.StatusMax) * 100 - }) + } else - table.insert(status, { + status[#status+1] { name = Status[i].name, val = Status[i].val, color = Status[i].color, - visible = Status[i].visible(Status[i]), - max = Status[i].max, + visible = Status[i].visible(), percent = (Status[i].val / Config.StatusMax) * 100 - }) + } end end @@ -50,10 +49,12 @@ end) RegisterNetEvent('esx:onPlayerLogout') AddEventHandler('esx:onPlayerLogout', function() Status = {} - SendNUIMessage({ - update = true, - status = Status - }) + if Config.Display then + SendNUIMessage({ + update = true, + status = Status + }) + end end) RegisterNetEvent('esx_status:load') @@ -72,13 +73,21 @@ AddEventHandler('esx_status:load', function(status) for i=1, #Status, 1 do Status[i].onTick() end + local data = GetStatusData(true) + + if Config.Display then + local fullData = data + for i=1, #data, 1 do + fullData[i].color = Status[i].color + fullData[i].visible = Status[i].visible() + end + SendNUIMessage({ + update = true, + status = fullData + }) + end - SendNUIMessage({ - update = true, - status = GetStatusData() - }) - - TriggerEvent('esx_status:onTick', GetStatusData(true)) + TriggerEvent('esx_status:onTick', data) Citizen.Wait(Config.TickTime) end end) @@ -92,12 +101,12 @@ AddEventHandler('esx_status:set', function(name, val) break end end - - SendNUIMessage({ - update = true, - status = GetStatusData() - }) - + if Config.Display then + SendNUIMessage({ + update = true, + status = GetStatusData() + }) + end TriggerServerEvent('esx_status:update', GetStatusData(true)) end) @@ -109,12 +118,12 @@ AddEventHandler('esx_status:add', function(name, val) break end end - - SendNUIMessage({ - update = true, - status = GetStatusData() - }) - + if Config.Display then + SendNUIMessage({ + update = true, + status = GetStatusData() + }) + end TriggerServerEvent('esx_status:update', GetStatusData(true)) end) @@ -126,12 +135,12 @@ AddEventHandler('esx_status:remove', function(name, val) break end end - - SendNUIMessage({ - update = true, - status = GetStatusData() - }) - + if Config.Display then + SendNUIMessage({ + update = true, + status = GetStatusData() + }) + end TriggerServerEvent('esx_status:update', GetStatusData(true)) end) @@ -154,15 +163,17 @@ end) -- Pause menu disable hud display Citizen.CreateThread(function() while true do - Citizen.Wait(300) + if Config.Display then + Citizen.Wait(300) - if IsPauseMenuActive() and not isPaused then - isPaused = true - TriggerEvent('esx_status:setDisplay', 0.0) - elseif not IsPauseMenuActive() and isPaused then - isPaused = false - TriggerEvent('esx_status:setDisplay', 0.5) - end + if IsPauseMenuActive() and not isPaused then + isPaused = true + TriggerEvent('esx_status:setDisplay', 0.0) + elseif not IsPauseMenuActive() and isPaused then + isPaused = false + TriggerEvent('esx_status:setDisplay', 0.5) + end + else Citizen.Wait(1000) end end end) From 16d97ec1e3fc87175af21e150e83c8b067abc52c Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 4 Jun 2021 13:15:44 +1000 Subject: [PATCH 10/10] chore(config): Define the default value for Display --- config.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config.lua b/config.lua index 3b444340..9eb09cb2 100644 --- a/config.lua +++ b/config.lua @@ -2,4 +2,5 @@ Config = {} Config.StatusMax = 1000000 Config.TickTime = 1000 -Config.UpdateInterval = 10000 \ No newline at end of file +Config.UpdateInterval = 10000 +Config.Display = true -- Enable the esx_status bars (disable if you are using another HUD)