Main/resources/[jobs]/[police]/ps-dispatch/client/eventhandlers.lua
2025-06-07 08:51:21 +02:00

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