diff --git a/[core]/es_extended/imports.lua b/[core]/es_extended/imports.lua index 719d0623..9bd1d4ff 100644 --- a/[core]/es_extended/imports.lua +++ b/[core]/es_extended/imports.lua @@ -42,6 +42,27 @@ if not IsDuplicityVersion() then -- Only register this event for the client return error(('\n^1Error loading module (%s)'):format(external[i])) end end +else + ESX.Player = setmetatable({}, { + __call = function(_, src) + if type(src) ~= "number" then + src = ESX.GetPlayerIdFromIdentifier(src) + if not src then + return + end + elseif not ESX.IsPlayerLoaded(src) then + return + end + + return setmetatable({src = src}, { + __index = function(self, method) + return function(...) + return exports.es_extended:RunStaticPlayerMethod(self.src, method, ...) + end + end + }) + end + }) end if GetResourceState("ox_lib") == "missing" then diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index b5e66e7b..b4682df7 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -91,6 +91,11 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, return self.paycheckEnabled end + ---@return boolean + function self.isAdmin() + return Core.IsPlayerAdmin(self.source) + end + ---@param coordinates vector4 | vector3 | table ---@return nil function self.setCoords(coordinates) @@ -455,6 +460,12 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, return self.weight end + ---@return number + function self.getSource() + return self.source + end + self.getPlayerId = self.getSource + ---@return number function self.getMaxWeight() return self.maxWeight @@ -944,3 +955,17 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, return self end + +local function runStaticPlayerMethod(src, method, ...) + local xPlayer = ESX.Players[src] + if not xPlayer then + return + end + + if not ESX.IsFunctionReference(xPlayer[method]) then + error(("Attempted to call invalid method on playerId %s: %s"):format(src, method)) + end + + return xPlayer[method](...) +end +exports("RunStaticPlayerMethod", runStaticPlayerMethod) \ No newline at end of file diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index 0ab74f2f..d7900e46 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -358,6 +358,18 @@ function ESX.GetPlayerFromIdentifier(identifier) return Core.playersByIdentifier[identifier] end +---@param identifier string +---@return number playerId +function ESX.GetPlayerIdFromIdentifier(identifier) + return Core.playersByIdentifier[identifier]?.source +end + +---@param source number +---@return boolean +function ESX.IsPlayerLoaded(source) + return ESX.Players[source] ~= nil +end + ---@param playerId number | string ---@return string function ESX.GetIdentifier(playerId)