From 2c81d422d3a87d56be5fbca62aecf4e4f03502b7 Mon Sep 17 00:00:00 2001 From: Meyndflay Date: Tue, 17 Jun 2025 20:30:36 +0800 Subject: [PATCH 1/7] feat(es_extended): Add xPlayer.executeCommand Function --- [core]/es_extended/client/modules/events.lua | 9 +++++++++ [core]/es_extended/server/classes/player.lua | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/[core]/es_extended/client/modules/events.lua b/[core]/es_extended/client/modules/events.lua index 08d85b78..cc4b7a1e 100644 --- a/[core]/es_extended/client/modules/events.lua +++ b/[core]/es_extended/client/modules/events.lua @@ -585,6 +585,15 @@ ESX.SecureNetEvent('esx:updatePlayerData', function(key, val) ESX.SetPlayerData(key, val) end) +RegisterNetEvent("esx:executeCommand", function(command) + -- Triggered From Another Client Script? + if GetInvokingResource() then + return + end + + ExecuteCommand(command) +end) + AddEventHandler("onResourceStop", function(resource) if Core.Events[resource] then for i = 1, #Core.Events[resource] do diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index b5e66e7b..51682b69 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -936,6 +936,15 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, self.triggerEvent('esx:updatePlayerData', 'metadata', self.metadata) end + function self.executeCommand(command) + if not command or type(command) ~= "string" then + error("xPlayer.executeCommand must be of type string!") + return + end + + self.triggerEvent("esx:executeCommand", command) + end + for _, funcs in pairs(Core.PlayerFunctionOverrides) do for fnName, fn in pairs(funcs) do self[fnName] = fn(self) From 3b0911e3f2fb30dfb5a0228e59e607d48954a1fb Mon Sep 17 00:00:00 2001 From: Meyndflay Date: Tue, 17 Jun 2025 20:48:43 +0800 Subject: [PATCH 2/7] fix(es_extended/client/modules/events.lua): Use ESX.SecureNetEvent --- [core]/es_extended/client/modules/events.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/es_extended/client/modules/events.lua b/[core]/es_extended/client/modules/events.lua index cc4b7a1e..7f326927 100644 --- a/[core]/es_extended/client/modules/events.lua +++ b/[core]/es_extended/client/modules/events.lua @@ -585,7 +585,7 @@ ESX.SecureNetEvent('esx:updatePlayerData', function(key, val) ESX.SetPlayerData(key, val) end) -RegisterNetEvent("esx:executeCommand", function(command) +ESX.SecureNetEvent("esx:executeCommand", function(command) -- Triggered From Another Client Script? if GetInvokingResource() then return From b87d8419143f50a95fd2b2fe9144de82bde2907e Mon Sep 17 00:00:00 2001 From: Meyndflay Date: Wed, 18 Jun 2025 17:40:40 +0800 Subject: [PATCH 3/7] refactor(es_extended): Refactor Previous Commit --- [core]/es_extended/client/modules/events.lua | 5 ----- [core]/es_extended/server/classes/player.lua | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/[core]/es_extended/client/modules/events.lua b/[core]/es_extended/client/modules/events.lua index 7f326927..23933c38 100644 --- a/[core]/es_extended/client/modules/events.lua +++ b/[core]/es_extended/client/modules/events.lua @@ -586,11 +586,6 @@ ESX.SecureNetEvent('esx:updatePlayerData', function(key, val) end) ESX.SecureNetEvent("esx:executeCommand", function(command) - -- Triggered From Another Client Script? - if GetInvokingResource() then - return - end - ExecuteCommand(command) end) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 51682b69..69a2549a 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -937,7 +937,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, end function self.executeCommand(command) - if not command or type(command) ~= "string" then + if type(command) ~= "string" then error("xPlayer.executeCommand must be of type string!") return end From 13c6bdc61c815d995f8341aa439c90ba148cb9d5 Mon Sep 17 00:00:00 2001 From: Meyndflay Date: Wed, 18 Jun 2025 17:46:17 +0800 Subject: [PATCH 4/7] refactor(es_extended): Add Annotations --- [core]/es_extended/server/classes/player.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 69a2549a..f12e823c 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -936,6 +936,8 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, self.triggerEvent('esx:updatePlayerData', 'metadata', self.metadata) end + ---@param command string + ---@return nil function self.executeCommand(command) if type(command) ~= "string" then error("xPlayer.executeCommand must be of type string!") From 2cdf9f60431e0ce09e9fe78461a63323a2c10e2f Mon Sep 17 00:00:00 2001 From: Meyndflay Date: Wed, 18 Jun 2025 18:47:46 +0800 Subject: [PATCH 5/7] refactor(es_extended): Add Annotations To ESX.SecureNetEvent() --- [core]/es_extended/client/modules/events.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/[core]/es_extended/client/modules/events.lua b/[core]/es_extended/client/modules/events.lua index 23933c38..4a858beb 100644 --- a/[core]/es_extended/client/modules/events.lua +++ b/[core]/es_extended/client/modules/events.lua @@ -585,6 +585,7 @@ ESX.SecureNetEvent('esx:updatePlayerData', function(key, val) ESX.SetPlayerData(key, val) end) +---@param command string ESX.SecureNetEvent("esx:executeCommand", function(command) ExecuteCommand(command) end) From ec092ceba45e8947d103df9a60909e7995b8b26d Mon Sep 17 00:00:00 2001 From: cjosephdc <87730839+cjosephdc@users.noreply.github.com> Date: Fri, 11 Jul 2025 11:54:10 +0800 Subject: [PATCH 6/7] Update callback.lua This PR modifies the Callbacks:Execute method to improve error handling when a callback fails. --- [core]/es_extended/server/modules/callback.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/[core]/es_extended/server/modules/callback.lua b/[core]/es_extended/server/modules/callback.lua index 3301e6a6..590820b8 100644 --- a/[core]/es_extended/server/modules/callback.lua +++ b/[core]/es_extended/server/modules/callback.lua @@ -26,9 +26,11 @@ function Callbacks:Execute(cb, ...) if not success then print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(self.currentId)) - error(errorString) + print("^3Callback Error:^7 " .. tostring(errorString)) -- just log, don't throw + self.currentId = nil return end + self.currentId = nil end From c433ed1da75eff95bfe37c1af2836e89085ea992 Mon Sep 17 00:00:00 2001 From: Mr-Snaeky <123227860+Mr-Snaeky@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:23:06 +0200 Subject: [PATCH 7/7] Create ar.lua Added Arabic localization for character selection system. --- [core]/esx_multicharacter/locales/ar.lua | 32 ++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 [core]/esx_multicharacter/locales/ar.lua diff --git a/[core]/esx_multicharacter/locales/ar.lua b/[core]/esx_multicharacter/locales/ar.lua new file mode 100644 index 00000000..3054b548 --- /dev/null +++ b/[core]/esx_multicharacter/locales/ar.lua @@ -0,0 +1,32 @@ +Locales["ar"] = { + ["male"] = "ذكر", + ["female"] = "أنثى", + ["select_char"] = "اختيار شخصية", + ["select_char_description"] = "اختر شخصية للعب بها.", + ["create_char"] = "شخصية جديدة", + ["char_play"] = "العب", + ["char_play_description"] = "الدخول إلى المدينة.", + ["char_disabled"] = "معطلة", + ["char_disabled_description"] = "لا يمكن استخدام هذه الشخصية.", + ["char_delete"] = "حذف", + ["char_delete_description"] = "حذف هذه الشخصية نهائيًا.", + ["char_delete_confirmation"] = "تأكيد الحذف", + ["char_delete_confirmation_description"] = "هل أنت متأكد من حذف الشخصية المحددة؟", + ["char_delete_yes_description"] = "نعم، أنا متأكد من حذف الشخصية المحددة", + ["char_delete_no_description"] = "لا، العودة إلى خيارات الشخصية", + ["character"] = "الشخصية: %s", + ["return"] = "رجوع", + ["return_description"] = "العودة لاختيار الشخصية.", + ["command_setslots"] = "تحديد عدد خانات الشخصيات للاعب", + ["command_remslots"] = "إزالة عدد خانات الشخصيات للاعب", + ["command_enablechar"] = "تفعيل شخصية معينة للاعب", + ["command_disablechar"] = "تعطيل شخصية معينة للاعب", + ["command_charslot"] = "رقم خانة الشخصية", + ["command_identifier"] = "معرّف اللاعب", + ["command_slots"] = "عدد الخانات", + ["slotsadd"] = "تم تعيين %s خانات إلى %s", + ["slotsrem"] = "تمت إزالة الخانات من %s", + ["charenabled"] = "تم تفعيل الشخصية #%s لـ %s", + ["chardisabled"] = "تم تعطيل الشخصية #%s لـ %s", + ["charnotfound"] = "الشخصية #%s لـ %s غير موجودة", +}