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