package com.carpentersblocks.renderer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; import com.carpentersblocks.data.Bed; import com.carpentersblocks.renderer.helper.VertexHelper; import com.carpentersblocks.tileentity.TEBase; import com.carpentersblocks.util.handler.DesignHandler; import com.carpentersblocks.util.handler.DyeHandler; import com.carpentersblocks.util.registry.IconRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class BlockHandlerCarpentersBed extends BlockHandlerBase { private IIcon[] icon_design; private ForgeDirection dir; private boolean isHead; private boolean hasDesign; private boolean bedParallelNeg; private boolean bedParallelPos; private boolean isOccupied; private TEBase TE_head; private TEBase TE_foot; @Override public boolean shouldRender3DInInventory(int modelId) { return false; } private boolean getIsParallelPos() { if (dir.ordinal() < 4 && renderBlocks.blockAccess.getBlock(TE.xCoord + 1, TE.yCoord, TE.zCoord).equals(srcBlock)) { TEBase TE_adj = (TEBase) renderBlocks.blockAccess.getTileEntity(TE.xCoord + 1, TE.yCoord, TE.zCoord); return Bed.isHeadOfBed(TE) == Bed.isHeadOfBed(TE_adj) && Bed.getDirection(TE) == Bed.getDirection(TE_adj); } else if (renderBlocks.blockAccess.getBlock(TE.xCoord, TE.yCoord, TE.zCoord + 1).equals(srcBlock)) { TEBase TE_adj = (TEBase) renderBlocks.blockAccess.getTileEntity(TE.xCoord, TE.yCoord, TE.zCoord + 1); return Bed.isHeadOfBed(TE) == Bed.isHeadOfBed(TE_adj) && Bed.getDirection(TE) == Bed.getDirection(TE_adj); } else { return false; } } private boolean getIsParallelNeg() { if (dir.ordinal() < 4 && renderBlocks.blockAccess.getBlock(TE.xCoord - 1, TE.yCoord, TE.zCoord).equals(srcBlock)) { TEBase TE_adj = (TEBase) renderBlocks.blockAccess.getTileEntity(TE.xCoord - 1, TE.yCoord, TE.zCoord); return Bed.isHeadOfBed(TE) == Bed.isHeadOfBed(TE_adj) && Bed.getDirection(TE) == Bed.getDirection(TE_adj); } else if (renderBlocks.blockAccess.getBlock(TE.xCoord, TE.yCoord, TE.zCoord - 1).equals(srcBlock)) { TEBase TE_adj = (TEBase) renderBlocks.blockAccess.getTileEntity(TE.xCoord, TE.yCoord, TE.zCoord - 1); return Bed.isHeadOfBed(TE) == Bed.isHeadOfBed(TE_adj) && Bed.getDirection(TE) == Bed.getDirection(TE_adj); } else { return false; } } @Override /** * Renders bed */ protected void renderCarpentersBlock(int x, int y, int z) { renderBlocks.renderAllFaces = true; // Continue only if bed is complete if (Bed.getOppositeTE(TE) == null) { return; } setParams(); // Set up common be parameters // Render mattress, pillow and blanket renderFabricComponents(new ItemStack(Blocks.wool), x, y, z); // Render frame with dye override if (TE_head.hasAttribute(TE_head.ATTR_DYE[6])) { setDyeOverride(DyeHandler.getColor(TE_head.getAttribute(TE_head.ATTR_DYE[6]))); } else { suppressDyeColor = true; } switch (Bed.getType(TE)) { case Bed.TYPE_NORMAL: renderNormalFrame(getCoverForRendering(), x, y, z); break; } clearDyeOverride(); suppressDyeColor = false; renderBlocks.renderAllFaces = false; } /** * Sets up commonly used fields. */ private void setParams() { dir = Bed.getDirection(TE); isHead = Bed.isHeadOfBed(TE); hasDesign = TE.hasDesign(); bedParallelPos = getIsParallelPos(); bedParallelNeg = getIsParallelNeg(); if (isHead) { TE_head = TE; TE_foot = Bed.getOppositeTE(TE); } else { TE_head = Bed.getOppositeTE(TE); TE_foot = TE; } // Occupied state could (maybe) not be synchronized isOccupied = Bed.isOccupied(TE_head) || Bed.isOccupied(TE_foot); if (hasDesign) { icon_design = IconRegistry.icon_design_bed.get(DesignHandler.listBed.indexOf(TE.getDesign())); } } /** * Renders fabric components of bed. */ private void renderFabricComponents(ItemStack itemStack, int x, int y, int z) { suppressDyeColor = true; suppressOverlay = true; suppressChiselDesign = true; int[] rotateTop = { 2, 0, 1, 3 }; renderBlocks.uvRotateTop = renderBlocks.uvRotateBottom = rotateTop[dir.ordinal() - 2]; renderPillow(itemStack, x, y, z); renderBlanket(itemStack, x, y, z); renderBlocks.uvRotateTop = renderBlocks.uvRotateBottom = 0; renderMattress(itemStack, x, y, z); suppressDyeColor = false; suppressOverlay = false; suppressChiselDesign = false; } /** * Renders pillow. */ private void renderPillow(ItemStack itemStack, int x, int y, int z) { if (isHead) { IIcon icon_pillow = hasDesign ? icon_design[0] : IconRegistry.icon_bed_pillow; setIconOverride(6, icon_pillow); renderBlockWithRotation(itemStack, x, y, z, 0.125D, 0.5625D, 0.1875D, 0.875D, 0.6875D, 0.5625D, dir); clearIconOverride(6); } } /** * Renders blanket. */ private void renderBlanket(ItemStack itemStack, int x, int y, int z) { VertexHelper.setFloatingIconLock(); if (hasDesign) { int[] idxHead = { 2, 2, 2, 7, 1, 3 }; int[] idxFoot = { 5, 5, 2, 7, 4, 6 }; int[][] idxRot = { { 3, 2, 5, 4 }, { 2, 3, 4, 5 }, { 4, 5, 3, 2 }, { 5, 4, 2, 3 } }; int valDir = dir.ordinal() - 2; /** 0 = head, 1 = foot */ IIcon[][] icon = { { icon_design[idxHead[0]], icon_design[idxHead[1]], icon_design[idxHead[idxRot[valDir][0]]], icon_design[idxHead[idxRot[valDir][1]]], icon_design[idxHead[idxRot[valDir][2]]], icon_design[idxHead[idxRot[valDir][3]]] }, { icon_design[idxFoot[0]], icon_design[idxFoot[1]], icon_design[idxFoot[idxRot[valDir][0]]], icon_design[idxFoot[idxRot[valDir][1]]], icon_design[idxFoot[idxRot[valDir][2]]], icon_design[idxFoot[idxRot[valDir][3]]] } }; int idx = isHead ? 0 : 1; for (int side = 0; side < 6; ++side) { setIconOverride(side, icon[idx][side]); } } double yTop = isOccupied ? 0.875D : 0.625D; double depth = 0.3125F; // Color the blanket int dyeColor = TE_foot.hasAttribute(TE_foot.ATTR_DYE[coverRendering]) ? DyeHandler.getVanillaDmgValue(TE_foot.getAttribute(TE_foot.ATTR_DYE[coverRendering])) : 0; itemStack.setItemDamage(dyeColor); if (isHead) { renderBlockWithRotation(itemStack, x, y, z, 0.0625D, yTop - 0.0625D, 0.5D, 0.9375D, yTop, 1.0D, dir); renderBlockWithRotation(itemStack, x, y, z, 0.0D, yTop - depth, 0.5D, 0.0625D, yTop, 1.0D, dir); renderBlockWithRotation(itemStack, x, y, z, 0.9375D, yTop - depth, 0.5D, 1.0D, yTop, 1.0D, dir); } else { renderBlockWithRotation(itemStack, x, y, z, 0.0625D, yTop - 0.0625D, 0.0D, 0.9375D, yTop, 0.9375D, dir); renderBlockWithRotation(itemStack, x, y, z, 0.0D, yTop - depth, 0.0D, 0.0625D, yTop, 1.0D, dir); renderBlockWithRotation(itemStack, x, y, z, 0.9375D, yTop - depth, 0.0D, 1.0D, yTop, 1.0D, dir); renderBlockWithRotation(itemStack, x, y, z, 0.0625D, yTop - depth, 0.9375D, 0.9375D, yTop, 1.0D, dir); } itemStack.setItemDamage(15); clearIconOverride(6); VertexHelper.clearFloatingIconLock(); } /** * Renders mattress. */ private void renderMattress(ItemStack itemStack, int x, int y, int z) { itemStack.setItemDamage(0); switch (dir) { case NORTH: renderBlocks.setRenderBounds(bedParallelNeg ? 0.0D : 0.0625D, 0.3125D, isHead ? 0.0D : 0.0625D, bedParallelPos ? 1.0D : 0.9375D, 0.5625D, isHead ? 0.875D : 1.0D); break; case SOUTH: renderBlocks.setRenderBounds(bedParallelNeg ? 0.0D : 0.0625D, 0.3125D, isHead ? 0.125D : 0.0D, bedParallelPos ? 1.0D : 0.9375D, 0.5625D, isHead ? 1.0D : 0.9375D); break; case WEST: renderBlocks.setRenderBounds(isHead ? 0.0D : 0.0625D, 0.3125D, bedParallelNeg ? 0.0D : 0.0625D, isHead ? 0.875D : 1.0D, 0.5625D, bedParallelPos ? 1.0D : 0.9375D); break; case EAST: renderBlocks.setRenderBounds(isHead ? 0.125D : 0.0D, 0.3125D, bedParallelNeg ? 0.0D : 0.0625D, isHead ? 1.0D : 0.9375D, 0.5625D, bedParallelPos ? 1.0D : 0.9375D); break; default: {} } renderBlock(itemStack, x, y, z); } /** * Renders normal bed frame. */ private void renderNormalFrame(ItemStack itemStack, int x, int y, int z) { /* Render components that cannot easily be rotated */ switch (dir) { case NORTH: { if (isHead) { // Render legs renderBlocks.setRenderBounds(0.0D, bedParallelNeg ? 0.1875D : 0.0D, 0.875D, 0.125D, bedParallelNeg ? 0.875D : 1.0D, 1.0D); renderBlock(itemStack, x, y, z); renderBlocks.setRenderBounds(0.875D, bedParallelPos ? 0.1875D : 0.0D, 0.875D, 1.0D, bedParallelPos ? 0.875D : 1.0D, 1.0D); renderBlock(itemStack, x, y, z); } else { // Render legs if (!bedParallelNeg) { renderBlocks.setRenderBounds(0.0D, 0.0D, 0.0D, 0.125D, 0.1875D, 0.125D); renderBlock(itemStack, x, y, z); } if (!bedParallelPos) { renderBlocks.setRenderBounds(0.875D, 0.0D, 0.0D, 1.0D, 0.1875D, 0.125D); renderBlock(itemStack, x, y, z); } } break; } case SOUTH: { if (isHead) { // Render legs renderBlocks.setRenderBounds(0.0D, bedParallelNeg ? 0.1875D : 0.0D, 0.0D, 0.125D, bedParallelNeg ? 0.875D : 1.0D, 0.125D); renderBlock(itemStack, x, y, z); renderBlocks.setRenderBounds(0.875D, bedParallelPos ? 0.1875D : 0.0D, 0.0D, 1.0D, bedParallelPos ? 0.875D : 1.0D, 0.125D); renderBlock(itemStack, x, y, z); } else { // Render legs if (!bedParallelNeg) { renderBlocks.setRenderBounds(0.0D, 0.0D, 0.875D, 0.125D, 0.1875D, 1.0D); renderBlock(itemStack, x, y, z); } if (!bedParallelPos) { renderBlocks.setRenderBounds(0.875D, 0.0D, 0.875D, 1.0D, 0.1875D, 1.0D); renderBlock(itemStack, x, y, z); } } break; } case WEST: { if (isHead) { // Render legs renderBlocks.setRenderBounds(0.875D, bedParallelNeg ? 0.1875D : 0.0D, 0.0D, 1.0D, bedParallelNeg ? 0.875D : 1.0D, 0.125D); renderBlock(itemStack, x, y, z); renderBlocks.setRenderBounds(0.875D, bedParallelPos ? 0.1875D : 0.0D, 0.875D, 1.0D, bedParallelPos ? 0.875D : 1.0D, 1.0D); renderBlock(itemStack, x, y, z); } else { // Render legs if (!bedParallelNeg) { renderBlocks.setRenderBounds(0.0D, 0.0D, 0.0D, 0.125D, 0.1875D, 0.125D); renderBlock(itemStack, x, y, z); } if (!bedParallelPos) { renderBlocks.setRenderBounds(0.0D, 0.0D, 0.875D, 0.125D, 0.1875D, 1.0D); renderBlock(itemStack, x, y, z); } } break; } case EAST: { if (isHead) { // Render legs renderBlocks.setRenderBounds(0.0D, bedParallelNeg ? 0.1875D : 0.0D, 0.0D, 0.125D, bedParallelNeg ? 0.875D : 1.0D, 0.125D); renderBlock(itemStack, x, y, z); renderBlocks.setRenderBounds(0.0D, bedParallelPos ? 0.1875D : 0.0D, 0.875D, 0.125D, bedParallelPos ? 0.875D : 1.0D, 1.0D); renderBlock(itemStack, x, y, z); } else { // Render legs if (!bedParallelNeg) { renderBlocks.setRenderBounds(0.875D, 0.0D, 0.0D, 1.0D, 0.1875D, 0.125D); renderBlock(itemStack, x, y, z); } if (!bedParallelPos) { renderBlocks.setRenderBounds(0.875D, 0.0D, 0.875D, 1.0D, 0.1875D, 1.0D); renderBlock(itemStack, x, y, z); } } break; } default: { } } /* Render components that are safe to rotate */ if (isHead) { renderBlockWithRotation(itemStack, x, y, z, 0.125D, 0.1875D, 0.0D, 0.875D, 0.875D, 0.125D, dir); // Render headboard renderBlockWithRotation(itemStack, x, y, z, 0.0D, 0.1875D, 0.125D, 1.0D, 0.3125D, 1.0D, dir); // Render support board } else { renderBlockWithRotation(itemStack, x, y, z, 0.0D, 0.1875D, 0.0D, 1.0D, 0.3125D, 1.0D, dir); // Render support board } } }