218 lines
7.4 KiB
Lua
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')
|