164 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local timer = {}
 | |
| 
 | |
| ---@param name string -- The name of the timer
 | |
| ---@param action function -- The function to execute when the timer is up
 | |
| ---@vararg any -- Arguments to pass to the action function
 | |
| local function WaitTimer(name, action, ...)
 | |
|     if not Config.DefaultAlerts[name] then return end
 | |
| 
 | |
|     if not timer[name] then
 | |
|         timer[name] = true
 | |
|         action(...)
 | |
|         Wait(Config.DefaultAlertsDelay * 1000)
 | |
|         timer[name] = false
 | |
|     end
 | |
| end
 | |
| 
 | |
| ---@param witnesses table | Array of peds that witnessed the event
 | |
| ---@param ped number | Ped ID to check
 | |
| ---@return boolean | Returns true if the ped is in the witnesses table
 | |
| local function isPedAWitness(witnesses, ped)
 | |
|     for k, v in pairs(witnesses) do
 | |
|         if v == ped then
 | |
|             return true
 | |
|         end
 | |
|     end
 | |
|     return false
 | |
| end
 | |
| 
 | |
| ---@param ped number | Ped ID to check
 | |
| ---@return boolean | Returns true if the ped is holding a whitelisted gun
 | |
| local function BlacklistedWeapon(ped)
 | |
| 	for i = 1, #Config.WeaponWhitelist do
 | |
| 		local weaponHash = joaat(Config.WeaponWhitelist[i])
 | |
| 		if GetSelectedPedWeapon(ped) == weaponHash then
 | |
| 			return true -- Is a whitelisted weapon
 | |
| 		end
 | |
| 	end
 | |
| 	return false -- Is not a whitelisted weapon
 | |
| end
 | |
| 
 | |
| AddEventHandler('CEventGunShot', function(witnesses, ped)
 | |
|     if IsPedCurrentWeaponSilenced(cache.ped) then return end
 | |
|     if inNoDispatchZone then return end
 | |
|     if BlacklistedWeapon(cache.ped) then return end
 | |
| 
 | |
|     WaitTimer('Shooting', function()
 | |
|         if cache.ped ~= ped then return end
 | |
| 
 | |
|         if PlayerData.job.type == 'leo' then
 | |
|             if not Config.Debug then
 | |
|                 return
 | |
|             end
 | |
|         end
 | |
| 
 | |
|         if inHuntingZone then
 | |
|             exports['ps-dispatch']:Hunting()
 | |
|             return
 | |
|         end
 | |
| 
 | |
|         if witnesses and not isPedAWitness(witnesses, ped) then return end
 | |
| 
 | |
|         if cache.vehicle then
 | |
|             exports['ps-dispatch']:VehicleShooting()
 | |
|         else
 | |
|             exports['ps-dispatch']:Shooting()
 | |
|         end
 | |
|     end)
 | |
| end)
 | |
| 
 | |
| AddEventHandler('CEventShockingSeenMeleeAction', function(witnesses, ped)
 | |
|     WaitTimer('Melee', function()
 | |
|         if cache.ped ~= ped then return end
 | |
|         if witnesses and not isPedAWitness(witnesses, ped) then return end
 | |
|         if not IsPedInMeleeCombat(ped) then return end
 | |
| 
 | |
|         exports['ps-dispatch']:Fight()
 | |
|     end)
 | |
| end)
 | |
| 
 | |
| AddEventHandler('CEventPedJackingMyVehicle', function(_, ped)
 | |
|     WaitTimer('Autotheft', function()
 | |
|         if cache.ped ~= ped then return end
 | |
|         local vehicle = GetVehiclePedIsUsing(ped, true)
 | |
|         exports['ps-dispatch']:CarJacking(vehicle)
 | |
|     end)
 | |
| end)
 | |
| 
 | |
| AddEventHandler('CEventShockingCarAlarm', function(_, ped)
 | |
|     WaitTimer('Autotheft', function()
 | |
|         if cache.ped ~= ped then return end
 | |
|         local vehicle = GetVehiclePedIsUsing(ped, true)
 | |
|         exports['ps-dispatch']:VehicleTheft(vehicle)
 | |
|     end)
 | |
| end)
 | |
| 
 | |
| AddEventHandler('CEventExplosionHeard', function(witnesses, ped)
 | |
|     if witnesses and not isPedAWitness(witnesses, ped) then return end
 | |
|     WaitTimer('Explosion', function()
 | |
|         exports['ps-dispatch']:Explosion()
 | |
|     end)
 | |
| end)
 | |
| 
 | |
| AddEventHandler('gameEventTriggered', function(name, args)
 | |
|     if name ~= 'CEventNetworkEntityDamage' then return end
 | |
|     local victim = args[1]
 | |
|     local isDead = args[6] == 1
 | |
|     WaitTimer('PlayerDowned', function()
 | |
|         if not victim or victim ~= cache.ped then return end
 | |
|         if not isDead then return end
 | |
| 
 | |
|         if PlayerData.job.type == 'leo' then
 | |
|             exports['ps-dispatch']:OfficerDown()
 | |
|         elseif PlayerData.job.type == 'ems' then
 | |
|             exports['ps-dispatch']:EmsDown()
 | |
|         else
 | |
|             exports['ps-dispatch']:InjuriedPerson()
 | |
|         end
 | |
|     end)
 | |
| end)
 | |
| 
 | |
| local SpeedingEvents = {
 | |
|     'CEventShockingCarChase',
 | |
|     'CEventShockingDrivingOnPavement',
 | |
|     'CEventShockingBicycleOnPavement',
 | |
|     'CEventShockingMadDriverBicycle',
 | |
|     'CEventShockingMadDriverExtreme',
 | |
|     'CEventShockingEngineRevved',
 | |
|     'CEventShockingInDangerousVehicle'
 | |
| }
 | |
| 
 | |
| local exemptVehicleClass = {
 | |
|     [15] = true, -- Helicopters
 | |
|     [16] = true, -- Planes
 | |
| }
 | |
| 
 | |
| local SpeedTrigger = 0
 | |
| for i = 1, #SpeedingEvents do
 | |
|     local event = SpeedingEvents[i]
 | |
|     AddEventHandler(event, function(_, ped)
 | |
|         WaitTimer('Speeding', function()
 | |
|             local currentTime = GetGameTimer()
 | |
|             if currentTime - SpeedTrigger < 10000 then
 | |
|                 return
 | |
|             end
 | |
|             if cache.ped ~= ped then return end
 | |
| 
 | |
|             if PlayerData.job.type == 'leo' then
 | |
|                 if not Config.Debug then
 | |
|                     return
 | |
|                 end
 | |
|             end
 | |
| 
 | |
|             local vehicleClass = GetVehicleClass(cache.vehicle)
 | |
|             if exemptVehicleClass[vehicleClass] then return end
 | |
| 
 | |
|             if GetEntitySpeed(cache.vehicle) * 3.6 < (80 + math.random(0, 20)) then return end
 | |
| 
 | |
|             if cache.ped ~= GetPedInVehicleSeat(cache.vehicle, -1) then return end
 | |
| 
 | |
|             exports['ps-dispatch']:SpeedingVehicle()
 | |
|             SpeedTrigger = GetGameTimer()
 | |
|         end)
 | |
|     end)
 | |
| end
 | 
