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
 |