package com.carpentersblocks.renderer; import java.util.ArrayList; import java.util.List; 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.block.BlockCarpentersSafe; import com.carpentersblocks.data.Safe; import com.carpentersblocks.tileentity.TECarpentersSafe; import com.carpentersblocks.util.BlockProperties; import com.carpentersblocks.util.registry.IconRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class BlockHandlerCarpentersSafe extends BlockHandlerBase { private ForgeDirection dir; private boolean isOpen; private boolean isLocked; private ItemStack panelItemStack; private ItemStack iceStack = new ItemStack(Blocks.ice); public static class Component { public double xMin, yMin, zMin, xMax, yMax, zMax; public Component(double xMin, double yMin, double zMin, double xMax, double yMax, double zMax) { this.xMin = xMin; this.yMin = yMin; this.zMin = zMin; this.xMax = xMax; this.yMax = yMax; this.zMax = zMax; } } private final static List<Component> coverList; static { coverList = new ArrayList<Component>(); coverList.add(new Component(0.0D, 0.0D, 0.0D, 0.0625D, 1.0D, 1.0D)); coverList.add(new Component(0.9375D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D)); coverList.add(new Component(0.0625D, 0.0D, 0.0625D, 0.3125D, 0.0625D, 1.0D)); coverList.add(new Component(0.375D, 0.0D, 0.0625D, 0.9375D, 0.0625D, 1.0D)); coverList.add(new Component(0.0625D, 0.9375D, 0.0625D, 0.3125D, 1.0D, 1.0D)); coverList.add(new Component(0.375D, 0.9375D, 0.0625D, 0.9375D, 1.0D, 1.0D)); coverList.add(new Component(0.0625D, 0.0D, 0.0D, 0.3125D, 1.0D, 0.0625D)); coverList.add(new Component(0.375D, 0.0D, 0.0D, 0.9375D, 1.0D, 0.0625D)); coverList.add(new Component(0.3125D, 0.0D, 0.0D, 0.375D, 1.0D, 1.0D)); coverList.add(new Component(0.375D, 0.625D, 0.0625D, 0.9375D, 0.6875D, 0.875D)); coverList.add(new Component(0.375D, 0.3125D, 0.0625D, 0.9375D, 0.375D, 0.875D)); } private final static List<Component> panelList; static { panelList = new ArrayList<Component>(); panelList.add(new Component(0.125D, 0.875D, 0.9375D, 0.25D, 0.9375D, 1.0D)); panelList.add(new Component(0.0625D, 0.0625D, 0.9375D, 0.125D, 0.9375D, 1.0D)); panelList.add(new Component(0.25D, 0.0625D, 0.9375D, 0.3125D, 0.9375D, 1.0D)); panelList.add(new Component(0.125D, 0.6875D, 0.9375D, 0.25D, 0.75D, 1.0D)); panelList.add(new Component(0.125D, 0.0625D, 0.9375D, 0.25D, 0.125D, 1.0D)); panelList.add(new Component(0.0625D, 0.0625D, 0.875D, 0.3125D, 0.9375D, 0.9375D)); } private final int LOCKED_ACTIVE = 0xff0000; private final int LOCKED_INACTIVE = 0x7e3636; private final int UNLOCKED_ACTIVE = 0x00ff00; private final int UNLOCKED_INACTIVE = 0x367e36; private final int CAPACITY_ACTIVE = 0x0000ff; private final int CAPACITY_INACTIVE = 0x383884; @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderBlocks) { /* Cover components */ for (Component comp : coverList) { renderBlocks.setRenderBounds(comp.xMin, comp.yMin, comp.zMin, comp.xMax, comp.yMax, comp.zMax); rotateBounds(renderBlocks, ForgeDirection.WEST); super.renderInventoryBlock(block, metadata, modelID, renderBlocks); } /* Panel components */ for (Component comp : panelList) { renderBlocks.setRenderBounds(comp.xMin, comp.yMin, comp.zMin, comp.xMax, comp.yMax, comp.zMax); rotateBounds(renderBlocks, ForgeDirection.WEST); super.renderInventoryBlock(Blocks.iron_block, metadata, modelID, renderBlocks); } /* Handle */ renderBlocks.setRenderBounds(0.8125D, 0.375D, 0.9375D, 0.875D, 0.625D, 1.0D); rotateBounds(renderBlocks, ForgeDirection.WEST); super.renderInventoryBlock(Blocks.iron_block, metadata, modelID, renderBlocks); /* Sliding door */ renderBlocks.setRenderBounds(0.375D, 0.0625D, 0.875F, 0.9375D, 0.9375D, 0.9375D); rotateBounds(renderBlocks, ForgeDirection.WEST); super.renderInventoryBlock(block, metadata, modelID, renderBlocks); /* Red light */ renderBlocks.setRenderBounds(0.125D, 0.75D, 0.9375D, 0.25D, 0.8125D, 1.0D); rotateBounds(renderBlocks, ForgeDirection.WEST); super.renderInventoryBlock(Blocks.obsidian, metadata, modelID, renderBlocks); /* Green light */ renderBlocks.setRenderBounds(0.125D, 0.8125D, 0.9375D, 0.25D, 0.875D, 1.0D); rotateBounds(renderBlocks, ForgeDirection.WEST); super.renderInventoryBlock(Blocks.obsidian, metadata, modelID, renderBlocks); /* Capacity strip */ renderBlocks.setRenderBounds(0.125D, 0.125D, 0.9375D, 0.25D, 0.6875D, 1.0D); rotateBounds(renderBlocks, ForgeDirection.WEST); super.renderInventoryBlock(Blocks.obsidian, metadata, modelID, renderBlocks); } @Override /** * Renders safe. */ protected void renderCarpentersBlock(int x, int y, int z) { renderBlocks.renderAllFaces = true; ItemStack itemStack = getCoverForRendering(); dir = Safe.getFacing(TE); isOpen = Safe.getState(TE) == Safe.STATE_OPEN; isLocked = Safe.isLocked(TE); /* Set panel material */ if (TE.hasAttribute(TE.ATTR_UPGRADE)) { String name = BlockProperties.getOreDictMatch(TE.getAttribute(TE.ATTR_UPGRADE), BlockCarpentersSafe.upgradeOres); if (!"".equals(name)) { for (int idx = 0; idx < BlockCarpentersSafe.upgradeOres.length; ++idx) { if (BlockCarpentersSafe.upgradeOres[idx].equals(name)) { panelItemStack = BlockCarpentersSafe.upgradeStack[idx]; } } } } else { panelItemStack = new ItemStack(Blocks.iron_block); } /* Render cover components */ for (Component comp : coverList) { renderBlockWithRotation(itemStack, x, y, z, comp.xMin, comp.yMin, comp.zMin, comp.xMax, comp.yMax, comp.zMax, dir); } renderBlockWithRotation(itemStack, x, y, z, 0.375D, 0.0625D, 0.875F, isOpen ? 0.5625D : 0.9375D, 0.9375D, 0.9375D, dir); // Render sliding door suppressDyeColor = true; suppressOverlay = true; suppressChiselDesign = true; /* Render panel components */ for (Component comp : panelList) { renderBlockWithRotation(panelItemStack, x, y, z, comp.xMin, comp.yMin, comp.zMin, comp.xMax, comp.yMax, comp.zMax, dir); // Render panel } renderBlockWithRotation(panelItemStack, x, y, z, isOpen ? 0.4375D : 0.8125D, 0.375D, 0.9375D, isOpen ? 0.5D : 0.875D, 0.625D, 1.0D, dir); // Render handle disableAO = true; setIconOverride(6, IconRegistry.icon_safe_light); renderPartLockLight(x, y, z); renderPartCapacityLight(x, y, z); clearIconOverride(6); disableAO = false; suppressDyeColor = false; suppressOverlay = false; suppressChiselDesign = false; renderBlocks.renderAllFaces = false; } private void renderPartCapacityLight(int x, int y, int z) { double yMin = 0.125D; double yMax = 0.1875D; /* Determine capacity level */ TECarpentersSafe TE_safe = (TECarpentersSafe) TE; int numSlotsFilled = 0; for (int slot = 0; slot < TE_safe.getSizeInventory(); ++slot) { if (TE_safe.getStackInSlot(slot) != null) { ++numSlotsFilled; } } int capacity = numSlotsFilled / (3 * TE_safe.getSizeInventory() / 27); /* Draw capacity light strip */ for (int box = 0; box < 9; ++box) { if (box + 1 <= capacity) { lightingHelper.setLightnessOverride(1.0F); lightingHelper.setBrightnessOverride(lightingHelper.MAX_BRIGHTNESS); lightingHelper.setColorOverride(CAPACITY_ACTIVE); } else { lightingHelper.setColorOverride(CAPACITY_INACTIVE); } renderBlockWithRotation(iceStack, x, y, z, 0.125D, yMin, 0.9375D, 0.25D, yMax, 1.0D, dir); lightingHelper.clearColorOverride(); lightingHelper.clearBrightnessOverride(); lightingHelper.clearLightnessOverride(); yMin += 0.0625D; yMax += 0.0625D; } } private void renderPartLockLight(int x, int y, int z) { if (isLocked) { lightingHelper.setColorOverride(UNLOCKED_INACTIVE); } else { lightingHelper.setLightnessOverride(1.0F); lightingHelper.setBrightnessOverride(lightingHelper.MAX_BRIGHTNESS); lightingHelper.setColorOverride(UNLOCKED_ACTIVE); } renderBlockWithRotation(iceStack, x, y, z, 0.125D, 0.8125D, 0.9375D, 0.25D, 0.875D, 1.0D, dir); lightingHelper.clearColorOverride(); lightingHelper.clearBrightnessOverride(); lightingHelper.clearLightnessOverride(); if (isLocked) { lightingHelper.setLightnessOverride(1.0F); lightingHelper.setBrightnessOverride(lightingHelper.MAX_BRIGHTNESS); lightingHelper.setColorOverride(LOCKED_ACTIVE); } else { lightingHelper.setColorOverride(LOCKED_INACTIVE); } renderBlockWithRotation(iceStack, x, y, z, 0.125D, 0.75D, 0.9375D, 0.25D, 0.8125D, 1.0D, dir); lightingHelper.clearColorOverride(); lightingHelper.clearBrightnessOverride(); lightingHelper.clearLightnessOverride(); } }