213 lines
8.6 KiB
Lua
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) |