diff --git a/[core]/cron/README.md b/[core]/cron/README.md index df2e5eeb9..8ecd4386c 100644 --- a/[core]/cron/README.md +++ b/[core]/cron/README.md @@ -1,4 +1,4 @@ -

[ESX] Cron

Discord - Website - Documentation +

[ESX] Cron

Discord - Website - Documentation A simple, but vital, resource that allows resources to Run tasks at specific intervals. diff --git a/[core]/es_extended/README.md b/[core]/es_extended/README.md index 32ae43b86..f02b5f71e 100644 --- a/[core]/es_extended/README.md +++ b/[core]/es_extended/README.md @@ -1,13 +1,13 @@ -

es_extended

Discord - Documentation - -## Legal - -es_extended - -Copyright (C) 2015-2024 Jérémie N'gadi - -This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. - -This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details. - -You should have received a copy Of the GNU General Public License along with this program. If Not, see . +

es_extended

Discord - Documentation + +## Legal + +es_extended + +Copyright (C) 2015-2024 Jérémie N'gadi + +This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. + +This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details. + +You should have received a copy Of the GNU General Public License along with this program. If Not, see . diff --git a/[core]/es_extended/client/modules/scaleform.lua b/[core]/es_extended/client/modules/scaleform.lua index 31d0897e9..66479685c 100644 --- a/[core]/es_extended/client/modules/scaleform.lua +++ b/[core]/es_extended/client/modules/scaleform.lua @@ -2,7 +2,12 @@ ESX.Scaleform = {} ESX.Scaleform.Utils = {} function ESX.Scaleform.ShowFreemodeMessage(title, msg, sec) - local scaleform = ESX.Scaleform.Utils.RunMethod("MP_BIG_MESSAGE_FREEMODE", "SHOW_SHARD_WASTED_MP_MESSAGE", false, title, msg) + local scaleform = ESX.Scaleform.Utils.RequestScaleformMovie("MP_BIG_MESSAGE_FREEMODE") + + BeginScaleformMovieMethod(scaleform, "SHOW_SHARD_WASTED_MP_MESSAGE") + ScaleformMovieMethodAddParamTextureNameString(title) + ScaleformMovieMethodAddParamTextureNameString(msg) + EndScaleformMovieMethod() while sec > 0 do Wait(0) @@ -15,9 +20,25 @@ function ESX.Scaleform.ShowFreemodeMessage(title, msg, sec) end function ESX.Scaleform.ShowBreakingNews(title, msg, bottom, sec) - local scaleform = ESX.Scaleform.Utils.RunMethod("BREAKING_NEWS", "SET_TEXT", false, msg, bottom) - ESX.Scaleform.Utils.RunMethod(scaleform, "SET_SCROLL_TEXT", false, 0, 0, title) - ESX.Scaleform.Utils.RunMethod(scaleform, "DISPLAY_SCROLL_TEXT", false, 0, 0) + local scaleform = ESX.Scaleform.Utils.RequestScaleformMovie("BREAKING_NEWS") + + BeginScaleformMovieMethod(scaleform, "SET_TEXT") + ScaleformMovieMethodAddParamTextureNameString(msg) + ScaleformMovieMethodAddParamTextureNameString(bottom) + EndScaleformMovieMethod() + + BeginScaleformMovieMethod(scaleform, "SET_SCROLL_TEXT") + ScaleformMovieMethodAddParamInt(0) -- top ticker + ScaleformMovieMethodAddParamInt(0) -- Since this is the first string, start at 0 + ScaleformMovieMethodAddParamTextureNameString(title) + + EndScaleformMovieMethod() + + BeginScaleformMovieMethod(scaleform, "DISPLAY_SCROLL_TEXT") + ScaleformMovieMethodAddParamInt(0) -- Top ticker + ScaleformMovieMethodAddParamInt(0) -- Index of string + + EndScaleformMovieMethod() while sec > 0 do Wait(0) @@ -30,7 +51,17 @@ function ESX.Scaleform.ShowBreakingNews(title, msg, bottom, sec) end function ESX.Scaleform.ShowPopupWarning(title, msg, bottom, sec) - local scaleform = ESX.Scaleform.Utils.RunMethod("POPUP_WARNING", "SHOW_POPUP_WARNING", false, 500.0, title, msg, bottom, true) + local scaleform = ESX.Scaleform.Utils.RequestScaleformMovie("POPUP_WARNING") + + BeginScaleformMovieMethod(scaleform, "SHOW_POPUP_WARNING") + + ScaleformMovieMethodAddParamFloat(500.0) -- black background + ScaleformMovieMethodAddParamTextureNameString(title) + ScaleformMovieMethodAddParamTextureNameString(msg) + ScaleformMovieMethodAddParamTextureNameString(bottom) + ScaleformMovieMethodAddParamBool(true) + + EndScaleformMovieMethod() while sec > 0 do Wait(0) @@ -43,7 +74,11 @@ function ESX.Scaleform.ShowPopupWarning(title, msg, bottom, sec) end function ESX.Scaleform.ShowTrafficMovie(sec) - local scaleform = ESX.Scaleform.Utils.RunMethod("TRAFFIC_CAM", "PLAY_CAM_MOVIE", false) + local scaleform = ESX.Scaleform.Utils.RequestScaleformMovie("TRAFFIC_CAM") + + BeginScaleformMovieMethod(scaleform, "PLAY_CAM_MOVIE") + + EndScaleformMovieMethod() while sec > 0 do Wait(0) @@ -64,40 +99,3 @@ function ESX.Scaleform.Utils.RequestScaleformMovie(movie) return scaleform end - ---- Executes a method on a scaleform movie with optional arguments and return value. ---- The caller is responsible for disposing of the scaleform using `SetScaleformMovieAsNoLongerNeeded`. ----@param scaleform number|string # Scaleform handle or name to request the scaleform movie ----@param methodName string # The method name to call on the scaleform ----@param returnValue? boolean # Whether to return the value from the method ----@param ... number|string|boolean # Arguments to pass to the method ----@return number, number? # The scaleform handle, and the return value if `returnValue` is true -function ESX.Scaleform.Utils.RunMethod(scaleform, methodName, returnValue, ...) - scaleform = type(scaleform) == "number" and scaleform or ESX.Scaleform.Utils.RequestScaleformMovie(scaleform) - BeginScaleformMovieMethod(scaleform, methodName) - - local args = { ... } - for i, arg in ipairs(args) do - local typeArg = type(arg) - - if typeArg == "number" then - if math.type(arg) == "float" then - ScaleformMovieMethodAddParamFloat(arg) - else - ScaleformMovieMethodAddParamInt(arg) - end - elseif typeArg == "string" then - ScaleformMovieMethodAddParamTextureNameString(arg) - elseif typeArg == "boolean" then - ScaleformMovieMethodAddParamBool(arg) - end - end - - if returnValue then - return scaleform, EndScaleformMovieMethodReturnValue() - end - - EndScaleformMovieMethod() - - return scaleform -end diff --git a/[core]/es_extended/imports.lua b/[core]/es_extended/imports.lua index 719d06237..6d6a862e1 100644 --- a/[core]/es_extended/imports.lua +++ b/[core]/es_extended/imports.lua @@ -1,5 +1,5 @@ ESX = exports["es_extended"]:getSharedObject() -ESX.currentResourceName = GetCurrentResourceName() +_resourceName = GetCurrentResourceName() OnPlayerData = function (key, val, last) end @@ -44,188 +44,67 @@ if not IsDuplicityVersion() then -- Only register this event for the client end end -if GetResourceState("ox_lib") == "missing" then - ---@Credits: https://github.com/overextended/ox_lib/blob/master/imports/require/shared.lua - Licensed under the GNU Lesser General Public License v3.0 - local loaded = {} - local _require = require - - package = { - path = './?.lua;./?/init.lua', - preload = {}, - loaded = setmetatable({}, { - __index = loaded, - __newindex = function() end, - __metatable = false, - }) - } - - ---@param modName string - ---@return string - ---@return string - local function getModuleInfo(modName) - local resource = modName:match('^@(.-)/.+') --[[@as string?]] +if not lib?.require then + local cachedModules = {} ---@type table + local loadingModules = {} ---@type table - if resource then - return resource, modName:sub(#resource + 3) + ---@param modulePath string + ---@return string + local function getResourceNameFromModulePath(modulePath) + local externalResourceName = modulePath:match("^@(.-)%.") + if externalResourceName then + return externalResourceName end - local idx = 4 -- call stack depth (kept slightly lower than expected depth "just in case") - - while true do - local dbgInfo = debug.getinfo(idx, 'S') - local src = dbgInfo and dbgInfo.source - - if not src then - return ESX.currentResourceName, modName - end - - resource = src:match('^@@([^/]+)/.+') - - if resource and not src:find('^@@es_extended/imports') then - return resource, modName - end - - idx = idx + 1 - end + return _resourceName end - local tempData = {} - - ---@param name string - ---@param path string - ---@return string? filename - ---@return string? errmsg - ---@diagnostic disable-next-line: duplicate-set-field - function package.searchpath(name, path) - local resource, modName = getModuleInfo(name:gsub('%.', '/')) - local tried = {} - - for template in path:gmatch('[^;]+') do - local fileName = template:gsub('^%./', ''):gsub('?', modName:gsub('%.', '/') or modName) - local file = LoadResourceFile(resource, fileName) - - if file then - tempData[1] = file - tempData[2] = resource - return fileName - end - - tried[#tried + 1] = ("no file '@%s/%s'"):format(resource, fileName) + ---@param modulePath string + ---@return string, number + local function getModuleFilePath(modulePath) + if modulePath:sub(1, 1) == "@" then + modulePath = modulePath:sub(modulePath:find("%.") + 1) end - return nil, table.concat(tried, "\n\t") + return modulePath:gsub("%.", "/") end - ---Attempts to load a module at the given path relative to the resource root directory.\ - ---Returns a function to load the module chunk, or a string containing all tested paths. - ---@param modName string - ---@param env? table - local function loadModule(modName, env) - local fileName, err = package.searchpath(modName, package.path) + ---@param modulePath string + ---@return any + function require(modulePath) + assert(type(modulePath) == "string", "Module path must be a string") - if fileName then - local file = tempData[1] - local resource = tempData[2] - - ESX.Table.Wipe(tempData) - return assert(load(file, ('@@%s/%s'):format(resource, fileName), 't', env or _ENV)) + if loadingModules[modulePath] then + error(("Circular dependency detected for module '%s'."):format(modulePath)) end - return nil, err or 'unknown error' - end - - ---@alias PackageSearcher - ---| fun(modName: string): function loader - ---| fun(modName: string): nil, string errmsg - - ---@type PackageSearcher[] - package.searchers = { - function(modName) - local ok, result = pcall(_require, modName) - - if ok then return result end - - return ok, result - end, - function(modName) - if package.preload[modName] ~= nil then - return package.preload[modName] - end - - return nil, ("no field package.preload['%s']"):format(modName) - end, - function(modName) return loadModule(modName) end, - } - - ---@param filePath string - ---@param env? table - ---@return unknown - ---Loads and runs a Lua file at the given path. Unlike require, the chunk is not cached for future use. - function ESX.load(filePath, env) - if type(filePath) ~= 'string' then - error(("file path must be a string (received '%s')"):format(filePath), 2) + if cachedModules[modulePath] then + return cachedModules[modulePath] end - local result, err = loadModule(filePath, env) - - if result then return result() end - - error(("file '%s' not found\n\t%s"):format(filePath, err)) - end - - ---@param filePath string - ---@return table - ---Loads and decodes a json file at the given path. - function ESX.loadJson(filePath) - if type(filePath) ~= 'string' then - error(("file path must be a string (received '%s')"):format(filePath), 2) - end - - local resourceSrc, modPath = getModuleInfo(filePath:gsub('%.', '/')) - local resourceFile = LoadResourceFile(resourceSrc, ('%s.json'):format(modPath)) - - if resourceFile then - return json.decode(resourceFile) - end + loadingModules[modulePath] = true - error(("json file '%s' not found\n\tno file '@%s/%s.json'"):format(filePath, resourceSrc, modPath)) - end + local resourceName = getResourceNameFromModulePath(modulePath) + local moduleFilePath = getModuleFilePath(modulePath) + local moduleFileContent = LoadResourceFile(resourceName, moduleFilePath .. ".lua") - ---Loads the given module, returns any value returned by the seacher (`true` when `nil`).\ - ---Passing `@resourceName.modName` loads a module from a remote resource. - ---@param modName string - ---@return unknown - function ESX.require(modName) - if type(modName) ~= 'string' then - error(("module name must be a string (received '%s')"):format(modName), 3) + if not moduleFileContent then + loadingModules[modulePath] = nil + error(("Module '%s' not found in resource '%s'."):format(moduleFilePath, resourceName)) end - local module = loaded[modName] + local chunk, err = load(moduleFileContent, ("@%s/%s"):format(resourceName, moduleFilePath), "t") - if module == '__loading' then - error(("^1circular-dependency occurred when loading module '%s'^0"):format(modName), 2) + if not chunk then + loadingModules[modulePath] = nil + error(("Failed to load module '%s': %s"):format(moduleFilePath, err)) end - if module ~= nil then return module end - - loaded[modName] = '__loading' + local result = chunk() - local err = {} + cachedModules[modulePath] = result ~= nil and result or true + loadingModules[modulePath] = nil - for i = 1, #package.searchers do - local result, errMsg = package.searchers[i](modName) - if result then - if type(result) == 'function' then result = result() end - loaded[modName] = result or result == nil - - return loaded[modName] - end - - err[#err + 1] = errMsg - end - - error(("%s"):format(table.concat(err, "\n\t"))) + return result end - - require = ESX.require end diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index 124170650..a7566ffbc 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -563,7 +563,7 @@ end ---@return table function ESX.GetItems() - return ESX.Items + return Core.Items end ---@return table diff --git a/[core]/es_extended/shared/main.lua b/[core]/es_extended/shared/main.lua index 5d659daaa..00f775b46 100644 --- a/[core]/es_extended/shared/main.lua +++ b/[core]/es_extended/shared/main.lua @@ -9,8 +9,8 @@ AddEventHandler("esx:getSharedObject", function(cb) cb(ESX) end local invokingResource = GetInvokingResource() - print(("^3[WARNING]^0 Resource ^5%s^0 used the ^5getSharedObject^0 event. This is not the recommended way to import ESX. Visit https://docs.esx-legacy.com/tutorials/tutorials-esx/sharedevent to find out why."):format(invokingResource)) + print(("^3[WARNING]^0 Resource ^5%s^0 used the ^5getSharedObject^0 event. This is not the recommended way to import ESX. Visit https://documentation.esx-framework.org/tutorials/tutorials-esx/sharedevent to find out why."):format(invokingResource)) end) --- backwards compatibility (DO NOT TOUCH !) -Config.OxInventory = Config.CustomInventory == "ox" +-- backwards compatibility (DO NOT TOUCH !) +Config.OxInventory = Config.CustomInventory == "ox" \ No newline at end of file diff --git a/[core]/es_extended/shared/modules/table.lua b/[core]/es_extended/shared/modules/table.lua index ab4b147d8..aacb25840 100644 --- a/[core]/es_extended/shared/modules/table.lua +++ b/[core]/es_extended/shared/modules/table.lua @@ -224,18 +224,10 @@ function ESX.Table.Sort(t, order) end end ----@param t table ----@return Array -function ESX.Table.ToArray(t) +function ESX.Table.ToArray(table) local array = {} - for _, v in pairs(t) do + for _, v in pairs(table) do array[#array + 1] = v end return array end - ----@param t table ----@return table -function ESX.Table.Wipe(t) - return table.wipe(t) -end \ No newline at end of file diff --git a/[core]/esx_chat_theme/README.md b/[core]/esx_chat_theme/README.md index 1d149d4ad..c6c88f0ef 100644 --- a/[core]/esx_chat_theme/README.md +++ b/[core]/esx_chat_theme/README.md @@ -1,4 +1,4 @@ -

[ESX] Chat Theme

Discord - Documentation +

[ESX] Chat Theme

Discord - Documentation A ESX-Based Chat-theme for your server diff --git a/[core]/esx_context/README.md b/[core]/esx_context/README.md index 6b6a53de4..c4e378a94 100644 --- a/[core]/esx_context/README.md +++ b/[core]/esx_context/README.md @@ -1,4 +1,4 @@ -

[ESX] Context

Discord - Website - Documentation +

[ESX] Context

Discord - Website - Documentation A elegant, easy to use Context Menu system to make User Interactions clean and hassle free diff --git a/[core]/esx_identity/README.md b/[core]/esx_identity/README.md index c06370815..3747c631c 100644 --- a/[core]/esx_identity/README.md +++ b/[core]/esx_identity/README.md @@ -1,4 +1,4 @@ -

[ESX] Identity

Discord - Documentation +

[ESX] Identity

Discord - Documentation A Core Resource that Allows the player to Pick their characters, Name, Gender, Height and Date-of-birth. diff --git a/[core]/esx_loadingscreen/README.md b/[core]/esx_loadingscreen/README.md index 366c5adaa..1f51ae3e0 100644 --- a/[core]/esx_loadingscreen/README.md +++ b/[core]/esx_loadingscreen/README.md @@ -1,4 +1,4 @@ -

[ESX] Loading Screen

Discord - Website - Documentation +

[ESX] Loading Screen

Discord - Website - Documentation A simple but beautiful Loading Screen for your server! diff --git a/[core]/esx_menu_default/README.md b/[core]/esx_menu_default/README.md index 29e07d1f5..05abc0380 100644 --- a/[core]/esx_menu_default/README.md +++ b/[core]/esx_menu_default/README.md @@ -1,4 +1,4 @@ -

[ESX] Menu Defualt

Discord - Website - Documentation +

[ESX] Menu Defualt

Discord - Website - Documentation A default List type menu for ESX. diff --git a/[core]/esx_multicharacter/readme.md b/[core]/esx_multicharacter/readme.md index 2517728e7..58b30ff43 100644 --- a/[core]/esx_multicharacter/readme.md +++ b/[core]/esx_multicharacter/readme.md @@ -1,4 +1,4 @@ -

[ESX] Multi-Character

Discord - Website - Documentation +

[ESX] Multi-Character

Discord - Website - Documentation A Simplistic system, that allows Players to have multiple Characters, which can be customised for all player with `Config.Slots` or personally set a players character count using `setslots`, `remslots`, `enablechar` and `disablechar` Commands :) diff --git a/[core]/esx_notify/readme.md b/[core]/esx_notify/readme.md index f6bc4c9d7..666b34988 100644 --- a/[core]/esx_notify/readme.md +++ b/[core]/esx_notify/readme.md @@ -1,4 +1,4 @@ -

[ESX] Notify

Discord - Website - Documentation +

[ESX] Notify

Discord - Website - Documentation A beautiful and simple NUI notification system for ESX diff --git a/[core]/esx_textui/readme.md b/[core]/esx_textui/readme.md index 922e11a86..32796da39 100644 --- a/[core]/esx_textui/readme.md +++ b/[core]/esx_textui/readme.md @@ -1,4 +1,4 @@ -

[ESX] TextUI

Discord - Website - Documentation +

[ESX] TextUI

Discord - Website - Documentation A beautiful and simple Persistent Notification. diff --git a/[core]/skinchanger/README.md b/[core]/skinchanger/README.md index 7b1b3dd6f..cd763d5c7 100644 --- a/[core]/skinchanger/README.md +++ b/[core]/skinchanger/README.md @@ -1,4 +1,4 @@ -

[ESX] SkinChanger

Discord - Website - Documentation +

[ESX] SkinChanger

Discord - Website - Documentation skinchanger is a resource used to both Set and Get Players clothing, accessories and Model - It supports the freemode peds `mp_m_freemode_01` and `mp_f_freemode_01` as well as all Ped Features. diff --git a/readme.md b/readme.md index 3537e4307..ef2abad0b 100644 --- a/readme.md +++ b/readme.md @@ -1,19 +1,19 @@ -

ESX Legacy

-

Discord - Website - Documentation - -

Want more resources? You can browse the Cfx.re Releases board for more! -

ESX is the leading framework, trusted by over 12,000 communities to provide the highest quality roleplay servers on FiveM

- -
- -### 💗 Supporters - -Interested in helping us? [Take a look at our patreon](https://www.patreon.com/esx "Take a look at our patreon") - -| We would like to sincerely thank the following donors who helped fund the development of ESX. | -| ------------ | -| Mohamad Buhamad - Michael Hein - RoadToSix - Montree Narathong | -| Saydoon - Muhannad alyamani - iSentrie - Wecity - Samuel Nicol | -| Kyle McShea - Artin - Mathias Christoffersen - Jaylan Yilmaz - Callum | -| CONGRESS KW - Michael Hein - Smery sitbon - daZepelin - CMF Community | ------- +

ESX Legacy

+

Discord - Website - Documentation + +

Want more resources? You can browse the Cfx.re Releases board for more! +

ESX is the leading framework, trusted by over 12,000 communities to provide the highest quality roleplay servers on FiveM

+ +
+ +### 💗 Supporters + +Interested in helping us? [Take a look at our patreon](https://www.patreon.com/esx "Take a look at our patreon") + +| We would like to sincerely thank the following donors who helped fund the development of ESX. | +| ------------ | +| Mohamad Buhamad - Michael Hein - RoadToSix - Montree Narathong | +| Saydoon - Muhannad alyamani - iSentrie - Wecity - Samuel Nicol | +| Kyle McShea - Artin - Mathias Christoffersen - Jaylan Yilmaz - Callum | +| CONGRESS KW - Michael Hein - Smery sitbon - daZepelin - CMF Community | +------