2026-04-14 17:41:39 +02:00

213 lines
8.6 KiB
Lua

if Config.AutomaticBedSpawning then
AddEventHandler('entityCreated', function(entity)
if not DoesEntityExist(entity) then return end
-- Check if entity is a vehicle
if GetEntityType(entity) ~= 2 then return end
-- Ensure the entity is a flatbed
local vehicleModel = GetEntityModel(entity)
if not Config.FlatBedModels[vehicleModel] then return end
-- Ensure the flatbed does not already have a bed prop.
local entityBedNetId = Entity(entity).state.bedProp
if (entityBedNetId and DoesEntityExist(NetworkGetEntityFromNetworkId(entityBedNetId))) then return end
Entity(entity).state.bedProp = nil
-- Make the owner create the bed
local flatbedNetId = NetworkGetNetworkIdFromEntity(entity)
TriggerEvent('gs_flatbed:CreateBedEntity', flatbedNetId)
end)
end
AddEventHandler('entityRemoved', function(entity)
-- Check if entity is a vehicle
if GetEntityType(entity) ~= 2 then return end
-- Ensure the entity is a flatbed
local vehicleModel = GetEntityModel(entity)
if not Config.FlatBedModels[vehicleModel] then return end
-- Check if bed net is set
local entityBedNetId = Entity(entity).state.bedProp
if not entityBedNetId then return end
-- Delete the bed if it exists.
local entityBed = NetworkGetEntityFromNetworkId(entityBedNetId)
if not DoesEntityExist(entityBed) then return end
DeleteEntity(entityBed)
end)
RegisterNetEvent('gs_flatbed:CreateBedEntity')
AddEventHandler('gs_flatbed:CreateBedEntity', function(flatbedNetId)
-- Ensure the flatbedVehicle is an existing entity.
local flatbedVehicle = NetworkGetEntityFromNetworkId(flatbedNetId)
if not DoesEntityExist(flatbedVehicle) then return end
-- Ensure the entity is a flatbed
local vehicleModel = GetEntityModel(flatbedVehicle)
if not Config.FlatBedModels[vehicleModel] then return end
-- Ensure the flatbed does not already have a bed prop.
local bedNetId = Entity(flatbedVehicle).state.bedProp
if bedNetId then
local existingBedEntity = NetworkGetEntityFromNetworkId(bedNetId)
if DoesEntityExist(existingBedEntity) then return end
end
-- Create the bed flatbedVehicle, we spawn it under the flatbed to avoid floating flatbeds in case something goes wrong.
local vehicleCoords = GetEntityCoords(flatbedVehicle)
local vehicleRotation = GetEntityRotation(flatbedVehicle)
local bedEntity = CreateObjectNoOffset(Config.BedModel, vehicleCoords.x, vehicleCoords.y, vehicleCoords.z - 3.0, true, 0, 1)
-- Wait for the bed to exist, and attach it to the flatbed
while not DoesEntityExist(bedEntity) do
Wait(10)
end
SetEntityRotation(bedEntity, vehicleRotation)
-- Get the entity owner of both entities.
local flatbedVehicleEntityOwner = NetworkGetEntityOwner(flatbedVehicle)
local bedEntityOwner = NetworkGetEntityOwner(bedEntity)
-- Wait for a maximum of 500 ms to give time for entity ownership to settle.
local startTime = GetGameTimer()
while (flatbedVehicleEntityOwner ~= bedEntityOwner and GetGameTimer() - startTime < 500) do
Wait(100)
end
-- If the entity owners still do not match and if the server is not the owner, we abort this spawn attempt. The client will retry in 1 second.
if flatbedVehicleEntityOwner ~= bedEntityOwner and bedEntityOwner ~= -1 then
DeleteEntity(bedEntity)
return
end
bedNetId = NetworkGetNetworkIdFromEntity(bedEntity)
-- Re-validate both entities before setting statebags (race condition protection).
if not DoesEntityExist(flatbedVehicle) then
DeleteEntity(bedEntity)
return
end
if not DoesEntityExist(bedEntity) then
return
end
-- Set all the statebags
Entity(flatbedVehicle).state.bedProp = bedNetId
Entity(flatbedVehicle).state.attachedVehicle = -1
Entity(flatbedVehicle).state.bedLowered = false
Entity(flatbedVehicle).state.bedMoving = false
-- Attach the bed to the flatbed on the entity owner.
local flatbedOwner = NetworkGetEntityOwner(flatbedVehicle)
if flatbedOwner ~= -1 then
TriggerClientEvent('gs_flatbed:AttachBedToVehicle', flatbedOwner, flatbedNetId, bedNetId)
end
end)
RegisterNetEvent('gs_flatbed:DeleteBedEntity')
AddEventHandler('gs_flatbed:DeleteBedEntity', function(flatbedNetId, bedNetId)
-- Ensure the bedEntity exists
local bedEntity = NetworkGetEntityFromNetworkId(bedNetId)
if DoesEntityExist(bedEntity) then
-- Ensure the bedEntity is a flatbed base prop
if GetEntityModel(bedEntity) ~= GetHashKey(Config.BedModel) then return end
DeleteEntity(bedEntity)
end
-- Ensure the flatbedVehicle is a flatbed
local flatbedVehicle = NetworkGetEntityFromNetworkId(flatbedNetId)
if not DoesEntityExist(flatbedVehicle) then return end
-- Ensure the entity is a flatbed
local vehicleModel = GetEntityModel(flatbedVehicle)
if not Config.FlatBedModels[vehicleModel] then return end
-- Delete any existing bed prop.
local bedNetId = Entity(flatbedVehicle).state.bedProp
if bedNetId then
local bedEntity = NetworkGetEntityFromNetworkId(bedNetId)
if DoesEntityExist(bedEntity) then
DeleteEntity(bedEntity)
end
end
Entity(flatbedVehicle).state.bedProp = nil
end)
RegisterNetEvent('gs_flatbed:LowerFlatbed')
AddEventHandler('gs_flatbed:LowerFlatbed', function(flatbedNetId)
-- Ensure the flatbedVehicle exists
local flatbedVehicle = NetworkGetEntityFromNetworkId(flatbedNetId)
if not DoesEntityExist(flatbedVehicle) then return end
-- Ensure the flatbedVehicle is a flatbed
local vehicleModel = GetEntityModel(flatbedVehicle)
if not Config.FlatBedModels[vehicleModel] then return end
-- Re-validate entity before getting owner
if not DoesEntityExist(flatbedVehicle) then return end
local flatbedOwner = NetworkGetEntityOwner(flatbedVehicle)
if flatbedOwner ~= -1 then
TriggerClientEvent('gs_flatbed:LowerFlatbedClient', flatbedOwner, flatbedNetId)
end
end)
RegisterNetEvent('gs_flatbed:RaiseFlatbed')
AddEventHandler('gs_flatbed:RaiseFlatbed', function(flatbedNetId)
-- Ensure the flatbedVehicle exists
local flatbedVehicle = NetworkGetEntityFromNetworkId(flatbedNetId)
if not DoesEntityExist(flatbedVehicle) then return end
-- Ensure the flatbedVehicle is a flatbed
local vehicleModel = GetEntityModel(flatbedVehicle)
if not Config.FlatBedModels[vehicleModel] then return end
-- Re-validate entity before getting owner
if not DoesEntityExist(flatbedVehicle) then return end
local flatbedOwner = NetworkGetEntityOwner(flatbedVehicle)
if flatbedOwner ~= -1 then
TriggerClientEvent('gs_flatbed:RaiseFlatbedClient', flatbedOwner, flatbedNetId)
end
end)
RegisterNetEvent('gs_flatbed:AttachVehicle')
AddEventHandler('gs_flatbed:AttachVehicle', function(flatbedNetId, vehicleToAttachNetId)
-- Ensure the flatbedVehicle exists
local flatbedVehicle = NetworkGetEntityFromNetworkId(flatbedNetId)
if not DoesEntityExist(flatbedVehicle) then return end
-- Ensure the other flatbedVehicle exists as well
local attachEntity = NetworkGetEntityFromNetworkId(vehicleToAttachNetId)
if not DoesEntityExist(attachEntity) then return end
-- Ensure the flatbedVehicle is a flatbed
local vehicleModel = GetEntityModel(flatbedVehicle)
if not Config.FlatBedModels[vehicleModel] then return end
Entity(flatbedVehicle).state.attachedVehicle = vehicleToAttachNetId -- Update the state server-sided (as Flatbed owner can be a different player)
local attachOwner = NetworkGetEntityOwner(attachEntity)
if attachOwner ~= -1 then
TriggerClientEvent('gs_flatbed:AttachVehicleClient', attachOwner, flatbedNetId, vehicleToAttachNetId)
end
end)
RegisterNetEvent('gs_flatbed:DetachVehicle')
AddEventHandler('gs_flatbed:DetachVehicle', function(flatbedNetId, vehicleToAttachNetId)
-- Ensure the flatbedVehicle exists
local flatbedVehicle = NetworkGetEntityFromNetworkId(flatbedNetId)
if not DoesEntityExist(flatbedVehicle) then return end
-- Ensure the other flatbedVehicle exists as well
local attachEntity = NetworkGetEntityFromNetworkId(vehicleToAttachNetId)
if not DoesEntityExist(attachEntity) then return end
-- Ensure the flatbedVehicle is a flatbed
local vehicleModel = GetEntityModel(flatbedVehicle)
if not Config.FlatBedModels[vehicleModel] then return end
Entity(flatbedVehicle).state.attachedVehicle = -1
local attachOwner = NetworkGetEntityOwner(attachEntity)
if attachOwner ~= -1 then
TriggerClientEvent('gs_flatbed:DetachVehicleClient', attachOwner, vehicleToAttachNetId)
end
end)