Comment faire une lance ?



  • Bonjour,

    Après de longues recherches et d'essaies, je n'arrive toujours pas à faire une lance c'est à dire un Item qui se charge comme un arc pour se lancer comme une flèche.
    Si quelqu'un a une solution je suis preneur, merci 🙂

    Cordialement,



  • 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



  • Salut 🙂

    Merci beaucoup, la lance semble fonctionné mais je créé comment l’entité ? Je suis débutant dans ce milieu 😛



  • Je t'invite a faire un petit copier coller sympatoche de la classe EntityArrow 🙂
    Voici comment l'obtenir, si tu ne sais pas ( Eh oui, je suis gentil moi )
    Sur ton package explorer :
    Minecraft > Referenced Libaries > forgeSrc BLAHBLAHBLAH > net > minecraft > entity > projectile > EntityArrow
    Si tu ne te débrouille pas trop bien avec les classes de bases, je pourrais t'expliquer un peu quoi changer



  • J'ai bien fait le copié/coller, lancer le jeu et…. ça marche pas 😞
    La lance ne se charge pas et n'envois rien 😢

    Mes class:

    Class principale:

    Class de la lance:

    Class de l’entité:


  • Administrateurs

    Les entités doivent être enregistré. Et il faut ajouter un rendu à ton entité sinon elle ne se verra pas.



  • Comme là dit robin, il faut register ton entitée
    Et ton item n'a pas toutes les méthodes que j'ai mis
    Il te manque toutes celles qui font que ton item peut se charger, donc oui, ça marchera pas 😕



  • Bon, j'ai réussi, ça charge et ça tire (Des flèches….)

    Voilà mes class:

    Principale:

    Lance:

    Entity de la lance:



  • Dans l'entity de ta lance , tu extends EntityArrow , fait comme ceci

    extends Entity implements IProjectile
    


  • C'est une mauvaise idée d'extends EntityArrow ou EntityThrowable car Minecraft les a codé avec les pieds. C'est mieux de recopier la classe comme a dit Eryah.



  • @'SCAREX':

    C'est une mauvaise idée d'extends EntityArrow ou EntityThrowable car Minecraft les a codé avec les pieds. C'est mieux de recopier la classe comme a dit Eryah.

    Perso c'est pour ca que j'utilise

    extends Entity implements IProjectile
    

    Et mon arc marche parfaitement , la le seul truc qui change c'est lorsque tu tire il "consomme" la lance c'est comme si l'arc tirait l'arc ^^



  • Bon, le code fonctionne très bien pour l'instant, j'ai bien mis "extends Entity implements IProjectile" et ça fonctionne.
    Reste plus qu'à faire le rendu et c'est bon, merci 😄



  • @'QuantumSheep':

    Bon, le code fonctionne très bien pour l'instant, j'ai bien mis "extends Entity implements IProjectile" et ça fonctionne.
    Reste plus qu'à faire le rendu et c'est bon, merci 😄

    Nice content pour toi ! 😄



  • IProjectile sert juste si tu veux utiliser ton projectile avec un Dispenser. Balise résolu ?



  • Eh bien non, j'ai un soucis 😄
    La lance s'envoie bien mais consomme des flèches au lieu d'elle même et si en survival j'ai pas de flèche, il en génère…

    Help me 😢



  • @'QuantumSheep':

    Eh bien non, j'ai un soucis  😄
    La lance s'envoie bien mais consomme des flèches au lieu d'elle même et si en survival j'ai pas de flèche, il en génère…

    Help me  😢

    Ton code final serait utile ^^



  • Je suis sur ma tablette mais voilà mon github avec les derniers codes rajoutés : https://github.com/QuantumSheep/ArkCraft



  • Dsl double post 😕

    Voilà mes class :

    Main class:

    package com.quantumsheep.arkcraft;
    
    import java.awt.Color;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    import com.quantumsheep.arkcraft.entity.EntityGiantSpider;
    import com.quantumsheep.arkcraft.entity.EntitySpear;
    import com.quantumsheep.arkcraft.lib.CommonProxy;
    import com.quantumsheep.arkcraft.lib.EntityEventHandler;
    import com.quantumsheep.arkcraft.lib.References;
    import com.quantumsheep.arkcraft.weapons.WeaponSpear;
    
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.Mod.EventHandler;
    import cpw.mods.fml.common.Mod.Instance;
    import cpw.mods.fml.common.SidedProxy;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    import cpw.mods.fml.common.registry.EntityRegistry;
    import cpw.mods.fml.common.registry.GameRegistry;
    import cpw.mods.fml.common.registry.LanguageRegistry;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.entity.Entity;
    import net.minecraft.item.Item;
    import net.minecraft.item.Item.ToolMaterial;
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.common.util.EnumHelper;
    
    @Mod(modid = References.MODID, name = "ArkCraft Mod", version = References.VERSION)
    
    public class ArkCraftMod {
    
    @Instance("arkcraft")
    public static ArkCraftMod instance;
    
    @SidedProxy(clientSide = References.Client, serverSide = References.Common)
    public static CommonProxy proxy;
    
    public static Item weaponSpear;
    
    public static final Logger LOGGER = LogManager.getLogger(References.NAME);
    
    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
    weaponSpear = new WeaponSpear().setUnlocalizedName("weaponSpear").setTextureName(References.MODID + ":itemtutoriel").setCreativeTab(CreativeTabs.tabMaterials);
    
    GameRegistry.registerItem(weaponSpear, "weapon_spear");
    }
    
    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    EntityRegistry.registerGlobalEntityID(EntitySpear.class, "entitySpear", EntityRegistry.findGlobalUniqueEntityId(), new Color(0, 255, 0).getRGB(), new Color(255, 0, 0).getRGB());
    EntityRegistry.registerModEntity(EntitySpear.class, "entitySpear", 420, this.instance, 40, 1, true);
    
    EntityRegistry.registerGlobalEntityID(EntityGiantSpider.class, "giantSpider", EntityRegistry.findGlobalUniqueEntityId(), 0x7AE8FF, 0x47FFE2);
    
    MinecraftForge.EVENT_BUS.register(new EntityEventHandler());
    proxy.registerRender();
    }
    
    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    
    }
    }
    

    La lance: ```java
    package com.quantumsheep.arkcraft.weapons;

    import com.quantumsheep.arkcraft.ArkCraftMod;
    import com.quantumsheep.arkcraft.entity.EntitySpear;

    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.enchantment.Enchantment;
    import net.minecraft.enchantment.EnchantmentHelper;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.projectile.EntityArrow;
    import net.minecraft.entity.projectile.EntitySnowball;
    import net.minecraft.init.Items;
    import net.minecraft.item.EnumAction;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.event.entity.player.ArrowLooseEvent;
    import net.minecraftforge.event.entity.player.ArrowNockEvent;

    public class WeaponSpear extends Item {

    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(ArkCraftMod.weaponSpear)) //Ici, change par le nom de ton item (Inutile dans le contexte, mais laise toujours )
    {
    float f = (float)j / 5.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);
    }
    }
    }

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

    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(ArkCraftMod.weaponSpear))
    {
    p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_));
    }

    return p_77659_1_;
    }
    }

    
    L'entité de la lance: ```java
    package com.quantumsheep.arkcraft.entity;
    
    import java.util.List;
    import java.util.List;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.enchantment.EnchantmentHelper;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.IProjectile;
    import net.minecraft.entity.monster.EntityEnderman;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraft.init.Items;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.network.play.server.S2BPacketChangeGameState;
    import net.minecraft.util.AxisAlignedBB;
    import net.minecraft.util.DamageSource;
    import net.minecraft.util.MathHelper;
    import net.minecraft.util.MovingObjectPosition;
    import net.minecraft.util.Vec3;
    import net.minecraft.world.World;
    
    public class EntitySpear extends Entity implements IProjectile
    {
    private int field_145791_d = -1;
    private int field_145792_e = -1;
    private int field_145789_f = -1;
    private Block field_145790_g;
    private int inData;
    private boolean inGround;
    /** 1 if the player can pick up the arrow */
    public int canBePickedUp;
    /** Seems to be some sort of timer for animating an arrow. */
    public int arrowShake;
    /** The owner of this arrow. */
    public Entity shootingEntity;
    private int ticksInGround;
    private int ticksInAir;
    private double damage = 2.0D;
    /** The amount of knockback an arrow applies when it hits a mob. */
    private int knockbackStrength;
    private static final String __OBFID = "CL_00001715";
    
    public EntitySpear(World p_i1753_1_)
    {
    super(p_i1753_1_);
    this.renderDistanceWeight = 10.0D;
    this.setSize(0.5F, 0.5F);
    }
    
    public EntitySpear(World p_i1754_1_, double p_i1754_2_, double p_i1754_4_, double p_i1754_6_)
    {
    super(p_i1754_1_);
    this.renderDistanceWeight = 10.0D;
    this.setSize(0.5F, 0.5F);
    this.setPosition(p_i1754_2_, p_i1754_4_, p_i1754_6_);
    this.yOffset = 0.0F;
    }
    
    public EntitySpear(World p_i1755_1_, EntityLivingBase p_i1755_2_, EntityLivingBase p_i1755_3_, float p_i1755_4_, float p_i1755_5_)
    {
    super(p_i1755_1_);
    this.renderDistanceWeight = 10.0D;
    this.shootingEntity = p_i1755_2_;
    
    if (p_i1755_2_ instanceof EntityPlayer)
    {
    this.canBePickedUp = 1;
    }
    
    this.posY = p_i1755_2_.posY + (double)p_i1755_2_.getEyeHeight() - 0.10000000149011612D;
    double d0 = p_i1755_3_.posX - p_i1755_2_.posX;
    double d1 = p_i1755_3_.boundingBox.minY + (double)(p_i1755_3_.height / 3.0F) - this.posY;
    double d2 = p_i1755_3_.posZ - p_i1755_2_.posZ;
    double d3 = (double)MathHelper.sqrt_double(d0 * d0 + d2 * d2);
    
    if (d3 >= 1.0E-7D)
    {
    float f2 = (float)(Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F;
    float f3 = (float)(-(Math.atan2(d1, d3) * 180.0D / Math.PI));
    double d4 = d0 / d3;
    double d5 = d2 / d3;
    this.setLocationAndAngles(p_i1755_2_.posX + d4, this.posY, p_i1755_2_.posZ + d5, f2, f3);
    this.yOffset = 0.0F;
    float f4 = (float)d3 * 0.2F;
    this.setThrowableHeading(d0, d1 + (double)f4, d2, p_i1755_4_, p_i1755_5_);
    }
    }
    
    public EntitySpear(World p_i1756_1_, EntityLivingBase p_i1756_2_, float p_i1756_3_)
    {
    super(p_i1756_1_);
    this.renderDistanceWeight = 10.0D;
    this.shootingEntity = p_i1756_2_;
    
    if (p_i1756_2_ instanceof EntityPlayer)
    {
    this.canBePickedUp = 1;
    }
    
    this.setSize(0.5F, 0.5F);
    this.setLocationAndAngles(p_i1756_2_.posX, p_i1756_2_.posY + (double)p_i1756_2_.getEyeHeight(), p_i1756_2_.posZ, p_i1756_2_.rotationYaw, p_i1756_2_.rotationPitch);
    this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
    this.posY -= 0.10000000149011612D;
    this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
    this.setPosition(this.posX, this.posY, this.posZ);
    this.yOffset = 0.0F;
    this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
    this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
    this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI));
    this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, p_i1756_3_ * 1.5F, 1.0F);
    }
    
    protected void entityInit()
    {
    this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
    }
    
    /**
    * Similar to setArrowHeading, it's point the throwable entity to a x, y, z direction.
    */
    public void setThrowableHeading(double p_70186_1_, double p_70186_3_, double p_70186_5_, float p_70186_7_, float p_70186_8_)
    {
    float f2 = MathHelper.sqrt_double(p_70186_1_ * p_70186_1_ + p_70186_3_ * p_70186_3_ + p_70186_5_ * p_70186_5_);
    p_70186_1_ /= (double)f2;
    p_70186_3_ /= (double)f2;
    p_70186_5_ /= (double)f2;
    p_70186_1_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_;
    p_70186_3_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_;
    p_70186_5_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_;
    p_70186_1_ *= (double)p_70186_7_;
    p_70186_3_ *= (double)p_70186_7_;
    p_70186_5_ *= (double)p_70186_7_;
    this.motionX = p_70186_1_;
    this.motionY = p_70186_3_;
    this.motionZ = p_70186_5_;
    float f3 = MathHelper.sqrt_double(p_70186_1_ * p_70186_1_ + p_70186_5_ * p_70186_5_);
    this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70186_1_, p_70186_5_) * 180.0D / Math.PI);
    this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70186_3_, (double)f3) * 180.0D / Math.PI);
    this.ticksInGround = 0;
    }
    
    /**
    * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX,
    * posY, posZ, yaw, pitch
    */
    @SideOnly(Side.CLIENT)
    public void setPositionAndRotation2(double p_70056_1_, double p_70056_3_, double p_70056_5_, float p_70056_7_, float p_70056_8_, int p_70056_9_)
    {
    this.setPosition(p_70056_1_, p_70056_3_, p_70056_5_);
    this.setRotation(p_70056_7_, p_70056_8_);
    }
    
    /**
    * Sets the velocity to the args. Args: x, y, z
    */
    @SideOnly(Side.CLIENT)
    public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_)
    {
    this.motionX = p_70016_1_;
    this.motionY = p_70016_3_;
    this.motionZ = p_70016_5_;
    
    if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F)
    {
    float f = MathHelper.sqrt_double(p_70016_1_ * p_70016_1_ + p_70016_5_ * p_70016_5_);
    this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70016_1_, p_70016_5_) * 180.0D / Math.PI);
    this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70016_3_, (double)f) * 180.0D / Math.PI);
    this.prevRotationPitch = this.rotationPitch;
    this.prevRotationYaw = this.rotationYaw;
    this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
    this.ticksInGround = 0;
    }
    }
    
    /**
    * Called to update the entity's position/logic.
    */
    public void onUpdate()
    {
    super.onUpdate();
    
    if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F)
    {
    float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
    this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI);
    this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f) * 180.0D / Math.PI);
    }
    
    Block block = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f);
    
    if (block.getMaterial() != Material.air)
    {
    block.setBlockBoundsBasedOnState(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f);
    AxisAlignedBB axisalignedbb = block.getCollisionBoundingBoxFromPool(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f);
    
    if (axisalignedbb != null && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ)))
    {
    this.inGround = true;
    }
    }
    
    if (this.arrowShake > 0)
    {
    –this.arrowShake;
    }
    
    if (this.inGround)
    {
    int j = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f);
    
    if (block == this.field_145790_g && j == this.inData)
    {
    ++this.ticksInGround;
    
    if (this.ticksInGround == 1200)
    {
    this.setDead();
    }
    }
    else
    {
    this.inGround = false;
    this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
    this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
    this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
    this.ticksInGround = 0;
    this.ticksInAir = 0;
    }
    }
    else
    {
    ++this.ticksInAir;
    Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
    Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
    MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false);
    vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
    vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
    
    if (movingobjectposition != null)
    {
    vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord);
    }
    
    Entity entity = null;
    List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D));
    double d0 = 0.0D;
    int i;
    float f1;
    
    for (i = 0; i < list.size(); ++i)
    {
    Entity entity1 = (Entity)list.get(i);
    
    if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5))
    {
    f1 = 0.3F;
    AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand((double)f1, (double)f1, (double)f1);
    MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3);
    
    if (movingobjectposition1 != null)
    {
    double d1 = vec31.distanceTo(movingobjectposition1.hitVec);
    
    if (d1 < d0 || d0 == 0.0D)
    {
    entity = entity1;
    d0 = d1;
    }
    }
    }
    }
    
    if (entity != null)
    {
    movingobjectposition = new MovingObjectPosition(entity);
    }
    
    if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer)
    {
    EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit;
    
    if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer))
    {
    movingobjectposition = null;
    }
    }
    
    float f2;
    float f4;
    
    if (movingobjectposition != null)
    {
    if (movingobjectposition.entityHit != null)
    {
    f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
    int k = MathHelper.ceiling_double_int((double)f2 * this.damage);
    
    if (this.getIsCritical())
    {
    k += this.rand.nextInt(k / 2 + 2);
    }
    
    DamageSource damagesource = null;
    
    if (this.shootingEntity == null)
    {
    damagesource = DamageSource.causeThrownDamage(this, this);
    }
    else
    {
    damagesource = DamageSource.causeThrownDamage(this, this.shootingEntity);
    }
    
    if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman))
    {
    movingobjectposition.entityHit.setFire(5);
    }
    
    if (movingobjectposition.entityHit.attackEntityFrom(damagesource, (float)k))
    {
    if (movingobjectposition.entityHit instanceof EntityLivingBase)
    {
    EntityLivingBase entitylivingbase = (EntityLivingBase)movingobjectposition.entityHit;
    
    if (!this.worldObj.isRemote)
    {
    entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1);
    }
    
    if (this.knockbackStrength > 0)
    {
    f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
    
    if (f4 > 0.0F)
    {
    movingobjectposition.entityHit.addVelocity(this.motionX * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4, 0.1D, this.motionZ * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4);
    }
    }
    
    if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase)
    {
    EnchantmentHelper.func_151384_a(entitylivingbase, this.shootingEntity);
    EnchantmentHelper.func_151385_b((EntityLivingBase)this.shootingEntity, entitylivingbase);
    }
    
    if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity && movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP)
    {
    ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(6, 0.0F));
    }
    }
    
    this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
    
    if (!(movingobjectposition.entityHit instanceof EntityEnderman))
    {
    this.setDead();
    }
    }
    else
    {
    this.motionX *= -0.10000000149011612D;
    this.motionY *= -0.10000000149011612D;
    this.motionZ *= -0.10000000149011612D;
    this.rotationYaw += 180.0F;
    this.prevRotationYaw += 180.0F;
    this.ticksInAir = 0;
    }
    }
    else
    {
    this.field_145791_d = movingobjectposition.blockX;
    this.field_145792_e = movingobjectposition.blockY;
    this.field_145789_f = movingobjectposition.blockZ;
    this.field_145790_g = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f);
    this.inData = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f);
    this.motionX = (double)((float)(movingobjectposition.hitVec.xCoord - this.posX));
    this.motionY = (double)((float)(movingobjectposition.hitVec.yCoord - this.posY));
    this.motionZ = (double)((float)(movingobjectposition.hitVec.zCoord - this.posZ));
    f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
    this.posX -= this.motionX / (double)f2 * 0.05000000074505806D;
    this.posY -= this.motionY / (double)f2 * 0.05000000074505806D;
    this.posZ -= this.motionZ / (double)f2 * 0.05000000074505806D;
    this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
    this.inGround = true;
    this.arrowShake = 7;
    this.setIsCritical(false);
    
    if (this.field_145790_g.getMaterial() != Material.air)
    {
    this.field_145790_g.onEntityCollidedWithBlock(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f, this);
    }
    }
    }
    
    if (this.getIsCritical())
    {
    for (i = 0; i < 4; ++i)
    {
    this.worldObj.spawnParticle("crit", this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ);
    }
    }
    
    this.posX += this.motionX;
    this.posY += this.motionY;
    this.posZ += this.motionZ;
    f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
    this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI);
    
    for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f2) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F)
    {
    ;
    }
    
    while (this.rotationPitch - this.prevRotationPitch >= 180.0F)
    {
    this.prevRotationPitch += 360.0F;
    }
    
    while (this.rotationYaw - this.prevRotationYaw < -180.0F)
    {
    this.prevRotationYaw -= 360.0F;
    }
    
    while (this.rotationYaw - this.prevRotationYaw >= 180.0F)
    {
    this.prevRotationYaw += 360.0F;
    }
    
    this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
    this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
    float f3 = 0.99F;
    f1 = 0.05F;
    
    if (this.isInWater())
    {
    for (int l = 0; l < 4; ++l)
    {
    f4 = 0.25F;
    this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)f4, this.posY - this.motionY * (double)f4, this.posZ - this.motionZ * (double)f4, this.motionX, this.motionY, this.motionZ);
    }
    
    f3 = 0.8F;
    }
    
    if (this.isWet())
    {
    this.extinguish();
    }
    
    this.motionX *= (double)f3;
    this.motionY *= (double)f3;
    this.motionZ *= (double)f3;
    this.motionY -= (double)f1;
    this.setPosition(this.posX, this.posY, this.posZ);
    this.func_145775_I();
    }
    }
    
    /**
    * (abstract) Protected helper method to write subclass entity data to NBT.
    */
    public void writeEntityToNBT(NBTTagCompound p_70014_1_)
    {
    p_70014_1_.setShort("xTile", (short)this.field_145791_d);
    p_70014_1_.setShort("yTile", (short)this.field_145792_e);
    p_70014_1_.setShort("zTile", (short)this.field_145789_f);
    p_70014_1_.setShort("life", (short)this.ticksInGround);
    p_70014_1_.setByte("inTile", (byte)Block.getIdFromBlock(this.field_145790_g));
    p_70014_1_.setByte("inData", (byte)this.inData);
    p_70014_1_.setByte("shake", (byte)this.arrowShake);
    p_70014_1_.setByte("inGround", (byte)(this.inGround ? 1 : 0));
    p_70014_1_.setByte("pickup", (byte)this.canBePickedUp);
    p_70014_1_.setDouble("damage", this.damage);
    }
    
    /**
    * (abstract) Protected helper method to read subclass entity data from NBT.
    */
    public void readEntityFromNBT(NBTTagCompound p_70037_1_)
    {
    this.field_145791_d = p_70037_1_.getShort("xTile");
    this.field_145792_e = p_70037_1_.getShort("yTile");
    this.field_145789_f = p_70037_1_.getShort("zTile");
    this.ticksInGround = p_70037_1_.getShort("life");
    this.field_145790_g = Block.getBlockById(p_70037_1_.getByte("inTile") & 255);
    this.inData = p_70037_1_.getByte("inData") & 255;
    this.arrowShake = p_70037_1_.getByte("shake") & 255;
    this.inGround = p_70037_1_.getByte("inGround") == 1;
    
    if (p_70037_1_.hasKey("damage", 99))
    {
    this.damage = p_70037_1_.getDouble("damage");
    }
    
    if (p_70037_1_.hasKey("pickup", 99))
    {
    this.canBePickedUp = p_70037_1_.getByte("pickup");
    }
    else if (p_70037_1_.hasKey("player", 99))
    {
    this.canBePickedUp = p_70037_1_.getBoolean("player") ? 1 : 0;
    }
    }
    
    /**
    * Called by a player entity when they collide with an entity
    */
    public void onCollideWithPlayer(EntityPlayer p_70100_1_)
    {
    if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0)
    {
    boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && p_70100_1_.capabilities.isCreativeMode;
    
    if (this.canBePickedUp == 1 && !p_70100_1_.inventory.addItemStackToInventory(new ItemStack(Items.arrow, 1)))
    {
    flag = false;
    }
    
    if (flag)
    {
    this.playSound("random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
    p_70100_1_.onItemPickup(this, 1);
    this.setDead();
    }
    }
    }
    
    /**
    * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to
    * prevent them from trampling crops
    */
    protected boolean canTriggerWalking()
    {
    return false;
    }
    
    @SideOnly(Side.CLIENT)
    public float getShadowSize()
    {
    return 0.0F;
    }
    
    public void setDamage(double p_70239_1_)
    {
    this.damage = p_70239_1_;
    }
    
    public double getDamage()
    {
    return this.damage;
    }
    
    /**
    * Sets the amount of knockback the arrow applies when it hits a mob.
    */
    public void setKnockbackStrength(int p_70240_1_)
    {
    this.knockbackStrength = p_70240_1_;
    }
    
    /**
    * If returns false, the item will not inflict any damage against entities.
    */
    public boolean canAttackWithItem()
    {
    return false;
    }
    
    /**
    * Whether the arrow has a stream of critical hit particles flying behind it.
    */
    public void setIsCritical(boolean p_70243_1_)
    {
    byte b0 = this.dataWatcher.getWatchableObjectByte(16);
    
    if (p_70243_1_)
    {
    this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 1)));
    }
    else
    {
    this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -2)));
    }
    }
    
    /**
    * Whether the arrow has a stream of critical hit particles flying behind it.
    */
    public boolean getIsCritical()
    {
    byte b0 = this.dataWatcher.getWatchableObjectByte(16);
    return (b0 & 1) != 0;
    }
    }
    

  • Administrateurs

    Remplaces ta fonction onPlayerStoppedUsing par celle ci :

       public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime)
        {
             int j = this.getMaxItemUseDuration(stack) - useTime;
             float f = (float)j / 5.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(world, player, f * 2.0F);
    
             if (f == 1.0F)
             {
                 entityarrow.setIsCritical(true);
             }
    
             world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
    
             player.setCurrentItemOrArmor(0, null);
             player.inventory.markDirty();
    
             if (!world.isRemote)
             {
                 world.spawnEntityInWorld(entityarrow);
             }
        }
    


  • Merci, ça fonctionne parfaitement 🙂
    Maintenant j'ai un problèmes x) Comment je rajoute un model à l'entitée qui est lancé ? (Model déjà exporté)