This commit is contained in:
Nordi98 2025-08-07 14:38:30 +02:00
parent 88ffeb3375
commit 87623c8379
27 changed files with 2865 additions and 1705 deletions

View file

@ -0,0 +1,193 @@

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