1026 lines
37 KiB
Lua
1026 lines
37 KiB
Lua
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
|