QBCore = exports['qb-core']:GetCoreObject() local getOutDict = 'switch@franklin@bed' local getOutAnim = 'sleep_getup_rubeyes' local canLeaveBed = true local bedOccupying = nil local bedObject = nil local bedOccupyingData = nil local closestBed = nil local doctorCount = 0 local CurrentDamageList = {} local cam = nil local playerArmor = nil inBedDict = "anim@gangops@morgue@table@" inBedAnim = "body_search" isInHospitalBed = false isBleeding = 0 bleedTickTimer, advanceBleedTimer = 0, 0 fadeOutTimer, blackoutTimer = 0, 0 legCount = 0 armcount = 0 headCount = 0 playerHealth = nil isDead = false isStatusChecking = false statusChecks = {} statusCheckTime = 0 healAnimDict = "mini@cpr@char_a@cpr_str" healAnim = "cpr_pumpchest" injured = {} BodyParts = { ['HEAD'] = { label = Lang:t('body.head'), causeLimp = false, isDamaged = false, severity = 0 }, ['NECK'] = { label = Lang:t('body.neck'), causeLimp = false, isDamaged = false, severity = 0 }, ['SPINE'] = { label = Lang:t('body.spine'), causeLimp = true, isDamaged = false, severity = 0 }, ['UPPER_BODY'] = { label = Lang:t('body.upper_body'), causeLimp = false, isDamaged = false, severity = 0 }, ['LOWER_BODY'] = { label = Lang:t('body.lower_body'), causeLimp = true, isDamaged = false, severity = 0 }, ['LARM'] = { label = Lang:t('body.left_arm'), causeLimp = false, isDamaged = false, severity = 0 }, ['LHAND'] = { label = Lang:t('body.left_hand'), causeLimp = false, isDamaged = false, severity = 0 }, ['LFINGER'] = { label = Lang:t('body.left_fingers'), causeLimp = false, isDamaged = false, severity = 0 }, ['LLEG'] = { label = Lang:t('body.left_leg'), causeLimp = true, isDamaged = false, severity = 0 }, ['LFOOT'] = { label = Lang:t('body.left_foot'), causeLimp = true, isDamaged = false, severity = 0 }, ['RARM'] = { label = Lang:t('body.right_arm'), causeLimp = false, isDamaged = false, severity = 0 }, ['RHAND'] = { label = Lang:t('body.right_hand'), causeLimp = false, isDamaged = false, severity = 0 }, ['RFINGER'] = { label = Lang:t('body.right_fingers'), causeLimp = false, isDamaged = false, severity = 0 }, ['RLEG'] = { label = Lang:t('body.right_leg'), causeLimp = true, isDamaged = false, severity = 0 }, ['RFOOT'] = { label = Lang:t('body.right_foot'), causeLimp = true, isDamaged = false, severity = 0 }, } -- Functions local function GetAvailableBed(bedId) local pos = GetEntityCoords(PlayerPedId()) local retval = nil if bedId == nil then for k, _ in pairs(Config.Locations["beds"]) do if not Config.Locations["beds"][k].taken then if #(pos - vector3(Config.Locations["beds"][k].coords.x, Config.Locations["beds"][k].coords.y, Config.Locations["beds"][k].coords.z)) < 500 then retval = k end end end else if not Config.Locations["beds"][bedId].taken then if #(pos - vector3(Config.Locations["beds"][bedId].coords.x, Config.Locations["beds"][bedId].coords.y, Config.Locations["beds"][bedId].coords.z)) < 500 then retval = bedId end end end return retval end local function GetDamagingWeapon(ped) for k, v in pairs(Config.Weapons) do if HasPedBeenDamagedByWeapon(ped, k, 0) then return v end end return nil end local function IsDamagingEvent(damageDone, weapon) local luck = math.random(100) local multi = damageDone / Config.HealthDamage return luck < (Config.HealthDamage * multi) or (damageDone >= Config.ForceInjury or multi > Config.MaxInjuryChanceMulti or Config.ForceInjuryWeapons[weapon]) end local function DoLimbAlert() if not isDead and not InLaststand then if #injured > 0 then local limbDamageMsg = '' if #injured <= Config.AlertShowInfo then for k, v in pairs(injured) do limbDamageMsg = limbDamageMsg..Lang:t('info.pain_message', {limb = v.label, severity = Config.WoundStates[v.severity]}) if k < #injured then limbDamageMsg = limbDamageMsg .. " | " end end else limbDamageMsg = Lang:t('info.many_places') end QBCore.Functions.Notify(limbDamageMsg, "primary") end end end local function DoBleedAlert() if not isDead and tonumber(isBleeding) > 0 then QBCore.Functions.Notify(Lang:t('info.bleed_alert', {bleedstate = Config.BleedingStates[tonumber(isBleeding)].label}), "error") end end local function ApplyBleed(level) if isBleeding ~= 4 then if isBleeding + level > 4 then isBleeding = 4 else isBleeding = isBleeding + level end DoBleedAlert() end end local function SetClosestBed() local pos = GetEntityCoords(PlayerPedId(), true) local current = nil local dist = nil for k, _ in pairs(Config.Locations["beds"]) do local dist2 = #(pos - vector3(Config.Locations["beds"][k].coords.x, Config.Locations["beds"][k].coords.y, Config.Locations["beds"][k].coords.z)) if current then if dist2 < dist then current = k dist = dist2 end else dist = dist2 current = k end end if current ~= closestBed and not isInHospitalBed then closestBed = current end end local function IsInjuryCausingLimp() for _, v in pairs(BodyParts) do if v.causeLimp and v.isDamaged then return true end end return false end local function ProcessRunStuff(ped) if IsInjuryCausingLimp() then RequestAnimSet("move_m@injured") while not HasAnimSetLoaded("move_m@injured") do Wait(0) end SetPedMovementClipset(ped, "move_m@injured", 1 ) SetPlayerSprint(PlayerId(), false) end end function ResetPartial() for _, v in pairs(BodyParts) do if v.isDamaged and v.severity <= 2 then v.isDamaged = false v.severity = 0 end end for k, v in pairs(injured) do if v.severity <= 2 then v.severity = 0 table.remove(injured, k) end end if isBleeding <= 2 then isBleeding = 0 bleedTickTimer = 0 advanceBleedTimer = 0 fadeOutTimer = 0 blackoutTimer = 0 end TriggerServerEvent('hospital:server:SyncInjuries', { limbs = BodyParts, isBleeding = tonumber(isBleeding) }) ProcessRunStuff(PlayerPedId()) DoLimbAlert() DoBleedAlert() TriggerServerEvent('hospital:server:SyncInjuries', { limbs = BodyParts, isBleeding = tonumber(isBleeding) }) end function ResetAll() isBleeding = 0 bleedTickTimer = 0 advanceBleedTimer = 0 fadeOutTimer = 0 blackoutTimer = 0 onDrugs = 0 wasOnDrugs = false onPainKiller = 0 wasOnPainKillers = false injured = {} for _, v in pairs(BodyParts) do v.isDamaged = false v.severity = 0 end TriggerServerEvent('hospital:server:SyncInjuries', { limbs = BodyParts, isBleeding = tonumber(isBleeding) }) CurrentDamageList = {} TriggerServerEvent('hospital:server:SetWeaponDamage', CurrentDamageList) ProcessRunStuff(PlayerPedId()) DoLimbAlert() DoBleedAlert() TriggerServerEvent('hospital:server:SyncInjuries', { limbs = BodyParts, isBleeding = tonumber(isBleeding) }) TriggerServerEvent("hospital:server:resetHungerThirst") end exports('ResetAll', ResetAll) local function loadAnimDict(dict) while(not HasAnimDictLoaded(dict)) do RequestAnimDict(dict) Wait(1) end end local function SetBedCam() isInHospitalBed = true canLeaveBed = false local player = PlayerPedId() DoScreenFadeOut(1000) while not IsScreenFadedOut() do Wait(100) end if IsPedDeadOrDying(player) then local pos = GetEntityCoords(player, true) NetworkResurrectLocalPlayer(pos.x, pos.y, pos.z, GetEntityHeading(player), true, false) end bedObject = GetClosestObjectOfType(bedOccupyingData.coords.x, bedOccupyingData.coords.y, bedOccupyingData.coords.z, 1.0, bedOccupyingData.model, false, false, false) FreezeEntityPosition(bedObject, true) SetEntityCoords(player, bedOccupyingData.coords.x, bedOccupyingData.coords.y, bedOccupyingData.coords.z + 0.02) --SetEntityInvincible(PlayerPedId(), true) Wait(500) FreezeEntityPosition(player, true) loadAnimDict(inBedDict) TaskPlayAnim(player, inBedDict , inBedAnim, 8.0, 1.0, -1, 1, 0, 0, 0, 0 ) SetEntityHeading(player, bedOccupyingData.coords.w) cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", 1) SetCamActive(cam, true) RenderScriptCams(true, false, 1, true, true) AttachCamToPedBone(cam, player, 31085, 0, 1.0, 1.0 , true) SetCamFov(cam, 90.0) local heading = GetEntityHeading(player) heading = (heading > 180) and heading - 180 or heading + 180 SetCamRot(cam, -45.0, 0.0, heading, 2) DoScreenFadeIn(1000) Wait(1000) FreezeEntityPosition(player, true) end local function LeaveBed() local player = PlayerPedId() RequestAnimDict(getOutDict) while not HasAnimDictLoaded(getOutDict) do Wait(0) end FreezeEntityPosition(player, false) SetEntityInvincible(player, false) SetEntityHeading(player, bedOccupyingData.coords.w + 90) TaskPlayAnim(player, getOutDict , getOutAnim, 100.0, 1.0, -1, 8, -1, 0, 0, 0) Wait(4000) ClearPedTasks(player) TriggerServerEvent('hospital:server:LeaveBed', bedOccupying) FreezeEntityPosition(bedObject, true) RenderScriptCams(0, true, 200, true, true) DestroyCam(cam, false) bedOccupying = nil bedObject = nil bedOccupyingData = nil isInHospitalBed = false QBCore.Functions.GetPlayerData(function(PlayerData) if PlayerData.metadata["injail"] > 0 then TriggerEvent("prison:client:Enter", PlayerData.metadata["injail"]) end end) end local function IsInDamageList(damage) local retval = false if CurrentDamageList then for k, _ in pairs(CurrentDamageList) do if CurrentDamageList[k] == damage then retval = true end end end return retval end local function CheckWeaponDamage(ped) local detected = false for k, v in pairs(QBCore.Shared.Weapons) do if HasPedBeenDamagedByWeapon(ped, k, 0) then detected = true if not IsInDamageList(k) then -- TriggerEvent('chat:addMessage', { -- color = { 255, 0, 0}, -- multiline = false, --args = {Lang:t('info.status'), v.damagereason} --}) CurrentDamageList[#CurrentDamageList+1] = k end end end if detected then TriggerServerEvent("hospital:server:SetWeaponDamage", CurrentDamageList) end ClearEntityLastDamageEntity(ped) end local function ApplyImmediateEffects(ped, bone, weapon, damageDone) local armor = GetPedArmour(ped) if Config.MinorInjurWeapons[weapon] and damageDone < Config.DamageMinorToMajor then if Config.CriticalAreas[Config.Bones[bone]] then if armor <= 0 then ApplyBleed(1) end end if Config.StaggerAreas[Config.Bones[bone]] and (Config.StaggerAreas[Config.Bones[bone]].armored or armor <= 0) then if math.random(100) <= math.ceil(Config.StaggerAreas[Config.Bones[bone]].minor) then SetPedToRagdoll(ped, 1500, 2000, 3, true, true, false) end end elseif Config.MajorInjurWeapons[weapon] or (Config.MinorInjurWeapons[weapon] and damageDone >= Config.DamageMinorToMajor) then if Config.CriticalAreas[Config.Bones[bone]] then if armor > 0 and Config.CriticalAreas[Config.Bones[bone]].armored then if math.random(100) <= math.ceil(Config.MajorArmoredBleedChance) then ApplyBleed(1) end else ApplyBleed(1) end else if armor > 0 then if math.random(100) < (Config.MajorArmoredBleedChance) then ApplyBleed(1) end else if math.random(100) < (Config.MajorArmoredBleedChance * 2) then ApplyBleed(1) end end end if Config.StaggerAreas[Config.Bones[bone]] and (Config.StaggerAreas[Config.Bones[bone]].armored or armor <= 0) then if math.random(100) <= math.ceil(Config.StaggerAreas[Config.Bones[bone]].major) then SetPedToRagdoll(ped, 1500, 2000, 3, true, true, false) end end end end local function CheckDamage(ped, bone, weapon, damageDone) if weapon == nil then return end if Config.Bones[bone] and not isDead and not InLaststand then ApplyImmediateEffects(ped, bone, weapon, damageDone) if not BodyParts[Config.Bones[bone]].isDamaged then BodyParts[Config.Bones[bone]].isDamaged = true BodyParts[Config.Bones[bone]].severity = math.random(1, 3) injured[#injured+1] = { part = Config.Bones[bone], label = BodyParts[Config.Bones[bone]].label, severity = BodyParts[Config.Bones[bone]].severity } else if BodyParts[Config.Bones[bone]].severity < 4 then BodyParts[Config.Bones[bone]].severity = BodyParts[Config.Bones[bone]].severity + 1 for _, v in pairs(injured) do if v.part == Config.Bones[bone] then v.severity = BodyParts[Config.Bones[bone]].severity end end end end TriggerServerEvent('hospital:server:SyncInjuries', { limbs = BodyParts, isBleeding = tonumber(isBleeding) }) ProcessRunStuff(ped) end end local function ProcessDamage(ped) if not isDead and not InLaststand and not onPainKillers then for _, v in pairs(injured) do if (v.part == 'LLEG' and v.severity > 1) or (v.part == 'RLEG' and v.severity > 1) or (v.part == 'LFOOT' and v.severity > 2) or (v.part == 'RFOOT' and v.severity > 2) then if legCount >= Config.LegInjuryTimer then if not IsPedRagdoll(ped) and IsPedOnFoot(ped) then local chance = math.random(100) if (IsPedRunning(ped) or IsPedSprinting(ped)) then if chance <= Config.LegInjuryChance.Running then ShakeGameplayCam('SMALL_EXPLOSION_SHAKE', 0.08) -- change this float to increase/decrease camera shake SetPedToRagdollWithFall(ped, 1500, 2000, 1, GetEntityForwardVector(ped), 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) end else if chance <= Config.LegInjuryChance.Walking then ShakeGameplayCam('SMALL_EXPLOSION_SHAKE', 0.08) -- change this float to increase/decrease camera shake SetPedToRagdollWithFall(ped, 1500, 2000, 1, GetEntityForwardVector(ped), 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) end end end legCount = 0 else legCount = legCount + 1 end elseif (v.part == 'LARM' and v.severity > 1) or (v.part == 'LHAND' and v.severity > 1) or (v.part == 'LFINGER' and v.severity > 2) or (v.part == 'RARM' and v.severity > 1) or (v.part == 'RHAND' and v.severity > 1) or (v.part == 'RFINGER' and v.severity > 2) then if armcount >= Config.ArmInjuryTimer then if (v.part == 'LARM' and v.severity > 1) or (v.part == 'LHAND' and v.severity > 1) or (v.part == 'LFINGER' and v.severity > 2) then local isDisabled = 15 CreateThread(function() while isDisabled > 0 do if IsPedInAnyVehicle(ped, true) then DisableControlAction(0, 63, true) -- veh turn left end if IsPlayerFreeAiming(PlayerId()) then DisablePlayerFiring(PlayerId(), true) -- Disable weapon firing end isDisabled = isDisabled - 1 Wait(1) end end) else local isDisabled = 15 CreateThread(function() while isDisabled > 0 do if IsPedInAnyVehicle(ped, true) then DisableControlAction(0, 63, true) -- veh turn left end if IsPlayerFreeAiming(PlayerId()) then DisableControlAction(0, 25, true) -- Disable weapon firing end isDisabled = isDisabled - 1 Wait(1) end end) end armcount = 0 else armcount = armcount + 1 end elseif (v.part == 'HEAD' and v.severity > 2) then if headCount >= Config.HeadInjuryTimer then local chance = math.random(100) if chance <= Config.HeadInjuryChance then SetFlash(0, 0, 100, 10000, 100) DoScreenFadeOut(100) while not IsScreenFadedOut() do Wait(0) end if not IsPedRagdoll(ped) and IsPedOnFoot(ped) and not IsPedSwimming(ped) then ShakeGameplayCam('SMALL_EXPLOSION_SHAKE', 0.08) -- change this float to increase/decrease camera shake SetPedToRagdoll(ped, 5000, 1, 2) end Wait(5000) DoScreenFadeIn(250) end headCount = 0 else headCount = headCount + 1 end end end end end --Ranjit's emsbag functions -- Notifys function Notify(msg) QBCore.Functions.Notify(msg) end -- Progressbars function progressBar(msg) QBCore.Functions.Progressbar("ems bag", msg, 2500, false, true, { disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, }, {}, {}, {}, function()end) end -- Events RegisterNetEvent('hospital:client:ambulanceAlert', function(coords, text) local street1, street2 = GetStreetNameAtCoord(coords.x, coords.y, coords.z) local street1name = GetStreetNameFromHashKey(street1) local street2name = GetStreetNameFromHashKey(street2) QBCore.Functions.Notify({text = text, caption = street1name.. ' ' ..street2name}, 'ambulance') PlaySound(-1, "Lose_1st", "GTAO_FM_Events_Soundset", 0, 0, 1) local transG = 250 local blip = AddBlipForCoord(coords.x, coords.y, coords.z) local blip2 = AddBlipForCoord(coords.x, coords.y, coords.z) local blipText = Lang:t('info.ems_alert', {text = text}) SetBlipSprite(blip, 153) SetBlipSprite(blip2, 161) SetBlipColour(blip, 1) SetBlipColour(blip2, 1) SetBlipDisplay(blip, 4) SetBlipDisplay(blip2, 8) SetBlipAlpha(blip, transG) SetBlipAlpha(blip2, transG) SetBlipScale(blip, 0.8) SetBlipScale(blip2, 2.0) SetBlipAsShortRange(blip, false) SetBlipAsShortRange(blip2, false) PulseBlip(blip2) BeginTextCommandSetBlipName('STRING') AddTextComponentString(blipText) EndTextCommandSetBlipName(blip) while transG ~= 0 do Wait(180 * 4) transG = transG - 1 SetBlipAlpha(blip, transG) SetBlipAlpha(blip2, transG) if transG == 0 then RemoveBlip(blip) return end end end) RegisterNetEvent('hospital:client:Revive', function() local player = PlayerPedId() if isDead or InLaststand then local pos = GetEntityCoords(player, true) NetworkResurrectLocalPlayer(pos.x, pos.y, pos.z, GetEntityHeading(player), true, false) isDead = false SetEntityInvincible(player, false) SetLaststand(false) end if isInHospitalBed then loadAnimDict(inBedDict) TaskPlayAnim(player, inBedDict , inBedAnim, 8.0, 1.0, -1, 1, 0, 0, 0, 0 ) SetEntityInvincible(player, true) canLeaveBed = true end TriggerServerEvent("hospital:server:RestoreWeaponDamage") SetEntityMaxHealth(player, 200) SetEntityHealth(player, 200) ClearPedBloodDamage(player) SetPlayerSprint(PlayerId(), true) ResetAll() ResetPedMovementClipset(player, 0.0) TriggerServerEvent('hud:server:RelieveStress', 100) TriggerServerEvent("hospital:server:SetDeathStatus", false) TriggerServerEvent("hospital:server:SetLaststandStatus", false) emsNotified = false QBCore.Functions.Notify(Lang:t('info.healthy')) end) RegisterNetEvent('hospital:client:SetPain', function() ApplyBleed(math.random(1,4)) if not BodyParts[Config.Bones[24816]].isDamaged then BodyParts[Config.Bones[24816]].isDamaged = true BodyParts[Config.Bones[24816]].severity = math.random(1, 4) injured[#injured+1] = { part = Config.Bones[24816], label = BodyParts[Config.Bones[24816]].label, severity = BodyParts[Config.Bones[24816]].severity } end if not BodyParts[Config.Bones[40269]].isDamaged then BodyParts[Config.Bones[40269]].isDamaged = true BodyParts[Config.Bones[40269]].severity = math.random(1, 4) injured[#injured+1] = { part = Config.Bones[40269], label = BodyParts[Config.Bones[40269]].label, severity = BodyParts[Config.Bones[40269]].severity } end TriggerServerEvent('hospital:server:SyncInjuries', { limbs = BodyParts, isBleeding = tonumber(isBleeding) }) end) RegisterNetEvent('hospital:client:KillPlayer', function() SetEntityHealth(PlayerPedId(), 0) end) RegisterNetEvent('hospital:client:HealInjuries', function(type) if type == "full" then ResetAll() else ResetPartial() end TriggerServerEvent("hospital:server:RestoreWeaponDamage") QBCore.Functions.Notify(Lang:t('success.wounds_healed'), 'success') end) RegisterNetEvent('hospital:client:SendToBed', function(id, data, isRevive) bedOccupying = id bedOccupyingData = data SetBedCam() CreateThread(function () Wait(5) if isRevive then QBCore.Functions.Notify(Lang:t('success.being_helped'), 'success') Wait(Config.AIHealTimer * 1000) TriggerEvent("hospital:client:Revive") else canLeaveBed = true end end) end) RegisterNetEvent('hospital:client:SetBed', function(id, isTaken) Config.Locations["beds"][id].taken = isTaken end) RegisterNetEvent('hospital:client:SetBed2', function(id, isTaken) Config.Locations["jailbeds"][id].taken = isTaken end) RegisterNetEvent('hospital:client:RespawnAtHospital', function() TriggerServerEvent("hospital:server:RespawnAtHospital") if exports["qb-policejob"]:IsHandcuffed() then TriggerEvent("police:client:GetCuffed", -1) end TriggerEvent("police:client:DeEscort") end) RegisterNetEvent('hospital:client:SendBillEmail', function(amount) SetTimeout(math.random(2500, 4000), function() local gender = Lang:t('info.mr') if QBCore.Functions.GetPlayerData().charinfo.gender == 1 then gender = Lang:t('info.mrs') end local charinfo = QBCore.Functions.GetPlayerData().charinfo TriggerServerEvent('qb-phone:server:sendNewMail', { sender = Lang:t('mail.sender'), subject = Lang:t('mail.subject'), message = Lang:t('mail.message', {gender = gender, lastname = charinfo.lastname, costs = amount}), button = {} }) end) end) RegisterNetEvent('hospital:client:SetDoctorCount', function(amount) doctorCount = amount end) RegisterNetEvent('hospital:client:adminHeal', function() local ped = PlayerPedId() SetEntityHealth(ped, 200) TriggerServerEvent("hospital:server:resetHungerThirst") end) RegisterNetEvent('QBCore:Client:OnPlayerUnload', function() local ped = PlayerPedId() TriggerServerEvent("hospital:server:SetDeathStatus", false) TriggerServerEvent('hospital:server:SetLaststandStatus', false) TriggerServerEvent("hospital:server:SetArmor", GetPedArmour(ped)) if bedOccupying then TriggerServerEvent("hospital:server:LeaveBed", bedOccupying) end isDead = false deathTime = 0 SetEntityInvincible(ped, false) SetPedArmour(ped, 0) ResetAll() end) --Ranjit's emsbag events -- Simple Event's , you can create yours and put on qb-menu :) RegisterNetEvent('Ranjit-EmsBag:Client:GiveRadio') AddEventHandler("Ranjit-EmsBag:Client:GiveRadio", function() local playerPed = PlayerPedId() TaskStartScenarioInPlace(playerPed, "CODE_HUMAN_MEDIC_TEND_TO_DEAD") progressBar("Tager radio...") TriggerServerEvent("Ranjit-EmsBag:Server:AddItem", "radio", 1) TriggerEvent("inventory:client:ItemBox", QBCore.Shared.Items["radio"], "add", 1) end) RegisterNetEvent('Ranjit-EmsBag:Client:Givebandage') AddEventHandler("Ranjit-EmsBag:Client:Givebandage", function() local playerPed = PlayerPedId() TaskStartScenarioInPlace(playerPed, "CODE_HUMAN_MEDIC_TEND_TO_DEAD") progressBar("Tager Bandage...") TriggerServerEvent("Ranjit-EmsBag:Server:AddItem", "bandage", 1) TriggerEvent("inventory:client:ItemBox", QBCore.Shared.Items["bandage"], "add", 1) end) RegisterNetEvent('Ranjit-EmsBag:Client:Givepainkillers') AddEventHandler("Ranjit-EmsBag:Client:Givepainkillers", function() local playerPed = PlayerPedId() TaskStartScenarioInPlace(playerPed, "CODE_HUMAN_MEDIC_TEND_TO_DEAD") progressBar("Tager smertestillende...") TriggerServerEvent("Ranjit-EmsBag:Server:AddItem", "painkillers", 1) TriggerEvent("inventory:client:ItemBox", QBCore.Shared.Items["painkillers"], "add", 1) end) RegisterNetEvent('Ranjit-EmsBag:Client:Givefirstaid') AddEventHandler("Ranjit-EmsBag:Client:Givefirstaid", function() local playerPed = PlayerPedId() TaskStartScenarioInPlace(playerPed, "CODE_HUMAN_MEDIC_TEND_TO_DEAD") progressBar("Tager førstehjælpskasse...") TriggerServerEvent("Ranjit-EmsBag:Server:AddItem", "firstaid", 1) TriggerEvent("inventory:client:ItemBox", QBCore.Shared.Items["firstaid"], "add", 1) end) RegisterNetEvent('Ranjit-EmsBag:Client:Giveweapon_flashlight') AddEventHandler("Ranjit-EmsBag:Client:Giveweapon_flashlight", function() local playerPed = PlayerPedId() TaskStartScenarioInPlace(playerPed, "CODE_HUMAN_MEDIC_TEND_TO_DEAD") progressBar("Tager lommelygte...") TriggerServerEvent("Ranjit-EmsBag:Server:AddItem", "weapon_flashlight", 1) TriggerEvent("inventory:client:ItemBox", QBCore.Shared.Items["weapon_flashlight"], "add", 1) end) RegisterNetEvent('Ranjit-EmsBag:Client:MenuAmbulanceBag', function() local playerPed = PlayerPedId() if IsEntityDead(playerPed) then return Notify("Du kan ikke åbne tasken når du er død", "error") end if IsPedSwimming(playerPed) then return Notify("Du kan ikke åbne tasken i vand.", "error") end if IsPedSittingInAnyVehicle(playerPed) then return Notify("Du kan ikke åbne tasken i et køretøj", "error") end exports['qb-menu']:openMenu({ { header = "[🚑] Ambulance Kasse", txt = "", isMenuHeader = true }, { header = "[👜] Åben Ambulance taske", params = { event = "Ranjit-EmsBag:Client:StorageAmbulanceBag" } }, { header = "[🩹] Tag Bandage ", params = { event = "Ranjit-EmsBag:Client:Givebandage" } }, { header = "[💊] Tag Smertestillende ", params = { event = "Ranjit-EmsBag:Client:Givepainkillers" } }, { header = "[💉] Tag Førstehjælpskasse ", params = { event = "Ranjit-EmsBag:Client:Givefirstaid" } }, { header = "[🔦] Tag Lommelygte ", params = { event = "Ranjit-EmsBag:Client:Giveweapon_flashlight" } }, { header = "[📻] Tag Radio", params = { event = "Ranjit-EmsBag:Client:GiveRadio" } }, -- You can add more menus with your's personal events... { header = "", txt = "❌ Luk", params = { event = "qb-menu:closeMenu" } }, }) end) -- Threads CreateThread(function() for _, station in pairs(Config.Locations["stations"]) do local blip = AddBlipForCoord(station.coords.x, station.coords.y, station.coords.z) SetBlipSprite(blip, 61) SetBlipAsShortRange(blip, true) SetBlipScale(blip, 0.8) SetBlipColour(blip, 25) BeginTextCommandSetBlipName("STRING") AddTextComponentString(station.label) EndTextCommandSetBlipName(blip) end end) CreateThread(function() while true do local sleep = 1000 if isInHospitalBed and canLeaveBed then sleep = 0 exports['qb-core']:DrawText(Lang:t('text.bed_out'), 'top') if IsControlJustReleased(0, 38) then exports['qb-core']:KeyPressed(38) LeaveBed() exports['qb-core']:HideText() end end Wait(sleep) end end) CreateThread(function() while true do Wait((1000 * Config.MessageTimer)) DoLimbAlert() end end) CreateThread(function() while true do Wait(1000) SetClosestBed() if isStatusChecking then statusCheckTime = statusCheckTime - 1 if statusCheckTime <= 0 then statusChecks = {} isStatusChecking = false end end end end) CreateThread(function() while true do local ped = PlayerPedId() local health = GetEntityHealth(ped) local armor = GetPedArmour(ped) if not playerHealth then playerHealth = health end if not playerArmor then playerArmor = armor end local armorDamaged = (playerArmor ~= armor and armor < (playerArmor - Config.ArmorDamage) and armor > 0) -- Players armor was damaged local healthDamaged = (playerHealth ~= health) -- Players health was damaged local damageDone = (playerHealth - health) if armorDamaged or healthDamaged then local hit, bone = GetPedLastDamageBone(ped) local bodypart = Config.Bones[bone] local weapon = GetDamagingWeapon(ped) if hit and bodypart ~= 'NONE' then local checkDamage = true if damageDone >= Config.HealthDamage then if weapon then if armorDamaged and (bodypart == 'SPINE' or bodypart == 'UPPER_BODY') or weapon == Config.WeaponClasses['NOTHING'] then checkDamage = false -- Don't check damage if the it was a body shot and the weapon class isn't that strong if armorDamaged then TriggerServerEvent("hospital:server:SetArmor", GetPedArmour(ped)) end end if checkDamage then if IsDamagingEvent(damageDone, weapon) then CheckDamage(ped, bone, weapon, damageDone) end end end elseif Config.AlwaysBleedChanceWeapons[weapon] then if armorDamaged and (bodypart == 'SPINE' or bodypart == 'UPPER_BODY') or weapon == Config.WeaponClasses['NOTHING'] then checkDamage = false -- Don't check damage if the it was a body shot and the weapon class isn't that strong end if math.random(100) < Config.AlwaysBleedChance and checkDamage then ApplyBleed(1) end end end CheckWeaponDamage(ped) end playerHealth = health playerArmor = armor if not isInHospitalBed then ProcessDamage(ped) end Wait(100) end end) local listen = false local function CheckInControls(variable) CreateThread(function() listen = true while listen do if IsControlJustPressed(0, 38) then exports['qb-core']:KeyPressed(38) if variable == "checkin" then TriggerEvent('qb-ambulancejob:checkin') listen = false elseif variable == "beds" then TriggerEvent('qb-ambulancejob:beds') listen = false end end Wait(1) end end) end RegisterNetEvent('qb-ambulancejob:checkin', function() if doctorCount >= Config.MinimalDoctors then TriggerServerEvent("hospital:server:SendDoctorAlert") else TriggerEvent('animations:client:EmoteCommandStart', {"notepad"}) QBCore.Functions.Progressbar("hospital_checkin", Lang:t('progress.checking_in'), 2000, false, true, { disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, }, {}, {}, {}, function() -- Done TriggerEvent('animations:client:EmoteCommandStart', {"c"}) local bedId = GetAvailableBed() if bedId then TriggerServerEvent("hospital:server:SendToBed", bedId, true) else QBCore.Functions.Notify(Lang:t('error.beds_taken'), "error") end end, function() -- Cancel TriggerEvent('animations:client:EmoteCommandStart', {"c"}) QBCore.Functions.Notify(Lang:t('error.canceled'), "error") end) end end) RegisterNetEvent('qb-ambulancejob:beds', function() if GetAvailableBed(closestBed) then TriggerServerEvent("hospital:server:SendToBed", closestBed, false) else QBCore.Functions.Notify(Lang:t('error.beds_taken'), "error") end end) -- Convar turns into a boolean if Config.UseTarget then CreateThread(function() for k, v in pairs(Config.Locations["checking"]) do QBCore.Functions.LoadModel(Config.CheckingPed) while not HasModelLoaded(Config.CheckingPed) do Wait(100) end CheckingPed = CreatePed(0, Config.CheckingPed, v.x, v.y, v.z-1.0, v.w, false, true) TaskStartScenarioInPlace(CheckingPed, true) FreezeEntityPosition(CheckingPed, true) SetEntityInvincible(CheckingPed, true) SetBlockingOfNonTemporaryEvents(CheckingPed, true) TaskStartScenarioInPlace(CheckingPed, Config.CheckingPedScenario, 0, true) exports['qb-target']:AddBoxZone("checking"..k, vector3(v.x, v.y, v.z), 3.5, 2, { name = "checking"..k, heading = -72, debugPoly = false, minZ = v.z - 2, maxZ = v.z + 2, }, { options = { { type = "client", icon = "fa fa-clipboard", event = "qb-ambulancejob:checkin", label = "Check ind", } }, distance = 1.5 }) end for k, v in pairs(Config.Locations["beds"]) do exports['qb-target']:AddBoxZone("beds"..k, v.coords, 2.5, 2.3, { name = "beds"..k, heading = -20, debugPoly = false, minZ = v.coords.z - 1, maxZ = v.coords.z + 1, }, { options = { { type = "client", event = "qb-ambulancejob:beds", icon = "fas fa-bed", label = "Læg i seng", } }, distance = 1.5 }) end end) else CreateThread(function() local checkingPoly = {} for k, v in pairs(Config.Locations["checking"]) do checkingPoly[#checkingPoly+1] = BoxZone:Create(vector3(v.x, v.y, v.z), 3.5, 2, { heading = -72, name="checkin"..k, debugPoly = false, minZ = v.z - 2, maxZ = v.z + 2, }) local checkingCombo = ComboZone:Create(checkingPoly, {name = "checkingCombo", debugPoly = false}) checkingCombo:onPlayerInOut(function(isPointInside) if isPointInside then if doctorCount >= Config.MinimalDoctors then exports['qb-core']:DrawText(Lang:t('text.call_doc'), 'top') CheckInControls("checkin") else exports['qb-core']:DrawText(Lang:t('text.check_in'), 'top') CheckInControls("checkin") end else listen = false exports['qb-core']:HideText() end end) end local bedPoly = {} for k, v in pairs(Config.Locations["beds"]) do bedPoly[#bedPoly+1] = BoxZone:Create(v.coords, 2.5, 2.3, { name="beds"..k, heading = -20, debugPoly = false, minZ = v.coords.z - 1, maxZ = v.coords.z + 1, }) local bedCombo = ComboZone:Create(bedPoly, {name = "bedCombo", debugPoly = false}) bedCombo:onPlayerInOut(function(isPointInside) if isPointInside then exports['qb-core']:DrawText(Lang:t('text.lie_bed'), 'top') CheckInControls("beds") else listen = false exports['qb-core']:HideText() end end) end end) end