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