11 août 2015, 14:52

Salut.
Je ne modde pas en 1.7 donc je sais pas si çela fonctionne comme en 1.8 ( Les coddes ci-dessous seront en 1.7 hein )
C’est assez simple, il te faudra ton item, mon aussi une entité Lance.
D’abbord, dans la classe de l’item, rajoute ces méthodes :

Cette méthode servira a faire spawn ton entité tirée

public void onPlayerStoppedUsing(ItemStack p_77615_1_, World p_77615_2_, EntityPlayer p_77615_3_, int p_77615_4_)
   {
       int j = this.getMaxItemUseDuration(p_77615_1_) - p_77615_4_;

       ArrowLooseEvent event = new ArrowLooseEvent(p_77615_3_, p_77615_1_, j);
       MinecraftForge.EVENT_BUS.post(event);
       if (event.isCanceled())
       {
           return;
       }
       j = event.charge;

       boolean flag = p_77615_3_.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, p_77615_1_) > 0;

       if (flag || p_77615_3_.inventory.hasItem(Items.arrow))
       {
           float f = (float)j / 20.0F;
           f = (f * f + f * 2.0F) / 3.0F;

           if ((double)f < 0.1D)
           {
               return;
           }

           if (f > 1.0F)
           {
               f = 1.0F;
           }

           EntityArrow entityarrow = new EntityArrow(p_77615_2_, p_77615_3_, f * 2.0F);

           if (f == 1.0F)
           {
               entityarrow.setIsCritical(true);
           }

           int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, p_77615_1_);

           if (k > 0)
           {
               entityarrow.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D);
           }

           int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, p_77615_1_);

           if (l > 0)
           {
               entityarrow.setKnockbackStrength(l);
           }

           if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, p_77615_1_) > 0)
           {
               entityarrow.setFire(100);
           }

           p_77615_1_.damageItem(1, p_77615_3_);
           p_77615_2_.playSoundAtEntity(p_77615_3_, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);

           if (flag)
           {
               entityarrow.canBePickedUp = 2;
           }
           else
           {
               p_77615_3_.inventory.consumeInventoryItem(Items.arrow);
           }

           if (!p_77615_2_.isRemote)
           {
               p_77615_2_.spawnEntityInWorld(entityarrow);
           }
       }
   }

Puisque tu veut créer une lance, j’imagine que ce n’est pas un arc, donc voila le code, sans effet grâce aux enchantements

public void onPlayerStoppedUsing(ItemStack p_77615_1_, World p_77615_2_, EntityPlayer p_77615_3_, int p_77615_4_)
   {
       int j = this.getMaxItemUseDuration(p_77615_1_) - p_77615_4_;

       ArrowLooseEvent event = new ArrowLooseEvent(p_77615_3_, p_77615_1_, j);
       MinecraftForge.EVENT_BUS.post(event);
       if (event.isCanceled())
       {
           return;
       }
       j = event.charge;

       boolean flag = p_77615_3_.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, p_77615_1_) > 0;

       if (flag || p_77615_3_.inventory.hasItem(Items.arrow))
       {
           float f = (float)j / 20.0F;
           f = (f * f + f * 2.0F) / 3.0F;

           if ((double)f < 0.1D)
           {
               return;
           }

           if (f > 1.0F)
           {
               f = 1.0F;
           }

           EntityArrow entityarrow = new EntityArrow(p_77615_2_, p_77615_3_, f * 2.0F);

           if (f == 1.0F)
           {
               entityarrow.setIsCritical(true);
           }

           p_77615_1_.damageItem(1, p_77615_3_);
           p_77615_2_.playSoundAtEntity(p_77615_3_, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);

           if (flag)
           {
               entityarrow.canBePickedUp = 2;
           }
           else
           {
               p_77615_3_.inventory.consumeInventoryItem(Items.arrow);
           }

           if (!p_77615_2_.isRemote)
           {
               p_77615_2_.spawnEntityInWorld(entityarrow);
           }
       }
   }

Maintenant, remplace la flèche par ton entité ( Appelé ‘EntitySpear’ dans cette méthode ( Appele la classe de ton entity comme tu veut )

public void onPlayerStoppedUsing(ItemStack p_77615_1_, World p_77615_2_, EntityPlayer p_77615_3_, int p_77615_4_)
   {
       int j = this.getMaxItemUseDuration(p_77615_1_) - p_77615_4_;

       ArrowLooseEvent event = new ArrowLooseEvent(p_77615_3_, p_77615_1_, j);
       MinecraftForge.EVENT_BUS.post(event);
       if (event.isCanceled())
       {
           return;
       }
       j = event.charge;

       boolean flag = p_77615_3_.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, p_77615_1_) > 0;

       if (flag || p_77615_3_.inventory.hasItem(Items.arrow)) //Ici, change par le nom de ton item (Inutile dans le contexte, mais laise toujours )
       {
           float f = (float)j / 20.0F;
           f = (f * f + f * 2.0F) / 3.0F;

           if ((double)f < 0.1D)
           {
               return;
           }

           if (f > 1.0F)
           {
               f = 1.0F;
           }

           EntitySpear entityarrow = new EntitySpear(p_77615_2_, p_77615_3_, f * 2.0F); //Tu a juste a changer le nom de l'entity ici

           if (f == 1.0F)
           {
               entityarrow.setIsCritical(true);
           }

           p_77615_1_.damageItem(1, p_77615_3_);
           p_77615_2_.playSoundAtEntity(p_77615_3_, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);

           if (flag)
           {
               entityarrow.canBePickedUp = 2;
           }
           else
           {
               p_77615_3_.inventory.consumeInventoryItem(Items.arrow); //Ici, change aussi par ton item
           }

           if (!p_77615_2_.isRemote)
           {
               p_77615_2_.spawnEntityInWorld(entityarrow);
           }
       }
   }

Je ne sais pas si c’est méthode est utile, mais elle est présente dans le code de l’arc donc…

public ItemStack onEaten(ItemStack p_77654_1_, World p_77654_2_, EntityPlayer p_77654_3_)
    {
        return p_77654_1_;
    }

Ces méthodes servirons a faire en sorte que l’arc se charge ( Arc ou item hein )

public int getMaxItemUseDuration(ItemStack p_77626_1_)
    {
        return 72000;
    }

 public EnumAction getItemUseAction(ItemStack p_77661_1_)
    {
        return EnumAction.bow;
    }

 public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_)
    {
        ArrowNockEvent event = new ArrowNockEvent(p_77659_3_, p_77659_1_);
        MinecraftForge.EVENT_BUS.post(event);
        if (event.isCanceled())
        {
            return event.result;
        }

        if (p_77659_3_.capabilities.isCreativeMode || p_77659_3_.inventory.hasItem(Items.arrow))
        {
            p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_));
        }

        return p_77659_1_;
    }

Et voila, j’espère t’avoir aidé 🙂 Et dis moi s’il y a des erreurs, car je n’ai jamais moddé en 1.7