0.0.1
This commit is contained in:
380
resources/[esx_addons]/esx_ambulancejob/server/main.lua
Normal file
380
resources/[esx_addons]/esx_ambulancejob/server/main.lua
Normal file
@@ -0,0 +1,380 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user