diff --git a/changelog b/changelog index d6c23b018..35563cdb4 100644 --- a/changelog +++ b/changelog @@ -15,6 +15,8 @@ * Redstone-over-Radio numeric display * Shows integer RoR values as numbers * Can have up to two display panels per block +* Redstone-over-Radio Graph + * Similar to the numerical display, but instead of showing the number, it logs it every half second and displays it on a graph ## Changed * Doubled bismuth and tantalum yields from high-performance solvent bedrock ore processing @@ -35,4 +37,6 @@ * Fixed assembly machine NEI handler not being able to handle all thirteen inputs at once * Fixed RBMK fuel channels playing the meltdown sound when broken while hot with meltdowns disabled * Fixed destroyer and crate minecarts having the same entity IDs, causing them to turn into each other when loading a save -* Fixed GL state leak for ICF lasers \ No newline at end of file +* Fixed GL state leak for ICF lasers +* Fixed broken localization on some armor resistances +* Fixed afterburn resistance on HEV not working \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index cdef06045..5048b1ebd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5634 +mod_build_number=5649 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 30f95d49e..1d9aecff4 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1095,6 +1095,7 @@ public class ModBlocks { public static Block rbmk_key_pad; public static Block rbmk_gauge; public static Block rbmk_numitron; + public static Block rbmk_graph; public static Block rbmk_autoloader; public static Block rbmk_loader; public static Block rbmk_steam_inlet; @@ -2120,6 +2121,7 @@ public class ModBlocks { rbmk_key_pad = new RBMKKeyPad().setBlockName("rbmk_key_pad").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_display"); rbmk_gauge = new RBMKGauge().setBlockName("rbmk_gauge").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_display"); rbmk_numitron = new RBMKNumitron().setBlockName("rbmk_numitron").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_display"); + rbmk_graph = new RBMKGraph().setBlockName("rbmk_graph").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_display"); rbmk_autoloader = new RBMKAutoloader().setBlockName("rbmk_autoloader").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_autoloader"); rbmk_loader = new RBMKLoader(Material.iron).setBlockName("rbmk_loader").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_loader"); rbmk_steam_inlet = new RBMKInlet(Material.iron).setBlockName("rbmk_steam_inlet").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_steam_inlet"); @@ -3116,6 +3118,7 @@ public class ModBlocks { register(rbmk_key_pad); register(rbmk_gauge); register(rbmk_numitron); + register(rbmk_graph); register(rbmk_autoloader); register(rbmk_loader); register(rbmk_steam_inlet); diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKGraph.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKGraph.java new file mode 100644 index 000000000..85d9d8a41 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKGraph.java @@ -0,0 +1,50 @@ +package com.hbm.blocks.machine.rbmk; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.MainRegistry; +import com.hbm.main.ResourceManager; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKGraph; + +import api.hbm.block.IToolable; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class RBMKGraph extends RBMKMiniPanelBase implements IToolable { + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRBMKGraph(); + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + if(tool != ToolType.SCREWDRIVER) return false; + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } + + @Override + public void renderInventoryBlock(Block block, int meta, int modelId, Object renderBlocks) { + super.renderInventoryBlock(block, meta, modelId, renderBlocks); + + GL11.glPushMatrix(); + GL11.glTranslated(0, -0.5, 0); + GL11.glRotated(-90, 0, 1, 0); + + for(int i = 0; i < 2; i++) { + + GL11.glPushMatrix(); + GL11.glTranslated(0.25, i * -0.5 + 0.25, 0); + Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.rbmk_numitron_tex); + ResourceManager.rbmk_numitron.renderAll(); + GL11.glPopMatrix(); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGraph.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGraph.java new file mode 100644 index 000000000..b4bcfa087 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGraph.java @@ -0,0 +1,150 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKGraph; +import com.hbm.util.i18n.I18nUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +// Literally just GUIScreenRBMKDisplay but with three lines switched out - this sucks ass +public class GUIScreenRBMKGraph extends GuiScreen { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rbmk_graph.png"); + public TileEntityRBMKGraph graph; + protected int xSize = 256; + protected int ySize = 114; + protected int guiLeft; + protected int guiTop; + + protected GuiTextField[] label = new GuiTextField[2]; + protected GuiTextField[] rtty = new GuiTextField[2]; + protected boolean[] active = new boolean[2]; + protected boolean[] polling = new boolean[2]; + + public GUIScreenRBMKGraph(TileEntityRBMKGraph display) { + this.graph = display; + } + + @Override + public void initGui() { + super.initGui(); + this.guiLeft = (this.width - this.xSize) / 2; + this.guiTop = (this.height - this.ySize) / 2; + + Keyboard.enableRepeatEvents(true); + + int oX = 4; + int oY = 4; + + for(int i = 0; i < 2; i++) { + label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 175 + oX, guiTop + 55 + oY + i * 36, 72 - oX * 2, 14); + GUIScreenRBMKKeyPad.setupTextFieldStandard(label[i], 30, graph.graphs[i].label); + rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 55 + oY + i * 36, 72 - oX * 2, 14); + GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], 10, graph.graphs[i].rtty); + + active[i] = graph.graphs[i].active; + polling[i] = graph.graphs[i].polling; + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + this.drawDefaultBackground(); + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + } + + private void drawGuiContainerForegroundLayer(int x, int y) { + String name = I18nUtil.resolveKey("container.rbmkNumitron"); + this.fontRendererObj.drawString(name, this.guiLeft + this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, this.guiTop + 6, 4210752); + } + + private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + for(int i = 0; i < 2; i++) { + if(this.active[i]) drawTexturedModalRect(guiLeft + 111, guiTop + i * 36 + 54, 18, 114, 16, 16); + if(this.polling[i]) drawTexturedModalRect(guiLeft + 128, guiTop + i * 36 + 53, 0, 114, 18, 18); + } + + for(int i = 0; i < 2; i++) { + this.label[i].drawTextBox(); + this.rtty[i].drawTextBox(); + } + } + + @Override + protected void mouseClicked(int x, int y, int b) { + super.mouseClicked(x, y, b); + + for(int i = 0; i < 2; i++) { + if(guiLeft + 111 <= x && guiLeft + 111 + 16 > x && guiTop + i * 36 + 54 < y && guiTop + i * 36 + 54 + 16 >= y) { + this.active[i] = !this.active[i]; + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F + (this.active[i] ? 0.25F : 0F))); + return; + } + + if(guiLeft + 128 <= x && guiLeft + 128 + 18 > x && guiTop + i * 36 + 53 < y && guiTop + i * 36 + 53 + 18 >= y) { + this.polling[i] = !this.polling[i]; + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F + (this.polling[i] ? 0.25F : 0F))); + return; + } + } + + if(guiLeft + 209 <= x && guiLeft + 209 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + byte active = 0; + byte polling = 0; + for(int i = 0; i < 2; i++) { + if(this.active[i]) active |= 1 << i; + if(this.polling[i]) polling |= 1 << i; + } + data.setByte("active", active); + data.setByte("polling", polling); + + for(int i = 0; i < 2; i++) { + data.setString("label" + i, this.label[i].getText()); + data.setString("rtty" + i, this.rtty[i].getText()); + } + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, graph.xCoord, graph.yCoord, graph.zCoord)); + return; + } + + for(int i = 0; i < 2; i++) { + this.label[i].mouseClicked(x, y, b); + this.rtty[i].mouseClicked(x, y, b); + } + } + + @Override + protected void keyTyped(char c, int b) { + + for(int i = 0; i < 2; i++) { + if(this.label[i].textboxKeyTyped(c, b)) return; + if(this.rtty[i].textboxKeyTyped(c, b)) return; + } + + if(b == 1 || b == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.thePlayer.closeScreen(); + this.mc.setIngameFocus(); + } + } + + @Override public void onGuiClosed() { Keyboard.enableRepeatEvents(false); } + @Override public boolean doesGuiPauseGame() { return false; } +} diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 91949874c..4cfc8ec8f 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5634)"; + public static final String VERSION = "1.0.27 BETA (5649)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 926670368..e2908c22b 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -414,6 +414,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKKeyPad.class, new RenderRBMKKeyPad()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKGauge.class, new RenderRBMKGauge()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKNumitron.class, new RenderRBMKNumitron()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKGraph.class, new RenderRBMKGraph()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKRod.class, new RenderRBMKFuelChannel()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKRodReaSim.class, new RenderRBMKFuelChannel()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKAutoloader.class, new RenderRBMKAutoloader()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 42a3e74cc..18fa1f0de 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -796,6 +796,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.rbmk_key_pad, 1), new Object[] { "R", "C", "B", 'R', ModBlocks.radio_torch_sender, 'B', ModBlocks.rbmk_display_blank, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ANALOG) }); addRecipeAuto(new ItemStack(ModBlocks.rbmk_gauge, 1), new Object[] { "R", "C", "B", 'R', ModBlocks.radio_torch_receiver, 'B', ModBlocks.rbmk_display_blank, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE) }); addRecipeAuto(new ItemStack(ModBlocks.rbmk_numitron, 1), new Object[] { " R ", "CCC", " B ", 'R', ModBlocks.radio_torch_receiver, 'B', ModBlocks.rbmk_display_blank, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.NUMITRON) }); + addRecipeAuto(new ItemStack(ModBlocks.rbmk_graph, 1), new Object[] { "R", "C", "B", 'R', ModBlocks.radio_torch_receiver, 'B', ModBlocks.rbmk_display_blank, 'C', ModItems.crt_display }); addRecipeAuto(new ItemStack(ModBlocks.deco_rbmk, 8), new Object[] { "R", 'R', ModBlocks.rbmk_blank }); addRecipeAuto(new ItemStack(ModBlocks.deco_rbmk_smooth, 1), new Object[] { "R", 'R', ModBlocks.deco_rbmk }); diff --git a/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java b/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java index 793837e25..674e9a894 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java +++ b/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java @@ -38,6 +38,7 @@ public class RenderDoorGeneric extends TileEntitySpecialRenderer { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); switch(te.getBlockMetadata() - BlockDummyable.offset) { case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKGraph.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKGraph.java new file mode 100644 index 000000000..580c99c05 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKGraph.java @@ -0,0 +1,109 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKGraph; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKGraph.GraphUnit; +import com.hbm.util.BobMathUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +public class RenderRBMKGraph extends TileEntitySpecialRenderer { + + @Override + public void renderTileEntityAt(TileEntity te, double x, double y, double z, float interp) { + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + + switch(te.getBlockMetadata()) { + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + } + + TileEntityRBMKGraph gauge = (TileEntityRBMKGraph) te; + + for(int i = 0; i < 2; i++) { + GraphUnit unit = gauge.graphs[i]; + if(!unit.active) continue; + + GL11.glPushMatrix(); + GL11.glTranslated(0.25, i * -0.5 + 0.25, 0); + + GL11.glColor3f(1F, 1F, 1F); + this.bindTexture(ResourceManager.rbmk_numitron_tex); + ResourceManager.rbmk_numitron.renderAll(); + + GL11.glPushMatrix(); + + RenderArcFurnace.fullbright(true); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glLineWidth(2F); + + FontRenderer font = Minecraft.getMinecraft().fontRenderer; + int height = font.FONT_HEIGHT; + + int lowest = BobMathUtil.min(unit.values); + int highest = BobMathUtil.max(unit.values); + + Tessellator tess = Tessellator.instance; + tess.startDrawing(GL11.GL_LINES); + tess.setColorOpaque_I(0x00ff00); + int range = highest - lowest; + for(int v = 0; v < unit.values.length - 1; v++) { + for(int j = 0; j < 2; j++) { + int k = v + j; + int flux = unit.values[k]; + double dx = 0.03225; + double dy = 0.5 - 0.03125 + (flux - lowest) * 0.1875D / Math.max(range, 1); + double dz = 0.375 - k * 0.75 / (unit.values.length - 1); + tess.addVertex(dx, dy, dz); + } + } + tess.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + + GL11.glPushMatrix(); + String labelLower = "" + lowest; + String labelUpper = "" + highest; + double lineScale = 0.0025D; + GL11.glTranslated(0.032, 0.5 - 0.03125 * 1.5, -0.375 + 0.03125); + GL11.glScaled(lineScale, -lineScale, lineScale); + GL11.glRotatef(90, 0, 1, 0); + font.drawString("" + labelLower, -font.getStringWidth(labelLower), -height / 2, 0x00ff00); + GL11.glTranslated(0, -0.03125 * 7 / lineScale, 0); + font.drawString("" + labelUpper, -font.getStringWidth(labelUpper), -height / 2, 0x00ff00); + GL11.glPopMatrix(); + + RenderArcFurnace.fullbright(false); + + GL11.glPopMatrix(); + + if(unit.label != null && !unit.label.isEmpty()) { + + GL11.glTranslated(0.01, 0.3125, 0); + int width = font.getStringWidth(unit.label); + float f3 = Math.min(0.0125F, 0.75F / Math.max(width, 1)); + GL11.glScalef(f3, -f3, f3); + GL11.glNormal3f(0.0F, 0.0F, -1.0F); + GL11.glRotatef(90, 0, 1, 0); + + RenderArcFurnace.fullbright(true); + font.drawString(unit.label, - width / 2, - height / 2, 0x00ff00); + RenderArcFurnace.fullbright(false); + } + GL11.glPopMatrix(); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachinePolluting.java b/src/main/java/com/hbm/tileentity/TileEntityMachinePolluting.java index 1660f36e8..1f96c3439 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachinePolluting.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachinePolluting.java @@ -46,7 +46,7 @@ public abstract class TileEntityMachinePolluting extends TileEntityMachineBase i } } public void pollute(FluidType type, FluidTrait.FluidReleaseType release, float amount) { - FluidTank tank; + FT_Polluting trait = type.getTrait(FT_Polluting.class); if(trait == null) return; if(release == FluidTrait.FluidReleaseType.VOID) return; diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index ad2fc1d9c..dde78ebc5 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -406,6 +406,7 @@ public class TileMappings { put(TileEntityRBMKKeyPad.class, "tileentity_rbmk_keypad"); put(TileEntityRBMKGauge.class, "tileentity_rbmk_gauge"); put(TileEntityRBMKNumitron.class, "tileentity_rbmk_numitron"); + put(TileEntityRBMKGraph.class, "tileentity_rbmk_graph"); put(TileEntityRBMKInlet.class, "tileentity_rbmk_inlet"); put(TileEntityRBMKOutlet.class, "tileentity_rbmk_outlet"); put(TileEntityRBMKAutoloader.class, "tileentity_rbmk_autoloader"); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java index bb1d08d56..35238fd2f 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java @@ -7,6 +7,7 @@ import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.interfaces.NotableComments; import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -21,7 +22,7 @@ import net.minecraftforge.common.util.ForgeDirection; @NotableComments @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase implements SimpleComponent, CompatHandler.OCComponent, IEnergyReceiverMK2 { +public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase implements SimpleComponent, CompatHandler.OCComponent, IEnergyReceiverMK2, IRORValueProvider { public double lastLevel; public double level; @@ -226,4 +227,17 @@ public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase im targetLevel = MathHelper.clamp_double(newLevel, 0, 1); return new Object[] {}; } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "extraction" + }; + } + + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "extraction").equals(name)) return "" + (int) (this.level * 100); + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java index 3fbb7384a..d448ac093 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java @@ -198,6 +198,7 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement @Override public String[] getFunctionInfo() { return new String[] { + PREFIX_VALUE + "extraction", PREFIX_FUNCTION + "setrods" + NAME_SEPARATOR + "percent", PREFIX_FUNCTION + "extendrods" + NAME_SEPARATOR + "percent" }; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKGraph.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKGraph.java new file mode 100644 index 000000000..3cd3a8adb --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKGraph.java @@ -0,0 +1,176 @@ +package com.hbm.tileentity.machine.rbmk; + +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.gui.GUIScreenRBMKGraph; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.tileentity.network.RTTYSystem; +import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; +import com.hbm.util.BufferUtil; + +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class TileEntityRBMKGraph extends TileEntityLoadedBase implements IGUIProvider, IControlReceiver { + + /* __________ + * / /| + * /________ / | + * | _______ | | + * ||_______|| | + * | _______ | | + * ||_______|| / + * |_________|/ + */ + + public GraphUnit[] graphs = new GraphUnit[2]; + + public TileEntityRBMKGraph() { + for(int i = 0; i < 2; i++) this.graphs[i] = new GraphUnit(i); + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 10 == 0) for(int i = 0; i < 2; i++) this.graphs[i].update(); + + this.networkPackNT(50); + } + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + for(int i = 0; i < 2; i++) this.graphs[i].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + for(int i = 0; i < 2; i++) this.graphs[i].deserialize(buf); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + for(int i = 0; i < 2; i++) this.graphs[i].readFromNBT(nbt, i); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + for(int i = 0; i < 2; i++) this.graphs[i].writeToNBT(nbt, i); + } + + public class GraphUnit { + + /** If the value should be pulled from the RTTY system every tick, otherwise only on state change */ + public boolean polling; + /** Label on the graph as rendered on the panel */ + public String label = ""; + /** What channel to read values from */ + public String rtty = ""; + /** The current read value on the display */ + public int[] values = new int[30]; // 2 values/s for 15 seconds + /** Whether this graph is visible on the panel */ + public boolean active; + + public GraphUnit(int initialIndex) { + label = "Graph " + (initialIndex + 1); + } + + public void update() { + if(!active) return; + if(rtty == null || rtty.isEmpty()) return; + + RTTYChannel chan = RTTYSystem.listen(worldObj, rtty); + int sigVal = 0; + + if(chan != null && chan.timeStamp < worldObj.getTotalWorldTime() - 1) chan = null; + + // always accept new signals + if(chan != null && chan.signal != null) { + try { sigVal = Integer.parseInt(chan.signal.toString()); } catch(Exception ex) { } + pushValue(sigVal); + } else { + // if there's no new signal and we're polling, set to 0 + if(polling) pushValue(0); + } + } + + public void pushValue(int value) { + + for(int i = 1; i < values.length; i++) { + values[i - 1] = values[i]; + } + values[values.length - 1] = value; + } + + public void serialize(ByteBuf buf) { + buf.writeBoolean(active); + buf.writeBoolean(polling); + BufferUtil.writeString(buf, label); + BufferUtil.writeString(buf, rtty); + // original idea had the system send the min value, max value, and all values + // crunched down to single bytes because the graph simply doesn't need this much resolution + if(active) for(int i = 0; i < values.length; i++) buf.writeInt(values[i]); + // was overkill though + } + + public void deserialize(ByteBuf buf) { + active = buf.readBoolean(); + polling = buf.readBoolean(); + label = BufferUtil.readString(buf); + rtty = BufferUtil.readString(buf); + if(active) for(int i = 0; i < values.length; i++) values[i] = buf.readInt(); + } + + public void readFromNBT(NBTTagCompound nbt, int index) { + this.active = nbt.getBoolean("active" + index); + this.polling = nbt.getBoolean("polling" + index); + this.label = nbt.getString("label" + index); + this.rtty = nbt.getString("rtty" + index); + this.values = nbt.getIntArray("value" + index); + } + + public void writeToNBT(NBTTagCompound nbt, int index) { + nbt.setBoolean("active" + index, active); + nbt.setBoolean("polling" + index, polling); + nbt.setString("label" + index, label); + nbt.setString("rtty" + index, rtty); + nbt.setIntArray("value" + index, values); + } + } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } + @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIScreenRBMKGraph(this); } + + @Override + public boolean hasPermission(EntityPlayer player) { + return player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 15 * 15; + } + + @Override + public void receiveControl(NBTTagCompound data) { + + int active = data.getByte("active"); + int polling = data.getByte("polling"); + for(int i = 0; i < 2; i++) { + this.graphs[i].active = (active & (1 << i)) != 0; + this.graphs[i].polling = (polling & (1 << i)) != 0; + } + + for(int i = 0; i < 2; i++) { + GraphUnit graph = this.graphs[i]; + graph.label = data.getString("label" + i); + graph.rtty = data.getString("rtty" + i); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index 2bbe3477b..cfd6849d9 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -79,7 +79,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public String rtty = ""; /** The current read value on the display */ public int value; - /** Whether this gauge is visible on the panel */ + /** Whether this display is visible on the panel */ public boolean active; public DisplayUnit(int initialIndex) { diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index 2ef164282..0636050b0 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -541,7 +541,7 @@ public class DamageResistanceHandler { public Resistance otherResistance; public Resistance getResistance(DamageSource source) { - Resistance exact = exactResistances.get(source.damageType); + Resistance exact = exactResistances.get(source.damageType.toLowerCase()); if(exact != null) return exact; Resistance category = categoryResistances.get(typeToCategory(source)); if(category != null) return category; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 6b18c92ed..1c699eb13 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -464,6 +464,7 @@ container.rbmkBoiler=RBMK Dampfkanal container.rbmkControl=RBMK Steuerstäbe container.rbmkControlAuto=RBMK Automatische Steuerstäbe container.rbmkGauge=Redstone-over-Radio Meter +container.rbmkGraph=Redstone-over-Radio Graph container.rbmkHeater=RBMK Heizer container.rbmkKeyPad=Redstone-over-Radio Tastenfeld container.rbmkNumitron=Redstone-over-Radio Ziffernanzeige @@ -540,8 +541,8 @@ damage.category.FIRE=Feuer damage.category.PHYS=Physisch damage.exact.drown=Ertrinken damage.exact.fall=Fallschaden -damage.exact.LASER=Laser -damage.exact.onFire=Nachbrennen +damage.exact.laser=Laser +damage.exact.onfire=Nachbrennen damage.other=Andere death.attack.acid=%1$s fiel in Säure. @@ -4908,6 +4909,7 @@ tile.rbmk_crane_console.name=RBMK Kransteuerung tile.rbmk_display.name=RBMK Anzeigepanel tile.rbmk_display_blank.name=Leeres Redstone-over-Radio Panel tile.rbmk_gauge.name=Redstone-over-Radio Meter +tile.rbmk_graph.name=Redstone-over-Radio Graph tile.rbmk_heater.name=RBMK-Heizer tile.rbmk_key_pad.name=Redstone-over-Radio Tastenfeld tile.rbmk_loader.name=RBMK-Dampfadapter diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index aa6985374..282514c78 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -872,6 +872,7 @@ container.rbmkBoiler=RBMK Steam Channel container.rbmkControl=RBMK Control Rods container.rbmkControlAuto=RBMK Automatic Control Rods container.rbmkGauge=Redstone-over-Radio Gauge +container.rbmkGraph=Redstone-over-Radio Graph container.rbmkHeater=RBMK Fluid Heater container.rbmkKeyPad=Redstone-over-Radio Keypad container.rbmkNumitron=Redstone-over-Radio Numeric Display @@ -960,8 +961,8 @@ damage.category.FIRE=Fire damage.category.PHYS=Physical damage.exact.drown=Drowning damage.exact.fall=Fall damage -damage.exact.LASER=Laser -damage.exact.onFire=Afterburn +damage.exact.laser=Laser +damage.exact.onfire=Afterburn damage.other=Other death.attack.acid=%1$s fell into acid. @@ -6176,6 +6177,7 @@ tile.rbmk_crane_console.name=RBMK Crane Console tile.rbmk_display.name=RBMK Display Panel tile.rbmk_display_blank.name=Blank Redstone-over-Radio Panel tile.rbmk_gauge.name=Redstone-over-Radio Gauge +tile.rbmk_graph.name=Redstone-over-Radio Graph tile.rbmk_heater.name=RBMK Fluid Heater tile.rbmk_key_pad.name=Redstone-over-Radio Keypad tile.rbmk_loader.name=RBMK Steam Connector diff --git a/src/main/resources/assets/hbm/models/fusion/plasma_forge.obj b/src/main/resources/assets/hbm/models/fusion/plasma_forge.obj index 162c3f1b1..e1461846b 100644 --- a/src/main/resources/assets/hbm/models/fusion/plasma_forge.obj +++ b/src/main/resources/assets/hbm/models/fusion/plasma_forge.obj @@ -7172,6 +7172,31 @@ vt 0.902655 0.572650 vt 0.902655 0.111111 vt 0.902655 0.264957 vt 0.902655 0.521368 +vt 0.929204 0.564103 +vt 0.938053 0.512821 +vt 0.938053 0.564103 +vt 0.929204 0.153846 +vt 0.938053 0.205128 +vt 0.929204 0.205128 +vt 0.929204 0.102564 +vt 0.938053 0.051282 +vt 0.938053 0.102564 +vt 0.929204 0.307692 +vt 0.938053 0.358974 +vt 0.929204 0.358974 +vt 0.929204 0.461538 +vt 0.929204 0.512821 +vt 0.929204 0.051282 +vt 0.938053 0.000000 +vt 0.929204 0.256410 +vt 0.938053 0.307692 +vt 0.938053 0.410256 +vt 0.938053 0.461538 +vt 0.929204 0.615385 +vt 0.938053 0.615385 +vt 0.938053 0.256410 +vt 0.938053 0.153846 +vt 0.929204 0.410256 vt 0.884956 0.358974 vt 0.823009 0.333333 vt 0.880531 0.333333 @@ -7400,6 +7425,7 @@ vt 0.902655 0.606838 vt 0.902655 0.145299 vt 0.902655 0.299145 vt 0.902655 0.555556 +vt 0.929204 0.000000 vt 0.825221 0.512821 vt 0.878319 0.307692 vt 0.825221 0.307692 @@ -9709,18 +9735,18 @@ f 854/3315/164 843/3674/212 855/1386/212 f 851/1392/158 840/3675/209 852/3318/209 f 848/1398/157 837/3676/211 849/3321/211 f 855/3314/212 844/3677/214 856/1384/214 -f 872/1356/213 861/1391/209 860/1387/213 -f 880/1366/159 868/1403/208 879/1369/208 -f 869/1368/214 858/1383/212 857/1382/214 -f 877/1373/157 864/1397/211 876/1375/211 -f 874/1355/158 861/1391/209 873/1353/209 -f 870/1363/212 859/1385/164 858/1383/212 -f 878/1371/207 865/1399/157 877/1373/157 -f 874/1355/158 863/1395/210 862/1393/158 -f 871/3305/164 860/1387/213 859/1389/164 -f 879/1369/208 866/1401/207 878/1371/207 -f 869/1368/214 867/1381/159 880/1366/159 -f 876/1375/211 863/1395/210 875/1377/210 +f 872/3678/213 861/3679/209 860/3680/213 +f 880/3681/159 868/3682/208 879/3683/208 +f 869/3684/214 858/3685/212 857/3686/214 +f 877/3687/157 864/3688/211 876/3689/211 +f 874/3690/158 861/3679/209 873/3691/209 +f 870/3692/212 859/3693/164 858/3685/212 +f 878/3694/207 865/3695/157 877/3687/157 +f 874/3690/158 863/3696/210 862/3697/158 +f 871/3698/164 860/3680/213 859/3699/164 +f 879/3683/208 866/3700/207 878/3694/207 +f 869/3684/214 867/3701/159 880/3681/159 +f 876/3689/211 863/3696/210 875/3702/210 f 906/1449/159 907/1468/174 905/1467/159 f 908/1451/174 909/1470/164 907/1468/174 f 910/1453/164 911/1472/192 909/1470/164 @@ -9745,114 +9771,114 @@ f 1045/3383/171 1046/1603/221 1044/1602/171 f 1046/1603/221 1049/1586/157 1048/1605/157 f 1049/1586/157 1050/1607/222 1048/1605/157 f 1050/1607/222 1037/1556/179 1036/1608/179 -f 935/3678/223 1064/3679/224 936/3680/224 -f 929/3681/184 1064/3679/224 1063/3682/184 -f 929/3683/184 1062/3684/225 930/3685/225 -f 930/3685/225 1061/3686/226 931/3687/226 -f 931/3687/226 1060/3688/227 932/3689/227 -f 932/3689/227 1059/3690/185 933/3691/185 -f 933/3691/185 1066/3692/228 934/3693/228 -f 934/3693/228 1065/3694/223 935/3678/223 -f 927/3695/229 988/3696/230 987/3697/229 -f 921/3698/182 988/3696/230 928/3699/230 -f 922/3700/231 981/3701/182 921/3702/182 -f 922/3700/231 983/3703/232 982/3704/231 -f 924/3705/233 983/3703/232 923/3706/232 -f 924/3705/233 985/3707/183 984/3708/233 -f 926/3709/234 985/3707/183 925/3710/183 -f 926/3709/234 987/3697/229 986/3711/234 -f 1035/3712/235 957/3713/180 964/3714/235 -f 957/3715/180 1029/3716/236 958/3717/236 -f 1029/3716/236 959/3718/237 958/3717/236 -f 1030/3719/237 960/3720/238 959/3718/237 -f 960/3720/238 1032/3721/181 961/3722/181 -f 1032/3721/181 962/3723/239 961/3722/181 -f 1033/3724/239 963/3725/240 962/3723/239 -f 1034/3726/240 964/3714/235 963/3725/240 -f 1009/3727/186 970/3728/241 969/3729/186 -f 1008/3730/242 969/3731/186 968/3732/242 -f 1007/3733/243 968/3732/242 967/3734/243 -f 1006/3735/244 967/3734/243 966/3736/244 -f 1005/3737/187 966/3736/244 965/3738/187 -f 1012/3739/245 965/3738/187 972/3740/245 -f 971/3741/246 1012/3739/245 972/3740/245 -f 1010/3742/241 971/3741/246 970/3728/241 -f 1016/3743/162 1056/3744/247 1017/3745/247 -f 1054/3746/248 1016/3747/162 1015/3748/248 -f 1014/3749/249 1054/3746/248 1015/3748/248 -f 1052/3750/250 1014/3749/249 1013/3751/250 -f 1018/3752/251 1058/3753/252 1019/3754/252 -f 1056/3744/247 1018/3752/251 1017/3745/247 -f 1333/1876/253 1396/3755/254 1332/1874/254 +f 935/3703/223 1064/3704/224 936/3705/224 +f 929/3706/184 1064/3704/224 1063/3707/184 +f 929/3708/184 1062/3709/225 930/3710/225 +f 930/3710/225 1061/3711/226 931/3712/226 +f 931/3712/226 1060/3713/227 932/3714/227 +f 932/3714/227 1059/3715/185 933/3716/185 +f 933/3716/185 1066/3717/228 934/3718/228 +f 934/3718/228 1065/3719/223 935/3703/223 +f 927/3720/229 988/3721/230 987/3722/229 +f 921/3723/182 988/3721/230 928/3724/230 +f 922/3725/231 981/3726/182 921/3727/182 +f 922/3725/231 983/3728/232 982/3729/231 +f 924/3730/233 983/3728/232 923/3731/232 +f 924/3730/233 985/3732/183 984/3733/233 +f 926/3734/234 985/3732/183 925/3735/183 +f 926/3734/234 987/3722/229 986/3736/234 +f 1035/3737/235 957/3738/180 964/3739/235 +f 957/3740/180 1029/3741/236 958/3742/236 +f 1029/3741/236 959/3743/237 958/3742/236 +f 1030/3744/237 960/3745/238 959/3743/237 +f 960/3745/238 1032/3746/181 961/3747/181 +f 1032/3746/181 962/3748/239 961/3747/181 +f 1033/3749/239 963/3750/240 962/3748/239 +f 1034/3751/240 964/3739/235 963/3750/240 +f 1009/3752/186 970/3753/241 969/3754/186 +f 1008/3755/242 969/3756/186 968/3757/242 +f 1007/3758/243 968/3757/242 967/3759/243 +f 1006/3760/244 967/3759/243 966/3761/244 +f 1005/3762/187 966/3761/244 965/3763/187 +f 1012/3764/245 965/3763/187 972/3765/245 +f 971/3766/246 1012/3764/245 972/3765/245 +f 1010/3767/241 971/3766/246 970/3753/241 +f 1016/3768/162 1056/3769/247 1017/3770/247 +f 1054/3771/248 1016/3772/162 1015/3773/248 +f 1014/3774/249 1054/3771/248 1015/3773/248 +f 1052/3775/250 1014/3774/249 1013/3776/250 +f 1018/3777/251 1058/3778/252 1019/3779/252 +f 1056/3769/247 1018/3777/251 1017/3770/247 +f 1333/1876/253 1396/3780/254 1332/1874/254 f 1306/1886/255 1371/1953/159 1307/1885/159 -f 1334/1875/256 1397/3756/253 1333/1876/253 +f 1334/1875/256 1397/3781/253 1333/1876/253 f 1307/1887/159 1372/1956/257 1308/1890/257 -f 1335/1878/161 1398/3757/256 1334/1875/256 +f 1335/1878/161 1398/3782/256 1334/1875/256 f 1308/1890/257 1373/1958/258 1309/1893/258 -f 1336/1880/259 1399/3758/161 1335/1878/161 +f 1336/1880/259 1399/3783/161 1335/1878/161 f 1309/1893/258 1374/1960/260 1310/1892/260 f 1283/1906/156 1347/1971/254 1284/1904/254 -f 1337/1882/261 1400/3759/259 1336/1880/259 +f 1337/1882/261 1400/3784/259 1336/1880/259 f 1310/1892/260 1375/1962/163 1311/1896/163 f 1284/1904/254 1349/1974/253 1285/1907/253 -f 1338/1884/262 1401/3760/261 1337/1882/261 +f 1338/1884/262 1401/3785/261 1337/1882/261 f 1311/1896/163 1376/1964/263 1312/1899/263 f 1285/1907/253 1350/1976/256 1286/1909/256 -f 1339/3428/158 1402/3761/262 1338/1884/262 +f 1339/3428/158 1402/3786/262 1338/1884/262 f 1312/1899/263 1377/1965/264 1313/1898/264 f 1286/1909/256 1351/1978/161 1287/1911/161 -f 1340/1888/265 1403/3762/158 1339/1889/158 +f 1340/1888/265 1403/3787/158 1339/1889/158 f 1313/1898/264 1378/1967/266 1314/1900/266 f 1287/1911/161 1352/1980/259 1288/1913/259 -f 1341/1891/267 1404/3763/265 1340/1888/265 +f 1341/1891/267 1404/3788/265 1340/1888/265 f 1314/1900/266 1348/1969/156 1283/1902/156 f 1288/1913/259 1353/1982/261 1289/1915/261 -f 1342/1895/268 1405/3764/267 1341/1891/267 -f 1316/1908/269 1380/3765/155 1315/1905/155 +f 1342/1895/268 1405/3789/267 1341/1891/267 +f 1316/1908/269 1380/3790/155 1315/1905/155 f 1289/1915/261 1354/1984/262 1290/1917/262 -f 1343/1894/160 1406/3766/268 1342/1895/268 -f 1317/1910/270 1379/3767/269 1316/1908/269 +f 1343/1894/160 1406/3791/268 1342/1895/268 +f 1317/1910/270 1379/3792/269 1316/1908/269 f 1290/1917/262 1355/1986/158 1291/1919/158 -f 1344/1897/271 1407/3768/160 1343/1894/160 -f 1318/1912/272 1381/3769/270 1317/1910/270 +f 1344/1897/271 1407/3793/160 1343/1894/160 +f 1318/1912/272 1381/3794/270 1317/1910/270 f 1291/1921/158 1356/1989/265 1292/1925/265 -f 1345/1901/273 1408/3770/271 1344/1897/271 -f 1319/1914/162 1382/3771/272 1318/1912/272 +f 1345/1901/273 1408/3795/271 1344/1897/271 +f 1319/1914/162 1382/3796/272 1318/1912/272 f 1292/1925/265 1357/1990/267 1293/1924/267 -f 1346/1903/274 1409/3772/273 1345/1901/273 -f 1320/1916/275 1383/3773/162 1319/1914/162 +f 1346/1903/274 1409/3797/273 1345/1901/273 +f 1320/1916/275 1383/3798/162 1319/1914/162 f 1293/1924/267 1358/1929/268 1294/1861/268 -f 1315/3429/155 1410/3774/274 1346/1903/274 -f 1321/1918/276 1384/3775/275 1320/1916/275 +f 1315/3429/155 1410/3799/274 1346/1903/274 +f 1321/1918/276 1384/3800/275 1320/1916/275 f 1294/1861/268 1359/1928/160 1295/1859/160 -f 1322/1920/255 1385/3776/276 1321/1918/276 +f 1322/1920/255 1385/3801/276 1321/1918/276 f 1295/1859/160 1360/1931/271 1296/1862/271 -f 1323/3430/159 1386/3777/255 1322/1920/255 +f 1323/3430/159 1386/3802/255 1322/1920/255 f 1296/1862/271 1361/1933/273 1297/1864/273 -f 1324/1922/257 1387/3778/159 1323/1923/159 +f 1324/1922/257 1387/3803/159 1323/1923/159 f 1297/1864/273 1362/1935/274 1298/1866/274 -f 1325/1926/258 1388/3779/257 1324/1922/257 +f 1325/1926/258 1388/3804/257 1324/1922/257 f 1298/1866/274 1363/1937/155 1299/1868/155 -f 1326/1860/260 1389/3780/258 1325/1926/258 +f 1326/1860/260 1389/3805/258 1325/1926/258 f 1299/1872/155 1364/1939/269 1300/1870/269 -f 1327/1863/163 1390/3781/260 1326/1860/260 +f 1327/1863/163 1390/3806/260 1326/1860/260 f 1300/1870/269 1365/1942/270 1301/1873/270 -f 1328/1865/263 1391/3782/163 1327/1863/163 +f 1328/1865/263 1391/3807/163 1327/1863/163 f 1301/1873/270 1366/1944/272 1302/1877/272 -f 1329/1867/264 1392/3783/263 1328/1865/263 +f 1329/1867/264 1392/3808/263 1328/1865/263 f 1302/1877/272 1367/1946/162 1303/1879/162 -f 1330/1869/266 1393/3784/264 1329/1867/264 +f 1330/1869/266 1393/3809/264 1329/1867/264 f 1303/1879/162 1368/1948/275 1304/1881/275 -f 1331/3427/156 1394/3785/266 1330/1869/266 +f 1331/3427/156 1394/3810/266 1330/1869/266 f 1304/1881/275 1369/1950/276 1305/1883/276 -f 1332/1874/254 1395/3786/156 1331/1871/156 +f 1332/1874/254 1395/3811/156 1331/1871/156 f 1305/1883/276 1370/1952/255 1306/1886/255 -f 1764/3787/163 1780/3788/277 1765/3789/277 -f 1778/3790/278 1764/3791/163 1763/3792/278 -f 1762/3793/279 1778/3790/278 1763/3792/278 -f 1761/3794/280 1777/3795/279 1762/3793/279 -f 1766/3796/281 1782/3797/282 1767/3798/282 -f 1780/3788/277 1766/3796/281 1765/3789/277 +f 1764/3812/163 1780/3813/277 1765/3814/277 +f 1778/3815/278 1764/3816/163 1763/3817/278 +f 1762/3818/279 1778/3815/278 1763/3817/278 +f 1761/3819/280 1777/3820/279 1762/3818/279 +f 1766/3821/281 1782/3822/282 1767/3823/282 +f 1780/3813/277 1766/3821/281 1765/3814/277 f 977/1511/169 1760/2488/283 978/1512/283 f 1760/2488/283 979/1514/157 978/1512/283 f 979/1514/157 1758/2485/284 980/1516/284 @@ -9893,50 +9919,50 @@ f 2105/3599/179 2106/2924/222 2104/2923/179 f 2107/2905/222 2108/2926/157 2106/2924/222 f 2108/2926/157 2111/2878/221 2110/2927/221 f 2110/2927/221 2097/2877/171 2096/2929/171 -f 2015/3799/291 2124/3800/292 2016/3801/292 -f 2009/3802/185 2124/3800/292 2123/3803/185 -f 2009/3804/185 2122/3805/293 2010/3806/293 -f 2011/3807/294 2122/3805/293 2121/3808/294 -f 2011/3807/294 2120/3809/295 2012/3810/295 -f 2012/3810/295 2119/3811/184 2013/3812/184 -f 2013/3812/184 2126/3813/296 2014/3814/296 -f 2014/3814/296 2125/3815/291 2015/3799/291 -f 2008/3816/297 2047/3817/298 2007/3818/298 -f 2001/3819/183 2048/3820/297 2008/3816/297 -f 2001/3821/183 2042/3822/299 2041/3823/183 -f 2002/3824/299 2043/3825/300 2042/3822/299 -f 2004/3826/301 2043/3825/300 2003/3827/300 -f 2004/3826/301 2045/3828/182 2044/3829/301 -f 2006/3830/302 2045/3828/182 2005/3831/182 -f 2006/3830/302 2047/3817/298 2046/3832/302 -f 2095/3833/303 2017/3834/181 2024/3835/303 -f 2017/3836/181 2089/3837/304 2018/3838/304 -f 2089/3837/304 2019/3839/305 2018/3838/304 -f 2090/3840/305 2020/3841/306 2019/3839/305 -f 2020/3841/306 2092/3842/180 2021/3843/180 -f 2092/3842/180 2022/3844/307 2021/3843/180 -f 2093/3845/307 2023/3846/308 2022/3844/307 -f 2023/3846/308 2095/3833/303 2024/3835/303 -f 2029/3847/187 2070/3848/309 2030/3849/309 -f 2068/3850/310 2029/3851/187 2028/3852/310 -f 2027/3853/311 2068/3850/310 2028/3852/310 -f 2066/3854/312 2027/3853/311 2026/3855/312 -f 2065/3856/186 2026/3855/312 2025/3857/186 -f 2072/3858/313 2025/3857/186 2032/3859/313 -f 2031/3860/314 2072/3858/313 2032/3859/313 -f 2070/3848/309 2031/3860/314 2030/3849/309 -f 2076/3861/161 2116/3862/315 2077/3863/315 -f 2114/3864/316 2076/3865/161 2075/3866/316 -f 2074/3867/317 2114/3864/316 2075/3866/316 -f 2112/3868/318 2074/3867/317 2073/3869/318 -f 2078/3870/319 2118/3871/320 2079/3872/320 -f 2116/3862/315 2078/3870/319 2077/3863/315 -f 2299/3873/160 2285/3874/321 2284/3875/160 -f 2298/3876/322 2284/3877/160 2283/3878/322 -f 2297/3879/323 2283/3878/322 2282/3880/323 -f 2296/3881/324 2282/3880/323 2281/3882/324 -f 2286/3883/325 2302/3884/326 2287/3885/326 -f 2300/3886/321 2286/3883/325 2285/3874/321 +f 2015/3824/291 2124/3825/292 2016/3826/292 +f 2009/3827/185 2124/3825/292 2123/3828/185 +f 2009/3829/185 2122/3830/293 2010/3831/293 +f 2011/3832/294 2122/3830/293 2121/3833/294 +f 2011/3832/294 2120/3834/295 2012/3835/295 +f 2012/3835/295 2119/3836/184 2013/3837/184 +f 2013/3837/184 2126/3838/296 2014/3839/296 +f 2014/3839/296 2125/3840/291 2015/3824/291 +f 2008/3841/297 2047/3842/298 2007/3843/298 +f 2001/3844/183 2048/3845/297 2008/3841/297 +f 2001/3846/183 2042/3847/299 2041/3848/183 +f 2002/3849/299 2043/3850/300 2042/3847/299 +f 2004/3851/301 2043/3850/300 2003/3852/300 +f 2004/3851/301 2045/3853/182 2044/3854/301 +f 2006/3855/302 2045/3853/182 2005/3856/182 +f 2006/3855/302 2047/3842/298 2046/3857/302 +f 2095/3858/303 2017/3859/181 2024/3860/303 +f 2017/3861/181 2089/3862/304 2018/3863/304 +f 2089/3862/304 2019/3864/305 2018/3863/304 +f 2090/3865/305 2020/3866/306 2019/3864/305 +f 2020/3866/306 2092/3867/180 2021/3868/180 +f 2092/3867/180 2022/3869/307 2021/3868/180 +f 2093/3870/307 2023/3871/308 2022/3869/307 +f 2023/3871/308 2095/3858/303 2024/3860/303 +f 2029/3872/187 2070/3873/309 2030/3874/309 +f 2068/3875/310 2029/3876/187 2028/3877/310 +f 2027/3878/311 2068/3875/310 2028/3877/310 +f 2066/3879/312 2027/3878/311 2026/3880/312 +f 2065/3881/186 2026/3880/312 2025/3882/186 +f 2072/3883/313 2025/3882/186 2032/3884/313 +f 2031/3885/314 2072/3883/313 2032/3884/313 +f 2070/3873/309 2031/3885/314 2030/3874/309 +f 2076/3886/161 2116/3887/315 2077/3888/315 +f 2114/3889/316 2076/3890/161 2075/3891/316 +f 2074/3892/317 2114/3889/316 2075/3891/316 +f 2112/3893/318 2074/3892/317 2073/3894/318 +f 2078/3895/319 2118/3896/320 2079/3897/320 +f 2116/3887/315 2078/3895/319 2077/3888/315 +f 2299/3898/160 2285/3899/321 2284/3900/160 +f 2298/3901/322 2284/3902/160 2283/3903/322 +f 2297/3904/323 2283/3903/322 2282/3905/323 +f 2296/3906/324 2282/3905/323 2281/3907/324 +f 2286/3908/325 2302/3909/326 2287/3910/326 +f 2300/3911/321 2286/3908/325 2285/3899/321 f 2037/2831/168 2280/3196/284 2038/2832/284 f 2280/3196/284 2039/2834/157 2038/2832/284 f 2279/3194/157 2040/2835/283 2039/2834/157 @@ -9965,18 +9991,18 @@ f 674/1164/157 686/1139/157 687/1141/207 f 681/1173/213 693/1154/213 694/1156/209 f 671/1170/158 684/1133/158 683/1135/210 f 679/1179/212 678/1183/214 690/1147/214 -f 696/3267/213 708/3887/213 707/3649/209 -f 703/1140/157 715/3888/157 714/3650/207 -f 700/1146/159 712/3889/159 711/3651/214 -f 697/3266/164 709/3890/164 708/3652/213 +f 696/3267/213 708/3912/213 707/3649/209 +f 703/1140/157 715/3913/157 714/3650/207 +f 700/1146/159 712/3914/159 711/3651/214 +f 697/3266/164 709/3915/164 708/3652/213 f 703/3259/157 704/1138/211 716/3653/211 -f 701/1144/208 713/3891/208 712/3655/159 +f 701/1144/208 713/3916/208 712/3655/159 f 697/1150/164 698/3265/212 710/3656/212 -f 705/1136/210 717/3892/210 716/3658/211 -f 695/1157/209 707/3893/209 718/3659/158 -f 702/1142/207 714/3894/207 713/3660/208 -f 699/1148/214 711/3895/214 710/3661/212 -f 706/3257/158 718/3896/158 717/3662/210 +f 705/1136/210 717/3917/210 716/3658/211 +f 695/1157/209 707/3918/209 718/3659/158 +f 702/1142/207 714/3919/207 713/3660/208 +f 699/1148/214 711/3920/214 710/3661/212 +f 706/3257/158 718/3921/158 717/3662/210 f 738/1239/214 762/1216/214 763/3289/212 f 724/3270/209 748/1188/209 747/1190/213 f 719/3275/159 744/1203/159 754/1205/208 @@ -10026,29 +10052,29 @@ f 832/3306/158 807/1332/158 797/1334/210 f 827/3311/214 803/1347/214 804/1349/212 f 813/1296/209 789/1321/209 788/3292/213 f 846/1404/208 845/3324/159 833/3663/159 -f 852/1390/209 840/3897/209 841/3665/213 -f 849/1396/211 837/3898/211 838/3666/210 -f 856/1380/214 844/3899/214 833/3667/159 +f 852/1390/209 840/3922/209 841/3665/213 +f 849/1396/211 837/3923/211 838/3666/210 +f 856/1380/214 844/3924/214 833/3667/159 f 847/3323/207 846/1402/208 834/3668/208 f 854/1388/164 853/3316/213 841/3670/213 -f 850/1394/210 838/3900/210 839/3672/158 -f 847/1400/207 835/3901/207 836/3673/157 -f 854/3315/164 842/3902/164 843/3674/212 -f 851/1392/158 839/3903/158 840/3675/209 -f 848/1398/157 836/3904/157 837/3676/211 -f 855/3314/212 843/3905/212 844/3677/214 -f 872/1356/213 873/1353/209 861/1391/209 -f 880/1366/159 867/1381/159 868/1403/208 -f 869/1368/214 870/1363/212 858/1383/212 -f 877/1373/157 865/1399/157 864/1397/211 -f 874/1355/158 862/1393/158 861/1391/209 -f 870/1363/212 871/1360/164 859/1385/164 -f 878/1371/207 866/1401/207 865/1399/157 -f 874/1355/158 875/1377/210 863/1395/210 -f 871/3305/164 872/1356/213 860/1387/213 -f 879/1369/208 868/1403/208 866/1401/207 -f 869/1368/214 857/1382/214 867/1381/159 -f 876/1375/211 864/1397/211 863/1395/210 +f 850/1394/210 838/3925/210 839/3672/158 +f 847/1400/207 835/3926/207 836/3673/157 +f 854/3315/164 842/3927/164 843/3674/212 +f 851/1392/158 839/3928/158 840/3675/209 +f 848/1398/157 836/3929/157 837/3676/211 +f 855/3314/212 843/3930/212 844/3677/214 +f 872/3678/213 873/3691/209 861/3679/209 +f 880/3681/159 867/3701/159 868/3682/208 +f 869/3684/214 870/3692/212 858/3685/212 +f 877/3687/157 865/3695/157 864/3688/211 +f 874/3690/158 862/3697/158 861/3679/209 +f 870/3692/212 871/3931/164 859/3693/164 +f 878/3694/207 866/3700/207 865/3695/157 +f 874/3690/158 875/3702/210 863/3696/210 +f 871/3698/164 872/3678/213 860/3680/213 +f 879/3683/208 868/3682/208 866/3700/207 +f 869/3684/214 857/3686/214 867/3701/159 +f 876/3689/211 864/3688/211 863/3696/210 f 906/1449/159 908/1451/174 907/1468/174 f 908/1451/174 910/1453/164 909/1470/164 f 910/1453/164 912/1455/192 911/1472/192 @@ -10073,114 +10099,114 @@ f 1045/3383/171 1047/1584/221 1046/1603/221 f 1046/1603/221 1047/1584/221 1049/1586/157 f 1049/1586/157 1051/1557/222 1050/1607/222 f 1050/1607/222 1051/1557/222 1037/1556/179 -f 935/3678/223 1065/3694/223 1064/3679/224 -f 929/3681/184 936/3680/224 1064/3679/224 -f 929/3683/184 1063/3906/184 1062/3684/225 -f 930/3685/225 1062/3684/225 1061/3686/226 -f 931/3687/226 1061/3686/226 1060/3688/227 -f 932/3689/227 1060/3688/227 1059/3690/185 -f 933/3691/185 1059/3690/185 1066/3692/228 -f 934/3693/228 1066/3692/228 1065/3694/223 -f 927/3695/229 928/3699/230 988/3696/230 -f 921/3698/182 981/3907/182 988/3696/230 -f 922/3700/231 982/3704/231 981/3701/182 -f 922/3700/231 923/3706/232 983/3703/232 -f 924/3705/233 984/3708/233 983/3703/232 -f 924/3705/233 925/3710/183 985/3707/183 -f 926/3709/234 986/3711/234 985/3707/183 -f 926/3709/234 927/3695/229 987/3697/229 -f 1035/3712/235 1028/3908/180 957/3713/180 -f 957/3715/180 1028/3909/180 1029/3716/236 -f 1029/3716/236 1030/3719/237 959/3718/237 -f 1030/3719/237 1031/3910/238 960/3720/238 -f 960/3720/238 1031/3910/238 1032/3721/181 -f 1032/3721/181 1033/3724/239 962/3723/239 -f 1033/3724/239 1034/3726/240 963/3725/240 -f 1034/3726/240 1035/3712/235 964/3714/235 -f 1009/3727/186 1010/3742/241 970/3728/241 -f 1008/3730/242 1009/3911/186 969/3731/186 -f 1007/3733/243 1008/3730/242 968/3732/242 -f 1006/3735/244 1007/3733/243 967/3734/243 -f 1005/3737/187 1006/3735/244 966/3736/244 -f 1012/3739/245 1005/3737/187 965/3738/187 -f 971/3741/246 1011/3912/246 1012/3739/245 -f 1010/3742/241 1011/3912/246 971/3741/246 -f 1016/3743/162 1055/3913/162 1056/3744/247 -f 1054/3746/248 1055/3914/162 1016/3747/162 -f 1014/3749/249 1053/3915/249 1054/3746/248 -f 1052/3750/250 1053/3915/249 1014/3749/249 -f 1018/3752/251 1057/3916/251 1058/3753/252 -f 1056/3744/247 1057/3916/251 1018/3752/251 -f 1333/1876/253 1397/3756/253 1396/3755/254 +f 935/3703/223 1065/3719/223 1064/3704/224 +f 929/3706/184 936/3705/224 1064/3704/224 +f 929/3708/184 1063/3932/184 1062/3709/225 +f 930/3710/225 1062/3709/225 1061/3711/226 +f 931/3712/226 1061/3711/226 1060/3713/227 +f 932/3714/227 1060/3713/227 1059/3715/185 +f 933/3716/185 1059/3715/185 1066/3717/228 +f 934/3718/228 1066/3717/228 1065/3719/223 +f 927/3720/229 928/3724/230 988/3721/230 +f 921/3723/182 981/3933/182 988/3721/230 +f 922/3725/231 982/3729/231 981/3726/182 +f 922/3725/231 923/3731/232 983/3728/232 +f 924/3730/233 984/3733/233 983/3728/232 +f 924/3730/233 925/3735/183 985/3732/183 +f 926/3734/234 986/3736/234 985/3732/183 +f 926/3734/234 927/3720/229 987/3722/229 +f 1035/3737/235 1028/3934/180 957/3738/180 +f 957/3740/180 1028/3935/180 1029/3741/236 +f 1029/3741/236 1030/3744/237 959/3743/237 +f 1030/3744/237 1031/3936/238 960/3745/238 +f 960/3745/238 1031/3936/238 1032/3746/181 +f 1032/3746/181 1033/3749/239 962/3748/239 +f 1033/3749/239 1034/3751/240 963/3750/240 +f 1034/3751/240 1035/3737/235 964/3739/235 +f 1009/3752/186 1010/3767/241 970/3753/241 +f 1008/3755/242 1009/3937/186 969/3756/186 +f 1007/3758/243 1008/3755/242 968/3757/242 +f 1006/3760/244 1007/3758/243 967/3759/243 +f 1005/3762/187 1006/3760/244 966/3761/244 +f 1012/3764/245 1005/3762/187 965/3763/187 +f 971/3766/246 1011/3938/246 1012/3764/245 +f 1010/3767/241 1011/3938/246 971/3766/246 +f 1016/3768/162 1055/3939/162 1056/3769/247 +f 1054/3771/248 1055/3940/162 1016/3772/162 +f 1014/3774/249 1053/3941/249 1054/3771/248 +f 1052/3775/250 1053/3941/249 1014/3774/249 +f 1018/3777/251 1057/3942/251 1058/3778/252 +f 1056/3769/247 1057/3942/251 1018/3777/251 +f 1333/1876/253 1397/3781/253 1396/3780/254 f 1306/1886/255 1370/1952/255 1371/1953/159 -f 1334/1875/256 1398/3757/256 1397/3756/253 +f 1334/1875/256 1398/3782/256 1397/3781/253 f 1307/1887/159 1371/1954/159 1372/1956/257 -f 1335/1878/161 1399/3758/161 1398/3757/256 +f 1335/1878/161 1399/3783/161 1398/3782/256 f 1308/1890/257 1372/1956/257 1373/1958/258 -f 1336/1880/259 1400/3759/259 1399/3758/161 +f 1336/1880/259 1400/3784/259 1399/3783/161 f 1309/1893/258 1373/1958/258 1374/1960/260 f 1283/1906/156 1348/1972/156 1347/1971/254 -f 1337/1882/261 1401/3760/261 1400/3759/259 +f 1337/1882/261 1401/3785/261 1400/3784/259 f 1310/1892/260 1374/1960/260 1375/1962/163 f 1284/1904/254 1347/1971/254 1349/1974/253 -f 1338/1884/262 1402/3761/262 1401/3760/261 +f 1338/1884/262 1402/3786/262 1401/3785/261 f 1311/1896/163 1375/1962/163 1376/1964/263 f 1285/1907/253 1349/1974/253 1350/1976/256 -f 1339/3428/158 1403/3917/158 1402/3761/262 +f 1339/3428/158 1403/3943/158 1402/3786/262 f 1312/1899/263 1376/1964/263 1377/1965/264 f 1286/1909/256 1350/1976/256 1351/1978/161 -f 1340/1888/265 1404/3763/265 1403/3762/158 +f 1340/1888/265 1404/3788/265 1403/3787/158 f 1313/1898/264 1377/1965/264 1378/1967/266 f 1287/1911/161 1351/1978/161 1352/1980/259 -f 1341/1891/267 1405/3764/267 1404/3763/265 +f 1341/1891/267 1405/3789/267 1404/3788/265 f 1314/1900/266 1378/1967/266 1348/1969/156 f 1288/1913/259 1352/1980/259 1353/1982/261 -f 1342/1895/268 1406/3766/268 1405/3764/267 -f 1316/1908/269 1379/3767/269 1380/3765/155 +f 1342/1895/268 1406/3791/268 1405/3789/267 +f 1316/1908/269 1379/3792/269 1380/3790/155 f 1289/1915/261 1353/1982/261 1354/1984/262 -f 1343/1894/160 1407/3768/160 1406/3766/268 -f 1317/1910/270 1381/3769/270 1379/3767/269 +f 1343/1894/160 1407/3793/160 1406/3791/268 +f 1317/1910/270 1381/3794/270 1379/3792/269 f 1290/1917/262 1354/1984/262 1355/1986/158 -f 1344/1897/271 1408/3770/271 1407/3768/160 -f 1318/1912/272 1382/3771/272 1381/3769/270 +f 1344/1897/271 1408/3795/271 1407/3793/160 +f 1318/1912/272 1382/3796/272 1381/3794/270 f 1291/1921/158 1355/1987/158 1356/1989/265 -f 1345/1901/273 1409/3772/273 1408/3770/271 -f 1319/1914/162 1383/3773/162 1382/3771/272 +f 1345/1901/273 1409/3797/273 1408/3795/271 +f 1319/1914/162 1383/3798/162 1382/3796/272 f 1292/1925/265 1356/1989/265 1357/1990/267 -f 1346/1903/274 1410/3774/274 1409/3772/273 -f 1320/1916/275 1384/3775/275 1383/3773/162 +f 1346/1903/274 1410/3799/274 1409/3797/273 +f 1320/1916/275 1384/3800/275 1383/3798/162 f 1293/1924/267 1357/1990/267 1358/1929/268 -f 1315/3429/155 1380/3918/155 1410/3774/274 -f 1321/1918/276 1385/3776/276 1384/3775/275 +f 1315/3429/155 1380/3944/155 1410/3799/274 +f 1321/1918/276 1385/3801/276 1384/3800/275 f 1294/1861/268 1358/1929/268 1359/1928/160 -f 1322/1920/255 1386/3777/255 1385/3776/276 +f 1322/1920/255 1386/3802/255 1385/3801/276 f 1295/1859/160 1359/1928/160 1360/1931/271 -f 1323/3430/159 1387/3919/159 1386/3777/255 +f 1323/3430/159 1387/3945/159 1386/3802/255 f 1296/1862/271 1360/1931/271 1361/1933/273 -f 1324/1922/257 1388/3779/257 1387/3778/159 +f 1324/1922/257 1388/3804/257 1387/3803/159 f 1297/1864/273 1361/1933/273 1362/1935/274 -f 1325/1926/258 1389/3780/258 1388/3779/257 +f 1325/1926/258 1389/3805/258 1388/3804/257 f 1298/1866/274 1362/1935/274 1363/1937/155 -f 1326/1860/260 1390/3781/260 1389/3780/258 +f 1326/1860/260 1390/3806/260 1389/3805/258 f 1299/1872/155 1363/1940/155 1364/1939/269 -f 1327/1863/163 1391/3782/163 1390/3781/260 +f 1327/1863/163 1391/3807/163 1390/3806/260 f 1300/1870/269 1364/1939/269 1365/1942/270 -f 1328/1865/263 1392/3783/263 1391/3782/163 +f 1328/1865/263 1392/3808/263 1391/3807/163 f 1301/1873/270 1365/1942/270 1366/1944/272 -f 1329/1867/264 1393/3784/264 1392/3783/263 +f 1329/1867/264 1393/3809/264 1392/3808/263 f 1302/1877/272 1366/1944/272 1367/1946/162 -f 1330/1869/266 1394/3785/266 1393/3784/264 +f 1330/1869/266 1394/3810/266 1393/3809/264 f 1303/1879/162 1367/1946/162 1368/1948/275 -f 1331/3427/156 1395/3920/156 1394/3785/266 +f 1331/3427/156 1395/3946/156 1394/3810/266 f 1304/1881/275 1368/1948/275 1369/1950/276 -f 1332/1874/254 1396/3755/254 1395/3786/156 +f 1332/1874/254 1396/3780/254 1395/3811/156 f 1305/1883/276 1369/1950/276 1370/1952/255 -f 1764/3787/163 1779/3921/163 1780/3788/277 -f 1778/3790/278 1779/3922/163 1764/3791/163 -f 1762/3793/279 1777/3795/279 1778/3790/278 -f 1761/3794/280 1776/3923/280 1777/3795/279 -f 1766/3796/281 1781/3924/281 1782/3797/282 -f 1780/3788/277 1781/3924/281 1766/3796/281 +f 1764/3812/163 1779/3947/163 1780/3813/277 +f 1778/3815/278 1779/3948/163 1764/3816/163 +f 1762/3818/279 1777/3820/279 1778/3815/278 +f 1761/3819/280 1776/3949/280 1777/3820/279 +f 1766/3821/281 1781/3950/281 1782/3822/282 +f 1780/3813/277 1781/3950/281 1766/3821/281 f 977/1511/169 1753/2490/169 1760/2488/283 f 1760/2488/283 1759/2487/157 979/1514/157 f 979/1514/157 1759/2487/157 1758/2485/284 @@ -10221,50 +10247,50 @@ f 2105/3599/179 2107/2905/222 2106/2924/222 f 2107/2905/222 2109/2907/157 2108/2926/157 f 2108/2926/157 2109/2907/157 2111/2878/221 f 2110/2927/221 2111/2878/221 2097/2877/171 -f 2015/3799/291 2125/3815/291 2124/3800/292 -f 2009/3802/185 2016/3801/292 2124/3800/292 -f 2009/3804/185 2123/3925/185 2122/3805/293 -f 2011/3807/294 2010/3806/293 2122/3805/293 -f 2011/3807/294 2121/3808/294 2120/3809/295 -f 2012/3810/295 2120/3809/295 2119/3811/184 -f 2013/3812/184 2119/3811/184 2126/3813/296 -f 2014/3814/296 2126/3813/296 2125/3815/291 -f 2008/3816/297 2048/3820/297 2047/3817/298 -f 2001/3819/183 2041/3926/183 2048/3820/297 -f 2001/3821/183 2002/3824/299 2042/3822/299 -f 2002/3824/299 2003/3827/300 2043/3825/300 -f 2004/3826/301 2044/3829/301 2043/3825/300 -f 2004/3826/301 2005/3831/182 2045/3828/182 -f 2006/3830/302 2046/3832/302 2045/3828/182 -f 2006/3830/302 2007/3818/298 2047/3817/298 -f 2095/3833/303 2088/3927/181 2017/3834/181 -f 2017/3836/181 2088/3928/181 2089/3837/304 -f 2089/3837/304 2090/3840/305 2019/3839/305 -f 2090/3840/305 2091/3929/306 2020/3841/306 -f 2020/3841/306 2091/3929/306 2092/3842/180 -f 2092/3842/180 2093/3845/307 2022/3844/307 -f 2093/3845/307 2094/3930/308 2023/3846/308 -f 2023/3846/308 2094/3930/308 2095/3833/303 -f 2029/3847/187 2069/3931/187 2070/3848/309 -f 2068/3850/310 2069/3932/187 2029/3851/187 -f 2027/3853/311 2067/3933/311 2068/3850/310 -f 2066/3854/312 2067/3933/311 2027/3853/311 -f 2065/3856/186 2066/3854/312 2026/3855/312 -f 2072/3858/313 2065/3856/186 2025/3857/186 -f 2031/3860/314 2071/3934/314 2072/3858/313 -f 2070/3848/309 2071/3934/314 2031/3860/314 -f 2076/3861/161 2115/3935/161 2116/3862/315 -f 2114/3864/316 2115/3936/161 2076/3865/161 -f 2074/3867/317 2113/3937/317 2114/3864/316 -f 2112/3868/318 2113/3937/317 2074/3867/317 -f 2078/3870/319 2117/3938/319 2118/3871/320 -f 2116/3862/315 2117/3938/319 2078/3870/319 -f 2299/3873/160 2300/3886/321 2285/3874/321 -f 2298/3876/322 2299/3939/160 2284/3877/160 -f 2297/3879/323 2298/3876/322 2283/3878/322 -f 2296/3881/324 2297/3879/323 2282/3880/323 -f 2286/3883/325 2301/3940/325 2302/3884/326 -f 2300/3886/321 2301/3940/325 2286/3883/325 +f 2015/3824/291 2125/3840/291 2124/3825/292 +f 2009/3827/185 2016/3826/292 2124/3825/292 +f 2009/3829/185 2123/3951/185 2122/3830/293 +f 2011/3832/294 2010/3831/293 2122/3830/293 +f 2011/3832/294 2121/3833/294 2120/3834/295 +f 2012/3835/295 2120/3834/295 2119/3836/184 +f 2013/3837/184 2119/3836/184 2126/3838/296 +f 2014/3839/296 2126/3838/296 2125/3840/291 +f 2008/3841/297 2048/3845/297 2047/3842/298 +f 2001/3844/183 2041/3952/183 2048/3845/297 +f 2001/3846/183 2002/3849/299 2042/3847/299 +f 2002/3849/299 2003/3852/300 2043/3850/300 +f 2004/3851/301 2044/3854/301 2043/3850/300 +f 2004/3851/301 2005/3856/182 2045/3853/182 +f 2006/3855/302 2046/3857/302 2045/3853/182 +f 2006/3855/302 2007/3843/298 2047/3842/298 +f 2095/3858/303 2088/3953/181 2017/3859/181 +f 2017/3861/181 2088/3954/181 2089/3862/304 +f 2089/3862/304 2090/3865/305 2019/3864/305 +f 2090/3865/305 2091/3955/306 2020/3866/306 +f 2020/3866/306 2091/3955/306 2092/3867/180 +f 2092/3867/180 2093/3870/307 2022/3869/307 +f 2093/3870/307 2094/3956/308 2023/3871/308 +f 2023/3871/308 2094/3956/308 2095/3858/303 +f 2029/3872/187 2069/3957/187 2070/3873/309 +f 2068/3875/310 2069/3958/187 2029/3876/187 +f 2027/3878/311 2067/3959/311 2068/3875/310 +f 2066/3879/312 2067/3959/311 2027/3878/311 +f 2065/3881/186 2066/3879/312 2026/3880/312 +f 2072/3883/313 2065/3881/186 2025/3882/186 +f 2031/3885/314 2071/3960/314 2072/3883/313 +f 2070/3873/309 2071/3960/314 2031/3885/314 +f 2076/3886/161 2115/3961/161 2116/3887/315 +f 2114/3889/316 2115/3962/161 2076/3890/161 +f 2074/3892/317 2113/3963/317 2114/3889/316 +f 2112/3893/318 2113/3963/317 2074/3892/317 +f 2078/3895/319 2117/3964/319 2118/3896/320 +f 2116/3887/315 2117/3964/319 2078/3895/319 +f 2299/3898/160 2300/3911/321 2285/3899/321 +f 2298/3901/322 2299/3965/160 2284/3902/160 +f 2297/3904/323 2298/3901/322 2283/3903/322 +f 2296/3906/324 2297/3904/323 2282/3905/323 +f 2286/3908/325 2301/3966/325 2302/3909/326 +f 2300/3911/321 2301/3966/325 2286/3908/325 f 2037/2831/168 2273/3197/168 2280/3196/284 f 2280/3196/284 2279/3194/157 2039/2834/157 f 2279/3194/157 2278/3192/283 2040/2835/283 diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_rbmk_graph.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_rbmk_graph.png new file mode 100644 index 000000000..17036c200 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/machine/gui_rbmk_graph.png differ