149 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| IsSeatbeltOn = true
 | |
| local seatbeltThreadCreated = false
 | |
| 
 | |
| ---Can vehicle class have a seatbelt? Disabled for bikes, motorcycles boats etc by default
 | |
| ---@param vehicle integer
 | |
| ---@return boolean canHaveSeatbelt
 | |
| local function canVehicleClassHaveSeatbelt(vehicle)
 | |
|   if not Config.EnableSeatbelt then return false end
 | |
| 
 | |
|   if not vehicle or not DoesEntityExist(vehicle) then
 | |
|     return false
 | |
|   end
 | |
|   
 | |
|   local vehicleClass = GetVehicleClass(vehicle)
 | |
|   
 | |
|   local seatbeltCompatibleClasses = {
 | |
|     [0] = true,  -- Compacts
 | |
|     [1] = true,  -- Sedans
 | |
|     [2] = true,  -- SUVs
 | |
|     [3] = true,  -- Coupes
 | |
|     [4] = true,  -- Muscle
 | |
|     [5] = true,  -- Sports Classics
 | |
|     [6] = true,  -- Sports
 | |
|     [7] = true,  -- Super
 | |
|     [9] = true,  -- Off-road
 | |
|     [10] = true, -- Industrial
 | |
|     [11] = true, -- Utility
 | |
|     [12] = true, -- Vans
 | |
|     [17] = true, -- Service
 | |
|     [18] = true, -- Emergency
 | |
|     [19] = true, -- Military
 | |
|     [20] = true, -- Commercial
 | |
|   }
 | |
|   
 | |
|   -- Excluded veh classes
 | |
|   -- [8] = Motorcycles
 | |
|   -- [13] = Cycles/Bicycles
 | |
|   -- [14] = Boats
 | |
|   -- [15] = Helicopters
 | |
|   -- [16] = Planes
 | |
|   -- [21] = Trains
 | |
|   
 | |
|   return seatbeltCompatibleClasses[vehicleClass] or false
 | |
| end
 | |
| 
 | |
| ---Is a seatbelt allowed in this particular vehicle? Checks emergency vehicles, passenger seats etc
 | |
| ---@param vehicle integer
 | |
| ---@return boolean isSeatbeltAllowed
 | |
| local function isSeatbeltAllowed(vehicle)
 | |
|   if not Config.EnableSeatbelt then return false end
 | |
|   if not vehicle then return false end
 | |
|   
 | |
|   if not canVehicleClassHaveSeatbelt(vehicle) then
 | |
|     return false
 | |
|   end
 | |
| 
 | |
|   if Config.DisablePassengerSeatbelts and cache.seat ~= -1 then
 | |
|     return false
 | |
|   end
 | |
|   
 | |
|   if Config.DisableSeatbeltInEmergencyVehicles then
 | |
|     local vehicleClass = GetVehicleClass(vehicle)
 | |
|     if vehicleClass == 18 then -- Emergency vehicles
 | |
|       return false
 | |
|     end
 | |
|   end
 | |
|   
 | |
|   return true
 | |
| end
 | |
| 
 | |
| ---Simple built in seatbelt system using "fly through windscreen" natives
 | |
| ---@param willBeYeeted boolean
 | |
| local function setWhetherPedWillFlyThroughWindscreen(willBeYeeted)
 | |
|   SetFlyThroughWindscreenParams(
 | |
|     ((not willBeYeeted) and Config.MinSpeedMphEjectionSeatbeltOn or Config.MinSpeedMphEjectionSeatbeltOff) / 2.237,
 | |
|     1.0, 17.0, 10.0
 | |
|   )
 | |
|   SetPedConfigFlag(cache.ped, 32, willBeYeeted)
 | |
| end
 | |
| 
 | |
| ---Toggle seatbelt main function
 | |
| ---@param vehicle integer
 | |
| ---@param toggle boolean
 | |
| function ToggleSeatbelt(vehicle, toggle)
 | |
|   if not vehicle or not isSeatbeltAllowed(vehicle) then
 | |
|     return
 | |
|   end
 | |
| 
 | |
|   IsSeatbeltOn = toggle
 | |
|   LocalPlayer.state:set("seatbelt", toggle) -- for integrations with other scripts, like jg-stress-addon
 | |
| 
 | |
|   if Config.UseCustomSeatbeltIntegration then
 | |
|     Framework.Client.ToggleSeatbelt(vehicle, toggle)
 | |
|   else
 | |
|     setWhetherPedWillFlyThroughWindscreen(not toggle)
 | |
|   end
 | |
| end
 | |
| 
 | |
| ---Thread to disable exiting vehicle when seatbelt is on
 | |
| local function startSeatbeltExitPreventionThread()
 | |
|   if not Config.PreventExitWhileBuckled then return end
 | |
|   if seatbeltThreadCreated then return end
 | |
|   seatbeltThreadCreated = true
 | |
|   
 | |
|   CreateThread(function()  
 | |
|     while cache.vehicle do
 | |
|       if IsSeatbeltOn then
 | |
|         DisableControlAction(0, 75, true)
 | |
|         DisableControlAction(27, 75, true)
 | |
|       end
 | |
|       
 | |
|       Wait(1)
 | |
|     end
 | |
|     
 | |
|     seatbeltThreadCreated = false
 | |
|   end)
 | |
| end
 | |
| 
 | |
| ---When entering vehicle
 | |
| ---@param vehicle integer
 | |
| local function onEnterVehicle(vehicle)
 | |
|   if not isSeatbeltAllowed(vehicle) then
 | |
|     setWhetherPedWillFlyThroughWindscreen(false)
 | |
|     IsSeatbeltOn = true
 | |
|     return
 | |
|   end
 | |
| 
 | |
|   ToggleSeatbelt(vehicle, false) -- Seatbelt is off when entering vehicle
 | |
|   startSeatbeltExitPreventionThread()
 | |
| end
 | |
| 
 | |
| if Config.EnableSeatbelt then
 | |
|   lib.onCache("vehicle", onEnterVehicle)
 | |
| 
 | |
|   CreateThread(function()
 | |
|     if cache.vehicle then
 | |
|       onEnterVehicle(cache.vehicle)
 | |
|     end
 | |
|   end)
 | |
| end
 | |
| 
 | |
| -- Key mapping
 | |
| if Config.EnableSeatbelt and Config.SeatbeltKeybind then
 | |
|   RegisterCommand("toggle_seatbelt", function()
 | |
|     ToggleSeatbelt(cache.vehicle, not IsSeatbeltOn)
 | |
|   end, false)
 | |
| 
 | |
|   RegisterKeyMapping("toggle_seatbelt", "Toggle vehicle seatbelt", "keyboard", Config.SeatbeltKeybind or "B")
 | |
| end
 | 
