From d91c4aff09e3018d672d22fc262661df102472e4 Mon Sep 17 00:00:00 2001 From: Alx <96348049+AlexRXWindy@users.noreply.github.com> Date: Wed, 15 Oct 2025 23:51:43 +0200 Subject: [PATCH] refactor: address code review feedback --- .../client/modules/adjustments.lua | 157 ++++++++++++++---- .../es_extended/shared/config/adjustments.lua | 23 ++- 2 files changed, 141 insertions(+), 39 deletions(-) diff --git a/[core]/es_extended/client/modules/adjustments.lua b/[core]/es_extended/client/modules/adjustments.lua index ffb5e43e..acff4987 100644 --- a/[core]/es_extended/client/modules/adjustments.lua +++ b/[core]/es_extended/client/modules/adjustments.lua @@ -236,43 +236,119 @@ function Adjustments:Multipliers() end function Adjustments:ApplyPlayerStats() - if not Config.PlayerStatsByGender.enabled then return end + if not Config.PlayerStatsByGender.enabled then return end + + if Config.PlayerStatsByGender.debugMode then + print('[^3adjustments^7] applying player stats...') + end local gender = self:GetPlayerGender() - if not gender then return end + if not gender then + if Config.PlayerStatsByGender.debugMode then + print('[^1adjustments^7] failed to detect gender') + end + return + end local stats = Config.PlayerStatsByGender[gender] - if not stats then return end + if not stats then + if Config.PlayerStatsByGender.debugMode then + print('[^1adjustments^7] no stats found for gender: ' .. gender) + end + return + end + if stats.stamina then + SetRunSprintMultiplierForPlayer(ESX.playerId, stats.stamina) + if Config.PlayerStatsByGender.debugMode then + print('[^2adjustments^7] stamina: ' .. tostring(stats.stamina)) + end + end - SetPlayerMaxStamina(ESX.playerId, 100.0) - RestorePlayerStamina(ESX.playerId, 100.0) - SetRunSprintMultiplierForPlayer(ESX.playerId, stats.stamina) - SetSwimMultiplierForPlayer(ESX.playerId, stats.stamina) + if stats.strength then + SetPlayerMeleeWeaponDamageModifier(ESX.playerId, stats.strength) + if Config.PlayerStatsByGender.debugMode then + print('[^2adjustments^7] strength: ' .. tostring(stats.strength)) + end + end - SetPedMoveRateOverride(ESX.PlayerData.ped, stats.stamina) + if stats.swimSpeed then + SetSwimMultiplierForPlayer(ESX.playerId, stats.swimSpeed) + if Config.PlayerStatsByGender.debugMode then + print('[^2adjustments^7] swimSpeed: ' .. tostring(stats.swimSpeed)) + end + end - SetPlayerMeleeWeaponDamageModifier(ESX.playerId, stats.strength) - SetPlayerWeaponDamageModifier(ESX.playerId, stats.strength) + if stats.moveSpeed then + self.currentMoveSpeed = stats.moveSpeed + if not self.moveSpeedThreadRunning then + self.moveSpeedThreadRunning = true + CreateThread(function() + while Config.PlayerStatsByGender.enabled and self.currentMoveSpeed do + if ESX.PlayerData.ped then + SetPedMoveRateOverride(ESX.PlayerData.ped, self.currentMoveSpeed) + end + Wait(0) + end + self.moveSpeedThreadRunning = false + end) + end + if Config.PlayerStatsByGender.debugMode then + print('[^2adjustments^7] moveSpeed: ' .. tostring(stats.moveSpeed)) + end + end + + -- ADD NEW STATS HERE + -- ======================================================================== + -- 1. Find your native: https://docs.fivem.net/natives/ + -- 2. Uncomment template below (remove --) + -- 3. Replace "statName" with your stat name + -- 4. Replace "YourNative" with native from docs + -- 5. Add same stat to Config file + -- 6. Debug print is OPTIONAL (can be removed) + -- ======================================================================== + + -- if stats.statName then + -- YourNative(ESX.playerId, stats.statName) + -- if Config.PlayerStatsByGender.debugMode then + -- print('[^2adjustments^7] statName: ' .. tostring(stats.statName)) + -- end + -- end + + if Config.PlayerStatsByGender.debugMode then + print('[^2adjustments^7] stats applied for gender: ' .. gender) + end end function Adjustments:GetPlayerGender() - if not ESX.PlayerLoaded then return end + if not ESX.PlayerLoaded then + if Config.PlayerStatsByGender.debugMode then + print('[^1adjustments^7] player not loaded yet') + end + return + end + + if Config.PlayerStatsByGender.debugMode then + print('[^3adjustments^7] detecting gender using: ' .. (Config.PlayerStatsByGender.useCharacterData and 'character data' or 'ped model')) + end if Config.PlayerStatsByGender.useCharacterData then if ESX.PlayerData.sex then return ESX.PlayerData.sex == 'm' and 'male' or 'female' end - - if ESX.PlayerData.gender then - return ESX.PlayerData.gender == 0 and 'male' or 'female' - end else local model = GetEntityModel(ESX.PlayerData.ped) - if model == `mp_m_freemode_01` then - return 'male' - elseif model == `mp_f_freemode_01` then - return 'female' + + for i = 1, #Config.PlayerStatsByGender.malePeds do + if model == Config.PlayerStatsByGender.malePeds[i] then + return 'male' + end + end + + for i = 1, #Config.PlayerStatsByGender.femalePeds do + if model == Config.PlayerStatsByGender.femalePeds[i] then + return 'female' + end end if IsPedMale(ESX.PlayerData.ped) then @@ -285,21 +361,9 @@ function Adjustments:GetPlayerGender() return nil end + function Adjustments:RefreshPlayerStats() - if not Config.PlayerStatsByGender.enabled then return end - - local gender = self:GetPlayerGender() - if not gender then return end - - local stats = Config.PlayerStatsByGender[gender] - if not stats then return end - - SetRunSprintMultiplierForPlayer(ESX.playerId, stats.stamina) - SetSwimMultiplierForPlayer(ESX.playerId, stats.stamina) - SetPedMoveRateOverride(ESX.PlayerData.ped, stats.stamina) - - SetPlayerMeleeWeaponDamageModifier(ESX.playerId, stats.strength) - SetPlayerWeaponDamageModifier(ESX.playerId, stats.strength) + self:ApplyPlayerStats() end function Adjustments:Load() @@ -319,14 +383,35 @@ function Adjustments:Load() self:Multipliers() AddEventHandler('esx:playerLoaded', function(xPlayer, isNew, skin) + if Config.PlayerStatsByGender.debugMode then + print('[^3adjustments^7] esx:playerloaded event triggered') + end self:ApplyPlayerStats() end) - AddEventHandler('skinchanger:modelLoaded', function() - self:RefreshPlayerStats() - end) + if not Config.PlayerStatsByGender.useCharacterData then + AddEventHandler('skinchanger:modelLoaded', function() + if Config.PlayerStatsByGender.debugMode then + print('[^3adjustments^7] skinchanger:modelloaded event triggered') + end + self:RefreshPlayerStats() + end) + else + if Config.PlayerStatsByGender.debugMode then + print('[^3adjustments^7] skinchanger event not registered (using character data)') + end + end AddEventHandler('esx:onPlayerSpawn', function() + if Config.PlayerStatsByGender.debugMode then + print('[^3adjustments^7] esx:onplayerspawn event triggered') + end self:RefreshPlayerStats() end) + if Config.PlayerStatsByGender.enabled and Config.PlayerStatsByGender.debugMode then + print('[^2adjustments^7] player stats by gender loaded') + print('[^3adjustments^7] enabled: ' .. tostring(Config.PlayerStatsByGender.enabled)) + print('[^3adjustments^7] use character data: ' .. tostring(Config.PlayerStatsByGender.useCharacterData)) + print('[^3adjustments^7] debug mode: active') + end end diff --git a/[core]/es_extended/shared/config/adjustments.lua b/[core]/es_extended/shared/config/adjustments.lua index e798311e..e41b6ece 100644 --- a/[core]/es_extended/shared/config/adjustments.lua +++ b/[core]/es_extended/shared/config/adjustments.lua @@ -44,17 +44,34 @@ Config.Multipliers = { vehicleDensity = 1.0 } + Config.PlayerStatsByGender = { enabled = true, debugMode = true, useCharacterData = true, -- true: uses ESX.PlayerData.sex | false: uses ped model/skin + malePeds = { + `mp_m_freemode_01`, + }, + femalePeds = { + `mp_f_freemode_01`, + }, male = { stamina = 1.0, - strength = 1.0 + strength = 1.0, + swimSpeed = 1.25, + moveSpeed = 1.0, + + -- ADD NEW STATS HERE + -- 1. Uncomment line below (remove --) + -- 2. Change value: 1.0 = normal, 1.5 = +50%, 0.5 = -50% + -- 3. Find natives: https://docs.fivem.net/natives/ + -- statName = 1.0, }, - female = { + female = { stamina = 1.15, - strength = 0.85 + strength = 0.85, + swimSpeed = 1.25, + moveSpeed = 7.00, } }