From 8c3620769f246fb1f22ebc5db116406899d29e51 Mon Sep 17 00:00:00 2001 From: Alx <96348049+AlexRXWindy@users.noreply.github.com> Date: Wed, 15 Oct 2025 20:30:46 +0200 Subject: [PATCH] feat(player-stats): add new configurable stats and new character stat options --- .../client/modules/adjustments.lua | 79 +++++++++++++++++++ .../es_extended/shared/config/adjustments.lua | 14 ++++ 2 files changed, 93 insertions(+) diff --git a/[core]/es_extended/client/modules/adjustments.lua b/[core]/es_extended/client/modules/adjustments.lua index 1c83b148..ffb5e43e 100644 --- a/[core]/es_extended/client/modules/adjustments.lua +++ b/[core]/es_extended/client/modules/adjustments.lua @@ -235,6 +235,73 @@ function Adjustments:Multipliers() end) end +function Adjustments:ApplyPlayerStats() + 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 + + + SetPlayerMaxStamina(ESX.playerId, 100.0) + RestorePlayerStamina(ESX.playerId, 100.0) + 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) +end + +function Adjustments:GetPlayerGender() + if not ESX.PlayerLoaded then return 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' + end + + if IsPedMale(ESX.PlayerData.ped) then + return 'male' + else + return 'female' + end + end + + 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) +end + function Adjustments:Load() self:RemoveHudComponents() self:DisableAimAssist() @@ -250,4 +317,16 @@ function Adjustments:Load() self:WantedLevel() self:DisableRadio() self:Multipliers() + + AddEventHandler('esx:playerLoaded', function(xPlayer, isNew, skin) + self:ApplyPlayerStats() + end) + + AddEventHandler('skinchanger:modelLoaded', function() + self:RefreshPlayerStats() + end) + + AddEventHandler('esx:onPlayerSpawn', function() + self:RefreshPlayerStats() + end) end diff --git a/[core]/es_extended/shared/config/adjustments.lua b/[core]/es_extended/shared/config/adjustments.lua index 334e95d4..e798311e 100644 --- a/[core]/es_extended/shared/config/adjustments.lua +++ b/[core]/es_extended/shared/config/adjustments.lua @@ -44,6 +44,20 @@ Config.Multipliers = { vehicleDensity = 1.0 } +Config.PlayerStatsByGender = { + enabled = true, + debugMode = true, + useCharacterData = true, -- true: uses ESX.PlayerData.sex | false: uses ped model/skin + male = { + stamina = 1.0, + strength = 1.0 + }, + female = { + stamina = 1.15, + strength = 0.85 + } +} + -- Pattern string format --1 will lead to a random number from 0-9. --A will lead to a random letter from A-Z.