package com.carpentersblocks.renderer;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import com.carpentersblocks.data.Gate;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class BlockHandlerCarpentersGate extends BlockHandlerBase implements ISimpleBlockRenderingHandler {
private boolean[] gate;
private ForgeDirection dir;
private boolean isOpen;
private int type;
private static final int YN = 0;
private static final int YP = 1;
@Override
public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderBlocks)
{
renderBlocks.setRenderBounds(0.0D, 0.3125D, 0.4375D, 0.125D, 1.0D, 0.5625D);
super.renderInventoryBlock(block, metadata, modelID, renderBlocks);
renderBlocks.setRenderBounds(0.875D, 0.3125D, 0.4375D, 1.0D, 1.0D, 0.5625D);
super.renderInventoryBlock(block, metadata, modelID, renderBlocks);
renderBlocks.setRenderBounds(0.125D, 0.5D, 0.4375D, 0.875D, 0.9375D, 0.5625D);
super.renderInventoryBlock(block, metadata, modelID, renderBlocks);
}
@Override
/**
* Renders gate
*/
protected void renderCarpentersBlock(int x, int y, int z)
{
renderBlocks.renderAllFaces = true;
setParams(x, y, z);
ItemStack itemStack = getCoverForRendering();
switch (type) {
case Gate.TYPE_PICKET:
renderTypePicket(itemStack, x, y, z);
break;
case Gate.TYPE_SHADOWBOX:
renderTypeShadowbox(itemStack, x, y, z);
break;
case Gate.TYPE_WALL:
renderTypeWall(itemStack, x, y, z);
break;
default:
renderTypeVanilla(itemStack, x, y, z);
break;
}
renderBlocks.renderAllFaces = false;
}
/**
* Sets up commonly used fields.
*/
private void setParams(int x, int y, int z)
{
type = Gate.getType(TE);
isOpen = Gate.getState(TE) == Gate.STATE_OPEN;
gate = new boolean[] {
renderBlocks.blockAccess.getBlock(x, y - 1, z).equals(srcBlock),
renderBlocks.blockAccess.getBlock(x, y + 1, z).equals(srcBlock)
};
if (Gate.getFacing(TE) == Gate.FACING_ON_Z) {
dir = Gate.getDirOpen(TE) == Gate.DIR_NEG ? ForgeDirection.NORTH : ForgeDirection.SOUTH;
} else {
dir = Gate.getDirOpen(TE) == Gate.DIR_NEG ? ForgeDirection.EAST : ForgeDirection.WEST;
}
}
/**
* Renders vanilla gate at given coordinates.
*/
private void renderTypeVanilla(ItemStack itemStack, int x, int y, int z)
{
double yMin, yMax;
double yOffset = type * 0.0625D;
boolean singlePlank = type == Gate.TYPE_VANILLA_X3;
yMin = gate[YN] ? 0.0D : 0.3125D - yOffset;
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.0D, 0.5625D, 1.0D, 0.125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.875D, 0.5625D, 1.0D, 1.0D, dir);
if (isOpen) {
if (!singlePlank) {
yMin = gate[YN] ? 0.0D : 0.375D - yOffset;
yMax = gate[YP] ? 1.0D : 0.9375D;
renderBlockWithRotation(itemStack, x, y, z, 0.8125D, yMin, 0.0D, 0.9375D, yMax, 0.125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.8125D, yMin, 0.875D, 0.9375D, yMax, 1.0D, dir);
yMin = 0.375D - yOffset;
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.0D, 0.8125D, 0.5625D, 0.125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.875D, 0.8125D, 0.5625D, 1.0D, dir);
yMin = 0.75D - yOffset;
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.0D, 0.8125D, 0.9375D, 0.125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.875D, 0.8125D, 0.9375D, 1.0D, dir);
} else {
yMin = gate[YN] ? 0.0D : 0.1875D;
yMax = gate[YP] ? 1.0D : 0.9375D;
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.0D, 0.9375D, yMax, 0.125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.875D, 0.9375D, yMax, 1.0D, dir);
}
} else {
if (!singlePlank) {
yMin = gate[YN] ? 0.0D : 0.375D - yOffset;
yMax = gate[YP] ? 1.0D : 0.9375D;
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.375D, 0.5625D, yMax, 0.5D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.5D, 0.5625D, yMax, 0.625D, dir);
yMin = 0.375D - yOffset;
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.625D, 0.5625D, 0.5625D, 0.875D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.125D, 0.5625D, 0.5625D, 0.375D, dir);
yMin = 0.75D - yOffset;
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.625D, 0.5625D, 0.9375D, 0.875D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.125D, 0.5625D, 0.9375D, 0.375D, dir);
} else {
yMin = gate[YN] ? 0.0D : 0.375D - yOffset;
yMax = gate[YP] ? 1.0D : 0.9375D;
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, yMin, 0.125D, 0.5625D, yMax, 0.875D, dir);
}
}
}
/**
* Renders picket gate at given coordinates.
*/
private void renderTypePicket(ItemStack itemStack, int x, int y, int z)
{
double yMin, yMax;
if (isOpen) {
if (!gate[YP]) {
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.625D, 0.0625D, 1.0D, 0.6875D, 0.1875D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.625D, 0.8125D, 1.0D, 0.6875D, 0.9375D, dir);
}
if (!gate[YN]) {
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.1875D, 0.0625D, 1.0D, 0.25D, 0.1875D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.1875D, 0.8125D, 1.0D, 0.25D, 0.9375D, dir);
}
yMin = gate[YN] ? 0.0D : 0.0625D;
yMax = gate[YP] ? 1.0D : 0.8125D;
renderBlockWithRotation(itemStack, x, y, z, 0.5D, yMin, 0.0D, 0.5625D, yMax, 0.0625D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, yMin, 0.1875D, 0.5625D, yMax, 0.25D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, yMin, 0.75D, 0.5625D, yMax, 0.8125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, yMin, 0.9375D, 0.5625D, yMax, 1.0D, dir);
yMax = gate[YP] ? 1.0D : 0.875D;
renderBlockWithRotation(itemStack, x, y, z, 0.6875D, yMin, 0.0D, 0.8125D, yMax, 0.0625D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.6875D, yMin, 0.1875D, 0.8125D, yMax, 0.25D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.6875D, yMin, 0.75D, 0.8125D, yMax, 0.8125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.6875D, yMin, 0.9375D, 0.8125D, yMax, 1.0D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.9375D, yMin, 0.0D, 1.0D, yMax, 0.0625D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.9375D, yMin, 0.1875D, 1.0D, yMax, 0.25D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.9375D, yMin, 0.75D, 1.0D, yMax, 0.8125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.9375D, yMin, 0.9375D, 1.0D, yMax, 1.0D, dir);
} else {
if (!gate[YP]) {
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, 0.625D, 0.0D, 0.5625D, 0.6875D, 1.0D, dir);
}
if (!gate[YN]) {
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, 0.1875D, 0.0D, 0.5625D, 0.25D, 1.0D, dir);
}
yMin = gate[YN] ? 0.0D : 0.0625D;
yMax = gate[YP] ? 1.0D : 0.8125D;
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.0D, 0.625D, yMax, 0.0625D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.0D, 0.4375D, yMax, 0.0625D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.9375D, 0.625D, yMax, 1.0D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.9375D, 0.4375D, yMax, 1.0D, dir);
yMax = gate[YP] ? 1.0D : 0.875D;
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.1875D, 0.625D, yMax, 0.3125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.1875D, 0.4375D, yMax, 0.3125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.4375D, 0.625D, yMax, 0.5625D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.4375D, 0.4375D, yMax, 0.5625D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.6875D, 0.625D, yMax, 0.8125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.6875D, 0.4375D, yMax, 0.8125D, dir);
}
}
/**
* Renders shadowbox gate at given coordinates.
*/
private void renderTypeShadowbox(ItemStack itemStack, int x, int y, int z)
{
if (isOpen) {
if (!gate[YP]) {
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.75D, 0.0625D, 1.0D, 0.875D, 0.1875D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.75D, 0.8125D, 1.0D, 0.875D, 0.9375D, dir);
}
if (!gate[YN]) {
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.125D, 0.0625D, 1.0D, 0.25D, 0.1875D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.125D, 0.8125D, 1.0D, 0.25D, 0.9375D, dir);
}
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.0D, 0.0D, 0.75D, 1.0D, 0.0625D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.75D, 0.0D, 0.1875D, 1.0D, 1.0D, 0.25D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.0D, 0.75D, 0.75D, 1.0D, 0.8125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.75D, 0.0D, 0.9375D, 1.0D, 1.0D, 1.0D, dir);
} else {
if (!gate[YP]) {
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, 0.75D, 0.0D, 0.5625D, 0.875D, 1.0D, dir);
}
if (!gate[YN]) {
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, 0.125D, 0.0D, 0.5625D, 0.25D, 1.0D, dir);
}
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, 0.0D, 0.0D, 0.625D, 1.0D, 0.25D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.375D, 0.0D, 0.25D, 0.4375D, 1.0D, 0.5D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5625D, 0.0D, 0.5D, 0.625D, 1.0D, 0.75D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.375D, 0.0D, 0.75D, 0.4375D, 1.0D, 1.0D, dir);
}
}
/**
* Renders wall gate at given coordinates.
*/
private void renderTypeWall(ItemStack itemStack, int x, int y, int z)
{
double yMax = gate[YP] ? 1.0D : 0.8125D;
if (isOpen) {
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.0D, 0.0D, 1.0D, yMax, 0.125D, dir);
renderBlockWithRotation(itemStack, x, y, z, 0.5D, 0.0D, 0.875D, 1.0D, yMax, 1.0D, dir);
} else {
renderBlockWithRotation(itemStack, x, y, z, 0.4375D, 0.0D, 0.0D, 0.5625D, yMax, 1.0D, dir);
}
}
}