001 package net.minecraft.src;
002
003 import cpw.mods.fml.common.Side;
004 import cpw.mods.fml.common.asm.SideOnly;
005 import java.util.Random;
006
007 import net.minecraftforge.common.EnumPlantType;
008 import net.minecraftforge.common.IPlantable;
009
010 public class BlockReed extends Block implements IPlantable
011 {
012 protected BlockReed(int par1, int par2)
013 {
014 super(par1, Material.plants);
015 this.blockIndexInTexture = par2;
016 float var3 = 0.375F;
017 this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 1.0F, 0.5F + var3);
018 this.setTickRandomly(true);
019 }
020
021 /**
022 * Ticks the block if it's been scheduled
023 */
024 public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
025 {
026 if (par1World.isAirBlock(par2, par3 + 1, par4))
027 {
028 int var6;
029
030 for (var6 = 1; par1World.getBlockId(par2, par3 - var6, par4) == this.blockID; ++var6)
031 {
032 ;
033 }
034
035 if (var6 < 3)
036 {
037 int var7 = par1World.getBlockMetadata(par2, par3, par4);
038
039 if (var7 == 15)
040 {
041 par1World.setBlockWithNotify(par2, par3 + 1, par4, this.blockID);
042 par1World.setBlockMetadataWithNotify(par2, par3, par4, 0);
043 }
044 else
045 {
046 par1World.setBlockMetadataWithNotify(par2, par3, par4, var7 + 1);
047 }
048 }
049 }
050 }
051
052 /**
053 * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
054 */
055 public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
056 {
057 int var5 = par1World.getBlockId(par2, par3 - 1, par4);
058 return var5 == this.blockID ? true : (var5 != Block.grass.blockID && var5 != Block.dirt.blockID && var5 != Block.sand.blockID ? false : (par1World.getBlockMaterial(par2 - 1, par3 - 1, par4) == Material.water ? true : (par1World.getBlockMaterial(par2 + 1, par3 - 1, par4) == Material.water ? true : (par1World.getBlockMaterial(par2, par3 - 1, par4 - 1) == Material.water ? true : par1World.getBlockMaterial(par2, par3 - 1, par4 + 1) == Material.water))));
059 }
060
061 /**
062 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
063 * their own) Args: x, y, z, neighbor blockID
064 */
065 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
066 {
067 this.checkBlockCoordValid(par1World, par2, par3, par4);
068 }
069
070 /**
071 * Checks if current block pos is valid, if not, breaks the block as dropable item. Used for reed and cactus.
072 */
073 protected final void checkBlockCoordValid(World par1World, int par2, int par3, int par4)
074 {
075 if (!this.canBlockStay(par1World, par2, par3, par4))
076 {
077 this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
078 par1World.setBlockWithNotify(par2, par3, par4, 0);
079 }
080 }
081
082 /**
083 * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants.
084 */
085 public boolean canBlockStay(World par1World, int par2, int par3, int par4)
086 {
087 return this.canPlaceBlockAt(par1World, par2, par3, par4);
088 }
089
090 /**
091 * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
092 * cleared to be reused)
093 */
094 public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
095 {
096 return null;
097 }
098
099 /**
100 * Returns the ID of the items to drop on destruction.
101 */
102 public int idDropped(int par1, Random par2Random, int par3)
103 {
104 return Item.reed.shiftedIndex;
105 }
106
107 /**
108 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two
109 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
110 */
111 public boolean isOpaqueCube()
112 {
113 return false;
114 }
115
116 /**
117 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
118 */
119 public boolean renderAsNormalBlock()
120 {
121 return false;
122 }
123
124 /**
125 * The type of render function that is called for this block
126 */
127 public int getRenderType()
128 {
129 return 1;
130 }
131
132 @SideOnly(Side.CLIENT)
133
134 /**
135 * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
136 */
137 public int idPicked(World par1World, int par2, int par3, int par4)
138 {
139 return Item.reed.shiftedIndex;
140 }
141
142 @Override
143 public EnumPlantType getPlantType(World world, int x, int y, int z)
144 {
145 return EnumPlantType.Beach;
146 }
147
148 @Override
149 public int getPlantID(World world, int x, int y, int z)
150 {
151 return blockID;
152 }
153
154 @Override
155 public int getPlantMetadata(World world, int x, int y, int z)
156 {
157 return world.getBlockMetadata(x, y, z);
158 }
159 }