    001    package net.minecraft.block;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.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.shiftedIndex;
    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.shiftedIndex;
    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    }