1
0
Fork 0
forked from Simnation/Main
Main/resources/[carscripts]/AdvancedParking/client/client.lua
2025-08-07 14:38:30 +02:00

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)