001package net.minecraft.item; 002 003import net.minecraft.block.Block; 004import net.minecraft.block.BlockEndPortalFrame; 005import net.minecraft.creativetab.CreativeTabs; 006import net.minecraft.entity.item.EntityEnderEye; 007import net.minecraft.entity.player.EntityPlayer; 008import net.minecraft.util.Direction; 009import net.minecraft.util.EnumMovingObjectType; 010import net.minecraft.util.MovingObjectPosition; 011import net.minecraft.world.ChunkPosition; 012import net.minecraft.world.World; 013 014public 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 i1 = par3World.getBlockId(par4, par5, par6); 029 int j1 = par3World.getBlockMetadata(par4, par5, par6); 030 031 if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && i1 == Block.endPortalFrame.blockID && !BlockEndPortalFrame.isEnderEyeInserted(j1)) 032 { 033 if (par3World.isRemote) 034 { 035 return true; 036 } 037 else 038 { 039 par3World.setBlockMetadataWithNotify(par4, par5, par6, j1 + 4, 2); 040 --par1ItemStack.stackSize; 041 int k1; 042 043 for (k1 = 0; k1 < 16; ++k1) 044 { 045 double d0 = (double)((float)par4 + (5.0F + itemRand.nextFloat() * 6.0F) / 16.0F); 046 double d1 = (double)((float)par5 + 0.8125F); 047 double d2 = (double)((float)par6 + (5.0F + itemRand.nextFloat() * 6.0F) / 16.0F); 048 double d3 = 0.0D; 049 double d4 = 0.0D; 050 double d5 = 0.0D; 051 par3World.spawnParticle("smoke", d0, d1, d2, d3, d4, d5); 052 } 053 054 k1 = j1 & 3; 055 int l1 = 0; 056 int i2 = 0; 057 boolean flag = false; 058 boolean flag1 = true; 059 int j2 = Direction.enderEyeMetaToDirection[k1]; 060 int k2; 061 int l2; 062 int i3; 063 int j3; 064 int k3; 065 066 for (k2 = -2; k2 <= 2; ++k2) 067 { 068 j3 = par4 + Direction.offsetX[j2] * k2; 069 l2 = par6 + Direction.offsetZ[j2] * k2; 070 k3 = par3World.getBlockId(j3, par5, l2); 071 072 if (k3 == Block.endPortalFrame.blockID) 073 { 074 i3 = par3World.getBlockMetadata(j3, par5, l2); 075 076 if (!BlockEndPortalFrame.isEnderEyeInserted(i3)) 077 { 078 flag1 = false; 079 break; 080 } 081 082 i2 = k2; 083 084 if (!flag) 085 { 086 l1 = k2; 087 flag = true; 088 } 089 } 090 } 091 092 if (flag1 && i2 == l1 + 2) 093 { 094 for (k2 = l1; k2 <= i2; ++k2) 095 { 096 j3 = par4 + Direction.offsetX[j2] * k2; 097 l2 = par6 + Direction.offsetZ[j2] * k2; 098 j3 += Direction.offsetX[k1] * 4; 099 l2 += Direction.offsetZ[k1] * 4; 100 k3 = par3World.getBlockId(j3, par5, l2); 101 i3 = par3World.getBlockMetadata(j3, par5, l2); 102 103 if (k3 != Block.endPortalFrame.blockID || !BlockEndPortalFrame.isEnderEyeInserted(i3)) 104 { 105 flag1 = false; 106 break; 107 } 108 } 109 110 for (k2 = l1 - 1; k2 <= i2 + 1; k2 += 4) 111 { 112 for (j3 = 1; j3 <= 3; ++j3) 113 { 114 l2 = par4 + Direction.offsetX[j2] * k2; 115 k3 = par6 + Direction.offsetZ[j2] * k2; 116 l2 += Direction.offsetX[k1] * j3; 117 k3 += Direction.offsetZ[k1] * j3; 118 i3 = par3World.getBlockId(l2, par5, k3); 119 int l3 = par3World.getBlockMetadata(l2, par5, k3); 120 121 if (i3 != Block.endPortalFrame.blockID || !BlockEndPortalFrame.isEnderEyeInserted(l3)) 122 { 123 flag1 = false; 124 break; 125 } 126 } 127 } 128 129 if (flag1) 130 { 131 for (k2 = l1; k2 <= i2; ++k2) 132 { 133 for (j3 = 1; j3 <= 3; ++j3) 134 { 135 l2 = par4 + Direction.offsetX[j2] * k2; 136 k3 = par6 + Direction.offsetZ[j2] * k2; 137 l2 += Direction.offsetX[k1] * j3; 138 k3 += Direction.offsetZ[k1] * j3; 139 par3World.setBlockAndMetadataWithNotify(l2, par5, k3, Block.endPortal.blockID, 0, 2); 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 movingobjectposition = this.getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, false); 160 161 if (movingobjectposition != null && movingobjectposition.typeOfHit == EnumMovingObjectType.TILE) 162 { 163 int i = par2World.getBlockId(movingobjectposition.blockX, movingobjectposition.blockY, movingobjectposition.blockZ); 164 165 if (i == Block.endPortalFrame.blockID) 166 { 167 return par1ItemStack; 168 } 169 } 170 171 if (!par2World.isRemote) 172 { 173 ChunkPosition chunkposition = par2World.findClosestStructure("Stronghold", (int)par3EntityPlayer.posX, (int)par3EntityPlayer.posY, (int)par3EntityPlayer.posZ); 174 175 if (chunkposition != null) 176 { 177 EntityEnderEye entityendereye = new EntityEnderEye(par2World, par3EntityPlayer.posX, par3EntityPlayer.posY + 1.62D - (double)par3EntityPlayer.yOffset, par3EntityPlayer.posZ); 178 entityendereye.moveTowards((double)chunkposition.x, chunkposition.y, (double)chunkposition.z); 179 par2World.spawnEntityInWorld(entityendereye); 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}