From 93e9fca7669fc33a3a0f97e11d4a180317f279ac Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sat, 2 Nov 2024 17:30:10 +0100 Subject: [PATCH 01/36] refactor(SQL/legacy): Add primary key to vehicles table --- [SQL]/legacy.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index 308c608c..53247523 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -427,10 +427,12 @@ CREATE TABLE `user_licenses` ( -- CREATE TABLE `vehicles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(60) NOT NULL, `model` varchar(60) NOT NULL, `price` int(11) NOT NULL, - `category` varchar(60) DEFAULT NULL + `category` varchar(60) DEFAULT NULL, + PRIMARY KEY (`id`) ) ENGINE=InnoDB; -- From 86c5e64d9fe239a5f922883c8af9eca6d0898be5 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Tue, 5 Nov 2024 08:16:41 +0100 Subject: [PATCH 02/36] replace `id` PK with `model` --- [SQL]/legacy.sql | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index 53247523..b041f32f 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -427,12 +427,10 @@ CREATE TABLE `user_licenses` ( -- CREATE TABLE `vehicles` ( - `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(60) NOT NULL, `model` varchar(60) NOT NULL, `price` int(11) NOT NULL, - `category` varchar(60) DEFAULT NULL, - PRIMARY KEY (`id`) + `category` varchar(60) DEFAULT NULL ) ENGINE=InnoDB; -- @@ -823,6 +821,13 @@ ALTER TABLE `licenses` ALTER TABLE `owned_vehicles` ADD PRIMARY KEY (`plate`); +-- +-- +-- Indexes for table `vehicles` +-- +ALTER TABLE `vehicles` + ADD PRIMARY KEY (`model`); + -- -- Indexes for table `rented_vehicles` -- From e64c7f73497c826240f25aa547e10846b344f2c2 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Thu, 21 Nov 2024 00:44:56 +0000 Subject: [PATCH 03/36] fix(es_extended/callback): correctly dispose of function references This has been an Issue since ESX 1.0, This should hopefully stop invalid callbacks being called --- .../es_extended/client/modules/callback.lua | 22 ++++++++++++++---- .../es_extended/server/modules/callback.lua | 23 +++++++++++++++---- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/[core]/es_extended/client/modules/callback.lua b/[core]/es_extended/client/modules/callback.lua index bd47e447..1d23d9b6 100644 --- a/[core]/es_extended/client/modules/callback.lua +++ b/[core]/es_extended/client/modules/callback.lua @@ -47,8 +47,11 @@ function Callbacks:ServerRecieve(requestId, invoker, ...) end end -function Callbacks:Register(name, cb) - self.storage[name] = cb +function Callbacks:Register(name, resource, cb) + self.storage[name] = { + resource = resource, + cb = cb + } end function Callbacks:ClientRecieve(eventName, requestId, invoker, ...) @@ -60,7 +63,7 @@ function Callbacks:ClientRecieve(eventName, requestId, invoker, ...) local returnCb = function(...) TriggerServerEvent("esx:clientCallback", requestId, invoker, ...) end - local callback = self.storage[eventName] + local callback = self.storage[eventName].cb self:Execute(callback, requestId, returnCb, ...) end @@ -106,9 +109,20 @@ end) ---@param callback function ---@return nil ESX.RegisterClientCallback = function(eventName, callback) - Callbacks:Register(eventName, callback) + local invokingResource = GetInvokingResource() + local invoker = (invokingResource and invokingResource ~= "Unknown") and invokingResource or "es_extended" + + Callbacks:Register(eventName, invoker, callback) end ESX.SecureNetEvent("esx:triggerClientCallback", function(...) Callbacks:ClientRecieve(...) end) + +AddEventHandler("onResourceStop", function(resource) + for k, v in pairs(Callbacks.storage) do + if v.resource == resource then + Callbacks.storage[k] = nil + end + end +end) diff --git a/[core]/es_extended/server/modules/callback.lua b/[core]/es_extended/server/modules/callback.lua index 245b0987..df06cc2e 100644 --- a/[core]/es_extended/server/modules/callback.lua +++ b/[core]/es_extended/server/modules/callback.lua @@ -6,8 +6,11 @@ Callbacks.requests = {} Callbacks.storage = {} Callbacks.id = 0 -function Callbacks:Register(name, cb) - self.storage[name] = cb +function Callbacks:Register(name, resource, cb) + self.storage[name] = { + resource = resource, + cb = cb + } end function Callbacks:Execute(cb, ...) @@ -39,7 +42,7 @@ function Callbacks:ServerRecieve(player, event, requestId, invoker, ...) local returnCb = function(...) TriggerClientEvent("esx:serverCallback", player, requestId, invoker, ...) end - local callback = self.storage[event] + local callback = self.storage[event].cb self:Execute(callback, player, returnCb, ...) end @@ -73,7 +76,7 @@ end) ---@param ... any function ESX.TriggerClientCallback(player, eventName, callback, ...) local invokingResource = GetInvokingResource() - local invoker = (invokingResource and invokingResource ~= "unknown") and invokingResource or "es_extended" + local invoker = (invokingResource and invokingResource ~= "Unknown") and invokingResource or "es_extended" Callbacks:Trigger(player, eventName, callback, invoker, ...) end @@ -81,6 +84,16 @@ end ---@param eventName string ---@param callback function ESX.RegisterServerCallback = function(eventName, callback) - Callbacks:Register(eventName, callback) + local invokingResource = GetInvokingResource() + local invoker = (invokingResource and invokingResource ~= "Unknown") and invokingResource or "es_extended" + + Callbacks:Register(eventName, invoker, callback) end +AddEventHandler("onResourceStop", function(resource) + for k, v in pairs(Callbacks.storage) do + if v.resource == resource then + Callbacks.storage[k] = nil + end + end +end) From 7c4c3aec56d70c994ebbbbba1cc184cec1cdbc93 Mon Sep 17 00:00:00 2001 From: Rafael Antunes <147253092+Fellow1990@users.noreply.github.com> Date: Thu, 21 Nov 2024 17:39:35 +0000 Subject: [PATCH 04/36] update: menu.lua Confusion of lowercase and uppercase letters --- [core]/esx_skin/client/modules/menu.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[core]/esx_skin/client/modules/menu.lua b/[core]/esx_skin/client/modules/menu.lua index e7ddcf1b..5f9e090a 100644 --- a/[core]/esx_skin/client/modules/menu.lua +++ b/[core]/esx_skin/client/modules/menu.lua @@ -59,7 +59,7 @@ function Menu:InsertElements() end function Menu:Submit(data, menu) - Skin.last = exports["skinchanger"]:GetSkin() + Skin.Last = exports["skinchanger"]:GetSkin() self.submitCb(data, menu) Camera:Destroy() end @@ -67,7 +67,7 @@ end function Menu:Cancel(data, menu) menu.close() Camera:Destroy() - TriggerEvent("skinchanger:loadSkin", Skin.last) + TriggerEvent("skinchanger:loadSkin", Skin.Last) if self.cancelCb then self.cancelCb(data, menu) @@ -113,7 +113,7 @@ function Menu:Open(submit, cancel, restrict) self.submitCb = submit self.cancelCb = cancel self.restricted = restrict - Skin.last = exports["skinchanger"]:GetSkin() + Skin.Last = exports["skinchanger"]:GetSkin() self.components, self.maxValues = exports["skinchanger"]:GetData() if restrict then @@ -130,7 +130,7 @@ function Menu:Open(submit, cancel, restrict) end function Menu:Saveable(submitCb, cancelCb, restrict) - Skin.last = exports["skinchanger"]:GetSkin() + Skin.Last = exports["skinchanger"]:GetSkin() self:Open(function(data, menu) menu.close() From 7954d6ec108786a1c4468231d4b078cea817452f Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sat, 23 Nov 2024 00:15:14 +0100 Subject: [PATCH 05/36] refactor(es_extended/server/modules/actions): replace deprecated RegisterServerEvent --- [core]/es_extended/server/modules/actions.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/[core]/es_extended/server/modules/actions.lua b/[core]/es_extended/server/modules/actions.lua index 52eeeb5b..e7c91e6a 100644 --- a/[core]/es_extended/server/modules/actions.lua +++ b/[core]/es_extended/server/modules/actions.lua @@ -1,9 +1,9 @@ -RegisterServerEvent("esx:playerPedChanged") -RegisterServerEvent("esx:playerJumping") -RegisterServerEvent("esx:enteringVehicle") -RegisterServerEvent("esx:enteringVehicleAborted") -RegisterServerEvent("esx:enteredVehicle") -RegisterServerEvent("esx:exitedVehicle") +RegisterNetEvent("esx:playerPedChanged") +RegisterNetEvent("esx:playerJumping") +RegisterNetEvent("esx:enteringVehicle") +RegisterNetEvent("esx:enteringVehicleAborted") +RegisterNetEvent("esx:enteredVehicle") +RegisterNetEvent("esx:exitedVehicle") if Config.EnableDebug then AddEventHandler("esx:playerPedChanged", function(netId) From 4feda3ba0879c9643c90ef25917856f4aa585dfa Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sat, 23 Nov 2024 00:54:37 +0100 Subject: [PATCH 06/36] feat(es_extended/shared/modules/table): add ESX.Table.ToArray --- [core]/es_extended/shared/modules/table.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/[core]/es_extended/shared/modules/table.lua b/[core]/es_extended/shared/modules/table.lua index fc345200..aacb2584 100644 --- a/[core]/es_extended/shared/modules/table.lua +++ b/[core]/es_extended/shared/modules/table.lua @@ -223,3 +223,11 @@ function ESX.Table.Sort(t, order) end end end + +function ESX.Table.ToArray(table) + local array = {} + for _, v in pairs(table) do + array[#array + 1] = v + end + return array +end From 3a61ae53103f30bae189b5efbe23a0527c9c03bd Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sat, 23 Nov 2024 01:00:47 +0100 Subject: [PATCH 07/36] refactor(es_extended/server/functions): refactor ESX.GetExtendedPlayers --- [core]/es_extended/server/functions.lua | 30 +++++++++++++------------ 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index 606ab0e7..cec340b5 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -276,15 +276,15 @@ end ESX.GetPlayers = GetPlayers -local function checkTable(key, val, player, xPlayers) +local function checkTable(key, val, xPlayer, xPlayers) for valIndex = 1, #val do local value = val[valIndex] if not xPlayers[value] then xPlayers[value] = {} end - if (key == "job" and player.job.name == value) or player[key] == value then - xPlayers[value][#xPlayers[value] + 1] = player + if (key == "job" and xPlayer.job.name == value) or xPlayer[key] == value then + xPlayers[value][#xPlayers[value] + 1] = xPlayer end end end @@ -293,20 +293,22 @@ end ---@param val? string|table ---@return table function ESX.GetExtendedPlayers(key, val) + if not key then + return ESX.Table.ToArray(ESX.Players) + end + local xPlayers = {} if type(val) == "table" then - for _, v in pairs(ESX.Players) do - checkTable(key, val, v, xPlayers) + for i, xPlayer in pairs(ESX.Players) do + checkTable(key, val, xPlayer, xPlayers) end - else - for _, v in pairs(ESX.Players) do - if key then - if (key == "job" and v.job.name == val) or v[key] == val then - xPlayers[#xPlayers + 1] = v - end - else - xPlayers[#xPlayers + 1] = v - end + + return xPlayers + end + + for i, xPlayer in pairs(ESX.Players) do + if (key == "job" and xPlayer.job.name == val) or xPlayer[key] == val then + xPlayers[#xPlayers + 1] = xPlayer end end From d69af15d28550ec8469758cf8590cd8e803d7faa Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:24:23 +0100 Subject: [PATCH 08/36] feat(es_extended/client/modules/adjustments): add adjustment DisableRadio --- [core]/es_extended/client/modules/adjustments.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/[core]/es_extended/client/modules/adjustments.lua b/[core]/es_extended/client/modules/adjustments.lua index 42fa9398..4b46a4a8 100644 --- a/[core]/es_extended/client/modules/adjustments.lua +++ b/[core]/es_extended/client/modules/adjustments.lua @@ -215,6 +215,15 @@ function Adjustments:WantedLevel() end end +function Adjustments:DisableRadio() + if Config.RemoveHudComponents[16] then + AddEventHandler("esx:enteredVehicle", function(vehicle, plate, seat, displayName, netId) + SetVehRadioStation(vehicle,"OFF") + SetUserRadioControlEnabled(false) + end) + end +end + function Adjustments:Load() self:RemoveHudComponents() self:DisableAimAssist() @@ -228,4 +237,5 @@ function Adjustments:Load() self:LicensePlates() self:DiscordPresence() self:WantedLevel() + self:DisableRadio() end From 359077c66e03d33d7bb13a57c2672b766c7f196f Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:53:52 +0100 Subject: [PATCH 09/36] fix(es_extended/client/modules/adjustments): add SetHudComponentPosition --- [core]/es_extended/client/modules/adjustments.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/[core]/es_extended/client/modules/adjustments.lua b/[core]/es_extended/client/modules/adjustments.lua index 4b46a4a8..b4d4fe8a 100644 --- a/[core]/es_extended/client/modules/adjustments.lua +++ b/[core]/es_extended/client/modules/adjustments.lua @@ -4,6 +4,7 @@ function Adjustments:RemoveHudComponents() for i = 1, #Config.RemoveHudComponents do if Config.RemoveHudComponents[i] then SetHudComponentSize(i, 0.0, 0.0) + SetHudComponentPosition(i, 900, 900) end end end From 4fb1ac0aa73edbc8d139277e41d21b65f91a18a3 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:19:15 +0100 Subject: [PATCH 10/36] fix(es_extended/client/functions): properly call SetVehicleExtra --- [core]/es_extended/client/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/es_extended/client/functions.lua b/[core]/es_extended/client/functions.lua index 42569381..58252a0f 100644 --- a/[core]/es_extended/client/functions.lua +++ b/[core]/es_extended/client/functions.lua @@ -1019,7 +1019,7 @@ function ESX.Game.SetVehicleProperties(vehicle, props) for extraId, enabled in pairs(props.extras) do extraId = tonumber(extraId) if extraId then - SetVehicleExtra(vehicle, extraId, enabled) + SetVehicleExtra(vehicle, extraId, not enabled) end end end From ccc9b3d3e7a6f796c8cd20f9d1eceb74de190d73 Mon Sep 17 00:00:00 2001 From: Tom <111147401+1OSaft@users.noreply.github.com> Date: Tue, 26 Nov 2024 10:19:17 +0100 Subject: [PATCH 11/36] Added missing parameter Added a missing parameter that wouldnt allow users to have custom charSlots --- [core]/esx_multicharacter/server/modules/multicharacter.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/esx_multicharacter/server/modules/multicharacter.lua b/[core]/esx_multicharacter/server/modules/multicharacter.lua index 923dd55e..c43be581 100644 --- a/[core]/esx_multicharacter/server/modules/multicharacter.lua +++ b/[core]/esx_multicharacter/server/modules/multicharacter.lua @@ -13,7 +13,7 @@ function Multicharacter:SetupCharacters(source) local identifier = Server:GetIdentifier(source) ESX.Players[identifier] = true - local slots = Database:GetPlayerSlots() + local slots = Database:GetPlayerSlots(identifier) identifier = Server.prefix .. "%:" .. identifier local rawCharacters = Database:GetPlayerInfo(identifier, slots) From 9272d71ba89ee58b2226861400b41f31560dcf8c Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Tue, 26 Nov 2024 22:00:16 +0100 Subject: [PATCH 12/36] fix(esx_multicharacter/client/modules/multicharacter): remove redundant playerSpawned trigger --- [core]/esx_multicharacter/client/modules/multicharacter.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/[core]/esx_multicharacter/client/modules/multicharacter.lua b/[core]/esx_multicharacter/client/modules/multicharacter.lua index 9ea9b974..ef099f58 100644 --- a/[core]/esx_multicharacter/client/modules/multicharacter.lua +++ b/[core]/esx_multicharacter/client/modules/multicharacter.lua @@ -272,7 +272,6 @@ function Multicharacter:PlayerLoaded(playerData, isNew, skin) TriggerServerEvent("esx:onPlayerSpawn") TriggerEvent("esx:onPlayerSpawn") - TriggerEvent("playerSpawned") TriggerEvent("esx:restoreLoadout") self:Reset() From 8528321c055c33ae07148598e92df57bddaa48ca Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Tue, 26 Nov 2024 22:00:56 +0100 Subject: [PATCH 13/36] fix(es_extended/client/main): apply player metadata in esx:onPlayerSpawn to fix race condition --- [core]/es_extended/client/main.lua | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index b989857f..6516355e 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -4,16 +4,6 @@ ESX.SecureNetEvent("esx:requestModel", function(model) ESX.Streaming.RequestModel(model) end) -local function ApplyMetadata(metadata) - if metadata.health then - SetEntityHealth(ESX.PlayerData.ped, metadata.health) - end - - if metadata.armor and metadata.armor > 0 then - SetPedArmour(ESX.PlayerData.ped, metadata.armor) - end -end - RegisterNetEvent("esx:playerLoaded", function(xPlayer, _, skin) ESX.PlayerData = xPlayer @@ -34,8 +24,6 @@ RegisterNetEvent("esx:playerLoaded", function(xPlayer, _, skin) ESX.PlayerLoaded = true - ApplyMetadata(ESX.PlayerData.metadata) - local timer = GetGameTimer() while not HaveAllStreamingRequestsCompleted(ESX.PlayerData.ped) and (GetGameTimer() - timer) < 2000 do Wait(0) @@ -72,7 +60,17 @@ local function onPlayerSpawn() end AddEventHandler("playerSpawned", onPlayerSpawn) -AddEventHandler("esx:onPlayerSpawn", onPlayerSpawn) +AddEventHandler("esx:onPlayerSpawn", function() + onPlayerSpawn() + + if ESX.PlayerData.metadata.health then + SetEntityHealth(ESX.PlayerData.ped, ESX.PlayerData.metadata.health) + end + + if ESX.PlayerData.metadata.armor and ESX.PlayerData.metadata.armor > 0 then + SetPedArmour(ESX.PlayerData.ped, ESX.PlayerData.metadata.armor) + end +end) AddEventHandler("esx:onPlayerDeath", function() ESX.SetPlayerData("ped", PlayerPedId()) From 47442020074e75fa6b3d577236501b974f15a86a Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Tue, 26 Nov 2024 22:05:01 +0100 Subject: [PATCH 14/36] fix(es_extended/client/main): only apply metadata on first spawn --- [core]/es_extended/client/main.lua | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 6516355e..9912bbff 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -59,16 +59,21 @@ local function onPlayerSpawn() ESX.SetPlayerData("dead", false) end +local isFirstSpawn = true AddEventHandler("playerSpawned", onPlayerSpawn) AddEventHandler("esx:onPlayerSpawn", function() onPlayerSpawn() - if ESX.PlayerData.metadata.health then - SetEntityHealth(ESX.PlayerData.ped, ESX.PlayerData.metadata.health) - end + if isFirstSpawn then + isFirstSpawn = false - if ESX.PlayerData.metadata.armor and ESX.PlayerData.metadata.armor > 0 then - SetPedArmour(ESX.PlayerData.ped, ESX.PlayerData.metadata.armor) + if ESX.PlayerData.metadata.health then + SetEntityHealth(ESX.PlayerData.ped, ESX.PlayerData.metadata.health) + end + + if ESX.PlayerData.metadata.armor and ESX.PlayerData.metadata.armor > 0 then + SetPedArmour(ESX.PlayerData.ped, ESX.PlayerData.metadata.armor) + end end end) From 51c777f6c27709cadb0b84b35ccc326d4dbed508 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Tue, 26 Nov 2024 23:02:13 +0100 Subject: [PATCH 15/36] fix(es_extended/client/main): reset isFirstSpawn on logout --- [core]/es_extended/client/main.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 9912bbff..3cfdc449 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -46,8 +46,10 @@ RegisterNetEvent("esx:playerLoaded", function(xPlayer, _, skin) StartServerSyncLoops() end) +local isFirstSpawn = true ESX.SecureNetEvent("esx:onPlayerLogout", function() ESX.PlayerLoaded = false + isFirstSpawn = true end) ESX.SecureNetEvent("esx:setMaxWeight", function(newMaxWeight) @@ -59,7 +61,6 @@ local function onPlayerSpawn() ESX.SetPlayerData("dead", false) end -local isFirstSpawn = true AddEventHandler("playerSpawned", onPlayerSpawn) AddEventHandler("esx:onPlayerSpawn", function() onPlayerSpawn() From 47ae063aa150722ff5019741d6ab726dd31fc1f3 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Tue, 26 Nov 2024 23:20:35 +0100 Subject: [PATCH 16/36] feat(es_extended/shared/config/main): add Config.SaveDeathStatus --- [core]/es_extended/client/main.lua | 2 +- [core]/es_extended/shared/config/main.lua | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 3cfdc449..a4d1daa9 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -68,7 +68,7 @@ AddEventHandler("esx:onPlayerSpawn", function() if isFirstSpawn then isFirstSpawn = false - if ESX.PlayerData.metadata.health then + if ESX.PlayerData.metadata.health and (ESX.PlayerData.metadata.health > 0 or Config.SaveDeathStatus) then SetEntityHealth(ESX.PlayerData.ped, ESX.PlayerData.metadata.health) end diff --git a/[core]/es_extended/shared/config/main.lua b/[core]/es_extended/shared/config/main.lua index 2c375605..7db1e472 100644 --- a/[core]/es_extended/shared/config/main.lua +++ b/[core]/es_extended/shared/config/main.lua @@ -40,6 +40,7 @@ Config.LogPaycheck = false -- Logs paychecks to a nominated Discord channel via Config.EnableSocietyPayouts = false -- pay from the society account that the player is employed at? Requirement: esx_society Config.MaxWeight = 24 -- the max inventory weight without a backpack Config.PaycheckInterval = 7 * 60000 -- how often to receive paychecks in milliseconds +Config.SaveDeathStatus = true -- Save the death status of a player Config.EnableDebug = false -- Use Debug options? Config.DefaultJobDuty = true -- A players default duty status when changing jobs From 5392f38c7a080f676693e204f3e46da25ae1f45b Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:36:54 +0100 Subject: [PATCH 17/36] feat(es_extended/shared/functions): add ESX.IsFunctionReference --- [core]/es_extended/shared/functions.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/[core]/es_extended/shared/functions.lua b/[core]/es_extended/shared/functions.lua index fc342bce..1a5d0090 100644 --- a/[core]/es_extended/shared/functions.lua +++ b/[core]/es_extended/shared/functions.lua @@ -164,3 +164,10 @@ function ESX.AssertType(...) return matches end + +---@param val unknown +function ESX.IsFunctionReference(val) + local typeVal = type(val) + + return typeVal == "function" or (typeVal == "table" and type(getmetatable(val)?.__call) == "function") +end \ No newline at end of file From 346ce349020256aac4f46c4bbaae9d9e8535a7b4 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:38:19 +0100 Subject: [PATCH 18/36] fix(skinchanger/config): add missing textureof --- [core]/skinchanger/config.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/[core]/skinchanger/config.lua b/[core]/skinchanger/config.lua index 2401b9c7..1d5a0fed 100644 --- a/[core]/skinchanger/config.lua +++ b/[core]/skinchanger/config.lua @@ -237,6 +237,7 @@ Config.Components = { min = 0, zoomOffset = 0.6, camOffset = 0.65, + textureof = "hair_1", max = function(playerPed, Character) return GetNumberOfPedTextureVariations(playerPed, 2, Character["hair_1"]) - 1 end From 2b8841c95a308e2df257e1d580a72262f21110dc Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:38:48 +0100 Subject: [PATCH 19/36] fix(esx_skin/client/modules/menu): fix texture variations not updating --- [core]/esx_skin/client/modules/menu.lua | 38 +++++++++++++++---------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/[core]/esx_skin/client/modules/menu.lua b/[core]/esx_skin/client/modules/menu.lua index 0137f40a..f1179151 100644 --- a/[core]/esx_skin/client/modules/menu.lua +++ b/[core]/esx_skin/client/modules/menu.lua @@ -47,7 +47,7 @@ function Menu:InsertElements() value = GetPedPropIndex(playerPed, self.components[i].componentId) end - local data = self.components[i] + local data = table.clone(self.components[i]) data.value = value data.type = "slider" data.max = self.maxValues[self.components[i].name] @@ -78,27 +78,35 @@ function Menu:Change(data, menu) Skin.zoomOffset = data.current.zoomOffset Skin.camOffset = data.current.camOffset - if skin[data.current.name] ~= data.current.value then - -- Change skin element - exports["skinchanger"]:Change(data.current.name, data.current.value) - skin[data.current.name] = data.current.value + if skin[data.current.name] == data.current.value then + return + end - local newData = {} + -- Change skin element + exports["skinchanger"]:Change(data.current.name, data.current.value) + skin[data.current.name] = data.current.value - for i = 1, #self.elements, 1 do + -- Texture variation changed. We don't have to update anything. + if data.current.textureof then + return + end + + -- Texture changed. Update variation max value. + for i = 1, #self.elements, 1 do + local element = self.elements[i] + + if element.textureof == data.current.name then local component = self.components[i] - newData.max = type(component.max) == "function" and component.max(PlayerPedId(), skin) or component.max - - if self.elements[i].textureof ~= nil and data.current.name == self.elements[i].textureof then - newData.value = 0 + if (ESX.IsFunctionReference(component.max)) then + self.elements[i].max = component.max(PlayerPedId(), skin) end + self.elements[i].value = 0 - menu.update({ name = self.elements[i].name }, newData) + menu.update({ name = self.elements[i].name }, self.elements[i]) + menu.refresh() + break end - - self.elements = newData - menu.refresh() end end From 166fdff8eb3e295ec207fc85c4488f6777d273c2 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:52:15 +0100 Subject: [PATCH 20/36] refactor(esx_skin/client/modules/menu): bad habbits --- [core]/esx_skin/client/modules/menu.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/esx_skin/client/modules/menu.lua b/[core]/esx_skin/client/modules/menu.lua index f1179151..effed0d8 100644 --- a/[core]/esx_skin/client/modules/menu.lua +++ b/[core]/esx_skin/client/modules/menu.lua @@ -98,7 +98,7 @@ function Menu:Change(data, menu) if element.textureof == data.current.name then local component = self.components[i] - if (ESX.IsFunctionReference(component.max)) then + if ESX.IsFunctionReference(component.max) then self.elements[i].max = component.max(PlayerPedId(), skin) end self.elements[i].value = 0 From 016b9bb97ec9b0a8083da86f934cd11ef521ed15 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Wed, 27 Nov 2024 22:06:02 +0100 Subject: [PATCH 21/36] fix(esx_skin/client/modules/menu): immediately update texture variation on texture change --- [core]/esx_skin/client/modules/menu.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/[core]/esx_skin/client/modules/menu.lua b/[core]/esx_skin/client/modules/menu.lua index effed0d8..b6de6745 100644 --- a/[core]/esx_skin/client/modules/menu.lua +++ b/[core]/esx_skin/client/modules/menu.lua @@ -103,6 +103,10 @@ function Menu:Change(data, menu) end self.elements[i].value = 0 + -- Change skin element + exports["skinchanger"]:Change(element.name, 0) + skin[element.name] = data.current.value + menu.update({ name = self.elements[i].name }, self.elements[i]) menu.refresh() break From 96cb6b04fbcb74c0b559ad22fc7140201ee1d44d Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:22:49 +0100 Subject: [PATCH 22/36] refactor(es_extended/client/modules/death): replace gameEventTriggered --- [core]/es_extended/client/modules/death.lua | 29 ++++++++------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/[core]/es_extended/client/modules/death.lua b/[core]/es_extended/client/modules/death.lua index 4054421e..936d6411 100644 --- a/[core]/es_extended/client/modules/death.lua +++ b/[core]/es_extended/client/modules/death.lua @@ -43,19 +43,7 @@ function Death:Natual() TriggerServerEvent("esx:onPlayerDeath", data) end -function Death:Damaged(victim, victimDied) - if not victimDied then - return - end - - if not IsEntityAPed(victim) then - return - end - - if not IsPedAPlayer(victim) then - return - end - +function Death:Damaged(victim) local victimId = NetworkGetPlayerIndexFromPed(victim) local isDead = IsPedDeadOrDying(victim, true) or IsPedFatallyInjured(victim) if victimId ~= ESX.playerId or not isDead then @@ -78,9 +66,14 @@ function Death:Damaged(victim, victimDied) self:ResetValues() end -AddEventHandler("gameEventTriggered", function(event, data) - if event ~= "CEventNetworkEntityDamage" then - return - end - Death:Damaged(data[1], data[4]) +AddEventHandler("esx:onPlayerSpawn", function() + Citizen.CreateThreadNow(function() + while not ESX.PlayerData.dead do + if IsPedDeadOrDying(ESX.PlayerData.ped, true) then + Death:Damaged(ESX.PlayerData.ped) + break + end + Citizen.Wait(250) + end + end) end) From e2c4ab73a6a47e7e55f0b1ab98f849222c408df6 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:23:09 +0100 Subject: [PATCH 23/36] refactor(es_extended/client/modules/death): fix typo --- [core]/es_extended/client/modules/death.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/client/modules/death.lua b/[core]/es_extended/client/modules/death.lua index 936d6411..248916b6 100644 --- a/[core]/es_extended/client/modules/death.lua +++ b/[core]/es_extended/client/modules/death.lua @@ -29,7 +29,7 @@ function Death:ByPlayer() TriggerServerEvent("esx:onPlayerDeath", data) end -function Death:Natual() +function Death:Natural() local coords = GetEntityCoords(ESX.PlayerData.ped) local data = { @@ -60,7 +60,7 @@ function Death:Damaged(victim) if self.killerEntity ~= ESX.PlayerData.ped and self.killerId and isActive then self:ByPlayer() else - self:Natual() + self:Natural() end self:ResetValues() From 1bbd9b119ad3b979f9589929948ed878ca9a845e Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:49:34 +0100 Subject: [PATCH 24/36] refactor(es_extended/client/modules/death): cleanup redundant checks --- [core]/es_extended/client/modules/death.lua | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/[core]/es_extended/client/modules/death.lua b/[core]/es_extended/client/modules/death.lua index 248916b6..ccd7d380 100644 --- a/[core]/es_extended/client/modules/death.lua +++ b/[core]/es_extended/client/modules/death.lua @@ -44,12 +44,6 @@ function Death:Natural() end function Death:Damaged(victim) - local victimId = NetworkGetPlayerIndexFromPed(victim) - local isDead = IsPedDeadOrDying(victim, true) or IsPedFatallyInjured(victim) - if victimId ~= ESX.playerId or not isDead then - return - end - self.killerEntity = GetPedSourceOfDeath(ESX.PlayerData.ped) self.deathCause = GetPedCauseOfDeath(ESX.PlayerData.ped) self.killerId = NetworkGetPlayerIndexFromPed(self.killerEntity) @@ -69,7 +63,7 @@ end AddEventHandler("esx:onPlayerSpawn", function() Citizen.CreateThreadNow(function() while not ESX.PlayerData.dead do - if IsPedDeadOrDying(ESX.PlayerData.ped, true) then + if IsPedDeadOrDying(ESX.PlayerData.ped, true) or IsPedFatallyInjured(ESX.PlayerData.ped) then Death:Damaged(ESX.PlayerData.ped) break end From 3af9ce34fdea99d7a68d0e0e996332f1db59f9b4 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:50:41 +0100 Subject: [PATCH 25/36] refactor(es_extended/client/modules/death): remove unused function param --- [core]/es_extended/client/modules/death.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/client/modules/death.lua b/[core]/es_extended/client/modules/death.lua index ccd7d380..810525f2 100644 --- a/[core]/es_extended/client/modules/death.lua +++ b/[core]/es_extended/client/modules/death.lua @@ -43,7 +43,7 @@ function Death:Natural() TriggerServerEvent("esx:onPlayerDeath", data) end -function Death:Damaged(victim) +function Death:Damaged() self.killerEntity = GetPedSourceOfDeath(ESX.PlayerData.ped) self.deathCause = GetPedCauseOfDeath(ESX.PlayerData.ped) self.killerId = NetworkGetPlayerIndexFromPed(self.killerEntity) @@ -64,7 +64,7 @@ AddEventHandler("esx:onPlayerSpawn", function() Citizen.CreateThreadNow(function() while not ESX.PlayerData.dead do if IsPedDeadOrDying(ESX.PlayerData.ped, true) or IsPedFatallyInjured(ESX.PlayerData.ped) then - Death:Damaged(ESX.PlayerData.ped) + Death:Damaged() break end Citizen.Wait(250) From 114c337d6c80766905704765b32e3b01ff2edc1a Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:51:26 +0100 Subject: [PATCH 26/36] refactor(es_extended/client/modules/death): more appropriate function name --- [core]/es_extended/client/modules/death.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/client/modules/death.lua b/[core]/es_extended/client/modules/death.lua index 810525f2..28e860de 100644 --- a/[core]/es_extended/client/modules/death.lua +++ b/[core]/es_extended/client/modules/death.lua @@ -43,7 +43,7 @@ function Death:Natural() TriggerServerEvent("esx:onPlayerDeath", data) end -function Death:Damaged() +function Death:Died() self.killerEntity = GetPedSourceOfDeath(ESX.PlayerData.ped) self.deathCause = GetPedCauseOfDeath(ESX.PlayerData.ped) self.killerId = NetworkGetPlayerIndexFromPed(self.killerEntity) @@ -64,7 +64,7 @@ AddEventHandler("esx:onPlayerSpawn", function() Citizen.CreateThreadNow(function() while not ESX.PlayerData.dead do if IsPedDeadOrDying(ESX.PlayerData.ped, true) or IsPedFatallyInjured(ESX.PlayerData.ped) then - Death:Damaged() + Death:Died() break end Citizen.Wait(250) From 0fe6ef4b1cfec028be03fb2965d1c2eaf3510e26 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sat, 30 Nov 2024 23:40:09 +0100 Subject: [PATCH 27/36] fix(es_extended/server/classes/player): remove throwables from loadout when out of ammo --- [core]/es_extended/server/classes/player.lua | 13 +++++++++++-- [core]/es_extended/shared/config/weapons.lua | 16 ++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 2bfeb79f..9f6c9c8c 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -608,8 +608,17 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, function self.updateWeaponAmmo(weaponName, ammoCount) local _, weapon = self.getWeapon(weaponName) - if weapon then - weapon.ammo = ammoCount + if not weapon then + return + end + + weapon.ammo = ammoCount + + if weapon.ammo <= 0 then + local index, weaponConfig = ESX.GetWeapon(weaponName) + if weaponConfig.throwable then + self.removeWeapon(weaponName) + end end end diff --git a/[core]/es_extended/shared/config/weapons.lua b/[core]/es_extended/shared/config/weapons.lua index d26ab75a..5b8107ad 100644 --- a/[core]/es_extended/shared/config/weapons.lua +++ b/[core]/es_extended/shared/config/weapons.lua @@ -1008,22 +1008,22 @@ Config.Weapons = { { name = "WEAPON_RPG", label = TranslateCap("weapon_rpg"), tints = Config.DefaultWeaponTints, components = {}, ammo = { label = TranslateCap("ammo_rockets"), hash = `AMMO_RPG` } }, { name = "WEAPON_RAYMINIGUN", label = TranslateCap("weapon_rayminigun"), tints = Config.DefaultWeaponTints, components = {}, ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MINIGUN` } }, -- Thrown - { name = "WEAPON_BALL", label = TranslateCap("weapon_ball"), components = {}, ammo = { label = TranslateCap("ammo_ball"), hash = `AMMO_BALL` } }, - { name = "WEAPON_BZGAS", label = TranslateCap("weapon_bzgas"), components = {}, ammo = { label = TranslateCap("ammo_bzgas"), hash = `AMMO_BZGAS` } }, + { name = "WEAPON_BALL", label = TranslateCap("weapon_ball"), components = {}, ammo = { label = TranslateCap("ammo_ball"), hash = `AMMO_BALL` }, throwable = true }, + { name = "WEAPON_BZGAS", label = TranslateCap("weapon_bzgas"), components = {}, ammo = { label = TranslateCap("ammo_bzgas"), hash = `AMMO_BZGAS` }, throwable = true }, { name = "WEAPON_FLARE", label = TranslateCap("weapon_flare"), components = {}, ammo = { label = TranslateCap("ammo_flare"), hash = `AMMO_FLARE` } }, - { name = "WEAPON_GRENADE", label = TranslateCap("weapon_grenade"), components = {}, ammo = { label = TranslateCap("ammo_grenade"), hash = `AMMO_GRENADE` } }, + { name = "WEAPON_GRENADE", label = TranslateCap("weapon_grenade"), components = {}, ammo = { label = TranslateCap("ammo_grenade"), hash = `AMMO_GRENADE` }, throwable = true }, { name = "WEAPON_PETROLCAN", label = TranslateCap("weapon_petrolcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` } }, { name = "WEAPON_HAZARDCAN", label = TranslateCap("weapon_hazardcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` } }, - { name = "WEAPON_MOLOTOV", label = TranslateCap("weapon_molotov"), components = {}, ammo = { label = TranslateCap("ammo_molotov"), hash = `AMMO_MOLOTOV` } }, + { name = "WEAPON_MOLOTOV", label = TranslateCap("weapon_molotov"), components = {}, ammo = { label = TranslateCap("ammo_molotov"), hash = `AMMO_MOLOTOV` }, throwable = true }, { name = "WEAPON_PROXMINE", label = TranslateCap("weapon_proxmine"), components = {}, ammo = { label = TranslateCap("ammo_proxmine"), hash = `AMMO_PROXMINE` } }, { name = "WEAPON_PIPEBOMB", label = TranslateCap("weapon_pipebomb"), components = {}, ammo = { label = TranslateCap("ammo_pipebomb"), hash = `AMMO_PIPEBOMB` } }, - { name = "WEAPON_SNOWBALL", label = TranslateCap("weapon_snowball"), components = {}, ammo = { label = TranslateCap("ammo_snowball"), hash = `AMMO_SNOWBALL` } }, - { name = "WEAPON_STICKYBOMB", label = TranslateCap("weapon_stickybomb"), components = {}, ammo = { label = TranslateCap("ammo_stickybomb"), hash = `AMMO_STICKYBOMB` } }, - { name = "WEAPON_SMOKEGRENADE", label = TranslateCap("weapon_smokegrenade"), components = {}, ammo = { label = TranslateCap("ammo_smokebomb"), hash = `AMMO_SMOKEGRENADE` } }, + { name = "WEAPON_SNOWBALL", label = TranslateCap("weapon_snowball"), components = {}, ammo = { label = TranslateCap("ammo_snowball"), hash = `AMMO_SNOWBALL` }, throwable = true }, + { name = "WEAPON_STICKYBOMB", label = TranslateCap("weapon_stickybomb"), components = {}, ammo = { label = TranslateCap("ammo_stickybomb"), hash = `AMMO_STICKYBOMB` }, throwable = true }, + { name = "WEAPON_SMOKEGRENADE", label = TranslateCap("weapon_smokegrenade"), components = {}, ammo = { label = TranslateCap("ammo_smokebomb"), hash = `AMMO_SMOKEGRENADE` }, throwable = true }, -- Tools { name = "WEAPON_FIREEXTINGUISHER", label = TranslateCap("weapon_fireextinguisher"), components = {}, ammo = { label = TranslateCap("ammo_charge"), hash = `AMMO_FIREEXTINGUISHER` } }, { name = "WEAPON_DIGISCANNER", label = TranslateCap("weapon_digiscanner"), components = {} }, - { name = "GADGET_PARACHUTE", label = TranslateCap("gadget_parachute"), components = {} }, + { name = "GADGET_PARACHUTE", label = TranslateCap("gadget_parachute"), components = {}, throwable = true }, { name = "WEAPON_TACTICALRIFLE", label = TranslateCap("weapon_tactilerifle"), From d1cdd3584b6d2c2dc46e1f62ca9eb491d5f1d90f Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 1 Dec 2024 00:09:23 +0100 Subject: [PATCH 28/36] refactor(es_extended/client/main): lowercase ammo --- [core]/es_extended/client/main.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index a4d1daa9..2b82a1d1 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -288,7 +288,7 @@ function StartServerSyncLoops() if Config.CustomInventory then return end -- keep track of ammo CreateThread(function() - local currentWeapon = { Ammo = 0 } + local currentWeapon = { ammo = 0 } while ESX.PlayerLoaded do local sleep = 1500 if GetSelectedPedWeapon(ESX.PlayerData.ped) ~= -1569615261 then @@ -298,11 +298,11 @@ function StartServerSyncLoops() if weapon then local ammoCount = GetAmmoInPedWeapon(ESX.PlayerData.ped, weaponHash) if weapon.name ~= currentWeapon.name then - currentWeapon.Ammo = ammoCount + currentWeapon.ammo = ammoCount currentWeapon.name = weapon.name else - if ammoCount ~= currentWeapon.Ammo then - currentWeapon.Ammo = ammoCount + if ammoCount ~= currentWeapon.ammo then + currentWeapon.ammo = ammoCount TriggerServerEvent("esx:updateWeaponAmmo", weapon.name, ammoCount) end end From 6fd92c72d4ca2a977df5d35ac617b9703d3f1327 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 1 Dec 2024 00:47:19 +0100 Subject: [PATCH 29/36] refactor(es_extended/client/main): faster thread, but only update weapon ammo on weapon change --- [core]/es_extended/client/main.lua | 39 ++++++++++++++++-------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 2b82a1d1..6a3eba71 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -286,29 +286,32 @@ end function StartServerSyncLoops() if Config.CustomInventory then return end - -- keep track of ammo + CreateThread(function() - local currentWeapon = { ammo = 0 } + local currentWeapon = { + ---@type number + ---@diagnostic disable-next-line: assign-type-mismatch + hash = `WEAPON_UNARMED`, + ammo = 0, + } + while ESX.PlayerLoaded do - local sleep = 1500 - if GetSelectedPedWeapon(ESX.PlayerData.ped) ~= -1569615261 then - sleep = 1000 - local _, weaponHash = GetCurrentPedWeapon(ESX.PlayerData.ped, true) - local weapon = ESX.GetWeaponFromHash(weaponHash) - if weapon then - local ammoCount = GetAmmoInPedWeapon(ESX.PlayerData.ped, weaponHash) - if weapon.name ~= currentWeapon.name then - currentWeapon.ammo = ammoCount - currentWeapon.name = weapon.name - else - if ammoCount ~= currentWeapon.ammo then - currentWeapon.ammo = ammoCount - TriggerServerEvent("esx:updateWeaponAmmo", weapon.name, ammoCount) - end + currentWeapon.hash = GetSelectedPedWeapon(ESX.PlayerData.ped) + + if currentWeapon.hash ~= `WEAPON_UNARMED` then + local weaponConfig = ESX.GetWeaponFromHash(currentWeapon.hash) + + if weaponConfig then + currentWeapon.ammo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash) + while (GetSelectedPedWeapon(ESX.PlayerData.ped) == currentWeapon.hash) do Citizen.Wait(500) end + + local newAmmo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash) + if newAmmo ~= currentWeapon.ammo then + TriggerServerEvent("esx:updateWeaponAmmo", weaponConfig.name, newAmmo) end end end - Wait(sleep) + Wait(250) end end) end From d1412c74123226582513f4c2ed0112eab8ddc5e3 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 1 Dec 2024 01:30:29 +0100 Subject: [PATCH 30/36] fix(es_extended/client/main): track parachute opening to remove from loadout --- [core]/es_extended/client/main.lua | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 6a3eba71..5df66c32 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -303,7 +303,7 @@ function StartServerSyncLoops() if weaponConfig then currentWeapon.ammo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash) - while (GetSelectedPedWeapon(ESX.PlayerData.ped) == currentWeapon.hash) do Citizen.Wait(500) end + while GetSelectedPedWeapon(ESX.PlayerData.ped) == currentWeapon.hash do Wait(500) end local newAmmo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash) if newAmmo ~= currentWeapon.ammo then @@ -314,6 +314,22 @@ function StartServerSyncLoops() Wait(250) end end) + + CreateThread(function() + local PARACHUTE_OPENING = 1 + local PARACHUTE_OPEN = 2 + + while ESX.PlayerLoaded do + local parachuteState = GetPedParachuteState(ESX.PlayerData.ped) + + if parachuteState == PARACHUTE_OPENING or parachuteState == PARACHUTE_OPEN then + while GetPedParachuteState(ESX.PlayerData.ped) ~= -1 do Wait(1000) end + + TriggerServerEvent("esx:updateWeaponAmmo", "GADGET_PARACHUTE", 0) + end + Wait(500) + end + end) end if not Config.CustomInventory and Config.EnableDefaultInventory then From edc73a1048ef58bbe7e11a039aaf7a57177a6b7b Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 1 Dec 2024 01:49:41 +0100 Subject: [PATCH 31/36] fix(es_extended/shared/config/weapons): add remaining throwables --- [core]/es_extended/shared/config/weapons.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[core]/es_extended/shared/config/weapons.lua b/[core]/es_extended/shared/config/weapons.lua index 5b8107ad..82acd944 100644 --- a/[core]/es_extended/shared/config/weapons.lua +++ b/[core]/es_extended/shared/config/weapons.lua @@ -1010,13 +1010,13 @@ Config.Weapons = { -- Thrown { name = "WEAPON_BALL", label = TranslateCap("weapon_ball"), components = {}, ammo = { label = TranslateCap("ammo_ball"), hash = `AMMO_BALL` }, throwable = true }, { name = "WEAPON_BZGAS", label = TranslateCap("weapon_bzgas"), components = {}, ammo = { label = TranslateCap("ammo_bzgas"), hash = `AMMO_BZGAS` }, throwable = true }, - { name = "WEAPON_FLARE", label = TranslateCap("weapon_flare"), components = {}, ammo = { label = TranslateCap("ammo_flare"), hash = `AMMO_FLARE` } }, + { name = "WEAPON_FLARE", label = TranslateCap("weapon_flare"), components = {}, ammo = { label = TranslateCap("ammo_flare"), hash = `AMMO_FLARE` }, throwable = true }, { name = "WEAPON_GRENADE", label = TranslateCap("weapon_grenade"), components = {}, ammo = { label = TranslateCap("ammo_grenade"), hash = `AMMO_GRENADE` }, throwable = true }, { name = "WEAPON_PETROLCAN", label = TranslateCap("weapon_petrolcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` } }, { name = "WEAPON_HAZARDCAN", label = TranslateCap("weapon_hazardcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` } }, { name = "WEAPON_MOLOTOV", label = TranslateCap("weapon_molotov"), components = {}, ammo = { label = TranslateCap("ammo_molotov"), hash = `AMMO_MOLOTOV` }, throwable = true }, - { name = "WEAPON_PROXMINE", label = TranslateCap("weapon_proxmine"), components = {}, ammo = { label = TranslateCap("ammo_proxmine"), hash = `AMMO_PROXMINE` } }, - { name = "WEAPON_PIPEBOMB", label = TranslateCap("weapon_pipebomb"), components = {}, ammo = { label = TranslateCap("ammo_pipebomb"), hash = `AMMO_PIPEBOMB` } }, + { name = "WEAPON_PROXMINE", label = TranslateCap("weapon_proxmine"), components = {}, ammo = { label = TranslateCap("ammo_proxmine"), hash = `AMMO_PROXMINE` }, throwable = true }, + { name = "WEAPON_PIPEBOMB", label = TranslateCap("weapon_pipebomb"), components = {}, ammo = { label = TranslateCap("ammo_pipebomb"), hash = `AMMO_PIPEBOMB` }, throwable = true }, { name = "WEAPON_SNOWBALL", label = TranslateCap("weapon_snowball"), components = {}, ammo = { label = TranslateCap("ammo_snowball"), hash = `AMMO_SNOWBALL` }, throwable = true }, { name = "WEAPON_STICKYBOMB", label = TranslateCap("weapon_stickybomb"), components = {}, ammo = { label = TranslateCap("ammo_stickybomb"), hash = `AMMO_STICKYBOMB` }, throwable = true }, { name = "WEAPON_SMOKEGRENADE", label = TranslateCap("weapon_smokegrenade"), components = {}, ammo = { label = TranslateCap("ammo_smokebomb"), hash = `AMMO_SMOKEGRENADE` }, throwable = true }, @@ -1057,7 +1057,7 @@ Config.Weapons = { { name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_PISTOLXM3_SUPP` }, }, }, - { name = "WEAPON_ACIDPACKAGE", label = TranslateCap("weapon_acidpackage"), components = {} }, + { name = "WEAPON_ACIDPACKAGE", label = TranslateCap("weapon_acidpackage"), components = {}, throwable = true }, { name = "WEAPON_CANDYCANE", label = TranslateCap("weapon_candycane"), components = {} }, { name = "WEAPON_RAILGUNXM3", From 018b663b8a8b5032a4ec9a271c7f1851d3b59da7 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 1 Dec 2024 02:02:33 +0100 Subject: [PATCH 32/36] fix(es_extended/shared/config/weapons): add missing throwables --- [core]/es_extended/shared/config/weapons.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/shared/config/weapons.lua b/[core]/es_extended/shared/config/weapons.lua index 82acd944..e9392f30 100644 --- a/[core]/es_extended/shared/config/weapons.lua +++ b/[core]/es_extended/shared/config/weapons.lua @@ -1012,8 +1012,8 @@ Config.Weapons = { { name = "WEAPON_BZGAS", label = TranslateCap("weapon_bzgas"), components = {}, ammo = { label = TranslateCap("ammo_bzgas"), hash = `AMMO_BZGAS` }, throwable = true }, { name = "WEAPON_FLARE", label = TranslateCap("weapon_flare"), components = {}, ammo = { label = TranslateCap("ammo_flare"), hash = `AMMO_FLARE` }, throwable = true }, { name = "WEAPON_GRENADE", label = TranslateCap("weapon_grenade"), components = {}, ammo = { label = TranslateCap("ammo_grenade"), hash = `AMMO_GRENADE` }, throwable = true }, - { name = "WEAPON_PETROLCAN", label = TranslateCap("weapon_petrolcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` } }, - { name = "WEAPON_HAZARDCAN", label = TranslateCap("weapon_hazardcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` } }, + { name = "WEAPON_PETROLCAN", label = TranslateCap("weapon_petrolcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` }, throwable = true }, + { name = "WEAPON_HAZARDCAN", label = TranslateCap("weapon_hazardcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` }, throwable = true }, { name = "WEAPON_MOLOTOV", label = TranslateCap("weapon_molotov"), components = {}, ammo = { label = TranslateCap("ammo_molotov"), hash = `AMMO_MOLOTOV` }, throwable = true }, { name = "WEAPON_PROXMINE", label = TranslateCap("weapon_proxmine"), components = {}, ammo = { label = TranslateCap("ammo_proxmine"), hash = `AMMO_PROXMINE` }, throwable = true }, { name = "WEAPON_PIPEBOMB", label = TranslateCap("weapon_pipebomb"), components = {}, ammo = { label = TranslateCap("ammo_pipebomb"), hash = `AMMO_PIPEBOMB` }, throwable = true }, From 2b74b5f5e2adb549c22bf601bb0b57dd35e9a689 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 1 Dec 2024 12:55:50 +0100 Subject: [PATCH 33/36] fix(es_extended/client/main): remove parachute immediately on use --- [core]/es_extended/client/main.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 5df66c32..1736b5d1 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -323,9 +323,9 @@ function StartServerSyncLoops() local parachuteState = GetPedParachuteState(ESX.PlayerData.ped) if parachuteState == PARACHUTE_OPENING or parachuteState == PARACHUTE_OPEN then - while GetPedParachuteState(ESX.PlayerData.ped) ~= -1 do Wait(1000) end - TriggerServerEvent("esx:updateWeaponAmmo", "GADGET_PARACHUTE", 0) + + while GetPedParachuteState(ESX.PlayerData.ped) ~= -1 do Wait(1000) end end Wait(500) end From 0b21afff67aa1434622c56884d3199a65433dcb9 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 1 Dec 2024 14:07:05 +0100 Subject: [PATCH 34/36] fix(es_extended/client/main): revert ammo caching --- [core]/es_extended/client/main.lua | 32 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 1736b5d1..5ba9fad5 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -287,14 +287,23 @@ end function StartServerSyncLoops() if Config.CustomInventory then return end - CreateThread(function() - local currentWeapon = { - ---@type number - ---@diagnostic disable-next-line: assign-type-mismatch - hash = `WEAPON_UNARMED`, - ammo = 0, - } + local currentWeapon = { + ---@type number + ---@diagnostic disable-next-line: assign-type-mismatch + hash = `WEAPON_UNARMED`, + ammo = 0, + } + local function updateCurrentWeaponAmmo(weaponName) + local newAmmo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash) + + if newAmmo ~= currentWeapon.ammo then + currentWeapon.ammo = newAmmo + TriggerServerEvent("esx:updateWeaponAmmo", weaponName, newAmmo) + end + end + + CreateThread(function() while ESX.PlayerLoaded do currentWeapon.hash = GetSelectedPedWeapon(ESX.PlayerData.ped) @@ -303,12 +312,13 @@ function StartServerSyncLoops() if weaponConfig then currentWeapon.ammo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash) - while GetSelectedPedWeapon(ESX.PlayerData.ped) == currentWeapon.hash do Wait(500) end - local newAmmo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash) - if newAmmo ~= currentWeapon.ammo then - TriggerServerEvent("esx:updateWeaponAmmo", weaponConfig.name, newAmmo) + while GetSelectedPedWeapon(ESX.PlayerData.ped) == currentWeapon.hash do + updateCurrentWeaponAmmo(weaponConfig.name) + Wait(1000) end + + updateCurrentWeaponAmmo(weaponConfig.name) end end Wait(250) From 727ef8395eb7ee9d84114e013755be83f5282cb5 Mon Sep 17 00:00:00 2001 From: Ilias Rbayti <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 1 Dec 2024 14:32:52 +0100 Subject: [PATCH 35/36] refactor(es_extended/server/classes/player): index is unused --- [core]/es_extended/server/classes/player.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 9f6c9c8c..b5e66e7b 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -615,7 +615,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, weapon.ammo = ammoCount if weapon.ammo <= 0 then - local index, weaponConfig = ESX.GetWeapon(weaponName) + local _, weaponConfig = ESX.GetWeapon(weaponName) if weaponConfig.throwable then self.removeWeapon(weaponName) end From 783c8125d5dcd66c3a6ca6eca2fcc680457ce298 Mon Sep 17 00:00:00 2001 From: Kenshin13 <63159154+Kenshiin13@users.noreply.github.com> Date: Tue, 3 Dec 2024 17:11:43 +0100 Subject: [PATCH 36/36] feat(es_extended/client/main): sync where players look at --- [core]/es_extended/client/main.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 5ba9fad5..08d85b78 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -44,6 +44,7 @@ RegisterNetEvent("esx:playerLoaded", function(xPlayer, _, skin) Actions:Init() StartPointsLoop() StartServerSyncLoops() + NetworkSetLocalPlayerSyncLookAt(true) end) local isFirstSpawn = true