    001package net.minecraft.block;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.util.Random;
    006import net.minecraft.client.renderer.texture.IconRegister;
    007import net.minecraft.world.World;
    008import net.minecraft.world.gen.feature.WorldGenBigMushroom;
    009
    010import net.minecraftforge.common.ForgeDirection;
    011
    012public class BlockMushroom extends BlockFlower
    013{
    014    private final String field_94374_a;
    015
    016    protected BlockMushroom(int par1, String par2Str)
    017    {
    018        super(par1);
    019        this.field_94374_a = par2Str;
    020        float f = 0.2F;
    021        this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.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 (par5Random.nextInt(25) == 0)
    031        {
    032            byte b0 = 4;
    033            int l = 5;
    034            int i1;
    035            int j1;
    036            int k1;
    037
    038            for (i1 = par2 - b0; i1 <= par2 + b0; ++i1)
    039            {
    040                for (j1 = par4 - b0; j1 <= par4 + b0; ++j1)
    041                {
    042                    for (k1 = par3 - 1; k1 <= par3 + 1; ++k1)
    043                    {
    044                        if (par1World.getBlockId(i1, k1, j1) == this.blockID)
    045                        {
    046                            --l;
    047
    048                            if (l <= 0)
    049                            {
    050                                return;
    051                            }
    052                        }
    053                    }
    054                }
    055            }
    056
    057            i1 = par2 + par5Random.nextInt(3) - 1;
    058            j1 = par3 + par5Random.nextInt(2) - par5Random.nextInt(2);
    059            k1 = par4 + par5Random.nextInt(3) - 1;
    060
    061            for (int l1 = 0; l1 < 4; ++l1)
    062            {
    063                if (par1World.isAirBlock(i1, j1, k1) && this.canBlockStay(par1World, i1, j1, k1))
    064                {
    065                    par2 = i1;
    066                    par3 = j1;
    067                    par4 = k1;
    068                }
    069
    070                i1 = par2 + par5Random.nextInt(3) - 1;
    071                j1 = par3 + par5Random.nextInt(2) - par5Random.nextInt(2);
    072                k1 = par4 + par5Random.nextInt(3) - 1;
    073            }
    074
    075            if (par1World.isAirBlock(i1, j1, k1) && this.canBlockStay(par1World, i1, j1, k1))
    076            {
    077                par1World.setBlock(i1, j1, k1, this.blockID);
    078            }
    079        }
    080    }
    081
    082    /**
    083     * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
    084     */
    085    public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
    086    {
    087        return super.canPlaceBlockAt(par1World, par2, par3, par4) && this.canBlockStay(par1World, par2, par3, par4);
    088    }
    089
    090    /**
    091     * Gets passed in the blockID of the block below and supposed to return true if its allowed to grow on the type of
    092     * blockID passed in. Args: blockID
    093     */
    094    protected boolean canThisPlantGrowOnThisBlockID(int par1)
    095    {
    096        return Block.opaqueCubeLookup[par1];
    097    }
    098
    099    /**
    100     * Can this block stay at this position.  Similar to canPlaceBlockAt except gets checked often with plants.
    101     */
    102    public boolean canBlockStay(World par1World, int par2, int par3, int par4)
    103    {
    104        if (par3 >= 0 && par3 < 256)
    105        {
    106            int l = par1World.getBlockId(par2, par3 - 1, par4);
    107            Block soil = Block.blocksList[l];
    108            return (l == Block.mycelium.blockID || par1World.getFullBlockLightValue(par2, par3, par4) < 13) &&
    109                   (soil != null && soil.canSustainPlant(par1World, par2, par3 - 1, par4, ForgeDirection.UP, this));
    110        }
    111        else
    112        {
    113            return false;
    114        }
    115    }
    116
    117    /**
    118     * Fertilize the mushroom.
    119     */
    120    public boolean fertilizeMushroom(World par1World, int par2, int par3, int par4, Random par5Random)
    121    {
    122        int l = par1World.getBlockMetadata(par2, par3, par4);
    123        par1World.setBlockToAir(par2, par3, par4);
    124        WorldGenBigMushroom worldgenbigmushroom = null;
    125
    126        if (this.blockID == Block.mushroomBrown.blockID)
    127        {
    128            worldgenbigmushroom = new WorldGenBigMushroom(0);
    129        }
    130        else if (this.blockID == Block.mushroomRed.blockID)
    131        {
    132            worldgenbigmushroom = new WorldGenBigMushroom(1);
    133        }
    134
    135        if (worldgenbigmushroom != null && worldgenbigmushroom.generate(par1World, par5Random, par2, par3, par4))
    136        {
    137            return true;
    138        }
    139        else
    140        {
    141            par1World.setBlock(par2, par3, par4, this.blockID, l, 3);
    142            return false;
    143        }
    144    }
    145
    146    @SideOnly(Side.CLIENT)
    147
    148    /**
    149     * When this method is called, your block should register all the icons it needs with the given IconRegister. This
    150     * is the only chance you get to register icons.
    151     */
    152    public void registerIcons(IconRegister par1IconRegister)
    153    {
    154        this.blockIcon = par1IconRegister.registerIcon(this.field_94374_a);
    155    }
    156}