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
|