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.client.renderer.texture.IconRegister;
008import net.minecraft.creativetab.CreativeTabs;
009import net.minecraft.util.Icon;
010import net.minecraft.world.ColorizerGrass;
011import net.minecraft.world.IBlockAccess;
012import net.minecraft.world.World;
013
014public class BlockGrass extends Block
015{
016    @SideOnly(Side.CLIENT)
017    private Icon field_94437_a;
018    @SideOnly(Side.CLIENT)
019    private Icon field_94435_b;
020    @SideOnly(Side.CLIENT)
021    private Icon field_94436_c;
022
023    protected BlockGrass(int par1)
024    {
025        super(par1, Material.grass);
026        this.setTickRandomly(true);
027        this.setCreativeTab(CreativeTabs.tabBlock);
028    }
029
030    @SideOnly(Side.CLIENT)
031
032    /**
033     * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
034     */
035    public Icon getBlockTextureFromSideAndMetadata(int par1, int par2)
036    {
037        return par1 == 1 ? this.field_94437_a : (par1 == 0 ? Block.dirt.getBlockTextureFromSide(par1) : this.field_94336_cN);
038    }
039
040    /**
041     * Ticks the block if it's been scheduled
042     */
043    public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
044    {
045        if (!par1World.isRemote)
046        {
047            if (par1World.getBlockLightValue(par2, par3 + 1, par4) < 4 && par1World.getBlockLightOpacity(par2, par3 + 1, par4) > 2)
048            {
049                par1World.func_94575_c(par2, par3, par4, Block.dirt.blockID);
050            }
051            else if (par1World.getBlockLightValue(par2, par3 + 1, par4) >= 9)
052            {
053                for (int l = 0; l < 4; ++l)
054                {
055                    int i1 = par2 + par5Random.nextInt(3) - 1;
056                    int j1 = par3 + par5Random.nextInt(5) - 3;
057                    int k1 = par4 + par5Random.nextInt(3) - 1;
058                    int l1 = par1World.getBlockId(i1, j1 + 1, k1);
059
060                    if (par1World.getBlockId(i1, j1, k1) == Block.dirt.blockID && par1World.getBlockLightValue(i1, j1 + 1, k1) >= 4 && par1World.getBlockLightOpacity(i1, j1 + 1, k1) <= 2)
061                    {
062                        par1World.func_94575_c(i1, j1, k1, Block.grass.blockID);
063                    }
064                }
065            }
066        }
067    }
068
069    /**
070     * Returns the ID of the items to drop on destruction.
071     */
072    public int idDropped(int par1, Random par2Random, int par3)
073    {
074        return Block.dirt.idDropped(0, par2Random, par3);
075    }
076
077    @SideOnly(Side.CLIENT)
078
079    /**
080     * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side
081     */
082    public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
083    {
084        if (par5 == 1)
085        {
086            return this.field_94437_a;
087        }
088        else if (par5 == 0)
089        {
090            return Block.dirt.getBlockTextureFromSide(par5);
091        }
092        else
093        {
094            Material material = par1IBlockAccess.getBlockMaterial(par2, par3 + 1, par4);
095            return material != Material.snow && material != Material.craftedSnow ? this.field_94336_cN : this.field_94435_b;
096        }
097    }
098
099    @SideOnly(Side.CLIENT)
100    public void func_94332_a(IconRegister par1IconRegister)
101    {
102        this.field_94336_cN = par1IconRegister.func_94245_a("grass_side");
103        this.field_94437_a = par1IconRegister.func_94245_a("grass_top");
104        this.field_94435_b = par1IconRegister.func_94245_a("snow_side");
105        this.field_94436_c = par1IconRegister.func_94245_a("grass_side_overlay");
106    }
107
108    @SideOnly(Side.CLIENT)
109    public int getBlockColor()
110    {
111        double d0 = 0.5D;
112        double d1 = 1.0D;
113        return ColorizerGrass.getGrassColor(d0, d1);
114    }
115
116    @SideOnly(Side.CLIENT)
117
118    /**
119     * Returns the color this block should be rendered. Used by leaves.
120     */
121    public int getRenderColor(int par1)
122    {
123        return this.getBlockColor();
124    }
125
126    @SideOnly(Side.CLIENT)
127
128    /**
129     * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called
130     * when first determining what to render.
131     */
132    public int colorMultiplier(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
133    {
134        int l = 0;
135        int i1 = 0;
136        int j1 = 0;
137
138        for (int k1 = -1; k1 <= 1; ++k1)
139        {
140            for (int l1 = -1; l1 <= 1; ++l1)
141            {
142                int i2 = par1IBlockAccess.getBiomeGenForCoords(par2 + l1, par4 + k1).getBiomeGrassColor();
143                l += (i2 & 16711680) >> 16;
144                i1 += (i2 & 65280) >> 8;
145                j1 += i2 & 255;
146            }
147        }
148
149        return (l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255;
150    }
151
152    @SideOnly(Side.CLIENT)
153    public static Icon func_94434_o()
154    {
155        return Block.grass.field_94436_c;
156    }
157}