mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-29 01:01:22 +00:00
Merge pull request #1666 from Kenshiin13/fix-veh-spawn-dim
fix(es_extended/server/modules/onesync): decouple player proximity from veh spawning
This commit is contained in:
@@ -401,6 +401,8 @@ function ESX.GetVehicleType(model, player, cb)
|
||||
elseif cb then
|
||||
cb(result)
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
model = type(model) == "string" and joaat(model) or model
|
||||
|
||||
@@ -4,11 +4,13 @@ ESX.OneSync = {}
|
||||
---@param closest boolean
|
||||
---@param distance? number
|
||||
---@param ignore? table
|
||||
local function getNearbyPlayers(source, closest, distance, ignore)
|
||||
---@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
|
||||
@@ -19,14 +21,12 @@ local function getNearbyPlayers(source, closest, distance, ignore)
|
||||
|
||||
if not source then
|
||||
error("Received invalid first argument (source); should be playerId")
|
||||
return result
|
||||
end
|
||||
|
||||
playerCoords = GetEntityCoords(playerPed)
|
||||
|
||||
if not playerCoords then
|
||||
error("Received nil value (playerCoords); perhaps source is nil at first place?")
|
||||
return result
|
||||
end
|
||||
end
|
||||
|
||||
@@ -35,12 +35,11 @@ local function getNearbyPlayers(source, closest, distance, ignore)
|
||||
|
||||
if not playerCoords then
|
||||
error("Received nil value (playerCoords); perhaps source is nil at first place?")
|
||||
return result
|
||||
end
|
||||
end
|
||||
|
||||
for _, xPlayer in pairs(ESX.Players) do
|
||||
if not ignore or not ignore[xPlayer.source] then
|
||||
if not ignore[xPlayer.source] and (not routingBucket or GetPlayerRoutingBucket(xPlayer.source) == routingBucket) then
|
||||
local entity = GetPlayerPed(xPlayer.source)
|
||||
local coords = GetEntityCoords(entity)
|
||||
|
||||
@@ -67,15 +66,17 @@ 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
|
||||
function ESX.OneSync.GetPlayersInArea(source, maxDistance, ignore)
|
||||
return getNearbyPlayers(source, false, maxDistance, ignore)
|
||||
---@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
|
||||
function ESX.OneSync.GetClosestPlayer(source, maxDistance, ignore)
|
||||
return getNearbyPlayers(source, true, maxDistance, ignore)
|
||||
---@param routingBucket? number
|
||||
function ESX.OneSync.GetClosestPlayer(source, maxDistance, ignore, routingBucket)
|
||||
return getNearbyPlayers(source, true, maxDistance, ignore, routingBucket)
|
||||
end
|
||||
|
||||
---@param vehicleModel number|string
|
||||
@@ -100,6 +101,8 @@ function ESX.OneSync.SpawnVehicle(vehicleModel, coords, heading, vehicleProperti
|
||||
elseif cb then
|
||||
cb(result)
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
local function reject(err)
|
||||
@@ -110,10 +113,12 @@ function ESX.OneSync.SpawnVehicle(vehicleModel, coords, heading, vehicleProperti
|
||||
end
|
||||
|
||||
CreateThread(function()
|
||||
local closestPlayer = ESX.OneSync.GetClosestPlayer(coords, 300)
|
||||
local closestPlayerFound = next(closestPlayer) ~= nil
|
||||
|
||||
vehicleType = vehicleType or (closestPlayerFound and ESX.GetVehicleType(vehicleModel, closestPlayer.id) or nil)
|
||||
if not vehicleType then
|
||||
local xPlayer = ESX.GetExtendedPlayers()[1]
|
||||
if xPlayer then
|
||||
vehicleType = ESX.GetVehicleType(vehicleModel, xPlayer.source)
|
||||
end
|
||||
end
|
||||
|
||||
if not vehicleType then
|
||||
return reject("No players found nearby to check vehicle type! Alternatively, you can specify the vehicle type manually.")
|
||||
@@ -122,9 +127,11 @@ function ESX.OneSync.SpawnVehicle(vehicleModel, coords, heading, vehicleProperti
|
||||
local createdVehicle = CreateVehicleServerSetter(vehicleModel, vehicleType, coords.x, coords.y, coords.z, heading)
|
||||
local tries = 0
|
||||
|
||||
local hasNetOwner = next(ESX.OneSync.GetClosestPlayer(coords, 300, nil, 0) or {}) ~= nil
|
||||
|
||||
while not createdVehicle or createdVehicle == 0
|
||||
or (closestPlayerFound and NetworkGetEntityOwner(createdVehicle) == -1)
|
||||
or (not closestPlayerFound and not DoesEntityExist(createdVehicle)) do
|
||||
or (hasNetOwner and NetworkGetEntityOwner(createdVehicle) == -1)
|
||||
or (not hasNetOwner and not DoesEntityExist(createdVehicle)) do
|
||||
Wait(200)
|
||||
tries = tries + 1
|
||||
if tries > 40 then
|
||||
|
||||
Reference in New Issue
Block a user