2026-04-14 17:41:39 +02:00

218 lines
7.4 KiB
Lua

SetFlyThroughWindscreenParams(Config.ejectVelocity, Config.unknownEjectVelocity, Config.unknownModifier, Config.minDamage)
local seatbeltOn = false
local uiactive = false
local lastSpeed = 0.0
local ejected = false
local lastVehicle = 0
-- Beifahrer rausschleudern via Server
RegisterNetEvent('zseatbelt:ejectPassenger')
AddEventHandler('zseatbelt:ejectPassenger', function(speed, forwardX, forwardY, forwardZ)
-- Beifahrer mit Gurt bleibt sitzen
if seatbeltOn then return end
local ped = PlayerPedId()
if IsPedInAnyVehicle(ped, false) then
local veh = GetVehiclePedIsIn(ped, false)
SetEntityCoords(ped,
GetEntityCoords(veh) + vector3(forwardX, forwardY, forwardZ) * 0.5,
false, false, false, false
)
SetEntityVelocity(ped,
forwardX * speed * 1.2,
forwardY * speed * 1.2,
speed * 0.3
)
ApplyDamageToPed(ped, Config.minDamage, true)
ClearPedTasksImmediately(ped)
end
end)
-- Fahrzeug-Enter/Exit Reset
AddEventHandler('gameEventTriggered', function(name, args)
if name == 'CEventLeaveVehicle' or name == 'CEventVehicleEjected' then
lastVehicle = 0
lastSpeed = 0.0
ejected = false
end
end)
-- Reset beim Einsteigen
Citizen.CreateThread(function()
local wasIn = false
while true do
Citizen.Wait(100)
local ped = PlayerPedId()
local nowIn = IsPedInAnyVehicle(ped, false)
if nowIn and not wasIn then
Citizen.Wait(200)
lastVehicle = 0
lastSpeed = 0.0
ejected = false
end
wasIn = nowIn
end
end)
-- Hauptloop
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
local ped = PlayerPedId()
if IsPedInAnyVehicle(ped, false) then
local veh = GetVehiclePedIsIn(ped, false)
local currentSpeed = GetEntitySpeed(veh)
if veh ~= lastVehicle then
lastVehicle = veh
ejected = false
lastSpeed = 0.0
end
if seatbeltOn then
if Config.fixedWhileBuckled then
DisableControlAction(0, 75, true)
DisableControlAction(27, 75, true)
end
toggleUI(false)
else
toggleUI(true)
if not ejected and lastSpeed > Config.ejectVelocity then
local speedDrop = lastSpeed - currentSpeed
local bodyHealth = GetVehicleBodyHealth(veh) -- 0-1000
local healthDrop = 1000 - bodyHealth
-- Nur ejecten wenn starker Crash (viel Schaden UND starke Abbremsung)
if speedDrop > (Config.ejectVelocity * 0.5) and healthDrop > Config.minBodyDamage then
ejected = true
lastVehicle = 0
local forward = GetEntityForwardVector(veh)
local speed = lastSpeed
-- Fahrer rausschleudern
SetEntityCoords(ped,
GetEntityCoords(veh) + forward * 0.5,
false, false, false, false
)
SetEntityVelocity(ped,
forward.x * speed * 1.2,
forward.y * speed * 1.2,
speed * 0.3
)
ApplyDamageToPed(ped, Config.minDamage, true)
ClearPedTasksImmediately(ped)
-- Alle Beifahrer ohne Gurt rausschleudern
TriggerServerEvent('zseatbelt:checkPassengers',
speed,
forward.x, forward.y, forward.z
)
lastSpeed = 0.0
end
end
end
if not ejected then
lastSpeed = currentSpeed
end
else
lastVehicle = 0
lastSpeed = 0.0
ejected = false
if seatbeltOn then
seatbeltOn = false
SetFlyThroughWindscreenParams(Config.ejectVelocity, Config.unknownEjectVelocity, Config.unknownModifier, Config.minDamage)
SetPedConfigFlag(PlayerPedId(), 32, false)
end
toggleUI(false)
Citizen.Wait(200)
end
end
end)
function toggleSeatbelt(makeSound, toggle)
local ped = PlayerPedId()
if toggle == nil then
if seatbeltOn then
playSound("unbuckle")
SetFlyThroughWindscreenParams(Config.ejectVelocity, Config.unknownEjectVelocity, Config.unknownModifier, Config.minDamage)
SetPedConfigFlag(ped, 32, false)
exports['hex_4_hud']:Notify("Sicherheitsgurt", "Sicherheitsgurt abgeschnallt", "error", 3000)
else
playSound("buckle")
SetFlyThroughWindscreenParams(10000.0, 10000.0, 17.0, 500.0)
SetPedConfigFlag(ped, 32, true)
exports['hex_4_hud']:Notify("Sicherheitsgurt", "Sicherheitsgurt angeschnallt", "success", 3000)
end
seatbeltOn = not seatbeltOn
else
if toggle then
playSound("buckle")
SetFlyThroughWindscreenParams(10000.0, 10000.0, 17.0, 500.0)
SetPedConfigFlag(ped, 32, true)
exports['hex_4_hud']:Notify("Sicherheitsgurt", "Sicherheitsgurt angeschnallt", "success", 3000)
else
playSound("unbuckle")
SetFlyThroughWindscreenParams(Config.ejectVelocity, Config.unknownEjectVelocity, Config.unknownModifier, Config.minDamage)
SetPedConfigFlag(ped, 32, false)
exports['hex_4_hud']:Notify("Sicherheitsgurt", "Sicherheitsgurt abgeschnallt", "error", 3000)
end
seatbeltOn = toggle
end
end
function toggleUI(status)
if Config.showUnbuckledIndicator then
if uiactive ~= status then
uiactive = status
SendNUIMessage({type = status and "showindicator" or "hideindicator"})
end
end
end
function playSound(action)
local ped = PlayerPedId()
if Config.playSound then
if Config.playSoundForPassengers then
local veh = GetVehiclePedIsUsing(ped)
local maxpeds = GetVehicleMaxNumberOfPassengers(veh) - 2
local passengers = {}
for i = -1, maxpeds do
if not IsVehicleSeatFree(veh, i) then
local p = GetPlayerServerId(NetworkGetPlayerIndexFromPed(GetPedInVehicleSeat(veh, i)))
table.insert(passengers, p)
end
end
TriggerServerEvent('seatbelt:server:PlaySound', action, json.encode(passengers))
else
SendNUIMessage({type = action, volume = Config.volume})
end
end
end
RegisterCommand('toggleseatbelt', function()
local ped = PlayerPedId()
if IsPedInAnyVehicle(ped, false) then
local class = GetVehicleClass(GetVehiclePedIsIn(ped))
if class ~= 8 and class ~= 13 and class ~= 14 then
toggleSeatbelt(true)
end
end
end, false)
RegisterNetEvent('seatbelt:client:PlaySound')
AddEventHandler('seatbelt:client:PlaySound', function(action, volume)
SendNUIMessage({type = action, volume = volume})
end)
exports("status", function() return seatbeltOn end)
RegisterKeyMapping('toggleseatbelt', 'Toggle Seatbelt', 'keyboard', 'X')