Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 19

local Keys = {

["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] =
167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57,
["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165,
["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83,
["BACKSPACE"] = 177,
["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"]
= 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18,
["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] =
74, ["K"] = 311, ["L"] = 182,
["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29,
["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81,
["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70,
["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178,
["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173,
["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] =
97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118
}

local GUI = {}
local PlayerData = {}
local FirstSpawn = true
local IsDead = false
local HasAlreadyEnteredMarker = false
local LastZone = nil
local CurrentAction = nil
local CurrentActionMsg = ''
local CurrentActionData = {}

ESX = nil
GUI.Time = 0

Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.Wait(0)
end

Citizen.Wait(5000)
PlayerData = ESX.GetPlayerData()
end)

function RespawnPed(ped, coords)


SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false,
false, true)
NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, coords.heading,
true, false)
SetPlayerInvincible(ped, false)
TriggerEvent('playerSpawned', coords.x, coords.y, coords.z, coords.heading)
ClearPedBloodDamage(ped)

ESX.UI.Menu.CloseAll()
end

RegisterNetEvent('esx_ambulancejob:heal')
AddEventHandler('esx_ambulancejob:heal', function(_type)
local playerPed = GetPlayerPed(-1)
local maxHealth = GetEntityMaxHealth(playerPed)
if _type == 'small' then
local health = GetEntityHealth(playerPed)
local newHealth = math.min(maxHealth , math.floor(health +
maxHealth/8))
SetEntityHealth(playerPed, newHealth)
elseif _type == 'big' then
SetEntityHealth(playerPed, maxHealth)
end
ESX.ShowNotification(_U('healed'))
end)

function StartRespawnToHospitalMenuTimer()
ESX.SetTimeout(Config.MenuRespawnToHospitalDelay, function()
if IsDead then
ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'respawn_hospital',
{
title = _U('respawn_at_hospital'),
align = 'bottom-right',
elements = {
{label = _U('no'), value = 'no'},
{label = _U('yes'), value = 'yes'}
}
}, function(data, menu)
if data.current.value == 'yes' then
RemoveItemsAfterRPDeath()
end
menu.close()
end)
end
end)
end

function StartRespawnTimer()
ESX.SetTimeout(Config.RespawnDelayAfterRPDeath, function()
if IsDead then
RemoveItemsAfterRPDeath()
end
end)
end

function StartDistressSignal()
Citizen.CreateThread(function()
local timer = Config.RespawnDelayAfterRPDeath

while timer > 0 and IsDead do


Citizen.Wait(2)
timer = timer - 30

SetTextFont(4)
SetTextProportional(1)
SetTextScale(0.45, 0.45)
SetTextColour(185, 185, 185, 255)
SetTextDropShadow(0, 0, 0, 0, 255)
SetTextEdge(1, 0, 0, 0, 255)
SetTextDropShadow()
SetTextOutline()
BeginTextCommandDisplayText('STRING')
AddTextComponentSubstringPlayerName(_U('distress_send'))
EndTextCommandDisplayText(0.175, 0.805)
if IsControlPressed(0, Keys['G']) then
SendDistressSignal()
break
end
end
end)
end

function SendDistressSignal()
local playerPed = GetPlayerPed(-1)
local coords = GetEntityCoords(playerPed)

ESX.ShowNotification(_U('distress_sent'))
TriggerServerEvent('esx_phone:send', 'ambulance', _U('distress_message'),
false, {
x = coords.x,
y = coords.y,
z = coords.z
})
end

function ShowTimer()
local timer = Config.RespawnDelayAfterRPDeath

Citizen.CreateThread(function()
while timer > 0 and IsDead do
Citizen.Wait(0)

raw_seconds = timer/1000
raw_minutes = raw_seconds/60
minutes = stringsplit(raw_minutes, ".")[1]
seconds = stringsplit(raw_seconds-(minutes*60), ".")[1]

SetTextFont(4)
SetTextProportional(0)
SetTextScale(0.0, 0.5)
SetTextColour(255, 255, 255, 255)
SetTextDropshadow(0, 0, 0, 0, 255)
SetTextEdge(1, 0, 0, 0, 255)
SetTextDropShadow()
SetTextOutline()

local text = _U('please_wait', minutes, seconds)

if Config.EarlyRespawn then
text = text .. '\n[~b~E~s~]'
end

SetTextCentre(true)
BeginTextCommandDisplayText("STRING")
AddTextComponentSubstringPlayerName(text)
EndTextCommandDisplayText(0.5, 0.8)

if Config.EarlyRespawn then
if IsControlPressed(0, Keys['E']) then
RemoveItemsAfterRPDeath()
break
end
end
timer = timer - 15
end

if Config.EarlyRespawn then
while timer <= 0 and IsDead do
Citizen.Wait(0)

SetTextFont(4)
SetTextProportional(0)
SetTextScale(0.0, 0.5)
SetTextColour(255, 255, 255, 255)
SetTextDropshadow(0, 0, 0, 0, 255)
SetTextEdge(1, 0, 0, 0, 255)
SetTextDropShadow()
SetTextOutline()
SetTextCentre(true)

BeginTextCommandDisplayText("STRING")
AddTextComponentSubstringPlayerName(_U('press_respawn'))
EndTextCommandDisplayText(0.5, 0.8)

if IsControlPressed(0, Keys['E']) then


RemoveItemsAfterRPDeath()
break
end
end
end
end)
end

function RemoveItemsAfterRPDeath()
TriggerServerEvent('esx_ambulancejob:setDeathStatus', 0)

Citizen.CreateThread(function()
DoScreenFadeOut(800)
while not IsScreenFadedOut() do
Citizen.Wait(10)
end

ESX.TriggerServerCallback('esx_ambulancejob:removeItemsAfterRPDeath',
function()
ESX.SetPlayerData('lastPosition',
Config.Zones.HospitalInteriorInside1.Pos)
ESX.SetPlayerData('loadout', {})

TriggerServerEvent('esx:updateLastPosition',
Config.Zones.HospitalInteriorInside1.Pos)
RespawnPed(GetPlayerPed(-1),
Config.Zones.HospitalInteriorInside1.Pos)

StopScreenEffect('DeathFailOut')
DoScreenFadeIn(800)
end)
end)
end

function OnPlayerDeath()
IsDead = true
TriggerServerEvent('esx_ambulancejob:setDeathStatus', 1)

if Config.ShowDeathTimer == true then


ShowTimer()
end

StartRespawnTimer()
StartDistressSignal()

if Config.RespawnToHospitalMenuTimer then
StartRespawnToHospitalMenuTimer()
end

ClearPedTasksImmediately(GetPlayerPed(-1))
StartScreenEffect('DeathFailOut', 0, false)
end

function TeleportFadeEffect(entity, coords)

Citizen.CreateThread(function()

DoScreenFadeOut(800)

while not IsScreenFadedOut() do


Citizen.Wait(0)
end

ESX.Game.Teleport(entity, coords, function()


DoScreenFadeIn(800)
end)

end)

end

function WarpPedInClosestVehicle(ped)

local coords = GetEntityCoords(ped)

local vehicle, distance = ESX.Game.GetClosestVehicle({


x = coords.x,
y = coords.y,
z = coords.z
})

if distance ~= -1 and distance <= 5.0 then

local maxSeats = GetVehicleMaxNumberOfPassengers(vehicle)


local freeSeat = nil

for i=maxSeats - 1, 0, -1 do
if IsVehicleSeatFree(vehicle, i) then
freeSeat = i
break
end
end

if freeSeat ~= nil then


TaskWarpPedIntoVehicle(ped, vehicle, freeSeat)
end

else
ESX.ShowNotification(_U('no_vehicles'))
end

end

function OpenAmbulanceActionsMenu()

local elements = {
{label = _U('cloakroom'), value = 'cloakroom'}
}

if Config.EnablePlayerManagement and PlayerData.job.grade_name == 'boss' then


table.insert(elements, {label = _U('boss_actions'), value = 'boss_actions'})
end

ESX.UI.Menu.CloseAll()

ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'ambulance_actions',
{
title = _U('ambulance'),
align = 'top-left',
elements = elements
},
function(data, menu)

if data.current.value == 'cloakroom' then


OpenCloakroomMenu()
end

if data.current.value == 'boss_actions' then


TriggerEvent('esx_society:openBossMenu', 'ambulance', function(data, menu)
menu.close()
end, {wash = false})
end

end,
function(data, menu)

menu.close()

CurrentAction = 'ambulance_actions_menu'
CurrentActionMsg = _U('open_menu')
CurrentActionData = {}

end
)

end

function OpenMobileAmbulanceActionsMenu()

ESX.UI.Menu.CloseAll()

ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'mobile_ambulance_actions',
{
title = _U('ambulance'),
align = 'top-left',
elements = {
{label = _U('ems_menu'), value = 'citizen_interaction'},
}
}, function(data, menu)
if data.current.value == 'citizen_interaction' then
ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'citizen_interaction',
{
title = _U('ems_menu_title'),
align = 'top-left',
elements = {
{label = _U('ems_menu_revive'), value =
'revive'},
{label = _U('ems_menu_small'), value = 'small'},
{label = _U('ems_menu_big'), value = 'big'},
{label = _U('ems_menu_putincar'), value =
'put_in_vehicle'}
}
}, function(data, menu)
if data.current.value == 'revive' then -- revive

local closestPlayer, closestDistance =


ESX.Game.GetClosestPlayer()

if closestPlayer == -1 or closestDistance > 3.0


then
ESX.ShowNotification(_U('no_players'))
else

ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(qtty)
if qtty > 0 then
local closestPlayerPed =
GetPlayerPed(closestPlayer)
local health =
GetEntityHealth(closestPlayerPed)

if health == 0 then
local playerPed =
GetPlayerPed(-1)

ESX.ShowNotification(_U('revive_inprogress'))

TaskStartScenarioInPlace(playerPed, 'CODE_HUMAN_MEDIC_TEND_TO_DEAD', 0, true)


Citizen.Wait(10000)
ClearPedTasks(playerPed)

TriggerServerEvent('esx_ambulancejob:removeItem', 'medikit')

TriggerServerEvent('esx_ambulancejob:revive',
GetPlayerServerId(closestPlayer))

-- Show revive award?


if Config.ReviveReward >
0 then
ESX.ShowNotification(_U('revive_complete_award',
GetPlayerName(closestPlayer), Config.ReviveReward))
else

ESX.ShowNotification(_U('revive_complete', GetPlayerName(closestPlayer)))
end
else

ESX.ShowNotification(_U('player_not_unconscious'))
end
else

ESX.ShowNotification(_U('not_enough_medikit'))
end
end, 'medikit')
end
elseif data.current.value == 'small' then

local closestPlayer, closestDistance =


ESX.Game.GetClosestPlayer()
if closestPlayer == -1 or closestDistance > 3.0
then
ESX.ShowNotification(_U('no_players'))
else

ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(qtty)
if qtty > 0 then
local closestPlayerPed =
GetPlayerPed(closestPlayer)
local health =
GetEntityHealth(closestPlayerPed)

if health > 0 then


local playerPed =
GetPlayerPed(-1)

ESX.ShowNotification(_U('heal_inprogress'))

TaskStartScenarioInPlace(playerPed, 'CODE_HUMAN_MEDIC_TEND_TO_DEAD', 0, true)


Citizen.Wait(10000)
ClearPedTasks(playerPed)

TriggerServerEvent('esx_ambulancejob:removeItem', 'bandage')

TriggerServerEvent('esx_ambulancejob:heal', GetPlayerServerId(closestPlayer),
'small')

ESX.ShowNotification(_U('heal_complete', GetPlayerName(closestPlayer)))
else

ESX.ShowNotification(_U('player_not_conscious'))
end
else

ESX.ShowNotification(_U('not_enough_bandage'))
end
end, 'bandage')
end
elseif data.current.value == 'big' then

local closestPlayer, closestDistance =


ESX.Game.GetClosestPlayer()
if closestPlayer == -1 or closestDistance > 3.0
then
ESX.ShowNotification(_U('no_players'))
else

ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(qtty)
if qtty > 0 then
local closestPlayerPed =
GetPlayerPed(closestPlayer)
local health =
GetEntityHealth(closestPlayerPed)

if health > 0 then


local playerPed =
GetPlayerPed(-1)

ESX.ShowNotification(_U('heal_inprogress'))

TaskStartScenarioInPlace(playerPed, 'CODE_HUMAN_MEDIC_TEND_TO_DEAD', 0, true)


Citizen.Wait(10000)
ClearPedTasks(playerPed)

TriggerServerEvent('esx_ambulancejob:removeItem', 'medikit')

TriggerServerEvent('esx_ambulancejob:heal', GetPlayerServerId(closestPlayer),
'big')

ESX.ShowNotification(_U('heal_complete', GetPlayerName(closestPlayer)))
else

ESX.ShowNotification(_U('player_not_conscious'))
end
else

ESX.ShowNotification(_U('not_enough_medikit'))
end
end, 'medikit')
end
elseif data.current.value == 'put_in_vehicle' then

local closestPlayer, closestDistance =


ESX.Game.GetClosestPlayer()
if closestPlayer == -1 or closestDistance > 3.0
then
ESX.ShowNotification(_U('no_vehicles'))
else
menu.close()

WarpPedInClosestVehicle(GetPlayerPed(closestPlayer))
end
end
end, function(data, menu)
menu.close()
end
)

end

end, function(data, menu)


menu.close()
end
)

end

function OpenCloakroomMenu()

ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'cloakroom',
{
title = _U('cloakroom'),
align = 'top-left',
elements = {
{label = _U('ems_clothes_civil'), value = 'citizen_wear'},
{label = _U('ems_clothes_ems'), value = 'ambulance_wear'},
},
},
function(data, menu)

menu.close()

if data.current.value == 'citizen_wear' then

ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)


TriggerEvent('skinchanger:loadSkin', skin)
end)

end

if data.current.value == 'ambulance_wear' then

ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)

if skin.sex == 0 then
TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_male)
else
TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_female)
end

end)

end

CurrentAction = 'ambulance_actions_menu'
CurrentActionMsg = _U('open_menu')
CurrentActionData = {}

end,
function(data, menu)
menu.close()
end
)
end

function OpenVehicleSpawnerMenu()

ESX.UI.Menu.CloseAll()

if Config.EnableSocietyOwnedVehicles then

local elements = {}

ESX.TriggerServerCallback('esx_society:getVehiclesInGarage',
function(vehicles)

for i=1, #vehicles, 1 do


table.insert(elements, {label =
GetDisplayNameFromVehicleModel(vehicles[i].model) .. ' [' .. vehicles[i].plate ..
']', value = vehicles[i]})
end

ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'vehicle_spawner',
{
title = _U('veh_menu'),
align = 'top-left',
elements = elements,
}, function(data, menu)
menu.close()

local vehicleProps = data.current.value


ESX.Game.SpawnVehicle(vehicleProps.model,
Config.Zones.VehicleSpawnPoint.Pos, 270.0, function(vehicle)
ESX.Game.SetVehicleProperties(vehicle, vehicleProps)
local playerPed = GetPlayerPed(-1)
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
end)
TriggerServerEvent('esx_society:removeVehicleFromGarage',
'ambulance', vehicleProps)

end, function(data, menu)


menu.close()
CurrentAction = 'vehicle_spawner_menu'
CurrentActionMsg = _U('veh_spawn')
CurrentActionData = {}
end
)
end, 'ambulance')

else -- not society vehicles

ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'vehicle_spawner',
{
title = _U('veh_menu'),
align = 'top-left',
elements = Config.AuthorizedVehicles
}, function(data, menu)
menu.close()
ESX.Game.SpawnVehicle(data.current.model,
Config.Zones.VehicleSpawnPoint.Pos, 230.0, function(vehicle)
local playerPed = GetPlayerPed(-1)
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
end)
end, function(data, menu)
menu.close()
CurrentAction = 'vehicle_spawner_menu'
CurrentActionMsg = _U('veh_spawn')
CurrentActionData = {}
end
)
end
end

function OpenPharmacyMenu()
ESX.UI.Menu.CloseAll()

ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'pharmacy',
{
title = _U('pharmacy_menu_title'),
align = 'top-left',
elements = {
{label = _U('pharmacy_take') .. ' ' .. _('medikit'), value =
'medikit'},
{label = _U('pharmacy_take') .. ' ' .. _('bandage'), value =
'bandage'}
},
}, function(data, menu)
TriggerServerEvent('esx_ambulancejob:giveItem', data.current.value)

end, function(data, menu)


menu.close()
CurrentAction = 'pharmacy'
CurrentActionMsg = _U('open_pharmacy')
CurrentActionData = {}
end
)
end

AddEventHandler('playerSpawned', function()
IsDead = false

if FirstSpawn then
TriggerServerEvent('esx_ambulancejob:firstSpawn')
exports.spawnmanager:setAutoSpawn(false) -- disable respawn
FirstSpawn = false
end
end)

RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)

RegisterNetEvent('esx:setJob')
AddEventHandler('esx:setJob', function(job)
PlayerData.job = job
end)
RegisterNetEvent('esx_phone:loaded')
AddEventHandler('esx_phone:loaded', function(phoneNumber, contacts)

local specialContact = {
name = 'Ambulance',
number = 'ambulance',
base64Icon =
'data:image/png;base64,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
'
}

TriggerEvent('esx_phone:addSpecialContact', specialContact.name,
specialContact.number, specialContact.base64Icon)

end)

AddEventHandler('esx:onPlayerDeath', function()
OnPlayerDeath()
end)

RegisterNetEvent('esx_ambulancejob:revive')
AddEventHandler('esx_ambulancejob:revive', function()

local playerPed = GetPlayerPed(-1)


local coords = GetEntityCoords(playerPed)
TriggerServerEvent('esx_ambulancejob:setDeathStatus', 0)

Citizen.CreateThread(function()

DoScreenFadeOut(800)
while not IsScreenFadedOut() do
Citizen.Wait(0)
end

ESX.SetPlayerData('lastPosition', {
x = coords.x,
y = coords.y,
z = coords.z
})

TriggerServerEvent('esx:updateLastPosition', {
x = coords.x,
y = coords.y,
z = coords.z
})

RespawnPed(playerPed, {
x = coords.x,
y = coords.y,
z = coords.z
})

StopScreenEffect('DeathFailOut')

DoScreenFadeIn(800)

end)

end)

AddEventHandler('esx_ambulancejob:hasEnteredMarker', function(zone)

if zone == 'HospitalInteriorEntering1' then


TeleportFadeEffect(GetPlayerPed(-1), Config.Zones.HospitalInteriorInside1.Pos)
end

if zone == 'HospitalInteriorExit1' then


TeleportFadeEffect(GetPlayerPed(-1), Config.Zones.HospitalInteriorOutside1.Pos)
end

if zone == 'HospitalInteriorEntering2' then


local heli = Config.HelicopterSpawner

if not IsAnyVehicleNearPoint(heli.SpawnPoint.x, heli.SpawnPoint.y,


heli.SpawnPoint.z, 3.0)
and PlayerData.job ~= nil and PlayerData.job.name == 'ambulance' then
ESX.Game.SpawnVehicle('polmav', {
x = heli.SpawnPoint.x,
y = heli.SpawnPoint.y,
z = heli.SpawnPoint.z
}, heli.Heading, function(vehicle)
SetVehicleModKit(vehicle, 0)
SetVehicleLivery(vehicle, 1)
end)

end
TeleportFadeEffect(GetPlayerPed(-1), Config.Zones.HospitalInteriorInside2.Pos)
end
if zone == 'HospitalInteriorExit2' then
TeleportFadeEffect(GetPlayerPed(-1), Config.Zones.HospitalInteriorOutside2.Pos)
end

if zone == 'ParkingDoorGoOutInside' then


TeleportFadeEffect(GetPlayerPed(-1), Config.Zones.ParkingDoorGoOutOutside.Pos)
end

if zone == 'ParkingDoorGoInOutside' then


TeleportFadeEffect(GetPlayerPed(-1), Config.Zones.ParkingDoorGoInInside.Pos)
end

if zone == 'StairsGoTopBottom' then


CurrentAction = 'fast_travel_goto_top'
CurrentActionMsg = _U('fast_travel')
CurrentActionData = {pos = Config.Zones.StairsGoTopTop.Pos}
end

if zone == 'StairsGoBottomTop' then


CurrentAction = 'fast_travel_goto_bottom'
CurrentActionMsg = _U('fast_travel')
CurrentActionData = {pos = Config.Zones.StairsGoBottomBottom.Pos}
end

if zone == 'AmbulanceActions' then


CurrentAction = 'ambulance_actions_menu'
CurrentActionMsg = _U('open_menu')
CurrentActionData = {}
end

if zone == 'VehicleSpawner' then


CurrentAction = 'vehicle_spawner_menu'
CurrentActionMsg = _U('veh_spawn')
CurrentActionData = {}
end

if zone == 'Pharmacy' then


CurrentAction = 'pharmacy'
CurrentActionMsg = _U('open_pharmacy')
CurrentActionData = {}
end

if zone == 'VehicleDeleter' then

local playerPed = GetPlayerPed(-1)


local coords = GetEntityCoords(playerPed)

if IsPedInAnyVehicle(playerPed, false) then

local vehicle, distance = ESX.Game.GetClosestVehicle({


x = coords.x,
y = coords.y,
z = coords.z
})

if distance ~= -1 and distance <= 1.0 then

CurrentAction = 'delete_vehicle'
CurrentActionMsg = _U('store_veh')
CurrentActionData = {vehicle = vehicle}

end

end

end

end)

function FastTravel(pos)
TeleportFadeEffect(GetPlayerPed(-1), pos)
end

AddEventHandler('esx_ambulancejob:hasExitedMarker', function(zone)
ESX.UI.Menu.CloseAll()
CurrentAction = nil
end)

-- Create blips
Citizen.CreateThread(function()

local blip = AddBlipForCoord(Config.Blip.Pos.x, Config.Blip.Pos.y,


Config.Blip.Pos.z)

SetBlipSprite (blip, Config.Blip.Sprite)


SetBlipDisplay(blip, Config.Blip.Display)
SetBlipScale (blip, Config.Blip.Scale)
SetBlipColour (blip, Config.Blip.Colour)
SetBlipAsShortRange(blip, true)

BeginTextCommandSetBlipName("STRING")
AddTextComponentString(_U('hospital'))
EndTextCommandSetBlipName(blip)

end)

-- Display markers
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)

local coords = GetEntityCoords(GetPlayerPed(-1))


for k,v in pairs(Config.Zones) do
if(v.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y,
v.Pos.z, true) < Config.DrawDistance) then
if PlayerData.job ~= nil and PlayerData.job.name == 'ambulance'
then
DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0,
0.0, 0.0, Config.MarkerSize.x, Config.MarkerSize.y, Config.MarkerSize.z,
Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true,
2, false, false, false, false)
elseif k ~= 'AmbulanceActions' and k ~= 'VehicleSpawner' and k ~=
'VehicleDeleter'
and k ~= 'Pharmacy' and k ~= 'StairsGoTopBottom' and k ~=
'StairsGoBottomTop' then
DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0,
0.0, 0.0, Config.MarkerSize.x, Config.MarkerSize.y, Config.MarkerSize.z,
Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true,
2, false, false, false, false)
end
end
end
end
end)

-- Activate menu when player is inside marker


Citizen.CreateThread(function()
while true do
Citizen.Wait(10)

local coords = GetEntityCoords(GetPlayerPed(-1))


local isInMarker = false
local currentZone = nil
for k,v in pairs(Config.Zones) do
if PlayerData.job ~= nil and PlayerData.job.name == 'ambulance'
then
if(GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y,
v.Pos.z, true) < Config.MarkerSize.x) then
isInMarker = true
currentZone = k
end
elseif k ~= 'AmbulanceActions' and k ~= 'VehicleSpawner' and k ~=
'VehicleDeleter' and k ~= 'Pharmacy' and k ~= 'StairsGoTopBottom' and k ~=
'StairsGoBottomTop' then
if(GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y,
v.Pos.z, true) < Config.MarkerSize.x) then
isInMarker = true
currentZone = k
end
end
end
if isInMarker and not hasAlreadyEnteredMarker then
hasAlreadyEnteredMarker = true
lastZone = currentZone
TriggerEvent('esx_ambulancejob:hasEnteredMarker', currentZone)
end

if not isInMarker and hasAlreadyEnteredMarker then


hasAlreadyEnteredMarker = false
TriggerEvent('esx_ambulancejob:hasExitedMarker', lastZone)
end
end
end)

-- Key Controls
Citizen.CreateThread(function()
while true do

Citizen.Wait(10)

if CurrentAction ~= nil then

SetTextComponentFormat('STRING')
AddTextComponentString(CurrentActionMsg)
DisplayHelpTextFromStringLabel(0, 0, 1, -1)
if IsControlJustReleased(0, Keys['E']) and PlayerData.job ~= nil and
PlayerData.job.name == 'ambulance' then

if CurrentAction == 'ambulance_actions_menu' then


OpenAmbulanceActionsMenu()
end

if CurrentAction == 'vehicle_spawner_menu' then


OpenVehicleSpawnerMenu()
end

if CurrentAction == 'pharmacy' then


OpenPharmacyMenu()
end

if CurrentAction == 'fast_travel_goto_top' or CurrentAction ==


'fast_travel_goto_bottom' then
FastTravel(CurrentActionData.pos)
end

if CurrentAction == 'delete_vehicle' then


if Config.EnableSocietyOwnedVehicles then
local vehicleProps =
ESX.Game.GetVehicleProperties(CurrentActionData.vehicle)
TriggerServerEvent('esx_society:putVehicleInGarage', 'ambulance',
vehicleProps)
end
ESX.Game.DeleteVehicle(CurrentActionData.vehicle)
end

CurrentAction = nil

end

end

if IsControlJustReleased(0, Keys['F6']) and PlayerData.job ~= nil and


PlayerData.job.name == 'ambulance' then
OpenMobileAmbulanceActionsMenu()
end

end
end)

RegisterNetEvent('esx_ambulancejob:requestDeath')
AddEventHandler('esx_ambulancejob:requestDeath', function()
if Config.AntiCombatLog then
Citizen.Wait(5000)
SetEntityHealth(GetPlayerPed(-1), 0)
end
end)

-- Load unloaded IPLs


if Config.LoadIpl then
Citizen.CreateThread(function()
LoadMpDlcMaps()
EnableMpDlcMaps(true)
RequestIpl('Coroner_Int_on') -- Morgue
end)
end

-- String string
function stringsplit(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={} ; i=1
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str
i = i + 1
end
return t
end

You might also like