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)
 | 
