Scripts/resources/[qb]/[qb_jobs]/qb-ambulancejob/client/job.lua

1026 lines
37 KiB
Lua
Raw Permalink Normal View History

2024-12-29 20:06:22 +00:00
local PlayerJob = {}
local onDuty = false
local currentGarage = 0
local currentHospital
-- Functions
local function IsArmoryWhitelist() -- being removed
local retval = false
if QBCore.Functions.GetPlayerData().job.type == 'leo' then
retval = true
end
return retval
end
local function SetCarItemsInfo()
local items = {}
for _, item in pairs(Config.CarItems) do
local itemInfo = QBCore.Shared.Items[item.name:lower()]
items[item.slot] = {
name = itemInfo["name"],
amount = tonumber(item.amount),
info = item.info,
label = itemInfo["label"],
description = itemInfo["description"] and itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
slot = item.slot,
}
end
Config.CarItems = items
end
local function GetClosestPlayer()
local closestPlayers = QBCore.Functions.GetPlayersFromCoords()
local closestDistance = -1
local closestPlayer = -1
local coords = GetEntityCoords(PlayerPedId())
for i = 1, #closestPlayers, 1 do
if closestPlayers[i] ~= PlayerId() then
local pos = GetEntityCoords(GetPlayerPed(closestPlayers[i]))
local distance = #(pos - coords)
if closestDistance == -1 or closestDistance > distance then
closestPlayer = closestPlayers[i]
closestDistance = distance
end
end
end
return closestPlayer, closestDistance
end
function TakeOutVehicle(vehicleInfo)
local coords = Config.Locations["vehicle"][currentGarage]
QBCore.Functions.TriggerCallback('QBCore:Server:SpawnVehicle', function(netId)
local veh = NetToVeh(netId)
SetVehicleNumberPlateText(veh, Lang:t('info.amb_plate') .. tostring(math.random(1000, 9999)))
SetEntityHeading(veh, coords.w)
exports[Config.FuelScript]:SetFuel(veh, 100.0)
TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
if Config.VehicleSettings[vehicleInfo] ~= nil then
QBCore.Shared.SetDefaultVehicleExtras(veh, Config.VehicleSettings[vehicleInfo].extras)
end
TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(veh))
SetVehicleEngineOn(veh, true, true)
end, vehicleInfo, coords, true)
end
--[[function MenuGarage(currentSelection)
--print(json.encode(currentSelection))
local vehicleMenu = {
{
header = Lang:t('menu.garage_title'),
isMenuHeader = true,
icon = "fas fa-warehouse",
}
}
local authorizedVehicles = Config.AuthorizedVehicles[QBCore.Functions.GetPlayerData().job.grade.level]
for veh, label in pairs(authorizedVehicles) do
vehicleMenu[#vehicleMenu+1] = {
header = label,
icon = "fa-solid fa-car",
txt = "",
params = {
event = "ambulance:client:TakeOutVehicle",
args = {
vehicle = veh,
currentSelection = currentSelection
}
}
}
end
if IsArmoryWhitelist() then
for veh, label in pairs(Config.WhitelistedVehicles) do
vehicleMenu[#vehicleMenu+1] = {
header = label,
txt = "",
params = {
event = "ambulance:client:TakeOutVehicle",
args = {
vehicle = veh,
currentSelection = currentSelection
}
}
}
end
end
vehicleMenu[#vehicleMenu+1] = {
header = Lang:t('menu.close'),
txt = "",
params = {
event = "qb-menu:client:closeMenu"
}
}
exports['qb-menu']:openMenu(vehicleMenu)
end]]
-- Events
--RegisterNetEvent('ambulance:client:TakeOutVehicle', function(data)
-- local vehicle = data.vehicle
--TakeOutVehicle(vehicle)
--end)
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)
PlayerJob = JobInfo
if PlayerJob.name == 'ambulance' then
onDuty = PlayerJob.onduty
if PlayerJob.onduty then
TriggerServerEvent("hospital:server:AddDoctor", PlayerJob.name)
else
TriggerServerEvent("hospital:server:RemoveDoctor", PlayerJob.name)
end
end
end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
exports.spawnmanager:setAutoSpawn(false)
local ped = PlayerPedId()
local player = PlayerId()
CreateThread(function()
Wait(5000)
SetEntityMaxHealth(ped, 200)
SetEntityHealth(ped, 200)
SetPlayerHealthRechargeMultiplier(player, 0.0)
SetPlayerHealthRechargeLimit(player, 0.0)
end)
CreateThread(function()
Wait(1000)
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
onDuty = PlayerData.job.onduty
SetPedArmour(PlayerPedId(), PlayerData.metadata["armor"])
if (not PlayerData.metadata["inlaststand"] and PlayerData.metadata["isdead"]) then
deathTime = Laststand.ReviveInterval
OnDeath()
DeathTimer()
elseif (PlayerData.metadata["inlaststand"] and not PlayerData.metadata["isdead"]) then
SetLaststand(true)
else
TriggerServerEvent("hospital:server:SetDeathStatus", false)
TriggerServerEvent("hospital:server:SetLaststandStatus", false)
end
if PlayerJob.name == 'ambulance' and onDuty then
TriggerServerEvent("hospital:server:AddDoctor", PlayerJob.name)
end
end)
end)
end)
RegisterNetEvent('QBCore:Client:OnPlayerUnload', function()
if PlayerJob.name == 'ambulance' and onDuty then
TriggerServerEvent("hospital:server:RemoveDoctor", PlayerJob.name)
end
end)
RegisterNetEvent('QBCore:Client:SetDuty', function(duty)
if PlayerJob.name == 'ambulance' and duty ~= onDuty then
if duty then
TriggerServerEvent("hospital:server:AddDoctor", PlayerJob.name)
else
TriggerServerEvent("hospital:server:RemoveDoctor", PlayerJob.name)
end
end
onDuty = duty
end)
function Status()
if isStatusChecking then
local statusMenu = {
{
header = Lang:t('menu.status'),
isMenuHeader = true
}
}
for _, v in pairs(statusChecks) do
statusMenu[#statusMenu + 1] = {
header = v.label,
txt = "",
params = {
event = "hospital:client:TreatWounds",
}
}
end
statusMenu[#statusMenu + 1] = {
header = Lang:t('menu.close'),
txt = "",
params = {
event = "qb-menu:client:closeMenu"
}
}
exports['qb-menu']:openMenu(statusMenu)
end
end
RegisterNetEvent('hospital:client:CheckStatus', function()
local player, distance = GetClosestPlayer()
if player ~= -1 and distance < 5.0 then
local playerId = GetPlayerServerId(player)
QBCore.Functions.TriggerCallback('hospital:GetPlayerStatus', function(result)
if result then
for k, v in pairs(result) do
if k ~= "BLEED" and k ~= "WEAPONWOUNDS" then
statusChecks[#statusChecks + 1] = { bone = Config.BoneIndexes[k],
label = v.label .. " (" .. Config.WoundStates[v.severity] .. ")" }
elseif result["WEAPONWOUNDS"] then
for _, v2 in pairs(result["WEAPONWOUNDS"]) do
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
multiline = false,
args = { Lang:t('info.status'), QBCore.Shared.Weapons[v2].damagereason }
})
end
elseif result["BLEED"] > 0 then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
multiline = false,
args = { Lang:t('info.status'),
Lang:t('info.is_status', { status = Config.BleedingStates[v].label }) }
})
else
QBCore.Functions.Notify(Lang:t('success.healthy_player'), 'success')
end
end
isStatusChecking = true
Status()
end
end, playerId)
else
QBCore.Functions.Notify(Lang:t('error.no_player'), 'error')
end
end)
RegisterNetEvent('hospital:client:RevivePlayer', function()
local hasItem = QBCore.Functions.HasItem('firstaid')
if hasItem then
local player, distance = GetClosestPlayer()
if player ~= -1 and distance < 5.0 then
local playerId = GetPlayerServerId(player)
QBCore.Functions.Progressbar("hospital_revive", Lang:t('progress.revive'), 5000, false, true, {
disableMovement = false,
disableCarMovement = false,
disableMouse = false,
disableCombat = true,
}, {
animDict = healAnimDict,
anim = healAnim,
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), healAnimDict, "exit", 1.0)
QBCore.Functions.Notify(Lang:t('success.revived'), 'success')
TriggerServerEvent("hospital:server:RevivePlayer", playerId)
end, function() -- Cancel
StopAnimTask(PlayerPedId(), healAnimDict, "exit", 1.0)
QBCore.Functions.Notify(Lang:t('error.canceled'), "error")
end)
else
QBCore.Functions.Notify(Lang:t('error.no_player'), "error")
end
else
QBCore.Functions.Notify(Lang:t('error.no_firstaid'), "error")
end
end)
RegisterNetEvent('hospital:client:TreatWounds', function()
local hasItem = QBCore.Functions.HasItem('bandage')
if hasItem then
local player, distance = GetClosestPlayer()
if player ~= -1 and distance < 5.0 then
local playerId = GetPlayerServerId(player)
QBCore.Functions.Progressbar("hospital_healwounds", Lang:t('progress.healing'), 5000, false, true, {
disableMovement = false,
disableCarMovement = false,
disableMouse = false,
disableCombat = true,
}, {
animDict = healAnimDict,
anim = healAnim,
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), healAnimDict, "exit", 1.0)
QBCore.Functions.Notify(Lang:t('success.helped_player'), 'success')
TriggerServerEvent("hospital:server:TreatWounds", playerId)
end, function() -- Cancel
StopAnimTask(PlayerPedId(), healAnimDict, "exit", 1.0)
QBCore.Functions.Notify(Lang:t('error.canceled'), "error")
end)
else
QBCore.Functions.Notify(Lang:t('error.no_player'), "error")
end
else
QBCore.Functions.Notify(Lang:t('error.no_bandage'), "error")
end
end)
local check = false
local function EMSControls(variable)
CreateThread(function()
check = true
while check do
if IsControlJustPressed(0, 38) then
exports['qb-core']:KeyPressed(38)
if variable == "sign" then
TriggerEvent('EMSToggle:Duty')
elseif variable == "stash" then
TriggerEvent('qb-ambulancejob:stash')
elseif variable == "armory" then
TriggerEvent('qb-ambulancejob:armory')
elseif variable == "storeheli" then
TriggerEvent('qb-ambulancejob:storeheli')
elseif variable == "takeheli" then
TriggerEvent('qb-ambulancejob:pullheli')
elseif variable == "roof" then
TriggerEvent('qb-ambulancejob:elevator_main')
elseif variable == "main" then
TriggerEvent('qb-ambulancejob:elevator_roof')
elseif variable == "basement" then
TriggerEvent('qb-ambulancejob:elevator_basement')
end
end
end
end)
end
RegisterNetEvent('qb-ambulancejob:stash', function()
if onDuty then
TriggerServerEvent("inventory:server:OpenInventory", "stash",
"ambulancestash_" .. QBCore.Functions.GetPlayerData().citizenid)
TriggerEvent("inventory:client:SetCurrentStash", "ambulancestash_" .. QBCore.Functions.GetPlayerData().citizenid)
end
end)
RegisterNetEvent('qb-ambulancejob:armory', function()
if onDuty then
TriggerServerEvent("inventory:server:OpenInventory", "shop", "hospital", Config.Items)
end
end)
local CheckVehicle = false
local function EMSVehicle(k)
CheckVehicle = true
CreateThread(function()
while CheckVehicle do
exports['qb-core']:KeyPressed(38)
CheckVehicle = false
local ped = PlayerPedId()
if IsPedInAnyVehicle(ped, false) then
QBCore.Functions.DeleteVehicle(GetVehiclePedIsIn(ped))
else
local currentVehicle = k
--MenuGarage(currentVehicle)
currentGarage = currentVehicle
end
Wait(1)
end
end)
end
RegisterNetEvent("ambulance:client:VehicleMenuHeader", function(data)
local Menu = {
{
header = Lang:t('menu.garage_title'),
isMenuHeader = true,
icon = "fas fa-warehouse",
}
}
for k,v in pairs(Config.VehicleTable) do
Menu[#Menu+1] = {
header = k:upper(),
txt = "Select a Heli to fly with",
icon = "fa-solid fa-shield",
params = {
event = "ambulance:client:veh-category-selected",
args = {
category = k,
location = data.spawn,
}
}
}
end
exports['qb-menu']:openMenu(Menu)
end)
RegisterNetEvent("ambulance:client:VehicleMenuHeader", function(data)
local Menu = {
{
header = Lang:t('menu.garage_title'),
isMenuHeader = true,
icon = "fas fa-warehouse",
}
}
for k,v in pairs(Config.VehicleTable) do
Menu[#Menu+1] = {
header = k:upper(),
txt = "Select a Heli to fly with",
icon = "fa-solid fa-shield",
params = {
event = "ambulance:client:veh-category-selected",
args = {
category = k,
location = data.spawn,
}
}
}
end
exports['qb-menu']:openMenu(Menu)
end)
RegisterNetEvent("ambulance:client:TakeOutVehicle", function(data)
local VehicleSpawnCoord = Config.Locations["vehicle"][data.currentSelection]["vehspawn"]
local plate = "EMS".."-".. math.random(000, 999)
QBCore.Functions.SpawnVehicle(data.model, function(veh)
--print("callback")
SetVehicleNumberPlateText(veh, plate)
SetEntityHeading(veh, VehicleSpawnCoord.w)
SetEntityAsMissionEntity(veh, true, true)
SetCarItemsInfo()
exports[Config.FuelScript]:SetFuel(veh, 100.0)
TriggerEvent('vehiclekeys:client:SetOwner', QBCore.Functions.GetPlate(veh))
TriggerServerEvent("hospital:server:addTrunkItems", QBCore.Functions.GetPlate(veh), Config.CarItems)
TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
end, vector3(VehicleSpawnCoord.x,VehicleSpawnCoord.y,VehicleSpawnCoord.z), true)
end)
local CheckHeli = false
local function EMSHelicopter(k)
CheckHeli = true
CreateThread(function()
while CheckHeli do
if IsControlJustPressed(0, 38) then
exports['qb-core']:KeyPressed(38)
CheckHeli = false
local ped = PlayerPedId()
if IsPedInAnyVehicle(ped, false) then
QBCore.Functions.DeleteVehicle(GetVehiclePedIsIn(ped))
else
local currentHelictoper = k
local coords = Config.Locations["helicopter"][currentHelictoper]
QBCore.Functions.TriggerCallback('QBCore:Server:SpawnVehicle', function(netId)
local veh = NetToVeh(netId)
SetVehicleNumberPlateText(veh, Lang:t('info.heli_plate') .. tostring(math.random(1000, 9999)))
SetEntityHeading(veh, coords.w)
SetVehicleLivery(veh, 1) -- Ambulance Livery
exports[Config.FuelScript]:SetFuel(veh, 100.0)
TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(veh))
SetVehicleEngineOn(veh, true, true)
end, Config.Helicopter, coords, true)
end
end
Wait(1)
end
end)
end
RegisterNetEvent("ambulance:client:TakeOutCopter", function(data)
local VehicleSpawnCoord = Config.Locations["helicopter"][data.currentSelection]["vehspawn"]
local plate = "EMS".."-".."ZULU"
QBCore.Functions.SpawnVehicle(data.model, function(veh)
--print("callback")
SetVehicleNumberPlateText(veh, plate)
SetEntityHeading(veh, VehicleSpawnCoord.w)
SetEntityAsMissionEntity(veh, true, true)
-- SetCarItemsInfo()
exports[Config.FuelScript]:SetFuel(veh, 100.0)
SetVehicleLivery(veh, 1) -- Ambulance Livery
TriggerEvent('vehiclekeys:client:SetOwner', QBCore.Functions.GetPlate(veh))
TriggerServerEvent("hospital:server:addTrunkItems", QBCore.Functions.GetPlate(veh), Config.CarItems)
TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
end, vector3(VehicleSpawnCoord.x,VehicleSpawnCoord.y,VehicleSpawnCoord.z), true)
end)
RegisterNetEvent('qb-ambulancejob:elevator_basement', function()
local ped = PlayerPedId()
for k, _ in pairs(Config.Locations["main"]) do
DoScreenFadeOut(500)
while not IsScreenFadedOut() do
Wait(10)
end
currentHospital = k
local coords = Config.Locations["basement"][currentHospital]
SetEntityCoords(ped, coords.x, coords.y, coords.z, 0, 0, 0, false)
SetEntityHeading(ped, coords.w)
Wait(100)
DoScreenFadeIn(1000)
end
end)
RegisterNetEvent('qb-ambulancejob:elevator_roof', function()
local ped = PlayerPedId()
for k, _ in pairs(Config.Locations["roof"]) do
DoScreenFadeOut(500)
while not IsScreenFadedOut() do
Wait(10)
end
currentHospital = k
local coords = Config.Locations["main"][currentHospital]
SetEntityCoords(ped, coords.x, coords.y, coords.z, 0, 0, 0, false)
SetEntityHeading(ped, coords.w)
Wait(100)
DoScreenFadeIn(1000)
end
end)
RegisterNetEvent('ambulance:client:veh-category-selected', function(data)
local newtable = data.category
local result = Config.VehicleTable[newtable]
if not result then return end
local Menu = {
{
header = Lang:t('menu.garage_title'),
isMenuHeader = true,
icon = "fas fa-warehouse",
}
}
for k,v in pairs(result) do
Menu[#Menu+1] = {
header = v:upper(),
txt = "",
icon = "fa-solid fa-shield",
params = {
event = "ambulance:client:TakeOutVehicle",
args = {
currentSelection = data.location,
model = v,
}
}
}
end
exports['qb-menu']:openMenu(Menu)
end)
RegisterNetEvent("ambulance:client:CopterMenu", function(data)
local heli = Config.Helicopters
local copterlist = {}
copterlist[#copterlist + 1] = { -- create non-clickable header button
isMenuHeader = true,
header = 'Helikopter Garage',
icon = 'fa-solid fa-shield'
}
for k,v in pairs(heli) do -- loop through our table
copterlist[#copterlist + 1] = { -- insert data from our loop into the menu
header = k,
txt = 'De er bestemt '..v,
icon = 'fa-solid fa-helicopter',
params = {
event = 'ambulance:client:TakeOutCopter', -- event name
args = {
currentSelection = data.spawn,
model = v,
}
}
}
end
exports['qb-menu']:openMenu(copterlist) -- open our menu
end)
RegisterNetEvent('qb-ambulancejob:elevator_main', function()
local ped = PlayerPedId()
for k, _ in pairs(Config.Locations["main"]) do
DoScreenFadeOut(500)
while not IsScreenFadedOut() do
Wait(10)
end
currentHospital = k
local coords = Config.Locations["roof"][currentHospital]
SetEntityCoords(ped, coords.x, coords.y, coords.z, 0, 0, 0, false)
SetEntityHeading(ped, coords.w)
Wait(100)
DoScreenFadeIn(1000)
end
end)
RegisterNetEvent('qb-ambulancejob:elevator_basement-main', function()
local ped = PlayerPedId()
for k, _ in pairs(Config.Locations["basement"]) do
DoScreenFadeOut(500)
while not IsScreenFadedOut() do
Wait(10)
end
currentHospital = k
local coords = Config.Locations["main"][currentHospital]
SetEntityCoords(ped, coords.x, coords.y, coords.z, 0, 0, 0, false)
SetEntityHeading(ped, coords.w)
Wait(100)
DoScreenFadeIn(1000)
end
end)
RegisterNetEvent('EMSToggle:Duty', function()
onDuty = not onDuty
TriggerServerEvent("QBCore:ToggleDuty")
--TriggerServerEvent("police:server:UpdateBlips")
end)
CreateThread(function()
for k, v in pairs(Config.Locations["vehicle"]) do
QBCore.Functions.LoadModel(Config.GaragePed)
while not HasModelLoaded(Config.GaragePed) do
Wait(100)
end
GaragePed = CreatePed(0, Config.GaragePed, v.pedspawn.x, v.pedspawn.y, v.pedspawn.z-1.0, v.w, false, true)
TaskStartScenarioInPlace(GaragePed, true)
FreezeEntityPosition(GaragePed, true)
SetEntityInvincible(GaragePed, true)
SetBlockingOfNonTemporaryEvents(GaragePed, true)
TaskStartScenarioInPlace(GaragePed, Config.GaragePedScenario, 0, true)
exports['qb-target']:AddBoxZone("name", vector3(v.pedspawn.x, v.pedspawn.y, v.pedspawn.z-1), 1.0, 1.0, { -- The name has ambulance:client:TakeOutVehicle to be unique, the coords a vector3 as shown, the 1.5 is the length of the boxzone and the 1.6 is the width of the boxzone, the length and width have to be float values
name = "vehicle" .. k,
debugPoly = Config.Debug,
heading = v.pedspawn.w,
minZ = v.pedspawn.z - 1.0,
maxZ = v.pedspawn.z + 1.0,
}, {
options = {
{
icon = 'fa-solid fa-warehouse',
label = 'Åben garage',
type = "client",
event = "ambulance:client:VehicleMenuHeader",
job = "ambulance",
spawn = k
},
{
icon = 'fa-solid fa-car',
label = 'Parker køretøj',
type = "client",
event = "police:client:returnveh",
job = "ambulance",
}
},
distance = 4.0
})
end
for k, v in pairs(Config.Locations["helicopter"]) do
QBCore.Functions.LoadModel(Config.HeliPed)
while not HasModelLoaded(Config.HeliPed) do
Wait(100)
end
heliped = CreatePed(0, Config.HeliPed, v.pedspawn.x, v.pedspawn.y, v.pedspawn.z-1.0, v.pedspawn.w, false, true)
TaskStartScenarioInPlace(heliped, true)
FreezeEntityPosition(heliped, true)
SetEntityInvincible(heliped, true)
SetBlockingOfNonTemporaryEvents(heliped, true)
TaskStartScenarioInPlace(heliped, Config.HeliPedScenario, 0, true)
exports['qb-target']:AddBoxZone("heli" .. k, vector3(v.pedspawn.x, v.pedspawn.y, v.pedspawn.z-1), 1.0, 1.0, {
name = "heli" .. k,
debugPoly = Config.Debug,
heading = v.pedspawn.w,
minZ = v.pedspawn.z - 1.0,
maxZ = v.pedspawn.z + 1.0,
}, {
options = {
{
icon = 'fa-solid fa-helicopter',
label = 'Åben helikopter hangar',
type = "client",
event = "ambulance:client:CopterMenu",
job = "ambulance",
spawn = k
},
{
icon = 'fa-solid fa-car',
label = 'Parker køretøj',
type = "client",
event = "police:client:returnveh",
job = "ambulance",
}
},
distance = 4.0
})
end
end)
-- Convar turns into a boolean
if Config.UseTarget then
CreateThread(function()
for k, v in pairs(Config.Locations["duty"]) do
QBCore.Functions.LoadModel(Config.DutyPed)
while not HasModelLoaded(Config.DutyPed) do
Wait(100)
end
dutyPed = CreatePed(0, Config.DutyPed, v.x, v.y, v.z-1.5, v.w, false, true)
TaskStartScenarioInPlace(dutyPed, true)
FreezeEntityPosition(dutyPed, true)
SetEntityInvincible(dutyPed, true)
SetBlockingOfNonTemporaryEvents(dutyPed, true)
TaskStartScenarioInPlace(dutyPed, Config.DutyPedScenario, 0, true)
exports['qb-target']:AddBoxZone("emsDuty".. k, vector3(v.x, v.y, v.z-1.0), 1.0, 1.0, { -- The name has to be unique, the coords a vector3 as shown, the 1.5 is the length of the boxzone and the 1.6 is the width of the boxzone, the length and width have to be float values
name = "emsDuty".. k, -- This is the name of the zone recognized by PolyZone, this has to be unique so it doesn't mess up with other zones
heading = v.w, -- The heading of the boxzone, this has to be a float value
debugPoly = Config.Debug, -- This is for enabling/disabling the drawing of the box, it accepts only a boolean value (true or false), when true it will draw the polyzone in green
minZ = v.z -1.0, -- This is the bottom of the boxzone, this can be different from the Z value in the coords, this has to be a float value
maxZ = v.z +1.0, -- This is the top of the boxzone, this can be different from the Z value in the coords, this has to be a float value
}, {
options = {
{
type = "client",
event = "EMSToggle:Duty",
icon = "fa fa-clipboard",
label = "Gå hjem/på arbejde",
job = "ambulance"
}
},
distance = 1.2,
})
end
for k, v in pairs(Config.Locations["stash"]) do
exports['qb-target']:AddBoxZone("stash" .. k, vector3(v.x, v.y, v.z-1), 1, 1, {
name = "stash" .. k,
debugPoly = Config.Debug,
heading = -20,
minZ = v.z - 2,
maxZ = v.z + 2,
}, {
options = {
{
type = "client",
event = "qb-ambulancejob:stash",
icon = "fa fa-hand",
label = "Åben inventar",
job = "ambulance",
}
},
distance = 2.0
})
end
for k, v in pairs(Config.Locations["armory"]) do
QBCore.Functions.LoadModel(Config.ArmoryPed)
while not HasModelLoaded(Config.ArmoryPed) do
Wait(100)
end
ArmoryPed = CreatePed(0, Config.ArmoryPed, v.x, v.y, v.z-1.0, v.w, false, true)
TaskStartScenarioInPlace(ArmoryPed, true)
FreezeEntityPosition(ArmoryPed, true)
SetEntityInvincible(ArmoryPed, true)
SetBlockingOfNonTemporaryEvents(ArmoryPed, true)
TaskStartScenarioInPlace(ArmoryPed, Config.ArmoryPedScenario, 0, true)
exports['qb-target']:AddBoxZone("armory" .. k, vector3(v.x, v.y, v.z-1), 1, 1, {
name = "armory" .. k,
debugPoly = Config.Debug,
heading = v.w,
minZ = v.z - 1.0,
maxZ = v.z + 1.0,
}, {
options = {
{
type = "client",
event = "qb-ambulancejob:armory",
icon = "fa fa-hand",
label = "Åben skab",
job = "ambulance"
}
},
distance = 1.5
})
end
for k, v in pairs(Config.Locations["roof"]) do
exports['qb-target']:AddBoxZone("roof" .. k, vector3(v.x, v.y, v.z), 2, 2, {
name = "roof" .. k,
debugPoly = Config.Debug,
heading = -20,
minZ = v.z - 2,
maxZ = v.z + 2,
}, {
options = {
{
type = "client",
event = "qb-ambulancejob:elevator_roof",
icon = "fas fa-hand-point-up",
label = "Tag elevator",
job = "ambulance"
},
},
distance = 8
})
end
for k, v in pairs(Config.Locations["main"]) do
exports['qb-target']:AddBoxZone("main" .. k, vector3(v.x, v.y, v.z), 1.5, 1.5, {
name = "main" .. k,
debugPoly = Config.Debug,
heading = -20,
minZ = v.z - 2,
maxZ = v.z + 2,
}, {
options = {
{
type = "client",
event = "qb-ambulancejob:elevator_main",
icon = "fas fa-hand-point-up",
label = "Tag elevator op",
job = "ambulance"
},
{
type = "client",
event = "qb-ambulancejob:elevator_basement",
icon = "fas fa-hand-point-down",
label = "Tag elevator ned",
job = "ambulance"
}
},
distance = 8
})
end
for k, v in pairs(Config.Locations["basement"]) do
exports['qb-target']:AddBoxZone("basement" .. k, vector3(v.x, v.y, v.z), 1.5, 1.5, {
name = "basement" .. k,
debugPoly = Config.Debug,
heading = -20,
minZ = v.z - 2,
maxZ = v.z + 2,
}, {
options = {
{
type = "client",
event = "qb-ambulancejob:elevator_basement-main",
icon = "fas fa-hand-point-up",
label = "Tag elevator op",
job = "ambulance"
},
},
distance = 8
})
end
end)
else
CreateThread(function()
local signPoly = {}
for k, v in pairs(Config.Locations["duty"]) do
signPoly[#signPoly + 1] = BoxZone:Create(vector3(vector3(v.x, v.y, v.z)), 1.5, 1, {
name = "sign" .. k,
debugPoly = Config.Debug,
heading = -20,
minZ = v.z - 2,
maxZ = v.z + 2,
})
end
local signCombo = ComboZone:Create(signPoly, { name = "signcombo", debugPoly = false })
signCombo:onPlayerInOut(function(isPointInside)
if isPointInside and PlayerJob.name == "ambulance" then
if not onDuty then
exports['qb-core']:DrawText(Lang:t('text.onduty_button'), 'top')
EMSControls("sign")
else
exports['qb-core']:DrawText(Lang:t('text.offduty_button'), 'top')
EMSControls("sign")
end
else
check = false
exports['qb-core']:HideText()
end
end)
local stashPoly = {}
for k, v in pairs(Config.Locations["stash"]) do
stashPoly[#stashPoly + 1] = BoxZone:Create(vector3(vector3(v.x, v.y, v.z)), 1, 1, {
name = "stash" .. k,
debugPoly = Config.Debug,
heading = -20,
minZ = v.z - 2,
maxZ = v.z + 2,
})
end
local stashCombo = ComboZone:Create(stashPoly, { name = "stashCombo", debugPoly = false })
stashCombo:onPlayerInOut(function(isPointInside)
if isPointInside and PlayerJob.name == "ambulance" then
if onDuty then
exports['qb-core']:DrawText(Lang:t('text.pstash_button'), 'top')
EMSControls("stash")
end
else
check = false
exports['qb-core']:HideText()
end
end)
local armoryPoly = {}
for k, v in pairs(Config.Locations["armory"]) do
armoryPoly[#armoryPoly + 1] = BoxZone:Create(vector3(vector3(v.x, v.y, v.z)), 1, 1, {
name = "armory" .. k,
debugPoly = Config.Debug,
heading = 70,
minZ = v.z - 2,
maxZ = v.z + 2,
})
end
local armoryCombo = ComboZone:Create(armoryPoly, { name = "armoryCombo", debugPoly = false })
armoryCombo:onPlayerInOut(function(isPointInside)
if isPointInside and PlayerJob.name == "ambulance" then
if onDuty then
exports['qb-core']:DrawText(Lang:t('text.armory_button'), 'top')
EMSControls("armory")
end
else
check = false
exports['qb-core']:HideText()
end
end)
local roofPoly = {}
for k, v in pairs(Config.Locations["roof"]) do
roofPoly[#roofPoly + 1] = BoxZone:Create(vector3(vector3(v.x, v.y, v.z)), 2, 2, {
name = "roof" .. k,
debugPoly = Config.Debug,
heading = 70,
minZ = v.z - 2,
maxZ = v.z + 2,
})
end
local roofCombo = ComboZone:Create(roofPoly, { name = "roofCombo", debugPoly = false })
roofCombo:onPlayerInOut(function(isPointInside)
if isPointInside and PlayerJob.name == "ambulance" then
if onDuty then
exports['qb-core']:DrawText(Lang:t('text.elevator_main'), 'top')
EMSControls("main")
else
exports['qb-core']:DrawText(Lang:t('error.not_ems'), 'top')
end
else
check = false
exports['qb-core']:HideText()
end
end)
local mainPoly = {}
for k, v in pairs(Config.Locations["main"]) do
mainPoly[#mainPoly + 1] = BoxZone:Create(vector3(vector3(v.x, v.y, v.z)), 1.5, 1.5, {
name = "main" .. k,
debugPoly = Config.Debug,
heading = 70,
minZ = v.z - 2,
maxZ = v.z + 2,
})
end
local mainCombo = ComboZone:Create(mainPoly, { name = "mainPoly", debugPoly = false })
mainCombo:onPlayerInOut(function(isPointInside)
if isPointInside and PlayerJob.name == "ambulance" then
if onDuty then
exports['qb-core']:DrawText(Lang:t('text.elevator_roof'), 'top')
EMSControls("roof")
else
exports['qb-core']:DrawText(Lang:t('error.not_ems'), 'top')
end
else
check = false
exports['qb-core']:HideText()
end
end)
end)
end