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

223 lines
9.2 KiB
Lua
Raw Normal View History

2024-12-29 20:06:22 +00:00
local deadAnimDict = "dead"
local deadAnim = "dead_a"
local hold = 5
deathTime = 0
-- Functions
local function loadAnimDict(dict)
while (not HasAnimDictLoaded(dict)) do
RequestAnimDict(dict)
Wait(5)
end
end
function OnDeath()
if not isDead then
isDead = true
TriggerServerEvent("hospital:server:SetDeathStatus", true)
TriggerServerEvent("InteractSound_SV:PlayOnSource", "demo", 0.1)
local player = PlayerPedId()
while GetEntitySpeed(player) > 0.5 or IsPedRagdoll(player) do
Wait(10)
end
if isDead then
local pos = GetEntityCoords(player)
local heading = GetEntityHeading(player)
local ped = PlayerPedId()
if IsPedInAnyVehicle(ped) then
local veh = GetVehiclePedIsIn(ped)
local vehseats = GetVehicleModelNumberOfSeats(GetHashKey(GetEntityModel(veh)))
for i = -1, vehseats do
local occupant = GetPedInVehicleSeat(veh, i)
if occupant == ped then
NetworkResurrectLocalPlayer(pos.x, pos.y, pos.z + 0.5, heading, true, false)
SetPedIntoVehicle(ped, veh, i)
end
end
else
NetworkResurrectLocalPlayer(pos.x, pos.y, pos.z + 0.5, heading, true, false)
end
SetEntityInvincible(player, true)
SetEntityHealth(player, GetEntityMaxHealth(player))
if IsPedInAnyVehicle(player, false) then
loadAnimDict("veh@low@front_ps@idle_duck")
TaskPlayAnim(player, "veh@low@front_ps@idle_duck", "sit", 1.0, 1.0, -1, 1, 0, 0, 0, 0)
else
loadAnimDict(deadAnimDict)
TaskPlayAnim(player, deadAnimDict, deadAnim, 1.0, 1.0, -1, 1, 0, 0, 0, 0)
end
TriggerServerEvent('hospital:server:ambulanceAlert', Lang:t('info.civ_died'))
end
end
end
function DeathTimer()
hold = 5
while isDead do
Wait(1000)
deathTime = deathTime - 1
if deathTime <= 0 then
if IsControlPressed(0, 38) and hold <= 0 and not isInHospitalBed then
TriggerEvent("hospital:client:RespawnAtHospital")
hold = 5
end
if IsControlPressed(0, 38) then
if hold - 1 >= 0 then
hold = hold - 1
else
hold = 0
end
end
if IsControlReleased(0, 38) then
hold = 5
end
end
end
end
local function DrawTxt(x, y, width, height, scale, text, r, g, b, a, _)
SetTextFont(4)
SetTextProportional(0)
SetTextScale(scale, scale)
SetTextColour(r, g, b, a)
SetTextDropShadow(0, 0, 0, 0,255)
SetTextEdge(2, 0, 0, 0, 255)
SetTextDropShadow()
SetTextOutline()
SetTextEntry("STRING")
AddTextComponentString(text)
DrawText(x - width/2, y - height/2 + 0.005)
end
-- Damage Handler
AddEventHandler('gameEventTriggered', function(event, data)
if event == "CEventNetworkEntityDamage" then
local victim, attacker, victimDied, weapon = data[1], data[2], data[4], data[7]
if not IsEntityAPed(victim) then return end
if victimDied and NetworkGetPlayerIndexFromPed(victim) == PlayerId() and IsEntityDead(PlayerPedId()) then
if not InLaststand then
SetLaststand(true)
elseif InLaststand and not isDead then
SetLaststand(false)
local playerid = NetworkGetPlayerIndexFromPed(victim)
local playerName = GetPlayerName(playerid) .. " " .. "("..GetPlayerServerId(playerid)..")" or Lang:t('info.self_death')
local killerId = NetworkGetPlayerIndexFromPed(attacker)
local killerName = GetPlayerName(killerId) .. " " .. "("..GetPlayerServerId(killerId)..")" or Lang:t('info.self_death')
local weaponLabel = QBCore.Shared.Weapons[weapon].label or 'Ukendt'
local weaponName = QBCore.Shared.Weapons[weapon].name or 'Ukendt'
TriggerServerEvent("qb-log:server:CreateLog", "death", Lang:t('logs.death_log_title', {playername = playerName, playerid = GetPlayerServerId(playerid)}), "red", Lang:t('logs.death_log_message', {killername = killerName, playername = playerName, weaponlabel = weaponLabel, weaponname = weaponName}))
deathTime = Config.DeathTime
OnDeath()
DeathTimer()
end
end
end
end)
-- Threads
emsNotified = false
CreateThread(function()
while true do
local sleep = 1000
if isDead or InLaststand then
sleep = 5
local ped = PlayerPedId()
DisableAllControlActions(0)
EnableControlAction(0, 1, true)
EnableControlAction(0, 2, true)
EnableControlAction(0, 245, true)
EnableControlAction(0, 38, true)
EnableControlAction(0, 0, true)
EnableControlAction(0, 322, true)
EnableControlAction(0, 288, true)
EnableControlAction(0, 213, true)
EnableControlAction(0, 249, true)
EnableControlAction(0, 46, true)
EnableControlAction(0, 47, true)
if isDead then
if not isInHospitalBed then
if deathTime > 0 then
DrawTxt(0.93, 1.44, 1.0,1.0,0.6, Lang:t('info.respawn_txt', {deathtime = math.ceil(deathTime)}), 255, 255, 255, 255)
else
DrawTxt(0.865, 1.44, 1.0, 1.0, 0.6, Lang:t('info.respawn_revive', {holdtime = hold, cost = Config.BillCost}), 255, 255, 255, 255)
end
end
if IsPedInAnyVehicle(ped, false) then
loadAnimDict("veh@low@front_ps@idle_duck")
if not IsEntityPlayingAnim(ped, "veh@low@front_ps@idle_duck", "sit", 3) then
TaskPlayAnim(ped, "veh@low@front_ps@idle_duck", "sit", 1.0, 1.0, -1, 1, 0, 0, 0, 0)
end
else
if isInHospitalBed then
if not IsEntityPlayingAnim(ped, inBedDict, inBedAnim, 3) then
loadAnimDict(inBedDict)
TaskPlayAnim(ped, inBedDict, inBedAnim, 1.0, 1.0, -1, 1, 0, 0, 0, 0)
end
else
if not IsEntityPlayingAnim(ped, deadAnimDict, deadAnim, 3) then
loadAnimDict(deadAnimDict)
TaskPlayAnim(ped, deadAnimDict, deadAnim, 1.0, 1.0, -1, 1, 0, 0, 0, 0)
end
end
end
SetCurrentPedWeapon(ped, `WEAPON_UNARMED`, true)
elseif InLaststand then
sleep = 5
if LaststandTime > Config.MinimumRevive then
DrawTxt(0.94, 1.44, 1.0, 1.0, 0.6, Lang:t('info.bleed_out', {time = math.ceil(LaststandTime)}), 255, 255, 255, 255)
else
DrawTxt(0.845, 1.44, 1.0, 1.0, 0.6, Lang:t('info.bleed_out_help', {time = math.ceil(LaststandTime)}), 255, 255, 255, 255)
if not emsNotified then
DrawTxt(0.91, 1.40, 1.0, 1.0, 0.6, Lang:t('info.request_help'), 255, 255, 255, 255)
else
DrawTxt(0.90, 1.40, 1.0, 1.0, 0.6, Lang:t('info.help_requested'), 255, 255, 255, 255)
end
if IsControlJustPressed(0, 47) and not emsNotified then
TriggerServerEvent('hospital:server:ambulanceAlert', Lang:t('info.civ_down'))
emsNotified = true
end
end
if not isEscorted then
if IsPedInAnyVehicle(ped, false) then
loadAnimDict("veh@low@front_ps@idle_duck")
if not IsEntityPlayingAnim(ped, "veh@low@front_ps@idle_duck", "sit", 3) then
TaskPlayAnim(ped, "veh@low@front_ps@idle_duck", "sit", 1.0, 1.0, -1, 1, 0, 0, 0, 0)
end
else
loadAnimDict(lastStandDict)
if not IsEntityPlayingAnim(ped, lastStandDict, lastStandAnim, 3) then
TaskPlayAnim(ped, lastStandDict, lastStandAnim, 1.0, 1.0, -1, 1, 0, 0, 0, 0)
end
end
else
if IsPedInAnyVehicle(ped, false) then
loadAnimDict("veh@low@front_ps@idle_duck")
if IsEntityPlayingAnim(ped, "veh@low@front_ps@idle_duck", "sit", 3) then
StopAnimTask(ped, "veh@low@front_ps@idle_duck", "sit", 3)
end
else
loadAnimDict(lastStandDict)
if IsEntityPlayingAnim(ped, lastStandDict, lastStandAnim, 3) then
StopAnimTask(ped, lastStandDict, lastStandAnim, 3)
end
end
end
end
end
Wait(sleep)
end
end)