SOLVED Swap texture d'une entité et calcul


  • - Le problème -

    Bonjour tout le monde,

    Aujourd’hui comme souvent j’ai voulue tester des trucs, malheureusement ça ne marche pas toujours… Je voulais qu’il y est plusieurs textures disponibles pour certain de mes mobs (le scarabée et le papillon), j’ai donc fais un petit tour coté lapin de Minecraft et j’ai vaguement compris qu’il y avait un dataWatcher dans la classe de l’entité (je sais pas du tout ce que sait) et plusieurs fonctions qui l’utilise dont une utilisé à sont tour dans “IEntityLiving” ou un truc dans le genre, ensuite coté rendu j’ai vue un simple switch pour les différentes textures (donc ça j’ai compris).

    Alors voilà je voulais savoir si quelqu’un a une méthode simple (celle-ci ou une autre), ou pourrais me rediriger vers un tuto pour avoir plusieurs textures disponible au spawn d’un mob. Personnellement j’avais hésité à recréer carrément une nouvelle classe entité (avec le même rendu) mais c’est pas très optimal je doit l’avouer et je suis pas vraiment sûr du bon fonctionnement de cette méthode.

    Ps: Vue que je suis là autant en profiter si il y a des matheux qui passent par ici, en gros je voudrais afficher une barre de vie des mobs de 79 pixels de longueur sur l’overlay à l’instar de la barre d’expérience. Pour simuler la barre de vie du joueur (étant donné qu’il a 20 de vie) j’ai fais 20 * 4 pour arriver à 80 et donc pouvoir faire :

    int playerLife = (int)mc.thePlayer.getHealth() * 4;
    int width = playerLife;
    
    mc.ingameGUI.drawTexturedModalRect(posX + 1, posY + 1, 0, 9, width, 7);
    

    Mais sachant que les monstres ont plus ou moins de vie je ne pourrais pas toujours utiliser ce calcul donc si quelqu’un a un éclair de génie que de toute évidence, je n’ai pas eu, pour réduire la taille de la barre (soit 79 pixels) en fonction de la vie du mob, merci d’avance 😄

    - Mes classes -

    Le rendu pour le scarabée :

    package mods.emotion.entity;
    
    import mods.emotion.lib.Infos;
    import net.minecraft.client.model.ModelBase;
    import net.minecraft.client.renderer.entity.RenderLiving;
    import net.minecraft.client.renderer.entity.RenderManager;
    import net.minecraft.entity.Entity;
    import net.minecraft.util.ResourceLocation;
    
    public class RenderBeetle extends RenderLiving
    {
       public ResourceLocation texture = new ResourceLocation(Infos.MODID, "textures/entity/beetle/beetle.png");
    
       public RenderBeetle(RenderManager render, ModelBase model, float shadow)
       {
           super(render, model, shadow);
       }
    
       @Override
       protected ResourceLocation getEntityTexture(Entity entity)
       {
           return getBeetleTexture((EntityBeetle)entity);
       }
    
       private ResourceLocation getBeetleTexture(EntityBeetle beetle)
       {
           return texture;
       }
    }
    

    La classe de l’entité :

    package mods.emotion.entity;
    
    import net.minecraft.entity.EntityAgeable;
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.entity.ai.EntityAIPanic;
    import net.minecraft.entity.ai.EntityAIWander;
    import net.minecraft.entity.passive.EntityAnimal;
    import net.minecraft.world.World;
    
    public class EntityBeetle extends EntityAnimal
    {
       public EntityBeetle(World world)
       {
           super(world);
           this.setSize(0.4F, 0.3F);
           this.tasks.addTask(0, new EntityAIWander(this, 0.3D));
           this.tasks.addTask(1, new EntityAIPanic(this, 0.6D));
       }
    
       public boolean isAIEnabled()
       {
           return true;
       }
    
       @Override
       public void applyEntityAttributes()
       {
           super.applyEntityAttributes();
           this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(5.0D);
           this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.5D);
       }
    
       @Override
       public EntityAgeable createChild(EntityAgeable ageable)
       {
           return null;
       }
    }
    

    La classe de l’event :

    package mods.emotion.main;
    
    import mods.emotion.lib.Infos;
    import net.minecraft.client.Minecraft;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    public class EmotionOverlayEvent
    {
       private int width;
    
       @SideOnly(Side.CLIENT)
       @SubscribeEvent
       public void onRenderOverlay(RenderGameOverlayEvent e)
       {
           if(!e.isCancelable() && e.type == ElementType.EXPERIENCE)
           {
               Minecraft mc = Minecraft.getMinecraft();
               int playerLife = (int)mc.thePlayer.getHealth() * 4;
               width = playerLife;
    
               if(!mc.thePlayer.capabilities.isCreativeMode)
               {
                   int posX = e.resolution.getScaledWidth() / 2 + 10;
                   int posY = e.resolution.getScaledHeight() - 49;
    
                   mc.renderEngine.bindTexture(new ResourceLocation(Infos.MODID + ":textures/gui/icons.png"));
    
                   mc.ingameGUI.drawTexturedModalRect(posX, posY, 0, 0, 81, 9);
                   mc.ingameGUI.drawTexturedModalRect(posX + 1, posY + 1, 0, 9, width , 7);
               }
           }
       }
    }
    
  • Modérateurs

    Pour la barre de vie, tu peux utiliser cette formule:

    ​int width = health/maxHealth * largeurVoulue;
    

    Ainsi, tu auras une barre de vie dont la taille ne dépend plus de la vie maximale du mob 😉

  • Administrateurs Rédacteurs Moddeurs confirmés

    Et pour la texture qui change je suis persuadé d’avoir déjà répondu a une question identique. Faut chercher un peu sur le fofo.


  • Un génie, merci beaucoup 🙂 Pour les personnes qui souhaitent la même chose il ne faut surtout pas cast health et maxHealth à int sinon la barre de vie seras toujours égale à 0 quand elle n’est pas égale à 79 étant donné que 19 / 20 = 0.95 soit 0 en int.

    Il faudra donc cast le float width directement ici :

    mc.ingameGUI.drawTexturedModalRect(posX + 1, posY + 1, 0, 9, (int)width, 7);
    

    Ps: Justement j’ai cherché comme d’habitude, google et forum puis n’importe où sans rien trouver. En même temps quel mot clé utiliser ? Différente texture mob, swap texture mob, multi texture mob ? Déjà fais.

  • Administrateurs Rédacteurs Moddeurs confirmés

    http://www.minecraftforgefrance.fr/showthread.php?tid=1851&highlight=texture
    Avec le mot clé texture, sur la 5ème page. J’ai juste lu les titres et ouvert 2-3 discussions, ça m’a prit environ 3 min. Mais je suis d’accord avec toi, trouver les bons mots clés ce n’est pas toujours facile (surtout parce que certains mettent n’importe quoi en titre).

    @‘EmotionFox’:

    Un génie, merci beaucoup 🙂

    Ce que Xavpok t’as donné n’est qu’un simple produit en croix, n’importe qui est sensé savoir faire ça non ?
    Oui Xavpok est bien en génie, mais pour d’autres raisons que celle-ci x)


  • Crois-moi pour quelqu’un comme moi ça relève bien du génie. Rien que quand tu a dis produit en croix j’ai commencé à serrer les dents x)

    Bref merci beaucoup et j’aurais sûrement due fouiller un peu plus c’est sûr, navré.

  • Administrateurs Rédacteurs Moddeurs confirmés

    http://fr.wikipedia.org/wiki/Règle_de_trois
    C’est une multiplication et une division, il n’y a même pas de dérivé ni d’intégrale ni de primitive ni de loi a densité, ni de cosinus ou de sinus x)