Class des Effets de Potions



  • Bonjour, apres de longues recherches, impossibles de mettre la main sur la (les) class des effets de potions sauf pour celle de heal, hunger etc.. Mais moi j'ai besoin de toutes qu'il n'y sont pas^^ (ex: night visons, blindness, slowness etc) Savez-vous comment les trouver ?



  • Si c'est juste pour recopier du code, tu peux prendre MCP pour avoir accès au code de toutes le classes vanilla.



  • MCP ?



  • @'sosoh':

    MCP ?

    Minecraft Coder Pack et google ça te dit quelque chose ?


  • Administrateurs

    ? Vous racontez n'importe quoi. Avec le setupDecompWorkspace vous avez toutes les sources de mc, utiliser mcp n'a aucun sens.

    Toutes les potions sont déclarés dans la classe Potion.java, et la plupart des potions réutilise cette même classe, c'est pour ça que tu ne trouve pas les classes des autres potions, tous simplement car elles n'en ont pas.



  • Ah mais alors comment je trouves le code pour faire du blindness ou des choses comme ca ? Car je veux créer un effet qui combine plusieurs trucs ^^


  • Administrateurs

    Tu regardes où la variable blindness est appelé.



  • J'y ai déjà penser mais il n'y a que:

    ​public static final Potion blindness = (new Potion(15, true, 2039587)).setPotionName("potion.blindness").setIconIndex(5, 1).setEffectiveness(0.25D);
    

  • Administrateurs

    Sélectionne blindness et fait une recherche Java …



  • Ah j'ai trouvé mais le code use des declarations qui meme si je les copies avec les dependances etc ne marche pas


  • Administrateurs

    Envoie le code ?



  • Il y a 2 choses qui sont dans la classe (net.minecraft.client.renderer.EntityRenderer):

    ​
            WorldClient worldclient = this.mc.theWorld;
    
            double d0 = (entitylivingbase.lastTickPosY + (entitylivingbase.posY - entitylivingbase.lastTickPosY) * (double)p_78466_1_) * worldclient.provider.getVoidFogYFactor();
    
            if (entitylivingbase.isPotionActive(Potion.blindness))
            {
                int i = entitylivingbase.getActivePotionEffect(Potion.blindness).getDuration();
    
                if (i < 20)
                {
                    d0 *= (double)(1.0F - (float)i / 20.0F);
                }
                else
                {
                    d0 = 0.0D;
                }
            }
    ]
    

    Code semi-complet:

    ​if (entitylivingbase.isPotionActive(Potion.blindness))
    
                {
                    f1 = 5.0F;
                    int j = entitylivingbase.getActivePotionEffect(Potion.blindness).getDuration();
    
                    if (j < 20)
                    {
                        f1 = 5.0F + (this.farPlaneDistance - 5.0F) * (1.0F - (float)j / 20.0F);
                    }
    
                    GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
    
                    if (p_78468_1_ < 0)
                    {
                        GL11.glFogf(GL11.GL_FOG_START, 0.0F);
                        GL11.glFogf(GL11.GL_FOG_END, f1 * 0.8F);
                    }
                    else
                    {
                        GL11.glFogf(GL11.GL_FOG_START, f1 * 0.25F);
                        GL11.glFogf(GL11.GL_FOG_END, f1);
                    }
    
                    if (GLContext.getCapabilities().GL_NV_fog_distance)
                    {
                        GL11.glFogi(34138, 34139);
                    }
                }
    

    Code semi complet:


  • Administrateurs

    Visiblement forge a tout prévu, tu peux utiliser les event :
    EntityViewRenderEvent.RenderFogEvent
    EntityViewRenderEvent.FogColors

    Pour refaire la même chose.



  • Ah ok merci, je vais essayer de trouver les mêmes classes avec la slowness et faire mon effet



  • Salut, je n'arrive pas a reproduire l'effet blindness on peut m'aider ?


  • Administrateurs

    Envoie ton code actuel.



  • Mais en faite je ne sais pas comment adapter le code de la classe à mon utilisation .. 😞

    Mon code:

    ​@SubscribeEvent
    
    public void RenderFogEvent(EntityViewRenderEvent.RenderFogEvent event){
    
                GL11.glFog(GL11.GL_FOG_COLOR, this.setFogColorBuffer(this.fogColorRed, this.fogColorGreen, this.fogColorBlue, 1.0F));
                GL11.glNormal3f(0.0F, -1.0F, 0.0F);
                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
                float f1;
    
                if (event.entity.isPotionActive(SomnolenceEffect.somnolenceEffectID))
                {
                    f1 = 5.0F;
                    int j = event.entity.getActivePotionEffect(SomnolenceEffect.somnolenceEffect).getDuration();
    
                    if (j < 20)
                    {
                        f1 = 5.0F + (event.farPlaneDistance - 5.0F) * (1.0F - (float)j / 20.0F);
                    }
    
                    GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
    
                    if (event.fogMode < 0)
                    {
                        GL11.glFogf(GL11.GL_FOG_START, 0.0F);
                        GL11.glFogf(GL11.GL_FOG_END, f1 * 0.8F);
                    }
                    else
                    {
                        GL11.glFogf(GL11.GL_FOG_START, f1 * 0.25F);
                        GL11.glFogf(GL11.GL_FOG_END, f1);
                    }
    
                    if (GLContext.getCapabilities().GL_NV_fog_distance)
                    {
                        GL11.glFogi(34138, 34139);
                    }
                }
    
            }
    

    J'arrive pas a adapter le

    GL11.glFog(GL11.GL_FOG_COLOR, this.setFogColorBuffer(this.fogColorRed, this.fogColorGreen, this.fogColorBlue, 1.0F));
    

    (Tu peux deplacer ca dans le non resolu stp?)


  • Administrateurs

    Tu n'es pas très loin de la solution. En fait cette partie du code ne sert à rien. Il faut prendre seulement le code qui fait le brouillard. J'ai fait quelques tests de mon côté avec la potion de force (premier truc que j'ai trouvé). Voila ce que ça donne :

    ​    @SubscribeEvent
    
        @SideOnly(Side.CLIENT)
        public void onFogRender(EntityViewRenderEvent.RenderFogEvent event)
        {
            if(event.entity.isPotionActive(Potion.damageBoost.id))
            {
                float f1 = 5.0F;
                int j = event.entity.getActivePotionEffect(Potion.damageBoost).getDuration();
    
                if(j < 20)
                {
                    f1 = 5.0F + (event.farPlaneDistance - 5.0F) * (1.0F - (float)j / 20.0F);
                }
    
                GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
    
                if(event.fogMode < 0)
                {
                    GL11.glFogf(GL11.GL_FOG_START, 0.0F);
                    GL11.glFogf(GL11.GL_FOG_END, f1 * 0.8F);
                }
                else
                {
                    GL11.glFogf(GL11.GL_FOG_START, f1 * 0.25F);
                    GL11.glFogf(GL11.GL_FOG_END, f1);
                }
    
                if(GLContext.getCapabilities().GL_NV_fog_distance)
                {
                    GL11.glFogi(34138, 34139);
                }
            }
        }
    

    Suffit juste de changer Potion.damageBoost par ta potion.
    Par contre le brouillard sera tout blanc, donc il faut passer par un second event :

    ​    @SubscribeEvent
    
        @SideOnly(Side.CLIENT)
        public void getFogColor(EntityViewRenderEvent.FogColors event)
        {
            if(event.entity.isPotionActive(Potion.damageBoost.id))
            {
                double d0 = (event.entity.lastTickPosY + (event.entity.posY - event.entity.lastTickPosY) * (double)event.renderPartialTicks) * FMLClientHandler.instance().getWorldClient().provider.getVoidFogYFactor();
    
                int i = event.entity.getActivePotionEffect(Potion.damageBoost).getDuration();
    
                if(i < 20)
                {
                    d0 *= (double)(1.0F - (float)i / 20.0F);
                }
                else
                {
                    d0 = 0.0D;
                }
    
                if(d0 < 1.0D)
                {
                    if(d0 < 0.0D)
                    {
                        d0 = 0.0D;
                    }
    
                    d0 *= d0;
                    event.red = (float)((double)event.red * d0);
                    event.green = (float)((double)event.green * d0);
                    event.blue = (float)((double)event.blue * d0);
                }
            }
        }
    

    Après tu peux très bien lancer ton jeu en débug et faire mumuse avec les valeurs ^^ (genre que multiplier le rouge, ou que le bleu, etc …)



  • Ok merci, car j'avais trouvé qu'avec l'event "EntityViewRenderEvent.FogColors" ca marché mais comme on peut pas combiner 2 event ^^