    001package net.minecraft.block;
    002
    003import java.util.Random;
    004import net.minecraft.block.material.Material;
    005import net.minecraft.creativetab.CreativeTabs;
    006import net.minecraft.util.AxisAlignedBB;
    007import net.minecraft.world.World;
    008
    009import net.minecraftforge.common.EnumPlantType;
    010import net.minecraftforge.common.ForgeDirection;
    011import net.minecraftforge.common.IPlantable;
    012import static net.minecraftforge.common.EnumPlantType.*;
    013
    014public class BlockFlower extends Block implements IPlantable
    015{
    016    protected BlockFlower(int par1, int par2, Material par3Material)
    017    {
    018        super(par1, par3Material);
    019        this.blockIndexInTexture = par2;
    020        this.setTickRandomly(true);
    021        float var4 = 0.2F;
    022        this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var4 * 3.0F, 0.5F + var4);
    023        this.setCreativeTab(CreativeTabs.tabDecorations);
    024    }
    025
    026    protected BlockFlower(int par1, int par2)
    027    {
    028        this(par1, par2, Material.plants);
    029    }
    030
    031    /**
    032     * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
    033     */
    034    public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
    035    {
    036        return super.canPlaceBlockAt(par1World, par2, par3, par4) && canBlockStay(par1World, par2, par3, par4);
    037    }
    038
    039    /**
    040     * Gets passed in the blockID of the block below and supposed to return true if its allowed to grow on the type of
    041     * blockID passed in. Args: blockID
    042     */
    043    protected boolean canThisPlantGrowOnThisBlockID(int par1)
    044    {
    045        return par1 == Block.grass.blockID || par1 == Block.dirt.blockID || par1 == Block.tilledField.blockID;
    046    }
    047
    048    /**
    049     * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
    050     * their own) Args: x, y, z, neighbor blockID
    051     */
    052    public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
    053    {
    054        super.onNeighborBlockChange(par1World, par2, par3, par4, par5);
    055        this.checkFlowerChange(par1World, par2, par3, par4);
    056    }
    057
    058    /**
    059     * Ticks the block if it's been scheduled
    060     */
    061    public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
    062    {
    063        this.checkFlowerChange(par1World, par2, par3, par4);
    064    }
    065
    066    protected final void checkFlowerChange(World par1World, int par2, int par3, int par4)
    067    {
    068        if (!this.canBlockStay(par1World, par2, par3, par4))
    069        {
    070            this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
    071            par1World.setBlockWithNotify(par2, par3, par4, 0);
    072        }
    073    }
    074
    075    /**
    076     * Can this block stay at this position.  Similar to canPlaceBlockAt except gets checked often with plants.
    077     */
    078    public boolean canBlockStay(World par1World, int par2, int par3, int par4)
    079    {
    080        Block soil = blocksList[par1World.getBlockId(par2, par3 - 1, par4)];
    081        return (par1World.getFullBlockLightValue(par2, par3, par4) >= 8 || par1World.canBlockSeeTheSky(par2, par3, par4)) &&
    082                (soil != null && soil.canSustainPlant(par1World, par2, par3 - 1, par4, ForgeDirection.UP, this));
    083    }
    084
    085    /**
    086     * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
    087     * cleared to be reused)
    088     */
    089    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    090    {
    091        return null;
    092    }
    093
    094    /**
    095     * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
    096     * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
    097     */
    098    public boolean isOpaqueCube()
    099    {
    100        return false;
    101    }
    102
    103    /**
    104     * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
    105     */
    106    public boolean renderAsNormalBlock()
    107    {
    108        return false;
    109    }
    110
    111    /**
    112     * The type of render function that is called for this block
    113     */
    114    public int getRenderType()
    115    {
    116        return 1;
    117    }
    118
    119    @Override
    120    public EnumPlantType getPlantType(World world, int x, int y, int z)
    121    {
    122        if (blockID == crops.blockID        ) return Crop;
    123        if (blockID == deadBush.blockID     ) return Desert;
    124        if (blockID == waterlily.blockID    ) return Water;
    125        if (blockID == mushroomRed.blockID  ) return Cave;
    126        if (blockID == mushroomBrown.blockID) return Cave;
    127        if (blockID == netherStalk.blockID  ) return Nether;
    128        if (blockID == sapling.blockID      ) return Plains;
    129        if (blockID == melonStem.blockID    ) return Crop;
    130        if (blockID == pumpkinStem.blockID  ) return Crop;
    131        if (blockID == tallGrass.blockID    ) return Plains;
    132        return Plains;
    133    }
    134
    135    @Override
    136    public int getPlantID(World world, int x, int y, int z)
    137    {
    138        return blockID;
    139    }
    140
    141    @Override
    142    public int getPlantMetadata(World world, int x, int y, int z)
    143    {
    144        return world.getBlockMetadata(x, y, z);
    145    }
    146}