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