package com.carpentersblocks.renderer;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack;
import com.carpentersblocks.block.BlockCarpentersStairs;
import com.carpentersblocks.data.Stairs;
import com.carpentersblocks.util.registry.BlockRegistry;
import com.carpentersblocks.util.stairs.StairsUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class BlockHandlerCarpentersStairs extends BlockHandlerBase {
@Override
public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderBlocks)
{
renderBlocks.setRenderBounds(0.0D, 0.0D, 0.0D, 1.0D, 0.5D, 1.0D);
super.renderInventoryBlock(block, metadata, modelID, renderBlocks);
renderBlocks.setRenderBounds(0.5D, 0.5D, 0.0D, 1.0D, 1.0D, 1.0D);
super.renderInventoryBlock(block, metadata, modelID, renderBlocks);
}
@Override
/**
* Renders stairs at the given coordinates
*/
protected void renderCarpentersBlock(int x, int y, int z)
{
ItemStack itemStack = getCoverForRendering();
Stairs stairs = Stairs.stairsList[TE.getData()];
StairsUtil stairsUtil = new StairsUtil();
BlockCarpentersStairs blockRef = (BlockCarpentersStairs) BlockRegistry.blockCarpentersStairs;
for (int box = 0; box < 3; ++box)
{
float[] bounds = stairsUtil.genBounds(box, stairs);
if (bounds != null)
{
blockRef.setBlockBounds(bounds[0], bounds[1], bounds[2], bounds[3], bounds[4], bounds[5]);
renderBlocks.setRenderBounds(bounds[0], bounds[1], bounds[2], bounds[3], bounds[4], bounds[5]);
renderBlock(itemStack, x, y, z);
}
}
}
@Override
/**
* Renders side covers (stair specific).
*/
protected void renderSideBlocks(int x, int y, int z)
{
renderBlocks.renderAllFaces = true;
Stairs stairs = Stairs.stairsList[TE.getData()];
StairsUtil stairsUtil = new StairsUtil();
for (int box = 0; box < 3; ++box)
{
float[] bounds = stairsUtil.genBounds(box, stairs);
if (bounds != null)
{
for (int side = 0; side < 6; ++side)
{
coverRendering = side;
if (TE.hasAttribute(TE.ATTR_COVER[side]))
{
renderBlocks.setRenderBounds(bounds[0], bounds[1], bounds[2], bounds[3], bounds[4], bounds[5]);
int[] renderOffset = getSideCoverRenderBounds(x, y, z, side);
if (clipSideCoverBoundsBasedOnState(stairs.stairsID, box, side)) {
renderBlock(getCoverForRendering(), renderOffset[0], renderOffset[1], renderOffset[2]);
}
}
}
}
}
renderBlocks.renderAllFaces = false;
coverRendering = 6;
}
/**
* Alters side cover render bounds to prevent it from intersecting the block mask.
*/
private boolean clipSideCoverBoundsBasedOnState(int data, int box, int side)
{
++box;
switch (data) {
case Stairs.ID_NORMAL_POS_N:
switch (box) {
case 1:
if (side == 2) {
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 3) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_POS_W:
switch (box) {
case 1:
if (side == 4) {
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_POS_E:
switch (box) {
case 1:
if (side == 5) {
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_POS_S:
switch (box) {
case 1:
if (side == 3) {
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 2) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_NEG_N:
switch (box) {
case 1:
if (side == 2) {
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 3) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_NEG_W:
switch (box) {
case 1:
if (side == 4) {
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_NEG_E:
switch (box) {
case 1:
if (side == 5) {
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_NEG_S:
switch (box) {
case 1:
if (side == 3) {
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 2) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_INT_POS_NW:
switch (box) {
case 1:
if (side == 4) {
renderBlocks.renderMaxZ -= 0.5D;
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 2) {
renderBlocks.renderMinY += 0.5D;
} else if (side == 5) {
return false;
}
break;
case 3:
if (side == 3 || side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_INT_POS_SW:
switch (box) {
case 1:
if (side == 4) {
renderBlocks.renderMinZ += 0.5D;
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 3) {
renderBlocks.renderMinY += 0.5D;
} else if (side == 5) {
return false;
}
break;
case 3:
if (side == 2 || side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_INT_POS_NE:
switch (box) {
case 1:
if (side == 5) {
renderBlocks.renderMaxZ -= 0.5D;
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 2) {
renderBlocks.renderMinY += 0.5D;
} else if (side == 4) {
return false;
}
break;
case 3:
if (side == 3 || side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_INT_POS_SE:
switch (box) {
case 1:
if (side == 5) {
renderBlocks.renderMinZ += 0.5D;
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 3) {
renderBlocks.renderMinY += 0.5D;
} else if (side == 4) {
return false;
}
break;
case 3:
if (side == 2 || side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_INT_NEG_NW:
switch (box) {
case 1:
if (side == 4) {
renderBlocks.renderMaxZ -= 0.5D;
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 2) {
renderBlocks.renderMaxY -= 0.5D;
} else if (side == 5) {
return false;
}
break;
case 3:
if (side == 3 || side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_INT_NEG_SW:
switch (box) {
case 1:
if (side == 4) {
renderBlocks.renderMinZ += 0.5D;
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 3) {
renderBlocks.renderMaxY -= 0.5D;
} else if (side == 5) {
return false;
}
break;
case 3:
if (side == 2 || side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_INT_NEG_NE:
switch (box) {
case 1:
if (side == 5) {
renderBlocks.renderMaxZ -= 0.5D;
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 2) {
renderBlocks.renderMaxY -= 0.5D;
} else if (side == 4) {
return false;
}
break;
case 3:
if (side == 3 || side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_INT_NEG_SE:
switch (box) {
case 1:
if (side == 5) {
renderBlocks.renderMinZ += 0.5D;
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 3) {
renderBlocks.renderMaxY -= 0.5D;
} else if (side == 4) {
return false;
}
break;
case 3:
if (side == 2 || side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_EXT_POS_NW:
switch (box) {
case 1:
if (side == 2 || side == 4) {
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 5) {
return false;
}
break;
case 3:
if (side == 3 || side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_EXT_POS_SW:
switch (box) {
case 1:
if (side == 3 || side == 4) {
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 5) {
return false;
}
break;
case 3:
if (side == 2 || side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_EXT_POS_NE:
switch (box) {
case 1:
if (side == 2 || side == 5) {
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 4) {
return false;
}
break;
case 3:
if (side == 3 || side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_EXT_POS_SE:
switch (box) {
case 1:
if (side == 3 || side == 5) {
renderBlocks.renderMinY += 0.5D;
}
break;
case 2:
if (side == 4) {
return false;
}
break;
case 3:
if (side == 2 || side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_EXT_NEG_NW:
switch (box) {
case 1:
if (side == 2 || side == 4) {
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 5) {
return false;
}
break;
case 3:
if (side == 3 || side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_EXT_NEG_SW:
switch (box) {
case 1:
if (side == 3 || side == 4) {
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 5) {
return false;
}
break;
case 3:
if (side == 2 || side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_EXT_NEG_NE:
switch (box) {
case 1:
if (side == 2 || side == 5) {
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 4) {
return false;
}
break;
case 3:
if (side == 3 || side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_EXT_NEG_SE:
switch (box) {
case 1:
if (side == 3 || side == 5) {
renderBlocks.renderMaxY -= 0.5D;
}
break;
case 2:
if (side == 4) {
return false;
}
break;
case 3:
if (side == 2 || side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_SW:
switch (box) {
case 1:
if (side == 4) {
renderBlocks.renderMinZ += 0.5D;
}
break;
case 2:
if (side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_NW:
switch (box) {
case 1:
if (side == 4) {
renderBlocks.renderMaxZ -= 0.5D;
}
break;
case 2:
if (side == 5) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_NE:
switch (box) {
case 1:
if (side == 5) {
renderBlocks.renderMaxZ -= 0.5D;
}
break;
case 2:
if (side == 4) {
return false;
}
break;
}
break;
case Stairs.ID_NORMAL_SE:
switch (box) {
case 1:
if (side == 5) {
renderBlocks.renderMinZ += 0.5D;
}
break;
case 2:
if (side == 4) {
return false;
}
break;
}
break;
}
return true;
}
}