Animation d'item avec rendu spécial


  • Correcteurs

    Plop les gens,

    J'ai cherché pour les animations, je n'ai trouvé que pour les blocs et entités, donc rien qui ne m'intéresse.

    J'aimerais animer mes armes à feu lors de plusieurs actions: Rechargement / Phase de Tir

    Je sais d’ores et déjà changer le rendu en fonction d'un nbt tag, je m'en sers pour faire un rendu différent suivant que le joueur ait ou non cliqué "droit" sur sa souris.
    Ce que je ne sais pas faire ce sont des animations du type: Un shape qui change d'angle progressivement ou une translation d'un shape fonction d'un "état" de l'item.

    Créer les variables pour savoir quand doit se passer l'animation je pense pas que ce soit le problème, mon soucis c'est vraiment à quoi doit ressembler le code dans la classe du render

    :::

    package fr.powergame.modpg2.client.renders.items;
    
    import org.lwjgl.opengl.GL11;
    
    import fr.powergame.modpg2.client.models.ModelG36C;
    import net.minecraft.client.Minecraft;
    import net.minecraft.entity.Entity;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.IItemRenderer;
    
    public class RenderG36C implements IItemRenderer
    {
        protected ModelG36C model;
        protected static final ResourceLocation texture = new ResourceLocation("ModPg2:textures/models/items/R700.png");
    
        public RenderG36C()
        {
            model = new ModelG36C();
        }
    
        @Override
        public boolean handleRenderType(ItemStack item, ItemRenderType type)
        {
            switch(type)
            {
                case EQUIPPED:
                    return true;
                case EQUIPPED_FIRST_PERSON:
                    return true;
                case ENTITY:
                    return true;
                case INVENTORY:
                    return true;
                default:
                    return false;
            }
        }
    
        @Override
        public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper)
        {
            return false;
        }
    
        @Override
        public void renderItem(ItemRenderType type, ItemStack stack, Object… data)
        {
            switch(type)
            {
                case EQUIPPED:
                {
                    GL11.glPushMatrix();
                    GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F);
                    GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F);
                    GL11.glTranslatef(0.5F, -0.35F, -0.9F);
                    GL11.glScaled(0.5F, 0.5F, 0.5F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }
                case EQUIPPED_FIRST_PERSON:
                {
                    if(stack.getTagCompound() == null)
                    {
                        stack.setTagCompound(new NBTTagCompound());
                    }
                    else
                    {
                        if(stack.getTagCompound().getBoolean("leftClick") == true)
                        {
                            GL11.glPushMatrix();
                            GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F);
                            GL11.glRotatef(100.F, 0.5F, -0.2F, -0.65F);
                            GL11.glRotatef(30.F, -0.2F, -1.2F, 0.0F);
                            GL11.glTranslatef(0.0F, 0.0F, -1.7F);
                            GL11.glScaled(0.5F, 0.5F, 0.5F);
                            Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                            model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                            GL11.glPopMatrix();
                            break;
                        }
                        else
                        {
                            GL11.glPushMatrix();
                            GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F);
                            GL11.glRotatef(100.F, 0.59F, -0.2F, -0.7F);
                            GL11.glRotatef(30.F, 0F, -1.0F, 0.0F);
                            GL11.glTranslatef(1.0025F, -0.05F, -5.0F);
                            GL11.glScaled(1.5F, 1.5F, 1.5F);
                            Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                            model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                            GL11.glPopMatrix();
                            break;
                        }
                    }
                }
                case ENTITY:
                {
                    GL11.glPushMatrix();
                    GL11.glRotatef(90.F, 1.0F, 0F, 0F);
                    GL11.glRotatef(90.F, 1.0F, 0F, 0F);
                    GL11.glTranslatef(0F, -0.5F, -0.65F);
                    GL11.glScaled(0.45F, 0.45F, 0.45F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }
                case INVENTORY:
                {
                    GL11.glPushMatrix();
                    GL11.glRotatef(90.0F, -0.2F, 1.0F, 0.5F);
                    GL11.glTranslatef(10F, -1.0F, 7F);
                    GL11.glScalef(2.7F, 2.7F, 2.7F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }
                default:
                    break;
            }
        }
    }
    

    :::


  • Modérateurs

    Je pense que tu peux regarder du côté de la boussole et de l'horloge, ce sont les deux seuls objets qui ont une animation qui change avec le temps.
    Mais si ça convient pas, faudra surement cancel l'event RenderPlayerHand (je me rappelle pas du nom exact) et dessiner soi-même l'objet à l'écran.


  • Correcteurs

    Euh quand je dis rendu spécial, c'est rendu spécial, avec son propre model Xd

    :::

    MinecraftForgeClient.registerItemRenderer(ModPg2.itemG36C, new RenderG36C());
    

    :::
    :::
    (http://img4.hostingpics.net/pics/606644g36c.png)
    :::

    Dans le cas d'une arme à feu par exemple j'aimerais savoir comment ne mouvoir qu'une partie du modèle, à savoir les shapes qui font le chargeur, afin de changer l'angle de rotation de façon progressive pour animer un effet de rechargement



  • Tu initialises les tags de ton arme pour éviter le NPE lorsque tu enregistreras tes différentes variables dedans. Et en fonction des boolean ou d'autres timers, en integer, enregistrés dedans, dans le modèle de ton arme, et dans la fonction setRotationAngles, tu iras get ces valeurs pour faire varier les bons angles des bons shapes. C'est compris ? Pour moi c'est une technique, peut-être qu'il y en a d'autre :)


  • Correcteurs

    Haaan, mais c'est limite pareil qu'avec un bloc au final à part qu'il faut utiliser des tags NBT oO

    Hier soir j'ai testé et je pense avoir réussis.
    Merci pour la réponse qui m'a donné le déclic soudain, je pensais que ça aurait été bien différent.