From 461101dd72a02058bc893bef54a09177093014f1 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 17 Jul 2022 23:02:55 +0200 Subject: [PATCH] fireball...box, firebox --- src/main/java/api/hbm/tile/IHeatSource.java | 12 + src/main/java/com/hbm/blocks/ModBlocks.java | 5 + .../com/hbm/blocks/machine/HeaterFirebox.java | 40 + .../inventory/container/ContainerFirebox.java | 73 ++ .../com/hbm/inventory/gui/GUIFirebox.java | 78 ++ .../com/hbm/inventory/gui/GUIFurnaceIron.java | 2 +- .../com/hbm/items/weapon/ItemAmmoArty.java | 1 + src/main/java/com/hbm/main/ClientProxy.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 1 - .../java/com/hbm/main/ResourceManager.java | 6 + .../java/com/hbm/module/ModuleBurnTime.java | 120 ++- .../hbm/render/tileentity/RenderFirebox.java | 61 ++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityFurnaceIron.java | 10 +- .../machine/TileEntityHeaterFirebox.java | 225 +++++ src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../assets/hbm/models/machines/firebox.obj | 940 ++++++++++++++++++ .../hbm/textures/gui/machine/gui_firebox.png | Bin 0 -> 1876 bytes .../hbm/textures/models/machines/firebox.png | Bin 0 -> 7157 bytes .../models/machines/firebox_novent.png | Bin 0 -> 6957 bytes 21 files changed, 1541 insertions(+), 39 deletions(-) create mode 100644 src/main/java/api/hbm/tile/IHeatSource.java create mode 100644 src/main/java/com/hbm/blocks/machine/HeaterFirebox.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerFirebox.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIFirebox.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderFirebox.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityHeaterFirebox.java create mode 100644 src/main/resources/assets/hbm/models/machines/firebox.obj create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_firebox.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/firebox.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/firebox_novent.png diff --git a/src/main/java/api/hbm/tile/IHeatSource.java b/src/main/java/api/hbm/tile/IHeatSource.java new file mode 100644 index 000000000..694a4ff47 --- /dev/null +++ b/src/main/java/api/hbm/tile/IHeatSource.java @@ -0,0 +1,12 @@ +package api.hbm.tile; + +public interface IHeatSource { + + public int getHeatStored(); + + /** + * Removes heat from the system. Implementation has to include the checks preventing the heat from going into the negative. + * @param heat + */ + public void useUpHeat(int heat); +} diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 9e5d42f73..4e78c0c64 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -623,6 +623,8 @@ public class ModBlocks { public static Block cel_prime_battery; public static Block cel_prime_port; public static Block cel_prime_tanks; + + public static Block heater_firebox; public static Block furnace_iron; @@ -1788,6 +1790,8 @@ public class ModBlocks { semtex = new BlockSemtex().setBlockName("semtex").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.nukeTab).setHardness(0.0F).setBlockTextureName(RefStrings.MODID + ":semtex"); c4 = new BlockC4().setBlockName("c4").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.nukeTab).setHardness(0.0F).setBlockTextureName(RefStrings.MODID + ":c4"); + heater_firebox = new HeaterFirebox().setBlockName("heater_firebox").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + furnace_iron = new FurnaceIron().setBlockName("furnace_iron").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -2959,6 +2963,7 @@ public class ModBlocks { GameRegistry.registerBlock(press_preheater, press_preheater.getUnlocalizedName()); GameRegistry.registerBlock(machine_press, machine_press.getUnlocalizedName()); GameRegistry.registerBlock(machine_epress, machine_epress.getUnlocalizedName()); + GameRegistry.registerBlock(heater_firebox, heater_firebox.getUnlocalizedName()); GameRegistry.registerBlock(furnace_iron, furnace_iron.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/HeaterFirebox.java b/src/main/java/com/hbm/blocks/machine/HeaterFirebox.java new file mode 100644 index 000000000..fc85049c1 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/HeaterFirebox.java @@ -0,0 +1,40 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityHeaterFirebox; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class HeaterFirebox extends BlockDummyable { + + public HeaterFirebox() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) + return new TileEntityHeaterFirebox(); + return new TileEntityProxyCombo(true, false, false); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return this.standardOpenBehavior(world, x, y, z, player, 0); + } + + @Override + public int[] getDimensions() { + return new int[] {0, 0, 1, 1, 1, 1}; + } + + @Override + public int getOffset() { + return 1; + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerFirebox.java b/src/main/java/com/hbm/inventory/container/ContainerFirebox.java new file mode 100644 index 000000000..4883cb374 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerFirebox.java @@ -0,0 +1,73 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.machine.TileEntityHeaterFirebox; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerFirebox extends Container { + + protected TileEntityHeaterFirebox firebox; + + public ContainerFirebox(InventoryPlayer invPlayer, TileEntityHeaterFirebox furnace) { + this.firebox = furnace; + this.firebox.openInventory(); + + this.addSlotToContainer(new Slot(furnace, 0, 44, 27)); + this.addSlotToContainer(new Slot(furnace, 1, 62, 27)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 86 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 144)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack stack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack originalStack = slot.getStack(); + stack = originalStack.copy(); + + if(index <= 1) { + if(!this.mergeItemStack(originalStack, 2, this.inventorySlots.size(), true)) { + return null; + } + + slot.onSlotChange(originalStack, stack); + + } else if(!this.mergeItemStack(originalStack, 0, 2, false)) { + return null; + } + + if(originalStack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return stack; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return firebox.isUseableByPlayer(player); + } + + @Override + public void onContainerClosed(EntityPlayer player) { + super.onContainerClosed(player); + this.firebox.closeInventory(); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIFirebox.java b/src/main/java/com/hbm/inventory/gui/GUIFirebox.java new file mode 100644 index 000000000..fcb0ab76b --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIFirebox.java @@ -0,0 +1,78 @@ +package com.hbm.inventory.gui; + +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerFirebox; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityHeaterFirebox; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.util.ResourceLocation; + +public class GUIFirebox extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_firebox.png"); + private TileEntityHeaterFirebox diFurnace; + + public GUIFirebox(InventoryPlayer invPlayer, TileEntityHeaterFirebox tedf) { + super(new ContainerFirebox(invPlayer, tedf)); + diFurnace = tedf; + + this.xSize = 176; + this.ySize = 168; + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + if(this.mc.thePlayer.inventory.getItemStack() == null) { + + for(int i = 0; i < 2; ++i) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); + + if(this.isMouseOverSlot(slot, x, y) && !slot.getHasStack()) { + + List bonuses = this.diFurnace.burnModule.getDesc(); + + if(!bonuses.isEmpty()) { + this.func_146283_a(bonuses, x, y); + } + } + } + } + + this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 27, 71, 7, x, y, new String[] { String.format("%,d", diFurnace.heatEnergy) + " / " + String.format("%,d", diFurnace.maxHeatEnergy) + "TU" }); + this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 36, 71, 7, x, y, new String[] { diFurnace.burnHeat + "TU/s", (diFurnace.burnTime / 20) + "s" }); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int i = diFurnace.heatEnergy * 69 / diFurnace.maxHeatEnergy; + drawTexturedModalRect(guiLeft + 81, guiTop + 28, 176, 0, i, 5); + + int j = diFurnace.burnTime * 70 / Math.max(diFurnace.maxBurnTime, 1); + drawTexturedModalRect(guiLeft + 81, guiTop + 37, 176, 5, j, 5); + + if(diFurnace.wasOn) { + drawTexturedModalRect(guiLeft + 25, guiTop + 26, 176, 10, 18, 18); + } + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIFurnaceIron.java b/src/main/java/com/hbm/inventory/gui/GUIFurnaceIron.java index 282b3268e..cc3379b1d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFurnaceIron.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFurnaceIron.java @@ -38,7 +38,7 @@ public class GUIFurnaceIron extends GuiInfoContainer { if(this.isMouseOverSlot(slot, x, y) && !slot.getHasStack()) { - List bonuses = this.diFurnace.burnModule.getDesc(); + List bonuses = this.diFurnace.burnModule.getTimeDesc(); if(!bonuses.isEmpty()) { this.func_146283_a(bonuses, x, y); diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java index 3fa4ae903..803b44ed5 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -109,6 +109,7 @@ public class ItemAmmoArty extends Item { list.add(y + "Strength: 20"); list.add(r + "Deals nuclear damage"); list.add(r + "Destroys blocks"); + break; case MINI_NUKE_MULTI: list.add(r + "Splits x5"); break; diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index fda6c15f9..2e10ec111 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -254,6 +254,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadiolysis.class, new RenderRadiolysis()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityElectrolyser.class, new RenderElectrolyser()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceIron.class, new RenderFurnaceIron()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterFirebox.class, new RenderFirebox()); //AMS ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSBase.class, new RenderAMSBase()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSEmitter.class, new RenderAMSEmitter()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index be52392f4..a1fdef708 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -72,7 +72,6 @@ import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; import com.hbm.potion.HbmPotion; import com.hbm.saveddata.satellites.Satellite; -import com.hbm.test.ReEvalTest; import com.hbm.tileentity.TileMappings; import com.hbm.tileentity.bomb.TileEntityNukeCustom; import com.hbm.tileentity.machine.*; diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index e3a209a0f..f069fa8f0 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -55,6 +55,9 @@ public class ResourceManager { public static final IModelCustom turret_howard_damaged = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_howard_damaged.obj")); + //Heaters + public static final IModelCustom heater_firebox = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/firebox.obj")); + //Furnaces public static final IModelCustom furnace_iron = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_iron.obj")); @@ -362,6 +365,9 @@ public class ResourceManager { public static final ResourceLocation mine_shrap_tex = new ResourceLocation(RefStrings.MODID, "textures/models/mine_shrap.png"); public static final ResourceLocation mine_fat_tex = new ResourceLocation(RefStrings.MODID, "textures/models/mine_fat.png"); + //Heaters + public static final ResourceLocation heater_firebox_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/firebox.png"); + //Furnaces public static final ResourceLocation furnace_iron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_iron.png"); diff --git a/src/main/java/com/hbm/module/ModuleBurnTime.java b/src/main/java/com/hbm/module/ModuleBurnTime.java index 5d2c8327c..a1ab0b3f4 100644 --- a/src/main/java/com/hbm/module/ModuleBurnTime.java +++ b/src/main/java/com/hbm/module/ModuleBurnTime.java @@ -17,51 +17,99 @@ import net.minecraft.util.EnumChatFormatting; */ public class ModuleBurnTime { - private double modLog = 1.0D; - private double modWood = 1.0D; - private double modCoal = 1.0D; - private double modLignite = 1.0D; - private double modCoke = 1.0D; - private double modSolid = 1.0D; - private double modRocket = 1.0D; + private static final int modLog = 0; + private static final int modWood = 1; + private static final int modCoal = 2; + private static final int modLignite = 3; + private static final int modCoke = 4; + private static final int modSolid = 5; + private static final int modRocket = 6; + + private double[] modTime = new double[7]; + private double[] modHeat = new double[7]; + + public ModuleBurnTime() { + for(int i = 0; i < modTime.length; i++) { + modTime[i] = 1.0D; + modHeat[i] = 1.0D; + } + } public int getBurnTime(ItemStack stack) { int fuel = TileEntityFurnace.getItemBurnTime(stack); if(fuel == 0) return 0; - - if(stack.getItem() == ModItems.solid_fuel) return (int) (fuel * modSolid); - if(stack.getItem() == ModItems.solid_fuel_presto) return (int) (fuel * modSolid); - if(stack.getItem() == ModItems.solid_fuel_presto_triplet) return (int) (fuel * modSolid); - if(stack.getItem() == ModItems.rocket_fuel) return (int) (fuel * modRocket); + return (int) (fuel * getMod(stack, modTime)); + } + + public int getBurnHeat(int base, ItemStack stack) { + return (int) (base * getMod(stack, modHeat)); + } + + public double getMod(ItemStack stack, double[] mod) { + + if(stack == null) + return 0; + + if(stack.getItem() == ModItems.solid_fuel) return mod[modSolid]; + if(stack.getItem() == ModItems.solid_fuel_presto) return mod[modSolid]; + if(stack.getItem() == ModItems.solid_fuel_presto_triplet) return mod[modSolid]; + + if(stack.getItem() == ModItems.rocket_fuel) return mod[modRocket]; List names = ItemStackUtil.getOreDictNames(stack); for(String name : names) { - if(name.contains("Coke")) return (int) (fuel * modCoke); - if(name.contains("Coal")) return (int) (fuel * modCoal); - if(name.contains("Lignite")) return (int) (fuel * modLignite); - if(name.startsWith("log")) return (int) (fuel * modLog); - if(name.contains("Wood")) return (int) (fuel * modWood); + if(name.contains("Coke")) return mod[modCoke]; + if(name.contains("Coal")) return mod[modCoal]; + if(name.contains("Lignite")) return mod[modLignite]; + if(name.startsWith("log")) return mod[modLog]; + if(name.contains("Wood")) return mod[modWood]; } - return fuel; + return 1; } public List getDesc() { + List desc = new ArrayList(); + desc.addAll(getTimeDesc()); + desc.addAll(getHeatDesc()); + return desc; + } + + public List getTimeDesc() { List list = new ArrayList(); list.add(EnumChatFormatting.GOLD + "Burn time bonuses:"); - addIf(list, "Logs", modLog); - addIf(list, "Wood", modWood); - addIf(list, "Coal", modCoal); - addIf(list, "Lignite", modLignite); - addIf(list, "Coke", modCoke); - addIf(list, "Solid Fuel", modSolid); - addIf(list, "Rocket Fuel", modRocket); + addIf(list, "Logs", modTime[modLog]); + addIf(list, "Wood", modTime[modWood]); + addIf(list, "Coal", modTime[modCoal]); + addIf(list, "Lignite", modTime[modLignite]); + addIf(list, "Coke", modTime[modCoke]); + addIf(list, "Solid Fuel", modTime[modSolid]); + addIf(list, "Rocket Fuel", modTime[modRocket]); + + if(list.size() == 1) + list.clear(); + + return list; + } + + public List getHeatDesc() { + List list = new ArrayList(); + + list.add(EnumChatFormatting.RED + "Burn heat bonuses:"); + + addIf(list, "Logs", modHeat[modLog]); + addIf(list, "Wood", modHeat[modWood]); + addIf(list, "Coal", modHeat[modCoal]); + addIf(list, "Lignite", modHeat[modLignite]); + addIf(list, "Coke", modHeat[modCoke]); + addIf(list, "Solid Fuel", modHeat[modSolid]); + addIf(list, "Rocket Fuel", modHeat[modRocket]); if(list.size() == 1) list.clear(); @@ -87,11 +135,19 @@ public class ModuleBurnTime { return num; } - public ModuleBurnTime setLogMod(double mod) { this.modLog = mod; return this; } - public ModuleBurnTime setWoodMod(double mod) { this.modWood = mod; return this; } - public ModuleBurnTime setCoalMod(double mod) { this.modCoal = mod; return this; } - public ModuleBurnTime setLigniteMod(double mod) { this.modLignite = mod; return this; } - public ModuleBurnTime setCokeMod(double mod) { this.modCoke = mod; return this; } - public ModuleBurnTime setSolidMod(double mod) { this.modSolid = mod; return this; } - public ModuleBurnTime setRocketMod(double mod) { this.modRocket = mod; return this; } + public ModuleBurnTime setLogTimeMod(double mod) { this.modTime[modLog] = mod; return this; } + public ModuleBurnTime setWoodTimeMod(double mod) { this.modTime[modWood] = mod; return this; } + public ModuleBurnTime setCoalTimeMod(double mod) { this.modTime[modCoal] = mod; return this; } + public ModuleBurnTime setLigniteTimeMod(double mod) { this.modTime[modLignite] = mod; return this; } + public ModuleBurnTime setCokeTimeMod(double mod) { this.modTime[modCoke] = mod; return this; } + public ModuleBurnTime setSolidTimeMod(double mod) { this.modTime[modSolid] = mod; return this; } + public ModuleBurnTime setRocketTimeMod(double mod) { this.modTime[modRocket] = mod; return this; } + + public ModuleBurnTime setLogHeatMod(double mod) { this.modHeat[modLog] = mod; return this; } + public ModuleBurnTime setWoodHeatMod(double mod) { this.modHeat[modWood] = mod; return this; } + public ModuleBurnTime setCoalHeatMod(double mod) { this.modHeat[modCoal] = mod; return this; } + public ModuleBurnTime setLigniteHeatMod(double mod) { this.modHeat[modLignite] = mod; return this; } + public ModuleBurnTime setCokeHeatMod(double mod) { this.modHeat[modCoke] = mod; return this; } + public ModuleBurnTime setSolidHeatMod(double mod) { this.modHeat[modSolid] = mod; return this; } + public ModuleBurnTime setRocketHeatMod(double mod) { this.modHeat[modRocket] = mod; return this; } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderFirebox.java b/src/main/java/com/hbm/render/tileentity/RenderFirebox.java new file mode 100644 index 000000000..8584eb59a --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderFirebox.java @@ -0,0 +1,61 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.main.ResourceManager; +import com.hbm.tileentity.machine.TileEntityHeaterFirebox; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +public class RenderFirebox extends TileEntitySpecialRenderer { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + GL11.glRotatef(-90, 0F, 1F, 0F); + + TileEntityHeaterFirebox firebox = (TileEntityHeaterFirebox) tile; + + bindTexture(ResourceManager.heater_firebox_tex); + ResourceManager.heater_firebox.renderPart("Main"); + + GL11.glPushMatrix(); + float door = firebox.prevDoorAngle + (firebox.doorAngle - firebox.prevDoorAngle) * interp; + GL11.glTranslated(1.375, 0, 0.375); + GL11.glRotatef(door, 0F, -1F, 0F); + GL11.glTranslated(-1.375, 0, -0.375); + ResourceManager.heater_firebox.renderPart("Door"); + GL11.glPopMatrix(); + + if(firebox.wasOn) { + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + ResourceManager.heater_firebox.renderPart("InnerBurning"); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } else { + ResourceManager.heater_firebox.renderPart("InnerEmpty"); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 174190c3e..a5fd5f671 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -247,6 +247,7 @@ public class TileMappings { } private static void putMachines() { + put(TileEntityHeaterFirebox.class, "tileentity_firebox"); put(TileEntityFurnaceIron.class, "tileentity_furnace_iron"); put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter"); put(TileEntityDiFurnaceRTG.class, "tileentity_rtg_difurnace"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java index 2b8fcab0b..8112d9cdd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java @@ -36,11 +36,11 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI super(5); burnModule = new ModuleBurnTime() - .setLigniteMod(1.25) - .setCoalMod(1.25) - .setCokeMod(1.5) - .setSolidMod(2) - .setRocketMod(2); + .setLigniteTimeMod(1.25) + .setCoalTimeMod(1.25) + .setCokeTimeMod(1.5) + .setSolidTimeMod(2) + .setRocketTimeMod(2); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterFirebox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterFirebox.java new file mode 100644 index 000000000..ab1d572c2 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterFirebox.java @@ -0,0 +1,225 @@ +package com.hbm.tileentity.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.inventory.container.ContainerFirebox; +import com.hbm.inventory.gui.GUIFirebox; +import com.hbm.module.ModuleBurnTime; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; + +import api.hbm.tile.IHeatSource; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityHeaterFirebox extends TileEntityMachineBase implements IGUIProvider, IHeatSource { + + public int maxBurnTime; + public int burnTime; + public int burnHeat; + public boolean wasOn = false; + private int playersUsing = 0; + + public float doorAngle = 0; + public float prevDoorAngle = 0; + + public int heatEnergy; + public static final int maxHeatEnergy = 100_000; + + public ModuleBurnTime burnModule; + + public TileEntityHeaterFirebox() { + super(2); + + burnModule = new ModuleBurnTime() + .setLigniteTimeMod(1.25) + .setCoalTimeMod(1.25) + .setCokeTimeMod(1.25) + .setSolidTimeMod(1.5) + .setRocketTimeMod(1.5) + + .setLigniteHeatMod(2) + .setCoalHeatMod(2) + .setCokeHeatMod(2) + .setSolidHeatMod(3) + .setRocketHeatMod(5); + } + + @Override + public String getName() { + return "container.heaterFirebox"; + } + + @Override + public void openInventory() { + if(!worldObj.isRemote) this.playersUsing++; + } + + @Override + public void closeInventory() { + if(!worldObj.isRemote) this.playersUsing--; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + wasOn = false; + + if(burnTime <= 0) { + + for(int i = 0; i < 2; i++) { + if(slots[i] != null) { + + int fuel = burnModule.getBurnTime(slots[i]); + + if(fuel > 0) { + this.maxBurnTime = this.burnTime = fuel; + this.burnHeat = burnModule.getBurnHeat(100, slots[i]); + slots[i].stackSize--; + + if(slots[i].stackSize == 0) { + slots[i] = slots[i].getItem().getContainerItem(slots[i]); + } + + break; + } + } + } + } else { + burnTime--; + this.wasOn = true; + } + + if(burnTime > 0) { + this.heatEnergy = Math.min(this.heatEnergy + this.burnHeat, maxHeatEnergy); + } else { + this.heatEnergy = Math.max(this.heatEnergy - Math.max(this.heatEnergy / 1000, 1), 0); + this.burnHeat = 0; + } + + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("maxBurnTime", this.maxBurnTime); + data.setInteger("burnTime", this.burnTime); + data.setInteger("burnHeat", this.burnHeat); + data.setInteger("heatEnergy", this.heatEnergy); + data.setInteger("playersUsing", this.playersUsing); + data.setBoolean("wasOn", this.wasOn); + this.networkPack(data, 50); + } else { + this.prevDoorAngle = this.doorAngle; + float swingSpeed = (doorAngle / 10F) + 3; + + if(this.playersUsing > 0) { + this.doorAngle += swingSpeed; + } else { + this.doorAngle -= swingSpeed; + } + + this.doorAngle = MathHelper.clamp_float(this.doorAngle, 0F, 135F); + + if(wasOn && worldObj.getTotalWorldTime() % 5 == 0) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + double x = xCoord + 0.5 + dir.offsetX; + double y = yCoord + 0.25; + double z = zCoord + 0.5 + dir.offsetZ; + worldObj.spawnParticle("flame", x + worldObj.rand.nextDouble() * 0.5 - 0.25, y + worldObj.rand.nextDouble() * 0.25, z + worldObj.rand.nextDouble() * 0.5 - 0.25, 0, 0, 0); + } + } + } + + @Override + public int[] getAccessibleSlotsFromSide(int meta) { + return new int[] { 0, 1 }; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + return burnModule.getBurnTime(itemStack) > 0; + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.maxBurnTime = nbt.getInteger("maxBurnTime"); + this.burnTime = nbt.getInteger("burnTime"); + this.burnHeat = nbt.getInteger("burnHeat"); + this.heatEnergy = nbt.getInteger("heatEnergy"); + this.playersUsing = nbt.getInteger("playersUsing"); + this.wasOn = nbt.getBoolean("wasOn"); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + this.maxBurnTime = nbt.getInteger("maxBurnTime"); + this.burnTime = nbt.getInteger("burnTime"); + this.burnHeat = nbt.getInteger("burnHeat"); + this.heatEnergy = nbt.getInteger("heatEnergy"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setInteger("maxBurnTime", maxBurnTime); + nbt.setInteger("burnTime", burnTime); + nbt.setInteger("burnHeat", burnHeat); + nbt.setInteger("heatEnergy", heatEnergy); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerFirebox(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIFirebox(player.inventory, this); + } + + @Override + public int getHeatStored() { + return heatEnergy; + } + + @Override + public void useUpHeat(int heat) { + this.heatEnergy = Math.max(0, this.heatEnergy - heat); + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 1, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 040054054..ea1dee654 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -262,6 +262,7 @@ container.gasCentrifuge=Gaszentrifuge container.gasFlare=Abfackelturm container.generator=Atomreaktor container.hadron=Teilchenbeschleuniger +container.heaterFirebox=Feuerbüchse container.iGenerator=Industrieller Generator container.keyForge=Schlossertisch container.launchPad=Raketenabschussrampe @@ -3328,6 +3329,7 @@ tile.hadron_power_100m.name=Teilchenbeschleuniger-Stromanschluss (100MHE) tile.hadron_power_1g.name=Teilchenbeschleuniger-Stromanschluss (1GHE) tile.hadron_power_10g.name=Teilchenbeschleuniger-Stromanschluss (10GHE) tile.hazmat.name=Strahlenschutzstoff-Block +tile.heater_firebox.name=Feuerbüchse tile.hev_battery.name=Anzugs-Batterie tile.iter.name=Kernfusionsreaktor tile.ladder_aluminium.name=Aluminiumleiter diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index fdd5061c8..c0350594e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -452,6 +452,7 @@ container.gasCentrifuge=Gas Centrifuge container.gasFlare=Flare Stack container.generator=Nuclear Reactor container.hadron=Particle Accelerator +container.heaterFirebox=Firebox container.iGenerator=Industrial Generator container.keyForge=Locksmith Table container.launchPad=Missile Launch Pad @@ -3755,6 +3756,7 @@ tile.hadron_power_100m.name=Particle Accelerator Power Plug (100MHE) tile.hadron_power_1g.name=Particle Accelerator Power Plug (1GHE) tile.hadron_power_10g.name=Particle Accelerator Power Plug (10GHE) tile.hazmat.name=Hazmat Cloth Block +tile.heater_firebox.name=Firebox tile.hev_battery.name=Suit Battery tile.iter.name=Fusion Reactor tile.ladder_aluminium.name=Aluminium Ladder diff --git a/src/main/resources/assets/hbm/models/machines/firebox.obj b/src/main/resources/assets/hbm/models/machines/firebox.obj new file mode 100644 index 000000000..51f73d851 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/firebox.obj @@ -0,0 +1,940 @@ +# Blender v2.79 (sub 0) OBJ File: 'firebox.blend' +# www.blender.org +o InnerEmpty +v 1.250000 0.750000 0.125000 +v 1.250000 0.250000 0.125000 +v 1.250000 0.750000 -0.125000 +v 1.250000 0.250000 -0.125000 +v 1.250000 0.375000 0.250000 +v 1.250000 0.375000 -0.250000 +v 1.250000 0.625000 0.250000 +v 1.250000 0.625000 -0.250000 +v 1.250000 0.875000 0.375000 +v 1.250000 0.125000 0.375000 +v 1.250000 0.875000 -0.375000 +v 1.250000 0.125000 -0.375000 +v 0.500000 0.875000 0.375000 +v 0.500000 0.125000 0.375000 +v 0.500000 0.875000 -0.375000 +v 0.500000 0.125000 -0.375000 +vt 0.586207 0.187500 +vt 0.603448 0.125000 +vt 0.603448 0.156250 +vt 0.586207 0.093750 +vt 0.655172 0.109375 +vt 0.620690 0.109375 +vt 0.689655 0.187500 +vt 0.620690 0.171875 +vt 0.655172 0.171875 +vt 0.689655 0.093750 +vt 0.672414 0.156250 +vt 0.672414 0.125000 +vt 1.000000 0.187500 +vt 0.896552 0.093750 +vt 1.000000 0.093750 +vt 0.793103 0.187500 +vt 0.896552 0.187500 +vt 0.896552 0.281250 +vt 0.793103 0.281250 +vt 0.793103 -0.000000 +vt 0.896552 -0.000000 +vt 0.793103 0.093750 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 11/1/1 6/2/1 8/3/1 +f 12/4/1 2/5/1 4/6/1 +f 9/7/1 3/8/1 1/9/1 +f 10/10/1 7/11/1 5/12/1 +f 6/2/1 12/4/1 4/6/1 +f 5/12/1 2/5/1 10/10/1 +f 7/11/1 9/7/1 1/9/1 +f 8/3/1 3/8/1 11/1/1 +f 11/13/2 16/14/2 12/15/2 +f 10/10/3 13/16/3 9/7/3 +f 13/16/4 16/14/4 15/17/4 +f 13/16/5 11/18/5 9/19/5 +f 16/14/6 10/20/6 12/21/6 +f 11/1/1 12/4/1 6/2/1 +f 12/4/1 10/10/1 2/5/1 +f 9/7/1 11/1/1 3/8/1 +f 10/10/1 9/7/1 7/11/1 +f 11/13/2 15/17/2 16/14/2 +f 10/10/3 14/22/3 13/16/3 +f 13/16/4 14/22/4 16/14/4 +f 13/16/5 15/17/5 11/18/5 +f 16/14/6 14/22/6 10/20/6 +o InnerBurning +v 1.250000 0.750000 0.125000 +v 1.250000 0.250000 0.125000 +v 1.250000 0.750000 -0.125000 +v 1.250000 0.250000 -0.125000 +v 1.250000 0.375000 0.250000 +v 1.250000 0.375000 -0.250000 +v 1.250000 0.625000 0.250000 +v 1.250000 0.625000 -0.250000 +v 1.250000 0.875000 0.375000 +v 1.250000 0.125000 0.375000 +v 1.250000 0.875000 -0.375000 +v 1.250000 0.125000 -0.375000 +v 0.500000 0.875000 0.375000 +v 0.500000 0.125000 0.375000 +v 0.500000 0.875000 -0.375000 +v 0.500000 0.125000 -0.375000 +v 1.250000 0.125000 0.375000 +v 1.250000 0.125000 -0.375000 +v 0.500000 0.125000 0.375000 +v 0.500000 0.250000 -0.375000 +v 1.250000 0.125000 0.250000 +v 1.250000 0.187500 0.125000 +v 1.250000 0.187500 -0.000000 +v 1.250000 0.125000 -0.125000 +v 1.250000 0.125000 -0.250000 +v 0.500000 0.187500 0.250000 +v 0.500000 0.250000 0.125000 +v 0.500000 0.250000 -0.000000 +v 0.500000 0.187500 -0.125000 +v 0.500000 0.250000 -0.250000 +v 0.625000 0.187500 0.375000 +v 0.750000 0.187500 0.375000 +v 0.875000 0.250000 0.375000 +v 1.000000 0.187500 0.375000 +v 1.125000 0.125000 0.375000 +v 1.125000 0.125000 -0.375000 +v 1.000000 0.187500 -0.375000 +v 0.875000 0.125000 -0.375000 +v 0.750000 0.187500 -0.375000 +v 0.625000 0.187500 -0.375000 +v 1.125000 0.187500 0.250000 +v 1.000000 0.187500 0.250000 +v 0.875000 0.250000 0.250000 +v 0.750000 0.250000 0.250000 +v 0.625000 0.187500 0.250000 +v 1.125000 0.187500 0.125000 +v 1.000000 0.250000 0.125000 +v 0.875000 0.250000 0.125000 +v 0.750000 0.312500 0.125000 +v 0.625000 0.250000 0.125000 +v 1.125000 0.187500 -0.000000 +v 1.000000 0.250000 -0.000000 +v 0.875000 0.312500 -0.000000 +v 0.750000 0.312500 -0.000000 +v 0.625000 0.250000 -0.000000 +v 1.125000 0.187500 -0.125000 +v 1.000000 0.250000 -0.125000 +v 0.875000 0.250000 -0.125000 +v 0.750000 0.250000 -0.125000 +v 0.625000 0.250000 -0.125000 +v 1.125000 0.187500 -0.250000 +v 1.000000 0.187500 -0.250000 +v 0.875000 0.187500 -0.250000 +v 0.750000 0.187500 -0.250000 +v 0.625000 0.250000 -0.250000 +vt 0.586207 0.468750 +vt 0.603448 0.406250 +vt 0.603448 0.437500 +vt 0.586207 0.375000 +vt 0.655172 0.390625 +vt 0.620690 0.390625 +vt 0.689655 0.468750 +vt 0.620690 0.453125 +vt 0.655172 0.453125 +vt 0.689655 0.375000 +vt 0.672414 0.437500 +vt 0.672414 0.406250 +vt 1.000000 0.468750 +vt 0.896552 0.375000 +vt 1.000000 0.375000 +vt 0.793103 0.468750 +vt 0.896552 0.468750 +vt 0.879310 0.359375 +vt 0.896552 0.359375 +vt 0.879310 0.375000 +vt 0.793103 0.359375 +vt 0.810345 0.359375 +vt 0.793103 0.375000 +vt 0.827586 0.359375 +vt 0.810345 0.375000 +vt 0.844828 0.359375 +vt 0.827586 0.375000 +vt 0.862069 0.359375 +vt 0.844828 0.375000 +vt 0.862069 0.375000 +vt 0.793103 0.281250 +vt 0.810345 0.281250 +vt 0.793103 0.296875 +vt 0.810345 0.296875 +vt 0.793103 0.312500 +vt 0.810345 0.312500 +vt 0.793103 0.328125 +vt 0.810345 0.343750 +vt 0.793103 0.343750 +vt 0.827586 0.281250 +vt 0.827586 0.312500 +vt 0.810345 0.328125 +vt 0.827586 0.328125 +vt 0.827586 0.343750 +vt 0.844828 0.281250 +vt 0.827586 0.296875 +vt 0.844828 0.296875 +vt 0.844828 0.312500 +vt 0.844828 0.328125 +vt 0.862069 0.296875 +vt 0.862069 0.312500 +vt 0.862069 0.328125 +vt 0.844828 0.343750 +vt 0.862069 0.343750 +vt 0.879310 0.281250 +vt 0.862069 0.281250 +vt 0.879310 0.296875 +vt 0.879310 0.312500 +vt 0.879310 0.328125 +vt 0.879310 0.343750 +vt 0.896552 0.296875 +vt 0.896552 0.312500 +vt 0.896552 0.328125 +vt 0.896552 0.562500 +vt 0.793103 0.562500 +vt 0.896552 0.281250 +vt 0.896552 0.375000 +vt 0.896552 0.343750 +vt 0.793103 0.375000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.8944 -0.4472 +vn -0.4472 0.8944 0.0000 +vn 0.0000 0.8944 0.4472 +vn 0.0000 1.0000 0.0000 +vn 0.4082 0.8165 0.4082 +vn 0.4472 0.8944 0.0000 +vn -0.4082 0.8165 0.4082 +vn 0.4082 0.8165 -0.4082 +vn 0.0000 -1.0000 0.0000 +vn -0.4082 0.8165 -0.4082 +s off +f 27/23/7 22/24/7 24/25/7 +f 28/26/7 18/27/7 20/28/7 +f 25/29/7 19/30/7 17/31/7 +f 26/32/7 23/33/7 21/34/7 +f 22/24/7 28/26/7 20/28/7 +f 21/34/7 18/27/7 26/32/7 +f 23/33/7 25/29/7 17/31/7 +f 24/25/7 19/30/7 27/23/7 +f 27/35/8 32/36/8 28/37/8 +f 26/32/9 29/38/9 25/29/9 +f 29/38/10 32/36/10 31/39/10 +f 81/40/11 56/41/11 46/42/11 +f 47/43/12 61/44/12 35/45/12 +f 66/46/13 42/47/13 61/44/13 +f 71/48/14 43/49/14 66/46/14 +f 71/48/14 76/50/14 44/51/14 +f 76/50/12 81/40/12 45/52/12 +f 33/53/14 37/54/14 51/55/14 +f 51/55/15 57/56/15 50/57/15 +f 58/58/16 49/59/16 50/57/16 +f 49/59/17 60/60/17 48/61/17 +f 48/61/17 60/60/17 61/44/17 +f 38/62/15 57/56/15 37/54/15 +f 57/56/13 63/63/13 58/58/13 +f 58/58/15 63/63/15 59/64/15 +f 59/64/16 64/65/16 65/66/16 +f 39/67/14 62/68/14 38/62/14 +f 67/69/16 63/63/16 62/68/16 +f 63/63/16 68/70/16 69/71/16 +f 64/65/15 69/71/15 65/66/15 +f 66/46/17 60/60/17 65/66/17 +f 39/67/14 72/72/14 67/69/14 +f 72/72/16 68/70/16 67/69/16 +f 68/70/16 73/73/16 69/71/16 +f 74/74/11 70/75/11 69/71/11 +f 70/75/11 75/76/11 76/50/11 +f 41/77/16 72/72/16 40/78/16 +f 72/72/16 77/79/16 73/73/16 +f 78/80/11 74/74/11 73/73/11 +f 79/81/11 75/76/11 74/74/11 +f 75/76/18 80/82/18 81/40/18 +f 41/77/18 52/83/18 77/79/18 +f 77/79/18 52/83/18 53/84/18 +f 53/84/14 79/81/14 78/80/14 +f 79/81/11 54/85/11 80/82/11 +f 80/82/18 56/41/18 81/40/18 +f 29/38/19 27/86/19 25/87/19 +f 71/48/12 65/66/12 70/75/12 +f 51/55/15 37/54/15 57/56/15 +f 52/83/14 41/77/14 34/88/14 +f 46/42/16 56/41/16 36/89/16 +f 80/82/16 54/85/16 55/90/16 +f 73/73/11 77/79/11 78/80/11 +f 63/63/16 57/56/16 62/68/16 +f 59/64/14 63/63/14 64/65/14 +f 50/57/14 57/56/14 58/58/14 +f 61/44/14 47/43/14 48/61/14 +f 35/45/13 61/44/13 42/47/13 +f 44/51/20 76/50/20 45/52/20 +f 45/52/13 81/40/13 46/42/13 +f 81/40/14 76/50/14 75/76/14 +f 69/71/11 73/73/11 74/74/11 +f 69/71/13 64/65/13 63/63/13 +f 76/50/12 71/48/12 70/75/12 +f 65/66/13 60/60/13 59/64/13 +f 65/66/14 69/71/14 70/75/14 +f 53/84/14 78/80/14 77/79/14 +f 72/72/18 39/67/18 40/78/18 +f 27/23/7 28/26/7 22/24/7 +f 28/26/7 26/32/7 18/27/7 +f 25/29/7 27/23/7 19/30/7 +f 26/32/7 25/29/7 23/33/7 +f 27/35/8 31/39/8 32/36/8 +f 26/32/9 30/91/9 29/38/9 +f 29/38/10 30/91/10 32/36/10 +f 66/46/13 43/49/13 42/47/13 +f 71/48/14 44/51/14 43/49/14 +f 58/58/16 59/64/16 49/59/16 +f 49/59/14 59/64/14 60/60/14 +f 38/62/14 62/68/14 57/56/14 +f 39/67/14 67/69/14 62/68/14 +f 67/69/16 68/70/16 63/63/16 +f 66/46/17 61/44/17 60/60/17 +f 72/72/16 73/73/16 68/70/16 +f 74/74/11 75/76/11 70/75/11 +f 41/77/16 77/79/16 72/72/16 +f 78/80/11 79/81/11 74/74/11 +f 79/81/11 80/82/11 75/76/11 +f 53/84/20 54/85/20 79/81/20 +f 80/82/14 55/90/14 56/41/14 +f 29/38/19 31/39/19 27/86/19 +f 71/48/12 66/46/12 65/66/12 +o Door +v 1.375000 0.750000 0.125000 +v 1.375000 0.250000 0.125000 +v 1.375000 0.750000 -0.125000 +v 1.375000 0.250000 -0.125000 +v 1.375000 0.375000 0.250000 +v 1.375000 0.375000 -0.250000 +v 1.375000 0.625000 0.250000 +v 1.375000 0.625000 -0.250000 +v 1.312500 0.750000 -0.125000 +v 1.312500 0.750000 0.125000 +v 1.312500 0.375000 -0.250000 +v 1.312500 0.625000 -0.250000 +v 1.312500 0.250000 0.125000 +v 1.312500 0.250000 -0.125000 +v 1.312500 0.625000 0.250000 +v 1.312500 0.375000 0.250000 +v 1.375000 0.875000 0.187500 +v 1.375000 0.125000 0.187500 +v 1.375000 0.875000 -0.187500 +v 1.375000 0.125000 -0.187500 +v 1.375000 0.312500 0.375000 +v 1.375000 0.312500 -0.375000 +v 1.375000 0.687500 0.375000 +v 1.375000 0.687500 -0.375000 +v 1.437500 0.875000 0.187500 +v 1.437500 0.125000 0.187500 +v 1.437500 0.875000 -0.187500 +v 1.437500 0.125000 -0.187500 +v 1.437500 0.312500 0.375000 +v 1.437500 0.312500 -0.375000 +v 1.437500 0.687500 0.375000 +v 1.437500 0.687500 -0.375000 +v 1.500000 0.750000 0.125000 +v 1.500000 0.250000 0.125000 +v 1.500000 0.750000 -0.125000 +v 1.500000 0.250000 -0.125000 +v 1.500000 0.375000 0.250000 +v 1.500000 0.375000 -0.250000 +v 1.500000 0.625000 0.250000 +v 1.500000 0.625000 -0.250000 +v 1.625000 0.687500 -0.126000 +v 1.625000 0.312500 -0.126000 +v 1.625000 0.687500 -0.188500 +v 1.625000 0.312500 -0.188500 +v 1.500000 0.687500 -0.126000 +v 1.500000 0.312500 -0.126000 +v 1.500000 0.687500 -0.188500 +v 1.500000 0.312500 -0.188500 +v 1.500000 0.375000 -0.126000 +v 1.500000 0.375000 -0.188500 +v 1.500000 0.625000 -0.126000 +v 1.500000 0.625000 -0.188500 +v 1.562500 0.375000 -0.126000 +v 1.562500 0.375000 -0.188500 +v 1.562500 0.625000 -0.126000 +v 1.562500 0.625000 -0.188500 +vt 0.465517 0.218750 +vt 0.508621 0.234375 +vt 0.474138 0.234375 +vt 0.439655 0.171875 +vt 0.491379 0.156250 +vt 0.508621 0.203125 +vt 0.431034 0.156250 +vt 0.431034 0.171875 +vt 0.431034 0.250000 +vt 0.439655 0.265625 +vt 0.431034 0.265625 +vt 0.431034 0.312500 +vt 0.439655 0.343750 +vt 0.431034 0.343750 +vt 0.431034 0.218750 +vt 0.439655 0.250000 +vt 0.431034 0.296875 +vt 0.439655 0.312500 +vt 0.431034 0.203125 +vt 0.439655 0.218750 +vt 0.439655 0.296875 +vt 0.439655 0.203125 +vt 0.439655 0.289062 +vt 0.456897 0.250000 +vt 0.456897 0.281250 +vt 0.517241 0.312500 +vt 0.474138 0.296875 +vt 0.508621 0.296875 +vt 0.543103 0.242188 +vt 0.525862 0.281250 +vt 0.525862 0.250000 +vt 0.543103 0.289062 +vt 0.465517 0.312500 +vt 0.439655 0.242188 +vt 0.551724 0.179688 +vt 0.543103 0.156250 +vt 0.551724 0.156250 +vt 0.551724 0.250000 +vt 0.543103 0.226562 +vt 0.551724 0.226562 +vt 0.551724 0.437500 +vt 0.543103 0.390625 +vt 0.551724 0.390625 +vt 0.551724 0.296875 +vt 0.543103 0.250000 +vt 0.543103 0.367188 +vt 0.551724 0.367188 +vt 0.543103 0.320312 +vt 0.551724 0.320312 +vt 0.543103 0.296875 +vt 0.543103 0.179688 +vt 0.543103 0.382812 +vt 0.525862 0.343750 +vt 0.543103 0.335938 +vt 0.508621 0.390625 +vt 0.525862 0.375000 +vt 0.474138 0.390625 +vt 0.517241 0.406250 +vt 0.465517 0.406250 +vt 0.439655 0.382812 +vt 0.456897 0.343750 +vt 0.439655 0.335938 +vt 0.474138 0.328125 +vt 0.508621 0.328125 +vt 0.465517 0.312500 +vt 0.517241 0.312500 +vt 0.568965 0.171875 +vt 0.577586 0.218750 +vt 0.568965 0.218750 +vt 0.577586 0.156250 +vt 0.577586 0.171875 +vt 0.568965 0.234375 +vt 0.560345 0.226562 +vt 0.560345 0.210938 +vt 0.551724 0.234375 +vt 0.560345 0.234375 +vt 0.560345 0.156250 +vt 0.551724 0.164062 +vt 0.551724 0.156250 +vt 0.551724 0.179688 +vt 0.560345 0.179688 +vt 0.560345 0.164062 +vt 0.568965 0.156250 +vt 0.586207 0.210938 +vt 0.586207 0.164062 +vt 0.586207 0.226562 +vt 0.577586 0.234375 +vt 0.517241 0.218750 +vt 0.491379 0.218750 +vt 0.456897 0.218750 +vt 0.456897 0.156250 +vt 0.508621 0.171875 +vt 0.439655 0.156250 +vt 0.543103 0.437500 +vt 0.456897 0.375000 +vt 0.551724 0.226562 +vt 0.551724 0.210938 +vt 0.586207 0.179688 +vt 0.586207 0.156250 +vt 0.586207 0.234375 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.8944 0.0000 -0.4472 +vn 0.9045 0.3015 -0.3015 +vn 0.8944 0.4472 0.0000 +vn 0.9045 0.3015 0.3015 +vn 0.8944 0.0000 0.4472 +vn 0.9045 -0.3015 0.3015 +vn 0.8944 -0.4472 0.0000 +vn 0.9045 -0.3015 -0.3015 +vn 1.0000 0.0000 0.0000 +s off +f 101/92/21 83/93/21 85/94/21 +f 92/95/21 94/96/21 96/97/21 +f 85/98/22 92/95/22 87/99/22 +f 82/100/23 96/101/23 88/102/23 +f 83/103/24 95/104/24 85/105/24 +f 84/106/25 91/107/25 82/100/25 +f 86/108/26 94/109/26 83/103/26 +f 89/110/27 90/111/27 84/106/27 +f 88/102/28 97/112/28 86/108/28 +f 87/99/29 93/113/29 89/110/29 +f 105/114/21 87/115/21 89/116/21 +f 98/117/21 84/118/21 82/119/21 +f 102/120/21 88/121/21 86/122/21 +f 104/123/21 82/119/21 88/121/21 +f 100/124/21 89/116/21 84/118/21 +f 83/93/21 102/120/21 86/122/21 +f 103/125/21 85/94/21 87/115/21 +f 103/126/22 109/127/22 101/128/22 +f 100/129/27 113/130/27 105/131/27 +f 101/132/24 107/133/24 99/134/24 +f 98/135/25 108/136/25 100/129/25 +f 99/134/26 110/137/26 102/138/26 +f 102/138/28 112/139/28 104/140/28 +f 104/140/23 106/141/23 98/135/23 +f 105/131/29 111/142/29 103/126/29 +f 113/143/30 119/144/30 111/145/30 +f 113/143/31 116/146/31 121/147/31 +f 114/148/32 108/149/32 106/150/32 +f 112/151/33 114/148/33 106/150/33 +f 118/152/34 112/151/34 110/153/34 +f 110/153/35 115/154/35 118/152/35 +f 117/155/36 107/156/36 109/157/36 +f 111/145/37 117/155/37 109/157/37 +f 118/152/38 117/155/38 121/147/38 +f 123/158/38 124/159/38 122/160/38 +f 123/158/24 129/161/24 125/162/24 +f 124/159/25 126/163/25 122/160/25 +f 126/163/28 136/164/28 122/160/28 +f 136/165/28 123/158/28 122/160/28 +f 133/166/24 136/164/24 132/167/24 +f 130/168/25 135/169/25 131/170/25 +f 136/165/21 135/171/21 134/172/21 +f 134/173/28 127/174/28 123/158/28 +f 125/162/29 137/175/29 124/159/29 +f 129/161/29 135/176/29 125/162/29 +f 137/177/29 128/178/29 124/159/29 +f 101/92/21 99/179/21 83/93/21 +f 96/97/21 91/180/21 90/181/21 +f 90/181/21 93/113/21 92/95/21 +f 92/95/21 95/182/21 94/96/21 +f 94/96/21 97/183/21 96/97/21 +f 96/97/21 90/181/21 92/95/21 +f 85/98/22 95/184/22 92/95/22 +f 82/100/23 91/107/23 96/101/23 +f 83/103/24 94/109/24 95/104/24 +f 84/106/25 90/111/25 91/107/25 +f 86/108/26 97/112/26 94/109/26 +f 89/110/27 93/113/27 90/111/27 +f 88/102/28 96/101/28 97/112/28 +f 87/99/29 92/95/29 93/113/29 +f 105/114/21 103/125/21 87/115/21 +f 98/117/21 100/124/21 84/118/21 +f 102/120/21 104/123/21 88/121/21 +f 104/123/21 98/117/21 82/119/21 +f 100/124/21 105/114/21 89/116/21 +f 83/93/21 99/179/21 102/120/21 +f 103/125/21 101/92/21 85/94/21 +f 103/126/22 111/142/22 109/127/22 +f 100/129/27 108/136/27 113/130/27 +f 101/132/24 109/185/24 107/133/24 +f 98/135/25 106/141/25 108/136/25 +f 99/134/26 107/133/26 110/137/26 +f 102/138/28 110/137/28 112/139/28 +f 104/140/23 112/139/23 106/141/23 +f 105/131/29 113/130/29 111/142/29 +f 113/143/30 121/147/30 119/144/30 +f 113/143/31 108/149/31 116/146/31 +f 114/148/32 116/146/32 108/149/32 +f 112/151/33 120/186/33 114/148/33 +f 118/152/34 120/186/34 112/151/34 +f 110/153/35 107/156/35 115/154/35 +f 117/155/36 115/154/36 107/156/36 +f 111/145/37 119/144/37 117/155/37 +f 121/147/38 116/146/38 114/148/38 +f 114/148/38 120/186/38 118/152/38 +f 118/152/38 115/154/38 117/155/38 +f 117/155/38 119/144/38 121/147/38 +f 121/147/38 114/148/38 118/152/38 +f 123/158/38 125/162/38 124/159/38 +f 123/158/24 127/174/24 129/161/24 +f 124/159/25 128/178/25 126/163/25 +f 126/163/28 132/167/28 136/164/28 +f 136/165/28 134/172/28 123/158/28 +f 133/166/24 137/187/24 136/164/24 +f 130/168/25 134/173/25 135/169/25 +f 136/165/21 137/188/21 135/171/21 +f 134/173/28 130/168/28 127/174/28 +f 125/162/29 135/189/29 137/175/29 +f 129/161/29 131/190/29 135/176/29 +f 137/177/29 133/191/29 128/178/29 +o Main +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v 1.500000 1.000000 1.500000 +v -1.500000 1.000000 -1.500000 +v -1.500000 1.000000 1.500000 +v 1.500000 1.000000 -1.500000 +v 1.375000 0.125000 1.500000 +v -1.375000 0.125000 -1.500000 +v -1.375000 0.125000 1.500000 +v 1.375000 0.125000 -1.500000 +v 1.375000 0.875000 1.500000 +v -1.375000 0.875000 -1.500000 +v -1.375000 0.875000 1.500000 +v 1.375000 0.875000 -1.500000 +v 1.500000 0.125000 -1.375000 +v -1.500000 0.125000 1.375000 +v 1.500000 0.125000 1.375000 +v -1.500000 0.125000 -1.375000 +v 1.500000 0.875000 -1.375000 +v -1.500000 0.875000 1.375000 +v 1.500000 0.875000 1.375000 +v -1.500000 0.875000 -1.375000 +v 1.375000 0.125000 1.375000 +v -1.375000 0.125000 1.375000 +v 1.375000 0.875000 1.375000 +v -1.375000 0.875000 1.375000 +v -1.375000 0.125000 -1.375000 +v 1.375000 0.125000 -1.375000 +v -1.375000 0.875000 -1.375000 +v 1.375000 0.875000 -1.375000 +v 1.375000 0.750000 0.125000 +v 1.375000 0.250000 0.125000 +v 1.375000 0.750000 -0.125000 +v 1.375000 0.250000 -0.125000 +v 1.375000 0.375000 0.250000 +v 1.375000 0.375000 -0.250000 +v 1.375000 0.625000 0.250000 +v 1.375000 0.625000 -0.250000 +v 1.250000 0.750000 0.125000 +v 1.250000 0.250000 0.125000 +v 1.250000 0.750000 -0.125000 +v 1.250000 0.250000 -0.125000 +v 1.250000 0.375000 0.250000 +v 1.250000 0.375000 -0.250000 +v 1.250000 0.625000 0.250000 +v 1.250000 0.625000 -0.250000 +v -0.500000 1.000000 0.500000 +v 0.500000 1.000000 0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v -0.437500 1.000000 0.437500 +v 0.437500 1.000000 0.437500 +v -0.437500 1.000000 -0.437500 +v 0.437500 1.000000 -0.437500 +v -0.500000 0.937500 -0.500000 +v -0.500000 0.937500 0.500000 +v 0.500000 0.937500 0.500000 +v 0.500000 0.937500 -0.500000 +v -0.437500 0.937500 -0.437500 +v -0.437500 0.937500 0.437500 +v 0.437500 0.937500 0.437500 +v 0.437500 0.937500 -0.437500 +vt 0.413793 0.000000 +vt 0.000000 0.375000 +vt 0.000000 -0.000000 +vt -0.000000 0.890625 +vt 0.017241 0.984375 +vt -0.000000 0.984375 +vt 0.000000 0.890625 +vt 0.017241 0.984375 +vt 0.000000 0.984375 +vt -0.000000 0.890625 +vt 0.017241 0.984375 +vt -0.000000 0.984375 +vt 0.000000 0.890625 +vt 0.017241 0.984375 +vt 0.000000 0.984375 +vt 0.413793 0.375000 +vt 0.017241 0.390625 +vt 0.000000 0.375000 +vt 0.017241 0.484375 +vt 0.000000 0.500000 +vt 0.413793 0.500000 +vt 0.396552 0.390625 +vt 0.413793 0.375000 +vt 0.413793 0.500000 +vt 0.396552 0.390625 +vt 0.413793 0.375000 +vt 0.017241 0.390625 +vt 0.000000 0.375000 +vt 0.017241 0.484375 +vt 0.000000 0.500000 +vt 0.413793 0.500000 +vt 0.396552 0.390625 +vt 0.017241 0.484375 +vt 0.000000 0.500000 +vt 0.413793 0.500000 +vt 0.413793 0.375000 +vt 0.017241 0.390625 +vt 0.396552 0.390625 +vt 0.000000 0.375000 +vt 0.017241 0.484375 +vt 0.000000 0.500000 +vt 0.017241 0.390625 +vt 0.396552 0.890625 +vt 0.017241 0.890625 +vt 0.413793 0.984375 +vt 0.413793 0.890625 +vt 0.017241 1.000000 +vt 0.396552 0.984375 +vt 0.396552 1.000000 +vt 0.396552 0.875000 +vt 0.017241 0.875000 +vt 0.396552 0.890625 +vt 0.017241 0.890625 +vt 0.017241 1.000000 +vt 0.396552 0.984375 +vt 0.396552 1.000000 +vt 0.396552 0.875000 +vt 0.017241 0.875000 +vt 0.413793 0.984375 +vt 0.413793 0.890625 +vt 0.413793 0.890625 +vt 0.396552 0.984375 +vt 0.396552 0.890625 +vt 0.017241 0.875000 +vt 0.396552 0.875000 +vt 0.017241 1.000000 +vt 0.396552 1.000000 +vt 0.017241 0.890625 +vt 0.413793 0.890625 +vt 0.396552 0.984375 +vt 0.396552 0.890625 +vt 0.017241 0.875000 +vt 0.396552 0.875000 +vt 0.017241 1.000000 +vt 0.396552 1.000000 +vt 0.017241 0.890625 +vt 0.172414 0.953125 +vt 0.241379 0.953125 +vt 0.189655 0.906250 +vt 0.224138 0.968750 +vt 0.172414 0.921875 +vt 0.224138 0.906250 +vt 0.241379 0.921875 +vt 0.189655 0.968750 +vt 0.413793 0.265625 +vt 0.431034 0.296875 +vt 0.413793 0.296875 +vt 0.431034 0.312500 +vt 0.413793 0.312500 +vt 0.413793 0.203125 +vt 0.431034 0.218750 +vt 0.413793 0.218750 +vt 0.431034 0.343750 +vt 0.413793 0.343750 +vt 0.431034 0.250000 +vt 0.413793 0.250000 +vt 0.413793 0.156250 +vt 0.431034 0.171875 +vt 0.413793 0.171875 +vt 0.431034 0.265625 +vt 0.431034 0.203125 +vt 0.275862 0.625000 +vt 0.431034 0.156250 +vt 0.568965 0.148438 +vt 0.568965 0.156250 +vt 0.275862 0.750000 +vt 0.413793 0.875000 +vt 0.137931 0.750000 +vt 0.000000 0.875000 +vt 0.439655 0.023438 +vt 0.560345 0.132812 +vt 0.439655 0.132812 +vt 0.560345 0.023438 +vt 0.568965 0.132812 +vt 0.568965 -0.000000 +vt 0.431034 0.007812 +vt 0.431034 -0.000000 +vt 0.439655 0.140625 +vt 0.431034 0.023438 +vt 0.422414 0.140625 +vt 0.422414 0.015625 +vt 0.431034 0.148438 +vt 0.577586 0.015625 +vt 0.577586 0.140625 +vt 0.560345 0.015625 +vt 0.568965 0.007812 +vt 0.586207 0.140625 +vt 0.586207 0.015625 +vt 0.413793 0.015625 +vt 0.413793 0.140625 +vt 0.137931 0.625000 +vt 0.396552 0.484375 +vt 0.396552 0.484375 +vt 0.396552 0.484375 +vt 0.396552 0.484375 +vt 0.413793 0.984375 +vt 0.413793 0.984375 +vt 0.431034 0.156250 +vt 0.568965 0.023438 +vt 0.560345 0.140625 +vt 0.431034 0.132812 +vt 0.439655 0.015625 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +s off +f 140/192/39 139/193/39 138/194/39 +f 148/195/40 165/196/40 152/197/40 +f 149/198/41 169/199/41 153/200/41 +f 156/201/42 164/202/42 160/203/42 +f 157/204/43 168/205/43 161/206/43 +f 138/207/41 157/208/41 140/209/41 +f 140/209/41 161/210/41 143/211/41 +f 143/212/42 147/213/42 140/214/42 +f 144/215/41 155/216/41 138/207/41 +f 139/217/43 148/218/43 138/219/43 +f 138/219/43 152/220/43 144/221/43 +f 161/210/41 144/215/41 143/211/41 +f 152/220/43 142/222/43 144/221/43 +f 142/222/43 146/223/43 139/217/43 +f 139/193/40 160/224/40 142/225/40 +f 160/224/40 145/226/40 142/225/40 +f 141/227/40 156/228/40 139/193/40 +f 145/226/40 154/229/40 141/227/40 +f 141/230/42 153/231/42 145/232/42 +f 153/231/42 143/212/42 145/232/42 +f 140/214/42 149/233/42 141/230/42 +f 162/234/43 165/196/43 163/235/43 +f 150/236/41 162/234/41 146/237/41 +f 152/238/39 164/239/39 150/240/39 +f 146/241/44 163/235/44 148/242/44 +f 166/243/42 169/199/42 167/244/42 +f 153/245/39 168/246/39 151/247/39 +f 147/248/44 167/244/44 149/249/44 +f 151/250/40 166/243/40 147/251/40 +f 155/252/42 165/253/42 163/254/42 +f 163/254/44 157/255/44 155/256/44 +f 161/257/39 165/253/39 159/258/39 +f 163/254/41 168/205/41 166/259/41 +f 154/260/43 169/261/43 167/262/43 +f 167/262/44 156/263/44 154/264/44 +f 160/265/39 169/261/39 158/266/39 +f 162/267/40 176/268/40 164/202/40 +f 177/269/40 167/262/40 169/261/40 +f 167/262/40 171/270/40 162/267/40 +f 164/202/40 172/271/40 169/261/40 +f 171/270/40 174/272/40 162/267/40 +f 173/273/40 167/262/40 175/274/40 +f 172/271/40 177/269/40 169/261/40 +f 170/275/40 164/202/40 176/268/40 +f 177/276/43 183/277/43 175/278/43 +f 175/278/45 181/279/45 173/280/45 +f 176/281/46 178/282/46 170/283/46 +f 173/280/44 179/284/44 171/285/44 +f 170/283/39 180/286/39 172/287/39 +f 171/288/47 182/289/47 174/290/47 +f 172/287/48 185/291/48 177/276/48 +f 174/290/42 184/292/42 176/281/42 +f 189/293/44 142/225/44 145/226/44 +f 186/294/40 194/295/40 188/296/40 +f 188/297/44 145/226/44 143/298/44 +f 186/299/44 143/298/44 144/300/44 +f 191/301/44 192/302/44 190/303/44 +f 193/304/42 198/305/42 192/302/42 +f 189/306/41 196/307/41 187/308/41 +f 192/302/41 199/309/41 190/303/41 +f 200/310/44 195/311/44 196/312/44 +f 199/309/44 194/295/44 195/313/44 +f 198/305/44 197/314/44 194/315/44 +f 201/316/44 196/307/44 197/317/44 +f 190/303/43 200/310/43 191/301/43 +f 188/318/43 197/314/43 189/319/43 +f 187/320/42 195/311/42 186/321/42 +f 191/301/40 201/316/40 193/304/40 +f 186/299/44 142/225/44 187/322/44 +f 140/192/39 141/227/39 139/193/39 +f 148/195/40 163/235/40 165/196/40 +f 149/198/41 167/244/41 169/199/41 +f 156/201/42 162/267/42 164/202/42 +f 157/204/43 166/259/43 168/205/43 +f 138/207/41 155/216/41 157/208/41 +f 140/209/41 157/208/41 161/210/41 +f 143/212/42 151/323/42 147/213/42 +f 144/215/41 159/324/41 155/216/41 +f 139/217/43 146/223/43 148/218/43 +f 138/219/43 148/218/43 152/220/43 +f 161/210/41 159/324/41 144/215/41 +f 152/220/43 150/325/43 142/222/43 +f 142/222/43 150/325/43 146/223/43 +f 139/193/40 156/228/40 160/224/40 +f 160/224/40 158/326/40 145/226/40 +f 141/227/40 154/229/40 156/228/40 +f 145/226/40 158/326/40 154/229/40 +f 141/230/42 149/233/42 153/231/42 +f 153/231/42 151/323/42 143/212/42 +f 140/214/42 147/213/42 149/233/42 +f 162/234/43 164/239/43 165/196/43 +f 150/236/41 164/239/41 162/234/41 +f 152/238/39 165/196/39 164/239/39 +f 146/241/44 162/234/44 163/235/44 +f 166/243/42 168/246/42 169/199/42 +f 153/245/39 169/199/39 168/246/39 +f 147/248/44 166/243/44 167/244/44 +f 151/250/40 168/246/40 166/243/40 +f 155/252/42 159/327/42 165/253/42 +f 163/254/44 166/259/44 157/255/44 +f 161/257/39 168/205/39 165/253/39 +f 163/254/41 165/253/41 168/205/41 +f 154/260/43 158/328/43 169/261/43 +f 167/262/44 162/267/44 156/263/44 +f 160/265/39 164/202/39 169/261/39 +f 162/267/40 174/272/40 176/268/40 +f 177/269/40 175/274/40 167/262/40 +f 167/262/40 173/273/40 171/270/40 +f 164/202/40 170/275/40 172/271/40 +f 177/276/43 185/291/43 183/277/43 +f 175/278/45 183/277/45 181/279/45 +f 176/281/46 184/292/46 178/282/46 +f 173/280/44 181/279/44 179/284/44 +f 170/283/39 178/282/39 180/286/39 +f 171/288/47 179/329/47 182/289/47 +f 172/287/48 180/286/48 185/291/48 +f 174/290/42 182/289/42 184/292/42 +f 189/293/44 187/322/44 142/225/44 +f 186/294/40 195/313/40 194/295/40 +f 188/297/44 189/293/44 145/226/44 +f 186/299/44 188/297/44 143/298/44 +f 191/301/44 193/304/44 192/302/44 +f 193/304/42 201/330/42 198/305/42 +f 189/306/41 197/317/41 196/307/41 +f 192/302/41 198/331/41 199/309/41 +f 200/310/44 199/332/44 195/311/44 +f 199/309/44 198/331/44 194/295/44 +f 198/305/44 201/330/44 197/314/44 +f 201/316/44 200/333/44 196/307/44 +f 190/303/43 199/332/43 200/310/43 +f 188/318/43 194/315/43 197/314/43 +f 187/320/42 196/312/42 195/311/42 +f 191/301/40 200/333/40 201/316/40 +f 186/299/44 144/300/44 142/225/44 diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_firebox.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_firebox.png new file mode 100644 index 0000000000000000000000000000000000000000..8674655ef77eae7708d5898f814adbc330512069 GIT binary patch literal 1876 zcmb_ceLT~79RF?&i}Ns&Bvd-2E3{-y^%G;J$b@JaJxS#;5A!^FSfj$-6^S*a%QDgP zb&XCB*UA_*Or{|TlSZDiaZ}yh>veUnd)@1GpFh5z&+GGfeIDMQ*ZccP_i)FntIk&i z0H_mOaGn6b6ebKHl@)6HK~|7LA)*`zUPy%`A$QXOP*Ee`Hh9Gq^uMeOGZ5)2*RMOp zu5bW;1XMB6sESsNh)g}c>N)y}RklN_g>7$Z2~z7(-9j7ZKu&~Z?otFILiMnA1Zmy< zN{Z(IcMgGg5#z|OA*)&8`1)ZQI7T>MHgJb7Ic?K$(IBHlZAu<<$_e$X&uRD)Rl`_s z>{jgoX2RMnljlD~i4PDbH;F2Q<@NUj$IVlIl}RTEzcKL>qy3_cjn8$%#T847Xj<)q z3A#~7PZkvwVIas>JD6^P2fMJ)O~+6Z(0n9( zdctiuV`Xf{!K9rb!*Rvt$IPm$oAsx*HZ0r(jz~!<)XCr%tmIcVQR1kI zuqu^uh199YiV!VTdB>B$z=n6ORjHuRfX0x$?l$YxNjmJ&e7qczg;lh?D5n|- z&S&R=LX!_D)Zkz^Gbo2ClgTs3sPd7QZ&qJcQa~6OIo3gen{FO(d)vj$mD6~pc%{6L zoo;5Gxu>e7$m^tZvi}{j15N9*fKZR4(a|E1}GM zs_fgvWWHZ)TY_yb9(F}FRnvHVssAo26)Gz$v$*`DJga!$n`9&23SNmfOv}0_t`CF3 z(AjLZt7LmXz*cQn|0N4W=VM^?xIP*|?zHjYO+`k$22(3%e@@X~8#qloXiU zijStbr|2VnGePR3zvw+1DA;7b6ArX>W(fT`)JzwNM4{pEC@;D3vK%g#yFO$t7J{-^ zQ{h>7R;QzRR%YgY^No5vvRY4}3bDy6cT_MjbCPCczg7GeT0SLM%~r>I_we!Wc%IY6 zh8Y*=TJY07NBNt1+sS0-dDna{(9^;A`z~JW&&oLwv9WVe_k6vShG1XJ^6?jbZOqZ# z#LlNrpSFZY#Kq0i)6_UNOm(SwKd(;D_UFnaaV_aID!@2fNwFJF~_m)?n3UOKabxR<^G8{ zerb*Sk_;ugd;+&|ORE|qks$qJZoNfO2hFVnGDPYAC^nBQyIwsU6p;cKF sfYQgqmRDP=eX1nUDWB-`zrR@NG|p(1p1+^#?U~vHCwE+#L*Sv`0qtH32><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/firebox.png b/src/main/resources/assets/hbm/textures/models/machines/firebox.png new file mode 100644 index 0000000000000000000000000000000000000000..322fe0c99f04abfe746a42f5820c81e0f4e1839c GIT binary patch literal 7157 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/firebox_novent.png b/src/main/resources/assets/hbm/textures/models/machines/firebox_novent.png new file mode 100644 index 0000000000000000000000000000000000000000..489060fb9d4d61ca8b64c32cc8c1b5232913296b GIT binary patch literal 6957 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