From 60eaf7faa8c80a7155dbdc95664408294118ecef Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Fri, 21 Sep 2018 20:46:59 +0200 Subject: [PATCH] Moved job-related functions to seperate file --- __resource.lua | 3 +- client/job.lua | 536 +++++++++++++++++++++++++++++++++ client/main.lua | 777 +++++------------------------------------------- locales/sv.lua | 4 +- server/main.lua | 43 +-- 5 files changed, 641 insertions(+), 722 deletions(-) create mode 100644 client/job.lua diff --git a/__resource.lua b/__resource.lua index 8014bec8..2e95ff1e 100644 --- a/__resource.lua +++ b/__resource.lua @@ -30,7 +30,8 @@ client_scripts { 'locales/sv.lua', 'locales/pl.lua', 'config.lua', - 'client/main.lua' + 'client/main.lua', + 'client/job.lua' } dependency 'es_extended' diff --git a/client/job.lua b/client/job.lua new file mode 100644 index 00000000..80943ecc --- /dev/null +++ b/client/job.lua @@ -0,0 +1,536 @@ +local HasAlreadyEnteredMarker, LastZone, CurrentAction, CurrentActionMsg, CurrentActionData = nil, nil, nil, '', {} + +function OpenAmbulanceActionsMenu() + local elements = { + {label = _U('cloakroom'), value = 'cloakroom'} + } + + if Config.EnablePlayerManagement and ESX.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() + elseif 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 IsBusy then return end + + local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer() + + if closestPlayer == -1 or closestDistance > 3.0 then + ESX.ShowNotification(_U('no_players')) + else + + if data.current.value == 'revive' then + + ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) + if quantity > 0 then + local closestPlayerPed = GetPlayerPed(closestPlayer) + + if IsPedDeadOrDying(closestPlayerPed, 1) then + local playerPed = PlayerPedId() + + IsBusy = true + 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)) + IsBusy = false + + -- 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') + + elseif data.current.value == 'small' then + + ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) + if quantity > 0 then + local closestPlayerPed = GetPlayerPed(closestPlayer) + local health = GetEntityHealth(closestPlayerPed) + + if health > 0 then + local playerPed = PlayerPedId() + + IsBusy = true + 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))) + IsBusy = false + else + ESX.ShowNotification(_U('player_not_conscious')) + end + else + ESX.ShowNotification(_U('not_enough_bandage')) + end + end, 'bandage') + + elseif data.current.value == 'big' then + + ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) + if quantity > 0 then + local closestPlayerPed = GetPlayerPed(closestPlayer) + local health = GetEntityHealth(closestPlayerPed) + + if health > 0 then + local playerPed = PlayerPedId() + + IsBusy = true + 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))) + IsBusy = false + else + ESX.ShowNotification(_U('player_not_conscious')) + end + else + ESX.ShowNotification(_U('not_enough_medikit')) + end + end, 'medikit') + + elseif data.current.value == 'put_in_vehicle' then + TriggerServerEvent('esx_ambulancejob:putInVehicle', GetPlayerServerId(closestPlayer)) + end + end + end, function(data, menu) + menu.close() + end) + end + + end, function(data, menu) + menu.close() + end) +end + + +AddEventHandler('esx_ambulancejob:hasEnteredMarker', function(zone) + if zone == 'HospitalInteriorEntering1' then + TeleportFadeEffect(PlayerPedId(), Config.Zones.HospitalInteriorInside1.Pos) + elseif zone == 'HospitalInteriorExit1' then + TeleportFadeEffect(PlayerPedId(), Config.Zones.HospitalInteriorOutside1.Pos) + elseif zone == 'HospitalInteriorEntering2' then + local heli = Config.HelicopterSpawner + + if not IsAnyVehicleNearPoint(heli.SpawnPoint.x, heli.SpawnPoint.y, heli.SpawnPoint.z, 3.0) and ESX.PlayerData.job ~= nil and ESX.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(PlayerPedId(), Config.Zones.HospitalInteriorInside2.Pos) + elseif zone == 'HospitalInteriorExit2' then + TeleportFadeEffect(PlayerPedId(), Config.Zones.HospitalInteriorOutside2.Pos) + elseif zone == 'ParkingDoorGoOutInside' then + TeleportFadeEffect(PlayerPedId(), Config.Zones.ParkingDoorGoOutOutside.Pos) + elseif zone == 'ParkingDoorGoInOutside' then + TeleportFadeEffect(PlayerPedId(), Config.Zones.ParkingDoorGoInInside.Pos) + elseif zone == 'StairsGoTopBottom' then + CurrentAction = 'fast_travel_goto_top' + CurrentActionMsg = _U('fast_travel') + CurrentActionData = {pos = Config.Zones.StairsGoTopTop.Pos} + elseif zone == 'StairsGoBottomTop' then + CurrentAction = 'fast_travel_goto_bottom' + CurrentActionMsg = _U('fast_travel') + CurrentActionData = {pos = Config.Zones.StairsGoBottomBottom.Pos} + elseif zone == 'AmbulanceActions' then + CurrentAction = 'ambulance_actions_menu' + CurrentActionMsg = _U('open_menu') + CurrentActionData = {} + elseif zone == 'VehicleSpawner' then + CurrentAction = 'vehicle_spawner_menu' + CurrentActionMsg = _U('veh_spawn') + CurrentActionData = {} + elseif zone == 'Pharmacy' then + CurrentAction = 'pharmacy' + CurrentActionMsg = _U('open_pharmacy') + CurrentActionData = {} + elseif zone == 'VehicleDeleter' then + local playerPed = PlayerPedId() + 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(PlayerPedId(), 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(PlayerPedId()) + 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 ESX.PlayerData.job ~= nil and ESX.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(PlayerPedId()) + local isInMarker = false + local currentZone = nil + + for k,v in pairs(Config.Zones) do + if ESX.PlayerData.job ~= nil and ESX.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 + ESX.ShowHelpNotification(CurrentActionMsg) + + if IsControlJustReleased(0, Keys['E']) and ESX.PlayerData.job ~= nil and ESX.PlayerData.job.name == 'ambulance' then + + if CurrentAction == 'ambulance_actions_menu' then + OpenAmbulanceActionsMenu() + elseif CurrentAction == 'vehicle_spawner_menu' then + OpenVehicleSpawnerMenu() + elseif CurrentAction == 'pharmacy' then + OpenPharmacyMenu() + elseif CurrentAction == 'fast_travel_goto_top' or CurrentAction == 'fast_travel_goto_bottom' then + FastTravel(CurrentActionData.pos) + elseif 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 ESX.PlayerData.job ~= nil and ESX.PlayerData.job.name == 'ambulance' and not IsDead then + OpenMobileAmbulanceActionsMenu() + end + end +end) + +RegisterNetEvent('esx_ambulancejob:putInVehicle') +AddEventHandler('esx_ambulancejob:putInVehicle', function() + local playerPed = PlayerPedId() + local coords = GetEntityCoords(playerPed) + + if IsAnyVehicleNearPoint(coords.x, coords.y, coords.z, 5.0) then + local vehicle = GetClosestVehicle(coords.x, coords.y, coords.z, 5.0, 0, 71) + + if DoesEntityExist(vehicle) 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(playerPed, vehicle, freeSeat) + end + end + 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) + if data.current.value == 'citizen_wear' then + ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin) + TriggerEvent('skinchanger:loadSkin', skin) + end) + elseif 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 + + menu.close() + 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 = PlayerPedId() + 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 = PlayerPedId() + 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 + +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 + +RegisterNetEvent('esx_ambulancejob:heal') +AddEventHandler('esx_ambulancejob:heal', function(healType) + local playerPed = PlayerPedId() + local maxHealth = GetEntityMaxHealth(playerPed) + + if healType == 'small' then + local health = GetEntityHealth(playerPed) + local newHealth = math.min(maxHealth , math.floor(health + maxHealth/8)) + SetEntityHealth(playerPed, newHealth) + elseif healType == 'big' then + SetEntityHealth(playerPed, maxHealth) + end + + ESX.ShowNotification(_U('healed')) +end) \ No newline at end of file diff --git a/client/main.lua b/client/main.lua index 93364e4f..169d5697 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,4 +1,4 @@ -local Keys = { +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, @@ -10,17 +10,10 @@ local Keys = { ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 } -local PlayerData = {} -local FirstSpawn = true -local IsDead = false -local HasAlreadyEnteredMarker = false -local LastZone = nil -local CurrentAction = nil -local CurrentActionMsg = '' -local CurrentActionData = {} -local IsBusy = false +local FirstSpawn, IsBusy = true, false -ESX = nil +IsDead = false +ESX = nil Citizen.CreateThread(function() while ESX == nil do @@ -28,43 +21,46 @@ Citizen.CreateThread(function() 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(healType) - local playerPed = PlayerPedId() - local maxHealth = GetEntityMaxHealth(playerPed) - - if healType == 'small' then - local health = GetEntityHealth(playerPed) - local newHealth = math.min(maxHealth , math.floor(health + maxHealth/8)) - SetEntityHealth(playerPed, newHealth) - elseif healType == 'big' then - SetEntityHealth(playerPed, maxHealth) + while ESX.GetPlayerData().job == nil do + Citizen.Wait(100) end - ESX.ShowNotification(_U('healed')) + ESX.PlayerData = ESX.GetPlayerData() end) +RegisterNetEvent('esx:playerLoaded') +AddEventHandler('esx:playerLoaded', function(xPlayer) + ESX.PlayerData = xPlayer +end) -function StartRespawnTimer() - Citizen.SetTimeout(Config.RespawnDelayAfterRPDeath, function() - if IsDead then - RemoveItemsAfterRPDeath() - end - end) +RegisterNetEvent('esx:setJob') +AddEventHandler('esx:setJob', function(job) + ESX.PlayerData.job = job +end) + +AddEventHandler('playerSpawned', function() + IsDead = false + + if FirstSpawn then + TriggerServerEvent('esx_ambulancejob:firstSpawn') + exports.spawnmanager:setAutoSpawn(false) -- disable respawn + FirstSpawn = false + end +end) + +function OnPlayerDeath() + IsDead = true + TriggerServerEvent('esx_ambulancejob:setDeathStatus', 1) + + if Config.ShowDeathTimer == true then + ShowDeathTimer() + end + + StartRespawnTimer() + StartDistressSignal() + + ClearPedTasksImmediately(PlayerPedId()) + StartScreenEffect('DeathFailOut', 0, false) end function StartDistressSignal() @@ -202,29 +198,30 @@ end function PayFine() ESX.TriggerServerCallback('esx_ambulancejob:payFine', function() - RemoveItemsAfterRPDeath() + RemoveItemsAfterRPDeath() end) end -function OnPlayerDeath() - IsDead = true - TriggerServerEvent('esx_ambulancejob:setDeathStatus', 1) +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) - if Config.ShowDeathTimer == true then - ShowDeathTimer() - end + ESX.UI.Menu.CloseAll() +end - StartRespawnTimer() - StartDistressSignal() - - ClearPedTasksImmediately(PlayerPedId()) - StartScreenEffect('DeathFailOut', 0, false) +function StartRespawnTimer() + Citizen.SetTimeout(Config.RespawnDelayAfterRPDeath, function() + if IsDead then + RemoveItemsAfterRPDeath() + end + end) end function TeleportFadeEffect(entity, coords) - Citizen.CreateThread(function() - DoScreenFadeOut(800) while not IsScreenFadedOut() do @@ -234,407 +231,18 @@ function TeleportFadeEffect(entity, coords) 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 IsBusy then return end - 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 = PlayerPedId() - - IsBusy = true - 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)) - IsBusy = false - - -- 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 = PlayerPedId() - - IsBusy = true - 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))) - IsBusy = false - 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 = PlayerPedId() - - IsBusy = true - 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))) - IsBusy = false - 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 = PlayerPedId() - 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 = PlayerPedId() - 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,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAABp5JREFUWIW1l21sFNcVhp/58npn195de23Ha4Mh2EASSvk0CPVHmmCEI0RCTQMBKVVooxYoalBVCVokICWFVFVEFeKoUdNECkZQIlAoFGMhIkrBQGxHwhAcChjbeLcsYHvNfsx+zNz+MBDWNrYhzSvdP+e+c973XM2cc0dihFi9Yo6vSzN/63dqcwPZcnEwS9PDmYoE4IxZIj+ciBb2mteLwlZdfji+dXtNU2AkeaXhCGteLZ/X/IS64/RoR5mh9tFVAaMiAldKQUGiRzFp1wXJPj/YkxblbfFLT/tjq9/f1XD0sQyse2li7pdP5tYeLXXMMGUojAiWKeOodE1gqpmNfN2PFeoF00T2uLGKfZzTwhzqbaEmeYWAQ0K1oKIlfPb7t+7M37aruXvEBlYvnV7xz2ec/2jNs9kKooKNjlksiXhJfLqf1PXOIU9M8fmw/XgRu523eTNyhhu6xLjbSeOFC6EX3t3V9PmwBla9Vv7K7u85d3bpqlwVcvHn7B8iVX+IFQoNKdwfstuFtWoFvwp9zj5XL7nRlPXyudjS9z+u35tmuH/lu6dl7+vSVXmDUcpbX+skP65BxOOPJA4gjDicOM2PciejeTwcsYek1hyl6me5nhNnmwPXBhjYuGC699OpzoaAO0PbYJSy5vgt4idOPrJwf6QuX2FO0oOtqIgj9pDU5dCWrMlyvXf86xsGgHyPeLos83Brns1WFXLxxgVBorHpW4vfQ6KhkbUtCot6srns1TLPjNVr7+1J0PepVc92H/Eagkb7IsTWd4ZMaN+yCXv5zLRY9GQ9xuYtQz4nfreWGdH9dNlkfnGq5/kdO88ekwGan1B3mDJsdMxCqv5w2Iq0khLs48vSllrsG/Y5pfojNugzScnQXKBVA8hrX51ddHq0o6wwIlgS8Y7obZdUZVjOYLC6e3glWkBBVHC2RJ+w/qezCuT/2sV6Q5VYpowjvnf/iBJJqvpYBgBS+w6wVB5DLEOiTZHWy36nNheg0jUBs3PoJnMfyuOdAECqrZ3K7KcACGQp89RAtlysCphqZhPtRzYlcPx+ExklJUiq0le5omCfOGFAYn3qFKS/fZAWS7a3Y2wa+GJOEy4US+B3aaPUYJamj4oI5LA/jWQBt5HIK5+JfXzZsJVpXi/ac8+mxWIXWzAG4Wb4g/jscNMp63I4U5FcKaVvsNyFALokSA47Kx8PVk83OabCHZsiqwAKEpjmfUJIkoh/R+L9oTpjluhRkGSPG4A7EkS+Y3HZk0OXYpIVNy01P5yItnptDsvtIwr0SunqoVP1GG1taTHn1CloXm9aLBEIEDl/IS2W6rg+qIFEYR7+OJTesqJqYa95/VKBNOHLjDBZ8sDS2998a0Bs/F//gvu5Z9NivadOc/U3676pEsizBIN1jCYlhClL+ELJDrkobNUBfBZqQfMN305HAgnIeYi4OnYMh7q/AsAXSdXK+eH41sykxd+TV/AsXvR/MeARAttD9pSqF9nDNfSEoDQsb5O31zQFprcaV244JPY7bqG6Xd9K3C3ALgbfk3NzqNE6CdplZrVFL27eWR+UASb6479ULfhD5AzOlSuGFTE6OohebElbcb8fhxA4xEPUgdTK19hiNKCZgknB+Ep44E44d82cxqPPOKctCGXzTmsBXbV1j1S5XQhyHq6NvnABPylu46A7QmVLpP7w9pNz4IEb0YyOrnmjb8bjB129fDBRkDVj2ojFbYBnCHHb7HL+OC7KQXeEsmAiNrnTqLy3d3+s/bvlVmxpgffM1fyM5cfsPZLuK+YHnvHELl8eUlwV4BXim0r6QV+4gD9Nlnjbfg1vJGktbI5UbN/TcGmAAYDG84Gry/MLLl/zKouO2Xukq/YkCyuWYV5owTIGjhVFCPL6J7kLOTcH89ereF1r4qOsm3gjSevl85El1Z98cfhB3qBN9+dLp1fUTco+0OrVMnNjFuv0chYbBYT2HcBoa+8TALyWQOt/ImPHoFS9SI3WyRajgdt2mbJgIlbREplfveuLf/XXemjXX7v46ZxzPlfd8YlZ01My5MUEVdIY5rueYopw4fQHkbv7/rZkTw6JwjyalBCHur9iD9cI2mU0UzD3P9H6yZ1G5dt7Gwe96w07dl5fXj7vYqH2XsNovdTI6KMrlsAXhRyz7/C7FBO/DubdVq4nBLPaohcnBeMr3/2k4fhQ+Uc8995YPq2wMzNjww2X+vwNt1p00ynrd2yKDJAVN628sBX1hZIdxXdStU9G5W2bd9YHR5L3f/CNmJeY9G8WAAAAAElFTkSuQmCC' + 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(reason) @@ -643,269 +251,40 @@ end) RegisterNetEvent('esx_ambulancejob:revive') AddEventHandler('esx_ambulancejob:revive', function() - local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) TriggerServerEvent('esx_ambulancejob:setDeathStatus', 0) Citizen.CreateThread(function() + DoScreenFadeOut(800) - DoScreenFadeOut(800) + while not IsScreenFadedOut() do + Citizen.Wait(0) + end - while not IsScreenFadedOut() do - Citizen.Wait(0) - end + ESX.SetPlayerData('lastPosition', { + x = coords.x, + y = coords.y, + z = coords.z + }) - ESX.SetPlayerData('lastPosition', { - x = coords.x, - y = coords.y, - z = coords.z - }) + TriggerServerEvent('esx:updateLastPosition', { + 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) + 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(PlayerPedId(), Config.Zones.HospitalInteriorInside1.Pos) - end - - if zone == 'HospitalInteriorExit1' then - TeleportFadeEffect(PlayerPedId(), 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(PlayerPedId(), Config.Zones.HospitalInteriorInside2.Pos) - end - - if zone == 'HospitalInteriorExit2' then - TeleportFadeEffect(PlayerPedId(), Config.Zones.HospitalInteriorOutside2.Pos) - end - - if zone == 'ParkingDoorGoOutInside' then - TeleportFadeEffect(PlayerPedId(), Config.Zones.ParkingDoorGoOutOutside.Pos) - end - - if zone == 'ParkingDoorGoInOutside' then - TeleportFadeEffect(PlayerPedId(), 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 = PlayerPedId() - 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(PlayerPedId(), 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(PlayerPedId()) - 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(PlayerPedId()) - 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' and not IsDead then - OpenMobileAmbulanceActionsMenu() - end - - end -end) RegisterNetEvent('esx_ambulancejob:requestDeath') AddEventHandler('esx_ambulancejob:requestDeath', function() diff --git a/locales/sv.lua b/locales/sv.lua index 6e08adbd..18770e4b 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -11,9 +11,9 @@ Locales['sv'] = { ['helicopter'] = 'helikopter', -- Action Menu ['hospital'] = 'sjukhus', - ['revive_inprogress'] = 'återupplivning pågår . . .', + ['revive_inprogress'] = 'en återupplivning har börjats', ['revive_complete'] = 'du har återupplivat ~y~%s~s~, bra jobbat!', - ['revive_complete_award'] = 'du har återupplivat ~y~%s~s~ och tjärnat ~g~%s SEK~s~ i processen, bra jobbat!', + ['revive_complete_award'] = 'du har återupplivat ~y~%s~s~ och tjärnat ~g~%s SEK~s~ för dina tjänster, bra jobbat!', ['heal_inprogress'] = 'du behandlar patienten!', ['heal_complete'] = 'du har behandlat ~y~%s~s~', ['no_players'] = 'det finns inga spelare i närheten!', diff --git a/server/main.lua b/server/main.lua index 5a2f52f2..2146680c 100644 --- a/server/main.lua +++ b/server/main.lua @@ -16,6 +16,12 @@ AddEventHandler('esx_ambulancejob:heal', function(target, type) TriggerClientEvent('esx_ambulancejob:heal', target, type) end) +RegisterServerEvent('esx_ambulancejob:putInVehicle') +AddEventHandler('esx_ambulancejob:putInVehicle', function(target) + + TriggerClientEvent('esx_ambulancejob:putInVehicle', target) +end) + TriggerEvent('esx_phone:registerNumber', 'ambulance', _U('alert_ambulance'), true, true) TriggerEvent('esx_society:registerSociety', 'ambulance', 'Ambulance', 'society_ambulance', 'society_ambulance', 'society_ambulance', {type = 'public'}) @@ -46,7 +52,7 @@ ESX.RegisterServerCallback('esx_ambulancejob:removeItemsAfterRPDeath', function( for i=1, #xPlayer.loadout, 1 do xPlayer.removeWeapon(xPlayer.loadout[i].name) end - else -- save weapons & restore em' since + else -- save weapons & restore em' since spawnmanager removes them for i=1, #xPlayer.loadout, 1 do table.insert(playerLoadout, xPlayer.loadout[i]) end @@ -67,39 +73,35 @@ end) if Config.EarlyRespawn and Config.EarlyRespawnFine then ESX.RegisterServerCallback('esx_ambulancejob:checkBalance', function(source, cb) - local xPlayer = ESX.GetPlayerFromId(source) local bankBalance = xPlayer.getAccount('bank').money - local finePayable = false - if bankBalance >= Config.EarlyRespawnFineAmount then - finePayable = true - else - finePayable = false - end - - cb(finePayable) + cb(bankBalance >= Config.EarlyRespawnFineAmount) end) ESX.RegisterServerCallback('esx_ambulancejob:payFine', function(source, cb) local xPlayer = ESX.GetPlayerFromId(source) TriggerClientEvent('esx:showNotification', xPlayer.source, _U('respawn_fine', Config.EarlyRespawnFineAmount)) xPlayer.removeAccountMoney('bank', Config.EarlyRespawnFineAmount) + cb() end) end ESX.RegisterServerCallback('esx_ambulancejob:getItemAmount', function(source, cb, item) local xPlayer = ESX.GetPlayerFromId(source) - local qtty = xPlayer.getInventoryItem(item).count - cb(qtty) + local quantity = xPlayer.getInventoryItem(item).count + + cb(quantity) end) RegisterServerEvent('esx_ambulancejob:removeItem') AddEventHandler('esx_ambulancejob:removeItem', function(item) local _source = source local xPlayer = ESX.GetPlayerFromId(_source) + xPlayer.removeInventoryItem(item, 1) + if item == 'bandage' then TriggerClientEvent('esx:showNotification', _source, _U('used_bandage')) elseif item == 'medikit' then @@ -108,17 +110,18 @@ AddEventHandler('esx_ambulancejob:removeItem', function(item) end) RegisterServerEvent('esx_ambulancejob:giveItem') -AddEventHandler('esx_ambulancejob:giveItem', function(item) +AddEventHandler('esx_ambulancejob:giveItem', function(itemName) local _source = source local xPlayer = ESX.GetPlayerFromId(_source) - local limit = xPlayer.getInventoryItem(item).limit - local delta = 1 - local qtty = xPlayer.getInventoryItem(item).count - if limit ~= -1 then - delta = limit - qtty + local item = xPlayer.getInventoryItem(itemName) + local count = 1 + + if item.limit ~= -1 then + count = item.limit - item.count end - if qtty < limit then - xPlayer.addInventoryItem(item, delta) + + if item.count < item.limit then + xPlayer.addInventoryItem(itemName, count) else TriggerClientEvent('esx:showNotification', _source, _U('max_item')) end