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    }