254 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			254 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| seatbeltOn = false
 | |
| if Config.EnableSeatbelt then
 | |
|     lastSpeed = 0
 | |
|     function CheckVehicleHasSeatbelt(vehicle)
 | |
|         if DoesEntityExist(vehicle) then
 | |
|             local model = GetEntityModel(vehicle)
 | |
|             local modelName = GetDisplayNameFromVehicleModel(model):lower()
 | |
|             
 | |
|             -- Liste der Polizeimotorräder, die ausgeschlossen werden sollen
 | |
|             local policeBikes = {
 | |
|                 "policeb",
 | |
|                 "policeb2",
 | |
|                 "sheriff2",
 | |
|                 "mbu3rb",
 | |
|                 "mbu2rb",
 | |
|                 "mbu1flagrb",
 | |
|                 "bomberbike"
 | |
|                 -- Fügen Sie hier weitere Polizeimotorrad-Spawnnames hinzu, falls nötig
 | |
|             }
 | |
|             
 | |
|             -- Prüfe, ob das Fahrzeug ein Polizeimotorrad ist
 | |
|             for _, bikeName in ipairs(policeBikes) do
 | |
|                 if modelName == bikeName then
 | |
|                     return false
 | |
|                 end
 | |
|             end
 | |
| 
 | |
|             local class = GetVehicleClass(vehicle)
 | |
|             -- Exclude motorcycles (8)
 | |
|             if class == 8 then return false end
 | |
|             -- Cars (0-7), Industrial vehicles (9), SUVs (2), Service vehicles (17), 
 | |
|             -- Military vehicles (19), Commercial vehicles (20)
 | |
|             return class >= 0 and class <= 7 or class == 9 or class == 17 or class == 18 or class == 19 or class == 20
 | |
|         end
 | |
|         return false
 | |
|     end
 | |
| 
 | |
|     if Config.SeatbeltSound then
 | |
|         CreateThread(function()
 | |
|             while true do
 | |
|                 local ped = playerPed
 | |
|                 local car = GetVehiclePedIsIn(ped)
 | |
|                 if DoesEntityExist(car) and CheckVehicleHasSeatbelt(car) then
 | |
|                     if not seatbeltOn then
 | |
|                         local speed = GetEntitySpeed(car) * 3.6
 | |
|                         if speed > 100.0 then  -- Alarm nur über 100 km/h
 | |
|                             SendNUIMessage({
 | |
|                                 type="PLAY_SEATBELT_SOUND",
 | |
|                             })
 | |
|                         end
 | |
|                     end
 | |
|                 end
 | |
|                 Wait(2800)
 | |
|             end
 | |
|         end)
 | |
|     end
 | |
| 
 | |
|     local seatbeltSpam = 0
 | |
|     function playSound(action)
 | |
|         local ped = playerPed
 | |
|         local car = GetVehiclePedIsIn(ped)
 | |
|         local seatPlayerId = {}
 | |
|         if IsCar(car) then
 | |
|             for i=1, GetVehicleModelNumberOfSeats(GetEntityModel(car)) do
 | |
|                 if not IsVehicleSeatFree(car, i-2) then 
 | |
|                     local otherPlayerId = GetPedInVehicleSeat(car, i-2) 
 | |
|                     local playerHandle = NetworkGetPlayerIndexFromPed(otherPlayerId)
 | |
|                     local playerServerId = GetPlayerServerId(playerHandle)
 | |
|                     table.insert(seatPlayerId, playerServerId)
 | |
|                 end
 | |
|             end
 | |
|             if #seatPlayerId > 0 then TriggerServerEvent("seatbelt:server:PlaySound", action, seatPlayerId) end 
 | |
|         end
 | |
|     end
 | |
|     
 | |
|     RegisterNetEvent('seatbelt:client:PlaySound')
 | |
|     AddEventHandler('seatbelt:client:PlaySound', function(action, volume)
 | |
|         SendNUIMessage({type = action, volume = volume})
 | |
|     end)
 | |
| 
 | |
|     RegisterKeyMapping('seatbelt', 'Toggle Seatbelt', 'keyboard', Config.DefaultSeatbeltControlKey)
 | |
|     Citizen.CreateThread(function()
 | |
|         while true do
 | |
|             Citizen.Wait(1500)
 | |
|             if seatbeltSpam > 0 then
 | |
|                 Citizen.Wait(3500)
 | |
|                 seatbeltSpam = 0
 | |
|             end
 | |
|         end
 | |
|     end)
 | |
|     
 | |
|     RegisterNetEvent('codem-blackhudv2:seatbelt:toggle')
 | |
|     AddEventHandler('codem-blackhudv2:seatbelt:toggle', function(toggle)
 | |
|         local car = GetVehiclePedIsIn(playerPed)
 | |
|         if car ~= 0 and IsCar(car) then
 | |
|             if seatbeltSpam >= 3 then
 | |
|                 if Config.EnableSpamNotification then
 | |
|                     Config.Notification(Config.Notifications["spam"]["message"], Config.Notifications["spam"]["type"])
 | |
|                 end
 | |
|                 return
 | |
|             end        
 | |
|             seatbeltOn = toggle
 | |
|             if seatbeltOn then
 | |
|                 SendNUIMessage({
 | |
|                     type="update_seatbelt",
 | |
|                     toggle = true
 | |
|                 })                
 | |
|                 playSound("buckle")
 | |
|                 Config.Notification(Config.Notifications["took_seatbelt"]["message"], Config.Notifications["took_seatbelt"]["type"])
 | |
|             else
 | |
|                 SendNUIMessage({
 | |
|                     type="update_seatbelt",
 | |
|                     toggle = false
 | |
|                 })
 | |
|                 playSound("unbuckle")
 | |
|                 Config.Notification(Config.Notifications["took_off_seatbelt"]["message"], Config.Notifications["took_off_seatbelt"]["type"])
 | |
|             end              
 | |
|         end
 | |
|     end)
 | |
| 
 | |
|     RegisterCommand('seatbelt', function()
 | |
|         if IsPedHangingOnToVehicle(playerPed) then
 | |
|             return
 | |
|         end
 | |
|         local car = GetVehiclePedIsIn(playerPed)
 | |
|         if car ~= 0 and IsCar(car) then
 | |
|             if seatbeltSpam >= 3 then
 | |
|                 if Config.EnableSpamNotification then
 | |
|                     Config.Notification(Config.Notifications["spam"]["message"], Config.Notifications["spam"]["type"])
 | |
|                 end
 | |
|                 return
 | |
|             end        
 | |
|             seatbeltOn = not seatbeltOn
 | |
|             if seatbeltOn then
 | |
|                 SendNUIMessage({
 | |
|                     type="update_seatbelt",
 | |
|                     toggle = true
 | |
|                 })                
 | |
|                 playSound("buckle")
 | |
|                 Config.Notification(Config.Notifications["took_seatbelt"]["message"], Config.Notifications["took_seatbelt"]["type"])
 | |
|             else
 | |
|                 SendNUIMessage({
 | |
|                     type="update_seatbelt",
 | |
|                     toggle = false
 | |
|                 })
 | |
|                 playSound("unbuckle")
 | |
|                 Config.Notification(Config.Notifications["took_off_seatbelt"]["message"], Config.Notifications["took_off_seatbelt"]["type"])
 | |
|             end              
 | |
|         end
 | |
|     end, false)    
 | |
| 
 | |
|     function Fwv(entity)  
 | |
|         local hr = GetEntityHeading(entity) + 90.0
 | |
|         if hr < 0.0 then hr = 360.0 + hr end
 | |
|         hr = hr * 0.0174533
 | |
|         return { x = math.cos(hr) * 2.0, y = math.sin(hr) * 2.0 }
 | |
|     end
 | |
| 
 | |
|     function IsCar(veh)
 | |
|         if DoesEntityExist(veh) then
 | |
|             local model = GetEntityModel(veh)
 | |
|             local modelName = GetDisplayNameFromVehicleModel(model):lower()
 | |
|             
 | |
|             -- Liste der Polizeimotorräder
 | |
|             local policeBikes = {
 | |
|                 "policeb",
 | |
|                 "policeb2",
 | |
|                 "sheriff2",
 | |
|                 "mbu3rb",
 | |
|                 "mbu2rb",
 | |
|                 "mbu1flagrb",
 | |
|                 "bomberbike"
 | |
|                 -- Fügen Sie hier weitere Polizeimotorrad-Spawnnames hinzu, falls nötig
 | |
|             }
 | |
|             
 | |
|             -- Prüfe, ob das Fahrzeug ein Polizeimotorrad ist
 | |
|             for _, bikeName in ipairs(policeBikes) do
 | |
|                 if modelName == bikeName then
 | |
|                     return false
 | |
|                 end
 | |
|             end
 | |
| 
 | |
|             local vc = GetVehicleClass(veh)
 | |
|             if vc == 8 then return false end
 | |
|             return (vc >= 0 and vc <= 7) or vc == 9 or vc == 17 or vc == 18 or vc == 19 or vc == 20
 | |
|         end
 | |
|         return false
 | |
|     end  
 | |
| 
 | |
|     RegisterNetEvent('codem-blackhud-v2:client:EjectPlayer')
 | |
|     AddEventHandler('codem-blackhud-v2:client:EjectPlayer', function(velocity)
 | |
|         print("Ejecting player")
 | |
|         if not seatbeltOn then
 | |
|             local ped = PlayerPedId()
 | |
|             local coords = GetEntityCoords(ped)
 | |
|             local fw = Fwv(ped)
 | |
|             lastSpeed = 0
 | |
|             SetEntityCoords(ped, coords.x + fw.x, coords.y + fw.y, coords.z - .47, true, true, true)
 | |
|             SetEntityVelocity(ped, lastVelocity.x, lastVelocity.y, lastVelocity.z)
 | |
|             Wait(500)
 | |
|             ApplyDamageToPed(ped, math.random(10, 30), false)
 | |
|             SetPedToRagdoll(ped, 1000, 1000, 0, 0, 0, 0) 
 | |
|             seatbeltOn = false 
 | |
|             SendNUIMessage({
 | |
|                 type="update_seatbelt",
 | |
|                 toggle = false
 | |
|             })  
 | |
|         end
 | |
|     end)
 | |
|     
 | |
|     CreateThread(function()
 | |
|         while true do
 | |
|             local ped = PlayerPedId()
 | |
|             local Vehicle = GetVehiclePedIsIn(ped)
 | |
|             if IsPedInAnyVehicle(ped) and CheckVehicleHasSeatbelt(Vehicle) then
 | |
|                 local vehicle = Vehicle
 | |
|                 local speed = GetEntitySpeed(vehicle) * 3.6
 | |
|                 if lastSpeed > (Config.SeatBeltFlySpeed) and (lastSpeed - speed) > (speed * 1.7) then
 | |
|                     if not seatbeltOn then
 | |
|                         print("Ejecting player", lastSpeed, speed)
 | |
|                         local seatPlayerId = {}
 | |
|                         for i=1, GetVehicleModelNumberOfSeats(GetEntityModel(vehicle)) do                       
 | |
|                             if not IsVehicleSeatFree(vehicle, i-2) then 
 | |
|                                 local otherPlayerId = GetPedInVehicleSeat(vehicle, i-2) 
 | |
|                                 local playerHandle = NetworkGetPlayerIndexFromPed(otherPlayerId)
 | |
|                                 local playerServerId = GetPlayerServerId(playerHandle)
 | |
|                                 table.insert(seatPlayerId, playerServerId)
 | |
|                             end
 | |
|                         end
 | |
|                         seatbeltOn = false
 | |
|                         SendNUIMessage({
 | |
|                             type="update_seatbelt",
 | |
|                             toggle = false
 | |
|                         }) 
 | |
|                         if #seatPlayerId > 0 then TriggerServerEvent("codem-blackhud-v2:server:EjectPlayer", seatPlayerId) end       
 | |
|                     end
 | |
|                 end   
 | |
|                 lastSpeed = speed
 | |
|                 lastVelocity = GetEntityVelocity(vehicle)
 | |
|             else
 | |
|                 if seatbeltOn then
 | |
|                     seatbeltOn = false
 | |
|                     SendNUIMessage({
 | |
|                         type="update_seatbelt",
 | |
|                         toggle = false
 | |
|                     }) 
 | |
|                     lastSpeed = 0
 | |
|                 end
 | |
|                 Wait(2000)
 | |
|             end
 | |
|             Wait(150)
 | |
|         end
 | |
|     end)
 | |
| end
 | 
