001 package net.minecraft.item; 002 003 import net.minecraft.creativetab.CreativeTabs; 004 import net.minecraft.enchantment.Enchantment; 005 import net.minecraft.enchantment.EnchantmentHelper; 006 import net.minecraft.entity.player.EntityPlayer; 007 import net.minecraft.entity.projectile.EntityArrow; 008 import net.minecraft.world.World; 009 010 import net.minecraftforge.common.MinecraftForge; 011 import net.minecraftforge.event.entity.player.ArrowLooseEvent; 012 import net.minecraftforge.event.entity.player.ArrowNockEvent; 013 014 public class ItemBow extends Item 015 { 016 public ItemBow(int par1) 017 { 018 super(par1); 019 this.maxStackSize = 1; 020 this.setMaxDamage(384); 021 this.setCreativeTab(CreativeTabs.tabCombat); 022 } 023 024 /** 025 * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount 026 */ 027 public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4) 028 { 029 int var6 = this.getMaxItemUseDuration(par1ItemStack) - par4; 030 031 ArrowLooseEvent event = new ArrowLooseEvent(par3EntityPlayer, par1ItemStack, var6); 032 MinecraftForge.EVENT_BUS.post(event); 033 if (event.isCanceled()) 034 { 035 return; 036 } 037 var6 = event.charge; 038 039 boolean var5 = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; 040 041 if (var5 || par3EntityPlayer.inventory.hasItem(Item.arrow.itemID)) 042 { 043 float var7 = (float)var6 / 20.0F; 044 var7 = (var7 * var7 + var7 * 2.0F) / 3.0F; 045 046 if ((double)var7 < 0.1D) 047 { 048 return; 049 } 050 051 if (var7 > 1.0F) 052 { 053 var7 = 1.0F; 054 } 055 056 EntityArrow var8 = new EntityArrow(par2World, par3EntityPlayer, var7 * 2.0F); 057 058 if (var7 == 1.0F) 059 { 060 var8.setIsCritical(true); 061 } 062 063 int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, par1ItemStack); 064 065 if (var9 > 0) 066 { 067 var8.setDamage(var8.getDamage() + (double)var9 * 0.5D + 0.5D); 068 } 069 070 int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, par1ItemStack); 071 072 if (var10 > 0) 073 { 074 var8.setKnockbackStrength(var10); 075 } 076 077 if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, par1ItemStack) > 0) 078 { 079 var8.setFire(100); 080 } 081 082 par1ItemStack.damageItem(1, par3EntityPlayer); 083 par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + var7 * 0.5F); 084 085 if (var5) 086 { 087 var8.canBePickedUp = 2; 088 } 089 else 090 { 091 par3EntityPlayer.inventory.consumeInventoryItem(Item.arrow.itemID); 092 } 093 094 if (!par2World.isRemote) 095 { 096 par2World.spawnEntityInWorld(var8); 097 } 098 } 099 } 100 101 public ItemStack onFoodEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) 102 { 103 return par1ItemStack; 104 } 105 106 /** 107 * How long it takes to use or consume an item 108 */ 109 public int getMaxItemUseDuration(ItemStack par1ItemStack) 110 { 111 return 72000; 112 } 113 114 /** 115 * returns the action that specifies what animation to play when the items is being used 116 */ 117 public EnumAction getItemUseAction(ItemStack par1ItemStack) 118 { 119 return EnumAction.bow; 120 } 121 122 /** 123 * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer 124 */ 125 public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) 126 { 127 ArrowNockEvent event = new ArrowNockEvent(par3EntityPlayer, par1ItemStack); 128 MinecraftForge.EVENT_BUS.post(event); 129 if (event.isCanceled()) 130 { 131 return event.result; 132 } 133 134 if (par3EntityPlayer.capabilities.isCreativeMode || par3EntityPlayer.inventory.hasItem(Item.arrow.itemID)) 135 { 136 par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); 137 } 138 139 return par1ItemStack; 140 } 141 142 /** 143 * Return the enchantability factor of the item, most of the time is based on material. 144 */ 145 public int getItemEnchantability() 146 { 147 return 1; 148 } 149 }