I'v been trying to make a stone block with grass on top but I'm having hard time getting the side colors correct; I got the top side but not the sides.
Here is an image showing the problem.
Here is the code for that block.
package net.gnomey.paracelsus.blocks;
import java.util.Random;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.gnomey.paracelsus.ParacelsusTab;
import net.gnomey.paracelsus.Reference;
import net.minecraft.block.Block;
import net.minecraft.block.IGrowable;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.util.IIcon;
import net.minecraft.world.ColorizerGrass;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockStoneGrass extends Block implements IGrowable
{
private static final Logger logger = LogManager.getLogger();
@SideOnly(Side.CLIENT)
private IIcon top;
@SideOnly(Side.CLIENT)
private IIcon bottom;
@SideOnly(Side.CLIENT)
private IIcon side_overlay;
private static final String __OBFID = "CL_00000251";
public BlockStoneGrass()
{
super(Material.rock);
setBlockName("stone_grass");
setCreativeTab(ParacelsusTab.tabParacelsus);
setStepSound(soundTypeStone);
setHardness(0.2F);
setResistance(10.0F);
setHarvestLevel("pickaxe", 0);
}
@SideOnly(Side.CLIENT)
public IIcon getIcon(int p_149691_1_, int p_149691_2_)
{
return p_149691_1_ == 1 ? this.top : (p_149691_1_ == 0 ? Blocks.stone.getBlockTextureFromSide(p_149691_1_) : this.blockIcon);
}
/**
* Ticks the block if it's been scheduled
*/
public void updateTick(World p_149674_1_, int p_149674_2_, int p_149674_3_, int p_149674_4_, Random p_149674_5_)
{
if (!p_149674_1_.isRemote)
{
if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) < 4 && p_149674_1_.getBlockLightOpacity(p_149674_2_, p_149674_3_ + 1, p_149674_4_) > 2)
{
p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, Blocks.dirt);
}
else if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) >= 9)
{
for (int l = 0; l < 4; ++l)
{
int i1 = p_149674_2_ + p_149674_5_.nextInt(3) - 1;
int j1 = p_149674_3_ + p_149674_5_.nextInt(5) - 3;
int k1 = p_149674_4_ + p_149674_5_.nextInt(3) - 1;
Block block = p_149674_1_.getBlock(i1, j1 + 1, k1);
if (p_149674_1_.getBlock(i1, j1, k1) == Blocks.dirt && p_149674_1_.getBlockMetadata(i1, j1, k1) == 0 && p_149674_1_.getBlockLightValue(i1, j1 + 1, k1) >= 4 && p_149674_1_.getBlockLightOpacity(i1, j1 + 1, k1) <= 2)
{
p_149674_1_.setBlock(i1, j1, k1, Blocks.grass);
}
}
}
}
}
public boolean func_149851_a(World p_149851_1_, int p_149851_2_, int p_149851_3_, int p_149851_4_, boolean p_149851_5_)
{
return true;
}
public boolean func_149852_a(World p_149852_1_, Random p_149852_2_, int p_149852_3_, int p_149852_4_, int p_149852_5_)
{
return true;
}
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess p_149673_1_, int p_149673_2_, int p_149673_3_, int p_149673_4_, int p_149673_5_)
{
if (p_149673_5_ == 1)
{
return this.top;
}
else if (p_149673_5_ == 0)
{
return Blocks.stone.getBlockTextureFromSide(p_149673_5_);
}
else
{
Material material = p_149673_1_.getBlock(p_149673_2_, p_149673_3_ + 1, p_149673_4_).getMaterial();
return this.blockIcon;
}
}
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister)
{
this.blockIcon = iconRegister.registerIcon(Reference.MODID + ":" + getUnlocalizedName().substring(5) + "_side");
this.top = iconRegister.registerIcon(Blocks.grass.getUnlocalizedName().substring(5) + "_top");
this.bottom = iconRegister.registerIcon(Blocks.stone.getUnlocalizedName().substring(5));
this.side_overlay = iconRegister.registerIcon(Blocks.grass.getUnlocalizedName().substring(5) + "_side_overlay");
}
@SideOnly(Side.CLIENT)
public int getBlockColor()
{
double d0 = 0.5D;
double d1 = 1.0D;
return ColorizerGrass.getGrassColor(d0, d1);
}
/**
* Returns the color this block should be rendered. Used by leaves.
*/
@SideOnly(Side.CLIENT)
public int getRenderColor(int p_149741_1_)
{
return this.getBlockColor();
}
/**
* Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called
* when first determining what to render.
*/
@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockAccess p_149720_1_, int p_149720_2_, int p_149720_3_, int p_149720_4_)
{
int l = 0;
int i1 = 0;
int j1 = 0;
for (int k1 = -1; k1 <= 1; ++k1)
{
for (int l1 = -1; l1 <= 1; ++l1)
{
int i2 = p_149720_1_.getBiomeGenForCoords(p_149720_2_ + l1, p_149720_4_ + k1).getBiomeGrassColor(p_149720_2_ + l1, p_149720_3_, p_149720_4_ + k1);
l += (i2 & 16711680) >> 16;
i1 += (i2 & 65280) >> 8;
j1 += i2 & 255;
}
}
return (l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255;
}
@SideOnly(Side.CLIENT)
public static IIcon getIconSideOverlay()
{
return ParacelsusBlock.stone_grass.side_overlay;
}
public void func_149853_b(World p_149853_1_, Random p_149853_2_, int p_149853_3_, int p_149853_4_, int p_149853_5_)
{
int l = 0;
while (l < 128)
{
int i1 = p_149853_3_;
int j1 = p_149853_4_ + 1;
int k1 = p_149853_5_;
int l1 = 0;
while (true)
{
if (l1 < l / 16)
{
i1 += p_149853_2_.nextInt(3) - 1;
j1 += (p_149853_2_.nextInt(3) - 1) * p_149853_2_.nextInt(3) / 2;
k1 += p_149853_2_.nextInt(3) - 1;
if (p_149853_1_.getBlock(i1, j1 - 1, k1) == ParacelsusBlock.stone_grass && !p_149853_1_.getBlock(i1, j1, k1).isNormalCube())
{
++l1;
continue;
}
}
else if (p_149853_1_.getBlock(i1, j1, k1).getMaterial() == Material.air)
{
if (p_149853_2_.nextInt(8) != 0)
{
if (Blocks.tallgrass.canBlockStay(p_149853_1_, i1, j1, k1))
{
p_149853_1_.setBlock(i1, j1, k1, Blocks.tallgrass, 1, 3);
}
}
else
{
p_149853_1_.getBiomeGenForCoords(i1, k1).plantFlower(p_149853_1_, p_149853_2_, i1, j1, k1);
}
}
++l;
break;
}
}
}
}
Here is an image showing the problem.
Here is the code for that block.
Remember to watch your back.