diff --git a/imports/getClosestObject/client.lua b/imports/getClosestObject/shared.lua similarity index 100% rename from imports/getClosestObject/client.lua rename to imports/getClosestObject/shared.lua diff --git a/imports/getClosestPed/client.lua b/imports/getClosestPed/shared.lua similarity index 100% rename from imports/getClosestPed/client.lua rename to imports/getClosestPed/shared.lua diff --git a/imports/getClosestPlayer/server.lua b/imports/getClosestPlayer/server.lua new file mode 100644 index 0000000..19942d0 --- /dev/null +++ b/imports/getClosestPlayer/server.lua @@ -0,0 +1,28 @@ +---@param coords vector3 The coords to check from. +---@param maxDistance number The max distance to check. +---@return number? playerId +---@return number? playerPed +---@return vector3? playerCoords +function lib.getClosestPlayer(coords, maxDistance) + local players = GetActivePlayers() + local closestId, closestPed, closestCoords + maxDistance = maxDistance or 2.0 + + for i = 1, #players do + local playerId = players[i] + local playerPed = GetPlayerPed(playerId) + local playerCoords = GetEntityCoords(playerPed) + local distance = #(coords - playerCoords) + + if distance < maxDistance then + maxDistance = distance + closestId = playerId + closestPed = playerPed + closestCoords = playerCoords + end + end + + return closestId, closestPed, closestCoords +end + +return lib.getClosestPlayer diff --git a/imports/getClosestVehicle/client.lua b/imports/getClosestVehicle/shared.lua similarity index 83% rename from imports/getClosestVehicle/client.lua rename to imports/getClosestVehicle/shared.lua index ec87fac..c2647b7 100644 --- a/imports/getClosestVehicle/client.lua +++ b/imports/getClosestVehicle/shared.lua @@ -1,6 +1,6 @@ ---@param coords vector3 The coords to check from. ---@param maxDistance number The max distance to check. ----@param includePlayerVehicle boolean Whether or not to include the player's current vehicle. +---@param includePlayerVehicle boolean Whether or not to include the player's current vehicle. Ignored on the server. ---@return number? vehicle ---@return vector3? vehicleCoords function lib.getClosestVehicle(coords, maxDistance, includePlayerVehicle) @@ -11,7 +11,7 @@ function lib.getClosestVehicle(coords, maxDistance, includePlayerVehicle) for i = 1, #vehicles do local vehicle = vehicles[i] - if not cache.vehicle or vehicle ~= cache.vehicle or includePlayerVehicle then + if lib.context == 'server' or not cache.vehicle or vehicle ~= cache.vehicle or includePlayerVehicle then local vehicleCoords = GetEntityCoords(vehicle) local distance = #(coords - vehicleCoords) diff --git a/imports/getNearbyObjects/client.lua b/imports/getNearbyObjects/shared.lua similarity index 92% rename from imports/getNearbyObjects/client.lua rename to imports/getNearbyObjects/shared.lua index 0bd2e76..17054a0 100644 --- a/imports/getNearbyObjects/client.lua +++ b/imports/getNearbyObjects/shared.lua @@ -1,5 +1,5 @@ ---@param coords vector3 The coords to check from. ----@param maxDistance number The max distance to check. +---@param maxDistance? number The max distance to check. ---@return { object: number, coords: vector3 }[] function lib.getNearbyObjects(coords, maxDistance) local objects = GetGamePool('CObject') diff --git a/imports/getNearbyPeds/client.lua b/imports/getNearbyPeds/shared.lua similarity index 92% rename from imports/getNearbyPeds/client.lua rename to imports/getNearbyPeds/shared.lua index 03424b9..4abd6c8 100644 --- a/imports/getNearbyPeds/client.lua +++ b/imports/getNearbyPeds/shared.lua @@ -1,5 +1,5 @@ ---@param coords vector3 The coords to check from. ----@param maxDistance number The max distance to check. +---@param maxDistance? number The max distance to check. ---@return { ped: number, coords: vector3 }[] function lib.getNearbyPeds(coords, maxDistance) local peds = GetGamePool('CPed') diff --git a/imports/getNearbyPlayers/client.lua b/imports/getNearbyPlayers/client.lua index 4438e95..5e4a0c7 100644 --- a/imports/getNearbyPlayers/client.lua +++ b/imports/getNearbyPlayers/client.lua @@ -1,6 +1,6 @@ ---@param coords vector3 The coords to check from. ----@param maxDistance number The max distance to check. ----@param includePlayer boolean? Whether or not to include the current player. +---@param maxDistance? number The max distance to check. +---@param includePlayer? boolean Whether or not to include the current player. ---@return { id: number, ped: number, coords: vector3 }[] function lib.getNearbyPlayers(coords, maxDistance, includePlayer) local players = GetActivePlayers() diff --git a/imports/getNearbyPlayers/server.lua b/imports/getNearbyPlayers/server.lua new file mode 100644 index 0000000..20f2b28 --- /dev/null +++ b/imports/getNearbyPlayers/server.lua @@ -0,0 +1,29 @@ +---@param coords vector3 The coords to check from. +---@param maxDistance? number The max distance to check. +---@return { id: number, ped: number, coords: vector3 }[] +function lib.getNearbyPlayers(coords, maxDistance) + local players = GetActivePlayers() + local nearby = {} + local count = 0 + maxDistance = maxDistance or 2.0 + + for i = 1, #players do + local playerId = players[i] + local playerPed = GetPlayerPed(playerId) + local playerCoords = GetEntityCoords(playerPed) + local distance = #(coords - playerCoords) + + if distance < maxDistance then + count += 1 + nearby[count] = { + id = playerId, + ped = playerPed, + coords = playerCoords, + } + end + end + + return nearby +end + +return lib.getNearbyPlayers diff --git a/imports/getNearbyVehicles/client.lua b/imports/getNearbyVehicles/shared.lua similarity index 71% rename from imports/getNearbyVehicles/client.lua rename to imports/getNearbyVehicles/shared.lua index 658493c..2c38c71 100644 --- a/imports/getNearbyVehicles/client.lua +++ b/imports/getNearbyVehicles/shared.lua @@ -1,6 +1,6 @@ ---@param coords vector3 The coords to check from. ----@param maxDistance number The max distance to check. ----@param includePlayerVehicle boolean Whether or not to include the player's current vehicle. +---@param maxDistance? number The max distance to check. +---@param includePlayerVehicle? boolean Whether or not to include the player's current vehicle. ---@return { vehicle: number, coords: vector3 }[] function lib.getNearbyVehicles(coords, maxDistance, includePlayerVehicle) local vehicles = GetGamePool('CVehicle') @@ -11,7 +11,7 @@ function lib.getNearbyVehicles(coords, maxDistance, includePlayerVehicle) for i = 1, #vehicles do local vehicle = vehicles[i] - if not cache.vehicle or vehicle ~= cache.vehicle or includePlayerVehicle then + if lib.context == 'server' or not cache.vehicle or vehicle ~= cache.vehicle or includePlayerVehicle then local vehicleCoords = GetEntityCoords(vehicle) local distance = #(coords - vehicleCoords) diff --git a/init.lua b/init.lua index 0865c9d..3176b4b 100644 --- a/init.lua +++ b/init.lua @@ -222,6 +222,33 @@ else function lib.notify(playerId, data) TriggerClientEvent(notifyEvent, playerId, data) end + + local poolNatives = { + CPed = GetAllPeds, + CObject = GetAllObjects, + CVehicle = GetAllVehicles, + } + + ---@param poolName 'CPed' | 'CObject' | 'CVehicle' + ---@return number[] + ---Server-side parity for the `GetGamePool` client native. + function GetGamePool(poolName) + local fn = poolNatives[poolName] + return fn and fn() --[[@as number[] ]] + end + + ---@return number[] + ---Server-side parity for the `GetPlayers` client native. + function GetActivePlayers() + local playerNum = GetNumPlayerIndices() + local players = table.create(playerNum, 0) + + for i = 1, playerNum do + players[i] = tonumber(GetPlayerFromIndex(i - 1)) + end + + return players + end end for i = 1, GetNumResourceMetadata(cache.resource, 'ox_lib') do