381 lines
11 KiB
Lua
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)
|