Armure spéciale ne suit pas le joueur



  • Bonjour/Bonsoir,

    Ce que je souhaite faire:
    Je voudrais créer des armures spéciales pour un mod sous Forge 1.8. J'ai donc modélisé une armure avec Techne. J'ai créé une texturemap, j'ai exporté le Model, et j'ai réussit à intégrer cette armure en jeu. Voici une illustration:

    Mon problème:
    Donc, ça fonctionne pas trop mal. L'armure suit correctement le joueur lorsqu'il marche, saute, s'accroupit. Le problème, c'est que l'armure ne suit pas le mouvement du joueur lorsque celui-ci casse un bloc, en pose un, frappe, où utilise un objet. Et il faudrait qu'elle le fasse… Regardez:

    J'ai vérifié avec une armure normale, une Iron Chestplate, et elle bouge correctement lorsque le joueur frappe. J'ai donc cherché dans les fichiers de cette armure un "exemple" de code à mettre dans le mien pour corriger cela. Mais, débutant en modding que je suis, je n'ai pas trouvé…

    Je vous met là les codes de mon mod. Le ModItems déclare simplement les items. Le ModelMineur, c'est le modèle créé avec Techne. Et enfin,** ArmorClothesMod** et ClientProxy sont les fichiers qui permettent d'afficher le modèle correctement.

    ModItems.java:

    public class ModItems {
    
    public static Item mineur_helm;
    public static Item mineur_chest;
    public static Item mineur_legs;
    public static Item mineur_boots;
    
    public static void init()
        {
    
    //Tenue - Mineur 1
    mineur_helm = new ArmorClothesMod(ClothesMod.Indestructible, 1, 0).setUnlocalizedName("mineur_helm");
    mineur_chest = new ArmorClothesMod(ClothesMod.Indestructible, 1, 1).setUnlocalizedName("mineur_chest");
    mineur_legs = new ArmorClothesMod(ClothesMod.Indestructible, 1, 2).setUnlocalizedName("mineur_legs");
    mineur_boots = new ArmorClothesMod(ClothesMod.Indestructible, 1, 3).setUnlocalizedName("mineur_boots");
        }
    
    public static void register()
    {
    RegisterHelper.registerItem(mineur_helm);
    RegisterHelper.registerItem(mineur_chest);
    RegisterHelper.registerItem(mineur_legs);
    RegisterHelper.registerItem(mineur_boots);
    }
    
    public static void registerRenders()
    {
    RegisterHelper.registerRender(mineur_helm);
    RegisterHelper.registerRender(mineur_chest);
    RegisterHelper.registerRender(mineur_legs);
    RegisterHelper.registerRender(mineur_boots);
    }
    
    }
    

    ModelMineur.java:

    public class ModelMineur extends ModelBiped
    {
      //fields
    ModelRenderer rightarm;
        ModelRenderer leftarm;
        ModelRenderer rightleg;
        ModelRenderer leftleg;
        ModelRenderer body;
    
        ModelRenderer casquebas;
        ModelRenderer casquehaut1;
        ModelRenderer casquehaut2;
        ModelRenderer casquelampe1;
        ModelRenderer casquelampe2;
        ModelRenderer vestebase;
        ModelRenderer vestebrasdroit;
        ModelRenderer vestebrasgauche;
        ModelRenderer braceletdroit;
        ModelRenderer braceletgauche;
    
      public ModelMineur(float expand)
      {
     super(expand, 0, 96, 96);
    
     body = new ModelRenderer(this, 16, 64);
          body.addBox(-4F, 0F, -2F, 8, 12, 4);
          body.setRotationPoint(0F, 0F, 0F);
          body.setTextureSize(96, 96);
          body.mirror = true;
          setRotation(body, 0F, 0F, 0F);
    
     rightarm = new ModelRenderer(this, 0, 64);
          rightarm.addBox(-3F, -2F, -2F, 4, 12, 4);
          rightarm.setRotationPoint(0F, 0F, 0F);
          rightarm.setTextureSize(96, 96);
          rightarm.mirror = true;
          setRotation(rightarm, 0F, 0F, 0F);
    
          leftarm = new ModelRenderer(this, 0, 64);
          leftarm.addBox(-1F, -2F, -2F, 4, 12, 4);
          leftarm.setRotationPoint(0F, 0F, 0F);
          leftarm.setTextureSize(96, 96);
          leftarm.mirror = true;
          setRotation(leftarm, 0F, 0F, 0F);
    
          rightleg = new ModelRenderer(this, 0, 16);
          rightleg.addBox(-2F, 0F, -2F, 4, 12, 4);
          rightleg.setRotationPoint(-2F, 12F, 0F);
          rightleg.setTextureSize(96, 96);
          rightleg.mirror = true;
          setRotation(rightleg, 0F, 0F, 0F);
    
          leftleg = new ModelRenderer(this, 0, 16);
          leftleg.addBox(-2F, 0F, -2F, 4, 12, 4);
          leftleg.setRotationPoint(2F, 12F, 0F);
          leftleg.setTextureSize(96, 96);
          leftleg.mirror = true;
          setRotation(leftleg, 0F, 0F, 0F);
    
          casquebas = new ModelRenderer(this, 0, 52);
          casquebas.addBox(0F, 0F, 0F, 10, 1, 11);
          casquebas.setRotationPoint(-5F, -8.1F, -6F);
          casquebas.setTextureSize(96, 96);
          casquebas.mirror = true;
          setRotation(casquebas, -0.0087266F, 0F, 0F);
    
          casquehaut1 = new ModelRenderer(this, 0, 54);
          casquehaut1.addBox(0F, 0F, 0F, 8, 2, 8);
          casquehaut1.setRotationPoint(1F, -2F, 2F);
          casquehaut1.setTextureSize(96, 96);
          casquehaut1.mirror = true;
          setRotation(casquehaut1, -0.0174533F, 0F, 0F);
    
          casquehaut2 = new ModelRenderer(this, 0, 57);
          casquehaut2.addBox(0F, 0F, 0F, 6, 1, 6);
          casquehaut2.setRotationPoint(1F, -1F, 1F);
          casquehaut2.setTextureSize(96, 96);
          casquehaut2.mirror = true;
          setRotation(casquehaut2, -0.0174533F, 0F, 0F);
    
          casquelampe1 = new ModelRenderer(this, 32, 58);
          casquelampe1.addBox(0F, 0F, 0F, 2, 2, 2);
          casquelampe1.setRotationPoint(2F, 1F, -3F);
          casquelampe1.setTextureSize(96, 96);
          casquelampe1.mirror = true;
          setRotation(casquelampe1, -0.0174533F, 0F, 0F);
    
          casquelampe2 = new ModelRenderer(this, 32, 54);
          casquelampe2.addBox(0F, 0F, 0F, 1, 1, 3);
          casquelampe2.setRotationPoint(0.5F, -0.5F, 0.5F);
          casquelampe2.setTextureSize(96, 96);
          casquelampe2.mirror = true;
          setRotation(casquelampe2, 0F, 0F, 0F);
    
          vestebase = new ModelRenderer(this, 0, 39);
          vestebase.addBox(0F, 0F, 0F, 9, 8, 5);
          vestebase.setRotationPoint(-4.5F, -0.5F, -2.5F);
          vestebase.setTextureSize(96, 96);
          vestebase.mirror = true;
          setRotation(vestebase, 0F, 0F, 0F);
    
          vestebrasdroit = new ModelRenderer(this, 28, 41);
          vestebrasdroit.addBox(0F, 0F, 0F, 4, 6, 5);
          vestebrasdroit.setRotationPoint(-3.5F, -2.5F, -2.5F);
          vestebrasdroit.setTextureSize(96, 96);
          vestebrasdroit.mirror = true;
          setRotation(vestebrasdroit, 0F, 0F, 0F);
    
          vestebrasgauche = new ModelRenderer(this, 46, 41);
          vestebrasgauche.addBox(0F, 0F, 0F, 4, 6, 5);
          vestebrasgauche.setRotationPoint(-0.5F, -2.5F, -2.5F);
          vestebrasgauche.setTextureSize(96, 96);
          vestebrasgauche.mirror = true;
          setRotation(vestebrasgauche, 0F, 0F, 0F);
    
          braceletdroit = new ModelRenderer(this, 28, 35);
          braceletdroit.addBox(0F, 0F, 0F, 5, 1, 5);
          braceletdroit.setRotationPoint(0F, 10F, 0F);
          braceletdroit.setTextureSize(96, 96);
          braceletdroit.mirror = true;
          setRotation(braceletdroit, -0.0349066F, -0.0349066F, -0.0349066F);
    
          braceletgauche = new ModelRenderer(this, 44, 35);
          braceletgauche.addBox(0F, 0F, 0F, 5, 1, 5);
          braceletgauche.setRotationPoint(-1F, 10F, 0F);
          braceletgauche.setTextureSize(96, 96);
          braceletgauche.mirror = true;
          setRotation(braceletgauche, 0.0349066F, -0.0523599F, 0.0174533F);
    
          casquelampe1.addChild(casquelampe2);
          casquehaut2.addChild(casquelampe1);
          casquehaut1.addChild(casquehaut2);
          casquebas.addChild(casquehaut1);
          this.bipedHead.addChild(casquebas);
    
          body.addChild(vestebase);
          this.bipedBody.addChild(body);
    
          vestebrasgauche.addChild(braceletgauche);
          leftarm.addChild(vestebrasgauche);
          this.bipedLeftArm.addChild(leftarm);
    
          vestebrasdroit.addChild(braceletdroit);
          rightarm.addChild(vestebrasdroit);
          this.bipedRightArm.addChild(rightarm);
    
      }
    
      public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
      {
        super.render(entity, f, f1, f2, f3, f4, f5);
        setRotationAngles(f, f1, f2, f3, f4, f5, entity);
      }
    
      private void setRotation(ModelRenderer model, float x, float y, float z)
      {
        model.rotateAngleX = x;
        model.rotateAngleY = y;
        model.rotateAngleZ = z;
      }
    
    }
    

    ClientProxy.java

    public class ClientProxy extends CommonProxy {
    
    public static final Map <item, modelbiped="">armorModels = new HashMap<item, modelbiped="">();
    
    @Override
    public void registerRenders()
    {
    ModItems.registerRenders();
    
    ModelMineur mineur_armor = new ModelMineur(0.5F);
    armorModels.put(ModItems.mineur_helm, mineur_armor);
    armorModels.put(ModItems.mineur_chest, mineur_armor);
    armorModels.put(ModItems.mineur_legs, mineur_armor);
    armorModels.put(ModItems.mineur_boots, mineur_armor);
    }
    }
    

    ArmorClothesMod.java:

    public class ArmorClothesMod extends ItemArmor {
    
    public ArmorClothesMod(ArmorMaterial material, int renderIndex, int armorType) {
    super(material, renderIndex, armorType);
    
    this.setMaxStackSize(1);
    this.setCreativeTab(ClothesMod.tabClothes);
    }
    
    @Override
    public String getUnlocalizedName()
    {
    return String.format("item.%s", getUnwrappedUnlocalizedName(super.getUnlocalizedName()));
    }
    
    @Override
    public String getUnlocalizedName(ItemStack itemstack)
    {
    return String.format("item.%s", getUnwrappedUnlocalizedName(super.getUnlocalizedName()));
    }
    
    protected String getUnwrappedUnlocalizedName(String unlocalizedName)
    {
    return unlocalizedName.substring(unlocalizedName.indexOf('.') + 1);
    }
    
    //Je pense que c'est la partie ci-dessous qui peut régler le problème:
    @Override
    @SideOnly(Side.CLIENT)
    public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot)
    {
    ModelBiped armorModel = ClientProxy.armorModels.get(this);
    
    if(armorModel != null){
    armorModel.bipedHead.showModel = armorSlot == 0;
    armorModel.bipedHeadwear.showModel = armorSlot == 0;
    armorModel.bipedBody.showModel = armorSlot == 1 || armorSlot == 2;
    armorModel.bipedRightArm.showModel = armorSlot == 1;
    armorModel.bipedLeftArm.showModel = armorSlot == 1;
    armorModel.bipedRightLeg.showModel = armorSlot == 2 || armorSlot == 3;
    armorModel.bipedLeftLeg.showModel = armorSlot == 2 || armorSlot == 3;
    
    armorModel.isSneak = entityLiving.isSneaking();
        armorModel.isRiding = entityLiving.isRiding();
        armorModel.isChild = entityLiving.isChild();
    
        armorModel.heldItemRight = 0;
        armorModel.aimedBow = false;
    
        EntityPlayer player = (EntityPlayer)entityLiving;
        ItemStack held_item = player.getEquipmentInSlot(0);
    
        if (held_item != null){
        armorModel.heldItemRight = 1;
    
        if (player.getItemInUseCount() > 0){
    
        EnumAction enumaction = held_item.getItemUseAction();
    
        if (enumaction == EnumAction.BOW){
        armorModel.aimedBow = true;
        }else if (enumaction == EnumAction.BLOCK){
        armorModel.heldItemRight = 3;
        }
    
        }
        return armorModel;
        }
    }
    
    return armorModel;
    }
    
    @Override
    public String getArmorTexture(ItemStack stack, Entity entity, int slot, String layer)
    {
    String name = this.getUnwrappedUnlocalizedName(super.getUnlocalizedName());
    name = name.substring(0, name.indexOf('_'));
    
    return String.format("%s:textures/models/armor/%s_layer_%d.png", ClothesMod.MODID, name, slot == 2 ? 2 : 1);
    }
    }
    

    J'ai supprimé toutes les includes pour que ce soit plus clair.
    Je vous remercie d'avance,

    Au revoir.</item,></item,>


  • Administrateurs

    J'ai supprimé toutes les includes pour que ce soit plus clair.

    Tu voulais dire importation ?

    Je viens de regarde vite fait comment fonctionne l'armure de Minecraft.
    Niveau modèle elle utilise le même modèle que le joueur, mais un peu plus gros.

    Regarde du-coup du côté de ModelBiped.
    Il y a une fonction setRotationAngles(float, float, float, float, float, float, Entity) c'est dans cette fonction que les rotations sont faite.



  • Bonjour Robin,

    Je viens de regarder la fonction que tu m'as indiqué. Il me manquait "swingProgress". Et j'ai regardé un peu plus loin, dans ModelBase. Aux dernières lignes de ce fichier, je me suis inspiré du contenu de la fonction "setModelAttributes" pour corriger mon problème.

    J'ai donc rajouté la ligne suivante à la fonction "getArmorModel" de mon [font=Arial, tahoma, sans-serifArmorClothesMod:]

    armorModel.swingProgress = entityLiving.swingProgress;
    

    Ce qui donne:

    @Override
    
    @SideOnly(Side.CLIENT)
    public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot)
    {
    ModelBiped armorModel = ClientProxy.armorModels.get(this);
    
    if(armorModel != null){
    armorModel.bipedHead.showModel = armorSlot == 0;
    armorModel.bipedHeadwear.showModel = armorSlot == 0;
    armorModel.bipedBody.showModel = armorSlot == 1 || armorSlot == 2;
    armorModel.bipedRightArm.showModel = armorSlot == 1;
    armorModel.bipedLeftArm.showModel = armorSlot == 1;
    armorModel.bipedRightLeg.showModel = armorSlot == 2 || armorSlot == 3;
    armorModel.bipedLeftLeg.showModel = armorSlot == 2 || armorSlot == 3;
    
    armorModel.isSneak = entityLiving.isSneaking();
        armorModel.isRiding = entityLiving.isRiding();
        armorModel.isChild = entityLiving.isChild();
    
        //Ajout –---------------------------------------------
        armorModel.swingProgress = entityLiving.swingProgress;
        //Ajout -----------------------------------------------
    
        armorModel.heldItemRight = 0;
        armorModel.aimedBow = false;
    
        EntityPlayer player = (EntityPlayer)entityLiving;
        ItemStack held_item = player.getEquipmentInSlot(0);
    
        if (held_item != null){
        armorModel.heldItemRight = 1;
    
        if (player.getItemInUseCount() > 0){
    
        EnumAction enumaction = held_item.getItemUseAction();
    
        if (enumaction == EnumAction.BOW){
        armorModel.aimedBow = true;
        }else if (enumaction == EnumAction.BLOCK){
        armorModel.heldItemRight = 3;
        }
    
        }
        return armorModel;
        }
    }
    
    return armorModel;
    }
    

    **Et magnifique, le problème est résolu ! **J'ai détaillé tout ce que j'ai fais au cas où quelqu'un d'autre en aurait besoin ^^. Et je te remercie beaucoup, Robin, pour tes indications. Et oui, je parlais des imports 🙂

    J'édite le topic comme 'résolu'.
    Au revoir !