2024-12-29 20:06:22 +00:00
local PlayerInjuries = { }
local PlayerWeaponWounds = { }
local QBCore = exports [ ' qb-core ' ] : GetCoreObject ( )
local doctorCount = 0
local doctorCalled = false
local Doctors = { }
-- Events
-- Compatibility with txAdmin Menu's heal options.
-- This is an admin only server side event that will pass the target player id or -1.
AddEventHandler ( ' txAdmin:events:healedPlayer ' , function ( eventData )
if GetInvokingResource ( ) ~= " monitor " or type ( eventData ) ~= " table " or type ( eventData.id ) ~= " number " then
return
end
TriggerClientEvent ( ' hospital:client:Revive ' , eventData.id )
TriggerClientEvent ( " hospital:client:HealInjuries " , eventData.id , " full " )
end )
RegisterNetEvent ( ' hospital:server:SendToBed ' , function ( bedId , isRevive )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
TriggerClientEvent ( ' hospital:client:SendToBed ' , src , bedId , Config.Locations [ " beds " ] [ bedId ] , isRevive )
TriggerClientEvent ( ' hospital:client:SetBed ' , - 1 , bedId , true )
Player.Functions . RemoveMoney ( " bank " , Config.BillCost , " respawned-at-hospital " )
exports [ ' qb-management ' ] : AddMoney ( " ambulance " , Config.BillCost )
TriggerClientEvent ( ' hospital:client:SendBillEmail ' , src , Config.BillCost )
end )
RegisterNetEvent ( ' hospital:server:RespawnAtHospital ' , function ( )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player.PlayerData . metadata [ " injail " ] > 0 then
for k , v in pairs ( Config.Locations [ " jailbeds " ] ) do
if not v.taken then
TriggerClientEvent ( ' hospital:client:SendToBed ' , src , k , v , true )
TriggerClientEvent ( ' hospital:client:SetBed2 ' , - 1 , k , true )
if Config.WipeInventoryOnRespawn then
Player.Functions . ClearInventory ( )
MySQL.Async . execute ( ' UPDATE players SET inventory = ? WHERE citizenid = ? ' , { json.encode ( { } ) , Player.PlayerData . citizenid } )
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.possessions_taken ' ) , ' error ' )
end
Player.Functions . RemoveMoney ( " bank " , Config.BillCost , " respawned-at-hospital " )
exports [ ' qb-management ' ] : AddMoney ( " ambulance " , Config.BillCost )
TriggerClientEvent ( ' hospital:client:SendBillEmail ' , src , Config.BillCost )
return
end
end
TriggerClientEvent ( ' hospital:client:SendToBed ' , src , 1 , Config.Locations [ " jailbeds " ] [ 1 ] , true )
TriggerClientEvent ( ' hospital:client:SetBed ' , - 1 , 1 , true )
if Config.WipeInventoryOnRespawn then
Player.Functions . ClearInventory ( )
MySQL.Async . execute ( ' UPDATE players SET inventory = ? WHERE citizenid = ? ' , { json.encode ( { } ) , Player.PlayerData . citizenid } )
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.possessions_taken ' ) , ' error ' )
end
Player.Functions . RemoveMoney ( " bank " , Config.BillCost , " respawned-at-hospital " )
exports [ ' qb-management ' ] : AddMoney ( " ambulance " , Config.BillCost )
TriggerClientEvent ( ' hospital:client:SendBillEmail ' , src , Config.BillCost )
else
for k , v in pairs ( Config.Locations [ " beds " ] ) do
if not v.taken then
TriggerClientEvent ( ' hospital:client:SendToBed ' , src , k , v , true )
TriggerClientEvent ( ' hospital:client:SetBed ' , - 1 , k , true )
if Config.WipeInventoryOnRespawn then
Player.Functions . ClearInventory ( )
MySQL.update ( ' UPDATE players SET inventory = ? WHERE citizenid = ? ' , { json.encode ( { } ) , Player.PlayerData . citizenid } )
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.possessions_taken ' ) , ' error ' )
end
Player.Functions . RemoveMoney ( " bank " , Config.BillCost , " respawned-at-hospital " )
exports [ ' qb-management ' ] : AddMoney ( " ambulance " , Config.BillCost )
TriggerClientEvent ( ' hospital:client:SendBillEmail ' , src , Config.BillCost )
return
end
end
--print("All beds were full, placing in first bed as fallback")
TriggerClientEvent ( ' hospital:client:SendToBed ' , src , 1 , Config.Locations [ " beds " ] [ 1 ] , true )
TriggerClientEvent ( ' hospital:client:SetBed ' , - 1 , 1 , true )
if Config.WipeInventoryOnRespawn then
Player.Functions . ClearInventory ( )
MySQL.update ( ' UPDATE players SET inventory = ? WHERE citizenid = ? ' , { json.encode ( { } ) , Player.PlayerData . citizenid } )
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.possessions_taken ' ) , ' error ' )
end
Player.Functions . RemoveMoney ( " bank " , Config.BillCost , " respawned-at-hospital " )
exports [ ' qb-management ' ] : AddMoney ( " ambulance " , Config.BillCost )
TriggerClientEvent ( ' hospital:client:SendBillEmail ' , src , Config.BillCost )
end
end )
RegisterNetEvent ( ' hospital:server:ambulanceAlert ' , function ( text )
local src = source
local ped = GetPlayerPed ( src )
local coords = GetEntityCoords ( ped )
local players = QBCore.Functions . GetQBPlayers ( )
for _ , v in pairs ( players ) do
if v.PlayerData . job.name == ' ambulance ' and v.PlayerData . job.onduty then
TriggerClientEvent ( ' hospital:client:ambulanceAlert ' , v.PlayerData . source , coords , text )
end
end
end )
RegisterNetEvent ( ' hospital:server:LeaveBed ' , function ( id )
TriggerClientEvent ( ' hospital:client:SetBed ' , - 1 , id , false )
end )
RegisterNetEvent ( ' hospital:server:SyncInjuries ' , function ( data )
local src = source
PlayerInjuries [ src ] = data
end )
RegisterNetEvent ( ' hospital:server:SetWeaponDamage ' , function ( data )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player then
PlayerWeaponWounds [ Player.PlayerData . source ] = data
end
end )
RegisterNetEvent ( ' hospital:server:RestoreWeaponDamage ' , function ( )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
PlayerWeaponWounds [ Player.PlayerData . source ] = nil
end )
RegisterNetEvent ( ' hospital:server:SetDeathStatus ' , function ( isDead )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player then
Player.Functions . SetMetaData ( " isdead " , isDead )
end
end )
RegisterNetEvent ( ' hospital:server:SetLaststandStatus ' , function ( bool )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player then
Player.Functions . SetMetaData ( " inlaststand " , bool )
end
end )
RegisterNetEvent ( ' hospital:server:SetArmor ' , function ( amount )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player then
Player.Functions . SetMetaData ( " armor " , amount )
end
end )
RegisterNetEvent ( ' hospital:server:TreatWounds ' , function ( playerId )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
local Patient = QBCore.Functions . GetPlayer ( playerId )
if Patient then
if Player.PlayerData . job.name == " ambulance " then
Player.Functions . RemoveItem ( ' bandage ' , 1 )
TriggerClientEvent ( ' inventory:client:ItemBox ' , src , QBCore.Shared . Items [ ' bandage ' ] , " remove " )
TriggerClientEvent ( " hospital:client:HealInjuries " , Patient.PlayerData . source , " full " )
end
end
end )
RegisterNetEvent ( ' hospital:server:AddDoctor ' , function ( job )
if job == ' ambulance ' then
local src = source
doctorCount = doctorCount + 1
TriggerClientEvent ( " hospital:client:SetDoctorCount " , - 1 , doctorCount )
Doctors [ src ] = true
end
end )
RegisterNetEvent ( ' hospital:server:RemoveDoctor ' , function ( job )
if job == ' ambulance ' then
local src = source
doctorCount = doctorCount - 1
TriggerClientEvent ( " hospital:client:SetDoctorCount " , - 1 , doctorCount )
Doctors [ src ] = nil
end
end )
AddEventHandler ( " playerDropped " , function ( )
local src = source
if Doctors [ src ] then
doctorCount = doctorCount - 1
TriggerClientEvent ( " hospital:client:SetDoctorCount " , - 1 , doctorCount )
Doctors [ src ] = nil
end
end )
RegisterNetEvent ( " hospital:server:addTrunkItems " , function ( plate , items ) exports [ " ps-inventory " ] : addTrunkItems ( plate , items ) end )
RegisterNetEvent ( ' hospital:server:RevivePlayer ' , function ( playerId , isOldMan )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
local Patient = QBCore.Functions . GetPlayer ( playerId )
local oldMan = isOldMan or false
if Patient then
if Player.PlayerData . job.name == " ambulance " or QBCore.Functions . HasItem ( src , " firstaid " , 1 ) then
if oldMan then
if Player.Functions . RemoveMoney ( " cash " , 5000 , " revived-player " ) then
Player.Functions . RemoveItem ( ' firstaid ' , 1 )
TriggerClientEvent ( ' inventory:client:ItemBox ' , src , QBCore.Shared . Items [ ' firstaid ' ] , " remove " )
TriggerClientEvent ( ' hospital:client:Revive ' , Patient.PlayerData . source )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.not_enough_money ' ) , " error " )
end
else
Player.Functions . RemoveItem ( ' firstaid ' , 1 )
TriggerClientEvent ( ' inventory:client:ItemBox ' , src , QBCore.Shared . Items [ ' firstaid ' ] , " remove " )
TriggerClientEvent ( ' hospital:client:Revive ' , Patient.PlayerData . source )
end
else
MySQL.insert ( ' INSERT INTO bans (name, license, discord, ip, reason, expire, bannedby) VALUES (?, ?, ?, ?, ?, ?, ?) ' , {
GetPlayerName ( src ) ,
QBCore.Functions . GetIdentifier ( src , ' license ' ) ,
QBCore.Functions . GetIdentifier ( src , ' discord ' ) ,
' 0.0.0.0 ' ,
2024-12-30 10:15:34 +00:00
" Trying to revive theirselves or other players " ,
2024-12-29 20:06:22 +00:00
2147483647 ,
' qb-ambulancejob '
} )
2024-12-30 10:15:34 +00:00
TriggerEvent ( ' qb-log:server:CreateLog ' , ' ambulancejob ' , ' Player Banned ' , ' red ' , string.format ( ' %s was banned by %s for %s ' , GetPlayerName ( src ) , ' qb-ambulancejob ' , " Trying to revive theirselves or other players " ) , true )
2024-12-29 20:06:22 +00:00
DropPlayer ( src , ' You were permanently banned by the server for: Exploiting ' )
end
end
end )
RegisterNetEvent ( ' hospital:server:SendDoctorAlert ' , function ( )
local src = source
if not doctorCalled then
doctorCalled = true
local players = QBCore.Functions . GetQBPlayers ( )
for _ , v in pairs ( players ) do
if v.PlayerData . job.name == ' ambulance ' and v.PlayerData . job.onduty then
TriggerClientEvent ( ' QBCore:Notify ' , v.PlayerData . source , Lang : t ( ' info.dr_needed ' ) , ' ambulance ' )
end
end
SetTimeout ( Config.DocCooldown * 60000 , function ( )
doctorCalled = false
end )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , ' Læge er allerede underrettet ' , ' error ' )
end
end )
RegisterNetEvent ( ' hospital:server:UseFirstAid ' , function ( targetId )
local src = source
local Target = QBCore.Functions . GetPlayer ( targetId )
if Target then
TriggerClientEvent ( ' hospital:client:CanHelp ' , targetId , src )
end
end )
RegisterNetEvent ( ' hospital:server:CanHelp ' , function ( helperId , canHelp )
local src = source
if canHelp then
TriggerClientEvent ( ' hospital:client:HelpPerson ' , helperId , src )
else
TriggerClientEvent ( ' QBCore:Notify ' , helperId , Lang : t ( ' error.cant_help ' ) , " error " )
end
end )
RegisterNetEvent ( ' hospital:server:removeBandage ' , function ( )
local Player = QBCore.Functions . GetPlayer ( source )
if not Player then return end
Player.Functions . RemoveItem ( ' bandage ' , 1 )
end )
RegisterNetEvent ( ' hospital:server:removeIfaks ' , function ( )
local Player = QBCore.Functions . GetPlayer ( source )
if not Player then return end
Player.Functions . RemoveItem ( ' ifaks ' , 1 )
end )
RegisterNetEvent ( ' hospital:server:removePainkillers ' , function ( )
local Player = QBCore.Functions . GetPlayer ( source )
if not Player then return end
Player.Functions . RemoveItem ( ' painkillers ' , 1 )
end )
RegisterNetEvent ( ' hospital:server:resetHungerThirst ' , function ( )
local Player = QBCore.Functions . GetPlayer ( source )
if not Player then return end
Player.Functions . SetMetaData ( ' hunger ' , 100 )
Player.Functions . SetMetaData ( ' thirst ' , 100 )
TriggerClientEvent ( ' hud:client:UpdateNeeds ' , source , 100 , 100 )
end )
-- Callbacks
QBCore.Functions . CreateCallback ( ' hospital:GetDoctors ' , function ( _ , cb )
local amount = 0
local players = QBCore.Functions . GetQBPlayers ( )
for _ , v in pairs ( players ) do
if v.PlayerData . job.name == ' ambulance ' and v.PlayerData . job.onduty then
amount = amount + 1
end
end
cb ( amount )
end )
QBCore.Functions . CreateCallback ( ' hospital:GetPlayerStatus ' , function ( _ , cb , playerId )
local Player = QBCore.Functions . GetPlayer ( playerId )
local injuries = { }
injuries [ " WEAPONWOUNDS " ] = { }
if Player then
if PlayerInjuries [ Player.PlayerData . source ] then
if ( PlayerInjuries [ Player.PlayerData . source ] . isBleeding > 0 ) then
injuries [ " BLEED " ] = PlayerInjuries [ Player.PlayerData . source ] . isBleeding
end
for k , _ in pairs ( PlayerInjuries [ Player.PlayerData . source ] . limbs ) do
if PlayerInjuries [ Player.PlayerData . source ] . limbs [ k ] . isDamaged then
injuries [ k ] = PlayerInjuries [ Player.PlayerData . source ] . limbs [ k ]
end
end
end
if PlayerWeaponWounds [ Player.PlayerData . source ] then
for k , v in pairs ( PlayerWeaponWounds [ Player.PlayerData . source ] ) do
injuries [ " WEAPONWOUNDS " ] [ k ] = v
end
end
end
cb ( injuries )
end )
QBCore.Functions . CreateCallback ( ' hospital:GetPlayerBleeding ' , function ( source , cb )
local src = source
if PlayerInjuries [ src ] and PlayerInjuries [ src ] . isBleeding then
cb ( PlayerInjuries [ src ] . isBleeding )
else
cb ( nil )
end
end )
-- Commands
--[[QBCore.Commands.Add('911e', Lang:t('info.ems_report'), {{name = 'message', help = Lang:t('info.message_sent')}}, false, function(source, args)
local src = source
local message
if args [ 1 ] then message = table.concat ( args , " " ) else message = Lang : t ( ' info.civ_call ' ) end
local ped = GetPlayerPed ( src )
local coords = GetEntityCoords ( ped )
local players = QBCore.Functions . GetQBPlayers ( )
for _ , v in pairs ( players ) do
if v.PlayerData . job.name == ' ambulance ' and v.PlayerData . job.onduty then
TriggerClientEvent ( ' hospital:client:ambulanceAlert ' , v.PlayerData . source , coords , message )
end
end
end ) ] ]
QBCore.Commands . Add ( " status " , Lang : t ( ' info.check_health ' ) , { } , false , function ( source , _ )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player.PlayerData . job.name == " ambulance " then
TriggerClientEvent ( " hospital:client:CheckStatus " , src )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.not_ems ' ) , " error " )
end
end )
QBCore.Commands . Add ( " heal " , Lang : t ( ' info.heal_player ' ) , { } , false , function ( source , _ )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player.PlayerData . job.name == " ambulance " then
TriggerClientEvent ( " hospital:client:TreatWounds " , src )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.not_ems ' ) , " error " )
end
end )
QBCore.Commands . Add ( " revivep " , Lang : t ( ' info.revive_player ' ) , { } , false , function ( source , _ )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player.PlayerData . job.name == " ambulance " then
TriggerClientEvent ( " hospital:client:RevivePlayer " , src )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.not_ems ' ) , " error " )
end
end )
QBCore.Commands . Add ( " revive " , Lang : t ( ' info.revive_player_a ' ) , { { name = " id " , help = Lang : t ( ' info.player_id ' ) } } , false , function ( source , args )
local src = source
if args [ 1 ] then
local Player = QBCore.Functions . GetPlayer ( tonumber ( args [ 1 ] ) )
if Player then
TriggerClientEvent ( ' hospital:client:Revive ' , Player.PlayerData . source )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.not_online ' ) , " error " )
end
else
TriggerClientEvent ( ' hospital:client:Revive ' , src )
end
end , " admin " )
QBCore.Commands . Add ( " setpain " , Lang : t ( ' info.pain_level ' ) , { { name = " id " , help = Lang : t ( ' info.player_id ' ) } } , false , function ( source , args )
local src = source
if args [ 1 ] then
local Player = QBCore.Functions . GetPlayer ( tonumber ( args [ 1 ] ) )
if Player then
TriggerClientEvent ( ' hospital:client:SetPain ' , Player.PlayerData . source )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.not_online ' ) , " error " )
end
else
TriggerClientEvent ( ' hospital:client:SetPain ' , src )
end
end , " admin " )
QBCore.Commands . Add ( " kill " , Lang : t ( ' info.kill ' ) , { { name = " id " , help = Lang : t ( ' info.player_id ' ) } } , false , function ( source , args )
local src = source
if args [ 1 ] then
local Player = QBCore.Functions . GetPlayer ( tonumber ( args [ 1 ] ) )
if Player then
TriggerClientEvent ( ' hospital:client:KillPlayer ' , Player.PlayerData . source )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.not_online ' ) , " error " )
end
else
TriggerClientEvent ( ' hospital:client:KillPlayer ' , src )
end
end , " admin " )
QBCore.Commands . Add ( ' aheal ' , Lang : t ( ' info.heal_player_a ' ) , { { name = ' id ' , help = Lang : t ( ' info.player_id ' ) } } , false , function ( source , args )
local src = source
if args [ 1 ] then
local Player = QBCore.Functions . GetPlayer ( tonumber ( args [ 1 ] ) )
if Player then
TriggerClientEvent ( ' hospital:client:adminHeal ' , Player.PlayerData . source )
else
TriggerClientEvent ( ' QBCore:Notify ' , src , Lang : t ( ' error.not_online ' ) , " error " )
end
else
TriggerClientEvent ( ' hospital:client:adminHeal ' , src )
end
end , ' admin ' )
-- Items
QBCore.Functions . CreateUseableItem ( " ifaks " , function ( source , item )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player.Functions . GetItemByName ( item.name ) ~= nil then
TriggerClientEvent ( " hospital:client:UseIfaks " , src )
end
end )
QBCore.Functions . CreateUseableItem ( " bandage " , function ( source , item )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player.Functions . GetItemByName ( item.name ) ~= nil then
TriggerClientEvent ( " hospital:client:UseBandage " , src )
end
end )
QBCore.Functions . CreateUseableItem ( " painkillers " , function ( source , item )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player.Functions . GetItemByName ( item.name ) ~= nil then
TriggerClientEvent ( " hospital:client:UsePainkillers " , src )
end
end )
QBCore.Functions . CreateUseableItem ( " firstaid " , function ( source , item )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if Player.Functions . GetItemByName ( item.name ) ~= nil then
TriggerClientEvent ( " hospital:client:UseFirstAid " , src )
end
end )
exports ( ' GetDoctorCount ' , function ( ) return doctorCount end )