Jump to content

Spawning a damaged item into the world


Glorfindel22

Recommended Posts

Okay I am trying to add a spear to minecraft. I have finished the ItemSpear class and I am now stuck on the EntitySpear class. I have the entities working right. Basically when I pull the spear back (like a bow) it fires the spear entity and I want spear on impact to spawn a new spear item that is slightly damaged. However, when I try to spawn items in the world if I use the "damageItem" method I get a ticking entity error. So I commented that code out just for testing and now it spawns two spears on the ground instead of only one. Can anyone help me with this?

 

All the code that is causing me trouble is in the "onImpact" method under the EntitySpear class.

 

ItemSpear.java

//Removed Package Name to save space (it is in the actual file)
//Removed imports here to save space (they are in the actual file)

public class ItemSpear extends Item {

    public static final String[] bowPullIconNameArray = new String[] {"-p_0", "-p_1", "-p_2"};
    @SideOnly(Side.CLIENT)
    private Icon[] iconArray;

    public int durabilityValue;
    
    public ItemSpear(int par1, int durab)
    {
        super(par1);
        this.maxStackSize = 1;
        this.setMaxDamage(384);
        this.setCreativeTab(CreativeTabs.tabCombat);
        
        //Store Durability Value
        this.durabilityValue = durab;

        
    }
    
    
    public int getMaxItemUseDuration(ItemStack par1ItemStack)
    {
        return 72000;
    }
    
    public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    {
        return par1ItemStack;
    }
    
    /**
     * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
     */
    public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    {
            
    	par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack));

        return par1ItemStack;
    }
    

    @SideOnly(Side.CLIENT)
    public void registerIcons(IconRegister par1IconRegister)
    {
        this.itemIcon = par1IconRegister.registerIcon("recipexpack:spear");
        this.iconArray = new Icon[bowPullIconNameArray.length];

        for (int i = 0; i < this.iconArray.length; ++i)
        {
            this.iconArray[i] = par1IconRegister.registerIcon("recipexpack:spear" + bowPullIconNameArray[i]);
        }
    }
    
    public Icon getItemIconForUseDuration(int par1)
    {
        return this.iconArray[par1];
    }
    
    /**
     * returns the action that specifies what animation to play when the items is being used
     */
    public EnumAction getItemUseAction(ItemStack par1ItemStack)
    {
        return EnumAction.bow;
    }
    
    public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4)
    {

    	
    	if (!par2World.isRemote)
    	{
    		
    	EntitySpear spear = new EntitySpear(par2World, par3EntityPlayer);
    	spear.setDurability(par1ItemStack.getItemDamage() - 1);
    	par2World.spawnEntityInWorld(spear);
    	}
    	
    	par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 2F, 1.6F / (itemRand.nextFloat() * 0.4F + 0.8F));
    	
    	//Remove item from player's inventory
    	
    }

}

 

EntitySpear.java

//Removed Package Name to save space (it is in the actual file)
//Removed imports here to save space (they are in the actual file)

public class EntitySpear extends EntityThrowable
{

public int spearDurability;
private boolean hasImpacted = false;

    public EntitySpear(World par1World)
    {
        super(par1World);
       
    }

    public EntitySpear(World par1World, EntityLivingBase par2EntityLivingBase)
    {
        super(par1World, par2EntityLivingBase);

    }

    public EntitySpear(World par1World, double par2, double par4, double par6)
    {
        super(par1World, par2, par4, par6);

    }

    
    /**
     *  Sets the durability of the spear
     */
    public void setDurability(int durab) {
    	
    	this.spearDurability = durab;
    	
    }
    
    /**
     * Called when this EntityThrowable hits a block or entity.
     */
    protected void onImpact(MovingObjectPosition par1MovingObjectPosition)
    {
        if (par1MovingObjectPosition.entityHit != null)
        {
            par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeArrowDamage(new EntityArrow(worldObj), this.getThrower()), 20.0F);
        }

        for (int j = 0; j < 8; ++j)
        {
            //this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
        }

        if (!this.worldObj.isRemote)
        {
            this.setDead();
        }
        
        if(!hasImpacted) {
        	//Spawn new damaged spear in world
        	ItemStack newSpear = new ItemStack(RecipeExpansionPack.spearIron);
        	//newSpear.damageItem(384 - (spearDurability - 1), this.getThrower());
        
        	Entity entity = new EntityItem(worldObj, par1MovingObjectPosition.blockX, par1MovingObjectPosition.blockY, par1MovingObjectPosition.blockZ, newSpear);
        	worldObj.spawnEntityInWorld(entity);
        	hasImpacted = true;
        }
    }
}

Creator of the Recipe Expansion Pack mod.

http://www.minecraftforum.net/topic/1983421-172-forge-recipe-expansion-pack-version-012/

Updated to 1.7.2!

Link to comment
Share on other sites

umm, i am terrible with actual entities xD gotolink may be more helpful than me. there are only two ways i can think to do this is to delete the spear entity on impact after you have done anything you need to the spawning a new spear item entity that is damaged. this way would kind of ruin the effect because when the spear hits, instead of sticking in the ground it will pop up into an item entity and if it hits a mob then it will spawn the spear at them ( and then there is the possibility of them picking it up :o)

 

the other way would be to somehow dmg it in the onrightclick method in your item class but i have no idea how that would be affected by the entity or if the dmg would stay with the entity so when you pick it up its still damaged, if you think either of these are good ideas let me know and i will test them then give you a hand

 

...

 

why is your spear edible???

O.o

 

public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    {
        return par1ItemStack;
    }

Use examples, i have aspergers.

Examples make sense to me.

Link to comment
Share on other sites

if (!this.worldObj.isRemote)
        {
            this.setDead();
        
        if(!hasImpacted) {
        	//Spawn new damaged spear in world
        	ItemStack newSpear = new ItemStack(RecipeExpansionPack.spearIron,1,spearDurability);
        	//newSpear.damageItem(384 - (spearDurability - 1), this.getThrower());
        
        	Entity entity = new EntityItem(worldObj, par1MovingObjectPosition.blockX, par1MovingObjectPosition.blockY, par1MovingObjectPosition.blockZ, newSpear);
        	worldObj.spawnEntityInWorld(entity);
        	hasImpacted = true;
        }
}

Would be better.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.