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', "Trying to revive theirselves or other players", 2147483647, 'qb-ambulancejob' }) 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) 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)