From 8aa63082b91a7ac6e176caa88a32bb0fc635f400 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 5 Nov 2022 22:41:38 +0100 Subject: [PATCH] new centrifuge GUI, heating oven --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../hbm/blocks/machine/BlockFluidBarrel.java | 51 +- .../com/hbm/blocks/machine/HeaterOven.java | 48 ++ .../handler/nei/CentrifugeRecipeHandler.java | 2 - .../nei/GasCentrifugeRecipeHandler.java | 3 - .../container/ContainerCentrifuge.java | 74 +- .../inventory/container/ContainerFirebox.java | 6 +- .../com/hbm/inventory/gui/GUIFirebox.java | 21 +- .../inventory/gui/GUIMachineCentrifuge.java | 33 +- .../inventory/recipes/anvil/AnvilRecipes.java | 7 + .../com/hbm/items/block/ItemBlockLore.java | 44 -- src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 2 + .../render/entity/item/RenderMovingItem.java | 5 +- .../hbm/render/item/ItemRenderLibrary.java | 11 - .../hbm/render/tileentity/RenderFirebox.java | 25 +- .../render/tileentity/RenderHeatingOven.java | 82 +++ .../render/tileentity/RenderSteamEngine.java | 50 +- .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityCrucible.java | 3 + .../machine/TileEntityFireboxBase.java | 201 ++++++ .../machine/TileEntityFurnaceSteel.java | 3 + .../machine/TileEntityHeaterFirebox.java | 190 +----- .../machine/TileEntityHeaterOven.java | 133 ++++ .../machine/TileEntityMachineCentrifuge.java | 20 +- src/main/resources/assets/hbm/lang/de_DE.lang | 3 + src/main/resources/assets/hbm/lang/en_US.lang | 3 + .../hbm/models/machines/heating_oven.obj | 642 ++++++++++++++++++ src/main/resources/assets/hbm/sounds.json | 2 +- .../assets/hbm/textures/gui/centrifuge.png | Bin 2970 -> 0 bytes .../textures/gui/machine/gui_heating_oven.png | Bin 0 -> 5968 bytes .../gui/processing/gui_centrifuge.png | Bin 0 -> 2397 bytes .../textures/models/machines/heating_oven.png | Bin 0 -> 6993 bytes 33 files changed, 1347 insertions(+), 322 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/HeaterOven.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderHeatingOven.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFireboxBase.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOven.java create mode 100644 src/main/resources/assets/hbm/models/machines/heating_oven.obj delete mode 100644 src/main/resources/assets/hbm/textures/gui/centrifuge.png create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_heating_oven.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_centrifuge.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/heating_oven.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 565d1e8a2..7b9a3a4e1 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -644,6 +644,7 @@ public class ModBlocks { public static final int guiID_bomb_multi = 10; public static Block heater_firebox; + public static Block heater_oven; public static Block heater_oilburner; public static Block heater_electric; @@ -1830,6 +1831,7 @@ public class ModBlocks { 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"); + heater_oven = new HeaterOven().setBlockName("heater_oven").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); heater_oilburner = new HeaterOilburner().setBlockName("heater_oilburner").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); heater_electric = new HeaterElectric().setBlockName("heater_electric").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3016,6 +3018,7 @@ public class ModBlocks { GameRegistry.registerBlock(machine_press, machine_press.getUnlocalizedName()); GameRegistry.registerBlock(machine_epress, machine_epress.getUnlocalizedName()); register(heater_firebox); + register(heater_oven); register(heater_oilburner); register(heater_electric); register(furnace_iron); diff --git a/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java b/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java index a2b70c655..dc1e5a7da 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java +++ b/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Random; import com.hbm.blocks.IPersistentInfoProvider; +import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -31,7 +32,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockFluidBarrel extends BlockContainer implements IPersistentInfoProvider { +public class BlockFluidBarrel extends BlockContainer implements ITooltipProvider, IPersistentInfoProvider { int capacity; @@ -169,4 +170,52 @@ public class BlockFluidBarrel extends BlockContainer implements IPersistentInfoP tank.readFromNBT(persistentTag, "tank"); list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + + if(this == ModBlocks.barrel_plastic) { + list.add(EnumChatFormatting.AQUA + "Capacity: 12,000mB"); + list.add(EnumChatFormatting.YELLOW + "Cannot store hot fluids"); + list.add(EnumChatFormatting.YELLOW + "Cannot store corrosive fluids"); + list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); + } + + if(this == ModBlocks.barrel_corroded) { + list.add(EnumChatFormatting.AQUA + "Capacity: 6,000mB"); + list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); + list.add(EnumChatFormatting.GREEN + "Can store highly corrosive fluids"); + list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); + list.add(EnumChatFormatting.RED + "Leaky"); + } + + if(this == ModBlocks.barrel_iron) { + list.add(EnumChatFormatting.AQUA + "Capacity: 8,000mB"); + list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); + list.add(EnumChatFormatting.YELLOW + "Cannot store corrosive fluids properly"); + list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); + } + + if(this == ModBlocks.barrel_steel) { + list.add(EnumChatFormatting.AQUA + "Capacity: 16,000mB"); + list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); + list.add(EnumChatFormatting.GREEN + "Can store corrosive fluids"); + list.add(EnumChatFormatting.YELLOW + "Cannot store highly corrosive fluids properly"); + list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); + } + + if(this == ModBlocks.barrel_antimatter) { + list.add(EnumChatFormatting.AQUA + "Capacity: 16,000mB"); + list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); + list.add(EnumChatFormatting.GREEN + "Can store highly corrosive fluids"); + list.add(EnumChatFormatting.GREEN + "Can store antimatter"); + } + + if(this == ModBlocks.barrel_tcalloy) { + list.add(EnumChatFormatting.AQUA + "Capacity: 24,000mB"); + list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); + list.add(EnumChatFormatting.GREEN + "Can store highly corrosive fluids"); + list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); + } + } } diff --git a/src/main/java/com/hbm/blocks/machine/HeaterOven.java b/src/main/java/com/hbm/blocks/machine/HeaterOven.java new file mode 100644 index 000000000..1aa60151b --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/HeaterOven.java @@ -0,0 +1,48 @@ +package com.hbm.blocks.machine; + +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityHeaterOven; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class HeaterOven extends BlockDummyable implements ITooltipProvider { + + public HeaterOven() { + super(Material.rock); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) return new TileEntityHeaterOven(); + 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; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java index ab15345f9..599049cca 100644 --- a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java @@ -154,9 +154,7 @@ public class CentrifugeRecipeHandler extends TemplateRecipeHandler { @Override public void drawExtras(int recipe) { drawProgressBar(21, 24, 195, 55, 16, 16, 48, 7); - drawProgressBar(56, 5, 176, 0, 54, 54, 48 * 3, 0); - drawProgressBar(3, 6, 177, 55, 16, 52, 480, 7); } diff --git a/src/main/java/com/hbm/handler/nei/GasCentrifugeRecipeHandler.java b/src/main/java/com/hbm/handler/nei/GasCentrifugeRecipeHandler.java index 8fdda9e8a..add9dcf95 100644 --- a/src/main/java/com/hbm/handler/nei/GasCentrifugeRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/GasCentrifugeRecipeHandler.java @@ -9,7 +9,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.handler.nei.AnvilRecipeHandler.RecipeSet; import com.hbm.inventory.gui.GUIMachineGasCent; import com.hbm.inventory.recipes.GasCentrifugeRecipes; import com.hbm.inventory.recipes.MachineRecipes; @@ -18,8 +17,6 @@ import com.hbm.lib.RefStrings; import codechicken.nei.NEIServerUtils; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; -import codechicken.nei.recipe.TemplateRecipeHandler.RecipeTransferRect; -import codechicken.nei.recipe.TemplateRecipeHandler.RecipeTransferRectHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.inventory.GuiContainer; diff --git a/src/main/java/com/hbm/inventory/container/ContainerCentrifuge.java b/src/main/java/com/hbm/inventory/container/ContainerCentrifuge.java index 181422854..5bca723ae 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCentrifuge.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCentrifuge.java @@ -1,6 +1,7 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotMachineOutput; +import com.hbm.inventory.SlotUpgrade; import com.hbm.tileentity.machine.TileEntityMachineCentrifuge; import net.minecraft.entity.player.EntityPlayer; @@ -10,69 +11,60 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class ContainerCentrifuge extends Container { - + private TileEntityMachineCentrifuge diFurnace; - + public ContainerCentrifuge(InventoryPlayer invPlayer, TileEntityMachineCentrifuge tedf) { - + diFurnace = tedf; - - this.addSlotToContainer(new Slot(tedf, 0, 26, 17)); - this.addSlotToContainer(new Slot(tedf, 1, 26, 53)); - this.addSlotToContainer(new SlotMachineOutput(tedf, 2, 134, 17)); - this.addSlotToContainer(new SlotMachineOutput(tedf, 3, 152, 17)); - this.addSlotToContainer(new SlotMachineOutput(tedf, 4, 134, 53)); - this.addSlotToContainer(new SlotMachineOutput(tedf, 5, 152, 53)); - - 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, 84 + i * 18)); + + this.addSlotToContainer(new Slot(tedf, 0, 36, 50)); + this.addSlotToContainer(new Slot(tedf, 1, 9, 50)); + this.addSlotToContainer(new SlotMachineOutput(tedf, 2, 63, 50)); + this.addSlotToContainer(new SlotMachineOutput(tedf, 3, 83, 50)); + this.addSlotToContainer(new SlotMachineOutput(tedf, 4, 103, 50)); + this.addSlotToContainer(new SlotMachineOutput(tedf, 5, 123, 50)); + this.addSlotToContainer(new SlotUpgrade(tedf, 6, 149, 22)); + this.addSlotToContainer(new SlotUpgrade(tedf, 7, 149, 40)); + + 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, 104 + i * 18)); } } - - for(int i = 0; i < 9; i++) - { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 162)); } } - + @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) - { + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { ItemStack var3 = null; Slot var4 = (Slot) this.inventorySlots.get(par2); - - if (var4 != null && var4.getHasStack()) - { + + if(var4 != null && var4.getHasStack()) { ItemStack var5 = var4.getStack(); var3 = var5.copy(); SlotMachineOutput.checkAchievements(p_82846_1_, var5); - - if (par2 <= 5) { - if (!this.mergeItemStack(var5, 6, this.inventorySlots.size(), true)) - { + + if(par2 <= 6) { + if(!this.mergeItemStack(var5, 6, this.inventorySlots.size(), true)) { return null; } - } - else if (!this.mergeItemStack(var5, 0, 2, false)) - { + } else if(!this.mergeItemStack(var5, 0, 2, false)) { return null; } - - if (var5.stackSize == 0) - { + + if(var5.stackSize == 0) { var4.putStack((ItemStack) null); - } - else - { + } else { var4.onSlotChanged(); } } - + return var3; - } + } @Override public boolean canInteractWith(EntityPlayer player) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerFirebox.java b/src/main/java/com/hbm/inventory/container/ContainerFirebox.java index 4883cb374..ed8540c04 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerFirebox.java +++ b/src/main/java/com/hbm/inventory/container/ContainerFirebox.java @@ -1,6 +1,6 @@ package com.hbm.inventory.container; -import com.hbm.tileentity.machine.TileEntityHeaterFirebox; +import com.hbm.tileentity.machine.TileEntityFireboxBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; @@ -10,9 +10,9 @@ import net.minecraft.item.ItemStack; public class ContainerFirebox extends Container { - protected TileEntityHeaterFirebox firebox; + protected TileEntityFireboxBase firebox; - public ContainerFirebox(InventoryPlayer invPlayer, TileEntityHeaterFirebox furnace) { + public ContainerFirebox(InventoryPlayer invPlayer, TileEntityFireboxBase furnace) { this.firebox = furnace; this.firebox.openInventory(); diff --git a/src/main/java/com/hbm/inventory/gui/GUIFirebox.java b/src/main/java/com/hbm/inventory/gui/GUIFirebox.java index 66ee4be51..6091d74d2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFirebox.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFirebox.java @@ -5,8 +5,8 @@ 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 com.hbm.tileentity.machine.TileEntityFireboxBase; +import com.hbm.tileentity.machine.TileEntityHeaterOven; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; @@ -16,12 +16,13 @@ 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 firebox; + private TileEntityFireboxBase firebox; + private final ResourceLocation texture; - public GUIFirebox(InventoryPlayer invPlayer, TileEntityHeaterFirebox tedf) { + public GUIFirebox(InventoryPlayer invPlayer, TileEntityFireboxBase tedf, ResourceLocation texture) { super(new ContainerFirebox(invPlayer, tedf)); firebox = tedf; + this.texture = texture; this.xSize = 176; this.ySize = 168; @@ -38,7 +39,7 @@ public class GUIFirebox extends GuiInfoContainer { if(this.isMouseOverSlot(slot, x, y) && !slot.getHasStack()) { - List bonuses = this.firebox.burnModule.getDesc(); + List bonuses = this.firebox.getModule().getDesc(); if(!bonuses.isEmpty()) { this.func_146283_a(bonuses, x, y); @@ -47,7 +48,7 @@ public class GUIFirebox extends GuiInfoContainer { } } - this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 27, 71, 7, x, y, new String[] { String.format("%,d", firebox.heatEnergy) + " / " + String.format("%,d", firebox.maxHeatEnergy) + "TU" }); + this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 27, 71, 7, x, y, new String[] { String.format("%,d", firebox.heatEnergy) + " / " + String.format("%,d", firebox.getMaxHeat()) + "TU" }); this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 36, 71, 7, x, y, new String[] { firebox.burnHeat + "TU/t", (firebox.burnTime / 20) + "s" }); } @@ -55,7 +56,9 @@ public class GUIFirebox extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.firebox.hasCustomInventoryName() ? this.firebox.getInventoryName() : I18n.format(this.firebox.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + int color = firebox instanceof TileEntityHeaterOven ? 0xffffff : 4210752; + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, color); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } @@ -65,7 +68,7 @@ public class GUIFirebox extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - int i = firebox.heatEnergy * 69 / firebox.maxHeatEnergy; + int i = firebox.heatEnergy * 69 / firebox.getMaxHeat(); drawTexturedModalRect(guiLeft + 81, guiTop + 28, 176, 0, i, 5); int j = firebox.burnTime * 70 / Math.max(firebox.maxBurnTime, 1); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCentrifuge.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCentrifuge.java index 7bbd7da1f..1803b06f6 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCentrifuge.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCentrifuge.java @@ -13,7 +13,7 @@ import net.minecraft.util.ResourceLocation; public class GUIMachineCentrifuge extends GuiInfoContainer { - public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/centrifuge.png"); + public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_centrifuge.png"); private TileEntityMachineCentrifuge centrifuge; public GUIMachineCentrifuge(InventoryPlayer invPlayer, TileEntityMachineCentrifuge tedf) { @@ -21,7 +21,7 @@ public class GUIMachineCentrifuge extends GuiInfoContainer { centrifuge = tedf; this.xSize = 176; - this.ySize = 166; + this.ySize = 186; } @Override @@ -33,9 +33,9 @@ public class GUIMachineCentrifuge extends GuiInfoContainer { @Override protected void drawGuiContainerForegroundLayer( int i, int j) { - String name = this.centrifuge.hasCustomInventoryName() ? this.centrifuge.getInventoryName() : I18n.format(this.centrifuge.getInventoryName()); + //String name = this.centrifuge.hasCustomInventoryName() ? this.centrifuge.getInventoryName() : I18n.format(this.centrifuge.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + //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); } @@ -45,20 +45,21 @@ public class GUIMachineCentrifuge extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - if(centrifuge.hasPower()) - { - int i1 = (int)centrifuge.getPowerRemainingScaled(54); - drawTexturedModalRect(guiLeft + 8, guiTop + 69 - i1, 177, 107 - i1, 16, i1); + if(centrifuge.hasPower()) { + int i1 = (int) centrifuge.getPowerRemainingScaled(35); + drawTexturedModalRect(guiLeft + 9, guiTop + 48 - i1, 176, 35 - i1, 16, i1); } - if(centrifuge.isProcessing()) - { - int j1 = centrifuge.getCentrifugeProgressScaled(55); - drawTexturedModalRect(guiLeft + 61, guiTop + 16, 176, 0, j1, 54); - } - - if(centrifuge.hasPower() && centrifuge.canProcess()) { - drawTexturedModalRect(guiLeft + 25, guiTop + 34, 194, 54, 18, 18); + if(centrifuge.isProcessing()) { + int p = centrifuge.getCentrifugeProgressScaled(145); + + for(int i = 0; i < 4; i++) { + int h = Math.min(p, 36); + drawTexturedModalRect(guiLeft + 65 + i * 20, guiTop + 50 - h, 176, 71 - h, 12, h); + p -= h; + if(p <= 0) + break; + } } } } diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index c409e2f84..eaeceea59 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -233,6 +233,13 @@ public class AnvilRecipes { new OreDictStack(CU.ingot(), 8) }, new AnvilOutput(new ItemStack(ModBlocks.heater_firebox))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new ComparableStack(ModItems.ingot_firebrick, 16), + new OreDictStack(STEEL.plate(), 4), + new OreDictStack(CU.ingot(), 8) + }, new AnvilOutput(new ItemStack(ModBlocks.heater_oven))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new ComparableStack(ModItems.tank_steel, 4), diff --git a/src/main/java/com/hbm/items/block/ItemBlockLore.java b/src/main/java/com/hbm/items/block/ItemBlockLore.java index 1d7fb0c1e..e5b6fa081 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockLore.java +++ b/src/main/java/com/hbm/items/block/ItemBlockLore.java @@ -26,50 +26,6 @@ public class ItemBlockLore extends ItemBlockBase { list.add("Static fluid barrel"); } - if(this.field_150939_a == ModBlocks.barrel_plastic) { - list.add(EnumChatFormatting.AQUA + "Capacity: 12,000mB"); - list.add(EnumChatFormatting.YELLOW + "Cannot store hot fluids"); - list.add(EnumChatFormatting.YELLOW + "Cannot store corrosive fluids"); - list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); - } - - if(this.field_150939_a == ModBlocks.barrel_corroded) { - list.add(EnumChatFormatting.AQUA + "Capacity: 6,000mB"); - list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); - list.add(EnumChatFormatting.GREEN + "Can store highly corrosive fluids"); - list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); - list.add(EnumChatFormatting.RED + "Leaky"); - } - - if(this.field_150939_a == ModBlocks.barrel_iron) { - list.add(EnumChatFormatting.AQUA + "Capacity: 8,000mB"); - list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); - list.add(EnumChatFormatting.YELLOW + "Cannot store corrosive fluids properly"); - list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); - } - - if(this.field_150939_a == ModBlocks.barrel_steel) { - list.add(EnumChatFormatting.AQUA + "Capacity: 16,000mB"); - list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); - list.add(EnumChatFormatting.GREEN + "Can store corrosive fluids"); - list.add(EnumChatFormatting.YELLOW + "Cannot store highly corrosive fluids properly"); - list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); - } - - if(this.field_150939_a == ModBlocks.barrel_antimatter) { - list.add(EnumChatFormatting.AQUA + "Capacity: 16,000mB"); - list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); - list.add(EnumChatFormatting.GREEN + "Can store highly corrosive fluids"); - list.add(EnumChatFormatting.GREEN + "Can store antimatter"); - } - - if(this.field_150939_a == ModBlocks.barrel_tcalloy) { - list.add(EnumChatFormatting.AQUA + "Capacity: 24,000mB"); - list.add(EnumChatFormatting.GREEN + "Can store hot fluids"); - list.add(EnumChatFormatting.GREEN + "Can store highly corrosive fluids"); - list.add(EnumChatFormatting.YELLOW + "Cannot store antimatter"); - } - if(this.field_150939_a == ModBlocks.meteor_battery) { list.add("Provides infinite charge to tesla coils"); } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 17d5f20b5..a5a38fc36 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -249,6 +249,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceIron.class, new RenderFurnaceIron()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceSteel.class, new RenderFurnaceSteel()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterFirebox.class, new RenderFirebox()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterOven.class, new RenderHeatingOven()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterOilburner.class, new RenderOilburner()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterElectric.class, new RenderElectricHeater()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityStirling.class, new RenderStirling()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index fb0d05b4f..e782a814e 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -59,6 +59,7 @@ public class ResourceManager { //Heaters public static final IModelCustom heater_firebox = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/firebox.obj")); + public static final IModelCustom heater_oven = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/heating_oven.obj")); public static final IModelCustom heater_oilburner = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/oilburner.obj")); public static final IModelCustom heater_electric = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/electric_heater.obj"), false); @@ -384,6 +385,7 @@ public class ResourceManager { //Heaters public static final ResourceLocation heater_firebox_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/firebox.png"); + public static final ResourceLocation heater_oven_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/heating_oven.png"); public static final ResourceLocation heater_oilburner_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/oilburner.png"); public static final ResourceLocation heater_electric_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/electric_heater.png"); diff --git a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java index 28c2aec96..1f715b9b3 100644 --- a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java +++ b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java @@ -33,8 +33,9 @@ public class RenderMovingItem extends Render { GL11.glRotatef(90F, 1.0F, 0.0F, 0.0F); GL11.glTranslated(0.0, -0.1875, 0.0); - if(!this.renderManager.options.fancyGraphics) - GL11.glTranslated(0.0, 0.0625, 0.0); + if(!this.renderManager.options.fancyGraphics) { + GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); + } } EntityItem dummy = new EntityItem(entity.worldObj, 0, 0, 0, stack); diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 5f1b7bf47..64d0cf687 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -1297,17 +1297,6 @@ public class ItemRenderLibrary { GL11.glShadeModel(GL11.GL_FLAT); }}); - renderers.put(Item.getItemFromBlock(ModBlocks.heater_firebox), new ItemRenderBase( ) { - public void renderInventory() { - GL11.glTranslated(0, -1, 0); - GL11.glScaled(3.25, 3.25, 3.25); - } - public void renderCommon() { - bindTexture(ResourceManager.heater_firebox_tex); - ResourceManager.heater_firebox.renderPart("Main"); - ResourceManager.heater_firebox.renderPart("Door"); - }}); - renderers.put(ModItems.gear_large, new ItemRenderBase( ) { public void renderInventory() { GL11.glTranslated(0, -7, 0); diff --git a/src/main/java/com/hbm/render/tileentity/RenderFirebox.java b/src/main/java/com/hbm/render/tileentity/RenderFirebox.java index 8584eb59a..6941d70fb 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFirebox.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFirebox.java @@ -3,14 +3,18 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.machine.TileEntityHeaterFirebox; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; -public class RenderFirebox extends TileEntitySpecialRenderer { +public class RenderFirebox extends TileEntitySpecialRenderer implements IItemRendererProvider { @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -58,4 +62,23 @@ public class RenderFirebox extends TileEntitySpecialRenderer { GL11.glPopMatrix(); } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.heater_firebox); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -1, 0); + GL11.glScaled(3.25, 3.25, 3.25); + } + public void renderCommon() { + bindTexture(ResourceManager.heater_firebox_tex); + ResourceManager.heater_firebox.renderPart("Main"); + ResourceManager.heater_firebox.renderPart("Door"); + }}; + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderHeatingOven.java b/src/main/java/com/hbm/render/tileentity/RenderHeatingOven.java new file mode 100644 index 000000000..d9b4a494a --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderHeatingOven.java @@ -0,0 +1,82 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityHeaterOven; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderHeatingOven extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @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); + + TileEntityHeaterOven oven = (TileEntityHeaterOven) tile; + + bindTexture(ResourceManager.heater_oven_tex); + ResourceManager.heater_oven.renderPart("Main"); + + GL11.glPushMatrix(); + float door = oven.prevDoorAngle + (oven.doorAngle - oven.prevDoorAngle) * interp; + GL11.glTranslated(0, 0, door * 0.75D / 135D); + ResourceManager.heater_oven.renderPart("Door"); + GL11.glPopMatrix(); + + if(oven.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_oven.renderPart("InnerBurning"); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } else { + ResourceManager.heater_oven.renderPart("Inner"); + } + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.heater_oven); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -1, 0); + GL11.glScaled(3.25, 3.25, 3.25); + } + public void renderCommon() { + bindTexture(ResourceManager.heater_oven_tex); + ResourceManager.heater_oven.renderPart("Main"); + ResourceManager.heater_oven.renderPart("Door"); + }}; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderSteamEngine.java b/src/main/java/com/hbm/render/tileentity/RenderSteamEngine.java index 38d2d49f5..5157a0463 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSteamEngine.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSteamEngine.java @@ -3,12 +3,17 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; -public class RenderSteamEngine extends TileEntitySpecialRenderer { +public class RenderSteamEngine extends TileEntitySpecialRenderer implements IItemRendererProvider { @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -16,7 +21,6 @@ public class RenderSteamEngine extends TileEntitySpecialRenderer { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5D, y, z + 0.5D); GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_CULL_FACE); switch(tile.getBlockMetadata() - BlockDummyable.offset) { case 3: GL11.glRotatef(90, 0F, 1F, 0F); break; @@ -24,32 +28,38 @@ public class RenderSteamEngine extends TileEntitySpecialRenderer { case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; case 4: GL11.glRotatef(0, 0F, 1F, 0F); break; } - - GL11.glTranslated(2, 0, 0); - GL11.glShadeModel(GL11.GL_SMOOTH); double angle = System.currentTimeMillis() % 3600D; + GL11.glTranslated(2, 0, 0); + renderCommon(angle); + + GL11.glPopMatrix(); + } + + private void renderCommon(double rot) { + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.steam_engine_tex); ResourceManager.steam_engine.renderPart("Base"); GL11.glPushMatrix(); GL11.glTranslated(2, 1.375, 0); - GL11.glRotated(angle, 0, 0, -1); + GL11.glRotated(rot, 0, 0, -1); GL11.glTranslated(-2, -1.375, 0); ResourceManager.steam_engine.renderPart("Flywheel"); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glTranslated(0, 1.375, -0.5); - GL11.glRotated(angle * 2D, 1, 0, 0); + GL11.glRotated(rot * 2D, 1, 0, 0); GL11.glTranslated(0, -1.375, 0.5); ResourceManager.steam_engine.renderPart("Shaft"); GL11.glPopMatrix(); GL11.glPushMatrix(); - double sin = Math.sin(angle * Math.PI / 180D) * 0.25D - 0.25D; - double cos = Math.cos(angle * Math.PI / 180D) * 0.25D; + double sin = Math.sin(rot * Math.PI / 180D) * 0.25D - 0.25D; + double cos = Math.cos(rot * Math.PI / 180D) * 0.25D; double ang = Math.acos(cos / 1.875D); GL11.glTranslated(sin, cos, 0); GL11.glTranslated(2.25, 1.375, 0); @@ -65,9 +75,27 @@ public class RenderSteamEngine extends TileEntitySpecialRenderer { GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glPopMatrix(); } + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_steam_engine); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glRotatef(90, 0F, -1F, 0F); + GL11.glTranslated(0, -1.5, 0); + double scale = 2D; + GL11.glScaled(scale, scale, scale); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glRotatef(90, 0F, 1F, 0F); + boolean cog = item.getItemDamage() != 1; + RenderSteamEngine.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1D : 0); + }}; + } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 25468674b..963dd41a8 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -231,6 +231,7 @@ public class TileMappings { private static void putMachines() { put(TileEntityHeaterFirebox.class, "tileentity_firebox"); + put(TileEntityHeaterOven.class, "tileentity_heating_oven"); put(TileEntityHeaterOilburner.class, "tileentity_oilburner"); put(TileEntityHeaterElectric.class, "tileentity_electric_heater"); put(TileEntityFurnaceIron.class, "tileentity_furnace_iron"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index e49f93902..05ac9a1ae 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -252,6 +252,9 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } protected void tryPullHeat() { + + if(this.heat >= this.maxHeat) return; + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); if(con instanceof IHeatSource) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFireboxBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFireboxBase.java new file mode 100644 index 000000000..9fb40234e --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFireboxBase.java @@ -0,0 +1,201 @@ +package com.hbm.tileentity.machine; + +import com.hbm.blocks.BlockDummyable; +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.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class TileEntityFireboxBase 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 TileEntityFireboxBase() { + super(2); + } + + @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 = (int) (getModule().getBurnTime(slots[i]) * getTimeMult()); + + if(fuel > 0) { + this.maxBurnTime = this.burnTime = fuel; + this.burnHeat = getModule().getBurnHeat(getBaseHeat(), slots[i]); + slots[i].stackSize--; + + if(slots[i].stackSize == 0) { + slots[i] = slots[i].getItem().getContainerItem(slots[i]); + } + + this.wasOn = true; + break; + } + } + } + } else { + + if(this.heatEnergy < getMaxHeat()) { + burnTime--; + } + this.wasOn = true; + + if(worldObj.rand.nextInt(15) == 0) { + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "fire.fire", 1.0F, 0.5F + worldObj.rand.nextFloat() * 0.5F); + } + } + + if(wasOn) { + this.heatEnergy = Math.min(this.heatEnergy + this.burnHeat, getMaxHeat()); + } 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); + } + } + } + + public abstract ModuleBurnTime getModule(); + public abstract int getBaseHeat(); + public abstract double getTimeMult(); + public abstract int getMaxHeat(); + + @Override + public int[] getAccessibleSlotsFromSide(int meta) { + return new int[] { 0, 1 }; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + return getModule().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 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/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java index 265b11fe5..642c99014 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java @@ -172,6 +172,9 @@ public class TileEntityFurnaceSteel extends TileEntityMachineBase implements IGU } protected void tryPullHeat() { + + if(this.heat >= this.maxHeat) return; + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); if(con instanceof IHeatSource) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterFirebox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterFirebox.java index fc11a4f72..729640995 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterFirebox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterFirebox.java @@ -4,39 +4,21 @@ import java.io.IOException; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; -import com.hbm.blocks.BlockDummyable; import com.hbm.inventory.container.ContainerFirebox; import com.hbm.inventory.gui.GUIFirebox; +import com.hbm.lib.RefStrings; import com.hbm.module.ModuleBurnTime; import com.hbm.tileentity.IConfigurableMachine; -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.util.ResourceLocation; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeaterFirebox extends TileEntityMachineBase implements IGUIProvider, IHeatSource, IConfigurableMachine { - - 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 class TileEntityHeaterFirebox extends TileEntityFireboxBase implements IConfigurableMachine { public static int baseHeat = 100; public static double timeMult = 1D; @@ -57,139 +39,32 @@ public class TileEntityHeaterFirebox extends TileEntityMachineBase implements IG .setBalefireHeatMod(15); public TileEntityHeaterFirebox() { - super(2); + super(); } @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--; + public ModuleBurnTime getModule() { + return burnModule; } @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 = (int) (burnModule.getBurnTime(slots[i]) * timeMult); - - if(fuel > 0) { - this.maxBurnTime = this.burnTime = fuel; - this.burnHeat = burnModule.getBurnHeat(baseHeat, slots[i]); - slots[i].stackSize--; - - if(slots[i].stackSize == 0) { - slots[i] = slots[i].getItem().getContainerItem(slots[i]); - } - - this.wasOn = true; - break; - } - } - } - } else { - - if(this.heatEnergy < this.maxHeatEnergy) { - burnTime--; - } - this.wasOn = true; - - if(worldObj.rand.nextInt(15) == 0) { - worldObj.playSoundEffect(xCoord, yCoord, zCoord, "fire.fire", 1.0F, 0.5F + worldObj.rand.nextFloat() * 0.5F); - } - } - - if(wasOn) { - 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); - } - } + public int getBaseHeat() { + return baseHeat; } @Override - public int[] getAccessibleSlotsFromSide(int meta) { - return new int[] { 0, 1 }; - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - return burnModule.getBurnTime(itemStack) > 0; + public double getTimeMult() { + return timeMult; } @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); + public int getMaxHeat() { + return maxHeatEnergy; } @Override @@ -197,45 +72,12 @@ public class TileEntityHeaterFirebox extends TileEntityMachineBase implements IG return new ContainerFirebox(player.inventory, this); } + @SideOnly(Side.CLIENT) private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_firebox.png"); + @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; + return new GUIFirebox(player.inventory, this, texture); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOven.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOven.java new file mode 100644 index 000000000..db252f124 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOven.java @@ -0,0 +1,133 @@ +package com.hbm.tileentity.machine; + +import java.io.IOException; + +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.container.ContainerFirebox; +import com.hbm.inventory.gui.GUIFirebox; +import com.hbm.lib.RefStrings; +import com.hbm.module.ModuleBurnTime; +import com.hbm.tileentity.IConfigurableMachine; + +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.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +public class TileEntityHeaterOven extends TileEntityFireboxBase implements IConfigurableMachine { + + public static int baseHeat = 500; + public static double timeMult = 0.125D; + public static int maxHeatEnergy = 500_000; + public static double heatEff = 0.5D; + public static ModuleBurnTime burnModule = new ModuleBurnTime() + .setLigniteTimeMod(1.25) + .setCoalTimeMod(1.25) + .setCokeTimeMod(1.25) + .setSolidTimeMod(1.5) + .setRocketTimeMod(1.5) + .setBalefireTimeMod(0.5) + + .setLigniteHeatMod(2) + .setCoalHeatMod(2) + .setCokeHeatMod(2) + .setSolidHeatMod(3) + .setRocketHeatMod(5) + .setBalefireHeatMod(15); + + public TileEntityHeaterOven() { + super(); + } + + @Override + public String getName() { + return "container.heaterOven"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + this.tryPullHeat(); + } + + super.updateEntity(); + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + int toPull = Math.max(Math.min(source.getHeatStored(), this.getMaxHeat() - this.heatEnergy), 0); + this.heatEnergy += toPull * heatEff; + source.useUpHeat(toPull); + } + } + + @Override + public ModuleBurnTime getModule() { + return burnModule; + } + + @Override + public int getBaseHeat() { + return baseHeat; + } + + @Override + public double getTimeMult() { + return timeMult; + } + + @Override + public int getMaxHeat() { + return maxHeatEnergy; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerFirebox(player.inventory, this); + } + + @SideOnly(Side.CLIENT) private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_heating_oven.png"); + + @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, texture); + } + + @Override + public String getConfigName() { + return "heatingoven"; + } + + @Override + public void readIfPresent(JsonObject obj) { + baseHeat = IConfigurableMachine.grab(obj, "I:baseHeat", baseHeat); + timeMult = IConfigurableMachine.grab(obj, "D:burnTimeMult", timeMult); + heatEff = IConfigurableMachine.grab(obj, "D:heatPullEff", heatEff); + maxHeatEnergy = IConfigurableMachine.grab(obj, "I:heatCap", maxHeatEnergy); + if(obj.has("burnModule")) { + burnModule.readIfPresent(obj.get("M:burnModule").getAsJsonObject()); + } + } + + @Override + public void writeConfig(JsonWriter writer) throws IOException { + writer.name("I:baseHeat").value(baseHeat); + writer.name("D:burnTimeMult").value(timeMult); + writer.name("D:heatPullEff").value(heatEff); + writer.name("I:heatCap").value(maxHeatEnergy); + writer.name("M:burnModule").beginObject(); + burnModule.writeConfig(writer); + writer.endObject(); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index fb2b83933..43254da96 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -1,6 +1,8 @@ package com.hbm.tileentity.machine; +import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.recipes.CentrifugeRecipes; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; @@ -33,7 +35,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement private static final int[] slot_io = new int[] { 0, 2, 3, 4, 5 }; public TileEntityMachineCentrifuge() { - super(6); + super(8); } public String getName() { @@ -141,9 +143,21 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord); power = Library.chargeTEFromItems(slots, 1, power, maxPower); + + int consumption = 200; + int speed = 1; + + UpgradeManager.eval(slots, 6, 7); + speed += Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); + consumption += Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) * 200; + + speed *= Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 5; + consumption += Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10000; + + consumption /= (1 + Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3)); if(hasPower() && isProcessing()) { - this.power -= 200; + this.power -= consumption; if(this.power < 0) { this.power = 0; @@ -157,7 +171,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement } if(isProgressing) { - progress++; + progress += speed; if(this.progress >= TileEntityMachineCentrifuge.processingSpeed) { this.progress = 0; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index a85421006..b21620ee8 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -307,6 +307,7 @@ container.generator=Atomreaktor container.hadron=Teilchenbeschleuniger container.heaterFirebox=Feuerbüchse container.heaterOilburner=Brenner +container.heaterOven=Heizofen container.iGenerator=Industrieller Generator container.keyForge=Schlossertisch container.launchPad=Raketenabschussrampe @@ -3573,6 +3574,8 @@ tile.heater_firebox.name=Feuerbüchse tile.heater_firebox.desc=Erzeugt Wärme aus Festbrennstoff. tile.heater_oilburner.name=Brenner tile.heater_oilburner.desc=Erzäuft Wärme aus fluiden Brennstoffen. +tile.heater_oven.name=Heizofen +tile.heater_oven.desc=Erzeugt Wärme aus Festbrennstoff.$Nimmt von unten Wärme mit 50%% Effizienz auf. 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 696b92e5f..4669e98a1 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -497,6 +497,7 @@ container.generator=Nuclear Reactor container.hadron=Particle Accelerator container.heaterFirebox=Firebox container.heaterOilburner=Fluid Burner +container.heaterOven=Heating Oven container.iGenerator=Industrial Generator container.keyForge=Locksmith Table container.launchPad=Missile Launch Pad @@ -4011,6 +4012,8 @@ tile.heater_firebox.name=Firebox tile.heater_firebox.desc=Burns solid fuel to produce heat. tile.heater_oilburner.name=Fluid Burner tile.heater_oilburner.desc=Burns fluids to produce heat. +tile.heater_oven.name=Heating Oven +tile.heater_oven.desc=Burns solid fuel to produce heat.$Accepts heat from the bottom with 50%% efficiency. 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/heating_oven.obj b/src/main/resources/assets/hbm/models/machines/heating_oven.obj new file mode 100644 index 000000000..3d0b7f250 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/heating_oven.obj @@ -0,0 +1,642 @@ +# Blender v2.79 (sub 0) OBJ File: 'heating_oven.blend' +# www.blender.org +o Door +v 1.500000 0.812500 0.437500 +v 1.500000 0.187500 0.437500 +v 1.500000 0.812500 -0.437500 +v 1.500000 0.187500 -0.437500 +v 1.562500 0.812500 -0.437500 +v 1.562500 0.812500 0.437500 +v 1.562500 0.187500 0.437500 +v 1.562500 0.187500 -0.437500 +v 1.625000 0.312500 -0.312500 +v 1.625000 0.312500 -0.250000 +v 1.625000 0.687500 -0.312500 +v 1.625000 0.687500 -0.250000 +v 1.562500 0.687500 -0.250000 +v 1.562500 0.687500 -0.312500 +v 1.562500 0.312500 -0.250000 +v 1.562500 0.312500 -0.312500 +v 1.562500 0.750000 -0.312500 +v 1.562500 0.250000 -0.312500 +v 1.562500 0.250000 -0.250000 +v 1.562500 0.750000 -0.250000 +v 1.687500 0.750000 -0.250000 +v 1.687500 0.250000 -0.250000 +v 1.687500 0.250000 -0.312500 +v 1.687500 0.750000 -0.312500 +vt 0.431034 0.196429 +vt 0.551724 0.285714 +vt 0.431034 0.285714 +vt 0.551724 0.187500 +vt 0.431034 0.187500 +vt 0.431034 0.294643 +vt 0.551724 0.294643 +vt 0.560345 0.285714 +vt 0.551724 0.196429 +vt 0.560345 0.196429 +vt 0.422414 0.196429 +vt 0.422414 0.285714 +vt 0.439655 0.401786 +vt 0.431034 0.410714 +vt 0.431034 0.392857 +vt 0.413793 0.312500 +vt 0.422414 0.303571 +vt 0.422414 0.321429 +vt 0.422414 0.392857 +vt 0.413793 0.330357 +vt 0.413793 0.401786 +vt 0.422414 0.410714 +vt 0.413793 0.410714 +vt 0.439655 0.383929 +vt 0.448276 0.330357 +vt 0.448276 0.383929 +vt 0.448276 0.410714 +vt 0.439655 0.410714 +vt 0.448276 0.312500 +vt 0.439655 0.303571 +vt 0.448276 0.303571 +vt 0.431034 0.321429 +vt 0.439655 0.312500 +vt 0.431034 0.303571 +vt 0.439655 0.330357 +vt 0.413793 0.303571 +vt 0.413793 0.383929 +vt 0.448276 0.401786 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +s off +f 7/1/1 5/2/1 6/3/1 +f 4/4/2 7/1/2 2/5/2 +f 1/6/3 5/2/3 3/7/3 +f 3/8/4 8/9/4 4/10/4 +f 2/11/5 6/3/5 1/12/5 +f 11/13/4 17/14/4 24/15/4 +f 10/16/5 19/17/5 22/18/5 +f 21/19/5 10/20/5 22/18/5 +f 12/21/5 20/22/5 13/23/5 +f 11/24/6 10/25/6 12/26/6 +f 11/13/2 13/27/2 14/28/2 +f 10/29/3 16/30/3 15/31/3 +f 19/17/2 23/32/2 22/18/2 +f 17/14/3 21/19/3 24/15/3 +f 21/19/1 23/32/1 24/15/1 +f 9/33/4 18/34/4 16/30/4 +f 9/35/4 24/15/4 23/32/4 +f 7/1/1 8/9/1 5/2/1 +f 4/4/2 8/9/2 7/1/2 +f 1/6/3 6/3/3 5/2/3 +f 3/8/4 5/2/4 8/9/4 +f 2/11/5 7/1/5 6/3/5 +f 11/13/4 14/28/4 17/14/4 +f 10/16/5 15/36/5 19/17/5 +f 21/19/5 12/37/5 10/20/5 +f 12/21/5 21/19/5 20/22/5 +f 11/24/6 9/35/6 10/25/6 +f 11/13/2 12/38/2 13/27/2 +f 10/29/3 9/33/3 16/30/3 +f 19/17/2 18/34/2 23/32/2 +f 17/14/3 20/22/3 21/19/3 +f 21/19/1 22/18/1 23/32/1 +f 9/33/4 23/32/4 18/34/4 +f 9/35/4 11/24/4 24/15/4 +o Inner +v 1.375000 0.750000 -0.375000 +v 1.375000 0.750000 0.375000 +v 1.375000 0.250000 0.375000 +v 1.375000 0.250000 -0.375000 +v 1.375000 0.875000 -0.375000 +v 1.375000 0.875000 0.375000 +v 1.375000 0.125000 0.375000 +v 1.375000 0.125000 -0.375000 +v 0.625000 0.875000 -0.375000 +v 0.625000 0.875000 0.375000 +v 0.625000 0.125000 0.375000 +v 0.625000 0.125000 -0.375000 +vt 0.689655 0.196429 +vt 0.586207 0.214286 +vt 0.586207 0.196429 +vt 0.586207 0.125000 +vt 0.689655 0.107143 +vt 0.689655 0.125000 +vt 0.896552 -0.000000 +vt 0.793103 0.107143 +vt 0.793103 -0.000000 +vt 0.793103 0.321429 +vt 0.896552 0.214286 +vt 0.896552 0.321429 +vt 0.793103 0.214286 +vt 0.896552 0.107143 +vt 0.689655 0.214286 +vt 1.000000 0.125000 +vt 0.586207 0.107143 +vt 1.000000 0.107143 +vt 1.000000 0.196429 +vt 1.000000 0.214286 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +s off +f 26/39/7 29/40/7 25/41/7 +f 28/42/7 31/43/7 27/44/7 +f 32/45/8 35/46/8 31/47/8 +f 30/48/9 33/49/9 29/50/9 +f 34/51/10 36/52/10 33/49/10 +f 34/51/11 30/53/11 26/39/11 +f 33/49/12 36/52/12 28/54/12 +f 26/39/7 30/53/7 29/40/7 +f 28/42/7 32/55/7 31/43/7 +f 32/45/8 36/52/8 35/46/8 +f 30/48/9 34/51/9 33/49/9 +f 34/51/10 35/46/10 36/52/10 +f 26/39/11 27/44/11 34/51/11 +f 27/44/11 31/43/11 35/46/11 +f 34/51/11 27/44/11 35/46/11 +f 32/56/12 28/54/12 36/52/12 +f 28/54/12 25/57/12 33/49/12 +f 25/57/12 29/58/12 33/49/12 +o InnerBurning +v 1.375000 0.125000 0.375000 +v 1.375000 0.125000 -0.375000 +v 0.625000 0.125000 0.375000 +v 0.625000 0.250000 -0.375000 +v 1.375000 0.125000 0.250000 +v 1.375000 0.187500 0.125000 +v 1.375000 0.187500 -0.000000 +v 1.375000 0.125000 -0.125000 +v 1.375000 0.125000 -0.250000 +v 0.625000 0.187500 0.250000 +v 0.625000 0.250000 0.125000 +v 0.625000 0.250000 -0.000000 +v 0.625000 0.187500 -0.125000 +v 0.625000 0.187500 -0.250000 +v 0.750000 0.187500 0.375000 +v 0.875000 0.187500 0.375000 +v 1.000000 0.250000 0.375000 +v 1.125000 0.187500 0.375000 +v 1.250000 0.125000 0.375000 +v 1.250000 0.125000 -0.375000 +v 1.125000 0.187500 -0.375000 +v 1.000000 0.125000 -0.375000 +v 0.875000 0.187500 -0.375000 +v 0.750000 0.187500 -0.375000 +v 1.250000 0.187500 0.250000 +v 1.125000 0.187500 0.250000 +v 1.000000 0.250000 0.250000 +v 0.875000 0.250000 0.250000 +v 0.750000 0.187500 0.250000 +v 1.250000 0.187500 0.125000 +v 1.125000 0.250000 0.125000 +v 1.000000 0.250000 0.125000 +v 0.875000 0.312500 0.125000 +v 0.750000 0.250000 0.125000 +v 1.250000 0.187500 -0.000000 +v 1.125000 0.250000 -0.000000 +v 1.000000 0.312500 -0.000000 +v 0.875000 0.312500 -0.000000 +v 0.750000 0.250000 -0.000000 +v 1.250000 0.187500 -0.125000 +v 1.125000 0.250000 -0.125000 +v 1.000000 0.250000 -0.125000 +v 0.875000 0.250000 -0.125000 +v 0.750000 0.250000 -0.125000 +v 1.250000 0.187500 -0.250000 +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.250000 -0.250000 +v 1.375000 0.750000 -0.375000 +v 1.375000 0.750000 0.375000 +v 1.375000 0.250000 0.375000 +v 1.375000 0.250000 -0.375000 +v 1.375000 0.875000 -0.375000 +v 1.375000 0.875000 0.375000 +v 1.375000 0.125000 0.375000 +v 1.375000 0.125000 -0.375000 +v 0.625000 0.875000 -0.375000 +v 0.625000 0.875000 0.375000 +v 0.625000 0.125000 0.375000 +v 0.625000 0.125000 -0.375000 +vt 0.879310 0.410714 +vt 0.896552 0.410714 +vt 0.879310 0.428571 +vt 0.793103 0.410714 +vt 0.810345 0.410714 +vt 0.793103 0.428571 +vt 0.827586 0.410714 +vt 0.810345 0.428571 +vt 0.844828 0.410714 +vt 0.827586 0.428571 +vt 0.862069 0.410714 +vt 0.844828 0.428571 +vt 0.862069 0.428571 +vt 0.793103 0.321429 +vt 0.810345 0.321429 +vt 0.793103 0.339286 +vt 0.810345 0.339286 +vt 0.793103 0.357143 +vt 0.810345 0.357143 +vt 0.793103 0.375000 +vt 0.810345 0.375000 +vt 0.810345 0.392857 +vt 0.793103 0.392857 +vt 0.827586 0.321429 +vt 0.827586 0.339286 +vt 0.827586 0.357143 +vt 0.827586 0.375000 +vt 0.827586 0.392857 +vt 0.844828 0.321429 +vt 0.844828 0.339286 +vt 0.844828 0.357143 +vt 0.844828 0.375000 +vt 0.844828 0.392857 +vt 0.862069 0.339286 +vt 0.862069 0.357143 +vt 0.862069 0.375000 +vt 0.879310 0.321429 +vt 0.862069 0.321429 +vt 0.879310 0.339286 +vt 0.879310 0.357143 +vt 0.879310 0.375000 +vt 0.862069 0.392857 +vt 0.879310 0.392857 +vt 0.896552 0.339286 +vt 0.896552 0.357143 +vt 0.896552 0.375000 +vt 0.896552 0.321429 +vt 0.896552 0.392857 +vt 0.896552 0.428571 +vt 0.689655 0.517857 +vt 0.586207 0.535714 +vt 0.586207 0.517857 +vt 0.586207 0.446429 +vt 0.689655 0.428571 +vt 0.689655 0.446429 +vt 0.793103 0.642857 +vt 0.896552 0.535714 +vt 0.896552 0.642857 +vt 0.793103 0.535714 +vt 0.896552 0.428571 +vt 0.689655 0.535714 +vt 1.000000 0.446429 +vt 0.586207 0.428571 +vt 0.793103 0.428571 +vt 1.000000 0.428571 +vt 1.000000 0.517857 +vt 1.000000 0.535714 +vn -0.4082 0.8165 -0.4082 +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.0000 0.8944 -0.4472 +vn 0.4082 0.8165 -0.4082 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +s off +f 85/59/13 60/60/13 50/61/13 +f 51/62/14 65/63/14 39/64/14 +f 70/65/15 46/66/15 65/63/15 +f 75/67/16 47/68/16 70/65/16 +f 75/67/16 80/69/16 48/70/16 +f 80/69/14 85/59/14 49/71/14 +f 37/72/16 41/73/16 55/74/16 +f 55/74/17 61/75/17 54/76/17 +f 62/77/18 53/78/18 54/76/18 +f 53/78/16 63/79/16 64/80/16 +f 52/81/19 64/80/19 65/63/19 +f 42/82/17 61/75/17 41/73/17 +f 61/75/18 66/83/18 67/84/18 +f 62/77/17 67/84/17 63/79/17 +f 63/79/18 68/85/18 69/86/18 +f 64/80/19 70/65/19 65/63/19 +f 43/87/16 66/83/16 42/82/16 +f 71/88/18 67/84/18 66/83/18 +f 67/84/18 72/89/18 73/90/18 +f 68/85/17 73/90/17 69/86/17 +f 74/91/14 70/65/14 69/86/14 +f 43/87/16 76/92/16 71/88/16 +f 76/92/18 72/89/18 71/88/18 +f 72/89/18 77/93/18 73/90/18 +f 78/94/20 74/91/20 73/90/20 +f 74/91/14 80/69/14 75/67/14 +f 45/95/18 76/92/18 44/96/18 +f 76/92/18 81/97/18 77/93/18 +f 82/98/20 78/94/20 77/93/20 +f 83/99/20 79/100/20 78/94/20 +f 79/100/21 84/101/21 85/59/21 +f 45/95/21 56/102/21 81/97/21 +f 81/97/21 56/102/21 57/103/21 +f 57/103/16 83/99/16 82/98/16 +f 83/99/20 58/104/20 84/101/20 +f 84/101/21 60/60/21 85/59/21 +f 55/74/17 41/73/17 61/75/17 +f 54/76/16 61/75/16 62/77/16 +f 73/90/15 68/85/15 67/84/15 +f 67/84/15 62/77/15 61/75/15 +f 69/86/16 73/90/16 74/91/16 +f 73/90/20 77/93/20 78/94/20 +f 63/79/16 67/84/16 68/85/16 +f 77/93/20 81/97/20 82/98/20 +f 69/86/15 64/80/15 63/79/15 +f 76/92/21 43/87/21 44/96/21 +f 56/102/16 45/95/16 38/105/16 +f 84/101/18 58/104/18 59/106/18 +f 49/71/14 85/59/14 50/61/14 +f 85/59/16 80/69/16 79/100/16 +f 50/61/17 60/60/17 40/107/17 +f 48/70/13 80/69/13 49/71/13 +f 80/69/20 74/91/20 79/100/20 +f 39/64/15 65/63/15 46/66/15 +f 65/63/16 51/62/16 52/81/16 +f 87/108/22 90/109/22 86/110/22 +f 64/80/19 52/81/19 53/78/19 +f 57/103/16 82/98/16 81/97/16 +f 89/111/22 92/112/22 88/113/22 +f 91/114/23 94/115/23 90/116/23 +f 95/117/24 97/118/24 94/115/24 +f 95/117/25 91/119/25 87/108/25 +f 94/115/26 97/118/26 89/120/26 +f 70/65/15 47/68/15 46/66/15 +f 75/67/16 48/70/16 47/68/16 +f 62/77/18 63/79/18 53/78/18 +f 42/82/16 66/83/16 61/75/16 +f 64/80/19 69/86/19 70/65/19 +f 43/87/16 71/88/16 66/83/16 +f 71/88/18 72/89/18 67/84/18 +f 74/91/14 75/67/14 70/65/14 +f 76/92/18 77/93/18 72/89/18 +f 78/94/20 79/100/20 74/91/20 +f 45/95/18 81/97/18 76/92/18 +f 82/98/20 83/99/20 78/94/20 +f 83/99/20 84/101/20 79/100/20 +f 57/103/13 58/104/13 83/99/13 +f 84/101/16 59/106/16 60/60/16 +f 87/108/22 91/119/22 90/109/22 +f 89/111/22 93/121/22 92/112/22 +f 91/114/23 95/117/23 94/115/23 +f 95/117/24 96/122/24 97/118/24 +f 87/108/25 88/113/25 95/117/25 +f 88/113/25 92/112/25 96/122/25 +f 95/117/25 88/113/25 96/122/25 +f 93/123/26 89/120/26 97/118/26 +f 89/120/26 86/124/26 94/115/26 +f 86/124/26 90/125/26 94/115/26 +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 -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.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -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 +v 1.500000 0.750000 0.375000 +v 1.500000 0.250000 0.375000 +v 1.500000 0.750000 -0.375000 +v 1.500000 0.250000 -0.375000 +v 1.375000 0.750000 -0.375000 +v 1.375000 0.750000 0.375000 +v 1.375000 0.250000 0.375000 +v 1.375000 0.250000 -0.375000 +vt 0.568965 0.000000 +vt 0.431034 0.008929 +vt 0.431034 -0.000000 +vt 0.275862 0.714286 +vt 0.000000 0.571429 +vt 0.413793 0.571429 +vt 0.413793 0.428571 +vt -0.000000 0.571429 +vt -0.000000 0.428571 +vt 0.155172 0.535714 +vt 0.413793 0.428571 +vt 0.000000 0.571429 +vt 0.000000 0.428571 +vt 0.413793 0.428571 +vt 0.000000 0.571429 +vt 0.000000 0.428571 +vt 0.586207 0.160714 +vt 0.577586 0.017857 +vt 0.586207 0.017857 +vt 0.275862 0.857143 +vt 0.413793 1.000000 +vt 0.137931 0.857143 +vt 0.000000 1.000000 +vt 0.137931 0.714286 +vt 0.439655 0.026786 +vt 0.560345 0.151786 +vt 0.439655 0.151786 +vt 0.431034 0.026786 +vt 0.431034 0.178571 +vt 0.568965 0.169643 +vt 0.568965 0.178571 +vt 0.560345 0.026786 +vt 0.568965 0.151786 +vt 0.560345 0.026786 +vt 0.439655 0.151786 +vt 0.439655 0.026786 +vt 0.431034 0.178571 +vt 0.568965 0.169643 +vt 0.568965 0.178571 +vt 0.560345 0.017857 +vt 0.560345 0.151786 +vt 0.439655 0.160714 +vt 0.413793 0.000000 +vt 0.137931 0.142857 +vt 0.000000 0.000000 +vt 0.413793 0.428571 +vt 0.275862 0.142857 +vt 0.000000 0.428571 +vt 0.275862 0.285714 +vt 0.137931 0.285714 +vt 0.568965 0.008929 +vt 0.568965 0.151786 +vt 0.577586 0.017857 +vt 0.577586 0.160714 +vt 0.431034 0.026786 +vt 0.422414 0.160714 +vt 0.422414 0.017857 +vt 0.431034 0.169643 +vt 0.586207 0.160714 +vt 0.586207 0.017857 +vt 0.413793 0.017857 +vt 0.413793 0.160714 +vt 0.431034 0.169643 +vt 0.560345 0.160714 +vt 0.577586 0.160714 +vt 0.568965 0.026786 +vt 0.422414 0.017857 +vt 0.431034 0.151786 +vt 0.422414 0.160714 +vt 0.568965 0.008929 +vt 0.439655 0.017857 +vt 0.431034 0.008929 +vt 0.413793 0.017857 +vt 0.413793 0.160714 +vt 0.560345 0.017857 +vt 0.439655 0.160714 +vt 0.568965 -0.000000 +vt 0.431034 -0.000000 +vt 0.689655 0.214286 +vt 0.586207 0.232143 +vt 0.586207 0.214286 +vt 0.258621 0.535714 +vt 0.258621 0.464286 +vt 0.155172 0.464286 +vt 0.586207 0.321429 +vt 0.689655 0.303571 +vt 0.689655 0.321429 +vt 0.706897 0.303571 +vt 0.689655 0.232143 +vt 0.706897 0.232143 +vt 0.568965 0.232143 +vt 0.586207 0.303571 +vt 0.568965 0.303571 +vt 0.413793 0.571429 +vt 0.413793 0.571429 +vt 0.413793 0.571429 +vt 0.439655 0.017857 +vt 0.560345 0.160714 +vt 0.568965 0.026786 +vt 0.431034 0.151786 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +s off +f 116/126/27 123/127/27 114/128/27 +f 109/129/28 103/130/28 105/131/28 +f 99/132/29 102/133/29 98/134/29 +f 138/135/27 105/131/27 103/130/27 +f 98/136/30 104/137/30 100/138/30 +f 100/139/31 105/140/31 101/141/31 +f 108/142/29 133/143/29 109/144/29 +f 108/145/28 105/131/28 104/146/28 +f 106/147/28 104/146/28 102/148/28 +f 107/149/28 102/148/28 103/130/28 +f 112/150/28 110/151/28 111/152/28 +f 111/152/29 136/153/29 112/150/29 +f 106/154/27 130/155/27 108/156/27 +f 113/157/31 134/158/31 110/151/31 +f 118/159/32 120/160/32 119/161/32 +f 115/162/30 125/163/30 117/164/30 +f 119/161/30 126/165/30 118/159/30 +f 121/166/27 128/167/27 120/160/27 +f 100/168/32 114/169/32 98/170/32 +f 101/171/32 116/172/32 100/168/32 +f 99/173/32 117/174/32 101/171/32 +f 98/170/32 115/175/32 99/173/32 +f 126/165/32 123/127/32 122/176/32 +f 129/177/32 122/178/32 125/179/32 +f 127/180/32 124/181/32 123/182/32 +f 128/167/32 125/163/32 124/183/32 +f 118/159/31 129/177/31 121/166/31 +f 120/160/29 127/180/29 119/161/29 +f 117/184/29 122/178/29 116/185/29 +f 114/186/31 124/181/31 115/187/31 +f 131/188/28 134/189/28 130/155/28 +f 130/190/28 137/191/28 133/143/28 +f 132/192/28 135/193/28 131/194/28 +f 133/195/28 136/196/28 132/197/28 +f 107/198/31 131/194/31 106/199/31 +f 112/150/27 137/200/27 113/157/27 +f 110/151/30 135/201/30 111/152/30 +f 109/202/30 132/197/30 107/203/30 +f 141/204/28 144/205/28 139/206/28 +f 140/207/27 101/171/27 105/131/27 +f 141/208/27 99/173/27 101/171/27 +f 139/209/27 103/130/27 99/173/27 +f 138/210/32 142/211/32 140/212/32 +f 140/213/29 145/214/29 141/215/29 +f 139/216/31 143/217/31 138/218/31 +f 116/126/27 122/176/27 123/127/27 +f 109/129/28 107/149/28 103/130/28 +f 99/132/29 103/219/29 102/133/29 +f 138/135/27 140/207/27 105/131/27 +f 98/136/30 102/220/30 104/137/30 +f 100/139/31 104/221/31 105/140/31 +f 108/142/29 130/190/29 133/143/29 +f 108/145/28 109/129/28 105/131/28 +f 106/147/28 108/145/28 104/146/28 +f 107/149/28 106/147/28 102/148/28 +f 112/150/28 113/157/28 110/151/28 +f 111/152/29 135/193/29 136/153/29 +f 106/154/27 131/188/27 130/155/27 +f 113/157/31 137/191/31 134/158/31 +f 118/159/32 121/166/32 120/160/32 +f 115/162/30 124/183/30 125/163/30 +f 119/161/30 127/222/30 126/165/30 +f 121/166/27 129/223/27 128/167/27 +f 100/168/32 116/172/32 114/169/32 +f 101/171/32 117/174/32 116/172/32 +f 99/173/32 115/175/32 117/174/32 +f 98/170/32 114/169/32 115/175/32 +f 126/165/32 127/222/32 123/127/32 +f 129/177/32 126/224/32 122/178/32 +f 127/180/32 128/225/32 124/181/32 +f 128/167/32 129/223/32 125/163/32 +f 118/159/31 126/224/31 129/177/31 +f 120/160/29 128/225/29 127/180/29 +f 117/184/29 125/179/29 122/178/29 +f 114/186/31 123/182/31 124/181/31 +f 131/188/28 135/201/28 134/189/28 +f 130/190/28 134/158/28 137/191/28 +f 132/192/28 136/153/28 135/193/28 +f 133/195/28 137/200/28 136/196/28 +f 107/198/31 132/192/31 131/194/31 +f 112/150/27 136/196/27 137/200/27 +f 110/151/30 134/189/30 135/201/30 +f 109/202/30 133/195/30 132/197/30 +f 141/204/28 145/214/28 144/205/28 +f 140/207/27 141/208/27 101/171/27 +f 141/208/27 139/209/27 99/173/27 +f 139/209/27 138/135/27 103/130/27 +f 138/210/32 143/217/32 142/211/32 +f 140/213/29 142/211/29 145/214/29 +f 139/216/31 144/205/31 143/217/31 diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 9f9711070..f601d8d66 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -26,7 +26,7 @@ "block.lockOpen": {"category": "block", "sounds": [{"name": "block/lockOpen", "stream": false}]}, "block.lockHang": {"category": "block", "sounds": [{"name": "block/lockHang", "stream": false}]}, "block.debris": {"category": "block", "sounds": ["block/debris1", "block/debris2", "block/debris3"]}, - "block.centrifugeOperate": {"category": "block", "sounds": [{"name": "block/centrifugeOperate", "stream": true}]}, + "block.centrifugeOperate": {"category": "block", "sounds": [{"name": "block/centrifugeOperate", "stream": false}]}, "block.pipePlaced": {"category": "block", "sounds": [{"name": "block/pipePlaced", "stream": false}]}, "block.missileAssembly": {"category": "block", "sounds": [{"name": "block/missileAssembly", "stream": false}]}, "block.missileAssembly2": {"category": "block", "sounds": [{"name": "block/missileAssembly2", "stream": false}]}, diff --git a/src/main/resources/assets/hbm/textures/gui/centrifuge.png b/src/main/resources/assets/hbm/textures/gui/centrifuge.png deleted file mode 100644 index f369d74b92d0a923e5d06412fb72dbd4a4f93115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2970 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 diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_heating_oven.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_heating_oven.png new file mode 100644 index 0000000000000000000000000000000000000000..de8b2b0aee812b941f15d5d458c8f28d0e8c72f7 GIT binary patch literal 5968 zcmdT|XH-*Ln?8Uhs1!$3kQT5|E>-C@TvQN|a&{xU*39>B_K&mQbIv-?+3&OW`|S7K4;<~S zMfXeZ2LM3S=E6BA01)7t0)Q}x-?>G+^y7DX5SBJqg!v6AeDgj4NP=z7{eC5;aCJ5) z*o_iTp{-+w@={_XPdz+z>SFtaoV1<*b(!n)g3mLBS~l9pyd{?>R*vo)F-!^hORsJ+ z^sk-sqk?<)w=KVz)YyMG@bY0785R9Dsj8{H6Aiw#A&R-ik1JfF|2Td=;=*uPs6V;T zA6A%mB3-4w-Y`1}fhsY0Y{)UA{F@PnUg$qeholVaP_fzLxJ;S+D8gJ*UCLUzwP-f3J5XLA#0Rq7x^eyM(W+8;mXv3(f`6mAbRajqHb) zR9T`N1y93*7xJJbC;7%daVLc22`RpoK6R~s=$*loBQwYyyx9{;w^alq7(c|)eR-R% zFw&i>i)O-o&ViFT-AedV6l36daPpmlfVOk>NC^#Cwl&z@avETS@utBgf<=l^PtuD8 z3f(ahH#Cg~7vXbvw0NzjM*|+-OH;h*Ij&^?x1hT&sX|rJ@X(LBivf zV*S?T=gbiv{(|mh<$J%;M(u#1A~PIz$M9xsoRv+R>zYt%$di72M?=xR;m(Y+}u=p z93EB#rhT|14Gh}rJhnxIm-b;w%{4VN)#ejfHTMpo=!eQK4|BuBn|;I7CA3nTcxx^% zu#SFV`RF-X_~5t6(URu9_H;U&L7Rro{dA$yj^w$@>J;0mwJe7B>bu|yea=oIWv9m#*!}eQ_IN*4n{EP&JC=Ze6n#2#G{@IV_-i)KDbPcr83T5{ z!7@Bob8dj)!TT{}3Nl2IO(U1FjG*1X44biI3BI#TCayQ?hSmWT(Y#HB`E}GB@H=x% z9&%y9SU)d&&{GMARF!Zy5mY`JXnIs(biJyFtKuMsR!RH{ypUUJeT-AUv{KJDn)9M zWxVdk)3>{%?RG-EN}YUOK~v_1^K|4(WF8zn>5RkO&I^3bywow+eebwr0mAj=XXctK z)P8C3F@J=@XS-%d2SNyULrV5+`6JYG)m)nGq(C8rY_D6(^Vyf%!E|apXk!xrUX)3h zIMdQ$xbyq*0~XeJpm=i3L7x;+8gnG6Z2Z$h7^Tay(?7}ShqS!s3n_Oc-Jf!9y*2Jm-qysKJ9m@o-lq3dSp{U#I6=qg{e!T7H5j-XJiNOg&^1|V#5I^ zR&EJAy>UZHJ89(z0mX_qGRA%Go*b>|)>RKbd_$%#L)|L^V2YCVX!Q(y4)M-c3bQTO9(Wl2yJLOHHQq!(dZojwPyyR!W? zJFr&u1Xd(nB7WT2{In@S>Ah-+mh*~3ONad{J}QBjj3&*rBbcf?Z4qxmLfIZhQ~E8x zpiGiWZs@f<|NcX|(;23uo0Q^jFQoWK`~wfLrgNaw$E%DdLO0uVk92@~j%zEXud48a zCBxs(q#d-eEm^Gd8q3}Jrp@Nu1>cjMV~c6X5hN5?QT8w>Yy|7@g7(FO?xXQ?&~MIspUuo zuF1;`Sw%k)^)-F5{}eyq*QdnNzLB3KHU*?{Ww5wW@LZkB1Scl+7pcH8f^W6sUj}75 z+}(CYW;6EGRciu(Vg$hyKWWF&knFaFmPrQ>=3Va6FCCbTac7Cov9O%7a zEgLYl-~!nl1TK(3wp`i^c(4;oXeB&_7VmePd)wn?CMBs5`Sl0QntpPeaLh57xxX!uvX8HaYKG-%Y%inhs#G^EpQq!#cJlCa6ZKspJq znBh0+@k=;{fZ;}`J>RdMOauQ1!y-}iCzO^q@xxi-KNd$H)W?M05LyPdg&cYItnFp+ z#^SIS+4dNUOIl8c&ecuoY-r=t#6QYFI#U2i70I1VQvACzX8{l0_q(%$$n{$JG|CIT z1Tjbc5ZAL|87N@gJzps|g4G3$O@eSHGzWh89hbzd^5bW57QXfn%2>3_oadDLV|g(7 zGMDLng-i4-;*wK;+nz~BF2G|X`=17VcagoV!LfSNVX6!2Z73^nQcp2Hy1Se(FI=T3 zIEFcULd3>MKOZ|5A@wDo9|*-rt0Hd8!jHe5)H@jeetz&oVZ z=1*&_&*S)lm@AnQZeFE-1)6|nj;bnIC)-q-25#SpObeKTtDgpqdF=1-=pfP1BwN@L znpfN5<$ZG*vk9zZ_kN(1kUr*(bGYJAx9wJ+={*ap@E9zu^$X|WmIuoF=A&Mv=B9Wz zF7Otg^c}nr+T(+_h@AF&+RT?PnUtC@plKb=oV~?9mjm`ZO5+8kDR{n>K2v;KYQT@# zJ!&3->AqPK?acDVfxk&wMO+G|5}#5U;v?zbk>jhIUQ%-`ri|%sO$YK3wy~1X2C;BL zhnbMtw}fICi+bizBi;jc|9o4_>k#}-1kS(SDXq5|7;G@oDe|w5z1RV#YO6)PwjvaU zO7}KnTOB>$I(~%TJsgNC6i>CgzfeRcX!m$tKg#Y+g6F~0%v`I(LQ3z?3k#a4iM z#EWu&;D}l`mSmh;J<<-DS$rMT9Rp?U)SqtO9le6UM_rgeFd^$DKbKb)o$tGcHO(sTlJYTxy-XlA_}+R1ad-8Mh`c|cSDpLUfqTD! zx|;G!k4lq+6hT6J+=}sy2)crvx?i=Z`k?o8pQGvU0CMoksU;`9=hFGj#FkB*bC{$UZUPC$u%%%Z4;<{L>ACbEh2Wmiiu{~XR%&NoF z2vzd;x)am}mq?J)fLsMhr*Q-|)f6ug1m15d6}MBA@nEOr_5cOuN+Z zuj_qpX*75-T5AbvGS!PIXh%~=`J9sZtAt7G4v4xr+ss|!2TD34xY8`cT&o+lTNjVt zX@J4a7s}LfFPeGQJB7HW*nd^T5I63Dl??BY55-x5T0LHk8mjH6DqIQh+An+*G3(tXli2oppCP*59OWN}YXMeTv@fs|Q0h#PXw{coO@h0j8Ywa7_o_ zs>!-2nsu@92O%~x_->X?to)Shsv9E21chdMWk7-VKRK zsJ<)&jk)5blDohcrEJX-AAWMBLZmHNW-3hMzlG(mbl>{p%_2dywiS#L%XmBe3|i#Z ze#NVmwY%QL!OidT^;02ed{i(j3TuB0>yp!5AEdS>q9b-q@6$(emzr~bj69+#0WzGc z4SMnYHjgx>E7eu^qzoVEaajka%ux%CXGf)9)U@EO)dNet>cx_lna;lnP@IRLA{v^`@gK8tD@L0}G`eWdA(vwq3~liLRdU{G^8~hTC1wwK`bm?`Z<}cuKYv4+WRS9f=SN z*N3Tmo7xGXV~E;U12#T(NxY8^$X8bC5l&rbERVmGD!$3)XKEEmiazz#UBOb)!P8}* zwMCwn4JM7e;wdh7b0j2uOgsFMvuuIBsTn#77{7N&l|WV|kQX&7pzXSY>A}CvHO@{s zwErONvoo7(bgu%3w=Wum&PaG-Z?>sGvuzq(UjMNpvt*h(a;~xjbR_|nE)jb^=jcOb+9Pmp^SPAAEkkF!BZ$4!H0^w}nL@!sk27iu zJ8rzrKZV>nB6o_ngdV+%#g?9Gox0UiHuoq7+aZCv#l^ZkE0nl zp|pv!Sty`EU(QTO*y-4?mVryBZ@qWjdpjI~CJHYs0lPJ)hb}CA*4>k2`$gt}CFQ^o zc^RptrN$d^_$;%B_xq2HkVz*`sO~|OlH=dww&M*~xxCKmN-Z3i>BKv?X zGIn0mUj6f8+_w1Ilq@BqC>6u5{7p3KW_cWdinyKLzhG{aA0(uV8FCDi(l;8d2bGrRjMOR%J1a)0NQiVs^ern+dhQ4UVatTpl3SC(J( z*nI*p$L%Z6utIVsh{OPy>1G?FsA-yO#`>)_y=8|ux9jR#ZoFUHX)2>O4hmc^h?^7t z2Cmfd%8w_xvit4m>jziA>X#-9996rT{vPdvk2)x|NeV2~V&9GuWrRog3EU5zorUTT zHH06-PaY03ZyX%W()2Z%y!HlG+LUy4he|X4C{zHBp?uT>zV|HV^}nX|NG4d)BU{IW zr^v8PY6u;y-IGR{A2a3+a0ZBs8|J!7YexVo;g>KMGlX0Qi&qayxQ`n!%GtkL3`Fro z=+ad9%e?}{#BX=6y|=1!sXCo)*La1#;!qi;t~PgnYJkv{@J1qyXe4G^8b8g))FMbD z{gByct}RS~g3acFuH(J*!(wk`4MvuJx>P^pf=;)5J$yma?u77lT~+yGTTeB!`&z}m zSdAc9pUr-N6{6v1w}qH1PXbW|cVj{y@J|z< z==GB?fyjI8G4W@<oY?swb zb$L0l$o=-3!L0dm_C1;6n{P%QQ*~v@4^xvn-n}9iSmNeMQCnSF$N%0M#IDU{mlj0d zEFZz0lNLPh&t*-VF8a5qv;+E%s*rSyTy1Qi~8{stW1_u_wRL?aO+@OY|gka=h6+2k1R zHbF1F2TKhvjwR>mWt?c)d9W^qTplUall%6?8AjSBzzBxY6in}^=9leqTOf1KWr2e> z+DHCnH;}7d+e>3&|W#9fujkQAB_%^ZcC)USW zAv5%Ox<%37xqC-E{_L$_&_BGzbdDK)-~TH7ElO6yz82yxc>m9Mk!?zkhYSQMo&IOw;pvj&C{yiqXPc`1ocRc*WnBf41A7TN)n`^z@(M s?A2xX9z9-CjAEWY_y4Iqr*P4Gjnxb#j`1S+N92IbdHZu1OV7Xl9o5sWI{*Lx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_centrifuge.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_centrifuge.png new file mode 100644 index 0000000000000000000000000000000000000000..8852afa9c204dabb5918beec4659274444346d32 GIT binary patch literal 2397 zcmbtVdpOkj8vo7=8up06wkI-^nZhQ;+FhE-WkongD3qlPmD?sILW7KRVt*y0U8@LD zl2HxHeUPbibs6{3WN334W5&p3Ow5egU)wq7={)B=`#k44-#@3F&L^Q@hR4p> z5Td{4UD;S$OJp~%y+RZbVyW{JbY)XEl<1{J`T5*9+3yr&n(F+{bZesJRB%NiP4~r% zzc$|$~U)?)4ZYSt*NoC5vOHkjBV0iROxx#>BHT3u#ekpVQMreY~kO7Oy3PmwWlOZroY_ z$??2;JcTewYW-5?8da{$&>FFCrO!}bR*+@*YsrFv28!UYwb-tCsxzXtbZ&d9T9eQ; z&=GV;#s6>->?4Z}JYb!a35ZdVnFJ7S%>ftCfV&6iVL(lO2Gv=Gg*LE0;X~o!u(E7Q zh7TXV@im%i8Ao}1fEV!u=M_g_q};Bi6qv0HEmvS3^*@srJ$}B zzwFYEo((SVt8BR*m_3}_AR;s_5`ce~$3Z8!O=K|yig_I>Tk#;gev1`?r?bHgSa>TI zG}mH>Qc@g;=o7V>`iO?je&?G&$M8dxZ0t>{B6{)3fi32hA^ii%wg@vzWRP)s=hyP_ z60P`yc0H~vXBHkw&D)U>lu{bfGNHR?eLSWL0ztRyu)o?X=I=lWRb#V@5+?#83-tvC zxbx^GNdvQtZ*(k>rg)HB&Iq;;3%S#QsFU$QRM?H;^3Kz4rD{p)5o;YZl#@g{6Cyyq zf!ocT-P0Xf|3GGGm!Om@VwRyb{N<9xEaVT$sBdv=J8g}xoWio^vdh-BsJpip>PzLF zsG(cF1Zsr1VK=gRZ?E;q8%u`y4Q-4H7;hT;_>G^1819+S)I)bVCSa(E?^qM zFDh&tRi#@Y;d=685kdSSMsPf0xT(IW;?5It^xMohmK^4U(wlLE(Rq)sizq*)L-g()D zi=I6ZaF;>O3pZ@a1G(Lkg++&Fdw1PC!!JvnNW6mO=16V}cPj^K_p)VQND)C>R9NTE zE}yYl+GeZQDsSFVmDFo^S0K4IEeU)knP zLhfxt2RUZh&mD~%ZpOfJoHg$j_UN0Iz(X-Yv=auw>gXsXXge1mEqq~4{%OO6j4gSV z%rj7z&&9VEj;fiMfL!KCqvGbM@G47gqZ)K8bOZz8cLR6d7Z~|eMy1UPI}hXFBuX6b zx#y`qC~&^S2yAVPSGn!|Nc4#A0Dh!*~;f0 z;Hruc|oqef1TQlHGZUE*mfS5LM|+RMtNJsyL?o$Be;R`J?t6j-&%Rtr%mpY9%R# zW~EP#>pbND6C2Bg>e^~R|irgBTC@Wt2dUTX&aD9BW))2}U9=K8XczYI_MFMi0mKF$|( zENo-daB>*f&Z;{|Kz9KShmk-h-xTcTiLKPp+>q%7KwYxX0y@WhT#EUZwVus?ww)bv zh`kj@vmRY7qud-k4~ds+*#ta0Nfd1UkRH`z{*Y2wQW41fGoNEuDW96-uH?Y0@rJr) zvOY)qD0ZDfEtIl`Y&C8Gj?@ z!}`t+8<~Hcc67zWIkpI1&uPce{n3)%ClEvNjDB3Gsxv;Xwygepg`z1Pu%f zpb4pXlmdw4mom~fUdjd3HWjeR7;OAlm#h0nSarcCrhBD@s|ykid3)f)^SUN)AEkXZ zO}C0JEOE(N#|dsQL~VRKvc0(NRdv|dKTL+6HA!M&)-?4%w0wB|oZ z^NH!Ba|ey)F#Yud_^vJ?Tq0&xmJqr{4Qe0e^gp$5>v!kJBGC{Aebv>aSP-r8uNb62 zmHyBD3XS_;aX-%$^uX#?1Ofo>~6{ znz~=0sm!C5LQ}ECLh(fV6~#%Tyb*M9b#rrbw`MBwASj?Q>{((*m^#%9sE=g&|8ADM Z0;f&u%ZU`1?fnqR&Dq1L!ZGM?zX2h%OWFVc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/heating_oven.png b/src/main/resources/assets/hbm/textures/models/machines/heating_oven.png new file mode 100644 index 0000000000000000000000000000000000000000..c441b5062dd4820de1e668315828a312ef6fc13f GIT binary patch literal 6993 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 j5cWu2hgoCRdAa`|eJ4~