forked from Simnation/Main
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)
|