2026-04-14 17:41:39 +02:00

381 lines
11 KiB
Lua

local playersHealing, deadPlayers = {}, {}
if GetResourceState("esx_phone") ~= 'missing' then
TriggerEvent('esx_phone:registerNumber', 'ambulance', TranslateCap('alert_ambulance'), true, true)
end
if GetResourceState("esx_society") ~= 'missing' then
TriggerEvent('esx_society:registerSociety', 'ambulance', 'Ambulance', 'society_ambulance', 'society_ambulance',
'society_ambulance', { type = 'public' })
end
local function isDeadState(src, bool)
if not src or bool == nil then return end
Player(src).state:set('isDead', bool, true)
end
RegisterNetEvent('esx_ambulancejob:revive')
AddEventHandler('esx_ambulancejob:revive', function(playerId)
playerId = tonumber(playerId)
local xPlayer = source and ESX.GetPlayerFromId(source)
if xPlayer and xPlayer.job.name == 'ambulance' then
local xTarget = ESX.GetPlayerFromId(playerId)
if xTarget then
if deadPlayers[playerId] then
if Config.ReviveReward > 0 then
xPlayer.showNotification(TranslateCap('revive_complete_award', xTarget.name, Config.ReviveReward))
xPlayer.addMoney(Config.ReviveReward, "Revive Reward")
xTarget.triggerEvent('esx_ambulancejob:revive')
isDeadState(xTarget.source, false)
else
xPlayer.showNotification(TranslateCap('revive_complete', xTarget.name))
xTarget.triggerEvent('esx_ambulancejob:revive')
isDeadState(xTarget.source, false)
end
local Ambulance = ESX.GetExtendedPlayers("job", "ambulance")
for _, xPlayer in pairs(Ambulance) do
if xPlayer.job.name == 'ambulance' then
xPlayer.triggerEvent('esx_ambulancejob:PlayerNotDead', playerId)
end
end
deadPlayers[playerId] = nil
else
xPlayer.showNotification(TranslateCap('player_not_unconscious'))
end
else
xPlayer.showNotification(TranslateCap('revive_fail_offline'))
end
end
end)
AddEventHandler('txAdmin:events:healedPlayer', function(eventData)
if GetInvokingResource() ~= "monitor" or type(eventData) ~= "table" or type(eventData.id) ~= "number" then
return
end
if deadPlayers[eventData.id] then
TriggerClientEvent('esx_ambulancejob:revive', eventData.id)
local Ambulance = ESX.GetExtendedPlayers("job", "ambulance")
for _, xPlayer in pairs(Ambulance) do
if xPlayer.job.name == 'ambulance' then
xPlayer.triggerEvent('esx_ambulancejob:PlayerNotDead', eventData.id)
end
end
deadPlayers[eventData.id] = nil
end
end)
RegisterNetEvent('esx:onPlayerDeath')
AddEventHandler('esx:onPlayerDeath', function(data)
local source = source
deadPlayers[source] = 'dead'
local Ambulance = ESX.GetExtendedPlayers("job", "ambulance")
isDeadState(source, true)
for _, xPlayer in pairs(Ambulance) do
xPlayer.triggerEvent('esx_ambulancejob:PlayerDead', source)
end
end)
RegisterServerEvent('esx_ambulancejob:svsearch')
AddEventHandler('esx_ambulancejob:svsearch', function()
TriggerClientEvent('esx_ambulancejob:clsearch', -1, source)
end)
RegisterNetEvent('esx_ambulancejob:onPlayerDistress')
AddEventHandler('esx_ambulancejob:onPlayerDistress', function()
local source = source
local injuredPed = GetPlayerPed(source)
local injuredCoords = GetEntityCoords(injuredPed)
if deadPlayers[source] then
deadPlayers[source] = 'distress'
local Ambulance = ESX.GetExtendedPlayers("job", "ambulance")
for _, xPlayer in pairs(Ambulance) do
xPlayer.triggerEvent('esx_ambulancejob:PlayerDistressed', source, injuredCoords)
end
end
end)
RegisterNetEvent('esx:onPlayerSpawn')
AddEventHandler('esx:onPlayerSpawn', function()
local source = source
if deadPlayers[source] then
deadPlayers[source] = nil
isDeadState(source, false)
local Ambulance = ESX.GetExtendedPlayers("job", "ambulance")
for _, xPlayer in pairs(Ambulance) do
xPlayer.triggerEvent('esx_ambulancejob:PlayerNotDead', source)
end
end
end)
AddEventHandler('esx:playerDropped', function(playerId, reason)
if deadPlayers[playerId] then
deadPlayers[playerId] = nil
isDeadState(playerId, false)
local Ambulance = ESX.GetExtendedPlayers("job", "ambulance")
for _, xPlayer in pairs(Ambulance) do
if xPlayer.job.name == 'ambulance' then
xPlayer.triggerEvent('esx_ambulancejob:PlayerNotDead', playerId)
end
end
end
end)
RegisterNetEvent('esx_ambulancejob:heal')
AddEventHandler('esx_ambulancejob:heal', function(target, type)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.job.name == 'ambulance' then
TriggerClientEvent('esx_ambulancejob:heal', target, type)
end
end)
RegisterNetEvent('esx_ambulancejob:putInVehicle')
AddEventHandler('esx_ambulancejob:putInVehicle', function(target)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.job.name == 'ambulance' then
TriggerClientEvent('esx_ambulancejob:putInVehicle', target)
end
end)
ESX.RegisterServerCallback('esx_ambulancejob:removeItemsAfterRPDeath', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
if Config.OxInventory and Config.RemoveItemsAfterRPDeath then
exports.ox_inventory:ClearInventory(xPlayer.source)
return cb()
end
if Config.RemoveCashAfterRPDeath then
if xPlayer.getMoney() > 0 then
xPlayer.removeMoney(xPlayer.getMoney(), "Death")
end
if xPlayer.getAccount('black_money').money > 0 then
xPlayer.setAccountMoney('black_money', 0, "Death")
end
end
if Config.RemoveItemsAfterRPDeath then
for i = 1, #xPlayer.inventory, 1 do
if xPlayer.inventory[i].count > 0 then
xPlayer.setInventoryItem(xPlayer.inventory[i].name, 0)
end
end
end
if Config.OxInventory then return cb() end
local playerLoadout = {}
if Config.RemoveWeaponsAfterRPDeath then
for i = 1, #xPlayer.loadout, 1 do
xPlayer.removeWeapon(xPlayer.loadout[i].name)
end
else -- save weapons & restore em' since spawnmanager removes them
for i = 1, #xPlayer.loadout, 1 do
table.insert(playerLoadout, xPlayer.loadout[i])
end
-- give back wepaons after a couple of seconds
CreateThread(function()
Wait(5000)
for i = 1, #playerLoadout, 1 do
if playerLoadout[i].label ~= nil then
xPlayer.addWeapon(playerLoadout[i].name, playerLoadout[i].ammo)
end
end
end)
end
cb()
end)
if Config.EarlyRespawnFine then
ESX.RegisterServerCallback('esx_ambulancejob:checkBalance', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
local bankBalance = xPlayer.getAccount('bank').money
cb(bankBalance >= Config.EarlyRespawnFineAmount)
end)
RegisterNetEvent('esx_ambulancejob:payFine')
AddEventHandler('esx_ambulancejob:payFine', function()
local xPlayer = ESX.GetPlayerFromId(source)
local fineAmount = Config.EarlyRespawnFineAmount
xPlayer.showNotification(TranslateCap('respawn_bleedout_fine_msg', ESX.Math.GroupDigits(fineAmount)))
xPlayer.removeAccountMoney('bank', fineAmount, "Respawn Fine")
end)
end
ESX.RegisterServerCallback('esx_ambulancejob:getItemAmount', function(source, cb, item)
local xPlayer = ESX.GetPlayerFromId(source)
local quantity = xPlayer.getInventoryItem(item).count
cb(quantity)
end)
ESX.RegisterServerCallback('esx_ambulancejob:buyJobVehicle', function(source, cb, vehicleProps, type)
local xPlayer = ESX.GetPlayerFromId(source)
local price = getPriceFromHash(vehicleProps.model, xPlayer.job.grade_name, type)
-- vehicle model not found
if price == 0 then
cb(false)
else
if xPlayer.getMoney() >= price then
xPlayer.removeMoney(price, "Job Vehicle Purchase")
MySQL.insert('INSERT INTO owned_vehicles (owner, vehicle, plate, type, job, `stored`) VALUES (?, ?, ?, ?, ?, ?)',
{ xPlayer.identifier, json.encode(vehicleProps), vehicleProps.plate, type, xPlayer.job.name, true },
function(rowsChanged)
cb(true)
end)
else
cb(false)
end
end
end)
ESX.RegisterServerCallback('esx_ambulancejob:storeNearbyVehicle', function(source, cb, plates)
local xPlayer = ESX.GetPlayerFromId(source)
local plate = MySQL.scalar.await('SELECT plate FROM owned_vehicles WHERE owner = ? AND plate IN (?) AND job = ?',
{ xPlayer.identifier, plates, xPlayer.job.name })
if plate then
MySQL.update('UPDATE owned_vehicles SET `stored` = true WHERE owner = ? AND plate = ? AND job = ?',
{ xPlayer.identifier, plate, xPlayer.job.name },
function(rowsChanged)
if rowsChanged == 0 then
cb(false)
else
cb(plate)
end
end)
else
cb(false)
end
end)
function getPriceFromHash(vehicleHash, jobGrade, type)
local vehicles = Config.AuthorizedVehicles[type][jobGrade]
for i = 1, #vehicles do
local vehicle = vehicles[i]
if joaat(vehicle.model) == vehicleHash then
return vehicle.price
end
end
return 0
end
RegisterNetEvent('esx_ambulancejob:removeItem')
AddEventHandler('esx_ambulancejob:removeItem', function(item)
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.removeInventoryItem(item, 1)
if item == 'bandage' then
xPlayer.showNotification(TranslateCap('used_bandage'))
elseif item == 'medikit' then
xPlayer.showNotification(TranslateCap('used_medikit'))
end
end)
RegisterNetEvent('esx_ambulancejob:giveItem')
AddEventHandler('esx_ambulancejob:giveItem', function(itemName, amount)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.job.name ~= 'ambulance' then
print(('[^2WARNING^7] Player ^5%s^7 Tried Giving Themselves -> ^5' .. itemName .. '^7!'):format(xPlayer.source))
return
elseif (itemName ~= 'medikit' and itemName ~= 'bandage') then
print(('[^2WARNING^7] Player ^5%s^7 Tried Giving Themselves -> ^5' .. itemName .. '^7!'):format(xPlayer.source))
return
end
if xPlayer.canCarryItem(itemName, amount) then
xPlayer.addInventoryItem(itemName, amount)
else
xPlayer.showNotification(TranslateCap('max_item'))
end
end)
ESX.RegisterCommand('revive', 'admin', function(xPlayer, args, showError)
args.playerId.triggerEvent('esx_ambulancejob:revive')
end, true, { help = TranslateCap('revive_help'), validate = true, arguments = {
{ name = 'playerId', help = 'The player id', type = 'player' }
} })
ESX.RegisterCommand('reviveall', "admin", function(xPlayer, args, showError)
TriggerClientEvent('esx_ambulancejob:revive', -1)
end, false)
ESX.RegisterUsableItem('medikit', function(source)
if not playersHealing[source] then
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.removeInventoryItem('medikit', 1)
playersHealing[source] = true
TriggerClientEvent('esx_ambulancejob:useItem', source, 'medikit')
Wait(10000)
playersHealing[source] = nil
end
end)
ESX.RegisterUsableItem('bandage', function(source)
if not playersHealing[source] then
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.removeInventoryItem('bandage', 1)
playersHealing[source] = true
TriggerClientEvent('esx_ambulancejob:useItem', source, 'bandage')
Wait(10000)
playersHealing[source] = nil
end
end)
ESX.RegisterServerCallback('esx_ambulancejob:getDeadPlayers', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.job.name == "ambulance" then
cb(deadPlayers)
end
end)
ESX.RegisterServerCallback('esx_ambulancejob:getDeathStatus', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
MySQL.scalar('SELECT is_dead FROM users WHERE identifier = ?', { xPlayer.identifier }, function(isDead)
cb(isDead)
end)
end)
RegisterNetEvent('esx_ambulancejob:setDeathStatus')
AddEventHandler('esx_ambulancejob:setDeathStatus', function(isDead)
local xPlayer = ESX.GetPlayerFromId(source)
if type(isDead) == 'boolean' then
MySQL.update('UPDATE users SET is_dead = ? WHERE identifier = ?', { isDead, xPlayer.identifier })
isDeadState(source, isDead)
if not isDead then
local Ambulance = ESX.GetExtendedPlayers("job", "ambulance")
for _, xPlayer in pairs(Ambulance) do
xPlayer.triggerEvent('esx_ambulancejob:PlayerNotDead', source)
end
end
end
end)