193 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
 | 
						|
-- script status on startup
 | 
						|
local enabled = true
 | 
						|
 | 
						|
-- update vehicle on server side
 | 
						|
local function UpdateVehicle(vehicle, reason)
 | 
						|
	local tuning = GetVehicleTuning(vehicle)
 | 
						|
	LogDebug("Updating vehicle \"%s\" (%s)", tuning[1], reason)
 | 
						|
 | 
						|
	TriggerServerEvent(
 | 
						|
		"AP:updateVehicle", 
 | 
						|
		NetworkGetNetworkIdFromEntity(vehicle), 
 | 
						|
		GetEntityModel(vehicle), 
 | 
						|
		tuning, 
 | 
						|
		GetVehicleStatus(vehicle), 
 | 
						|
		GetVehicleExtraValues(vehicle),
 | 
						|
		reason
 | 
						|
	)
 | 
						|
end
 | 
						|
exports("UpdateVehicle", function(vehicle)
 | 
						|
	if (not DoesEntityExist(vehicle) or not NetworkGetEntityIsNetworked(vehicle)) then return end
 | 
						|
 | 
						|
	UpdateVehicle(vehicle, "Resource \"" .. GetInvokingResource() .. "\"")
 | 
						|
end)
 | 
						|
 | 
						|
-- when a player entered a vehicle
 | 
						|
local function EnteredVehicle(vehicle)
 | 
						|
	if (not DoesEntityExist(vehicle) or not NetworkGetEntityIsNetworked(vehicle) or IsVehicleBlacklisted(vehicle)) then return end
 | 
						|
 | 
						|
	if (GetVehicleTypeRaw(vehicle) == 2) then
 | 
						|
		TriggerServerEvent("AP:enteredTrailer", NetworkGetNetworkIdFromEntity(vehicle))
 | 
						|
	end
 | 
						|
 | 
						|
	UpdateVehicle(vehicle, "Player enter")
 | 
						|
end
 | 
						|
 | 
						|
-- when a player left a vehicle
 | 
						|
local function LeftVehicle(vehicle)
 | 
						|
	if (not DoesEntityExist(vehicle) or not NetworkGetEntityIsNetworked(vehicle) or IsVehicleBlacklisted(vehicle)) then return end
 | 
						|
 | 
						|
	if (GetVehicleTypeRaw(vehicle) == 2) then
 | 
						|
		TriggerServerEvent("AP:leftTrailer", NetworkGetNetworkIdFromEntity(vehicle))
 | 
						|
	end
 | 
						|
 | 
						|
	UpdateVehicle(vehicle, "Player exit")
 | 
						|
end
 | 
						|
 | 
						|
-- localising loop natives
 | 
						|
local IsPedInAnyVehicle, GetVehiclePedIsIn, GetVehicleTrailerVehicle = IsPedInAnyVehicle, GetVehiclePedIsIn, GetVehicleTrailerVehicle
 | 
						|
 | 
						|
local isInVehicle = false
 | 
						|
AddEventHandler("gameEventTriggered", function(eventName, eventData)
 | 
						|
	if (not enabled or isInVehicle or eventName ~= "CEventNetworkPlayerEnteredVehicle") then return end
 | 
						|
 | 
						|
	-- entered vehicle
 | 
						|
	isInVehicle = true
 | 
						|
 | 
						|
	local playerPed = PlayerPedId()
 | 
						|
	local vehicle = eventData[2]
 | 
						|
	local trailer = nil
 | 
						|
 | 
						|
	EnteredVehicle(vehicle)
 | 
						|
 | 
						|
	while (IsPedInAnyVehicle(playerPed)) do
 | 
						|
		-- check for instant vehicle switch
 | 
						|
		local newVehicle = GetVehiclePedIsIn(playerPed)
 | 
						|
		if (vehicle ~= newVehicle) then
 | 
						|
			LeftVehicle(vehicle)
 | 
						|
			EnteredVehicle(newVehicle)
 | 
						|
 | 
						|
			vehicle = newVehicle
 | 
						|
		end
 | 
						|
 | 
						|
		-- check for trailer
 | 
						|
		local hasTrailer, newTrailer = GetVehicleTrailerVehicle(vehicle)
 | 
						|
		if (hasTrailer) then
 | 
						|
			if (trailer ~= newTrailer) then
 | 
						|
				LeftVehicle(trailer)
 | 
						|
				EnteredVehicle(newTrailer)
 | 
						|
			end
 | 
						|
 | 
						|
			trailer = newTrailer
 | 
						|
		elseif (trailer) then
 | 
						|
			LeftVehicle(trailer)
 | 
						|
 | 
						|
			trailer = nil
 | 
						|
		end
 | 
						|
 | 
						|
		Wait(0)
 | 
						|
	end
 | 
						|
 | 
						|
	-- left vehicle
 | 
						|
	LeftVehicle(vehicle)
 | 
						|
	if (trailer) then
 | 
						|
		LeftVehicle(trailer)
 | 
						|
	end
 | 
						|
 | 
						|
	isInVehicle = false
 | 
						|
end)
 | 
						|
 | 
						|
-- setting tuning
 | 
						|
AddStateBagChangeHandler("ap_data", nil, function(bagName, key, value, _unused, replicated)
 | 
						|
	if (bagName:find("entity") == nil or value == nil) then return end
 | 
						|
 | 
						|
	local networkIdString = bagName:gsub("entity:", "")
 | 
						|
	local networkId = tonumber(networkIdString)
 | 
						|
	if (not WaitUntilEntityWithNetworkIdExists(networkId, 5000)) then return end
 | 
						|
 | 
						|
	local vehicle = NetworkGetEntityFromNetworkId(networkId)
 | 
						|
	if (not WaitUntilPlayerEqualsEntityOwner(vehicle, 5000)) then return end
 | 
						|
 | 
						|
	if (Cleanup.submergedVehicles and IsEntityInWater(vehicle) and GetEntitySubmergedLevel(vehicle) >= 0.5) then
 | 
						|
		local vehicleType = GetVehicleTypeRaw(vehicle)
 | 
						|
		if (vehicleType ~= 5 and vehicleType ~= 15) then
 | 
						|
			LogDebug("\"%s\" is submerged and will be deleted.", value[1][1])
 | 
						|
 | 
						|
			DeleteSubmergedVehicle(vehicle)
 | 
						|
 | 
						|
			return
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	LogDebug("Setting properties for \"%s\"", value[1][1])
 | 
						|
 | 
						|
	SetVehicleTuning(vehicle, value[1])
 | 
						|
	SetVehicleStatus(vehicle, value[2])
 | 
						|
	SetVehicleExtraValues(vehicle, value[3])
 | 
						|
 | 
						|
	SetEntityCoordsNoOffset(vehicle, value[4].x, value[4].y, value[4].z, false, false, true)
 | 
						|
	SetEntityRotation(vehicle, value[5].x, value[5].y, value[5].z)
 | 
						|
 | 
						|
	TriggerEvent("AP:vehicleSpawned", vehicle)
 | 
						|
end)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
-- notification for delete timer
 | 
						|
RegisterNetEvent("AP:showNotification", function(text)
 | 
						|
	ShowNotification(text)
 | 
						|
end)
 | 
						|
 | 
						|
-- enables/disables the client sending enter/left events
 | 
						|
local function Enable(enable)
 | 
						|
	assert(enable ~= nil and type(enable) == "boolean", "Parameter \"enable\" must be a bool!")
 | 
						|
 | 
						|
	enabled = enable
 | 
						|
end
 | 
						|
exports("Enable", Enable)
 | 
						|
 | 
						|
-- export for force freezing vehicles
 | 
						|
if (forceUnfreezeVehicles) then
 | 
						|
	local function FreezeVehicle(vehicle, freeze)
 | 
						|
		TriggerServerEvent("AP:freezeVehicle", NetworkGetNetworkIdFromEntity(vehicle), freeze)
 | 
						|
	end
 | 
						|
	exports("FreezeVehicle", FreezeVehicle)
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
 | 
						|
local damageUpdates = {}
 | 
						|
AddEventHandler("gameEventTriggered", function (name, args)
 | 
						|
	if (name ~= "CEventNetworkEntityDamage") then return end
 | 
						|
 | 
						|
	local vehicle = args[1]
 | 
						|
	if (not DoesEntityExist(vehicle) or not IsEntityAVehicle(vehicle)) then return end
 | 
						|
	if (not NetworkGetEntityIsNetworked(vehicle)) then return end
 | 
						|
 | 
						|
	local id = Entity(vehicle).state.ap_id
 | 
						|
	if (not id) then return end
 | 
						|
 | 
						|
	local plate = GetVehicleNumberPlateText(vehicle)
 | 
						|
 | 
						|
	LogDebug("Damage detected on vehicle \"%s\" (%s)", plate, id)
 | 
						|
 | 
						|
	if (damageUpdates[vehicle]) then
 | 
						|
		damageUpdates[vehicle] = GetGameTimer() + 5000
 | 
						|
		return
 | 
						|
	end
 | 
						|
 | 
						|
	damageUpdates[vehicle] = GetGameTimer() + 5000
 | 
						|
 | 
						|
	while (damageUpdates[vehicle] > GetGameTimer()) do
 | 
						|
		Wait(0)
 | 
						|
	end
 | 
						|
 | 
						|
	damageUpdates[vehicle] = nil
 | 
						|
 | 
						|
	if (not DoesEntityExist(vehicle) or NetworkGetEntityOwner(vehicle) ~= PlayerId()) then return end
 | 
						|
 | 
						|
	LogDebug("Sending damage update to server for vehicle \"%s\" (%s)", plate, id)
 | 
						|
 | 
						|
	TriggerServerEvent("AP:onVehicleDamage", NetworkGetNetworkIdFromEntity(vehicle), GetVehicleStatus(vehicle))
 | 
						|
end)
 |