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