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:
Fezz
2025-07-13 11:54:10 +01:00
committed by GitHub
2 changed files with 24 additions and 15 deletions
+2
View File
@@ -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
+22 -15
View File
@@ -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