mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-30 17:58:54 +00:00
Implemented dead player blips, closes #46 (read desc)
- Fixed vehicles in vehicle shop not unloading - Use busy spinner instead of drawing when loading vehicles
This commit is contained in:
+51
-27
@@ -1,6 +1,6 @@
|
||||
local CurrentAction, CurrentActionMsg, CurrentActionData = nil, '', {}
|
||||
local HasAlreadyEnteredMarker, LastHospital, LastPart, LastPartNum
|
||||
local isBusy = false
|
||||
local isBusy, deadPlayers, deadPlayerBlips, isOnDuty = false, {}, {}, false
|
||||
local spawnedVehicles, isInShopMenu = {}, false
|
||||
|
||||
function OpenAmbulanceActionsMenu()
|
||||
@@ -407,11 +407,16 @@ function OpenCloakroomMenu()
|
||||
elements = {
|
||||
{label = _U('ems_clothes_civil'), value = 'citizen_wear'},
|
||||
{label = _U('ems_clothes_ems'), value = 'ambulance_wear'},
|
||||
}
|
||||
}, function(data, menu)
|
||||
}}, function(data, menu)
|
||||
if data.current.value == 'citizen_wear' then
|
||||
ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)
|
||||
TriggerEvent('skinchanger:loadSkin', skin)
|
||||
isOnDuty = false
|
||||
|
||||
for playerId,v in pairs(deadPlayerBlips) do
|
||||
RemoveBlip(v)
|
||||
deadPlayerBlips[playerId] = nil
|
||||
end
|
||||
end)
|
||||
elseif data.current.value == 'ambulance_wear' then
|
||||
ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)
|
||||
@@ -420,6 +425,8 @@ function OpenCloakroomMenu()
|
||||
else
|
||||
TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_female)
|
||||
end
|
||||
|
||||
isOnDuty = true
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -768,12 +775,13 @@ function OpenShopMenu(elements, restoreCoords, shopCoords)
|
||||
ESX.Game.Teleport(playerPed, restoreCoords)
|
||||
end, function(data, menu)
|
||||
DeleteSpawnedVehicles()
|
||||
|
||||
WaitForVehicleToLoad(data.current.model)
|
||||
|
||||
ESX.Game.SpawnLocalVehicle(data.current.model, shopCoords, 0.0, function(vehicle)
|
||||
table.insert(spawnedVehicles, vehicle)
|
||||
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
||||
FreezeEntityPosition(vehicle, true)
|
||||
SetModelAsNoLongerNeeded(data.current.model)
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -782,6 +790,7 @@ function OpenShopMenu(elements, restoreCoords, shopCoords)
|
||||
table.insert(spawnedVehicles, vehicle)
|
||||
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
||||
FreezeEntityPosition(vehicle, true)
|
||||
SetModelAsNoLongerNeeded(elements[1].model)
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -812,35 +821,19 @@ function WaitForVehicleToLoad(modelHash)
|
||||
if not HasModelLoaded(modelHash) then
|
||||
RequestModel(modelHash)
|
||||
|
||||
BeginTextCommandBusyspinnerOn('STRING')
|
||||
AddTextComponentSubstringPlayerName(_U('vehicleshop_awaiting_model'))
|
||||
EndTextCommandBusyspinnerOn(4)
|
||||
|
||||
while not HasModelLoaded(modelHash) do
|
||||
Citizen.Wait(0)
|
||||
|
||||
DisableControlAction(0, 27, true)
|
||||
DisableControlAction(0, 173, true)
|
||||
DisableControlAction(0, 174, true)
|
||||
DisableControlAction(0, 175, true)
|
||||
DisableControlAction(0, 176, true) -- ENTER key
|
||||
DisableControlAction(0, 177, true)
|
||||
|
||||
drawLoadingText(_U('vehicleshop_awaiting_model'), 255, 255, 255, 255)
|
||||
DisableAllControlActions(0)
|
||||
end
|
||||
|
||||
BusyspinnerOff()
|
||||
end
|
||||
end
|
||||
|
||||
function drawLoadingText(text, red, green, blue, alpha)
|
||||
SetTextFont(4)
|
||||
SetTextScale(0.0, 0.5)
|
||||
SetTextColour(red, green, blue, alpha)
|
||||
SetTextDropshadow(0, 0, 0, 0, 255)
|
||||
SetTextDropShadow()
|
||||
SetTextOutline()
|
||||
SetTextCentre(true)
|
||||
|
||||
BeginTextCommandDisplayText("STRING")
|
||||
AddTextComponentSubstringPlayerName(text)
|
||||
EndTextCommandDisplayText(0.5, 0.5)
|
||||
end
|
||||
|
||||
function OpenPharmacyMenu()
|
||||
ESX.UI.Menu.CloseAll()
|
||||
|
||||
@@ -898,3 +891,34 @@ AddEventHandler('esx_ambulancejob:heal', function(healType, quiet)
|
||||
ESX.ShowNotification(_U('healed'))
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_ambulancejob:setDeadPlayers')
|
||||
AddEventHandler('esx_ambulancejob:setDeadPlayers', function(_deadPlayers)
|
||||
deadPlayers = _deadPlayers
|
||||
|
||||
if isOnDuty then
|
||||
for playerId,v in pairs(deadPlayerBlips) do
|
||||
RemoveBlip(v)
|
||||
deadPlayerBlips[playerId] = nil
|
||||
end
|
||||
|
||||
for playerId,status in pairs(deadPlayers) do
|
||||
if status == 'distress' then
|
||||
local player = GetPlayerFromServerId(playerId)
|
||||
local playerPed = GetPlayerPed(player)
|
||||
local blip = AddBlipForEntity(playerPed)
|
||||
|
||||
SetBlipSprite(blip, 303)
|
||||
SetBlipColour(blip, 1)
|
||||
SetBlipFlashes(blip, true)
|
||||
SetBlipCategory(blip, 7)
|
||||
|
||||
BeginTextCommandSetBlipName('STRING')
|
||||
AddTextComponentSubstringPlayerName(_U('blip_dead'))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
|
||||
deadPlayerBlips[playerId] = blip
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
+9
-21
@@ -109,7 +109,7 @@ AddEventHandler('esx_ambulancejob:useItem', function(itemName)
|
||||
Citizen.Wait(0)
|
||||
DisableAllControlActions(0)
|
||||
end
|
||||
|
||||
|
||||
TriggerEvent('esx_ambulancejob:heal', 'big', true)
|
||||
ESX.ShowNotification(_U('used_medikit'))
|
||||
end)
|
||||
@@ -151,16 +151,8 @@ function StartDistressSignal()
|
||||
AddTextComponentSubstringPlayerName(_U('distress_send'))
|
||||
EndTextCommandDisplayText(0.175, 0.805)
|
||||
|
||||
if IsControlPressed(0, 47) then
|
||||
if IsControlJustReleased(0, 47) then
|
||||
SendDistressSignal()
|
||||
|
||||
Citizen.CreateThread(function()
|
||||
Citizen.Wait(1000 * 60 * 5)
|
||||
if isDead then
|
||||
StartDistressSignal()
|
||||
end
|
||||
end)
|
||||
|
||||
break
|
||||
end
|
||||
end
|
||||
@@ -172,11 +164,7 @@ function SendDistressSignal()
|
||||
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
|
||||
})
|
||||
TriggerServerEvent('esx_ambulancejob:onPlayerDistress')
|
||||
end
|
||||
|
||||
function DrawGenericTextThisFrame()
|
||||
@@ -195,9 +183,9 @@ function secondsToClock(seconds)
|
||||
if seconds <= 0 then
|
||||
return 0, 0
|
||||
else
|
||||
local hours = string.format("%02.f", math.floor(seconds / 3600))
|
||||
local mins = string.format("%02.f", math.floor(seconds / 60 - (hours * 60)))
|
||||
local secs = string.format("%02.f", math.floor(seconds - hours * 3600 - mins * 60))
|
||||
local hours = string.format('%02.f', math.floor(seconds / 3600))
|
||||
local mins = string.format('%02.f', math.floor(seconds / 60 - (hours * 60)))
|
||||
local secs = string.format('%02.f', math.floor(seconds - hours * 3600 - mins * 60))
|
||||
|
||||
return mins, secs
|
||||
end
|
||||
@@ -245,7 +233,7 @@ function StartDeathTimer()
|
||||
|
||||
DrawGenericTextThisFrame()
|
||||
|
||||
SetTextEntry("STRING")
|
||||
SetTextEntry('STRING')
|
||||
AddTextComponentString(text)
|
||||
DrawText(0.5, 0.8)
|
||||
end
|
||||
@@ -280,11 +268,11 @@ function StartDeathTimer()
|
||||
|
||||
DrawGenericTextThisFrame()
|
||||
|
||||
SetTextEntry("STRING")
|
||||
SetTextEntry('STRING')
|
||||
AddTextComponentString(text)
|
||||
DrawText(0.5, 0.8)
|
||||
end
|
||||
|
||||
|
||||
if bleedoutTimer < 1 and isDead then
|
||||
RemoveItemsAfterRPDeath()
|
||||
end
|
||||
|
||||
@@ -77,7 +77,6 @@ Locales['br'] = {
|
||||
['respawn_bleedout_fine_msg'] = 'você precisa pagar ~r~$%s~s~ para reviver',
|
||||
['distress_send'] = 'pressione [~b~G~s~] enviar sinal de socorro',
|
||||
['distress_sent'] = 'sinal de socorro foi enviado para as unidades disponíveis!',
|
||||
['distress_message'] = 'atenção médica necessária: cidadão inconsciente!',
|
||||
['combatlog_message'] = 'você foi revivido porque deixou o servidor anteriormente quando estava morto.',
|
||||
-- Revive
|
||||
['revive_help'] = 'reviver um cidadão',
|
||||
|
||||
@@ -77,7 +77,6 @@ Locales['cs'] = {
|
||||
['respawn_bleedout_fine_msg'] = 'zaplatili jste ~r~$%s~s~ za respawn.',
|
||||
['distress_send'] = 'stiskněte [~b~G~s~] pro vyslání tísňového signálu',
|
||||
['distress_sent'] = 'tísňový signál byl vyslán dostupným jednotkám!',
|
||||
['distress_message'] = 'nutná lékařská péče: občan v bezvědomí!',
|
||||
['combatlog_message'] = 'byli jste násilně oživeni, protože jste předtím opustili server, když jste byli mrtví.',
|
||||
-- Revive
|
||||
['revive_help'] = 'oživit hráče',
|
||||
|
||||
@@ -77,7 +77,6 @@ Locales['en'] = {
|
||||
['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.',
|
||||
['distress_send'] = 'press [~b~G~s~] to send distress signal',
|
||||
['distress_sent'] = 'distress signal has been sent to available units!',
|
||||
['distress_message'] = 'medical attention required: unconscious citizen!',
|
||||
['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.',
|
||||
-- Revive
|
||||
['revive_help'] = 'revive a player',
|
||||
|
||||
@@ -77,7 +77,6 @@ Locales['es'] = {
|
||||
['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.',
|
||||
['distress_send'] = 'press [~b~G~s~] to send distress signal',
|
||||
['distress_sent'] = 'distress signal has been sent to available units!',
|
||||
['distress_message'] = 'medical attention required: unconscious citizen!',
|
||||
['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.',
|
||||
-- Revive
|
||||
['revive_help'] = 'reviver un jugador',
|
||||
|
||||
@@ -77,7 +77,6 @@ Locales['fi'] = {
|
||||
['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.',
|
||||
['distress_send'] = 'press [~b~G~s~] to send distress signal',
|
||||
['distress_sent'] = 'distress signal has been sent to available units!',
|
||||
['distress_message'] = 'medical attention required: unconscious citizen!',
|
||||
['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.',
|
||||
-- Revive
|
||||
['revive_help'] = 'elvytä pelaaja',
|
||||
|
||||
@@ -77,7 +77,6 @@ Locales['fr'] = {
|
||||
['respawn_bleedout_fine_msg'] = 'vous avez payé ~r~$%s~s~ pour être réanimer.',
|
||||
['distress_send'] = 'appuyez sur [~b~G~s~] pour envoyer un signal de détresse',
|
||||
['distress_sent'] = 'un signal a été envoyé à toutes les unités disponibles!',
|
||||
['distress_message'] = 'interventtion requise: citoyen inconscient!',
|
||||
['combatlog_message'] = 'vous avez été réanimé de force car vous avez quitté le serveur.',
|
||||
-- Revive
|
||||
['revive_help'] = 'relancer un joueur',
|
||||
|
||||
@@ -77,7 +77,6 @@ Locales['pl'] = {
|
||||
['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.',
|
||||
['distress_send'] = 'press [~b~G~s~] to send distress signal',
|
||||
['distress_sent'] = 'distress signal has been sent to available units!',
|
||||
['distress_message'] = 'medical attention required: unconscious citizen!',
|
||||
['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.',
|
||||
-- Revive
|
||||
['revive_help'] = 'ożyw gracza',
|
||||
|
||||
@@ -77,7 +77,6 @@ Locales['sv'] = {
|
||||
['respawn_bleedout_fine_msg'] = 'du betalade ~r~%s SEK~s~ för att respawna.',
|
||||
['distress_send'] = 'tryck ~b~[G]~s~ för att skicka nödsignal',
|
||||
['distress_sent'] = 'nödsignal har skickats till samtliga enheter!',
|
||||
['distress_message'] = 'läkarvård krävs: medvetslös medborgare!',
|
||||
['combatlog_message'] = 'du har force-respawnats på grund av att du lämnat servern medans du var död',
|
||||
-- Revive
|
||||
['revive_help'] = 'återuppliva en spelare',
|
||||
|
||||
+42
-8
@@ -1,8 +1,12 @@
|
||||
ESX = nil
|
||||
local playersHealing = {}
|
||||
local playersHealing, deadPlayers = {}, {}
|
||||
|
||||
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj 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'})
|
||||
|
||||
RegisterNetEvent('esx_ambulancejob:revive')
|
||||
AddEventHandler('esx_ambulancejob:revive', function(playerId)
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
@@ -11,15 +15,49 @@ AddEventHandler('esx_ambulancejob:revive', function(playerId)
|
||||
local xTarget = ESX.GetPlayerFromId(playerId)
|
||||
|
||||
if xTarget then
|
||||
xPlayer.showNotification(_U('revive_complete_award', xTarget.name, Config.ReviveReward))
|
||||
xPlayer.addMoney(Config.ReviveReward)
|
||||
xTarget.triggerEvent('esx_ambulancejob:revive')
|
||||
if deadPlayers[playerId] then
|
||||
xPlayer.showNotification(_U('revive_complete_award', xTarget.name, Config.ReviveReward))
|
||||
xPlayer.addMoney(Config.ReviveReward)
|
||||
xTarget.triggerEvent('esx_ambulancejob:revive')
|
||||
deadPlayers[playerId] = nil
|
||||
else
|
||||
xPlayer.showNotification(_U('player_not_unconscious'))
|
||||
end
|
||||
else
|
||||
xPlayer.showNotification(_U('revive_fail_offline'))
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx:onPlayerDeath')
|
||||
AddEventHandler('esx:onPlayerDeath', function(data)
|
||||
deadPlayers[source] = 'dead'
|
||||
TriggerClientEvent('esx_ambulancejob:setDeadPlayers', -1, deadPlayers)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_ambulancejob:onPlayerDistress')
|
||||
AddEventHandler('esx_ambulancejob:onPlayerDistress', function()
|
||||
if deadPlayers[source] then
|
||||
deadPlayers[source] = 'distress'
|
||||
TriggerClientEvent('esx_ambulancejob:setDeadPlayers', -1, deadPlayers)
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_ambulancejob:onPlayerSpawn')
|
||||
AddEventHandler('esx_ambulancejob:onPlayerSpawn', function()
|
||||
if deadPlayers[source] then
|
||||
deadPlayers[source] = nil
|
||||
TriggerClientEvent('esx_ambulancejob:setDeadPlayers', -1, deadPlayers)
|
||||
end
|
||||
end)
|
||||
|
||||
AddEventHandler('esx:playerDropped', function(playerId, reason)
|
||||
if deadPlayers[playerId] then
|
||||
deadPlayers[playerId] = nil
|
||||
TriggerClientEvent('esx_ambulancejob:setDeadPlayers', -1, deadPlayers)
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_ambulancejob:heal')
|
||||
AddEventHandler('esx_ambulancejob:heal', function(target, type)
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
@@ -38,10 +76,6 @@ AddEventHandler('esx_ambulancejob:putInVehicle', function(target)
|
||||
end
|
||||
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'})
|
||||
|
||||
ESX.RegisterServerCallback('esx_ambulancejob:removeItemsAfterRPDeath', function(source, cb)
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user