chaos90

Vanilla
[1.7.x] StatusEffectHUD

26 messages dans ce sujet

je sais que tout le monde attendent à ce que quelqu'un fasse un tutoriel en VANILLA pour le StatusEffectHUD alors je l'ai fais et je vous le fais partager :)

StatusEffectHUD en Vanilla

-[iNTRODUCTION]-

Bonjour à tous !

Dans ce tutoriel, nous allons faire un StatusEffectHUD commençons sans attendre ;)

-[sOMMAIRE]-

1]Création d'un "if"

2]Création d'un "for"

3]LesIcônes

4] Afficher les niveaux des effets

1]Création d'un "if"

Tout d'abord on va aller dans le GuiIngame.java puis on va aller dans RenderGameOverlay mettre nos codes en dessus de ces 3 int :

    int var11;
    int var12;
    int var13;

qui est en dessus de ce if :

    if (!this.mc.thePlayer.isPotionActive(Potion.confusion))
    {
      float var10 = this.mc.thePlayer.prevTimeInPortal + (this.mc.thePlayer.timeInPortal - this.mc.thePlayer.prevTimeInPortal) * par1;


      if (var10 > 0.0F)
      {
        this.func_130015_b(var10, var6, var7);
      }
    }

donc maintenant on va mettre notre if qui va dire que si il y a plus de 5 potion d'activer ça les empiles mais pour ça il faut déja mettre notre Collection pour les potions et aussi un int les voici :

       Collection ph1 = this.mc.thePlayer.getActivePotionEffects();
       int ph2 = 33;

j'ai mis ph pour PotionHUD maintenant le if c'est :

      if (ph1.size() > 5) //si les effect de potion activé est supérieur a 5 alors ...
      {
        ph2 = 132 / (ph1.size() - 1); ... il s'empile avec ces valeurs
      }

2]Création d'un "for"

pour le "for" on va mettre tout ce qu'il faut pour que les effect de potion s'affiche avec le temps l'icone et le nom de la potion donc pour ça le "for" sera :

      for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2)
      {

donc ici on a crée un Iterator qui va donc nous permettre d'avencer sauf que normalement vous avez une erreur sur me var2 et nous allons ajouter en même un autre var qui nous servira plus bas donc plus haut avant le if il suffis de mettre ceci :

int var2 = 0; 
int var1 = 0;

donc maintenant dans notre for on va rajouter quelque variables pour qu'il aille chercher les effets de potions :

                PotionEffect ph4 = (PotionEffect)ph3.next();
                Potion ph5 = Potion.potionTypes[ph4.getPotionID()]; // ici on va chercher le type de potion qui est actif
                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

pour le text c'est avec le niveaux des potion donc c'est plus bas

maintenant on a just le nom de la potion qui s'affiche maintenant on veut sa durée :

                this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711); //ici on affiche la duré de l'effet en court

ce qui nous donne pour le moment ceci :

//début du code PotionEffectHUD
        int var1 = 0;
        int var2 = 0;
        int ph2 = 33;
        Collection ph1 = this.mc.thePlayer.getActivePotionEffects();

            if (ph1.size() > 5)
            {
                ph2 = 132 / (ph1.size() - 1);
            }
            for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2)
            {
                PotionEffect ph4 = (PotionEffect)ph3.next();
                Potion ph5 = Potion.potionTypes[ph4.getPotionID()];
                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
                this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711);
            }
        
        //fin code PotionEffectHUD

3] LesIcônes

maintenant il faut afficher certaine chose comme le contour (ou pas si vous voulez pas il suffis de retirer le code que je vais vous donner) et les icônes donc pour les icônes on va déjà rajouter un bindTexture tout en haut du GuiIngame.java :

    protected static final ResourceLocation inventory = new ResourceLocation("textures/gui/container/inventory.png");

voilà et dans notre "for" on va rajouter en dessus de :

        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

on va mettre :

                this.mc.getTextureManager().bindTexture(inventory); // ici on va chercher la texture

maintenant on va chercher les icônes dans ce .png donc on ajouter un if :

if (ph5.hasStatusIcon())
                {
                    int ph6 = ph5.getStatusIconIndex();
                    this.drawTexturedModalRect(var1 + 6, var2 + 7, 0 + ph6 % 8 * 18, 198 + ph6 / 8 * 18, 18, 18); //on va chercher l'icône et on le place ou il faut
                }

si vous voulez le contour il suffis d'ajouter cette ligne au dessus du if des icônes :

                this.drawTexturedModalRect(var1, var2, 0, 166, 140, 32); // ici on affiche le contour

si vous avez envis d'enlever le contour il suffis d'enlever cette ligne

4] Afficher les niveaux des effets

donc pour afficher le niveaux des effets on va déja rajouter en dessus de notre deuxième if pour afficher les icônes un String qui va chercher le nom en fonction de leur ID :

        String ph7 = I18n.format(ph5.getName()/*ici il cherche le nom*/, new Object[0]);

maintenant que on a ça on va pouvoir afficher le niveau pour cela rien de plus simple on fais des "if" et des "else if" donc on commence par le niveau 2 car le niveau 1 ne s'affiche pas donc on met :

        if (ph4.getAmplifier() == 1) // si la potion a un niveau de 1 qui est le niveau 2 car le niveau 1 c'est 0 alors ....
        {
          ph7 = ph7 + " II" ;// ... on affiche a coté du nom de la potion "II"
        }
et maintenant on va faire ça pour 4 niveaux donc en dessus de ça on ajoute :
                else if (ph4.getAmplifier() == 2)// si la potion a un niveau de 2 qui est 3 alors ...
                {
                	ph7 = ph7 + " III"; // on affiche a coté du nom de la potion "III"
                }
                else if (ph4.getAmplifier() == 3) // si la potion a un niveau de 3 qui est 4 alors ...
                {
                	ph7 = ph7 + " IV"; // on affiche a coté du nom de la potion "IV"
                }

maintenant que on a ça il faut le placer donc en dessous du if on ajoute :

                this.mc.fontRenderer.drawStringWithShadow(ph7, var1 + 10 + 18, var2 + 6, 16777215); //ici on place le nom de la potion ou il faut

ce qui nous donne au finale tout ceci :

        //début du code PotionEffectHUD
        int var1 = 0;
        int var2 = 0;
        int ph2 = 33;
        Collection ph1 = this.mc.thePlayer.getActivePotionEffects();

            if (ph1.size() > 5)
            {
                ph2 = 132 / (ph1.size() - 1);
            }
            for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2)
            {
                PotionEffect ph4 = (PotionEffect)ph3.next();
                Potion ph5 = Potion.potionTypes[ph4.getPotionID()];
                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
                this.mc.getTextureManager().bindTexture(inventory);
                this.drawTexturedModalRect(var1, var2, 0, 166, 140, 32);
                if (ph5.hasStatusIcon())
                {
                    int ph6 = ph5.getStatusIconIndex();
                    this.drawTexturedModalRect(var1 + 6, var2 + 7, 0 + ph6 % 8 * 18, 198 + ph6 / 8 * 18, 18, 18);
                }
                String ph7 = I18n.format(ph5.getName(), new Object[0]);
                if (ph4.getAmplifier() == 1)
                {
                    ph7 = ph7 + " II" ;
                }
                else if (ph4.getAmplifier() == 2)
                {
                	ph7 = ph7 + " III";
                }
                else if (ph4.getAmplifier() == 3)
                {
                	ph7 = ph7 + " IV";
                }
                this.mc.fontRenderer.drawStringWithShadow(ph7, var1 + 10 + 18, var2 + 6, 16777215);
                this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711);
            }
        
        //fin code PotionEffectHUD

voilà le tutoriel est terminé bon jeu avec votre StatusEffectHUD !

1

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour moi les par1 ne fonctionnent pas , screen =>

http://prntscr.com/62lhhp

Y'a une erreur a chaque fois ..

lit un peu j'ai dit de mettre

Collection ph1 = this.mc.thePlayer.getActivePotionEffects();
int ph2 = 33;

en dessous de ça

        if (!this.mc.thePlayer.isPotionActive(Potion.confusion))
        {
            float var10 = this.mc.thePlayer.prevTimeInPortal + (this.mc.thePlayer.timeInPortal - this.mc.thePlayer.prevTimeInPortal) * par1;


            if (var10 > 0.0F)
            {
                this.func_130015_b(var10, var6, var7);
            }
        }

j'ai jamais dit de le rajouter ...

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent tutoriel, merci beaucoup! Ca fonctionne très bien et du premier coup!

Vivement le ArmorHUD ! :D

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu saurais faire le même tutoriel mais pour l'affichage de la durabilité armure?

0

Partager ce message


Lien à poster
Partager sur d’autres sites
//début ajout
    private void drawItemInToScreen(ItemStack is, int x, int y, float par3, boolean overlay)  // <------------ just au dessus de rendergame overlay
    {
    	if (is != null)
    	{
    	    float an = (float)is.animationsToGo - par3;
            if (an > 0.0F)
            {
            	GL11.glPushMatrix();
                float dec = 1.0F + an / 5.0F;
                GL11.glTranslatef((float)(x + 8), (float)(y + 12), 0.0F);
                GL11.glScalef(1.0F / dec, (dec + 1.0F) / 2.0F, 1.0F);
                GL11.glTranslatef((float)(-(x + 8)), (float)(-(y + 12)), 0.0F);
            }
            itemRenderer.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), is, x, y);
            if (an > 0.0F)
                GL11.glPopMatrix();
            if (overlay)
            	itemRenderer.renderItemOverlayIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), is, 16, y);
    	}
    }
    //fin ajout


    public void renderGameOverlay(float par1, boolean par2, int par3, int par4) //<--------- pas la peine de copier ceci
    {
        //...

        if (!this.mc.playerController.enableEverythingIsScrewedUpMode()) // <------- ATTENTION CETTE FONCTION EXISTE DEJA JUST A REMPLACER
        {
            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
            this.mc.getTextureManager().bindTexture(widgetsTexPath);
            InventoryPlayer var31 = this.mc.thePlayer.inventory;
            this.zLevel = -90.0F;
            this.drawTexturedModalRect(var6 / 2 - 91, var7 - 22, 0, 0, 182, 22);
            this.drawTexturedModalRect(var6 / 2 - 91 - 1 + var31.currentItem * 20, var7 - 22 - 1, 0, 22, 24, 22);
            this.mc.getTextureManager().bindTexture(icons);
            GL11.glEnable(GL11.GL_BLEND);
            OpenGlHelper.glBlendFunc(775, 769, 1, 0);
            this.drawTexturedModalRect(var6 / 2 - 7, var7 / 2 - 7, 0, 0, 16, 16);
            OpenGlHelper.glBlendFunc(770, 771, 1, 0);
            this.mc.mcProfiler.startSection("bossHealth");
            this.renderBossHealth();
            this.mc.mcProfiler.endSection();

            if (this.mc.playerController.shouldDrawHUD())
            {
                this.func_110327_a(var6, var7);
            }

            this.mc.mcProfiler.startSection("actionBar");
            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
            RenderHelper.enableGUIStandardItemLighting();

            for (var11 = 0; var11 < 9; ++var11)
            {
                var12 = var6 / 2 - 90 + var11 * 20 + 2;
                var13 = var7 - 16 - 3;
                this.renderInventorySlot(var11, var12, var13, par1);
            }
            
            //début ajout
ItemStack is;
//render itemArmor
for (int i = 0; i < 4; ++i)
{
is = this.mc.thePlayer.inventory.armorItemInSlot(4 - i - 1);
if (is == null)
continue;
drawItemInToScreen(is, 0, i * 17, par1, true);
this.mc.fontRenderer.drawString("§f§l" + (is.getMaxDamage() - is.getItemDamageForDisplay()), 18, i * 17 + 5, 0);
}
//render itemInHand
is = this.mc.thePlayer.inventory.getCurrentItem();
if (is != null)
{
Item i = is.getItem();
boolean outils = i instanceof Item;
if (!i.isItemTool(is) || outils && !(i instanceof ItemArmor))
{
 drawItemInToScreen(is, 40, 1 * 5, par1, false);
GL11.glDisable(GL11.GL_BLEND);
 this.mc.fontRenderer.drawString("" + "§n§lDurabilité :§r§c§l " + (is.getMaxDamage() - is.getItemDamageForDisplay()) + " §r§n§lQuantité :§r§c§l " + is.stackSize, 60, 1 * 5 + 5, 553648127);
}

}
            RenderHelper.disableStandardItemLighting();
            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
            this.mc.mcProfiler.endSection();
            GL11.glDisable(GL11.GL_BLEND);
        }
     
        //...
0

Partager ce message


Lien à poster
Partager sur d’autres sites

Seul petit problème, si je prends un autre item que un tool ou une armure, j'ai l'ID de l'item qui s'affiche en durabilité.... :'(

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Yo, fonctionne-t-il en 1.8 ?
Voici mon code (en 1.8) qui n'a pas l'air de tres bien fonctionner:
4e4d6a88c0.png

erreur sur var2 : apparement il existe deja donc me propose de la rename
fontrenderer:fontRenderer cannot be resolved or is not a field

Et ducoup avec cet ajout, cela me fait buguer le reste du code :/

Merci !

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci c'est cool, et pour armor status ca fonctionne aussi en 1.8 ou faut aussi le refaire ? :)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

alors pour le StatusEffectHUD tu va ajouter en dessus de cette fonction :

  public void func_175180_a(float p_175180_1_)
    { 
        [...] 
    }
ceci :
    private void drawActivePotionEffects()
    {
        int var1 = 0;
        int var2 = 0;
        boolean var3 = true;
        Collection var4 = this.mc.thePlayer.getActivePotionEffects();

        if (!var4.isEmpty())
        {
            GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
            GlStateManager.disableLighting();
            int var5 = 33;

            if (var4.size() > 5)
            {
                var5 = 132 / (var4.size() - 1);
            }

            for (Iterator var6 = this.mc.thePlayer.getActivePotionEffects().iterator(); var6.hasNext(); var2 += var5)
            {
                PotionEffect var7 = (PotionEffect)var6.next();
                Potion var8 = Potion.potionTypes[var7.getPotionID()];
                GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
                this.mc.getTextureManager().bindTexture(inventoryBackground);
                this.drawTexturedModalRect(var1, var2, 0, 166, 140, 32);

                if (var8.hasStatusIcon())
                {
                    int var9 = var8.getStatusIconIndex();
                    this.drawTexturedModalRect(var1 + 6, var2 + 7, 0 + var9 % 8 * 18, 198 + var9 / 8 * 18, 18, 18);
                }

                String var11 = I18n.format(var8.getName(), new Object[0]);

                if (var7.getAmplifier() == 1)
                {
                    var11 = var11 + " " + I18n.format("enchantment.level.2", new Object[0]);
                }
                else if (var7.getAmplifier() == 2)
                {
                    var11 = var11 + " " + I18n.format("enchantment.level.3", new Object[0]);
                }
                else if (var7.getAmplifier() == 3)
                {
                    var11 = var11 + " " + I18n.format("enchantment.level.4", new Object[0]);
                }

                this.mc.fontRendererObj.func_175063_a(var11, (float)(var1 + 10 + 18), (float)(var2 + 6), 16777215);
                String var10 = Potion.getDurationString(var7);
                this.mc.fontRendererObj.func_175063_a(var10, (float)(var1 + 10 + 18), (float)(var2 + 6 + 10), 8355711);
            }
        }
    }

et là ou tu avais mis ton code qui bugger tu met ça

         this.drawActivePotionEffects();

voilà bon jeu :)

1

Partager ce message


Lien à poster
Partager sur d’autres sites

Yo, j'ai une erreur sur 'inventorybackground' :inventoryBackground cannot be resolved to a variable

Et je vois pas où mettre exactement this.draw...., dans le if (lequel? ) dans le for ? aucuns des deux ?

0

Partager ce message


Lien à poster
Partager sur d’autres sites

oui il faut que tu mette ça tout en haut du guiingame

    protected static final ResourceLocation inventoryBackground = new ResourceLocation("textures/gui/container/inventory.png");


et le this.drawActivePotionEffects();

tu le met en dessus de ce if

        if (!this.mc.thePlayer.isPotionActive(Potion.confusion))
        {
            float var6 = this.mc.thePlayer.prevTimeInPortal + (this.mc.thePlayer.timeInPortal - this.mc.thePlayer.prevTimeInPortal) * p_175180_1_;

            if (var6 > 0.0F)
            {
                this.func_180474_b(var6, var2);
            }
        }
1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci ca marche niquel ;) , pour le armor status j'ai besoin de modifier quelquechose aussi ? :)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

@xPichot Y'a pas besoin d'un screen, c'est l'icône de la potion qui s'affiche avec son niveau et sa durée

0

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 11/02/2015 à 12:52, chaos90 a dit :

tu pourrai teamspeak ? à 14h30 ?

salut tu aurais un skype ou un teamspeak j'ai un problème stp ?

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

Je rectifie mon commentaire , j'ai mal lu

Modifié par Monkey_D_Luffys
Mal lu le code
0

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut , est ce que quelqu'un serais m'indiquer comment supprimer les effets quand on va dans l'inventaire

 

 

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant