package com.carpentersblocks.renderer; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; import com.carpentersblocks.data.Hatch; import com.carpentersblocks.util.registry.IconRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class BlockHandlerCarpentersHatch extends BlockHandlerHinged { private ForgeDirection baseDir; private boolean isHigh; private int type; @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderBlocks) { renderBlocks.setRenderBounds(0.0D, 0.4375D, 0.0D, 1.0D, 0.5625D, 1.0D); super.renderInventoryBlock(block, metadata, modelID, renderBlocks); renderBlocks.setRenderBounds(0.0625D, 0.5625D, 0.375D, 0.125D, 0.625D, 0.4375D); super.renderInventoryBlock(Blocks.iron_block, metadata, modelID, renderBlocks); renderBlocks.setRenderBounds(0.0625, 0.5625D, 0.5625D, 0.125D, 0.625D, 0.625D); super.renderInventoryBlock(Blocks.iron_block, metadata, modelID, renderBlocks); renderBlocks.setRenderBounds(0.0625D, 0.625D, 0.375D, 0.125D, 0.6875D, 0.625D); super.renderInventoryBlock(Blocks.iron_block, metadata, modelID, renderBlocks); } @Override /** * Renders block at coordinates. */ public void renderCarpentersBlock(int x, int y, int z) { renderBlocks.renderAllFaces = true; setParams(); ItemStack itemStack = getCoverForRendering(); switch (type) { case Hatch.TYPE_WINDOW: case Hatch.TYPE_SCREEN: renderTypeFrame(itemStack, x, y, z); break; case Hatch.TYPE_FRENCH_WINDOW: renderTypeFrench(itemStack, x, y, z); break; case Hatch.TYPE_PANEL: renderTypePanel(itemStack, x, y, z); break; case Hatch.TYPE_HIDDEN: renderTypeHidden(itemStack, x, y, z); break; } renderBlocks.renderAllFaces = false; } /** * Sets up commonly used fields. */ private void setParams() { type = Hatch.getType(TE); isHigh = Hatch.getPos(TE) == Hatch.POSITION_HIGH; isOpen = Hatch.getState(TE) == Hatch.STATE_OPEN; switch (Hatch.getDir(TE)) { case Hatch.DIR_Z_NEG: side = baseDir = ForgeDirection.SOUTH; break; case Hatch.DIR_Z_POS: side = baseDir = ForgeDirection.NORTH; break; case Hatch.DIR_X_NEG: side = baseDir = ForgeDirection.EAST; break; case Hatch.DIR_X_POS: side = baseDir = ForgeDirection.WEST; break; } if (!isOpen) { side = isHigh ? ForgeDirection.UP : ForgeDirection.DOWN; } } /** * Renders hidden hatch at given coordinates. */ private void renderTypeHidden(ItemStack itemStack, int x, int y, int z) { renderBlockWithRotation(itemStack, x, y, z, 0.0D, 0.0D, 0.875D, 1.0D, 1.0D, 1.0D, side); renderPartHandle(new ItemStack(Blocks.iron_block), x, y, z, true, false); } /** * Renders standard 3x3 outer frame. */ private void renderPartFrame(ItemStack itemStack, int x, int y, int z) { renderBlockWithRotation(itemStack, x, y, z, 0.0D, 0.0D, 0.8125D, 0.1875D, 1.0D, 1.0D, side); renderBlockWithRotation(itemStack, x, y, z, 0.1875D, 0.8125D, 0.8125D, 0.8125D, 1.0D, 1.0D, side); renderBlockWithRotation(itemStack, x, y, z, 0.1875D, 0.0D, 0.8125D, 0.8125D, 0.1875D, 1.0D, side); renderBlockWithRotation(itemStack, x, y, z, 0.8125D, 0.0D, 0.8125D, 1.0D, 1.0D, 1.0D, side); } /** * Renders a window or screen hatch at given coordinates. */ private void renderTypeFrame(ItemStack itemStack, int x, int y, int z) { renderPartFrame(itemStack, x, y, z); renderPartPane(type == Hatch.TYPE_SCREEN ? IconRegistry.icon_hatch_screen : IconRegistry.icon_hatch_glass, x, y, z); renderPartHandle(new ItemStack(Blocks.iron_block), x, y, z, true, true); } /** * Renders a French window hatch at given coordinates. */ private void renderTypeFrench(ItemStack itemStack, int x, int y, int z) { renderBlockWithRotation(itemStack, x, y, z, 0.1875D, 0.4375D, 0.875D, 0.8125D, 0.5625D, 0.9375D, side); renderBlockWithRotation(itemStack, x, y, z, 0.4375D, 0.1875D, 0.875D, 0.5625D, 0.4375D, 0.9375D, side); renderBlockWithRotation(itemStack, x, y, z, 0.4375D, 0.5625D, 0.875D, 0.5625D, 0.8125D, 0.9375D, side); renderPartFrame(itemStack, x, y, z); renderPartPane(IconRegistry.icon_hatch_french_glass, x, y, z); renderPartHandle(new ItemStack(Blocks.iron_block), x, y, z, true, true); } /** * Renders a panel hatch at given coordinates. */ private void renderTypePanel(ItemStack itemStack, int x, int y, int z) { renderBlockWithRotation(itemStack, x, y, z, 0.1875D, 0.1875D, 0.875D, 0.8215D, 0.8215D, 0.9375D, side); renderBlockWithRotation(itemStack, x, y, z, 0.3125D, 0.3125D, 0.8125D, 0.6875D, 0.6875D, 1.0D, side); renderPartFrame(itemStack, x, y, z); renderPartHandle(new ItemStack(Blocks.iron_block), x, y, z, true, true); } /** * Renders a hatch handle for the given coordinates. */ private void renderPartHandle(ItemStack itemStack, int x, int y, int z, boolean renderInterior, boolean renderExterior) { if (!renderInterior && !renderExterior) { return; } suppressDyeColor = true; suppressChiselDesign = true; suppressOverlay = true; double zOffset = Hatch.getType(TE) == Hatch.TYPE_HIDDEN ? 0.125D : 0.1875D; double yMin = isHigh ? 0.0625D : 0.875D; double yMax = isHigh ? 0.125D : 0.9375D; if (renderInterior) { if (isOpen) { ForgeDirection dir = side.getOpposite(); int xTemp = x - dir.offsetX; int yTemp = y - dir.offsetY; int zTemp = z - dir.offsetZ; renderBlockWithRotation(itemStack, xTemp, yTemp, zTemp, 0.375D, yMin, 0.9375D, 0.4375D, yMax, 1.0D, dir); renderBlockWithRotation(itemStack, xTemp, yTemp, zTemp, 0.5625D, yMin, 0.9375D, 0.625D, yMax, 1.0D, dir); renderBlockWithRotation(itemStack, xTemp, yTemp, zTemp, 0.375D, yMin, 0.875D, 0.625D, yMax, 0.9375D, dir); } else { ForgeDirection dir = isHigh ? baseDir : baseDir.getOpposite(); renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.9375D - zOffset, 0.4375D, yMax, 1.0D - zOffset, side, dir); renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.9375D - zOffset, 0.625D, yMax, 1.0D - zOffset, side, dir); renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.875D - zOffset, 0.625D, yMax, 0.9375D - zOffset, side, dir); } } if (renderExterior) { if (isOpen) { renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.9375D - zOffset, 0.4375D, yMax, 1.0D - zOffset, baseDir); renderBlockWithRotation(itemStack, x, y, z, 0.5625D, yMin, 0.9375D - zOffset, 0.625D, yMax, 1.0D - zOffset, baseDir); renderBlockWithRotation(itemStack, x, y, z, 0.375D, yMin, 0.875D - zOffset, 0.625D, yMax, 0.9375D - zOffset, baseDir); } else { ForgeDirection dir1 = side.getOpposite(); ForgeDirection dir2 = !isHigh ? baseDir.getOpposite() : baseDir; int xTemp = x - dir1.offsetX; int yTemp = y - dir1.offsetY; int zTemp = z - dir1.offsetZ; renderBlockWithRotation(itemStack, xTemp, yTemp, zTemp, 0.375D, yMin, 0.9375D, 0.4375D, yMax, 1.0D, dir1, dir2); renderBlockWithRotation(itemStack, xTemp, yTemp, zTemp, 0.5625D, yMin, 0.9375D, 0.625D, yMax, 1.0D, dir1, dir2); renderBlockWithRotation(itemStack, xTemp, yTemp, zTemp, 0.375D, yMin, 0.875D, 0.625D, yMax, 0.9375D, dir1, dir2); } } suppressDyeColor = false; suppressChiselDesign = false; suppressOverlay = false; } }