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 |
+------