-- 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)