Jump to content

SCRIPT Inconsciência


Recommended Posts

local x,y,z = guiGetScreenSize()
local largura, altura = 300, 30

--local time = getRealTime()

function notificao()
	local msg = "Você ficou inconsciente..."
	local larguratexto = dxGetTextWidth(msg)
	local alturatexto  = dxGetFontHeight() 
	dxDrawRectangle(0, y/2-altura/2, largura, altura, tocolor(0,0,0,200))
	dxDrawText(msg, largura/2-larguratexto/2, y/2-alturatexto/2, larguratexto, alturatexto, tocolor(255, 255, 255, 200))
end

function notificao2()
	local msg = "Gravemente ferido"
	local larguratexto = dxGetTextWidth(msg)
	local alturatexto  = dxGetFontHeight() 
	dxDrawRectangle(0, y/2-altura/2, largura, altura, tocolor(0,0,0,200))
	dxDrawText(msg, largura/2-larguratexto/2, y/2-alturatexto/2, larguratexto, alturatexto, tocolor(255, 100,100,255))
end


function damaged(inimigo, inimigo_arma, corpo_parte, dano)
	local thePlayer = source
	local vidaPlayer = getElementHealth(thePlayer)

	if getElementData(thePlayer, "Inconsciente") ~= "true" and vidaPlayer <= 15 or dano >= 50 then
		cancelEvent()
		setElementData(thePlayer, "Inconsciente", "true")
		setElementFrozen(thePlayer, true)
		setElementHealth(thePlayer, 10)
		triggerServerEvent('animacao:Inconsciente', thePlayer)
		addEventHandler("onClientRender", root, notificao)
		playSoundFrontEnd (4)
		fadeCamera(false, 0)

		setTimer(function()
			fadeCamera(true, 10)
			removeEventHandler("onClientRender", root, notificao)
		end, 10000, 1)

		local random = math.random(0, 100)
		if random >= 0 and random <= 50 then
			setTimer(function()
				addEventHandler("onClientRender", root, notificao2)
			end, 15000, 1)

			setTimer(function()
				if getElementData(thePlayer, "Inconsciente") and getElementHealth(thePlayer) <= 15 then
					setElementData(thePlayer, "Inconsciente", "false")
					setElementHealth(thePlayer, 0)
					removeEventHandler("onClientRender", root, notificao2)
				end
			end, 50000, 1)
			
		else
			setTimer(function()
				removeEventHandler("onClientRender", root, notificao2)
				triggerServerEvent('animacao:Levantar', thePlayer)
				setElementData(thePlayer, "Inconsciente", "false")
				setElementFrozen(thePlayer, false)
			end, 15000, 1)

		end
	end
end


addEventHandler ("onClientPlayerDamage", getLocalPlayer(), damaged)

Meu código funciona, porém estou tendo problemas com um Bug. Trata-se de um sistema de inconsciência que quando o player toma um dano considerável, ele não morre, perde a consciência e há uma probabilidade dele ficar no chão até a morte ou se levantar. No entanto, às vezes o player simplesmente quebra o fluxo e acaba levantando e morrendo ao mesmo tempo, como se estivesse entrado no IF e ELSE ao mesmo tempo e a "notificao2" não desaparece da tela. Me refiro a linha 43 por diante. Quem puder ajudar, ficarei grato.

Link to comment
  • Moderators

Apenas uma suposição: pode ser que esteja entrando nesses blocos depois de já ter entrado uma vez, e isso vai causar esses problemas inconvenientes. É mais seguro você definir uma variável uma vez que tal bloco for executado para evitar que seja executado 2x sem que você queira. Dependendo do acionamento do evento "onClientPlayerDamage" isso pode acontecer visto que o dano pode ser registrado mais de uma vez em um intervalo bem curto.

O setElementData tem um tempo até ser setado, mesmo que seja no mesmo lado, daí acho mais seguro usar uma variável em conjunto, embora você recebesse aviso no debug, se um evento por exemplo, fosse adicionado novamente.

Fora isso, percebi que o else pode executar o:

removeEventHandler("onClientRender", root, notificao2)

E isso sem nenhuma verificação se o evento de fato foi adicionado antes. Faça testes com outputs em cada trecho pois códigos que utilizam setTimer por si só precisam de verificação dentro do timer, pois o momento que você a chama é um, e o momento que executa é outro e isso pode gerar erros pois existem sempre variantes ao longo do intervalo.

@czarsight

  • Thanks 1
Link to comment
19 hours ago, DNL291 said:

Apenas uma suposição: pode ser que esteja entrando nesses blocos depois de já ter entrado uma vez, e isso vai causar esses problemas inconvenientes. É mais seguro você definir uma variável uma vez que tal bloco for executado para evitar que seja executado 2x sem que você queira. Dependendo do acionamento do evento "onClientPlayerDamage" isso pode acontecer visto que o dano pode ser registrado mais de uma vez em um intervalo bem curto.

O setElementData tem um tempo até ser setado, mesmo que seja no mesmo lado, daí acho mais seguro usar uma variável em conjunto, embora você recebesse aviso no debug, se um evento por exemplo, fosse adicionado novamente.

Fora isso, percebi que o else pode executar o:


removeEventHandler("onClientRender", root, notificao2)

E isso sem nenhuma verificação se o evento de fato foi adicionado antes. Faça testes com outputs em cada trecho pois códigos que utilizam setTimer por si só precisam de verificação dentro do timer, pois o momento que você a chama é um, e o momento que executa é outro e isso pode gerar erros pois existem sempre variantes ao longo do intervalo.

@czarsight

Sua suposição não falhou. xD. Valeu!

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...