SOLVED [Blur] Effet de sang si vie faible


  • Bonjour à tous !

    Il y a de cela un long moment j'ai demander de l'aide pour ' Un overlay a la "PumpkinBLur" '

    J'ai voulu améliorer ce système en utilisant OpenGL et GuiMainMenu pour ses "drawGradientRect",
    et pouvoir par la suite afficher ce dégradé au teint rouge si le joueur à la vie faible

    le problème c'est que le dégradé est opaque on ne peut rien voir dans le jeu, mais !
    Car il y a toujours un Mais, le tchat est un peu visible et les blocs dans la barre d'action le sont bien (visible)

    Screen:

    Pourtant j'ai essayé beaucoup de méthode de transparence glColor4f fut maintes et maintes fois proposé sur Google, mais rien n'y a fait !

    Je vous passe la classe de l'event qui gère ça !

    :::

    package viruz.zeamateis.event;
    
    import java.awt.Color;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.event.ForgeSubscribe;
    
    import org.lwjgl.opengl.GL11;
    
    import cpw.mods.fml.client.FMLClientHandler;
    
    public class OverlayEvent
    {
    float zLevel;
    
       @ForgeSubscribe
       public void onRenderGameOverlay(RenderGameOverlayEvent event)
       {
               if(FMLClientHandler.instance().getClient().thePlayer.getHealth() < 5)
               {
                   int width = event.resolution.getScaledWidth();
                   int height = event.resolution.getScaledHeight();
    
                   this.drawGradientRect(0, 0, width, height, 1615855616, -1602211792);
                   this.drawGradientRect(0, 0, width, height, 0, Integer.MIN_VALUE);
               }
       }
    
       protected void drawGradientRect(int par1, int par2, int par3, int par4, int par5, int par6)
       {
           float f = (float)(par5 >> 24 & 255) / 255.0F;
           float f1 = (float)(par5 >> 16 & 255) / 255.0F;
           float f2 = (float)(par5 >> 8 & 255) / 255.0F;
           float f3 = (float)(par5 & 255) / 255.0F;
           float f4 = (float)(par6 >> 24 & 255) / 255.0F;
           float f5 = (float)(par6 >> 16 & 255) / 255.0F;
           float f6 = (float)(par6 >> 8 & 255) / 255.0F;
           float f7 = (float)(par6 & 255) / 255.0F;
           GL11.glDisable(GL11.GL_TEXTURE_2D);
           GL11.glEnable(GL11.GL_BLEND);
           GL11.glDisable(GL11.GL_ALPHA_TEST);
           GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
           GL11.glShadeModel(GL11.GL_SMOOTH);
           Tessellator tessellator = Tessellator.instance;
           tessellator.startDrawingQuads();
           tessellator.setColorRGBA_F(f1, f2, f3, f);
           tessellator.addVertex((double)par3, (double)par2, (double)this.zLevel);
           tessellator.addVertex((double)par1, (double)par2, (double)this.zLevel);
           tessellator.setColorRGBA_F(f5, f6, f7, f4);
           tessellator.addVertex((double)par1, (double)par4, (double)this.zLevel);
           tessellator.addVertex((double)par3, (double)par4, (double)this.zLevel);
           tessellator.draw();
           GL11.glShadeModel(GL11.GL_FLAT);
           GL11.glDisable(GL11.GL_BLEND);
           GL11.glEnable(GL11.GL_ALPHA_TEST);
           GL11.glEnable(GL11.GL_TEXTURE_2D);
       }
    }
    
    

    :::

    J'espère que quelqu'un à la solution, surtout ceux qui gère bien dans l'OpenGL ou le LWGJL je sais plus !

    Merci !

  • Moddeurs confirmés Rédacteurs Administrateurs

    Essayes avec RenderGameOverlayEvent.Post ?


  • Même problème

  • Moddeurs confirmés Rédacteurs Administrateurs

    Enlève les codes qui concerne le alpha ?
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    GL11.glDisable(GL11.GL_ALPHA_TEST);
    GL11.glEnable(GL11.GL_ALPHA_TEST);


  • Rien de spécial juste une très légère transparence en haut de jeu

    http://puu.sh/azymJ.png


  • J'ai tester avec une fonction similaire dans le GuiGameOver mais toujours pareil

  • Moddeurs confirmés Rédacteurs Administrateurs

    Aucune idée là 😕


  • :s Bon je vais voir de mon côté donc


    Mais j'y pense je peu pas faire ça dans un Gui ? Qui s'affiche si le joueur à la vie basse ?
    Comment on affiche un gui avec cet event ?

  • Moddeurs confirmés Rédacteurs Administrateurs

    J'utiliserai plutôt le tick du joueur dans ce cas, si ça va vie un faible, tu ouvres un autre gui.


  • Mais comment je peux faire pour que je puisse faire en sorte de jouer avec le gui ouvert, car là je peux rien faire, comme si j'ouvrais l'inventaire


    :::

    package viruz.zeamateis.gui;
    
    import java.util.Iterator;
    
    import net.minecraft.client.gui.GuiButton;
    import net.minecraft.client.gui.GuiMainMenu;
    import net.minecraft.client.gui.GuiScreen;
    import net.minecraft.client.multiplayer.WorldClient;
    import net.minecraft.client.resources.I18n;
    import net.minecraft.util.EnumChatFormatting;
    
    import org.lwjgl.opengl.GL11;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    @SideOnly(Side.CLIENT)
    public class GuiBloodEffect extends GuiScreen
    {
    
    /**
    * Adds the buttons (and other controls) to the screen in question.
    */
    public void initGui() {}
    
    /**
    * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
    */
    protected void keyTyped(char par1, int par2) {}
    
    /**
    * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
    */
    protected void actionPerformed(GuiButton par1GuiButton) {}
    
    /**
    * Draws the screen and all the components in it.
    */
    public void drawScreen(int par1, int par2, float par3)
    {
    this.drawGradientRect(0, 0, this.width, this.height, 1615855616, -1602211792);
    super.drawScreen(par1, par2, par3);
    }
    
    /**
    * Returns true if this GUI should pause the game when it is displayed in single-player
    */
    public boolean doesGuiPauseGame()
    {
    return false;
    }
    
    /**
    * Called from the main game loop to update the screen.
    */
    public void updateScreen() {}
    }
    
    

    :::

  • Moddeurs confirmés Rédacteurs Administrateurs

    Ah oui merde, aucune idée, donc ouvrir un nouveau gui c'est pas bon non plus 😕


  • je vais faire différents tests avec différentes image comme le pumkinBlur.png


    Mais du coup j'ai un bug là aussi –'

    :::

    package viruz.zeamateis.event;
    
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.event.ForgeSubscribe;
    
    import org.lwjgl.opengl.GL11;
    
    import cpw.mods.fml.client.FMLClientHandler;
    
    public class OverlayEvent
    {
    private ResourceLocation liteBloodEffect = new ResourceLocation("viruz:textures/gui/" + "liteBloodEffect" + ".png");
    
    @ForgeSubscribe
    public void playerLowLifeRendering(RenderGameOverlayEvent.Post event)
    {
    if(FMLClientHandler.instance().getClient().thePlayer.getHealth() < 5)
    {
    int k = event.resolution.getScaledWidth();
    int l = event.resolution.getScaledHeight();
    GL11.glDisable(GL11.GL_DEPTH_TEST);
    GL11.glDepthMask(false);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    GL11.glDisable(GL11.GL_ALPHA_TEST);
    FMLClientHandler.instance().getClient().renderEngine.bindTexture(liteBloodEffect);
    Tessellator tessellator = Tessellator.instance;
    tessellator.startDrawingQuads();
    tessellator.addVertexWithUV(0.0D, (double)l, -90.0D, 0.0D, 1.0D);
    tessellator.addVertexWithUV((double)k, (double)l, -90.0D, 1.0D, 1.0D);
    tessellator.addVertexWithUV((double)k, 0.0D, -90.0D, 1.0D, 0.0D);
    tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D);
    tessellator.draw();
    GL11.glDepthMask(true);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    GL11.glEnable(GL11.GL_ALPHA_TEST);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    }
    }
    }
    

    :::

    J'ai pas de crash mais j'ai une image horrible ça gère même pas la transparence rien pourtant c'est du .png

  • Moddeurs confirmés

    As-tu essayé de faire une image de 256*256 ou tu gères la transparence avec un effet vignette ?

  • Moddeurs confirmés Rédacteurs Administrateurs

    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    ->
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.8F);
    ?


  • Salut !!

    Pour répondre a ton pb en gros minecraft ne gére pas le gui de se type donc pour que ton joueur continu de marché et touts il vas falloir que tu redéfinisse touts les mouvements (sur terre et sous l'eau).

    Et si tu veut normalement tu a pas trop besoin de .png mais je ne sais plus comment ont fais.


  • Oula !

    Je vais test toutes vos réponses !


    Alors

    Le 0.8F ne fait rien
    Oui mon image est en 256x256 mais rien n'y fait

    :S


  • @'sisidney':

    Salut !!

    Pour répondre a ton pb en gros minecraft ne gére pas le gui de se type donc pour que ton joueur continu de marché et touts il vas falloir que tu redéfinisse touts les mouvements (sur terre et sous l'eau).

    Et si tu veut normalement tu a pas trop besoin de .png mais je ne sais plus comment ont fais.

    Faux.
    Il a utiliser le RenderGameOverlay event qui est appelé dans GuiIngame (du moins, sa copie de Forge (net.minecraftforge.client.event.GuiIngameForge) ), or, GuiIngame n'est pas un gui comme les autres, il est directement dans le jeu et tous les mouvements ont déjà été définis avec ce gui. Il faut redéfinir les mouvement s'il créer un nouveau gui.

    Pour la réponse :
    Déjà, recherche où RenderGameOverlayEvent est appelé pour regarder si tu n'as pas des fonctions OpenGL ou des condition à appeler, dans ce cas, t'en a aucun à part si tu veux empêcher l'affichage de ton blur à la 3eme personne (comme pour la citrouille).
    Le blur est appelé dans "renderHelmet" de GuiIngameForge. Comme tu l'as remarqué, la fonction pre(ElementType e) est appelé à chaque début de fonction et post(ElementType e) à chaque fin. Pour commencer, check dans ton event si l'ElementType correspond à HELMET.

    if(RenderGameOverlayEvent.ElementType == RenderGameOverlayEvent.ElementType.HELMET)
    

    Ensuite, fait appel à ton blur.
    Pour ton event tu dois soit utiliser RenderGameOverlayEvent.Pre soit RenderGameOverlayEvent.Post, dans les deux cas, ça ne change rien pour toi 😉
    Ta fonction pour afficher ton image en blur doit être un copie de la fonction du blur de la citrouille. (Pour k et l laisse-les, c'est bien ça ;)) (En fait, j'ai vu qu'il te manque OpenGlHelper.glBlendFunc(770, 771, 1, 0); à ton code (après j'ai pas regardé plus bas) ).
    Voilà 😉


  • Hummm, il me demande de créer la fonction glBlendFunc

    Elle existe pas apparemment


  • Elle a un autre nom sans doute, t'es en quelle version ?


  • Il est en 1.6.4 mais je croix que cette fonction existe pas en 1.6 😕