From 84e8eb20b397cd0b370ccb77a1bc7507123e6d60 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:36:55 +0000 Subject: [PATCH 01/12] refactor(es_extended/shared/config): remove adjustments.lua --- .../es_extended/shared/config/adjustments.lua | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 [core]/es_extended/shared/config/adjustments.lua diff --git a/[core]/es_extended/shared/config/adjustments.lua b/[core]/es_extended/shared/config/adjustments.lua deleted file mode 100644 index ae7b8a466..000000000 --- a/[core]/es_extended/shared/config/adjustments.lua +++ /dev/null @@ -1,70 +0,0 @@ -Config.DisableHealthRegeneration = false -- Player will no longer regenerate health -Config.DisableVehicleRewards = false -- Disables Player Receiving weapons from vehicles -Config.DisableNPCDrops = false -- stops NPCs from dropping weapons on death -Config.DisableDispatchServices = true -- Disable Dispatch services -Config.DisableScenarios = true -- Disable Scenarios -Config.DisableAimAssist = false -- disables AIM assist (mainly on controllers) -Config.DisableVehicleSeatShuff = false -- Disables vehicle seat shuff -Config.DisableDisplayAmmo = false -- Disable ammunition display -Config.EnablePVP = true -- Allow Player to player combat -Config.EnableWantedLevel = false -- Use Normal GTA wanted Level? - -Config.RemoveHudComponents = { - [1] = false, --WANTED_STARS, - [2] = false, --WEAPON_ICON - [3] = false, --CASH - [4] = false, --MP_CASH - [5] = false, --MP_MESSAGE - [6] = true, --VEHICLE_NAME - [7] = true, -- AREA_NAME - [8] = true, -- VEHICLE_CLASS - [9] = true, --STREET_NAME - [10] = false, --HELP_TEXT - [11] = false, --FLOATING_HELP_TEXT_1 - [12] = false, --FLOATING_HELP_TEXT_2 - [13] = false, --CASH_CHANGE - [14] = false, --RETICLE - [15] = false, --SUBTITLE_TEXT - [16] = false, --RADIO_STATIONS - [17] = false, --SAVING_GAME, - [18] = false, --GAME_STREAM - [19] = false, --WEAPON_WHEEL - [20] = false, --WEAPON_WHEEL_STATS - [21] = false, --HUD_COMPONENTS - [22] = false, --HUD_WEAPONS -} - --- Pattern string format ---1 will lead to a random number from 0-9. ---A will lead to a random letter from A-Z. --- . will lead to a random letter or number, with a 50% probability of being either. ---^1 will lead to a literal 1 being emitted. ---^A will lead to a literal A being emitted. ---Any other character will lead to said character being emitted. --- A string shorter than 8 characters will be padded on the right. -Config.CustomAIPlates = "........" -- Custom plates for AI vehicles - ---[[ - PlaceHolders: - {server_name} - Server Display Name - {server_endpoint} - Server IP:Server Port - {server_players} - Current Player Count - {server_maxplayers} - Max Player Count - - {player_name} - Player Name - {player_rp_name} - Player RP Name - {player_id} - Player ID - {player_street} - Player Street Name -]] - -Config.DiscordActivity = { - appId = 0, -- Discord Application ID, - assetName = "LargeIcon", --image name for the "large" icon. - assetText = "{server_name}", -- Text to display on the asset - buttons = { - { label = "Join Server", url = "fivem://connect/{server_endpoint}" }, - { label = "Discord", url = "https://discord.esx-framework.org" }, - }, - presence = "{player_name} [{player_id}] | {server_players}/{server_maxplayers}", - refresh = 1 * 60 * 1000, -- 1 minute -} From 157cae2ebdde4fa07aa0e725a069cb7d63611a35 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:37:55 +0000 Subject: [PATCH 02/12] feat(es_extended/server/modules): add a SettingsHandler --- .../es_extended/server/modules/settings.lua | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 [core]/es_extended/server/modules/settings.lua diff --git a/[core]/es_extended/server/modules/settings.lua b/[core]/es_extended/server/modules/settings.lua new file mode 100644 index 000000000..f3e95cc91 --- /dev/null +++ b/[core]/es_extended/server/modules/settings.lua @@ -0,0 +1,90 @@ +SettingsHandler = {} +SettingsHandler.stored = {} + +function SettingsHandler:Get(resource, key) + if not self.stored[resource] then + return nil + end + if not self.stored[resource][key] then + return nil + end + return self.stored[resource][key].value +end + +function SettingsHandler:Set(resource, key, value) + if not self.stored[resource] or not self.stored[resource][key] then + return + end + + local data = self.stored[resource][key] + if value == data.value then + return + end + + if data.dataType == "number" then + value = tonumber(value) + elseif data.dataType == "boolean" then + value = value == "true" + elseif data.dataType == "string" then + value = tostring(value) + end + + self.stored[resource][key].value = value + + TriggerEvent("es_extended:SettingChanged", resource, data.category, key, value) + TriggerClientEvent("es_extended:internal:SettingChanged", -1, resource, data.category, key, value) +end + +function SettingsHandler:RegisterSetting(resource, key, name, category, value) + if not self.stored[resource] then + self.stored[resource] = {} + end + if not self.stored[resource][key] then + self.stored[resource][key] = { + name = name, + category = category, + value = value, + dataType = type(value) + } + end +end + +function ESX.RegisterSetting(key, name, category, value) + SettingsHandler:RegisterSetting(GetInvokingResource() or "es_extended", key,name, category, value) +end + +function ESX.SetSetting(key, value) + SettingsHandler:Set(GetInvokingResource() or "es_extended", key, value) +end + +ESX.RegisterServerCallback("esx:getSettings", function(_, cb) + local settings = {} + for resource, keys in pairs(SettingsHandler.stored) do + settings[resource] = {} + for key, data in pairs(keys) do + settings[resource][key] = data.value + end + end + cb(settings) +end) + +function SettingsHandler:Load() + local file = LoadResourceFile("es_extended", "data/settings.json") + if file then + local settings = json.decode(file) + for resource, keys in pairs(settings) do + if not self.stored[resource] then + self.stored[resource] = {} + end + for key, value in pairs(keys) do + self.stored[resource][key] = value + end + end + end +end + +function SettingsHandler:Save() + SaveResourceFile("es_extended", "data/settings.json", json.encode(self.stored, { indent = true }), -1) +end + +SettingsHandler:Load() \ No newline at end of file From a87bd1b9453c2742aa383f0d8b3ea00d32abd5b8 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:38:24 +0000 Subject: [PATCH 03/12] feat(es_extended/server/modules): Add Default Settings --- .../server/modules/defaultSettings.lua | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 [core]/es_extended/server/modules/defaultSettings.lua diff --git a/[core]/es_extended/server/modules/defaultSettings.lua b/[core]/es_extended/server/modules/defaultSettings.lua new file mode 100644 index 000000000..c7be1686d --- /dev/null +++ b/[core]/es_extended/server/modules/defaultSettings.lua @@ -0,0 +1,58 @@ +ESX.RegisterSetting("HealthRegeneration", "Health Regeneration", "Adjustments", false) +ESX.RegisterSetting("VehicleRewards", "Vehicle Rewards", "Adjustments", false) +ESX.RegisterSetting("NPCDrops", "NPC Drops", "Adjustments", false) +ESX.RegisterSetting("DispatchServices", "Dispatch Services", "Adjustments", true) +ESX.RegisterSetting("Scenarios", "Scenarios", "Adjustments", true) +ESX.RegisterSetting("AimAssist", "Aim Assist", "Adjustments", false) +ESX.RegisterSetting("VehicleSeatShuff", "Seat Shuffle", "Adjustments", false) +ESX.RegisterSetting("DisplayAmmo", "Display Ammo", "Adjustments", false) +ESX.RegisterSetting("PVP", "PVP", "Adjustments", true) +ESX.RegisterSetting("WantedLevel", "Wanted Level", "Adjustments", false) +ESX.RegisterSetting("AIPlates", "AI Plate Text", "Adjustments", "........") + +ESX.RegisterSetting("HUD:1", "Wanted Stars", "HUD Components", false) +ESX.RegisterSetting("HUD:2", "Weapon Icon", "HUD Components", false) +ESX.RegisterSetting("HUD:3", "Cash", "HUD Components", false) +ESX.RegisterSetting("HUD:4", "MP Cash", "HUD Components", false) +ESX.RegisterSetting("HUD:5", "MP Message", "HUD Components", false) +ESX.RegisterSetting("HUD:6", "Vehicle Name", "HUD Components", true) +ESX.RegisterSetting("HUD:7", "Area Name", "HUD Components", true) +ESX.RegisterSetting("HUD:8", "Vehicle Class", "HUD Components", true) +ESX.RegisterSetting("HUD:9", "Street Name", "HUD Components", true) +ESX.RegisterSetting("HUD:10", "Help Text", "HUD Components", false) +ESX.RegisterSetting("HUD:11", "Floating Help Text 1", "HUD Components", false) +ESX.RegisterSetting("HUD:12", "Floating Help Text 2", "HUD Components", false) +ESX.RegisterSetting("HUD:13", "Cash Change", "HUD Components", false) +ESX.RegisterSetting("HUD:14", "Reticle", "HUD Components", false) +ESX.RegisterSetting("HUD:15", "Subtitle Text", "HUD Components", false) +ESX.RegisterSetting("HUD:16", "Radio Stations", "HUD Components", false) +ESX.RegisterSetting("HUD:17", "Saving Game", "HUD Components", false) +ESX.RegisterSetting("HUD:18", "Game Stream", "HUD Components", false) +ESX.RegisterSetting("HUD:19", "Weapon Wheel", "HUD Components", false) +ESX.RegisterSetting("HUD:20", "Weapon Wheel Stats", "HUD Components", false) +ESX.RegisterSetting("HUD:21", "HUD Components", "HUD Components", false) +ESX.RegisterSetting("HUD:22", "HUD Weapons", "HUD Components", false) + +ESX.RegisterSetting("discord:appId", "App Id", "Discord Activity", "0") +ESX.RegisterSetting("discord:assetName", "Asset Name", "Discord Activity", "LargeIcon") +ESX.RegisterSetting("discord:assetText", "Asset Text", "Discord Activity", "{server_name}") +ESX.RegisterSetting("discord:buttonsLabel:1", "Button 1 Label", "Discord Activity", "Join Server") +ESX.RegisterSetting("discord:buttonsUrl:1", "Button 1 Url", "Discord Activity", "fivem://connect/{server_endpoint}") +ESX.RegisterSetting("discord:buttonsLabel:2", "Button 2 Label", "Discord Activity", "Discord") +ESX.RegisterSetting("discord:buttonsUrl:2", "Button 2 Url", "Discord Activity", "https://discord.esx-framework.org") +ESX.RegisterSetting("discord:presence", "Presence", "Discord Activity", "{player_name} [{player_id}] | {server_players}/{server_maxplayers}") +ESX.RegisterSetting("discord:refresh", "Refresh", "Discord Activity", 60000) + +ESX.RegisterSetting("Paycheck", "Player Paycheck", "General", true) +ESX.RegisterSetting("LogPaycheck", "Paycheck Logging", "General", false) +ESX.RegisterSetting("SocietyPayouts", "Society Payouts", "General", false) +ESX.RegisterSetting("PaycheckInterval", "Paycheck Interval", "General", 7) +ESX.RegisterSetting("PayCheckMultiplier", "Off-Duty Paycheck Multiplier", "General", 0.5) +ESX.RegisterSetting("MaxWeight", "Max Weight", "General", 24) +ESX.RegisterSetting("DefaultDuty", "Default Duty", "General", false) +ESX.RegisterSetting("SaveDeath", "Save Death Status", "General", true) +ESX.RegisterSetting("LogAdmins", "Log Admins", "General", false) +ESX.RegisterSetting("UIColour", "UI Colour", "General", "#FB9B04") + + + From 1de8e838f7420091797b4a8d138d1db1bc7a91fb Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:39:11 +0000 Subject: [PATCH 04/12] feat(es_extended/server/modules/commands): add /changesetting and /checksetting --- .../es_extended/server/modules/commands.lua | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/[core]/es_extended/server/modules/commands.lua b/[core]/es_extended/server/modules/commands.lua index 628e85ea8..2e6718ea5 100644 --- a/[core]/es_extended/server/modules/commands.lua +++ b/[core]/es_extended/server/modules/commands.lua @@ -763,3 +763,42 @@ ESX.RegisterCommand( }, } ) + +ESX.RegisterCommand( + "changeSetting", + "admin", + function(_, args) + args.value = args.value:sub(2) + print(("[^2Info^0] Setting ^5%s^0 changed to ^5%s^0 for ^5%s^0 "):format(args.key, args.value, args.resource)) + SettingsHandler:Set(args.resource, args.key, args.value) + end, + true, + { + help = "Change Settings Value", + validate = false, + arguments = { + { name = "resource", help = "Resource Name", type = "string" }, + { name = "key", help = "Settings Key", type = "string" }, + { name = "value", help = TranslateCap("commandgeneric_playerid"), type = "merge" }, + }, + } +) + +ESX.RegisterCommand( + "checkSetting", + "admin", + function(_, args) + local value = SettingsHandler:Get(args.resource, args.key) + print(("[^2Info^0] Setting ^5%s^0 - ^5%s^0: ^5%s^0 "):format(args.resource, args.key, value)) + end, + true, + { + help = "Change Settings Value", + validate = true, + arguments = { + { name = "resource", help = "Resource Name", type = "string" }, + { name = "key", help = "Settings Key", type = "string" }, + }, + } +) + From 9c9ad200eff72a598fe765810d93cd8f4192a632 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:40:21 +0000 Subject: [PATCH 05/12] refactor(es_extended/shared/config/main): remove configs --- [core]/es_extended/shared/config/main.lua | 6 ------ 1 file changed, 6 deletions(-) diff --git a/[core]/es_extended/shared/config/main.lua b/[core]/es_extended/shared/config/main.lua index 108d292d6..ab381b498 100644 --- a/[core]/es_extended/shared/config/main.lua +++ b/[core]/es_extended/shared/config/main.lua @@ -39,12 +39,6 @@ Config.AdminGroups = { ["admin"] = true, } -Config.EnablePaycheck = true -- enable paycheck -Config.LogPaycheck = false -- Logs paychecks to a nominated Discord channel via webhook (default is false) -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 fe0d8e5a154ca6570342bd21711e9fdb4e61ea06 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:41:23 +0000 Subject: [PATCH 06/12] feat(es_extended/shared/functions): Add ESX.GetSetting and ESX.GetResourceSetting --- [core]/es_extended/shared/functions.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/[core]/es_extended/shared/functions.lua b/[core]/es_extended/shared/functions.lua index 184def1bd..a4158e4fd 100644 --- a/[core]/es_extended/shared/functions.lua +++ b/[core]/es_extended/shared/functions.lua @@ -33,6 +33,20 @@ function ESX.GetConfig() return Config end +function ESX.GetSetting(key) + local resource = GetInvokingResource() or "es_extended" + return ESX.GetResourceSetting(resource, key) +end + +function ESX.GetResourceSetting(resource, key) + local isServer = IsDuplicityVersion() + if isServer then + return SettingsHandler:Get(resource, key) + else + return Settings:Get(resource, key) + end +end + ---@param weaponName string ---@return number, table function ESX.GetWeapon(weaponName) From f4dfda3e0acaf2f9df54051349eb51d6b8b52462 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:42:05 +0000 Subject: [PATCH 07/12] feat(es_extended/client): Add Settings Handler --- [core]/es_extended/client/main.lua | 1 + .../es_extended/client/modules/settings.lua | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 [core]/es_extended/client/modules/settings.lua diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 441af7662..9c0fde3db 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -16,6 +16,7 @@ ESX.Game = {} ESX.Game.Utils = {} CreateThread(function() + Settings:Fetch() while not Config.Multichar do Wait(100) diff --git a/[core]/es_extended/client/modules/settings.lua b/[core]/es_extended/client/modules/settings.lua new file mode 100644 index 000000000..33f5b7138 --- /dev/null +++ b/[core]/es_extended/client/modules/settings.lua @@ -0,0 +1,20 @@ +Settings = {} +Settings.stored = {} + +function Settings:Fetch() + self.stored = ESX.AwaitServerCallback("esx:getSettings") +end + +function Settings:Get(resource, key) + return self.stored[resource][key] +end + +function Settings:Set(resource, key, value) + self.stored[resource][key] = value +end + +ESX.SecureNetEvent("es_extended:internal:SettingChanged", function(resource, category, key, value) + print("internal setting changed", resource, key, value) + Settings:Set(resource, key, value) + TriggerEvent("es_extended:settingChanged", resource, category, key, value) +end) \ No newline at end of file From 920f55727aa821e0b711373b71371c21f8b2fddf Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:43:51 +0000 Subject: [PATCH 08/12] refactor(es_extended/client/adjustments): use new settings --- .../client/modules/adjustments.lua | 298 ++++++++++-------- 1 file changed, 159 insertions(+), 139 deletions(-) diff --git a/[core]/es_extended/client/modules/adjustments.lua b/[core]/es_extended/client/modules/adjustments.lua index 00412fcbd..fc66ea986 100644 --- a/[core]/es_extended/client/modules/adjustments.lua +++ b/[core]/es_extended/client/modules/adjustments.lua @@ -1,142 +1,149 @@ Adjustments = {} +Adjustments.ChangedComponents = {} -function Adjustments:RemoveHudComponents() - for i = 1, #Config.RemoveHudComponents do - if Config.RemoveHudComponents[i] then - SetHudComponentSize(i, 0.0, 0.0) - SetHudComponentPosition(i, 900.0, 900.0) +function Adjustments:RemoveHudComponent(i) + if ESX.GetSetting(("HUD:%s"):format(i)) then + self.ChangedComponents[i] = { + size = GetHudComponentSize(i), + position = GetHudComponentPosition(i) + } + SetHudComponentSize(i, 0.0, 0.0) + SetHudComponentPosition(i, 900.0, 900.0) + else + if self.ChangedComponents[i] then + SetHudComponentSize(i, self.ChangedComponents[i].size.x, self.ChangedComponents[i].size.y) + SetHudComponentPosition(i, self.ChangedComponents[i].position.x, self.ChangedComponents[i].position.y) + self.ChangedComponents[i] = nil end end end -function Adjustments:DisableAimAssist() - if Config.DisableAimAssist then - SetPlayerTargetingMode(3) +function Adjustments:RemoveHudComponents() + for i = 1, 22 do + self:RemoveHudComponent(i) end end -function Adjustments:DisableNPCDrops() - if Config.DisableNPCDrops then - local weaponPickups = { `PICKUP_WEAPON_CARBINERIFLE`, `PICKUP_WEAPON_PISTOL`, `PICKUP_WEAPON_PUMPSHOTGUN` } - for i = 1, #weaponPickups do - ToggleUsePickupsForPlayer(ESX.playerId, weaponPickups[i], false) - end +function Adjustments:AimAssist() + if ESX.GetSetting("AimAssist") then + SetPlayerTargetingMode(0) + else + SetPlayerTargetingMode(3) end end -function Adjustments:SeatShuffle() - if Config.DisableVehicleSeatShuff then - AddEventHandler("esx:enteredVehicle", function(vehicle, _, seat) - if seat > -1 then - SetPedIntoVehicle(ESX.PlayerData.ped, vehicle, seat) - SetPedConfigFlag(ESX.PlayerData.ped, 184, true) - end - end) +function Adjustments:NPCDrops() + local weaponPickups = { `PICKUP_WEAPON_CARBINERIFLE`, `PICKUP_WEAPON_PISTOL`, `PICKUP_WEAPON_PUMPSHOTGUN` } + local enabled = ESX.GetSetting("NPCDrops") ~= nil and ESX.GetSetting("NPCDrops") or true + for i = 1, #weaponPickups do + ToggleUsePickupsForPlayer(ESX.playerId, weaponPickups[i], enabled) end end -function Adjustments:HealthRegeneration() - if Config.DisableHealthRegeneration then - SetPlayerHealthRechargeMultiplier(ESX.playerId, 0.0) +AddEventHandler("esx:enteredVehicle", function(vehicle, _, seat) + if seat > -1 and not ESX.GetSetting("VehicleSeatShuff") then + SetPedIntoVehicle(ESX.PlayerData.ped, vehicle, seat) + SetPedConfigFlag(ESX.PlayerData.ped, 184, true) end +end) + +function Adjustments:HealthRegeneration() + SetPlayerHealthRechargeMultiplier(ESX.playerId, ESX.GetSetting("HealthRegeneration") and 1.0 or 0.0) end -function Adjustments:AmmoAndVehicleRewards() - CreateThread(function() - while true do - if Config.DisableDisplayAmmo then +CreateThread(function() + while true do + local sleep = 1000 + if ESX.PlayerLoaded then + if not ESX.GetSetting("DisplayAmmo") then + sleep = 0 DisplayAmmoThisFrame(false) end - if Config.DisableVehicleRewards then + if not ESX.GetSetting("VehicleRewards") then + sleep = 0 DisablePlayerVehicleRewards(ESX.playerId) end - - Wait(0) end - end) -end -function Adjustments:EnablePvP() - if Config.EnablePVP then - SetCanAttackFriendly(ESX.PlayerData.ped, true, false) - NetworkSetFriendlyFireOption(true) + Wait(sleep) end +end) + +function Adjustments:PVP() + SetCanAttackFriendly(ESX.PlayerData.ped, ESX.GetSetting("PVP") or false, false) + NetworkSetFriendlyFireOption(ESX.GetSetting("PVP") or false) end function Adjustments:DispatchServices() - if Config.DisableDispatchServices then - for i = 1, 15 do - EnableDispatchService(i, false) - end - SetAudioFlag('PoliceScannerDisabled', true) + for i = 1, 15 do + EnableDispatchService(i, ESX.GetSetting("DispatchServices") or false) end + SetAudioFlag('PoliceScannerDisabled', ESX.GetSetting("DispatchServices") or false) end -function Adjustments:NPCScenarios() - if Config.DisableScenarios then - local scenarios = { - "WORLD_VEHICLE_ATTRACTOR", - "WORLD_VEHICLE_AMBULANCE", - "WORLD_VEHICLE_BICYCLE_BMX", - "WORLD_VEHICLE_BICYCLE_BMX_BALLAS", - "WORLD_VEHICLE_BICYCLE_BMX_FAMILY", - "WORLD_VEHICLE_BICYCLE_BMX_HARMONY", - "WORLD_VEHICLE_BICYCLE_BMX_VAGOS", - "WORLD_VEHICLE_BICYCLE_MOUNTAIN", - "WORLD_VEHICLE_BICYCLE_ROAD", - "WORLD_VEHICLE_BIKE_OFF_ROAD_RACE", - "WORLD_VEHICLE_BIKER", - "WORLD_VEHICLE_BOAT_IDLE", - "WORLD_VEHICLE_BOAT_IDLE_ALAMO", - "WORLD_VEHICLE_BOAT_IDLE_MARQUIS", - "WORLD_VEHICLE_BOAT_IDLE_MARQUIS", - "WORLD_VEHICLE_BROKEN_DOWN", - "WORLD_VEHICLE_BUSINESSMEN", - "WORLD_VEHICLE_HELI_LIFEGUARD", - "WORLD_VEHICLE_CLUCKIN_BELL_TRAILER", - "WORLD_VEHICLE_CONSTRUCTION_SOLO", - "WORLD_VEHICLE_CONSTRUCTION_PASSENGERS", - "WORLD_VEHICLE_DRIVE_PASSENGERS", - "WORLD_VEHICLE_DRIVE_PASSENGERS_LIMITED", - "WORLD_VEHICLE_DRIVE_SOLO", - "WORLD_VEHICLE_FIRE_TRUCK", - "WORLD_VEHICLE_EMPTY", - "WORLD_VEHICLE_MARIACHI", - "WORLD_VEHICLE_MECHANIC", - "WORLD_VEHICLE_MILITARY_PLANES_BIG", - "WORLD_VEHICLE_MILITARY_PLANES_SMALL", - "WORLD_VEHICLE_PARK_PARALLEL", - "WORLD_VEHICLE_PARK_PERPENDICULAR_NOSE_IN", - "WORLD_VEHICLE_PASSENGER_EXIT", - "WORLD_VEHICLE_POLICE_BIKE", - "WORLD_VEHICLE_POLICE_CAR", - "WORLD_VEHICLE_POLICE", - "WORLD_VEHICLE_POLICE_NEXT_TO_CAR", - "WORLD_VEHICLE_QUARRY", - "WORLD_VEHICLE_SALTON", - "WORLD_VEHICLE_SALTON_DIRT_BIKE", - "WORLD_VEHICLE_SECURITY_CAR", - "WORLD_VEHICLE_STREETRACE", - "WORLD_VEHICLE_TOURBUS", - "WORLD_VEHICLE_TOURIST", - "WORLD_VEHICLE_TANDL", - "WORLD_VEHICLE_TRACTOR", - "WORLD_VEHICLE_TRACTOR_BEACH", - "WORLD_VEHICLE_TRUCK_LOGS", - "WORLD_VEHICLE_TRUCKS_TRAILERS", - "WORLD_VEHICLE_DISTANT_EMPTY_GROUND", - "WORLD_HUMAN_PAPARAZZI", - } +function Adjustments:Scenarios() + local scenarios = { + "WORLD_VEHICLE_ATTRACTOR", + "WORLD_VEHICLE_AMBULANCE", + "WORLD_VEHICLE_BICYCLE_BMX", + "WORLD_VEHICLE_BICYCLE_BMX_BALLAS", + "WORLD_VEHICLE_BICYCLE_BMX_FAMILY", + "WORLD_VEHICLE_BICYCLE_BMX_HARMONY", + "WORLD_VEHICLE_BICYCLE_BMX_VAGOS", + "WORLD_VEHICLE_BICYCLE_MOUNTAIN", + "WORLD_VEHICLE_BICYCLE_ROAD", + "WORLD_VEHICLE_BIKE_OFF_ROAD_RACE", + "WORLD_VEHICLE_BIKER", + "WORLD_VEHICLE_BOAT_IDLE", + "WORLD_VEHICLE_BOAT_IDLE_ALAMO", + "WORLD_VEHICLE_BOAT_IDLE_MARQUIS", + "WORLD_VEHICLE_BOAT_IDLE_MARQUIS", + "WORLD_VEHICLE_BROKEN_DOWN", + "WORLD_VEHICLE_BUSINESSMEN", + "WORLD_VEHICLE_HELI_LIFEGUARD", + "WORLD_VEHICLE_CLUCKIN_BELL_TRAILER", + "WORLD_VEHICLE_CONSTRUCTION_SOLO", + "WORLD_VEHICLE_CONSTRUCTION_PASSENGERS", + "WORLD_VEHICLE_DRIVE_PASSENGERS", + "WORLD_VEHICLE_DRIVE_PASSENGERS_LIMITED", + "WORLD_VEHICLE_DRIVE_SOLO", + "WORLD_VEHICLE_FIRE_TRUCK", + "WORLD_VEHICLE_EMPTY", + "WORLD_VEHICLE_MARIACHI", + "WORLD_VEHICLE_MECHANIC", + "WORLD_VEHICLE_MILITARY_PLANES_BIG", + "WORLD_VEHICLE_MILITARY_PLANES_SMALL", + "WORLD_VEHICLE_PARK_PARALLEL", + "WORLD_VEHICLE_PARK_PERPENDICULAR_NOSE_IN", + "WORLD_VEHICLE_PASSENGER_EXIT", + "WORLD_VEHICLE_POLICE_BIKE", + "WORLD_VEHICLE_POLICE_CAR", + "WORLD_VEHICLE_POLICE", + "WORLD_VEHICLE_POLICE_NEXT_TO_CAR", + "WORLD_VEHICLE_QUARRY", + "WORLD_VEHICLE_SALTON", + "WORLD_VEHICLE_SALTON_DIRT_BIKE", + "WORLD_VEHICLE_SECURITY_CAR", + "WORLD_VEHICLE_STREETRACE", + "WORLD_VEHICLE_TOURBUS", + "WORLD_VEHICLE_TOURIST", + "WORLD_VEHICLE_TANDL", + "WORLD_VEHICLE_TRACTOR", + "WORLD_VEHICLE_TRACTOR_BEACH", + "WORLD_VEHICLE_TRUCK_LOGS", + "WORLD_VEHICLE_TRUCKS_TRAILERS", + "WORLD_VEHICLE_DISTANT_EMPTY_GROUND", + "WORLD_HUMAN_PAPARAZZI", + } - for i=1, #scenarios do - SetScenarioTypeEnabled(scenarios[i], false) - end + for i = 1, #scenarios do + SetScenarioTypeEnabled(scenarios[i], ESX.GetSetting("Scenarios") or false) end end -function Adjustments:LicensePlates() - SetDefaultVehicleNumberPlateTextPattern(-1, Config.CustomAIPlates) +function Adjustments:AIPlates() + SetDefaultVehicleNumberPlateTextPattern(-1, ESX.GetSetting("AIPlates") or ".......") end local placeHolders = { @@ -171,7 +178,7 @@ local placeHolders = { end, } -function Adjustments:PresencePlaceholders() +function Adjustments:PresencePlaceholders(string) local presence = Config.DiscordActivity.presence for placeholder, cb in pairs(placeHolders) do @@ -189,54 +196,67 @@ function Adjustments:PresencePlaceholders() return presence end -function Adjustments:DiscordPresence() - if Config.DiscordActivity.appId ~= 0 then - CreateThread(function() - while true do - SetDiscordAppId(Config.DiscordActivity.appId) - SetDiscordRichPresenceAsset(Config.DiscordActivity.assetName) - SetDiscordRichPresenceAssetText(Config.DiscordActivity.assetText) - - for i = 1, #Config.DiscordActivity.buttons do - local button = Config.DiscordActivity.buttons[i] - SetDiscordRichPresenceAction(i - 1, button.label, button.url) - end - - SetRichPresence(self:PresencePlaceholders()) - Wait(Config.DiscordActivity.refresh) +CreateThread(function() + while true do + if ESX.PlayerLoaded then + local appId = ESX.GetSetting("discord:appId") or "0" + if appId and appId ~= "0" then + SetDiscordAppId(appId) + SetDiscordRichPresenceAsset(ESX.GetSetting("discord:assetName") or "") + SetDiscordRichPresenceAssetText(Adjustments:PresencePlaceholders(ESX.GetSetting("discord:assetText") or "")) + + SetDiscordRichPresenceAction(0, ESX.GetSetting("discord:buttonsLabel:1") or "", ESX.GetSetting("discord:buttonsUrl:1")or "") + SetDiscordRichPresenceAction(1, ESX.GetSetting("discord:buttonsLabel:2") or "", ESX.GetSetting("discord:buttonsUrl:2") or "") + + SetRichPresence(Adjustments:PresencePlaceholders(ESX.GetSetting("presence") or "")) end - end) + end + Wait(ESX.PlayerLoaded and ESX.GetSetting("discord:refresh") or 60000) end -end +end) function Adjustments:WantedLevel() - if not Config.EnableWantedLevel then - ClearPlayerWantedLevel(ESX.playerId) + local setting = ESX.GetSetting("WantedLevel") + ClearPlayerWantedLevel(ESX.playerId) + print("Wanted Level is currently", setting, type(setting)) + if setting then + SetMaxWantedLevel(5) + else SetMaxWantedLevel(0) 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) +AddEventHandler("esx:enteredVehicle", function(vehicle) + if ESX.GetSetting("HUD:16") then + SetVehRadioStation(vehicle, "OFF") + SetUserRadioControlEnabled(false) end -end +end) function Adjustments:Load() self:RemoveHudComponents() - self:DisableAimAssist() - self:DisableNPCDrops() - self:SeatShuffle() + self:AimAssist() + self:NPCDrops() self:HealthRegeneration() - self:AmmoAndVehicleRewards() - self:EnablePvP() + self:PVP() self:DispatchServices() - self:NPCScenarios() - self:LicensePlates() - self:DiscordPresence() + self:Scenarios() + self:AIPlates() self:WantedLevel() - self:DisableRadio() end + +AddEventHandler("es_extended:settingChanged", function(resource, category, key, value) + if resource ~= "es_extended" then + return + end + if category == "Adjustments" then + if Adjustments[key] then + Adjustments[key](Adjustments) + else + Adjustments:Load() + end + elseif category == "HUD Components" then + key = key:gsub("HUD:", "") + Adjustments:RemoveHudComponent(tonumber(key)) + end +end) From c1357908ab288295ae2fdb0f2e2d4d69d9f59d72 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:45:01 +0000 Subject: [PATCH 09/12] feat(es_extended/fxmanifest): add new settings files --- [core]/es_extended/fxmanifest.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/[core]/es_extended/fxmanifest.lua b/[core]/es_extended/fxmanifest.lua index 5bcca0968..157a9327e 100644 --- a/[core]/es_extended/fxmanifest.lua +++ b/[core]/es_extended/fxmanifest.lua @@ -10,7 +10,6 @@ shared_scripts { 'shared/config/main.lua', 'shared/config/weapons.lua', - 'shared/config/adjustments.lua', 'shared/main.lua', 'shared/functions.lua', @@ -23,6 +22,8 @@ server_scripts { 'server/common.lua', 'server/modules/callback.lua', + 'server/modules/settings.lua', + 'server/modules/defaultSettings.lua', 'server/classes/player.lua', 'server/classes/vehicle.lua', 'server/classes/overrides/*.lua', @@ -41,6 +42,7 @@ server_scripts { client_scripts { 'client/main.lua', 'client/functions.lua', + 'client/modules/settings.lua', 'client/modules/wrapper.lua', 'client/modules/callback.lua', 'client/modules/adjustments.lua', From e61418eb745419d6c3e1340d1bc547e90b99a817 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:49:33 +0000 Subject: [PATCH 10/12] feat(es_extended): add Settings storage --- [core]/es_extended/data/settings.json | 300 ++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 [core]/es_extended/data/settings.json diff --git a/[core]/es_extended/data/settings.json b/[core]/es_extended/data/settings.json new file mode 100644 index 000000000..1409e6295 --- /dev/null +++ b/[core]/es_extended/data/settings.json @@ -0,0 +1,300 @@ +{ + "es_extended": { + "HUD:10": { + "name": "Help Text", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "HUD:22": { + "name": "HUD Weapons", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "HUD:17": { + "name": "Saving Game", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "LogAdmins": { + "name": "Log Admins", + "value": false, + "dataType": "boolean", + "category": "General" + }, + "discord:appId": { + "name": "App Id", + "value": "0", + "dataType": "string", + "category": "Discord Activity" + }, + "PaycheckInterval": { + "name": "Paycheck Interval", + "value": 7, + "dataType": "number", + "category": "General" + }, + "AIPlates": { + "name": "AI Plate Text", + "value": "........", + "dataType": "string", + "category": "Adjustments" + }, + "Paycheck": { + "name": "Player Paycheck", + "value": true, + "dataType": "boolean", + "category": "General" + }, + "HUD:1": { + "name": "Wanted Stars", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "NPCDrops": { + "name": "NPC Drops", + "value": false, + "category": "Adjustments" + }, + "HUD:21": { + "name": "HUD Components", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "discord:assetName": { + "name": "Asset Name", + "value": "LargeIcon", + "dataType": "string", + "category": "Discord Activity" + }, + "discord:presence": { + "name": "Presence", + "value": "{player_name} [{player_id}] | {server_players}/{server_maxplayers}", + "dataType": "string", + "category": "Discord Activity" + }, + "HUD:16": { + "name": "Radio Stations", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "SocietyPayouts": { + "name": "Society Payouts", + "value": false, + "dataType": "boolean", + "category": "General" + }, + "DisplayAmmo": { + "name": "Display Ammo", + "value": false, + "category": "Adjustments" + }, + "HUD:20": { + "name": "Weapon Wheel Stats", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "discord:buttonsUrl:2": { + "name": "Button 2 Url", + "value": "https://discord.esx-framework.org", + "dataType": "string", + "category": "Discord Activity" + }, + "SaveDeath": { + "name": "Save Death Status", + "value": true, + "dataType": "boolean", + "category": "General" + }, + "HUD:2": { + "name": "Weapon Icon", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "discord:buttonsLabel:1": { + "name": "Button 1 Label", + "value": "Join Server", + "dataType": "string", + "category": "Discord Activity" + }, + "LogPaycheck": { + "name": "Paycheck Logging", + "value": false, + "dataType": "boolean", + "category": "General" + }, + "HUD:6": { + "name": "Vehicle Name", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "HUD:18": { + "name": "Game Stream", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "discord:refresh": { + "name": "Refresh", + "value": 60000, + "dataType": "number", + "category": "Discord Activity" + }, + "discord:assetText": { + "name": "Asset Text", + "value": "{server_name}", + "dataType": "string", + "category": "Discord Activity" + }, + "HUD:8": { + "name": "Vehicle Class", + "value": true, + "dataType": "boolean", + "category": "HUD Components" + }, + "discord:buttonsLabel:2": { + "name": "Button 2 Label", + "value": "Discord", + "dataType": "string", + "category": "Discord Activity" + }, + "Scenarios": { + "name": "Scenarios", + "value": true, + "category": "Adjustments" + }, + "MaxWeight": { + "name": "Max Weight", + "value": 24, + "dataType": "number", + "category": "General" + }, + "HUD:9": { + "name": "Street Name", + "value": true, + "dataType": "boolean", + "category": "HUD Components" + }, + "HUD:19": { + "name": "Weapon Wheel", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "DispatchServices": { + "name": "Dispatch Services", + "value": true, + "category": "Adjustments" + }, + "AimAssist": { + "name": "Aim Assist", + "value": true, + "category": "Adjustments" + }, + "HUD:4": { + "name": "MP Cash", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "HUD:15": { + "name": "Subtitle Text", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "PayCheckMultiplier": { + "name": "Off-Duty Paycheck Multiplier", + "value": 0.5, + "dataType": "number", + "category": "General" + }, + "HUD:13": { + "name": "Cash Change", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "VehicleSeatShuff": { + "name": "Seat Shuffle", + "value": false, + "category": "Adjustments" + }, + "HealthRegeneration": { + "name": "Health Regeneration", + "value": false, + "category": "Adjustments" + }, + "HUD:7": { + "name": "Area Name", + "value": true, + "dataType": "boolean", + "category": "HUD Components" + }, + "HUD:12": { + "name": "Floating Help Text 2", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "WantedLevel": { + "name": "Wanted Level", + "value": false, + "category": "Adjustments" + }, + "HUD:3": { + "name": "Cash", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "HUD:14": { + "name": "Reticle", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "PVP": { + "name": "PVP", + "value": true, + "category": "Adjustments" + }, + "VehicleRewards": { + "name": "Vehicle Rewards", + "value": false, + "category": "Adjustments" + }, + "HUD:11": { + "name": "Floating Help Text 1", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "DefaultDuty": { + "name": "Default Duty", + "value": true, + "dataType": "boolean", + "category": "General" + }, + "HUD:5": { + "name": "MP Message", + "value": false, + "dataType": "boolean", + "category": "HUD Components" + }, + "discord:buttonsUrl:1": { + "name": "Button 1 Url", + "value": "fivem://connect/{server_endpoint}", + "dataType": "string", + "category": "Discord Activity" + } + } +} From 707431f42b3154a515481b8458f2e8e08d3d6299 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 14:50:58 +0000 Subject: [PATCH 11/12] tweak(es_extended/shared/config/main): remove more configs --- [core]/es_extended/shared/config/main.lua | 4 ---- 1 file changed, 4 deletions(-) diff --git a/[core]/es_extended/shared/config/main.lua b/[core]/es_extended/shared/config/main.lua index ab381b498..3c2e3b895 100644 --- a/[core]/es_extended/shared/config/main.lua +++ b/[core]/es_extended/shared/config/main.lua @@ -41,14 +41,10 @@ Config.AdminGroups = { Config.EnableDebug = false -- Use Debug options? -Config.DefaultJobDuty = true -- A players default duty status when changing jobs -Config.OffDutyPaycheckMultiplier = 0.5 -- The multiplier for off duty paychecks. 0.5 = 50% of the on duty paycheck - Config.Multichar = GetResourceState("esx_multicharacter") ~= "missing" Config.Identity = true -- Select a character identity data before they have loaded in (this happens by default with multichar) Config.DistanceGive = 4.0 -- Max distance when giving items, weapons etc. -Config.AdminLogging = false -- Logs the usage of certain commands by those with group.admin ace permissions (default is false) ------------------------------------- -- DO NOT CHANGE BELOW THIS LINE !!! From afd5080aceb3dec3518b4c4d17cc9ac16051f96a Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Mon, 10 Feb 2025 15:16:55 +0000 Subject: [PATCH 12/12] tweak(es_extended): add Settings annotations --- [core]/es_extended/client/modules/settings.lua | 3 +-- [core]/es_extended/server/modules/settings.lua | 10 +++++++++- [core]/es_extended/shared/functions.lua | 5 +++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/[core]/es_extended/client/modules/settings.lua b/[core]/es_extended/client/modules/settings.lua index 33f5b7138..cda3e22f8 100644 --- a/[core]/es_extended/client/modules/settings.lua +++ b/[core]/es_extended/client/modules/settings.lua @@ -14,7 +14,6 @@ function Settings:Set(resource, key, value) end ESX.SecureNetEvent("es_extended:internal:SettingChanged", function(resource, category, key, value) - print("internal setting changed", resource, key, value) Settings:Set(resource, key, value) TriggerEvent("es_extended:settingChanged", resource, category, key, value) -end) \ No newline at end of file +end) diff --git a/[core]/es_extended/server/modules/settings.lua b/[core]/es_extended/server/modules/settings.lua index f3e95cc91..c39e32f9e 100644 --- a/[core]/es_extended/server/modules/settings.lua +++ b/[core]/es_extended/server/modules/settings.lua @@ -49,10 +49,18 @@ function SettingsHandler:RegisterSetting(resource, key, name, category, value) end end +---@param key string +---@param name string +---@param category string +---@param value any +---@return nil function ESX.RegisterSetting(key, name, category, value) SettingsHandler:RegisterSetting(GetInvokingResource() or "es_extended", key,name, category, value) end +---@param key string +---@param value any +---@return nil function ESX.SetSetting(key, value) SettingsHandler:Set(GetInvokingResource() or "es_extended", key, value) end @@ -87,4 +95,4 @@ function SettingsHandler:Save() SaveResourceFile("es_extended", "data/settings.json", json.encode(self.stored, { indent = true }), -1) end -SettingsHandler:Load() \ No newline at end of file +SettingsHandler:Load() diff --git a/[core]/es_extended/shared/functions.lua b/[core]/es_extended/shared/functions.lua index a4158e4fd..5f94f9f91 100644 --- a/[core]/es_extended/shared/functions.lua +++ b/[core]/es_extended/shared/functions.lua @@ -33,11 +33,16 @@ function ESX.GetConfig() return Config end +---@param key string +---@return any function ESX.GetSetting(key) local resource = GetInvokingResource() or "es_extended" return ESX.GetResourceSetting(resource, key) end +---@param resource string +---@param key string +---@return any function ESX.GetResourceSetting(resource, key) local isServer = IsDuplicityVersion() if isServer then