001 package net.minecraft.item;
002
003 import net.minecraft.block.Block;
004 import net.minecraft.block.BlockEndPortalFrame;
005 import net.minecraft.creativetab.CreativeTabs;
006 import net.minecraft.entity.item.EntityEnderEye;
007 import net.minecraft.entity.player.EntityPlayer;
008 import net.minecraft.util.Direction;
009 import net.minecraft.util.EnumMovingObjectType;
010 import net.minecraft.util.MovingObjectPosition;
011 import net.minecraft.world.ChunkPosition;
012 import net.minecraft.world.World;
013
014 public class ItemEnderEye extends Item
015 {
016 public ItemEnderEye(int par1)
017 {
018 super(par1);
019 this.setCreativeTab(CreativeTabs.tabMisc);
020 }
021
022 /**
023 * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
024 * True if something happen and false if it don't. This is for ITEMS, not BLOCKS
025 */
026 public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
027 {
028 int var11 = par3World.getBlockId(par4, par5, par6);
029 int var12 = par3World.getBlockMetadata(par4, par5, par6);
030
031 if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && var11 == Block.endPortalFrame.blockID && !BlockEndPortalFrame.isEnderEyeInserted(var12))
032 {
033 if (par3World.isRemote)
034 {
035 return true;
036 }
037 else
038 {
039 par3World.setBlockMetadataWithNotify(par4, par5, par6, var12 + 4);
040 --par1ItemStack.stackSize;
041 int var13;
042
043 for (var13 = 0; var13 < 16; ++var13)
044 {
045 double var14 = (double)((float)par4 + (5.0F + itemRand.nextFloat() * 6.0F) / 16.0F);
046 double var16 = (double)((float)par5 + 0.8125F);
047 double var18 = (double)((float)par6 + (5.0F + itemRand.nextFloat() * 6.0F) / 16.0F);
048 double var20 = 0.0D;
049 double var22 = 0.0D;
050 double var24 = 0.0D;
051 par3World.spawnParticle("smoke", var14, var16, var18, var20, var22, var24);
052 }
053
054 var13 = var12 & 3;
055 int var26 = 0;
056 int var15 = 0;
057 boolean var27 = false;
058 boolean var17 = true;
059 int var28 = Direction.enderEyeMetaToDirection[var13];
060 int var19;
061 int var21;
062 int var23;
063 int var29;
064 int var30;
065
066 for (var19 = -2; var19 <= 2; ++var19)
067 {
068 var29 = par4 + Direction.offsetX[var28] * var19;
069 var21 = par6 + Direction.offsetZ[var28] * var19;
070 var30 = par3World.getBlockId(var29, par5, var21);
071
072 if (var30 == Block.endPortalFrame.blockID)
073 {
074 var23 = par3World.getBlockMetadata(var29, par5, var21);
075
076 if (!BlockEndPortalFrame.isEnderEyeInserted(var23))
077 {
078 var17 = false;
079 break;
080 }
081
082 var15 = var19;
083
084 if (!var27)
085 {
086 var26 = var19;
087 var27 = true;
088 }
089 }
090 }
091
092 if (var17 && var15 == var26 + 2)
093 {
094 for (var19 = var26; var19 <= var15; ++var19)
095 {
096 var29 = par4 + Direction.offsetX[var28] * var19;
097 var21 = par6 + Direction.offsetZ[var28] * var19;
098 var29 += Direction.offsetX[var13] * 4;
099 var21 += Direction.offsetZ[var13] * 4;
100 var30 = par3World.getBlockId(var29, par5, var21);
101 var23 = par3World.getBlockMetadata(var29, par5, var21);
102
103 if (var30 != Block.endPortalFrame.blockID || !BlockEndPortalFrame.isEnderEyeInserted(var23))
104 {
105 var17 = false;
106 break;
107 }
108 }
109
110 for (var19 = var26 - 1; var19 <= var15 + 1; var19 += 4)
111 {
112 for (var29 = 1; var29 <= 3; ++var29)
113 {
114 var21 = par4 + Direction.offsetX[var28] * var19;
115 var30 = par6 + Direction.offsetZ[var28] * var19;
116 var21 += Direction.offsetX[var13] * var29;
117 var30 += Direction.offsetZ[var13] * var29;
118 var23 = par3World.getBlockId(var21, par5, var30);
119 int var31 = par3World.getBlockMetadata(var21, par5, var30);
120
121 if (var23 != Block.endPortalFrame.blockID || !BlockEndPortalFrame.isEnderEyeInserted(var31))
122 {
123 var17 = false;
124 break;
125 }
126 }
127 }
128
129 if (var17)
130 {
131 for (var19 = var26; var19 <= var15; ++var19)
132 {
133 for (var29 = 1; var29 <= 3; ++var29)
134 {
135 var21 = par4 + Direction.offsetX[var28] * var19;
136 var30 = par6 + Direction.offsetZ[var28] * var19;
137 var21 += Direction.offsetX[var13] * var29;
138 var30 += Direction.offsetZ[var13] * var29;
139 par3World.setBlockWithNotify(var21, par5, var30, Block.endPortal.blockID);
140 }
141 }
142 }
143 }
144
145 return true;
146 }
147 }
148 else
149 {
150 return false;
151 }
152 }
153
154 /**
155 * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
156 */
157 public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
158 {
159 MovingObjectPosition var4 = this.getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, false);
160
161 if (var4 != null && var4.typeOfHit == EnumMovingObjectType.TILE)
162 {
163 int var5 = par2World.getBlockId(var4.blockX, var4.blockY, var4.blockZ);
164
165 if (var5 == Block.endPortalFrame.blockID)
166 {
167 return par1ItemStack;
168 }
169 }
170
171 if (!par2World.isRemote)
172 {
173 ChunkPosition var7 = par2World.findClosestStructure("Stronghold", (int)par3EntityPlayer.posX, (int)par3EntityPlayer.posY, (int)par3EntityPlayer.posZ);
174
175 if (var7 != null)
176 {
177 EntityEnderEye var6 = new EntityEnderEye(par2World, par3EntityPlayer.posX, par3EntityPlayer.posY + 1.62D - (double)par3EntityPlayer.yOffset, par3EntityPlayer.posZ);
178 var6.moveTowards((double)var7.x, var7.y, (double)var7.z);
179 par2World.spawnEntityInWorld(var6);
180 par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
181 par2World.playAuxSFXAtEntity((EntityPlayer)null, 1002, (int)par3EntityPlayer.posX, (int)par3EntityPlayer.posY, (int)par3EntityPlayer.posZ, 0);
182
183 if (!par3EntityPlayer.capabilities.isCreativeMode)
184 {
185 --par1ItemStack.stackSize;
186 }
187 }
188 }
189
190 return par1ItemStack;
191 }
192 }