czarsight Posted September 26, 2019 Share Posted September 26, 2019 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
DNL291 Posted September 29, 2019 Share Posted September 29, 2019 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 1 Link to comment
czarsight Posted September 29, 2019 Author Share Posted September 29, 2019 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. . Valeu! Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now