forked from Simnation/Main
127 lines
3.8 KiB
Lua
127 lines
3.8 KiB
Lua
local Config = require("shared.sh_config")
|
|
local Locales = require("shared.sh_locales")
|
|
|
|
local isDead = false
|
|
|
|
local function DisableControls()
|
|
CreateThread(function()
|
|
while isDead do
|
|
DisableAllControlActions(0) -- This will disable in-game controls (e.g., movement, actions) but will not prevent menus or UIs that open via key mappings from appearing.
|
|
for _, keyCode in ipairs(Config.EnabledControls) do
|
|
EnableControlAction(0, keyCode, true)
|
|
end
|
|
Wait(0)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function ToggleUI(isVisible)
|
|
SendNUIMessage({ action = "toggleDeathscreen", showDeathscreen = isVisible })
|
|
SetNuiFocus(isVisible, isVisible)
|
|
SetNuiFocusKeepInput(isVisible)
|
|
DisableControls()
|
|
if Config.BlurUIBackground then (isVisible and TriggerScreenblurFadeIn or TriggerScreenblurFadeOut)(0) end
|
|
end
|
|
|
|
-- Credits to qb-ambulancejob for some parts of this function
|
|
local function DoDeathAnim()
|
|
local playerPed = cache.ped
|
|
|
|
while GetEntitySpeed(playerPed) > 0.5 or IsPedRagdoll(playerPed) do
|
|
Wait(10)
|
|
end
|
|
|
|
if isDead then
|
|
local coords = GetEntityCoords(playerPed)
|
|
local heading = GetEntityHeading(playerPed)
|
|
|
|
if IsPedInAnyVehicle(playerPed, false) then
|
|
local playerVeh = GetVehiclePedIsIn(playerPed, false)
|
|
local vehSeats = GetVehicleModelNumberOfSeats(joaat(GetEntityModel(playerVeh)))
|
|
for i = -1, vehSeats do
|
|
local vehSeatPed = GetPedInVehicleSeat(playerVeh, i)
|
|
if vehSeatPed == playerPed then
|
|
NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z + 0.5, heading, 0, false)
|
|
SetPedIntoVehicle(playerPed, playerVeh, i)
|
|
end
|
|
end
|
|
else
|
|
NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z + 0.5, heading, 0, false)
|
|
end
|
|
|
|
local maxHealth = GetPedMaxHealth(playerPed)
|
|
SetEntityInvincible(playerPed, true)
|
|
SetEntityHealth(playerPed, maxHealth)
|
|
|
|
local animDict = IsPedInAnyVehicle(playerPed, false) and "veh@low@front_ps@idle_duck" or Config.DeathAnim.animDict
|
|
local animName = IsPedInAnyVehicle(playerPed, false) and "sit" or Config.DeathAnim.animName
|
|
|
|
while not HasAnimDictLoaded(animDict) do
|
|
RequestAnimDict(animDict)
|
|
Wait(50)
|
|
end
|
|
|
|
while isDead do
|
|
if not IsEntityPlayingAnim(playerPed, animDict, animName, 8) then TaskPlayAnim(playerPed, animDict, animName, 1.0, 1.0, -1, 8, 0, false, false, false) end
|
|
Wait(1000)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function ReviveActions()
|
|
isDead = false
|
|
ToggleUI(false)
|
|
RevivePed()
|
|
HandleVoiceState(true)
|
|
end
|
|
|
|
local function OnPlayerDeath()
|
|
isDead = true
|
|
if IsPauseMenuActive() then SetFrontendActive(false) end
|
|
ToggleUI(true)
|
|
HandleVoiceState(false)
|
|
if Config.DeathAnim.enabled then DoDeathAnim() end
|
|
end
|
|
RegisterNetEvent("cloud-deathscreen:client:OnPlayerDeath", OnPlayerDeath)
|
|
|
|
local function OnPlayerSpawn()
|
|
isDead = false
|
|
ToggleUI(false)
|
|
HandleVoiceState(true)
|
|
end
|
|
RegisterNetEvent("cloud-deathscreen:client:OnPlayerSpawn", OnPlayerSpawn)
|
|
|
|
RegisterNUICallback("deathscreen:fetchData", function(data, cb)
|
|
local label = data.label
|
|
if not type(label) == "string" then return end
|
|
|
|
local actions = {
|
|
initData = function()
|
|
cb({ locales = Locales.UI, soundVolume = Config.SoundVolume, mainTimer = Config.MainTimer, faceDeathTimer = Config.FaceDeathTimer })
|
|
end,
|
|
callEmergency = function()
|
|
PlaySoundFrontend(-1, "Click", "DLC_HEIST_HACKING_SNAKE_SOUNDS", true)
|
|
local success = pcall(CallEmergency)
|
|
cb(success)
|
|
end,
|
|
faceDeath = function()
|
|
local paymentSuccess = lib.callback.await("cloud-deathscreen:server:PayFine", false)
|
|
|
|
if paymentSuccess then
|
|
PlaySoundFrontend(-1, "Click", "DLC_HEIST_HACKING_SNAKE_SOUNDS", true)
|
|
ReviveActions()
|
|
cb(paymentSuccess)
|
|
else
|
|
PlaySoundFrontend(-1, "CHECKPOINT_MISSED", "HUD_MINI_GAME_SOUNDSET", true)
|
|
cb(paymentSuccess)
|
|
end
|
|
end,
|
|
timeExpired = function()
|
|
local success = pcall(ReviveActions)
|
|
cb(success)
|
|
end,
|
|
}
|
|
|
|
local actionFunction = actions[label]
|
|
if actionFunction then actionFunction() end
|
|
end)
|