diff --git a/[core]/es_extended/server/compat.lua b/[core]/es_extended/server/compat.lua index cc4e3271..9f36b39c 100644 --- a/[core]/es_extended/server/compat.lua +++ b/[core]/es_extended/server/compat.lua @@ -1 +1,10 @@ ---All server-side functions outsourced from the Core to the lib will be stored here for compatability, e.g: \ No newline at end of file +--All server-side functions outsourced from the Core to the lib will be stored here for compatability, e.g: + +ESX.OneSync.GetPlayersInArea = xLib.onesync.getPlayersInArea +ESX.OneSync.GetClosestPlayer = xLib.onesync.getClosestPlayer +ESX.OneSync.GetPedsInArea = xLib.onesync.getPedsInArea +ESX.OneSync.GetObjectsInArea = xLib.onesync.getObjectsInArea +ESX.OneSync.GetVehiclesInArea = xLib.onesync.getVehiclesInArea +ESX.OneSync.GetClosestPed = xLib.onesync.getClosestPed +ESX.OneSync.GetClosestObject = xLib.onesync.getClosestObject +ESX.OneSync.GetClosestVehicle = xLib.onesync.getClosestVehicle \ No newline at end of file diff --git a/[core]/es_extended/server/modules/onesync.lua b/[core]/es_extended/server/modules/onesync.lua index 573dc888..18e179e5 100644 --- a/[core]/es_extended/server/modules/onesync.lua +++ b/[core]/es_extended/server/modules/onesync.lua @@ -1,84 +1,5 @@ ESX.OneSync = {} ----@param source number|vector3 ----@param closest boolean ----@param distance? number ----@param ignore? table ----@param routingBucket? number -local function getNearbyPlayers(source, closest, distance, ignore, routingBucket) - local result = {} - local count = 0 - local playerPed - local playerCoords - ignore = ignore or {} - - if not distance then - distance = 100 - end - - if type(source) == "number" then - playerPed = GetPlayerPed(source) - - if not source then - error("Received invalid first argument (source); should be playerId") - end - - playerCoords = GetEntityCoords(playerPed) - - if not playerCoords then - error("Received nil value (playerCoords); perhaps source is nil at first place?") - end - end - - if type(source) == "vector3" then - playerCoords = source - - if not playerCoords then - error("Received nil value (playerCoords); perhaps source is nil at first place?") - end - end - - for _, xPlayer in pairs(ESX.Players) do - if not ignore[xPlayer.source] and (not routingBucket or GetPlayerRoutingBucket(xPlayer.source) == routingBucket) then - local entity = GetPlayerPed(xPlayer.source) - local coords = GetEntityCoords(entity) - - if not closest then - local dist = #(playerCoords - coords) - if dist <= distance then - count = count + 1 - result[count] = { id = xPlayer.source, ped = NetworkGetNetworkIdFromEntity(entity), coords = coords, dist = dist } - end - else - if xPlayer.source ~= source then - local dist = #(playerCoords - coords) - if dist <= (result.dist or distance) then - result = { id = xPlayer.source, ped = NetworkGetNetworkIdFromEntity(entity), coords = coords, dist = dist } - end - end - end - end - end - - return result -end - ----@param source vector3|number playerId or vector3 coordinates ----@param maxDistance number ----@param ignore? table playerIds to ignore, where the key is playerId and value is true ----@param routingBucket? number -function ESX.OneSync.GetPlayersInArea(source, maxDistance, ignore, routingBucket) - return getNearbyPlayers(source, false, maxDistance, ignore, routingBucket) -end - ----@param source vector3|number playerId or vector3 coordinates ----@param maxDistance number ----@param ignore? table playerIds to ignore, where the key is playerId and value is true ----@param routingBucket? number -function ESX.OneSync.GetClosestPlayer(source, maxDistance, ignore, routingBucket) - return getNearbyPlayers(source, true, maxDistance, ignore, routingBucket) -end - ---@param vehicleModel number|string ---@param coords vector3|table ---@param heading number @@ -304,84 +225,3 @@ function ESX.OneSync.SpawnPedInVehicle(model, vehicle, seat, cb) return Citizen.Await(promise) end end - -local function getNearbyEntities(entities, coords, modelFilter, maxDistance, isPed) - local nearbyEntities = {} - coords = type(coords) == "number" and GetEntityCoords(GetPlayerPed(coords)) or vector3(coords.x, coords.y, coords.z) - for _, entity in pairs(entities) do - if not isPed or (isPed and not IsPedAPlayer(entity)) then - if not modelFilter or modelFilter[GetEntityModel(entity)] then - local entityCoords = GetEntityCoords(entity) - if not maxDistance or #(coords - entityCoords) <= maxDistance then - nearbyEntities[#nearbyEntities + 1] = NetworkGetNetworkIdFromEntity(entity) - end - end - end - end - - return nearbyEntities -end - ----@param coords vector3 ----@param maxDistance number ----@param modelFilter table models to ignore, where the key is the model hash and the value is true ----@return table -function ESX.OneSync.GetPedsInArea(coords, maxDistance, modelFilter) - return getNearbyEntities(GetAllPeds(), coords, modelFilter, maxDistance, true) -end - ----@param coords vector3 ----@param maxDistance number ----@param modelFilter table models to ignore, where the key is the model hash and the value is true ----@return table -function ESX.OneSync.GetObjectsInArea(coords, maxDistance, modelFilter) - return getNearbyEntities(GetAllObjects(), coords, modelFilter, maxDistance) -end - ----@param coords vector3 ----@param maxDistance number ----@param modelFilter table | nil models to ignore, where the key is the model hash and the value is true ----@return table -function ESX.OneSync.GetVehiclesInArea(coords, maxDistance, modelFilter) - return getNearbyEntities(GetAllVehicles(), coords, modelFilter, maxDistance) -end - -local function getClosestEntity(entities, coords, modelFilter, isPed) - local distance, closestEntity, closestCoords = 100, 0, vector3(0, 0, 0) - coords = type(coords) == "number" and GetEntityCoords(GetPlayerPed(coords)) or vector3(coords.x, coords.y, coords.z) - - for _, entity in pairs(entities) do - if not isPed or (isPed and not IsPedAPlayer(entity)) then - if not modelFilter or modelFilter[GetEntityModel(entity)] then - local entityCoords = GetEntityCoords(entity) - local dist = #(coords - entityCoords) - if dist < distance then - closestEntity, distance, closestCoords = entity, dist, entityCoords - end - end - end - end - - return NetworkGetNetworkIdFromEntity(closestEntity), distance, closestCoords -end - ----@param coords vector3 ----@param modelFilter table models to ignore, where the key is the model hash and the value is true ----@return number entityId, number distance, vector3 coords -function ESX.OneSync.GetClosestPed(coords, modelFilter) - return getClosestEntity(GetAllPeds(), coords, modelFilter, true) -end - ----@param coords vector3 ----@param modelFilter table models to ignore, where the key is the model hash and the value is true ----@return number entityId, number distance, vector3 coords -function ESX.OneSync.GetClosestObject(coords, modelFilter) - return getClosestEntity(GetAllObjects(), coords, modelFilter) -end - ----@param coords vector3 ----@param modelFilter table models to ignore, where the key is the model hash and the value is true ----@return number entityId, number distance, vector3 coords -function ESX.OneSync.GetClosestVehicle(coords, modelFilter) - return getClosestEntity(GetAllVehicles(), coords, modelFilter) -end diff --git a/[core]/esx_lib/imports/onesync/server.lua b/[core]/esx_lib/imports/onesync/server.lua new file mode 100644 index 00000000..c07be074 --- /dev/null +++ b/[core]/esx_lib/imports/onesync/server.lua @@ -0,0 +1,164 @@ +---@class onesynclib +xLib.onesync = {} + +---@param source number|vector3 +---@param closest boolean +---@param distance? number +---@param ignore? table +---@param routingBucket? number +local function getNearbyPlayers(source, closest, distance, ignore, routingBucket) + local result = {} + local count = 0 + local playerPed + local playerCoords + ignore = ignore or {} + + if not distance then + distance = 100 + end + + if type(source) == "number" then + playerPed = GetPlayerPed(source) + + if not source then + error("Received invalid first argument (source); should be playerId") + end + + playerCoords = GetEntityCoords(playerPed) + + if not playerCoords then + error("Received nil value (playerCoords); perhaps source is nil at first place?") + end + end + + if type(source) == "vector3" then + playerCoords = source + + if not playerCoords then + error("Received nil value (playerCoords); perhaps source is nil at first place?") + end + end + + for _, xPlayer in pairs(ESX.Players) do + if not ignore[xPlayer.source] and (not routingBucket or GetPlayerRoutingBucket(xPlayer.source) == routingBucket) then + local entity = GetPlayerPed(xPlayer.source) + local coords = GetEntityCoords(entity) + + if not closest then + local dist = #(playerCoords - coords) + if dist <= distance then + count = count + 1 + result[count] = { id = xPlayer.source, ped = NetworkGetNetworkIdFromEntity(entity), coords = coords, dist = dist } + end + else + if xPlayer.source ~= source then + local dist = #(playerCoords - coords) + if dist <= (result.dist or distance) then + result = { id = xPlayer.source, ped = NetworkGetNetworkIdFromEntity(entity), coords = coords, dist = dist } + end + end + end + end + end + + return result +end + +---@param source vector3|number playerId or vector3 coordinates +---@param maxDistance number +---@param ignore? table playerIds to ignore, where the key is playerId and value is true +---@param routingBucket? number +function xLib.onesync.getPlayersInArea(source, maxDistance, ignore, routingBucket) + return getNearbyPlayers(source, false, maxDistance, ignore, routingBucket) +end + +---@param source vector3|number playerId or vector3 coordinates +---@param maxDistance number +---@param ignore? table playerIds to ignore, where the key is playerId and value is true +---@param routingBucket? number +function xLib.onesync.getClosestPlayer(source, maxDistance, ignore, routingBucket) + return getNearbyPlayers(source, true, maxDistance, ignore, routingBucket) +end + +local function getNearbyEntities(entities, coords, modelFilter, maxDistance, isPed) + local nearbyEntities = {} + coords = type(coords) == "number" and GetEntityCoords(GetPlayerPed(coords)) or vector3(coords.x, coords.y, coords.z) + for _, entity in pairs(entities) do + if not isPed or (isPed and not IsPedAPlayer(entity)) then + if not modelFilter or modelFilter[GetEntityModel(entity)] then + local entityCoords = GetEntityCoords(entity) + if not maxDistance or #(coords - entityCoords) <= maxDistance then + nearbyEntities[#nearbyEntities + 1] = NetworkGetNetworkIdFromEntity(entity) + end + end + end + end + + return nearbyEntities +end + +---@param coords vector3 +---@param maxDistance number +---@param modelFilter table models to ignore, where the key is the model hash and the value is true +---@return table +function xLib.onesync.getPedsInArea(coords, maxDistance, modelFilter) + return getNearbyEntities(GetAllPeds(), coords, modelFilter, maxDistance, true) +end + +---@param coords vector3 +---@param maxDistance number +---@param modelFilter table models to ignore, where the key is the model hash and the value is true +---@return table +function xLib.onesync.getObjectsInArea(coords, maxDistance, modelFilter) + return getNearbyEntities(GetAllObjects(), coords, modelFilter, maxDistance) +end + +---@param coords vector3 +---@param maxDistance number +---@param modelFilter table | nil models to ignore, where the key is the model hash and the value is true +---@return table +function xLib.onesync.getVehiclesInArea(coords, maxDistance, modelFilter) + return getNearbyEntities(GetAllVehicles(), coords, modelFilter, maxDistance) +end + +local function getClosestEntity(entities, coords, modelFilter, isPed) + local distance, closestEntity, closestCoords = 100, 0, vector3(0, 0, 0) + coords = type(coords) == "number" and GetEntityCoords(GetPlayerPed(coords)) or vector3(coords.x, coords.y, coords.z) + + for _, entity in pairs(entities) do + if not isPed or (isPed and not IsPedAPlayer(entity)) then + if not modelFilter or modelFilter[GetEntityModel(entity)] then + local entityCoords = GetEntityCoords(entity) + local dist = #(coords - entityCoords) + if dist < distance then + closestEntity, distance, closestCoords = entity, dist, entityCoords + end + end + end + end + + return NetworkGetNetworkIdFromEntity(closestEntity), distance, closestCoords +end + +---@param coords vector3 +---@param modelFilter table models to ignore, where the key is the model hash and the value is true +---@return number entityId, number distance, vector3 coords +function xLib.onesync.getClosestPed(coords, modelFilter) + return getClosestEntity(GetAllPeds(), coords, modelFilter, true) +end + +---@param coords vector3 +---@param modelFilter table models to ignore, where the key is the model hash and the value is true +---@return number entityId, number distance, vector3 coords +function xLib.onesync.getClosestObject(coords, modelFilter) + return getClosestEntity(GetAllObjects(), coords, modelFilter) +end + +---@param coords vector3 +---@param modelFilter table models to ignore, where the key is the model hash and the value is true +---@return number entityId, number distance, vector3 coords +function xLib.onesync.getClosestVehicle(coords, modelFilter) + return getClosestEntity(GetAllVehicles(), coords, modelFilter) +end + +return xLib.onesync