From 41140ecf7c2d3090a5168898c15308530c4b7d8b Mon Sep 17 00:00:00 2001 From: Voxelstice <95834462+Voxelstice@users.noreply.github.com> Date: Wed, 3 Jun 2026 20:19:15 +0300 Subject: [PATCH 001/107] the rot rottens Fixes Desktop.browse not working on Linux --- .../inventory/gui/GUIScreenRadioAUTOCAL.java | 882 +++++++++--------- 1 file changed, 448 insertions(+), 434 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java index ebf3220b8..19c1113ca 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java @@ -1,434 +1,448 @@ -package com.hbm.inventory.gui; - -import java.awt.Desktop; -import java.io.File; -import java.io.PrintWriter; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Arrays; - -import org.lwjgl.opengl.GL11; - -import com.hbm.lib.RefStrings; -import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toserver.NBTControlPacket; -import com.hbm.tileentity.network.TileEntityRadioAUTOCAL; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.PositionedSoundRecord; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.ResourceLocation; - -public class GUIScreenRadioAUTOCAL extends GuiScreen { - - protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rtty_autocal.png"); - protected TileEntityRadioAUTOCAL autocal; - - protected int xSize = 170; - protected int ySize = 138; - protected int guiLeft; - protected int guiTop; - - public GUIScreenRadioAUTOCAL(TileEntityRadioAUTOCAL autocal) { - this.autocal = autocal; - } - - @Override - public void initGui() { - super.initGui(); - this.guiLeft = (this.width - this.xSize) / 2; - this.guiTop = (this.height - this.ySize) / 2; - } - - @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); - } - - @Override - protected void mouseClicked(int x, int y, int i) { - super.mouseClicked(x, y, i); - - NBTTagCompound data = null; - - if(checkClick(x, y, 8, 36, 18, 18)) { data = new NBTTagCompound(); data.setBoolean("on", true); } - if(checkClick(x, y, 28, 36, 18, 18)) { data = new NBTTagCompound(); data.setBoolean("ignore", true); } - if(checkClick(x, y, 48, 36, 18, 18)) { data = new NBTTagCompound(); data.setBoolean("auto", true); } - - // open folder and generate new script file - if(checkClick(x, y, 104, 36, 18, 18)) { - try { - File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); - File script = new File(uploadFolder, "script.txt"); - if(!uploadFolder.exists()) uploadFolder.mkdir(); - if(!script.exists()) script.createNewFile(); - script.setExecutable(false); - Desktop.getDesktop().browse(script.toURI()); - } catch(Throwable ex) { MainRegistry.logger.error("Couldn't open link", ex); } - } - - // open folder and generate new doc file - if(checkClick(x, y, 144, 36, 18, 18)) { - try { - File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); - File doc = new File(uploadFolder, "documentation.md"); - if(!uploadFolder.exists()) uploadFolder.mkdir(); - if(!doc.exists()) { - doc.createNewFile(); - try { - PrintWriter printer = new PrintWriter(doc, StandardCharsets.US_ASCII.name()); - for(String line : DOCS) printer.println(line); - printer.close(); - } catch(Throwable e) { } - } - Desktop.getDesktop().browse(doc.toURI()); - } catch(Throwable ex) { MainRegistry.logger.error("Couldn't open link", ex); } - } - - if(checkClick(x, y, 84, 36, 18, 18)) { - try { - File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); - File script = new File(uploadFolder, "script.txt"); - if(!uploadFolder.exists()) uploadFolder.mkdir(); - if(!script.exists()) { - script.createNewFile(); - script.setExecutable(false); - return; - } - /*FileReader reader = new FileReader(script); - BufferedReader buffer = new BufferedReader(reader); - String[] lines = buffer.lines().toArray(String[]::new); - buffer.close(); - // this is going to blow the fuck up once we hit the max packet size, but let's ignore that for now - data = new NBTTagCompound(); - StringBuilder builder = new StringBuilder(); - for(int l = 0; l < lines.length; l++) { - builder.append(lines[i]); - if(l < lines.length - 1) builder.append("\n"); // yeah why the fuck not - } - data.setString("payload", builder.toString());*/ - byte[] bytes = Files.readAllBytes(Paths.get(script.toURI())); - data = new NBTTagCompound(); - data.setString("payload", new String(bytes, StandardCharsets.UTF_8)); - - } catch(Throwable ex) { } - } - - // this thing can both upload and download files so let's be careful about this - // the upload is simple, it's just text that is handled by the AUTOCAL, so doing anything malicious isn't more likely than with any other package - // download is iffy, because we take text from the server, fully user-definable, and save it to disk. it's stored as a txt so accudentally running it - // or getting it to run itself, should it be a malicious script, is unlikely. still, we want to minimized the chances as much as we can - // option 1: set file attribute to disallow running (i.e. disable executable perm) - // option 2: add fluff that would break scripts, however they might work. we can't change the actual lines because we want the script to be edited, - // but we can add some extra crap that would either halt common scripting langs entirely or at least disrupt them into not functioning - // option 3: enforce validation so only MS-ES1 script can be received by the client. this means that info such as comments or incorrectly written commands - // are lost, however this is the safest way because it becomes impossible to send malicious code, but it also interferes with regular user operation more - - if(data != null) { - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, autocal.xCoord, autocal.yCoord, autocal.zCoord)); - } - } - - protected boolean checkClick(int x, int y, int left, int top, int sizeX, int sizeY) { - return guiLeft + left <= x && guiLeft + left + sizeX > x && guiTop + top < y && guiTop + top + sizeY >= y; - } - - private void drawGuiContainerForegroundLayer(int x, int y) { - - for(int i = 0; i < autocal.history.length; i++) { - String line = autocal.history[i]; - if(line == null || line.isEmpty()) continue; - this.fontRendererObj.drawString(line, guiLeft + 7, guiTop + 73 + i * 10, 0x00ff00); - } - - if(checkClick(x, y, 8, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.RED + "ON/OFF"}), x, y); - if(checkClick(x, y, 28, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.RED + "Ignore Errors", "Skips instructions that error,", "leaving the computer turned on.", "May cause unintended behavior", "and inconsistencies."}), x, y); - if(checkClick(x, y, 48, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.RED + "Automatic Reboot", "Restarts the computer automatically when", "the program stops due to an error", "or after finishing."}), x, y); - - if(checkClick(x, y, 84, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.BLUE + "Upload Program"}), x, y); - if(checkClick(x, y, 104, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.BLUE + "Open Program File"}), x, y); - if(checkClick(x, y, 124, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.BLUE + "Download Program", EnumChatFormatting.RED + "Currently unsupported!"}), x, y); - if(checkClick(x, y, 144, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.BLUE + "Open Documentation"}), x, y); - } - - 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); - - if(autocal.isOn) drawTexturedModalRect(guiLeft + 8, guiTop + 36, xSize, 0, 18, 18); - if(!autocal.ignoreError) drawTexturedModalRect(guiLeft + 28, guiTop + 36, xSize, 18, 18, 18); - if(!autocal.autoReboot) drawTexturedModalRect(guiLeft + 48, guiTop + 36, xSize, 36, 18, 18); - } - - @Override - protected void keyTyped(char c, int b) { - if(b == 1 || b == Minecraft.getMinecraft().gameSettings.keyBindInventory.getKeyCode()) { - Minecraft.getMinecraft().thePlayer.closeScreen(); - } - } - - @Override public boolean doesGuiPauseGame() { return false; } - - - public static final String[] DOCS = new String[] { - "# AUTOCAL - The Automatic Calculator", - "", - "## About this document", - "This documentation is designed to be understandable even by people with no programming background. This documentation extends to the AUTOCAL unit as well as the MS-ES1 script language it is programmed with.", - "", - "Read this document carefully as all the described concepts are vital for using the AUTOCAL unit.", - "", - "## About AUTOCAL", - "The AUTOCAL automatic calculator is a basic machine that reads a script, line by line, and performs actions based on those lines. This means it can be programmed with behavior, doing math, and handling signals. It communicated with the outside world exclusively using Redstone-over-Radio (RoR) signals, allowing RoR to supply it with values to be processed, and returning RoR signals to be displayed or for controlling RoR receiving devices.", - "", - "The first button is the on/off switch. Turning the AUTOCAL unit on will start the script at the first line. If the script concludes, an error is encountered (without the \"ignore errors\" setting enabled), the `shutdown` command is used or no program is loaded to begin with, the unit will automatically power down.", - "", - "The second button is the \"ignore errors\" setting. The red X means the setting is disabled, if an error is encountered in the program (an unrecognized command, missing or incorrect parameters, anything the script isn't meant to handle) then the unit will shut off. Otherwise, the erroring instruction is simply skipped. This may cause undefined or unexpected behavior, however in certain circumstances this doesn't matter. It's advised to keep this turned off, as it makes it easier to find obvious errors in the script.", - "", - "The third button is the \"automatic reboot\" setting. If the unit is powered down, no matter the reason, it will automatically try to start again. This allows for a simple \"loop\" where the same script is repeated every time it ends by simply rebooting the AUTOCAL unit at the end. Do note that doing so will delete all saved variables, more on how variables work later.", - "", - "The fourth button is for uploading the script. The script is in the minecraft's install folder, under the `hbmComputerUpload` folder, named `script.txt`. Clicking this button will send the contents of this script file to the AUTOCAL unit.", - "", - "The fifth button is for opening the script file. If no script file exists yet, the folder and empty script will be created.", - "", - "The sixth button is for downloading a script file. The existing `script.txt` is deleted and replaced with the script that is loaded onto the AUTOCAL unit.", - "", - "The simple workflow of programming an AUTOCAL unit is therefore using button #5 to open the file, writing the program, using #4 to flash the program to the AUTOCAL unit, and then using the first button to turn it on.", - "", - "## About MS-ES1", - "The script read by AUTOCAL units is written in *Machine Script - Equestrian Standard, Version 1*, or MS-ES1. MS-ES1 features named variables, value comparison, (conditional) jumping, evaluation of mathematical expressions and reading/writing of RoR signals. The speed at which lines are processed is defined by the *clock speed*, which can be defined in the script. The amount describes the number of lines processed per tick, i.e. the default clock speed of 1 means 20 lines are processed per second (there are 20 ticks in one second). The maximum clock speed is determined by the server config value `AUTOCAL_MAX_CLOCK` (default is 20, i.e. 400 per second).", - "", - "Example: `/ntmserver set AUTOCAL_MAX_CLOCK 10` -> Sets the max clock speed to 10.", - "", - "## About the Buffer", - "The buffer is a single \"slot\" of information that can be used for many commands. Some commands produce an output which is saved to the buffer, some commands modify the contents of the buffer, and some commands use the buffer's contents. The buffer's contents can also be saved permanently as a named variable, and named variables can be written back into the buffer again if needed. The buffer persists as long as the AUTOCAL unit is running, should it restart or shut down, the buffer's contents are lost.", - "", - "## About Variables", - "MS-ES1 allows named variables to be saved for later use. There is no limit to how many variables can be saved. All variables are text (\"Strings\"), however depending on the command and context, that text may be interpreted as a number (both full and decimal). Variables, much like the buffer, are also stored as long as the program is running, if the AUTOCAL unit shuts down, all stored variables are lost.", - "", - "## About Variable Substitution", - "Many commands allow for *variable substitution*, i.e. a specific format can be used to insert the contents of a variable (or multiple!) into a parameter. This allows for the quick use of variables, or multiple variables in the same statement. Substitution is defined by `$variable name$`, where this text is replaced with the value of a variable called \"variable name\".", - "", - "Example: `eval $val1$ + $val2$` assuming `val1` is 4 and `val2` is 8 would resolve to `eval 4 + 8`.", - "", - "Special case: The contents of the buffer can also be accessed using substitution using `$buffer$`. Consequently, a variable also named \"buffer\" can **not** be accessed using variable substitution at all.", - "", - "## About Redstone-over-Radio", - "RoR has a specific limitation: A signal cannot be sent on the same channel within the same game tick. Subsequent signals on the same channel in the same tick will overwrite the previous one, with the exception of numeric (whole number) signals which are added together (e.g. sending \"5\" and \"7\" in the same tick creates a signal \"12\"). Since the AUTOCAL unit's clock speed allows it to theoretically send multiple signals on the same channel on the same tick, it might be necessary to *end* the operation for this tick even though there's still clock cycles left to do. This can be done with the `endtick` command.", - "", - "## The Script (Commands)", - "", - "### Comments", - "Lines that start with `# ` (hashtag + space) are comments, and therefore ignored. If the AUTOCAL encounters such a line, it is skipped, not using up the clock cycle.", - "", - "Example: `# This is a comment` -> A line that does nothing, but can still be useful to explain and annotate other commands.", - "", - "### nop", - "`nop` (no operation) is an operation that consumes one clock cycle, but does not have any other effect. This is only useful in special cases where clock cycle timing is somehow important.", - "", - "### clockspeed", - "`clockspeed ` sets the AUTOCAL's clock speed (i.e. amount of lines processed per tick). This can be changed at any point in the script, but usually it is most useful to start the script by defining the clock speed.", - "", - "Example: `clockspeed 5` -> Sets the AUTOCAL's clock speed to five lines per tick (100 lines per second).", - "", - "### dest", - "`dest ` creates a jump destination. Using the various jumping conditions, we can cause the AUTOCAL to return back (or forward) to this point. If a destination is reached not by jumping but simply by reading the next line, it will not use up a clock cycle, just like a comment. Destinations need unique names, if multiple destinations exist with the same name, then the latter ones will overwrite the former ones.", - "", - "Example: `dest start` -> Creates a destination point named \"start\", any jump instruction using \"start\" will cause the script to return to this point.", - "", - "### jmp", - "`jmp ` will cause the program to skip to the destination with the supplied name. The jump will always be performed when the script reaches this instruction. Supports variable substitution!", - "", - "Example: `jmp start` -> Jumps to the destination point named \"start\".", - "Example: `jmp $dest$` -> Jumps to the destination point with the same name as the contents of the variable \"dest\".", - "", - "### jmpif", - "`jmpif ` will cause the program to skip to the destination with the supplied name, if the buffer's content is `true`. Otherwise, the program will just proceed to the next line, like any other instruction. Supports variable substitution!", - "", - "Example:", - "`jmpif skip`", - "`nop`", - "`dest skip`", - "`nop`", - "", - "-> If the buffer is `true`, then the program will jump to the destination point named \"skip\" and only run the second `nop`. Otherwise, both the first and second `nop` will run.", - "", - "### jmpnot", - "`jmpnot ` will cause the program to skip to the destination with the supplied name, if the buffer's content is **not** `true`. This is basically the inverse of `jmpif`. Only exists for some convenience for people who are used to more traditional languages' `if` statements. Supports variable substitution!", - "", - "Example:", - "`jmpnot skip` <- if", - "`nop` <- then", - "`jmp end`", - "`dest skip`", - "`nop` <- else", - "`dest end` <- end", - "", - "-> By using two jumps, one conditional and one fixed, we can emulate the structure of an `if/else` block. If the buffer's content is `true`, the first `nop` runs. Otherwise, the second `nop` is run. The second jump (`jmp end`) lets us skip over the \"else\" part of the script after running the \"then\" part.", - "", - "### endtick", - "`endtick` stops the script until the next game tick. This is important when sending multiple RoR signals on the same channel in a row, since a channel in the same tick can only hold one signal.", - "", - "### shutdown", - "`shutdown` will turn the AUTOCAL unit off. If the AUTOCAL is set up to automatically reboot, this effectively restarts the script from scratch, voiding all saved variables and the buffer. If not, then the AUTOCAL unit will stay off until manually restarted.", - "", - "### load", - "`load ` will take the value of a variable with the supplied name and copy it to the buffer. Many commands work directly out of the buffer, so next to variable substitution, this is the only way of actually accessing the contents of a variable.", - "", - "Example: `load val` -> Assuming that the variable \"val\" contains the value `5`, then the buffer's value is now overwritten with that `5`.", - "", - "### save", - "`save ` will take the value of the buffer and save it to a variable with the supplied name. This is the only way of actually changing variables, and saving values for later use besides the buffer.", - "", - "Example: `save val` -> Assuming that the buffer contains the value `12`, this will create a new variable named \"val\" with the value of `12`.", - "", - "### buffer", - "`buffer ` will write the supplied value directly to the buffer. This means that commands that require buffer values can be supplied with values directly from the code.", - "", - "Example:", - "`buffer Horseshoe`", - "`save item`", - "", - "-> Will buffer the value `Horseshoe` and then save it to the variable called \"item\".", - "", - "### eval", - "`eval [statement]` will evaluate the supplied statement as a mathematical expression. In short, anything NTM's calculator can make sense of (the one you open with N by default), this function can do the same. The statement is optional, if no statement is supplied, then it will try to use the buffer's contents as the statement. `eval` produces **decimal** values and not whole number **integers**, so for use in RoR signals, the output needs to be rounded! The result of the calculation is then saved to the buffer. Supports variable substitution!", - "", - "Example: `eval 4 + 5` -> Calculates \"4+5\" and saves `9` to the buffer.", - "Example: `eval $val$ / 2` -> Takes the value of \"val\" and divides it by 2, saving the result to the buffer.", - "", - "Example:", - "`load calc`", - "`eval`", - "", - "-> Will write the value of \"calc\" to the buffer, and then treat it as a mathematical expression. If we assume \"calc\" to be `5+2` then `eval` will end up writing `7` to the buffer.", - "", - "### evalr", - "`evalr [statement]` is identical to `eval`, however it will round the result to the nearest whole number. Whole numbers are important for RoR, since gauges, numeric displays and logic receivers can only handle whole numbers, and not decimals.", - "", - "### rounddown / floor", - "`rounddown` or `floor` will try to interpret the buffer's content as a decimal, and round it **down** to the next lower integer, writing the result to the buffer again.", - "", - "Example: `rounddown` -> Assuming the buffer's value is `4.2`, the buffer's new value will be `4`.", - "Example: `rounddown` -> Assuming the buffer's value is `4.6`, the buffer's new value will be `4`.", - "", - "### roundup / ceil", - "`roundup` or `ceil` will try to interpret the buffer's content as a decimal, and round it **up** to the next higher integer, writing the result to the buffer again.", - "", - "Example: `roundup` -> Assuming the buffer's value is `4.2`, the buffer's new value will be `5`.", - "Example: `roundup` -> Assuming the buffer's value is `4.6`, the buffer's new value will be `5`.", - "", - "### round / nearest", - "`round` or `nearest` will try to interpret the buffer's content as a decimal, and round it to the **closest** integer, writing the result to the buffer again.", - "", - "Example: `round` -> Assuming the buffer's value is `4.2`, the buffer's new value will be `4`.", - "Example: `round` -> Assuming the buffer's value is `4.6`, the buffer's new value will be `5`.", - "", - "### concat", - "`concat ` works similarly to `buffer `, however it accepts variable substitution. This means that the text of multiple variables can be combined.", - "", - "Example: `concat $first$ and $second$` -> Assuming the variable \"first\" to be `Cats` and \"second\" to be `dogs`, then the result saved to the buffer is `Cats and dogs`.", - "", - "### eq", - "`eq ` - equals, will try to compare the buffer to the supplied value. The buffer will be set to `true` if the values are equal and `false` otherwise. Supports variable substitution!", - "", - "Example: `eq Brick` -> If the buffer is `Brick`, then it is set to `true`, otherwise it becomes `false`.", - "Example: `eq $comp$` -> If the buffer's value is equal to the value of the variable \"comp\", then it is set to `true`, otherwise it becomes `false`.", - "", - "### gtb", - "`gtb ` - greater than buffer, will try to compare the buffer to the supplied value. The buffer will be set to `true` if the supplied numerical value is greater and `false` otherwise. Supports variable substitution!", - "", - "Example: `gtb 4` -> If the buffer is `3` or lower, then it is set to `true`, otherwise it becomes `false`.", - "Example: `gtb $comp$` -> If the buffer lower than the value of \"comp\", then it is set to `true`, otherwise it becomes `false`.", - "", - "### ltb", - "`ltb ` - less than buffer, will try to compare the buffer to the supplied value. The buffer will be set to `true` if the supplied numerical value is lower and `false` otherwise. Supports variable substitution!", - "", - "Example: `ltb 4` -> If the buffer is `5` or higher, then it is set to `true`, otherwise it becomes `false`.", - "Example: `ltb $comp$` -> If the buffer higher than the value of \"comp\", then it is set to `true`, otherwise it becomes `false`.", - "", - "### geb", - "`geb ` - greater than or equal buffer.", - "", - "### leb", - "`leb ` - less than or equal buffer.", - "", - "### send", - "`send ` will send a Redstone-over-Radio signal over the supplied channel, with the signal's value being the current buffer's value. Sending repeatedly over the same channel requires waiting for a full game tick, so using `endtick` after sending is advised. Supports variable substitution!", - "", - "Example:", - "`buffer Hello!`", - "`send transmission`", - "", - "-> Will send the RoR signal `Hello!` on the channel \"transmission\".", - "", - "Example:", - "`buffer SOS`", - "`send $target$`", - "", - "-> Will send the RoR signal \"SOS\" to the channel saved in the variable \"target\".", - "", - "### listen ", - "`listen ` will listen in on the supplied RoR channel and write the signal to the buffer. Will detect all signals, even expired ones, and one just ones sent in the previous tick, so picking up a signal doesn't mean it's new information. Supports variable substitution!", - "", - "Example:", - "`listen input`", - "`eval $buffer$ * 100`", - "`send output`", - "", - "-> Will take the signal from the RoR channel \"input\", multiply it by 100, and send that value on the channel \"output\".", - "", - "## Advanced", - "", - "### Conditional Branches", - "Basic if/else conditions are the bread and butter of most programming. If we want to change the behavior based on different values, we need to compare, and then conditional jump.", - "", - "This example creates a script that processed a number \"val\" based on how high it is. 4 and below are multiplied by 2, otherwise it is divided by 2:", - "", - "`buffer 4` <- buffer `4` for comparison", - "`gtb $val$` <- is \"val\" greater than our buffer?", - "`jmpnot else` <- if not, jump to \"else\"", - "`eval $val$ / 2` <- if it is, divide by 2", - "`save val` <- ...and save to \"val\"", - "`jmp end` <- now jump to \"end\" to skip our \"else\" block", - "`dest else` <- else...", - "`eval $val$ * 2` <- multiply by 2", - "`save val` <- ...and save to val", - "`dest end` <- no matter which branch we took, we always end up here", - "", - "### Methods", - "People who are used to high languages will already know this concept, reusable parts of code with a set of parameters and an optional return value. For this we will use a few variables and a set of jumps in order to be able to use this piece of code from anywhere:", - "", - "This example implements a basic lerp (linear interpolation) function.", - "", - "`dest lerp`", - "`eval $a$ + ($b$ - $a$) * $i$`", - "`save result`", - "`jmp $return$`", - "", - "This function requires the variables \"a\", \"b\" and \"i\" as parameters and saves the result to the variable \"result\". We can now access this function like such:", - "", - "`buffer 4` <- first we set up our parameters to be used in the function", - "`save a`", - "`buffer 7`", - "`save b`", - "`buffer 0.6`", - "`save i`", - "`buffer returnhere` <- then we define the name of the return point", - "`save return`", - "`jmp lerp` <- call the function", - "`dest returnhere` <- once the function concludes, we are back here", - "", - "At the end of it all, the variable \"result\" now has the desired value.", - }; -} +package com.hbm.inventory.gui; + +import java.awt.Desktop; +import java.io.File; +import java.io.PrintWriter; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.net.URI; +import java.util.Arrays; +import java.util.Objects; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.tileentity.network.TileEntityRadioAUTOCAL; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIScreenRadioAUTOCAL extends GuiScreen { + + protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rtty_autocal.png"); + protected TileEntityRadioAUTOCAL autocal; + + protected int xSize = 170; + protected int ySize = 138; + protected int guiLeft; + protected int guiTop; + + public GUIScreenRadioAUTOCAL(TileEntityRadioAUTOCAL autocal) { + this.autocal = autocal; + } + + private void browse(URI uri) throws IOException { + // workaround for Java not supporting all platforms, mostly for Linux + if (Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + Desktop.getDesktop().browse(uri); + } else { + if (Runtime.getRuntime().exec(new String[] { "which", "xdg-open" }).getInputStream().read() != -1) { + Runtime.getRuntime().exec(new String[] { "xdg-open", uri.toString() }); + } + } + } + + @Override + public void initGui() { + super.initGui(); + this.guiLeft = (this.width - this.xSize) / 2; + this.guiTop = (this.height - this.ySize) / 2; + } + + @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); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + NBTTagCompound data = null; + + if(checkClick(x, y, 8, 36, 18, 18)) { data = new NBTTagCompound(); data.setBoolean("on", true); } + if(checkClick(x, y, 28, 36, 18, 18)) { data = new NBTTagCompound(); data.setBoolean("ignore", true); } + if(checkClick(x, y, 48, 36, 18, 18)) { data = new NBTTagCompound(); data.setBoolean("auto", true); } + + // open folder and generate new script file + if(checkClick(x, y, 104, 36, 18, 18)) { + try { + File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); + File script = new File(uploadFolder, "script.txt"); + if(!uploadFolder.exists()) uploadFolder.mkdir(); + if(!script.exists()) script.createNewFile(); + script.setExecutable(false); + browse(script.toURI()); + } catch(Throwable ex) { MainRegistry.logger.error("Couldn't open link", ex); } + } + + // open folder and generate new doc file + if(checkClick(x, y, 144, 36, 18, 18)) { + try { + File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); + File doc = new File(uploadFolder, "documentation.md"); + if(!uploadFolder.exists()) uploadFolder.mkdir(); + if(!doc.exists()) { + doc.createNewFile(); + try { + PrintWriter printer = new PrintWriter(doc, StandardCharsets.US_ASCII.name()); + for(String line : DOCS) printer.println(line); + printer.close(); + } catch(Throwable e) { } + } + browse(doc.toURI()); + } catch(Throwable ex) { MainRegistry.logger.error("Couldn't open link", ex); } + } + + if(checkClick(x, y, 84, 36, 18, 18)) { + try { + File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); + File script = new File(uploadFolder, "script.txt"); + if(!uploadFolder.exists()) uploadFolder.mkdir(); + if(!script.exists()) { + script.createNewFile(); + script.setExecutable(false); + return; + } + /*FileReader reader = new FileReader(script); + BufferedReader buffer = new BufferedReader(reader); + String[] lines = buffer.lines().toArray(String[]::new); + buffer.close(); + // this is going to blow the fuck up once we hit the max packet size, but let's ignore that for now + data = new NBTTagCompound(); + StringBuilder builder = new StringBuilder(); + for(int l = 0; l < lines.length; l++) { + builder.append(lines[i]); + if(l < lines.length - 1) builder.append("\n"); // yeah why the fuck not + } + data.setString("payload", builder.toString());*/ + byte[] bytes = Files.readAllBytes(Paths.get(script.toURI())); + data = new NBTTagCompound(); + data.setString("payload", new String(bytes, StandardCharsets.UTF_8)); + + } catch(Throwable ex) { } + } + + // this thing can both upload and download files so let's be careful about this + // the upload is simple, it's just text that is handled by the AUTOCAL, so doing anything malicious isn't more likely than with any other package + // download is iffy, because we take text from the server, fully user-definable, and save it to disk. it's stored as a txt so accudentally running it + // or getting it to run itself, should it be a malicious script, is unlikely. still, we want to minimized the chances as much as we can + // option 1: set file attribute to disallow running (i.e. disable executable perm) + // option 2: add fluff that would break scripts, however they might work. we can't change the actual lines because we want the script to be edited, + // but we can add some extra crap that would either halt common scripting langs entirely or at least disrupt them into not functioning + // option 3: enforce validation so only MS-ES1 script can be received by the client. this means that info such as comments or incorrectly written commands + // are lost, however this is the safest way because it becomes impossible to send malicious code, but it also interferes with regular user operation more + + if(data != null) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, autocal.xCoord, autocal.yCoord, autocal.zCoord)); + } + } + + protected boolean checkClick(int x, int y, int left, int top, int sizeX, int sizeY) { + return guiLeft + left <= x && guiLeft + left + sizeX > x && guiTop + top < y && guiTop + top + sizeY >= y; + } + + private void drawGuiContainerForegroundLayer(int x, int y) { + + for(int i = 0; i < autocal.history.length; i++) { + String line = autocal.history[i]; + if(line == null || line.isEmpty()) continue; + this.fontRendererObj.drawString(line, guiLeft + 7, guiTop + 73 + i * 10, 0x00ff00); + } + + if(checkClick(x, y, 8, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.RED + "ON/OFF"}), x, y); + if(checkClick(x, y, 28, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.RED + "Ignore Errors", "Skips instructions that error,", "leaving the computer turned on.", "May cause unintended behavior", "and inconsistencies."}), x, y); + if(checkClick(x, y, 48, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.RED + "Automatic Reboot", "Restarts the computer automatically when", "the program stops due to an error", "or after finishing."}), x, y); + + if(checkClick(x, y, 84, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.BLUE + "Upload Program"}), x, y); + if(checkClick(x, y, 104, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.BLUE + "Open Program File"}), x, y); + if(checkClick(x, y, 124, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.BLUE + "Download Program", EnumChatFormatting.RED + "Currently unsupported!"}), x, y); + if(checkClick(x, y, 144, 36, 18, 18)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.BLUE + "Open Documentation"}), x, y); + } + + 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); + + if(autocal.isOn) drawTexturedModalRect(guiLeft + 8, guiTop + 36, xSize, 0, 18, 18); + if(!autocal.ignoreError) drawTexturedModalRect(guiLeft + 28, guiTop + 36, xSize, 18, 18, 18); + if(!autocal.autoReboot) drawTexturedModalRect(guiLeft + 48, guiTop + 36, xSize, 36, 18, 18); + } + + @Override + protected void keyTyped(char c, int b) { + if(b == 1 || b == Minecraft.getMinecraft().gameSettings.keyBindInventory.getKeyCode()) { + Minecraft.getMinecraft().thePlayer.closeScreen(); + } + } + + @Override public boolean doesGuiPauseGame() { return false; } + + + public static final String[] DOCS = new String[] { + "# AUTOCAL - The Automatic Calculator", + "", + "## About this document", + "This documentation is designed to be understandable even by people with no programming background. This documentation extends to the AUTOCAL unit as well as the MS-ES1 script language it is programmed with.", + "", + "Read this document carefully as all the described concepts are vital for using the AUTOCAL unit.", + "", + "## About AUTOCAL", + "The AUTOCAL automatic calculator is a basic machine that reads a script, line by line, and performs actions based on those lines. This means it can be programmed with behavior, doing math, and handling signals. It communicated with the outside world exclusively using Redstone-over-Radio (RoR) signals, allowing RoR to supply it with values to be processed, and returning RoR signals to be displayed or for controlling RoR receiving devices.", + "", + "The first button is the on/off switch. Turning the AUTOCAL unit on will start the script at the first line. If the script concludes, an error is encountered (without the \"ignore errors\" setting enabled), the `shutdown` command is used or no program is loaded to begin with, the unit will automatically power down.", + "", + "The second button is the \"ignore errors\" setting. The red X means the setting is disabled, if an error is encountered in the program (an unrecognized command, missing or incorrect parameters, anything the script isn't meant to handle) then the unit will shut off. Otherwise, the erroring instruction is simply skipped. This may cause undefined or unexpected behavior, however in certain circumstances this doesn't matter. It's advised to keep this turned off, as it makes it easier to find obvious errors in the script.", + "", + "The third button is the \"automatic reboot\" setting. If the unit is powered down, no matter the reason, it will automatically try to start again. This allows for a simple \"loop\" where the same script is repeated every time it ends by simply rebooting the AUTOCAL unit at the end. Do note that doing so will delete all saved variables, more on how variables work later.", + "", + "The fourth button is for uploading the script. The script is in the minecraft's install folder, under the `hbmComputerUpload` folder, named `script.txt`. Clicking this button will send the contents of this script file to the AUTOCAL unit.", + "", + "The fifth button is for opening the script file. If no script file exists yet, the folder and empty script will be created.", + "", + "The sixth button is for downloading a script file. The existing `script.txt` is deleted and replaced with the script that is loaded onto the AUTOCAL unit.", + "", + "The simple workflow of programming an AUTOCAL unit is therefore using button #5 to open the file, writing the program, using #4 to flash the program to the AUTOCAL unit, and then using the first button to turn it on.", + "", + "## About MS-ES1", + "The script read by AUTOCAL units is written in *Machine Script - Equestrian Standard, Version 1*, or MS-ES1. MS-ES1 features named variables, value comparison, (conditional) jumping, evaluation of mathematical expressions and reading/writing of RoR signals. The speed at which lines are processed is defined by the *clock speed*, which can be defined in the script. The amount describes the number of lines processed per tick, i.e. the default clock speed of 1 means 20 lines are processed per second (there are 20 ticks in one second). The maximum clock speed is determined by the server config value `AUTOCAL_MAX_CLOCK` (default is 20, i.e. 400 per second).", + "", + "Example: `/ntmserver set AUTOCAL_MAX_CLOCK 10` -> Sets the max clock speed to 10.", + "", + "## About the Buffer", + "The buffer is a single \"slot\" of information that can be used for many commands. Some commands produce an output which is saved to the buffer, some commands modify the contents of the buffer, and some commands use the buffer's contents. The buffer's contents can also be saved permanently as a named variable, and named variables can be written back into the buffer again if needed. The buffer persists as long as the AUTOCAL unit is running, should it restart or shut down, the buffer's contents are lost.", + "", + "## About Variables", + "MS-ES1 allows named variables to be saved for later use. There is no limit to how many variables can be saved. All variables are text (\"Strings\"), however depending on the command and context, that text may be interpreted as a number (both full and decimal). Variables, much like the buffer, are also stored as long as the program is running, if the AUTOCAL unit shuts down, all stored variables are lost.", + "", + "## About Variable Substitution", + "Many commands allow for *variable substitution*, i.e. a specific format can be used to insert the contents of a variable (or multiple!) into a parameter. This allows for the quick use of variables, or multiple variables in the same statement. Substitution is defined by `$variable name$`, where this text is replaced with the value of a variable called \"variable name\".", + "", + "Example: `eval $val1$ + $val2$` assuming `val1` is 4 and `val2` is 8 would resolve to `eval 4 + 8`.", + "", + "Special case: The contents of the buffer can also be accessed using substitution using `$buffer$`. Consequently, a variable also named \"buffer\" can **not** be accessed using variable substitution at all.", + "", + "## About Redstone-over-Radio", + "RoR has a specific limitation: A signal cannot be sent on the same channel within the same game tick. Subsequent signals on the same channel in the same tick will overwrite the previous one, with the exception of numeric (whole number) signals which are added together (e.g. sending \"5\" and \"7\" in the same tick creates a signal \"12\"). Since the AUTOCAL unit's clock speed allows it to theoretically send multiple signals on the same channel on the same tick, it might be necessary to *end* the operation for this tick even though there's still clock cycles left to do. This can be done with the `endtick` command.", + "", + "## The Script (Commands)", + "", + "### Comments", + "Lines that start with `# ` (hashtag + space) are comments, and therefore ignored. If the AUTOCAL encounters such a line, it is skipped, not using up the clock cycle.", + "", + "Example: `# This is a comment` -> A line that does nothing, but can still be useful to explain and annotate other commands.", + "", + "### nop", + "`nop` (no operation) is an operation that consumes one clock cycle, but does not have any other effect. This is only useful in special cases where clock cycle timing is somehow important.", + "", + "### clockspeed", + "`clockspeed ` sets the AUTOCAL's clock speed (i.e. amount of lines processed per tick). This can be changed at any point in the script, but usually it is most useful to start the script by defining the clock speed.", + "", + "Example: `clockspeed 5` -> Sets the AUTOCAL's clock speed to five lines per tick (100 lines per second).", + "", + "### dest", + "`dest ` creates a jump destination. Using the various jumping conditions, we can cause the AUTOCAL to return back (or forward) to this point. If a destination is reached not by jumping but simply by reading the next line, it will not use up a clock cycle, just like a comment. Destinations need unique names, if multiple destinations exist with the same name, then the latter ones will overwrite the former ones.", + "", + "Example: `dest start` -> Creates a destination point named \"start\", any jump instruction using \"start\" will cause the script to return to this point.", + "", + "### jmp", + "`jmp ` will cause the program to skip to the destination with the supplied name. The jump will always be performed when the script reaches this instruction. Supports variable substitution!", + "", + "Example: `jmp start` -> Jumps to the destination point named \"start\".", + "Example: `jmp $dest$` -> Jumps to the destination point with the same name as the contents of the variable \"dest\".", + "", + "### jmpif", + "`jmpif ` will cause the program to skip to the destination with the supplied name, if the buffer's content is `true`. Otherwise, the program will just proceed to the next line, like any other instruction. Supports variable substitution!", + "", + "Example:", + "`jmpif skip`", + "`nop`", + "`dest skip`", + "`nop`", + "", + "-> If the buffer is `true`, then the program will jump to the destination point named \"skip\" and only run the second `nop`. Otherwise, both the first and second `nop` will run.", + "", + "### jmpnot", + "`jmpnot ` will cause the program to skip to the destination with the supplied name, if the buffer's content is **not** `true`. This is basically the inverse of `jmpif`. Only exists for some convenience for people who are used to more traditional languages' `if` statements. Supports variable substitution!", + "", + "Example:", + "`jmpnot skip` <- if", + "`nop` <- then", + "`jmp end`", + "`dest skip`", + "`nop` <- else", + "`dest end` <- end", + "", + "-> By using two jumps, one conditional and one fixed, we can emulate the structure of an `if/else` block. If the buffer's content is `true`, the first `nop` runs. Otherwise, the second `nop` is run. The second jump (`jmp end`) lets us skip over the \"else\" part of the script after running the \"then\" part.", + "", + "### endtick", + "`endtick` stops the script until the next game tick. This is important when sending multiple RoR signals on the same channel in a row, since a channel in the same tick can only hold one signal.", + "", + "### shutdown", + "`shutdown` will turn the AUTOCAL unit off. If the AUTOCAL is set up to automatically reboot, this effectively restarts the script from scratch, voiding all saved variables and the buffer. If not, then the AUTOCAL unit will stay off until manually restarted.", + "", + "### load", + "`load ` will take the value of a variable with the supplied name and copy it to the buffer. Many commands work directly out of the buffer, so next to variable substitution, this is the only way of actually accessing the contents of a variable.", + "", + "Example: `load val` -> Assuming that the variable \"val\" contains the value `5`, then the buffer's value is now overwritten with that `5`.", + "", + "### save", + "`save ` will take the value of the buffer and save it to a variable with the supplied name. This is the only way of actually changing variables, and saving values for later use besides the buffer.", + "", + "Example: `save val` -> Assuming that the buffer contains the value `12`, this will create a new variable named \"val\" with the value of `12`.", + "", + "### buffer", + "`buffer ` will write the supplied value directly to the buffer. This means that commands that require buffer values can be supplied with values directly from the code.", + "", + "Example:", + "`buffer Horseshoe`", + "`save item`", + "", + "-> Will buffer the value `Horseshoe` and then save it to the variable called \"item\".", + "", + "### eval", + "`eval [statement]` will evaluate the supplied statement as a mathematical expression. In short, anything NTM's calculator can make sense of (the one you open with N by default), this function can do the same. The statement is optional, if no statement is supplied, then it will try to use the buffer's contents as the statement. `eval` produces **decimal** values and not whole number **integers**, so for use in RoR signals, the output needs to be rounded! The result of the calculation is then saved to the buffer. Supports variable substitution!", + "", + "Example: `eval 4 + 5` -> Calculates \"4+5\" and saves `9` to the buffer.", + "Example: `eval $val$ / 2` -> Takes the value of \"val\" and divides it by 2, saving the result to the buffer.", + "", + "Example:", + "`load calc`", + "`eval`", + "", + "-> Will write the value of \"calc\" to the buffer, and then treat it as a mathematical expression. If we assume \"calc\" to be `5+2` then `eval` will end up writing `7` to the buffer.", + "", + "### evalr", + "`evalr [statement]` is identical to `eval`, however it will round the result to the nearest whole number. Whole numbers are important for RoR, since gauges, numeric displays and logic receivers can only handle whole numbers, and not decimals.", + "", + "### rounddown / floor", + "`rounddown` or `floor` will try to interpret the buffer's content as a decimal, and round it **down** to the next lower integer, writing the result to the buffer again.", + "", + "Example: `rounddown` -> Assuming the buffer's value is `4.2`, the buffer's new value will be `4`.", + "Example: `rounddown` -> Assuming the buffer's value is `4.6`, the buffer's new value will be `4`.", + "", + "### roundup / ceil", + "`roundup` or `ceil` will try to interpret the buffer's content as a decimal, and round it **up** to the next higher integer, writing the result to the buffer again.", + "", + "Example: `roundup` -> Assuming the buffer's value is `4.2`, the buffer's new value will be `5`.", + "Example: `roundup` -> Assuming the buffer's value is `4.6`, the buffer's new value will be `5`.", + "", + "### round / nearest", + "`round` or `nearest` will try to interpret the buffer's content as a decimal, and round it to the **closest** integer, writing the result to the buffer again.", + "", + "Example: `round` -> Assuming the buffer's value is `4.2`, the buffer's new value will be `4`.", + "Example: `round` -> Assuming the buffer's value is `4.6`, the buffer's new value will be `5`.", + "", + "### concat", + "`concat ` works similarly to `buffer `, however it accepts variable substitution. This means that the text of multiple variables can be combined.", + "", + "Example: `concat $first$ and $second$` -> Assuming the variable \"first\" to be `Cats` and \"second\" to be `dogs`, then the result saved to the buffer is `Cats and dogs`.", + "", + "### eq", + "`eq ` - equals, will try to compare the buffer to the supplied value. The buffer will be set to `true` if the values are equal and `false` otherwise. Supports variable substitution!", + "", + "Example: `eq Brick` -> If the buffer is `Brick`, then it is set to `true`, otherwise it becomes `false`.", + "Example: `eq $comp$` -> If the buffer's value is equal to the value of the variable \"comp\", then it is set to `true`, otherwise it becomes `false`.", + "", + "### gtb", + "`gtb ` - greater than buffer, will try to compare the buffer to the supplied value. The buffer will be set to `true` if the supplied numerical value is greater and `false` otherwise. Supports variable substitution!", + "", + "Example: `gtb 4` -> If the buffer is `3` or lower, then it is set to `true`, otherwise it becomes `false`.", + "Example: `gtb $comp$` -> If the buffer lower than the value of \"comp\", then it is set to `true`, otherwise it becomes `false`.", + "", + "### ltb", + "`ltb ` - less than buffer, will try to compare the buffer to the supplied value. The buffer will be set to `true` if the supplied numerical value is lower and `false` otherwise. Supports variable substitution!", + "", + "Example: `ltb 4` -> If the buffer is `5` or higher, then it is set to `true`, otherwise it becomes `false`.", + "Example: `ltb $comp$` -> If the buffer higher than the value of \"comp\", then it is set to `true`, otherwise it becomes `false`.", + "", + "### geb", + "`geb ` - greater than or equal buffer.", + "", + "### leb", + "`leb ` - less than or equal buffer.", + "", + "### send", + "`send ` will send a Redstone-over-Radio signal over the supplied channel, with the signal's value being the current buffer's value. Sending repeatedly over the same channel requires waiting for a full game tick, so using `endtick` after sending is advised. Supports variable substitution!", + "", + "Example:", + "`buffer Hello!`", + "`send transmission`", + "", + "-> Will send the RoR signal `Hello!` on the channel \"transmission\".", + "", + "Example:", + "`buffer SOS`", + "`send $target$`", + "", + "-> Will send the RoR signal \"SOS\" to the channel saved in the variable \"target\".", + "", + "### listen ", + "`listen ` will listen in on the supplied RoR channel and write the signal to the buffer. Will detect all signals, even expired ones, and one just ones sent in the previous tick, so picking up a signal doesn't mean it's new information. Supports variable substitution!", + "", + "Example:", + "`listen input`", + "`eval $buffer$ * 100`", + "`send output`", + "", + "-> Will take the signal from the RoR channel \"input\", multiply it by 100, and send that value on the channel \"output\".", + "", + "## Advanced", + "", + "### Conditional Branches", + "Basic if/else conditions are the bread and butter of most programming. If we want to change the behavior based on different values, we need to compare, and then conditional jump.", + "", + "This example creates a script that processed a number \"val\" based on how high it is. 4 and below are multiplied by 2, otherwise it is divided by 2:", + "", + "`buffer 4` <- buffer `4` for comparison", + "`gtb $val$` <- is \"val\" greater than our buffer?", + "`jmpnot else` <- if not, jump to \"else\"", + "`eval $val$ / 2` <- if it is, divide by 2", + "`save val` <- ...and save to \"val\"", + "`jmp end` <- now jump to \"end\" to skip our \"else\" block", + "`dest else` <- else...", + "`eval $val$ * 2` <- multiply by 2", + "`save val` <- ...and save to val", + "`dest end` <- no matter which branch we took, we always end up here", + "", + "### Methods", + "People who are used to high languages will already know this concept, reusable parts of code with a set of parameters and an optional return value. For this we will use a few variables and a set of jumps in order to be able to use this piece of code from anywhere:", + "", + "This example implements a basic lerp (linear interpolation) function.", + "", + "`dest lerp`", + "`eval $a$ + ($b$ - $a$) * $i$`", + "`save result`", + "`jmp $return$`", + "", + "This function requires the variables \"a\", \"b\" and \"i\" as parameters and saves the result to the variable \"result\". We can now access this function like such:", + "", + "`buffer 4` <- first we set up our parameters to be used in the function", + "`save a`", + "`buffer 7`", + "`save b`", + "`buffer 0.6`", + "`save i`", + "`buffer returnhere` <- then we define the name of the return point", + "`save return`", + "`jmp lerp` <- call the function", + "`dest returnhere` <- once the function concludes, we are back here", + "", + "At the end of it all, the variable \"result\" now has the desired value.", + }; +} From 2a48beecdd630d31942f88a926c16a5b3a607c8c Mon Sep 17 00:00:00 2001 From: Voxelstice <95834462+Voxelstice@users.noreply.github.com> Date: Wed, 3 Jun 2026 23:30:34 +0300 Subject: [PATCH 002/107] achieved with sauce Use LWJGL's openURL function instead --- .../com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java index 19c1113ca..6d8bc6bba 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java @@ -9,8 +9,8 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.net.URI; import java.util.Arrays; -import java.util.Objects; +import org.lwjgl.Sys; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; @@ -45,8 +45,14 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { if (Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { Desktop.getDesktop().browse(uri); } else { - if (Runtime.getRuntime().exec(new String[] { "which", "xdg-open" }).getInputStream().read() != -1) { - Runtime.getRuntime().exec(new String[] { "xdg-open", uri.toString() }); + if (Sys.getVersion().charAt(0) == '3') { + // probably a LWJGL3ify user, open the folder instead since that somehow seems to work + File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); + if (uploadFolder.exists()) { + org.lwjgl.Sys.openURL(uploadFolder.toString()); + } + } else { + org.lwjgl.Sys.openURL(uri.toString()); } } } From 987dbba536b0f05184a7de8c7cbf3694469621db Mon Sep 17 00:00:00 2001 From: Voxelstice <95834462+Voxelstice@users.noreply.github.com> Date: Wed, 3 Jun 2026 23:32:51 +0300 Subject: [PATCH 003/107] minor changes that dont matter but whatever --- .../java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java index 6d8bc6bba..b509c167b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java @@ -48,11 +48,9 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { if (Sys.getVersion().charAt(0) == '3') { // probably a LWJGL3ify user, open the folder instead since that somehow seems to work File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); - if (uploadFolder.exists()) { - org.lwjgl.Sys.openURL(uploadFolder.toString()); - } + if (uploadFolder.exists()) Sys.openURL(uploadFolder.toString()); } else { - org.lwjgl.Sys.openURL(uri.toString()); + Sys.openURL(uri.toString()); } } } From ea863e7d70b27410d7854d62bbf4bd5d430ce6a8 Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Thu, 4 Jun 2026 19:00:37 +0300 Subject: [PATCH 004/107] Piw-piw --- src/main/resources/assets/hbm/lang/ru_RU.lang | 32 ++++++------------- .../hbm/manual/machine/blastfurnace.json | 2 +- .../assets/hbm/manual/material/copper.json | 4 +-- 3 files changed, 12 insertions(+), 26 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 031af1504..dbc9e5171 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1605,15 +1605,6 @@ item.ajro_boots.name=Ботинки силовой брони AJR item.ajro_helmet.name=Шлем силовой брони AJR item.ajro_legs.name=Поножи силовой брони AJR item.ajro_plate.name=Нагрудник силовой брони AJR -item.alloy_axe.name=Топор из продвинутого сплава -item.alloy_boots.name=Ботинки из продвинутого сплава -item.alloy_helmet.name=Шлем из продвинутого сплава -item.alloy_hoe.name=Мотыга из продвинутого сплава -item.alloy_legs.name=Поножи из продвинутого сплава -item.alloy_pickaxe.name=Кирка из продвинутого сплава -item.alloy_plate.name=Нагрудник из продвинутого сплава -item.alloy_shovel.name=Лопата из продвинутого сплава -item.alloy_sword.name=Меч из продвинутого сплава item.ammo_arty.name=16-дюймовый артиллерийский снаряд item.ammo_arty_cargo.name=16-дюймовый артиллерийский снаряд для экспресс-доставки item.ammo_arty_chlorine.name=Хлорный 16-дюймовый артиллерийский снаряд @@ -2477,11 +2468,11 @@ item.defuser.name=Высокотехнологичное устройство д item.defuser_gold.name=Золотые кусачки item.demon_core_closed.name=Закрытый Заряд-Демон item.demon_core_open.name=Приостановленный Заряд-Демон -item.desh_axe.name=Топор из рабочего сплава -item.desh_hoe.name=Мотыга из рабочего сплава -item.desh_pickaxe.name=Кирка из рабочего сплава -item.desh_shovel.name=Лопата из рабочего сплава -item.desh_sword.name=Меч из рабочего сплава +item.desh_axe.name=Деш-топор +item.desh_hoe.name=Деш-мотыга +item.desh_pickaxe.name=Деш-кирка +item.desh_shovel.name=Деш-лопата +item.desh_sword.name=Деш-меч item.designator.name=Целеуказатель ближнего действия item.designator_arty_range.name=Артиллерийский целеуказатель item.designator_manual.name=Ручной целеуказатель @@ -4615,7 +4606,7 @@ item.weapon_mod_special.silencer.name=Глушитель item.weapon_mod_special.skin_saturnite.name=Сатурнитовый корпус item.weapon_mod_special.slowdown.name=Зубчатая передача item.weapon_mod_special.speedloader.name=Спидлоадер -item.weapon_mod_special.speedup.name=Вспомогательный элекртрический двигатель +item.weapon_mod_special.speedup.name=Вспомогательный электрический двигатель item.weapon_mod_special.stack_mag.name=Двухрядный магазин item.weapon_mod_test.damage.name=УЛУЧШЕНИЕ УРОНА item.weapon_mod_test.firerate.name=УЛУЧШЕНИЕ СКОРОСТИ СТРЕЛЬБЫ @@ -5067,15 +5058,15 @@ tile.cm_engine.desh.name=Моторный блок из деша tile.cm_engine.standard.name=Моторный блок tile.cm_flux.name=Приёмник нейтронного потока tile.cm_heat.name=Теплоприёмник -tile.cm_port.alloy.name=Люк из продвинутого сплава +tile.cm_port.alloy.name=Люк из бронзы tile.cm_port.desh.name=Люк из деша tile.cm_port.steel.name=Люк из стали tile.cm_port.tcalloy.name=Люк из технециевой стали -tile.cm_sheet.alloy.name=Лист из продвинутого сплава +tile.cm_sheet.alloy.name=Лист из бронзы tile.cm_sheet.desh.name=Лист из деша tile.cm_sheet.steel.name=Лист из стали tile.cm_sheet.tcalloy.name=Лист из технециевой стали -tile.cm_tank.alloy.name=Бак из продвинутого сплава +tile.cm_tank.alloy.name=Бак из бронзы tile.cm_tank.desh.name=Бак из деша tile.cm_tank.steel.name=Бак из стали tile.cm_tank.tcalloy.name=Бак из технециевой стали @@ -5530,11 +5521,6 @@ tile.machine_detector.name=Детектор мощности tile.machine_deuterium_extractor.name=Экстрактор дейтерия tile.machine_deuterium_tower.name=Колонна экстракции дейтерия tile.machine_diesel.name=Дизельный генератор -tile.machine_difurnace_extension.name=Расширитель доменной печи -tile.machine_difurnace_off.name=Доменная печь -tile.machine_difurnace_on.name=Доменная печь -tile.machine_difurnace_rtg_off.name=Ядерная доменная печь -tile.machine_difurnace_rtg_on.name=Ядерная доменная печь tile.machine_drain.name=Сливная труба tile.machine_drill.name=Автоматический горный бур tile.machine_electric_furnace_off.name=Электрическая печь diff --git a/src/main/resources/assets/hbm/manual/machine/blastfurnace.json b/src/main/resources/assets/hbm/manual/machine/blastfurnace.json index 4962632e6..7cdffc76b 100644 --- a/src/main/resources/assets/hbm/manual/machine/blastfurnace.json +++ b/src/main/resources/assets/hbm/manual/machine/blastfurnace.json @@ -9,7 +9,7 @@ }, "content": { "en_US": "Simple furnace that can combine two items into one output and an optional byproduct, usually in the form of an alloy. Needed early on as the first source of [[steel|Steel]] and [[red copper|Minecraft Grade Copper]]. Does not accept all furnace fuels, only works with hot burning ones like coal, coke, or solid fuel. Accepts hot air blast which accelerates the process up to three times the recipe's intended speed. Produces flue gas, which can be burned for energy or simply flared.", - "ru_RU": "Простая печь, которая может объединять два элемента в один продукт и дополнительный побочный продукт, обычно в виде сплава. На раннем этапе необходима в качестве первого источника [[стали|Steel]], [[красной меди|Minecraft Grade Copper]] и [[продвинутого сплава|Advanced Alloy]]. Работает не со всеми видами топлива, а только с высокотемпературным, таким как уголь, кокс или твердое топливо. Принимает поток горячего воздуха, который ускоряет процесс до трех раз по сравнению с заданной скоростью рецепта. Производит дымовой газ, который можно сжечь просто так или для получения энергии.", + "ru_RU": "Простая печь, которая может объединять два элемента в один продукт и дополнительный побочный продукт, обычно в виде сплава. На раннем этапе необходима в качестве первого источника [[стали|Steel]], [[красной меди|Minecraft Grade Copper]]. Работает не со всеми видами топлива, а только с высокотемпературным, таким как уголь, кокс или твердое топливо. Принимает поток горячего воздуха, который ускоряет процесс до трех раз по сравнению с заданной скоростью рецепта. Производит дымовой газ, который можно сжечь просто так или для получения энергии.", "zh_CN": "一种能将两种物品结合为一种产物的简单熔炉,产物通常为一种合金。 是游戏前期必需的机器,也是[[钢|Steel]]、[[紫铜|Minecraft Grade Copper]]和[[高级合金|Advanced Alloy]]的最初来源。高炉并不能接受所有熔炉燃料,只接受煤炭、焦炭和岩浆桶等高温 燃料。可以通过在顶部放置高炉烟道来加速,同时提升其效率。" } } diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index 6128cd97e..767cd16d5 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -10,8 +10,8 @@ }, "content": { "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", - "uk_UA": "Поширений ресурс. У сирому вигляді здебільшого використовується як конструкційний матеріал, а також у речах, що витримують високі температури (такі як теплопропровідники). Активно використовується в різних сплавах.

[[Червона мідь|Minecraft Grade Copper]] — це сплав, виготовлений з редстоуну, який використовується майже у всіх електричних пристроях.

[[Удосконалений сплав|Advanced Alloy]] — це потужний ранній інструментальний матеріал, який перевершує алмаз.

[[Гарматна бронза|Gunmetal]] — це важливий компонент багатьох видів зброї, а також гільз для боєприпасів.

[[Вісмутова бронза|Bismuth Bronze]] та [[миш'якова бронза|Arsenic Bronze]] — це пост-[[РБМК|RBMK]] матеріали що використовуються в багатьох машинах пізньої версії гри.

[[BSCCO]] — це надпровідник, похідний від [[вісмуту|Bismuth]] необхідний для високорівневих квантових схем та котушок [[прискорювача часток|Particle Accelerator]].", - "ru_RU": "Распространённый ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Пушечная бронза|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для высокоуровневых квантовых схем и катушек [[ускорителя частиц|Particle Accelerator]].", + "uk_UA": "Поширений ресурс. У сирому вигляді здебільшого використовується як конструкційний матеріал, а також у речах, що витримують високі температури (такі як теплопропровідники). Активно використовується в різних сплавах.

[[Червона мідь|Minecraft Grade Copper]] — це сплав, виготовлений з редстоуну, який використовується майже у всіх електричних пристроях.

[[Гарматна бронза|Gunmetal]] — це важливий компонент багатьох видів зброї, а також гільз для боєприпасів.

[[Вісмутова бронза|Bismuth Bronze]] та [[миш'якова бронза|Arsenic Bronze]] — це пост-[[РБМК|RBMK]] матеріали що використовуються в багатьох машинах пізньої версії гри.

[[BSCCO]] — це надпровідник, похідний від [[вісмуту|Bismuth]] необхідний для високорівневих квантових схем та котушок [[прискорювача часток|Particle Accelerator]].", + "ru_RU": "Распространённый ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Пушечная бронза|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для высокоуровневых квантовых схем и катушек [[ускорителя частиц|Particle Accelerator]].", "zh_CN": "常见资源。纯铜主要用作结构材料,或在能够承受高温的设备中使用(作热导体); 铜的多种合金用途极广。

[[紫铜|Minecraft Grade Copper]]是红石和铜的合金,几乎所有电力设备都使用紫铜。

[[高级合金|Advanced Alloy]]是前期强力的装备材料,其性能优于钻石。

[[炮铜|Gunmetal]]是制作多种枪炮必不可少的材料,同时也用于制造弹壳。

[[铋青铜|Bismuth Bronze]]和[[砷青铜|Arsenic Bronze]]是 [[RBMK]] 后的材料,用于制作多种后期机器。

[[BSCCO]]是一种由铋衍生的超导体,高等级的量子电路和[[粒子加速器|Particle Accelerator]]线圈都需要BSCCO超导体制作。" } } From 7e44f0f8479297044999e3fe0f74dd2a72810fb7 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Mon, 8 Jun 2026 21:26:27 +0200 Subject: [PATCH 005/107] dear god --- changelog | 29 +------------- .../api/hbm/ntl/ISlotMonitorProvider.java | 3 ++ src/main/java/api/hbm/ntl/SlotMonitor.java | 4 -- src/main/java/api/hbm/ntl/StackCache.java | 23 +++++++++++ .../ContainerPneumoStorageAccess.java | 38 ++++++++++++++++++- .../recipes/BlastFurnaceRecipesNT.java | 5 ++- .../tileentity/machine/TileEntityWatz.java | 10 +---- .../TileEntityPneumoStorageClutter.java | 12 ++++++ .../networkproviders/PneumaticNetwork.java | 11 ++++++ 9 files changed, 93 insertions(+), 42 deletions(-) diff --git a/changelog b/changelog index 316a59806..b5897bc7a 100644 --- a/changelog +++ b/changelog @@ -1,28 +1,3 @@ ## Changed -* Removed advanced alloy - * All recipes that used to have AA in it now use something else - * AA tools and armor remain for now, although they are uncraftable - * Steel and titanium armor now have some DT and DR, making them roughly on-par with the old AA - * Buffed durability for steel and titanium tool materials - * Steel tools now deal more damage (still not as much as titanium) and has diamond harvest level - * AA custom machine blocks have been replaced with bronze ones which make more sense in progression, since AA was too close to steel anyway -* Renamed "worker's alloy" to "desh" to avoid confusion - * Seriously why did this have two names? -* Industrial grade and minecraft grade copper ingots now have the "ingot" suffix -* Changed the microchip assembler recipe duration so that it matches with the demand of one soldering station -* Blast furnace speed with hot air blast can now be increased to 500% (uses the same amount of hot air blast as before) - -## Fixed -* AUTOCAL - * Fixed `listen` command failing if the buffer is empty - * Fixed variable substitution failing when there is a trailing $ sign - * Fixed concat prefixing all output with "t " for some reason - * Eval(r) now uses a special mode for variable substitution that forces empty variables to be interpreted as "0" -* Fixed things not intended to be used in the blast furnace (scrap, lava) being usable fuels -* Fixed blast furnace swallowing container items left behind by fuels, instead fuels with containers will not be accepted at all -* Fixed the blast furnace NEI screen listing "0 HE" for every recipe even though it's not an electric machine -* Fixed flue gas not having an inventory texture -* Potentially fixed issue with Angelica where tile entity culling would cause cargo elevators to not render on certain angles -* Fixed the blast furnace not performing stack size checks correctly, outputting items when it shouldn't -* Fixed cargo elevators not rendering past a distance of 100 blocks -* Fixed cargo elevator syncing range being only 100 blocks, meaning that elevators taller than that don't work properly +* Updated chinese localization +* Watz powerplant now has OC and RoR integration \ No newline at end of file diff --git a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java index 0dbde4ea5..68e0e958b 100644 --- a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java +++ b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java @@ -21,6 +21,9 @@ public interface ISlotMonitorProvider { /** Returns the amount of that slot at that index. Some storages may use int64 datatypes so we have to account for those too somehow, since ItemStacks cannot handle that. */ public long getAmountAt(int index); + /** Removes the given number of items from that slot, returns the amount left to remove if the stack was smaller than the supplied amount */ + public long useUpItem(int index, long amount); + /** Whether this storage unit is reachable by the access point */ public boolean isAvailableToCache(StackCache cache); diff --git a/src/main/java/api/hbm/ntl/SlotMonitor.java b/src/main/java/api/hbm/ntl/SlotMonitor.java index b0c295743..2422456be 100644 --- a/src/main/java/api/hbm/ntl/SlotMonitor.java +++ b/src/main/java/api/hbm/ntl/SlotMonitor.java @@ -103,8 +103,6 @@ public class SlotMonitor { if(hasTypeChanged) { - System.out.println("Type changed!"); - // remove from all existing monitors Iterator iterator = viewedBy.iterator(); while(iterator.hasNext()) { @@ -130,8 +128,6 @@ public class SlotMonitor { // find new monitors if(pneumoNet != null) { - System.out.println("Adding to new network..."); - for(StackCache cache : pneumoNet.accessors) { System.out.println("Adding to cache..."); if(!cache.hasExpired && parent.isAvailableToCache(cache)) { diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index 6c8674513..1f853f4c7 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -46,6 +46,29 @@ public class StackCache { cache.addMonitor(monitor); } + public CacheSlot getSlotFromStack(ItemStack stack) { + return getSlotFromStack(stack.getItem(), stack.getItemDamage(), stack.stackTagCompound); + } + + public CacheSlot getSlotFromStack(Item item, int meta, NBTTagCompound nbt) { + long monitorIdentity = getStackIdentity(item, meta, nbt); + return cacheSlots.get(monitorIdentity); + } + + /** Uses up items and returns how many of the requested items could be removed, with no desyncs that number should always be equal to the supplied amount */ + public long consumeItemsAndReturnQuantity(ItemStack stack, long amount) { + CacheSlot cache = getSlotFromStack(stack); + if(cache == null) return 0; + long originalAmount = amount; + + for(SlotMonitor monitor : cache.monitors) { + amount = monitor.parent.useUpItem(monitor.index, amount); + if(amount <= 0) break; + } + + return originalAmount - amount; + } + public void dissolveCache() { for(Entry cacheEntry : cacheSlots.entrySet()) { cacheEntry.getValue().destroy(); diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index bcd99eaf0..5cfefc1d0 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -15,12 +15,15 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class ContainerPneumoStorageAccess extends Container { protected TileEntityPneumoStorageAccess access; protected InventoryPneumoStorageAccess inventory; + + public static final String STACK_SIZE_KEY = "PNEUMO_STACK_SIZE"; public ContainerPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { this.access = access; @@ -28,7 +31,7 @@ public class ContainerPneumoStorageAccess extends Container { for(int i = 0; i < 6; i++) { for(int j = 0; j < 8; j++) { - this.addSlotToContainer(new SlotNonRetarded(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); + this.addSlotToContainer(new SlotNonRetarded(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); // TODO: add a new slot type that holds a long for the amount } } @@ -51,6 +54,38 @@ public class ContainerPneumoStorageAccess extends Container { return access.getDistanceFrom(player.posX, player.posY, player.posZ) <= 15 * 15; } + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + if(index >= 0 && index < 6 * 8) { + boolean client = player.worldObj.isRemote; + Slot slot = this.getSlot(index); + ItemStack held = player.inventory.getItemStack(); + + if(held == null && slot.getHasStack() && slot.getStack().hasTagCompound()) { + ItemStack stack = slot.getStack().copy(); + + if(button == 0) { + int toGrab = (int) Math.min(stack.getMaxStackSize(), stack.stackTagCompound.getLong(STACK_SIZE_KEY)); + + if(client) { + stack.stackSize = toGrab; + player.inventory.setItemStack(stack); + } else { + if(this.access.cache == null || this.access.cache.hasExpired) return stack; + StackCache cache = this.access.cache; + stack.stackSize = (int) cache.consumeItemsAndReturnQuantity(stack, toGrab); // this can't work because the stack got altered with the description NBT..... + player.inventory.setItemStack(stack); + } + } + + return slot.getStack().copy(); + } + } + + return super.slotClick(index, button, mode, player); + } + @Override public ItemStack transferStackInSlot(EntityPlayer player, int index) { return null; @@ -81,6 +116,7 @@ public class ContainerPneumoStorageAccess extends Container { if(cache.displayStack != null) { slots[i] = cache.displayStack.copy(); ItemStackUtil.addTooltipToStack(slots[i], "x" + cache.stacksize, "in " + cache.monitors.size() + " stacks"); + slots[i].stackTagCompound.setLong(STACK_SIZE_KEY, cache.stacksize); // TODO instead of altering the stacks so we can't resolve anything anymore, hijack the progress bar system } } } diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipesNT.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipesNT.java index 0fbc79920..4309c6043 100644 --- a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipesNT.java +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipesNT.java @@ -63,8 +63,11 @@ public class BlastFurnaceRecipesNT extends GenericRecipes { .inputItems(new OreDictStack(CO.ingot()), new ComparableStack(ModItems.meteorite_sword_hardened, 1)) .outputItems(new ItemStack(ModItems.meteorite_sword_alloyed, 1))); + this.register((BlastFurnaceRecipe) new BlastFurnaceRecipe("blast.meteor").setDuration(600) + .inputItems(new OreDictStack(CO.ingot()), new ComparableStack(ModItems.powder_meteorite, 1)) + .outputItems(new ItemStack(ModItems.ingot_meteorite, 1))); this.register((BlastFurnaceRecipe) new BlastFurnaceRecipe("blast.starmetal").setDuration(600) - .inputItems(new OreDictStack(BIGMT.ingot()), new ComparableStack(ModItems.powder_meteorite, 1)) + .inputItems(new OreDictStack(BIGMT.ingot()), new ComparableStack(ModItems.ingot_meteorite, 1)) .outputItems(new ItemStack(ModItems.ingot_starmetal, 1))); this.register((BlastFurnaceRecipe) new BlastFurnaceRecipe("blast.paa").setDuration(600) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index c1d1317b4..7e4e27ce8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -35,12 +35,10 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import api.hbm.redstoneoverradio.IRORInteractive; import api.hbm.redstoneoverradio.IRORValueProvider; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; -import li.cil.oc.api.network.SimpleComponent; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -54,7 +52,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityWatz extends TileEntityMachineBase implements IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IFluidCopiable, CompatHandler.OCComponent, IRORValueProvider, IRORInteractive { +public class TileEntityWatz extends TileEntityMachineBase implements IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IFluidCopiable, CompatHandler.OCComponent, IRORValueProvider { public FluidTank[] tanks; public FluidTank[] sharedTanks; @@ -664,12 +662,6 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand return ROR; } - @Override - public String runRORFunction(String name, String[] params) { - // TODO Auto-generated method stub - return null; - } - @Override public String provideRORValue(String name) { if((PREFIX_VALUE + "heat").equals(name)) return "" + this.heat; diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java index 0159fdaf7..5e5c96b84 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java @@ -141,4 +141,16 @@ public class TileEntityPneumoStorageClutter extends TileEntityMachineBase implem public boolean isAvailableToCache(StackCache cache) { return this.isLoaded && !this.isInvalid(); } + + @Override + public long useUpItem(int index, long amount) { + + if(slots[index] != null) { + int toRemove = (int) Math.min(slots[index].stackSize, amount); + this.decrStackSize(index, toRemove); + return amount - toRemove; + } + + return amount; + } } diff --git a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java index 53172e368..00ac69f26 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java @@ -54,6 +54,17 @@ public class PneumaticNetwork extends NodeNet { accessors.clear(); storages.clear(); } + + @Override + public void joinNetworks(NodeNet network) { + super.joinNetworks(network); + + PneumaticNetwork net = (PneumaticNetwork) network; + for(StackCache cache : accessors) cache.dissolveCache(); + + for(Object connector : net.accessors) this.accessors.add((StackCache) connector); + for(Object connector : net.storages) this.storages.add((ISlotMonitorProvider) connector); + } public void addReceiver(IInventory inventory, ForgeDirection pipeDir, TileEntityPneumoTube endpoint) { receivers.put(inventory, new Triplet(pipeDir, System.currentTimeMillis(), endpoint)); From 3d4e50cd335159c9030a045783805233de9bfd7b Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 11 Jun 2026 12:59:49 +0200 Subject: [PATCH 006/107] speedrun --- changelog | 9 ++++++++- .../blocks/machine/FoundryCastingBase.java | 2 +- .../com/hbm/blocks/machine/FoundryOutlet.java | 2 +- .../hbm/inventory/material/NTMMaterial.java | 5 +++++ .../inventory/recipes/CentrifugeRecipes.java | 6 ++---- src/main/java/com/hbm/module/ParseMSES1.java | 16 ++++++++-------- .../TileEntityMachineIndustrialTurbine.java | 4 ++++ .../machine/TileEntityMachineThresher.java | 2 ++ .../hbm/textures/models/machines/thresher.png | Bin 2661 -> 2716 bytes 9 files changed, 31 insertions(+), 15 deletions(-) diff --git a/changelog b/changelog index b5897bc7a..00e00be3c 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,10 @@ ## Changed * Updated chinese localization -* Watz powerplant now has OC and RoR integration \ No newline at end of file +* Watz powerplant now has OC and RoR integration +* The automatic thresher now has a fluid port on the bottom as well +* The foundry basins and outlet filters now use the properly translated name instead of the internal name for the material + +## Fixed +* Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised +* Fixed broken thorium ore centrifuging recipe shown in NEI +* Fixed industrial turbine not properly saving its energy values, causing the flywheel to stop on relog \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index fe57bc788..9c499f04d 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -202,7 +202,7 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc } if(cast.type != null && cast.amount > 0) { - text.add(EnumChatFormatting.YELLOW + cast.type.names[0] + ": " + cast.amount + " / " + cast.getCapacity()); + text.add(EnumChatFormatting.YELLOW + cast.type.getLocalizedName() + ": " + cast.amount + " / " + cast.getCapacity()); } ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index bbf18772b..a9a0d1d7d 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -204,7 +204,7 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor, List text = new ArrayList(); if(outlet.filter != null) { - text.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("foundry.filter", outlet.filter.names[0])); + text.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("foundry.filter", outlet.filter.getLocalizedName())); } if(outlet.invertFilter) { text.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("foundry.invertFilter")); diff --git a/src/main/java/com/hbm/inventory/material/NTMMaterial.java b/src/main/java/com/hbm/inventory/material/NTMMaterial.java index 7f15f1bed..56c1a1aa1 100644 --- a/src/main/java/com/hbm/inventory/material/NTMMaterial.java +++ b/src/main/java/com/hbm/inventory/material/NTMMaterial.java @@ -5,6 +5,7 @@ import java.util.Locale; import java.util.Set; import com.hbm.inventory.OreDictManager.DictFrame; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -50,6 +51,10 @@ public class NTMMaterial { return "hbmmat." + this.names[0].toLowerCase(Locale.US); } + public String getLocalizedName() { + return I18nUtil.resolveKey(getUnlocalizedName()); + } + public NTMMaterial setConversion(NTMMaterial mat, int in, int out) { this.smeltsInto = mat; this.convIn = in; diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index b8b9b5e43..fdc31be9c 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -14,12 +14,10 @@ import com.hbm.config.GeneralConfig; import com.hbm.handler.imc.IMCCentrifuge; import static com.hbm.inventory.OreDictManager.*; import com.hbm.inventory.OreDictManager.DictFrame; -import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; -import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ItemEnums; import com.hbm.items.ItemEnums.EnumAshType; @@ -131,7 +129,7 @@ public class CentrifugeRecipes extends SerializableRecipe { new ItemStack(ModItems.nugget_solinium, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put(new OreDictStack("oreRareEarth"), new ItemStack[] { + recipes.put(new OreDictStack(RAREEARTH.ore()), new ItemStack[] { new ItemStack(ModItems.powder_desh_mix, 1), new ItemStack(ModItems.nugget_zirconium, 1), new ItemStack(ModItems.nugget_zirconium, 1), @@ -149,7 +147,7 @@ public class CentrifugeRecipes extends SerializableRecipe { lbs ? new ItemStack(ModItems.nugget_ra226, 2) : new ItemStack(ModItems.nugget_ra226, 1), new ItemStack(Blocks.gravel, 1) }); - for(String ore : OreDictManager.TH232.all(MaterialShapes.ORE)) recipes.put(new OreDictStack(ore), new ItemStack[] { + recipes.put(new OreDictStack(TH232.ore()), new ItemStack[] { new ItemStack(ModItems.powder_thorium, 1), new ItemStack(ModItems.powder_thorium, 1), new ItemStack(ModItems.powder_uranium, 1), diff --git a/src/main/java/com/hbm/module/ParseMSES1.java b/src/main/java/com/hbm/module/ParseMSES1.java index 453cb1ea3..1f9c8c931 100644 --- a/src/main/java/com/hbm/module/ParseMSES1.java +++ b/src/main/java/com/hbm/module/ParseMSES1.java @@ -180,10 +180,10 @@ public class ParseMSES1 implements IParse { // greater than buffer if(lower.startsWith("gtb ")) { - if(line.length() <= 3 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 4 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { double buffer = Double.parseDouble(ctx.buffer); - double val = Double.parseDouble(line.substring(3)); + double val = Double.parseDouble(substitute(ctx, line.substring(4), false)); ctx.buffer = val > buffer ? "true" : "false"; } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; @@ -191,10 +191,10 @@ public class ParseMSES1 implements IParse { // lower than buffer if(lower.startsWith("ltb ")) { - if(line.length() <= 3 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 4 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { double buffer = Double.parseDouble(ctx.buffer); - double val = Double.parseDouble(line.substring(3)); + double val = Double.parseDouble(substitute(ctx, line.substring(4), false)); ctx.buffer = val < buffer ? "true" : "false"; } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; @@ -202,10 +202,10 @@ public class ParseMSES1 implements IParse { // greater than or equal buffer if(lower.startsWith("geb ")) { - if(line.length() <= 3 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 4 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { double buffer = Double.parseDouble(ctx.buffer); - double val = Double.parseDouble(line.substring(3)); + double val = Double.parseDouble(substitute(ctx, line.substring(4), false)); ctx.buffer = val >= buffer ? "true" : "false"; } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; @@ -213,10 +213,10 @@ public class ParseMSES1 implements IParse { // lower than or equal buffer if(lower.startsWith("leb ")) { - if(line.length() <= 3 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 4 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { double buffer = Double.parseDouble(ctx.buffer); - double val = Double.parseDouble(line.substring(3)); + double val = Double.parseDouble(substitute(ctx, line.substring(4), false)); ctx.buffer = val <= buffer ? "true" : "false"; } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIndustrialTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIndustrialTurbine.java index cb1798c91..8ecc1a189 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIndustrialTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIndustrialTurbine.java @@ -183,6 +183,8 @@ public class TileEntityMachineIndustrialTurbine extends TileEntityTurbineBase im public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); lastPowerTarget = nbt.getLong("lastPowerTarget"); + flywheel_energy = nbt.getLong("flywheel_energy"); + maxPower = nbt.getLong("maxPower"); spin = nbt.getDouble("spin"); } @@ -190,6 +192,8 @@ public class TileEntityMachineIndustrialTurbine extends TileEntityTurbineBase im public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setLong("lastPowerTarget", lastPowerTarget); + nbt.setLong("flywheel_energy", flywheel_energy); + nbt.setLong("maxPower", maxPower); nbt.setDouble("spin", spin); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineThresher.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineThresher.java index ffc71f2be..43d329614 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineThresher.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineThresher.java @@ -9,6 +9,7 @@ import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; +import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; import com.hbm.main.NTMSounds; @@ -85,6 +86,7 @@ public class TileEntityMachineThresher extends TileEntityLoadedBase implements I trySubscribe(tank.getTankType(), worldObj, xCoord + rot.offsetX, yCoord, zCoord + rot.offsetZ, rot); trySubscribe(tank.getTankType(), worldObj, xCoord - rot.offsetX, yCoord, zCoord - rot.offsetZ, rot.getOpposite()); + trySubscribe(tank.getTankType(), worldObj, xCoord, yCoord - 1, zCoord, Library.NEG_Y); } if(isOn && !isSuspended) { diff --git a/src/main/resources/assets/hbm/textures/models/machines/thresher.png b/src/main/resources/assets/hbm/textures/models/machines/thresher.png index a8eb43a0d62eb212207b49426e2540f3ab54d5f4..122d7ed734bd22e4a14c1389f452f292874b25bb 100644 GIT binary patch delta 2668 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 Date: Thu, 11 Jun 2026 22:14:13 +0200 Subject: [PATCH 007/107] i'm gonna brown --- .../ContainerPneumoStorageAccess.java | 177 +++++++++++++++--- .../container/ICustomPayloadReceiver.java | 8 + .../inventory/gui/GUIPneumoStorageAccess.java | 9 + .../java/com/hbm/packet/PacketDispatcher.java | 2 + .../ContainerCustomPayloadPacket.java | 52 +++++ 5 files changed, 219 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ICustomPayloadReceiver.java create mode 100644 src/main/java/com/hbm/packet/toclient/ContainerCustomPayloadPacket.java diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index 5cfefc1d0..7ea2babd7 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -5,24 +5,33 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import com.hbm.interfaces.NotableComments; import com.hbm.inventory.SlotNonRetarded; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.ContainerCustomPayloadPacket; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; -import com.hbm.util.ItemStackUtil; +import com.hbm.util.EnumUtil; import api.hbm.ntl.StackCache; import api.hbm.ntl.StackCache.CacheSlot; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; -public class ContainerPneumoStorageAccess extends Container { +@NotableComments // i long for the day when i never have to look at this fucking horseshit ever again +public class ContainerPneumoStorageAccess extends Container implements ICustomPayloadReceiver { protected TileEntityPneumoStorageAccess access; protected InventoryPneumoStorageAccess inventory; + public static final int GRID_SIZE = 6 * 8; public static final String STACK_SIZE_KEY = "PNEUMO_STACK_SIZE"; public ContainerPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { @@ -31,7 +40,7 @@ public class ContainerPneumoStorageAccess extends Container { for(int i = 0; i < 6; i++) { for(int j = 0; j < 8; j++) { - this.addSlotToContainer(new SlotNonRetarded(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); // TODO: add a new slot type that holds a long for the amount + this.addSlotToContainer(new SlotPneumo(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); } } @@ -57,16 +66,16 @@ public class ContainerPneumoStorageAccess extends Container { @Override public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { - if(index >= 0 && index < 6 * 8) { + if(index >= 0 && index < GRID_SIZE) { boolean client = player.worldObj.isRemote; - Slot slot = this.getSlot(index); + SlotPneumo slot = (SlotPneumo) this.getSlot(index); ItemStack held = player.inventory.getItemStack(); - if(held == null && slot.getHasStack() && slot.getStack().hasTagCompound()) { + if(held == null && slot.getHasStack()) { ItemStack stack = slot.getStack().copy(); if(button == 0) { - int toGrab = (int) Math.min(stack.getMaxStackSize(), stack.stackTagCompound.getLong(STACK_SIZE_KEY)); + int toGrab = (int) Math.min(stack.getMaxStackSize(), slot.amount); if(client) { stack.stackSize = toGrab; @@ -78,19 +87,142 @@ public class ContainerPneumoStorageAccess extends Container { player.inventory.setItemStack(stack); } } - - return slot.getStack().copy(); } + + return slot.getHasStack() ? slot.getStack().copy() : null; } return super.slotClick(index, button, mode, player); } + @Override + public void addCraftingToCrafters(ICrafting crafting) { + super.addCraftingToCrafters(crafting); + } + + /** Used only on the client side to set the contents of a slot after a sync */ + @Override + public void putStackInSlot(int index, ItemStack slot) { + this.getSlot(index).putStack(slot); + } + + public long[] previousStackSizes = new long[GRID_SIZE]; + + /** + * All syncing is done using the ICrafting interface (which only EntityPlayerMP implements), each single slot change is one entire fucking + * packet that is sent like a massive pile of pricks to each client. Who cares, right. Issue is, this interface only supports sending of + * ItemStacks and integer values with integer keys for the progress bars. We need longs which are indexed, so at least an extra byte along + * with that. After some fucking about I decided, well vanilla container code is complete fucking shit anyway, why bother with any of that? + * Instead, we just skip all the syncing for that and use our custom crap packet. Depending on whether the stack, the count, or both has changed, + * we send the requested data in a single packet. + */ + @Override + public void detectAndSendChanges() { + + // skip the first 6*8 slots, i.e. all the ones visible in the access grid + for(int i = GRID_SIZE; i < this.inventorySlots.size(); i++) { + ItemStack stack0 = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack stack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if(!ItemStack.areItemStacksEqual(stack1, stack0)) { + stack1 = stack0 == null ? null : stack0.copy(); + this.inventoryItemStacks.set(i, stack1); + + for(int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, stack1); + } + } + } + + // custom horseshit scum fuck + + NBTTagList list = new NBTTagList(); + + if(this.access.cache != null && !this.access.cache.hasExpired) for(int i = 0; i < GRID_SIZE; i++) { + PneumoMesageType msg = null; + SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(i); + ItemStack actualStack = slot.getStack(); + long cachedSize = slot.amount; + CacheSlot cacheSlot = actualStack != null ? this.access.cache.getSlotFromStack(actualStack) : null; + long actualSize = cacheSlot != null ? cacheSlot.stacksize : 0; + if(actualSize <= 0) actualStack = null; + ItemStack cachedStack = (ItemStack) this.inventoryItemStacks.get(i); + + if(!ItemStack.areItemStacksEqual(cachedStack, actualStack)) msg = PneumoMesageType.UPDATE_TYPE; + + if(cachedSize != actualSize || actualSize > 0 /* HACK: solve this by moving the listing change to the container class and writing the correct amounts on init */) { + if(msg == PneumoMesageType.UPDATE_TYPE) msg = PneumoMesageType.UPDATE_ALL; + if(msg == null) msg = PneumoMesageType.UPDATE_COUNT; + } + + if(msg != null) { + cachedStack = actualStack == null ? null : actualStack.copy(); + this.inventoryItemStacks.set(i, cachedStack); + slot.amount = actualSize; + + NBTTagCompound listEntry = new NBTTagCompound(); + listEntry.setByte(KEY_TYPE, (byte) msg.ordinal()); + listEntry.setByte(KEY_SLOT_INDEX, (byte) i); + if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_COUNT) { + listEntry.setLong(KEY_LONG_COUNT, actualSize); + } + if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_TYPE) if(actualStack != null) actualStack.writeToNBT(listEntry); + + list.appendTag(listEntry); + } + } + + if(list.tagCount() > 0) { + NBTTagCompound masterTag = new NBTTagCompound(); + masterTag.setTag("list", list); + for(Object o : this.crafters) { + if(o instanceof EntityPlayerMP) { + EntityPlayerMP playerMP = (EntityPlayerMP) o; + PacketDispatcher.wrapper.sendTo(new ContainerCustomPayloadPacket(playerMP.currentWindowId, masterTag), playerMP); + } + } + } + } + + public static final String KEY_TYPE = "t"; + public static final String KEY_SLOT_INDEX = "s"; + public static final String KEY_LONG_COUNT = "lc"; + public static enum PneumoMesageType { + UPDATE_COUNT, + UPDATE_TYPE, + UPDATE_ALL; + } + + @Override + public void acceptData(int windowId, NBTTagCompound data) { + if(windowId != this.windowId) return; + + NBTTagList list = data.getTagList("list", 10); + + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound listEntry = list.getCompoundTagAt(i); + PneumoMesageType msg = EnumUtil.grabEnumSafely(PneumoMesageType.class, listEntry.getByte(KEY_TYPE)); + int slotIndex = listEntry.getByte(KEY_SLOT_INDEX); + SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(slotIndex); + if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_COUNT) slot.amount = listEntry.getLong(KEY_LONG_COUNT); + if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_TYPE) slot.putStack(ItemStack.loadItemStackFromNBT(listEntry)); + } + } + @Override public ItemStack transferStackInSlot(EntityPlayer player, int index) { return null; } + public static class SlotPneumo extends SlotNonRetarded { + + public long amount; + + public SlotPneumo(IInventory inventory, int id, int x, int y) { + super(inventory, id, x, y); + } + } + /** This inventory instance only exists to prepare the contents of a StackCache in such a way that we can use it in a container. */ public static class InventoryPneumoStorageAccess implements IInventory { @@ -115,8 +247,6 @@ public class ContainerPneumoStorageAccess extends Container { CacheSlot cache = cacheSlots.get(i); if(cache.displayStack != null) { slots[i] = cache.displayStack.copy(); - ItemStackUtil.addTooltipToStack(slots[i], "x" + cache.stacksize, "in " + cache.monitors.size() + " stacks"); - slots[i].stackTagCompound.setLong(STACK_SIZE_KEY, cache.stacksize); // TODO instead of altering the stacks so we can't resolve anything anymore, hijack the progress bar system } } } @@ -125,19 +255,19 @@ public class ContainerPneumoStorageAccess extends Container { public static final Comparator SORT_BY_STACK_SIZE = new Comparator() { @Override public int compare(CacheSlot o1, CacheSlot o2) { - if(o1.stacksize > o2.stacksize) return 1; if(o1.stacksize < o2.stacksize) return -1; - if(o1.itemId < o2.itemId) return 1; if(o1.itemId > o2.itemId) return -1; - if(o1.meta < o2.meta) return 1; if(o1.meta > o2.meta) return -1; - if(o1.nbt == null && o2.nbt != null) return 1; if(o1.nbt != null && o2.nbt == null) return -1; + if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; + if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; + if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; + if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; return 0; } }; - @Override public int getSizeInventory() { return 6 * 9; } + @Override public int getSizeInventory() { return GRID_SIZE; } @Override public ItemStack getStackInSlot(int slot) { return slots[slot]; } @Override public int getInventoryStackLimit() { return 64; } - @Override public ItemStack decrStackSize(int slot, int amount) { return null; } + @Override public void setInventorySlotContents(int slot, ItemStack stack) { this.slots[slot] = stack; } @Override public ItemStack getStackInSlotOnClosing(int slot) { @@ -149,22 +279,11 @@ public class ContainerPneumoStorageAccess extends Container { return null; } - @Override - public void setInventorySlotContents(int slot, ItemStack stack) { - this.slots[slot] = stack; - } - @Override public String getInventoryName() { return "null"; } @Override public boolean hasCustomInventoryName() { return false; } @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return false; } - - @Override - public void markDirty() { - - } - + @Override public void markDirty() { } @Override public boolean isUseableByPlayer(EntityPlayer player) { return true; } - @Override public void openInventory() { } @Override public void closeInventory() { } } diff --git a/src/main/java/com/hbm/inventory/container/ICustomPayloadReceiver.java b/src/main/java/com/hbm/inventory/container/ICustomPayloadReceiver.java new file mode 100644 index 000000000..02067bf08 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ICustomPayloadReceiver.java @@ -0,0 +1,8 @@ +package com.hbm.inventory.container; + +import net.minecraft.nbt.NBTTagCompound; + +public interface ICustomPayloadReceiver { + + public void acceptData(int windowsId, NBTTagCompound data); +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index d86dd8f30..10c5334cb 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -6,6 +6,7 @@ import org.lwjgl.opengl.GL11; import static com.hbm.inventory.gui.element.GUIElements.*; import com.hbm.inventory.container.ContainerPneumoStorageAccess; +import com.hbm.inventory.container.ContainerPneumoStorageAccess.SlotPneumo; import com.hbm.inventory.gui.element.GUIElements; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; @@ -14,6 +15,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; @@ -34,6 +36,13 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { super.drawScreen(x, y, interp); + + Slot slot = this.getSlotAtPosition(x, y); + + if(slot instanceof SlotPneumo) { + SlotPneumo pneumo = (SlotPneumo) slot; + if(pneumo.getHasStack()) this.drawInfo(new String[] {"x" + pneumo.amount}, x, y - 15); + } } @Override diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 65ef19982..fac0df938 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -69,6 +69,8 @@ public class PacketDispatcher { wrapper.registerMessage(HeldItemNBTPacket.Handler.class, HeldItemNBTPacket.class, i++, Side.CLIENT); //Syncs muzzle flashes of SEDNA guns for clients from other entities/players wrapper.registerMessage(MuzzleFlashPacket.Handler.class, MuzzleFlashPacket.class, i++, Side.CLIENT); + //Sends custom container-bound payload from a server container to a client one + wrapper.registerMessage(ContainerCustomPayloadPacket.Handler.class, ContainerCustomPayloadPacket.class, i++, Side.CLIENT); } } diff --git a/src/main/java/com/hbm/packet/toclient/ContainerCustomPayloadPacket.java b/src/main/java/com/hbm/packet/toclient/ContainerCustomPayloadPacket.java new file mode 100644 index 000000000..d9ed25b6b --- /dev/null +++ b/src/main/java/com/hbm/packet/toclient/ContainerCustomPayloadPacket.java @@ -0,0 +1,52 @@ +package com.hbm.packet.toclient; + +import com.hbm.inventory.container.ICustomPayloadReceiver; +import com.hbm.main.MainRegistry; +import com.hbm.util.BufferUtil; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; + +public class ContainerCustomPayloadPacket implements IMessage { + + int windowId; + NBTTagCompound data; + + public ContainerCustomPayloadPacket() { } + + public ContainerCustomPayloadPacket(int windowId, NBTTagCompound data) { + this.windowId = windowId; + this.data = data; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.windowId = buf.readInt(); + this.data = BufferUtil.readNBT(buf); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(this.windowId); + BufferUtil.writeNBT(buf, this.data); + } + + public static class Handler implements IMessageHandler { + + @SideOnly(Side.CLIENT) @Override + public IMessage onMessage(ContainerCustomPayloadPacket m, MessageContext ctx) { + EntityPlayer player = MainRegistry.proxy.me(); + if(player.openContainer instanceof ICustomPayloadReceiver) { + ICustomPayloadReceiver cus = (ICustomPayloadReceiver) player.openContainer; + cus.acceptData(m.windowId, m.data); + } + return null; + } + } +} From 7d8e41fb8b080c9b7f5b1e7ac34456cc857753a2 Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Fri, 12 Jun 2026 17:08:52 +0300 Subject: [PATCH 008/107] Victor Omarov Fuck you --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index dbc9e5171..7cb42ebf1 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2776,7 +2776,7 @@ item.gun_minigun_lacunae.name=Миниган "Lacunae" item.gun_missile_launcher.name=Ракетная пусковая установка item.gun_mk108.name=Автоматический гранатомёт item.gun_n_i_4_n_i.name=Энергетический револьвер "N I 4 N I" -item.gun_pepperbox.name=Револьвер "Pepperbox" +item.gun_pepperbox.name=Многоствольный-пистолет "Pepperbox" item.gun_pa_melee.name=Силовая броня - Контроллер ближнего боя item.gun_pa_ranged.name=Силовая броня - Контроллер дальнего боя item.gun_panzerschreck.name=Гранатомёт "Panzerschreck" From a6733856977befb316527c7f67e9a30cf027e68b Mon Sep 17 00:00:00 2001 From: HbmMods Date: Fri, 12 Jun 2026 23:25:19 +0200 Subject: [PATCH 009/107] mh yis --- src/main/java/api/hbm/ntl/SlotMonitor.java | 3 - .../ContainerPneumoStorageAccess.java | 111 +++++++++++------- .../networkproviders/PneumaticNetwork.java | 11 +- 3 files changed, 77 insertions(+), 48 deletions(-) diff --git a/src/main/java/api/hbm/ntl/SlotMonitor.java b/src/main/java/api/hbm/ntl/SlotMonitor.java index 2422456be..63da74ef3 100644 --- a/src/main/java/api/hbm/ntl/SlotMonitor.java +++ b/src/main/java/api/hbm/ntl/SlotMonitor.java @@ -109,7 +109,6 @@ public class SlotMonitor { CacheSlot slot = iterator.next(); slot.removeMonitor(this); iterator.remove(); - System.out.println("Removing"); } // set updated traits @@ -129,10 +128,8 @@ public class SlotMonitor { if(pneumoNet != null) { for(StackCache cache : pneumoNet.accessors) { - System.out.println("Adding to cache..."); if(!cache.hasExpired && parent.isAvailableToCache(cache)) { cache.addToCache(this); - System.out.println("Added!"); } } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index 7ea2babd7..348e8617f 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -11,6 +11,7 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.ContainerCustomPayloadPacket; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; import com.hbm.util.EnumUtil; +import com.hbm.util.InventoryUtil; import api.hbm.ntl.StackCache; import api.hbm.ntl.StackCache.CacheSlot; @@ -54,9 +55,41 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa this.addSlotToContainer(new SlotNonRetarded(invPlayer, i, 8 + i * 18, 227)); } - inventory.updateListing(); + updateListing(); this.detectAndSendChanges(); } + + public void updateListing() { // DEMO + if(this.access.cache == null || this.access.cache.hasExpired) return; + StackCache cache = this.access.cache; + List cacheSlots = new ArrayList(cache.cacheSlots.size()); + cacheSlots.addAll(cache.cacheSlots.values()); + cacheSlots.removeIf(x -> { return x.stacksize <= 0; }); + Collections.sort(cacheSlots, SORT_BY_STACK_SIZE); + int size = cacheSlots.size(); + + for(int i = 0; i < inventory.slots.length; i++) { + if(i < size) { + CacheSlot cacheSlot = cacheSlots.get(i); + if(cacheSlot.displayStack != null) { + inventory.slots[i] = cacheSlot.displayStack.copy(); + } + } else { + inventory.slots[i] = null; + } + } + } + + public static final Comparator SORT_BY_STACK_SIZE = new Comparator() { + @Override + public int compare(CacheSlot o1, CacheSlot o2) { + if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; + if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; + if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; + if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; + return 0; + } + }; @Override public boolean canInteractWith(EntityPlayer player) { @@ -70,22 +103,44 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa boolean client = player.worldObj.isRemote; SlotPneumo slot = (SlotPneumo) this.getSlot(index); ItemStack held = player.inventory.getItemStack(); + + boolean standardClick = button == 0 && mode == 0; + boolean shiftClick = button == 0 && mode == 1; - if(held == null && slot.getHasStack()) { - ItemStack stack = slot.getStack().copy(); + if(slot.getHasStack()) { - if(button == 0) { - int toGrab = (int) Math.min(stack.getMaxStackSize(), slot.amount); + // left click, can't hold an item and provides a full stack to the held item + if(standardClick && held == null) { + ItemStack stack = slot.getStack().copy(); - if(client) { - stack.stackSize = toGrab; - player.inventory.setItemStack(stack); - } else { - if(this.access.cache == null || this.access.cache.hasExpired) return stack; - StackCache cache = this.access.cache; - stack.stackSize = (int) cache.consumeItemsAndReturnQuantity(stack, toGrab); // this can't work because the stack got altered with the description NBT..... - player.inventory.setItemStack(stack); + if(standardClick) { + int toGrab = (int) Math.min(stack.getMaxStackSize(), slot.amount); + + if(client) { + stack.stackSize = toGrab; + player.inventory.setItemStack(stack); + //slot.amount -= toGrab; + //if(slot.amount <= 0) slot.putStack(null); + } else { + if(this.access.cache == null || this.access.cache.hasExpired) return stack; + StackCache cache = this.access.cache; + stack.stackSize = (int) cache.consumeItemsAndReturnQuantity(stack, toGrab); // this can't work because the stack got altered with the description NBT..... + player.inventory.setItemStack(stack); + } } + + // shift click, works even if there's a held stack, serverside only and the nwe just sync + } else if(shiftClick && !client) { + ItemStack stack = slot.getStack().copy(); + if(this.access.cache == null || this.access.cache.hasExpired) return stack; + StackCache cache = this.access.cache; + int originalStacksize = (int) Math.min(stack.getMaxStackSize(), slot.amount); + stack.stackSize = originalStacksize; + ItemStack ret = InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, stack); + int remainder = ret == null ? 0 : ret.stackSize; + int itemsUsed = originalStacksize - remainder; + cache.consumeItemsAndReturnQuantity(stack, itemsUsed); + detectAndSendChanges(); } } @@ -118,6 +173,7 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa */ @Override public void detectAndSendChanges() { + this.updateListing(); // skip the first 6*8 slots, i.e. all the ones visible in the access grid for(int i = GRID_SIZE; i < this.inventorySlots.size(); i++) { @@ -233,35 +289,6 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa this.slots = new ItemStack[getSizeInventory()]; this.cache = access.cache; } - - public void updateListing() { // DEMO - if(this.cache == null) return; - List cacheSlots = new ArrayList(cache.cacheSlots.size()); - cacheSlots.addAll(cache.cacheSlots.values()); - cacheSlots.removeIf(x -> { return x.stacksize <= 0; }); - Collections.sort(cacheSlots, SORT_BY_STACK_SIZE); - int size = cacheSlots.size(); - - for(int i = 0; i < slots.length; i++) { - if(i < size) { - CacheSlot cache = cacheSlots.get(i); - if(cache.displayStack != null) { - slots[i] = cache.displayStack.copy(); - } - } - } - } - - public static final Comparator SORT_BY_STACK_SIZE = new Comparator() { - @Override - public int compare(CacheSlot o1, CacheSlot o2) { - if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; - if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; - if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; - if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; - return 0; - } - }; @Override public int getSizeInventory() { return GRID_SIZE; } @Override public ItemStack getStackInSlot(int slot) { return slots[slot]; } diff --git a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java index 00ac69f26..bbe0dc575 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java @@ -60,10 +60,15 @@ public class PneumaticNetwork extends NodeNet { super.joinNetworks(network); PneumaticNetwork net = (PneumaticNetwork) network; - for(StackCache cache : accessors) cache.dissolveCache(); + //for(StackCache cache : accessors) cache.dissolveCache(); - for(Object connector : net.accessors) this.accessors.add((StackCache) connector); - for(Object connector : net.storages) this.storages.add((ISlotMonitorProvider) connector); + for(Object acc : net.accessors) this.accessors.add((StackCache) acc); + + for(Object connector : net.storages) { + ISlotMonitorProvider monitor = (ISlotMonitorProvider) connector; + this.storages.add((ISlotMonitorProvider) connector); + for(Object acc : net.accessors) monitor.onNewCacheHasJoined((StackCache) acc, this); + } } public void addReceiver(IInventory inventory, ForgeDirection pipeDir, TileEntityPneumoTube endpoint) { From f4a509dd9d70a28b0c7220aea2207f1d8ac94dc5 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sat, 13 Jun 2026 19:02:04 +0200 Subject: [PATCH 010/107] gonna crucify notch for the container code --- .../api/hbm/ntl/ISlotMonitorProvider.java | 8 ++- src/main/java/api/hbm/ntl/StackCache.java | 42 ++++++++++- .../ContainerPneumoStorageAccess.java | 66 ++++++++++++++---- .../inventory/gui/GUIPneumoStorageAccess.java | 33 ++++++--- .../TileEntityPneumoStorageClutter.java | 28 ++++++-- .../hbm/textures/blocks/brick_light.png | Bin 368 -> 427 bytes .../blocks/pneumatic_storage_clutter.png | Bin 414 -> 329 bytes 7 files changed, 150 insertions(+), 27 deletions(-) diff --git a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java index 68e0e958b..8cbdf135b 100644 --- a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java +++ b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java @@ -15,7 +15,7 @@ public interface ISlotMonitorProvider { /** Returns an array of available slot monitors, which should ideally mirror the available slots of that container */ public SlotMonitor[] getMonitors(); - /** Returns the slot contents of that index, so that the monitors can detect changes */ + /** Returns the ORIGIANL ItemStack of that index, so that the monitors can detect changes */ public ItemStack getSlotAt(int index); /** Returns the amount of that slot at that index. Some storages may use int64 datatypes so we have to account for those too somehow, since ItemStacks cannot handle that. */ @@ -24,6 +24,12 @@ public interface ISlotMonitorProvider { /** Removes the given number of items from that slot, returns the amount left to remove if the stack was smaller than the supplied amount */ public long useUpItem(int index, long amount); + /** Adds the given number of items to that slot, returns the amount that couldn't be added due to stack limits */ + public long addItem(int index, long amount); + + /** Sets the slot contents, returns the number of items that couldn't be added */ + public long setupType(int index, ItemStack zeroStack, long amount); + /** Whether this storage unit is reachable by the access point */ public boolean isAvailableToCache(StackCache cache); diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index 1f853f4c7..11ffb61bc 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -57,11 +57,15 @@ public class StackCache { /** Uses up items and returns how many of the requested items could be removed, with no desyncs that number should always be equal to the supplied amount */ public long consumeItemsAndReturnQuantity(ItemStack stack, long amount) { - CacheSlot cache = getSlotFromStack(stack); + long stackIdentity = getStackIdentity(stack.getItem(), stack.getItemDamage(), stack.stackTagCompound); + CacheSlot cache = this.cacheSlots.get(stackIdentity); if(cache == null) return 0; long originalAmount = amount; for(SlotMonitor monitor : cache.monitors) { + ItemStack original = monitor.parent.getSlotAt(monitor.index); + long checkIdentity = getStackIdentity(original); + if(checkIdentity != stackIdentity) continue; amount = monitor.parent.useUpItem(monitor.index, amount); if(amount <= 0) break; } @@ -69,6 +73,33 @@ public class StackCache { return originalAmount - amount; } + /** Adds a stack to the system and returns the amount that did not fit */ + public long addItemsAndReturnQuantity(ItemStack stack, long amount) { + long stackIdentity = getStackIdentity(stack.getItem(), stack.getItemDamage(), stack.stackTagCompound); + CacheSlot cache = this.cacheSlots.get(stackIdentity); + + if(cache != null) for(SlotMonitor monitor : cache.monitors) { + ItemStack original = monitor.parent.getSlotAt(monitor.index); + long checkIdentity = getStackIdentity(original); + if(checkIdentity != stackIdentity) continue; + amount = monitor.parent.addItem(monitor.index, amount); + if(amount <= 0) break; + } + + if(amount > 0) { + CacheSlot nullCache = this.cacheSlots.get(getNullIdentity()); + if(nullCache != null) { // quite ironic, isn't it? + for(SlotMonitor monitor : nullCache.monitors) { + if(monitor.parent.getSlotAt(monitor.index) != null) continue; + amount = monitor.parent.setupType(monitor.index, stack, amount); + if(amount <= 0) break; + } + } + } + + return amount; + } + public void dissolveCache() { for(Entry cacheEntry : cacheSlots.entrySet()) { cacheEntry.getValue().destroy(); @@ -154,6 +185,15 @@ public class StackCache { } } + public static long getNullIdentity() { + return 0; //getStackIdentity(null, 0, null); + } + + public static long getStackIdentity(ItemStack stack) { + if(stack == null) return getNullIdentity(); + return getStackIdentity(stack.getItem(), stack.getItemDamage(), stack.stackTagCompound); + } + public static long getStackIdentity(Item item, int meta, NBTTagCompound nbt) { long identity = Item.getIdFromItem(item) * 27644437; identity += meta * 27644437; diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index 348e8617f..c4ebcd71c 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -98,41 +98,46 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa @Override public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + if(mode == 6) return null; + + boolean leftClick = button == 0 && mode == 0; + boolean rightClick = button == 1 && mode == 0; + boolean shiftClick = button == 0 && mode == 1; if(index >= 0 && index < GRID_SIZE) { boolean client = player.worldObj.isRemote; SlotPneumo slot = (SlotPneumo) this.getSlot(index); ItemStack held = player.inventory.getItemStack(); - - boolean standardClick = button == 0 && mode == 0; - boolean shiftClick = button == 0 && mode == 1; if(slot.getHasStack()) { // left click, can't hold an item and provides a full stack to the held item - if(standardClick && held == null) { + if(leftClick || rightClick) { ItemStack stack = slot.getStack().copy(); + + int alreadyHeld = held == null ? 0 : held.stackSize; + int capacity = stack.getMaxStackSize() - alreadyHeld; + if(rightClick && capacity > 1) capacity = 1; + int toGrab = (int) Math.min(capacity, slot.amount); - if(standardClick) { - int toGrab = (int) Math.min(stack.getMaxStackSize(), slot.amount); - + if(capacity > 0 && (held == null || StackCache.getStackIdentity(held) == StackCache.getStackIdentity(stack))) { if(client) { - stack.stackSize = toGrab; + stack.stackSize = toGrab + alreadyHeld; player.inventory.setItemStack(stack); - //slot.amount -= toGrab; - //if(slot.amount <= 0) slot.putStack(null); } else { - if(this.access.cache == null || this.access.cache.hasExpired) return stack; + if(this.access.cache == null || this.access.cache.hasExpired) return null; StackCache cache = this.access.cache; - stack.stackSize = (int) cache.consumeItemsAndReturnQuantity(stack, toGrab); // this can't work because the stack got altered with the description NBT..... + stack.stackSize = (int) cache.consumeItemsAndReturnQuantity(stack, toGrab) + alreadyHeld; player.inventory.setItemStack(stack); } + + return null; // for some reason we gotta terminate here and not below } // shift click, works even if there's a held stack, serverside only and the nwe just sync } else if(shiftClick && !client) { ItemStack stack = slot.getStack().copy(); - if(this.access.cache == null || this.access.cache.hasExpired) return stack; + if(this.access.cache == null || this.access.cache.hasExpired) return null; StackCache cache = this.access.cache; int originalStacksize = (int) Math.min(stack.getMaxStackSize(), slot.amount); stack.stackSize = originalStacksize; @@ -144,7 +149,37 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa } } + if(held != null) { + int toDeposit = rightClick ? 1 : held.stackSize; + player.inventory.getItemStack().stackSize -= toDeposit; + if(player.inventory.getItemStack().stackSize <= 0) player.inventory.setItemStack(null); + if(this.access.cache == null || this.access.cache.hasExpired) return null; + StackCache cache = this.access.cache; + int remainder = (int) cache.addItemsAndReturnQuantity(held, toDeposit); + if(remainder > 0) { + ItemStack copy = held.copy(); + copy.stackSize = remainder; + InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, copy); + } + } + return slot.getHasStack() ? slot.getStack().copy() : null; + + // shift clicking an item from the player inv to the storage + } else if(index >= GRID_SIZE && index < this.inventorySlots.size()) { + + Slot slot = this.getSlot(index); + + if(shiftClick && slot.getHasStack()) { + ItemStack stack = slot.getStack().copy(); + if(this.access.cache == null || this.access.cache.hasExpired) return null; + StackCache cache = this.access.cache; + int remainder = (int) cache.addItemsAndReturnQuantity(stack, stack.stackSize); + slot.decrStackSize(stack.stackSize - remainder); + if(remainder <= 0) slot.putStack(null); + slot.onSlotChanged(); + detectAndSendChanges(); + } } return super.slotClick(index, button, mode, player); @@ -277,6 +312,11 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa public SlotPneumo(IInventory inventory, int id, int x, int y) { super(inventory, id, x, y); } + + @Override + public boolean canTakeStack(EntityPlayer player) { + return true; + } } /** This inventory instance only exists to prepare the contents of a StackCache in such a way that we can use it in a container. */ diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index 10c5334cb..d0594da9f 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -3,6 +3,7 @@ package com.hbm.inventory.gui; import java.util.List; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; import static com.hbm.inventory.gui.element.GUIElements.*; import com.hbm.inventory.container.ContainerPneumoStorageAccess; @@ -10,9 +11,11 @@ import com.hbm.inventory.container.ContainerPneumoStorageAccess.SlotPneumo; import com.hbm.inventory.gui.element.GUIElements; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; +import com.hbm.util.BobMathUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Slot; @@ -36,13 +39,6 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { super.drawScreen(x, y, interp); - - Slot slot = this.getSlotAtPosition(x, y); - - if(slot instanceof SlotPneumo) { - SlotPneumo pneumo = (SlotPneumo) slot; - if(pneumo.getHasStack()) this.drawInfo(new String[] {"x" + pneumo.amount}, x, y - 15); - } } @Override @@ -52,10 +48,31 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = "container.pneumpStorageAccess"; + String name = "container.pneumoStorageAccess"; this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + + GL11.glPushMatrix(); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + double scale = 0.5D; + GL11.glScaled(scale, scale, 1); + + for(Object o : this.inventorySlots.inventorySlots) { + if(!(o instanceof SlotPneumo)) continue; + SlotPneumo pneumoSlot = (SlotPneumo) o; + if(pneumoSlot.getHasStack()) { + String label = BobMathUtil.getShortNumber(pneumoSlot.amount); + int ix = (int) ((pneumoSlot.xDisplayPosition + 16) / scale) - this.fontRendererObj.getStringWidth(label); + int iy = (int) ((pneumoSlot.yDisplayPosition + 16) / scale) - this.fontRendererObj.FONT_HEIGHT; + this.fontRendererObj.drawStringWithShadow(label, ix, iy, -1); + } + } + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glPopMatrix(); + + RenderHelper.enableGUIStandardItemLighting(); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java index 5e5c96b84..9ee354b43 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java @@ -144,13 +144,33 @@ public class TileEntityPneumoStorageClutter extends TileEntityMachineBase implem @Override public long useUpItem(int index, long amount) { - - if(slots[index] != null) { - int toRemove = (int) Math.min(slots[index].stackSize, amount); + ItemStack stack = slots[index]; + if(stack != null) { + int toRemove = (int) Math.min(stack.stackSize, amount); this.decrStackSize(index, toRemove); return amount - toRemove; } - return amount; } + + @Override + public long addItem(int index, long amount) { + ItemStack stack = slots[index]; + if(stack != null) { + int capacity = Math.min(stack.getMaxStackSize(), this.getInventoryStackLimit()); + int toAdd = (int) Math.min(amount, capacity - stack.stackSize); + stack.stackSize += toAdd; + return amount - toAdd; + } + return amount; + } + + @Override + public long setupType(int index, ItemStack zeroStack, long amount) { + int capacity = Math.min(zeroStack.getMaxStackSize(), this.getInventoryStackLimit()); + int finalSize = (int) Math.min(amount, capacity); + slots[index] = zeroStack.copy(); + slots[index].stackSize = finalSize; + return amount - finalSize; + } } diff --git a/src/main/resources/assets/hbm/textures/blocks/brick_light.png b/src/main/resources/assets/hbm/textures/blocks/brick_light.png index 083fa23d57eb9ee9307bbc8b7573a48d5cc66226..2ef48619b4334cdb19114ea438b8e8c3490cce5c 100644 GIT binary patch delta 401 zcmV;C0dD^A0;>a%B!2{RLP=Bz2nYy#2xN!=00Cl2L_t(IjjfYSPQpMKh95{v`H?hE zqzgg@;k%h>zppd%KJT>f ze1EfhOTOuJhdez#Ft{2qpN?sWGisvGd^)Dn9WtMe`TW{4xPKb4N+#4qAAn*|Z_;Y_ zkaCGptKB2hC6E8N{)?>Ir;WjnNfjErx?#MLU9;4<@SqK}kIdsLOBh$v>cnAycd6r-{fzZ{}; z2@%DXSrI^Gsek?0FNbzCp3QT$;@kH|r!z3Q0=&GYInQq1K#qy2d0I(=dh^hd0$6|5 zdh>Vg#H^Jh(pF=t)FDR5(wKk}(PbK@3Iba^7NlOAlbRtsvNFWoM@sun@Feuo3Jm zJ;=xl{2_b>wRmJQKby%9Tb`F?y&f0!J&pCSnnfh%US~z=(tn`5rfr4CZBtLXAuh@9 z=P}@3It^%~Zy*||NG~X-!8e^)_Um~SOptTObsEMFJX^2JR{6 zPEU^=fcwom=}u|TmM9Au#><{vm!|)FNZqG=Pu}4WcYh$6uxz%}eTNy&B<{^~ zDmXx%=K!cGB7&-3$?h!e?bYe4Z;B)RC*SrC$s=T6?=W&8BHlWLkwDD0&xJRGXB>?( z@J)WoLCAI}#N<@&Xv>P)bVw$M$ldVVeY3YDn{4s>x2MXo*^>75F8Swc721XFv0c!> kGMV8VB?Fkf{TCx}0r?%(GNfr6{d2uy<< zv&u-;KIPLZ?;*`jXL$Ri)}On{!0e%&LuZoM&14S z>hbpG%{FCocWmFN-C}_8cwFP+>v$72$H#W)$Peo=dhQtQhMg+Gbh6sPd^o9gd$(bJ z)W_%;Kgc22)f#oHT-e8SGCm((e)|jMd4Iv-Gz8M^27q*#{}`9erOUh_@D2L3Z Date: Sun, 14 Jun 2026 20:16:23 -0400 Subject: [PATCH 011/107] cargo door addition --- src/main/java/com/hbm/blocks/ModBlocks.java | 9 +- .../java/com/hbm/main/ResourceManager.java | 8 +- .../render/item/ItemRenderLibraryDoors.java | 35 +- .../tileentity/door/RenderCargoDoor.java | 55 + .../java/com/hbm/tileentity/DoorDecl.java | 50 + .../hbm/models/pheodoors/cargo_door.obj | 5741 +++++++++++++++++ .../textures/models/pheodoors/cargo_door.png | Bin 0 -> 6851 bytes 7 files changed, 5882 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/hbm/render/tileentity/door/RenderCargoDoor.java create mode 100644 src/main/resources/assets/hbm/models/pheodoors/cargo_door.obj create mode 100644 src/main/resources/assets/hbm/textures/models/pheodoors/cargo_door.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f038a84ed..5dd1c775e 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -578,7 +578,7 @@ public class ModBlocks { public static Block seal_hatch; public static Block cargo_elevator; - + public static Block vault_door; public static Block blast_door; public static Block sliding_blast_door; @@ -595,6 +595,7 @@ public class ModBlocks { public static Block round_airlock_door; public static Block sliding_seal_door; public static Block water_door; + public static Block cargo_door; public static Block door_metal; public static Block door_office; @@ -2019,7 +2020,7 @@ public class ModBlocks { seal_hatch = new BlockHatch(Material.iron).setBlockName("seal_hatch").setHardness(Float.POSITIVE_INFINITY).setResistance(Float.POSITIVE_INFINITY).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":seal_hatch_3"); cargo_elevator = new BlockCargoElevator().setBlockName("cargo_elevator").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + vault_door = new BlockDoorGeneric(Material.iron, DoorDecl.VAULT_DOOR).setBlockName("vault_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":concrete"); blast_door = new BlastDoor(Material.iron).setBlockName("blast_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":blast_door"); @@ -2035,6 +2036,7 @@ public class ModBlocks { round_airlock_door = new BlockDoorGeneric(Material.iron, DoorDecl.ROUND_AIRLOCK_DOOR).setBlockName("round_airlock_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); sliding_seal_door = new BlockDoorGeneric(Material.iron, DoorDecl.SLIDING_SEAL_DOOR).setBlockName("sliding_seal_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); water_door = new BlockDoorGeneric(Material.iron, DoorDecl.WATER_DOOR).setBlockName("water_door").setHardness(5.0F).setResistance(50.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + cargo_door = new BlockDoorGeneric(Material.iron, DoorDecl.CARGO_DOOR).setBlockName("cargo_door").setHardness(20.0F).setResistance(2_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); door_metal = new BlockModDoor(Material.iron).setBlockName("door_metal").setHardness(5.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":door_metal"); door_office = new BlockModDoor(Material.iron).setBlockName("door_office").setHardness(10.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":door_office"); @@ -2943,7 +2945,7 @@ public class ModBlocks { //Hooh GameRegistry.registerBlock(cargo_elevator, cargo_elevator.getUnlocalizedName()); - + //Vault Door GameRegistry.registerBlock(vault_door, vault_door.getUnlocalizedName()); GameRegistry.registerBlock(blast_door, blast_door.getUnlocalizedName()); @@ -2965,6 +2967,7 @@ public class ModBlocks { GameRegistry.registerBlock(round_airlock_door, round_airlock_door.getUnlocalizedName()); GameRegistry.registerBlock(sliding_seal_door, sliding_seal_door.getUnlocalizedName()); GameRegistry.registerBlock(water_door, water_door.getUnlocalizedName()); + GameRegistry.registerBlock(cargo_door, cargo_door.getUnlocalizedName()); //Crates register(crate_iron, ItemBlockStorageCrate.class); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 8347de40f..b85cced9d 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -362,13 +362,15 @@ public class ResourceManager { public static final ResourceLocation pheo_label_106 = new ResourceLocation(RefStrings.MODID, "textures/models/pheodoors/vault/label_106.png"); public static final ResourceLocation pheo_label_111 = new ResourceLocation(RefStrings.MODID, "textures/models/pheodoors/vault/label_111.png"); public static IModelCustomNamed pheo_vault_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/pheodoors/vault_door.obj")).asVBO(); + public static IModelCustomNamed pheo_cargo_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/pheodoors/cargo_door.obj")).asVBO(); + public static final ResourceLocation pheo_cargo_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/pheodoors/cargo_door.png"); //Doors public static final ResourceLocation silo_hatch_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch.png"); public static IModelCustomNamed silo_hatch = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch.obj")).asVBO(); public static final ResourceLocation silo_hatch_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch_large.png"); public static IModelCustomNamed silo_hatch_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch_large.obj")).asVBO(); - + //Vending Machine public static final IModelCustom vending_machine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/vending_machine.obj")).noSmooth().asVBO(); @@ -784,7 +786,7 @@ public class ResourceManager { //Elevator public static final ResourceLocation cargo_elevator_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/elevator.png"); - + //Vault Door public static final ResourceLocation vault_cog_tex = new ResourceLocation(RefStrings.MODID, "textures/models/vault_cog.png"); public static final ResourceLocation vault_frame_tex = new ResourceLocation(RefStrings.MODID, "textures/models/vault_frame.png"); @@ -859,7 +861,7 @@ public class ResourceManager { //Pipes public static final ResourceLocation pipe_anchor_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pipe_anchor.png"); public static final ResourceLocation fluid_pump_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/fluid_diode.png"); - + //Barrels public static ResourceLocation barrel_plastic_tex = new ResourceLocation(RefStrings.MODID, "textures/blocks/barrel_plastic.png"); public static ResourceLocation barrel_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/blocks/barrel_steel.png"); diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibraryDoors.java b/src/main/java/com/hbm/render/item/ItemRenderLibraryDoors.java index cbb097cd7..e64949316 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibraryDoors.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibraryDoors.java @@ -33,7 +33,7 @@ public class ItemRenderLibraryDoors { ResourceLocation doorTex = ResourceManager.pheo_vault_door_3; ResourceLocation labelTex = ResourceManager.pheo_label_101; - + switch(index) { case 1: labelTex = ResourceManager.pheo_label_87; break; case 2: labelTex = ResourceManager.pheo_label_106; break; @@ -42,14 +42,14 @@ public class ItemRenderLibraryDoors { case 5: doorTex = ResourceManager.pheo_vault_door_s; labelTex = ResourceManager.pheo_label_2; break; case 6: doorTex = ResourceManager.pheo_vault_door_s; labelTex = ResourceManager.pheo_label_99; break; } - + bindTexture(doorTex); ResourceManager.pheo_vault_door.renderPart("Door"); bindTexture(labelTex); ResourceManager.pheo_vault_door.renderPart("Label"); } }); - + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.secure_access_door), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -3.75, 0); @@ -63,7 +63,7 @@ public class ItemRenderLibraryDoors { GL11.glShadeModel(GL11.GL_FLAT); } }); - + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.fire_door), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -3, 0); @@ -77,7 +77,7 @@ public class ItemRenderLibraryDoors { GL11.glShadeModel(GL11.GL_FLAT); } }); - + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.sliding_blast_door), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -2.75, 0); @@ -104,7 +104,7 @@ public class ItemRenderLibraryDoors { GL11.glShadeModel(GL11.GL_FLAT); } }); - + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.water_door), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -4, 0); @@ -118,7 +118,7 @@ public class ItemRenderLibraryDoors { GL11.glShadeModel(GL11.GL_FLAT); } }); - + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.silo_hatch), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -2, 0); @@ -137,7 +137,7 @@ public class ItemRenderLibraryDoors { GL11.glShadeModel(GL11.GL_FLAT); } }); - + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.silo_hatch_large), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -2, 0); @@ -157,7 +157,7 @@ public class ItemRenderLibraryDoors { GL11.glShadeModel(GL11.GL_FLAT); } }); - + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.qe_containment), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -3.5, 0); @@ -170,7 +170,7 @@ public class ItemRenderLibraryDoors { GL11.glShadeModel(GL11.GL_FLAT); } }); - + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.qe_sliding_door), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -3, 0); @@ -221,6 +221,21 @@ public class ItemRenderLibraryDoors { bindTexture(ResourceManager.blast_door_slider_tex); ResourceManager.blast_door_slider.renderAll(); bindTexture(ResourceManager.blast_door_block_tex); ResourceManager.blast_door_block.renderAll(); }}); + ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.cargo_door), new ItemRenderBase(){ + public void renderInventory() { + GL11.glTranslated(0, -3.75, 0); + GL11.glScaled(2.4, 2.4, 2.4); + } + public void renderCommon() { + bindTexture(ResourceManager.pheo_cargo_door_tex); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glTranslated(0, 1, 0); + ResourceManager.pheo_cargo_door.renderPart("Frame"); + ResourceManager.pheo_cargo_door.renderPart("DoorTop"); + ResourceManager.pheo_cargo_door.renderPart("DoorBot"); + GL11.glShadeModel(GL11.GL_FLAT); + } + }); } private static void bindTexture(ResourceLocation res) { diff --git a/src/main/java/com/hbm/render/tileentity/door/RenderCargoDoor.java b/src/main/java/com/hbm/render/tileentity/door/RenderCargoDoor.java new file mode 100644 index 000000000..dfc25ec6e --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/door/RenderCargoDoor.java @@ -0,0 +1,55 @@ +package com.hbm.render.tileentity.door; + +import java.nio.DoubleBuffer; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; +import com.hbm.tileentity.DoorDecl; +import com.hbm.tileentity.TileEntityDoorGeneric; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.MathHelper; + +public class RenderCargoDoor implements IRenderDoors { + + public static final RenderCargoDoor INSTANCE = new RenderCargoDoor(); + + @Override + public void render(TileEntityDoorGeneric door, DoubleBuffer buf) { + + Minecraft.getMinecraft().getTextureManager().bindTexture(DoorDecl.CARGO_DOOR.getSkinFromIndex(door.getSkinIndex())); + + double botMove = 0; + double topMove = 0; + + if (door.state == door.STATE_OPEN) { + botMove = 2.0; + topMove = 1.0; + } + + if (door.currentAnimation != null) { + double botProgress = MathHelper.clamp_double(IRenderDoors.getRelevantTransformation("BOT", door.currentAnimation)[1], 0, 1); + double topProgress = MathHelper.clamp_double(IRenderDoors.getRelevantTransformation("TOP", door.currentAnimation)[1], 0, 1); + botMove = botProgress * 2.0; + topMove = topProgress * 1.0; + } + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0, 0); + + ResourceManager.pheo_cargo_door.renderPart("Frame"); + + GL11.glPushMatrix(); + GL11.glTranslated(0, topMove, 0); + ResourceManager.pheo_cargo_door.renderPart("DoorTop"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0, botMove, 0); + ResourceManager.pheo_cargo_door.renderPart("DoorBot"); + GL11.glPopMatrix(); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index 606fa5e54..e9b62b3fb 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -641,6 +641,56 @@ public abstract class DoorDecl { }; + public static final DoorDecl CARGO_DOOR = new DoorDecl() { + + @Override public String getCloseSoundLoop() { return "hbm:door.garage_move"; } + @Override public String getCloseSoundEnd() { return "hbm:door.garage_stop"; } + @Override public String getOpenSoundEnd() { return "hbm:door.garage_stop"; } + @Override public String getOpenSoundLoop() { return "hbm:door.garage_move"; } + @Override public float getSoundVolume() { return 2; } + + @Override + public IRenderDoors getSEDNARenderer() { + return RenderCargoDoor.INSTANCE; + } + + @Override + public BusAnimation getBusAnimation(byte state, byte skinIndex) { + int half = this.timeToOpen() * 25; + if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation() + .addBus("BOT", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 1, 0, half * 2)) + .addBus("TOP", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 0, 0, half).addPos(0, 1, 0, half)); + if(state == TileEntityDoorGeneric.STATE_CLOSING) return new BusAnimation() + .addBus("BOT", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 0, 0, half * 2)) + .addBus("TOP", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 1, 0, half).addPos(0, 0, 0, half)); + return null; + } + + @Override public int timeToOpen() { return 120; } + + @Override public int[][] getDoorOpenRanges() { return new int[][] { { -1, -1, 0, 3, 3, 1 } }; } + @Override public int[] getDimensions() { return new int[] { 2, 0, 0, 0, 1, 1 }; } + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { + if(!open) return AxisAlignedBB.getBoundingBox(0, 0, 0.375, 1, 1, 0.625); + if(y > 1) return AxisAlignedBB.getBoundingBox(0, 0.25, 0.375, 1, 1, 0.625); + else if(y == 0) return AxisAlignedBB.getBoundingBox(0, 0, 0.375, 1, forCollision ? 0 : 0.125, 0.625); + return super.getBlockBound(x, y, z, open, forCollision); + } + + public ResourceLocation[] skins; + + @Override + public ResourceLocation[] getSEDNASkins() { + if(skins == null) skins = new ResourceLocation[] { + ResourceManager.pheo_cargo_door_tex + }; + return skins; + } + + @Override public int getSkinCount() { return 1; } + }; // TODO: bash drillgon to death for making this method like that, and for fucking up the documentation, like genuinely what the fuck is this /** Format: x, y, z, tangent amount 1 (how long the door would be if it moved up), tangent amount 2 (door places blocks in this direction), axis (0-x, diff --git a/src/main/resources/assets/hbm/models/pheodoors/cargo_door.obj b/src/main/resources/assets/hbm/models/pheodoors/cargo_door.obj new file mode 100644 index 000000000..2f82cd0a4 --- /dev/null +++ b/src/main/resources/assets/hbm/models/pheodoors/cargo_door.obj @@ -0,0 +1,5741 @@ +# Made in Blockbench 5.0.7 +mtllib cargo_door.mtl + +o Frame +v 0.1875 0.0625 1.5 +v -0.1875 0.0625 -1.5 +v -0.1875 0.0625 1.5 +v -0.25 0 1.5 +v -0.25 0 -1.5 +v 0.25 0 1.5 +v 0.25 0 -1.5 +v 0.1875 2.9375 1.5 +v 0.125 2.9375 -1.5 +v 0.1875 2.9375 -1.5 +v -0.1875 2.9375 -1.5 +v -0.125 2.9375 1.5 +v -0.1875 2.9375 1.5 +v 0.25 3 1.5 +v -0.25 3 -1.5 +v -0.125 3 1.5 +v -0.125 3 -1.5 +v 0.25 3 -1.5 +v 0.125 3 1.5 +v -0.25 3 1.5 +v 0.125 2.9375 1.5 +v -0.125 2.9375 -1.5 +v 0.125 3 -1.5 +v 0.1875 0.0625 -1.5 +vt 0.1171875 0.625 +vt 0.0703125 1 +vt 0.0703125 0.625 +vt 0.171875 0.953125 +vt 0.546875 0.9420765625 +vt 0.546875 0.953125 +vt 0 0.625 +vt 0.0625 1 +vt 0 1 +vt 0.546875 0.9186390625 +vt 0.171875 0.9296875 +vt 0.171875 0.9186390625 +vt 0.859375 0.375 +vt 0.9140625 0.3828125 +vt 0.8671875 0.3828125 +vt 0.9140625 0.3203125 +vt 0.859375 0.3125 +vt 0.921875 0.3125 +vt 0.1796875 0.90625 +vt 0.171875 0.53125 +vt 0.1796875 0.53125 +vt 0.1875 0.53125 +vt 0.1953125 0.90625 +vt 0.1875 0.90625 +vt 0.546875 0.984375 +vt 0.171875 0.99542421875 +vt 0.171875 0.984375 +vt 0.125 1 +vt 0.140625 0.625 +vt 0.140625 1 +vt 0.1640625 1 +vt 0.1484375 0.625 +vt 0.1640625 0.625 +vt 0.171875 0.97198671875 +vt 0.546875 0.9609375 +vt 0.546875 0.97198671875 +vt 0.0703125 0.140625 +vt 0.078125 0.1484375 +vt 0.0625 0.1484375 +vt 0.09375 0.140625 +vt 0.0859375 0.1484375 +vt 0.0859375 0.140625 +vt 0.1796875 0.140625 +vt 0.171875 0.1484375 +vt 0.171875 0.140625 +vt 0.875 0.3046875 +vt 0.8671875 0.296875 +vt 0.875 0.296875 +vt 0.578125 0.8984375 +vt 0.203125 0.90625 +vt 0.203125 0.8984375 +vt 0.578125 0.8828125 +vt 0.203125 0.890625 +vt 0.203125 0.8828125 +vt 0.1171875 0.625 +vt 0.1171875 1 +vt 0.0703125 1 +vt 0.171875 0.953125 +vt 0.171875 0.9420765625 +vt 0.546875 0.9420765625 +vt 0 0.625 +vt 0.0625 0.625 +vt 0.0625 1 +vt 0.546875 0.9186390625 +vt 0.546875 0.9296875 +vt 0.171875 0.9296875 +vt 0.859375 0.375 +vt 0.921875 0.375 +vt 0.9140625 0.3828125 +vt 0.9140625 0.3203125 +vt 0.8671875 0.3203125 +vt 0.859375 0.3125 +vt 0.1796875 0.90625 +vt 0.171875 0.90625 +vt 0.171875 0.53125 +vt 0.1875 0.53125 +vt 0.1953125 0.53125 +vt 0.1953125 0.90625 +vt 0.546875 0.984375 +vt 0.546875 0.99542421875 +vt 0.171875 0.99542421875 +vt 0.125 1 +vt 0.125 0.625 +vt 0.140625 0.625 +vt 0.1640625 1 +vt 0.1484375 1 +vt 0.1484375 0.625 +vt 0.171875 0.97198671875 +vt 0.171875 0.9609375 +vt 0.546875 0.9609375 +vt 0.0703125 0.140625 +vt 0.078125 0.140625 +vt 0.078125 0.1484375 +vt 0.09375 0.140625 +vt 0.1015625 0.1484375 +vt 0.0859375 0.1484375 +vt 0.1796875 0.140625 +vt 0.1875 0.1484375 +vt 0.171875 0.1484375 +vt 0.875 0.3046875 +vt 0.859375 0.3046875 +vt 0.8671875 0.296875 +vt 0.578125 0.8984375 +vt 0.578125 0.90625 +vt 0.203125 0.90625 +vt 0.578125 0.8828125 +vt 0.578125 0.890625 +vt 0.203125 0.890625 +vn 0 1 0 +vn -0.7071067811865476 0.7071067811865476 0 +vn 0 -1 0 +vn 0.7071067811865476 0.7071067811865476 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 -1 0 +vn 0.7071067811865476 -0.7071067811865476 0 +vn 0 1 0 +vn 0 1 0 +vn -0.7071067811865476 -0.7071067811865476 0 +vn 0 0 1 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn -0.7071067811865476 0.7071067811865476 0 +vn 0 -1 0 +vn 0.7071067811865476 0.7071067811865476 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 -1 0 +vn 0.7071067811865476 -0.7071067811865476 0 +vn 0 1 0 +vn 0 1 0 +vn -0.7071067811865476 -0.7071067811865476 0 +vn 0 0 1 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +usemtl m_5f175e4e-a6a7-9193-e88f-70334c8bfde8 +f 1/1/1 2/2/1 3/3/1 +f 2/4/2 4/5/2 3/6/2 +f 5/7/3 6/8/3 4/9/3 +f 7/10/4 1/11/4 6/12/4 +f 4/13/5 1/14/5 3/15/5 +f 2/16/6 7/17/6 5/18/6 +f 8/19/7 9/20/7 10/21/7 +f 11/22/8 12/23/8 13/24/8 +f 10/25/9 14/26/9 8/27/9 +f 15/28/10 16/29/10 17/30/10 +f 18/31/11 19/32/11 14/33/11 +f 15/34/12 13/35/12 20/36/12 +f 13/37/13 16/38/13 20/39/13 +f 8/40/14 19/41/14 21/42/14 +f 11/43/15 17/44/15 22/45/15 +f 23/46/16 10/47/16 9/48/16 +f 22/49/17 16/50/17 12/51/17 +f 21/52/18 23/53/18 9/54/18 +f 1/55/19 24/56/19 2/57/19 +f 2/58/20 5/59/20 4/60/20 +f 5/61/21 7/62/21 6/63/21 +f 7/64/22 24/65/22 1/66/22 +f 4/67/23 6/68/23 1/69/23 +f 2/70/24 24/71/24 7/72/24 +f 8/73/25 21/74/25 9/75/25 +f 11/76/26 22/77/26 12/78/26 +f 10/79/27 18/80/27 14/81/27 +f 15/82/28 20/83/28 16/84/28 +f 18/85/29 23/86/29 19/87/29 +f 15/88/30 11/89/30 13/90/30 +f 13/91/31 12/92/31 16/93/31 +f 8/94/32 14/95/32 19/96/32 +f 11/97/33 15/98/33 17/99/33 +f 23/100/34 18/101/34 10/102/34 +f 22/103/35 17/104/35 16/105/35 +f 21/106/36 19/107/36 23/108/36 +o DoorTop +v 0 2.625 1.4375 +v 0 1.5625 0.5 +v -0.0625 1.5625 1.4375 +v 0 1.5625 1.4375 +v -0.0625 1.5625 0.5 +v -0.0625 1.4375 1.4375 +v 0 1.4375 0.5 +v 0 1.4375 1.4375 +v -0.0625 1.4375 0.5 +v 0 1.5625 -0.4375 +v -0.0625 1.5625 0.4375 +v 0 1.5625 0.4375 +v -0.0625 1.5625 -0.4375 +v -0.0625 1.4375 0.4375 +v -0.0625 1.4375 -0.4375 +v 0 1.4375 0.4375 +v 0 1.4375 -0.4375 +v 0 2.9375 -1.5 +v -0.125 2.9375 -1.4375 +v 0 2.9375 -1.4375 +v -0.125 2.9375 -1.5 +v -0.125 1.4375 -1.4375 +v -0.125 1.4375 -1.5 +v 0 1.4375 -1.4375 +v 0 1.59375 -1.5 +v 0 2.9375 1.4375 +v -0.125 2.9375 1.5 +v 0 2.9375 1.5 +v -0.125 2.9375 1.4375 +v -0.125 1.4375 1.5 +v -0.125 1.4375 1.4375 +v 0 1.4375 1.5 +v 0 1.59375 1.4375 +v 0 2.9375 0.4375 +v -0.125 2.9375 0.5 +v 0 2.9375 0.5 +v -0.125 2.9375 0.4375 +v -0.125 1.4375 0.5 +v -0.125 1.4375 0.4375 +v 0 1.4375 0.5 +v 0 1.59375 0.4375 +v 0 2.9375 -0.5 +v -0.125 2.9375 -0.4375 +v 0 2.9375 -0.4375 +v -0.125 2.9375 -0.5 +v -0.125 1.4375 -0.4375 +v -0.125 1.4375 -0.5 +v 0 1.4375 -0.4375 +v 0 1.59375 -0.5 +v 0 2.9375 0.5 +v -0.0625 2.9375 1.4375 +v 0 2.9375 1.4375 +v -0.0625 2.9375 0.5 +v -0.0625 2.875 1.4375 +v 0 2.875 0.5 +v 0 2.875 1.4375 +v -0.0625 2.875 0.5 +v 0 2.8125 0.5 +v -0.0625 2.8125 1.4375 +v 0 2.8125 1.4375 +v -0.0625 2.8125 0.5 +v -0.0625 2.75 1.4375 +v 0 2.75 0.5 +v 0 2.75 1.4375 +v -0.0625 2.75 0.5 +v 0 2.6875 0.5 +v -0.0625 2.6875 1.4375 +v 0 2.6875 1.4375 +v -0.0625 2.6875 0.5 +v -0.0625 2.625 1.4375 +v 0 2.625 0.5 +v -0.0625 2.625 0.5 +v 0 2.5625 0.5 +v -0.0625 2.5625 1.4375 +v 0 2.5625 1.4375 +v -0.0625 2.5625 0.5 +v -0.0625 2.5 1.4375 +v 0 2.5 0.5 +v 0 2.5 1.4375 +v -0.0625 2.5 0.5 +v 0 2.4375 0.5 +v -0.0625 2.4375 1.4375 +v 0 2.4375 1.4375 +v -0.0625 2.4375 0.5 +v -0.0625 2.375 1.4375 +v 0 2.375 0.5 +v 0 2.375 1.4375 +v -0.0625 2.375 0.5 +v 0 2.3125 0.5 +v -0.0625 2.3125 1.4375 +v 0 2.3125 1.4375 +v -0.0625 2.3125 0.5 +v -0.0625 2.25 1.4375 +v 0 2.25 0.5 +v 0 2.25 1.4375 +v -0.0625 2.25 0.5 +v 0 2.1875 0.5 +v -0.0625 2.1875 1.4375 +v 0 2.1875 1.4375 +v -0.0625 2.1875 0.5 +v -0.0625 2.125 1.4375 +v 0 2.125 0.5 +v 0 2.125 1.4375 +v -0.0625 2.125 0.5 +v 0 2.0625 0.5 +v -0.0625 2.0625 1.4375 +v 0 2.0625 1.4375 +v -0.0625 2.0625 0.5 +v -0.0625 2 1.4375 +v 0 2 0.5 +v 0 2 1.4375 +v -0.0625 2 0.5 +v 0 1.9375 0.5 +v -0.0625 1.9375 1.4375 +v 0 1.9375 1.4375 +v -0.0625 1.9375 0.5 +v -0.0625 1.875 1.4375 +v 0 1.875 0.5 +v 0 1.875 1.4375 +v -0.0625 1.875 0.5 +v 0 1.8125 0.5 +v -0.0625 1.8125 1.4375 +v 0 1.8125 1.4375 +v -0.0625 1.8125 0.5 +v -0.0625 1.75 1.4375 +v 0 1.75 0.5 +v 0 1.75 1.4375 +v -0.0625 1.75 0.5 +v 0 1.6875 0.5 +v -0.0625 1.6875 1.4375 +v 0 1.6875 1.4375 +v -0.0625 1.6875 0.5 +v -0.0625 1.625 1.4375 +v 0 1.625 0.5 +v 0 1.625 1.4375 +v -0.0625 1.625 0.5 +v 0 1.6875 -0.4375 +v -0.0625 1.6875 0.4375 +v 0 1.6875 0.4375 +v -0.0625 1.6875 -0.4375 +v -0.0625 1.625 0.4375 +v -0.0625 1.625 -0.4375 +v 0 1.625 0.4375 +v 0 1.625 -0.4375 +v 0 1.8125 -0.4375 +v -0.0625 1.8125 0.4375 +v 0 1.8125 0.4375 +v -0.0625 1.8125 -0.4375 +v -0.0625 1.75 0.4375 +v -0.0625 1.75 -0.4375 +v 0 1.75 0.4375 +v 0 1.75 -0.4375 +v 0 1.9375 -0.4375 +v -0.0625 1.9375 0.4375 +v 0 1.9375 0.4375 +v -0.0625 1.9375 -0.4375 +v -0.0625 1.875 0.4375 +v -0.0625 1.875 -0.4375 +v 0 1.875 0.4375 +v 0 1.875 -0.4375 +v 0 2.0625 -0.4375 +v -0.0625 2.0625 0.4375 +v 0 2.0625 0.4375 +v -0.0625 2.0625 -0.4375 +v -0.0625 2 0.4375 +v -0.0625 2 -0.4375 +v 0 2 0.4375 +v 0 2 -0.4375 +v 0 2.1875 -0.4375 +v -0.0625 2.1875 0.4375 +v 0 2.1875 0.4375 +v -0.0625 2.1875 -0.4375 +v -0.0625 2.125 0.4375 +v -0.0625 2.125 -0.4375 +v 0 2.125 0.4375 +v 0 2.125 -0.4375 +v 0 2.3125 -0.4375 +v -0.0625 2.3125 0.4375 +v 0 2.3125 0.4375 +v -0.0625 2.3125 -0.4375 +v -0.0625 2.25 0.4375 +v -0.0625 2.25 -0.4375 +v 0 2.25 0.4375 +v 0 2.25 -0.4375 +v 0 2.4375 -0.4375 +v -0.0625 2.4375 0.4375 +v 0 2.4375 0.4375 +v -0.0625 2.4375 -0.4375 +v -0.0625 2.375 0.4375 +v -0.0625 2.375 -0.4375 +v 0 2.375 0.4375 +v 0 2.375 -0.4375 +v 0 2.5625 -0.4375 +v -0.0625 2.5625 0.4375 +v 0 2.5625 0.4375 +v -0.0625 2.5625 -0.4375 +v -0.0625 2.5 0.4375 +v -0.0625 2.5 -0.4375 +v 0 2.5 0.4375 +v 0 2.5 -0.4375 +v 0 2.6875 -0.4375 +v -0.0625 2.6875 0.4375 +v 0 2.6875 0.4375 +v -0.0625 2.6875 -0.4375 +v -0.0625 2.625 0.4375 +v -0.0625 2.625 -0.4375 +v 0 2.625 0.4375 +v 0 2.625 -0.4375 +v 0 2.8125 -0.4375 +v -0.0625 2.8125 0.4375 +v 0 2.8125 0.4375 +v -0.0625 2.8125 -0.4375 +v -0.0625 2.75 0.4375 +v -0.0625 2.75 -0.4375 +v 0 2.75 0.4375 +v 0 2.75 -0.4375 +v 0 2.9375 -0.4375 +v -0.0625 2.9375 0.4375 +v 0 2.9375 0.4375 +v -0.0625 2.9375 -0.4375 +v -0.0625 2.875 0.4375 +v -0.0625 2.875 -0.4375 +v 0 2.875 0.4375 +v 0 2.875 -0.4375 +v 0 2.9375 -1.4375 +v -0.0625 2.9375 -0.5 +v 0 2.9375 -0.5 +v -0.0625 2.9375 -1.4375 +v -0.0625 2.875 -0.5 +v 0 2.875 -1.4375 +v 0 2.875 -0.5 +v -0.0625 2.875 -1.4375 +v 0 2.8125 -1.4375 +v -0.0625 2.8125 -0.5 +v 0 2.8125 -0.5 +v -0.0625 2.8125 -1.4375 +v -0.0625 2.75 -0.5 +v 0 2.75 -1.4375 +v 0 2.75 -0.5 +v -0.0625 2.75 -1.4375 +v 0 2.6875 -1.4375 +v -0.0625 2.6875 -0.5 +v 0 2.6875 -0.5 +v -0.0625 2.6875 -1.4375 +v -0.0625 2.625 -0.5 +v 0 2.625 -1.4375 +v 0 2.625 -0.5 +v -0.0625 2.625 -1.4375 +v 0 2.5625 -1.4375 +v -0.0625 2.5625 -0.5 +v 0 2.5625 -0.5 +v -0.0625 2.5625 -1.4375 +v -0.0625 2.5 -0.5 +v 0 2.5 -1.4375 +v 0 2.5 -0.5 +v -0.0625 2.5 -1.4375 +v 0 2.4375 -1.4375 +v -0.0625 2.4375 -0.5 +v 0 2.4375 -0.5 +v -0.0625 2.4375 -1.4375 +v -0.0625 2.375 -0.5 +v 0 2.375 -1.4375 +v 0 2.375 -0.5 +v -0.0625 2.375 -1.4375 +v 0 2.3125 -1.4375 +v -0.0625 2.3125 -0.5 +v 0 2.3125 -0.5 +v -0.0625 2.3125 -1.4375 +v -0.0625 2.25 -0.5 +v 0 2.25 -1.4375 +v 0 2.25 -0.5 +v -0.0625 2.25 -1.4375 +v 0 2.1875 -1.4375 +v -0.0625 2.1875 -0.5 +v 0 2.1875 -0.5 +v -0.0625 2.1875 -1.4375 +v -0.0625 2.125 -0.5 +v 0 2.125 -1.4375 +v 0 2.125 -0.5 +v -0.0625 2.125 -1.4375 +v 0 2.0625 -1.4375 +v -0.0625 2.0625 -0.5 +v 0 2.0625 -0.5 +v -0.0625 2.0625 -1.4375 +v -0.0625 2 -0.5 +v 0 2 -1.4375 +v 0 2 -0.5 +v -0.0625 2 -1.4375 +v 0 1.9375 -1.4375 +v -0.0625 1.9375 -0.5 +v 0 1.9375 -0.5 +v -0.0625 1.9375 -1.4375 +v -0.0625 1.875 -0.5 +v 0 1.875 -1.4375 +v 0 1.875 -0.5 +v -0.0625 1.875 -1.4375 +v 0 1.8125 -1.4375 +v -0.0625 1.8125 -0.5 +v 0 1.8125 -0.5 +v -0.0625 1.8125 -1.4375 +v -0.0625 1.75 -0.5 +v 0 1.75 -1.4375 +v 0 1.75 -0.5 +v -0.0625 1.75 -1.4375 +v 0 1.6875 -1.4375 +v -0.0625 1.6875 -0.5 +v 0 1.6875 -0.5 +v -0.0625 1.6875 -1.4375 +v -0.0625 1.625 -0.5 +v 0 1.625 -1.4375 +v 0 1.625 -0.5 +v -0.0625 1.625 -1.4375 +v 0 1.5625 -1.4375 +v -0.0625 1.5625 -0.5 +v 0 1.5625 -0.5 +v -0.0625 1.5625 -1.4375 +v -0.0625 1.4375 -0.5 +v 0 1.4375 -1.4375 +v 0 1.4375 -0.5 +v -0.0625 1.4375 -1.4375 +v 0 1.4375 -1.5 +v 0 1.4375 1.4375 +v 0 1.4375 0.4375 +v 0 1.4375 -0.5 +vt 0.4765625 0.6171875 +vt 0.46875 0.5 +vt 0.4765625 0.5 +vt 0 0.6171875 +vt 0.1171875 0.6015625 +vt 0.1171875 0.6171875 +vt 0.171875 0.5234375 +vt 0.1796875 0.40625 +vt 0.1796875 0.5234375 +vt 0.5078125 0.859375 +vt 0.390625 0.875 +vt 0.390625 0.859375 +vt 0.109375 0.1484375 +vt 0.1171875 0.1328125 +vt 0.1171875 0.1484375 +vt 0.8671875 0.2890625 +vt 0.859375 0.2734375 +vt 0.8671875 0.2734375 +vt 0.7578125 0.2578125 +vt 0.75 0.1484375 +vt 0.7578125 0.1484375 +vt 0.390625 0.7109375 +vt 0.5 0.6953125 +vt 0.5 0.7109375 +vt 0.46875 0.1328125 +vt 0.4765625 0.2421875 +vt 0.46875 0.2421875 +vt 0.5 0.671875 +vt 0.390625 0.6875 +vt 0.390625 0.671875 +vt 0.75 0.125 +vt 0.7578125 0.140625 +vt 0.75 0.140625 +vt 0.7734375 0.140625 +vt 0.765625 0.125 +vt 0.7734375 0.125 +vt 0.875 0.2265625 +vt 0.859375 0.21875 +vt 0.875 0.21875 +vt 0.125 0.6171875 +vt 0.1328125 0.4296875 +vt 0.1328125 0.6171875 +vt 0.859375 0.203125 +vt 0.875 0.2109375 +vt 0.859375 0.2109375 +vt 0.1484375 0.44921875 +vt 0.1484375 0.6171875 +vt 0.140625 0.6171875 +vt 0.203125 0.875 +vt 0.21875 0.6875 +vt 0.21875 0.875 +vt 0.2421875 0.875 +vt 0.2265625 0.875 +vt 0.2265625 0.70703125 +vt 0.875 0.1953125 +vt 0.859375 0.1875 +vt 0.875 0.1875 +vt 0.15625 0.6171875 +vt 0.1640625 0.4296875 +vt 0.1640625 0.6171875 +vt 0.859375 0.171875 +vt 0.875 0.1796875 +vt 0.859375 0.1796875 +vt 0.3984375 0.44921875 +vt 0.3984375 0.6171875 +vt 0.390625 0.6171875 +vt 0.25 0.875 +vt 0.265625 0.6875 +vt 0.265625 0.875 +vt 0.2890625 0.875 +vt 0.2734375 0.875 +vt 0.2734375 0.70703125 +vt 0.875 0.1640625 +vt 0.859375 0.15625 +vt 0.875 0.15625 +vt 0 0.59375 +vt 0.0078125 0.40625 +vt 0.0078125 0.59375 +vt 0.859375 0.140625 +vt 0.875 0.1484375 +vt 0.859375 0.1484375 +vt 0.0234375 0.42578125 +vt 0.0234375 0.59375 +vt 0.015625 0.59375 +vt 0.296875 0.875 +vt 0.3125 0.6875 +vt 0.3125 0.875 +vt 0.3359375 0.875 +vt 0.3203125 0.875 +vt 0.3203125 0.70703125 +vt 0.078125 0.1328125 +vt 0.0625 0.125 +vt 0.078125 0.125 +vt 0.03125 0.59375 +vt 0.0390625 0.40625 +vt 0.0390625 0.59375 +vt 0.0859375 0.125 +vt 0.1015625 0.1328125 +vt 0.0859375 0.1328125 +vt 0.0546875 0.42578125 +vt 0.0546875 0.59375 +vt 0.046875 0.59375 +vt 0.203125 0.6796875 +vt 0.21875 0.4921875 +vt 0.21875 0.6796875 +vt 0.2421875 0.6796875 +vt 0.2265625 0.6796875 +vt 0.2265625 0.51171875 +vt 0.1953125 0.5234375 +vt 0.1875 0.40625 +vt 0.1953125 0.40625 +vt 0.484375 0.6171875 +vt 0.6015625 0.609375 +vt 0.6015625 0.6171875 +vt 0.484375 0.6015625 +vt 0.4921875 0.484375 +vt 0.4921875 0.6015625 +vt 0.6171875 0.59375 +vt 0.5 0.6015625 +vt 0.5 0.59375 +vt 0.640625 0.1171875 +vt 0.6484375 0.125 +vt 0.640625 0.125 +vt 0.6640625 0.125 +vt 0.65625 0.1171875 +vt 0.6640625 0.1171875 +vt 0.5078125 0.5859375 +vt 0.5 0.46875 +vt 0.5078125 0.46875 +vt 0.5078125 0.7109375 +vt 0.625 0.703125 +vt 0.625 0.7109375 +vt 0.46875 0.4921875 +vt 0.4765625 0.375 +vt 0.4765625 0.4921875 +vt 0.625 0.6875 +vt 0.5078125 0.6953125 +vt 0.5078125 0.6875 +vt 0.875 0.28125 +vt 0.8828125 0.2890625 +vt 0.875 0.2890625 +vt 0.8828125 0.2734375 +vt 0.875 0.265625 +vt 0.8828125 0.265625 +vt 0.5234375 0.875 +vt 0.515625 0.7578125 +vt 0.5234375 0.7578125 +vt 0.5078125 0.6796875 +vt 0.625 0.671875 +vt 0.625 0.6796875 +vt 0.203125 0.484375 +vt 0.2109375 0.3671875 +vt 0.2109375 0.484375 +vt 0.625 0.65625 +vt 0.5078125 0.6640625 +vt 0.5078125 0.65625 +vt 0.0625 0.109375 +vt 0.0703125 0.1171875 +vt 0.0625 0.1171875 +vt 0.0859375 0.1171875 +vt 0.078125 0.109375 +vt 0.0859375 0.109375 +vt 0.2265625 0.484375 +vt 0.21875 0.3671875 +vt 0.2265625 0.3671875 +vt 0.5078125 0.6484375 +vt 0.625 0.640625 +vt 0.625 0.6484375 +vt 0.234375 0.484375 +vt 0.2421875 0.3671875 +vt 0.2421875 0.484375 +vt 0.625 0.625 +vt 0.5078125 0.6328125 +vt 0.5078125 0.625 +vt 0.09375 0.109375 +vt 0.1015625 0.1171875 +vt 0.09375 0.1171875 +vt 0.2109375 0.1171875 +vt 0.203125 0.109375 +vt 0.2109375 0.109375 +vt 0.2578125 0.484375 +vt 0.25 0.3671875 +vt 0.2578125 0.3671875 +vt 0.515625 0.75 +vt 0.6328125 0.7421875 +vt 0.6328125 0.75 +vt 0.265625 0.484375 +vt 0.2734375 0.3671875 +vt 0.2734375 0.484375 +vt 0.6328125 0.7265625 +vt 0.515625 0.734375 +vt 0.515625 0.7265625 +vt 0.21875 0.109375 +vt 0.2265625 0.1171875 +vt 0.21875 0.1171875 +vt 0.2421875 0.1171875 +vt 0.234375 0.109375 +vt 0.2421875 0.109375 +vt 0.2890625 0.484375 +vt 0.28125 0.3671875 +vt 0.2890625 0.3671875 +vt 0.515625 0.5859375 +vt 0.6328125 0.578125 +vt 0.6328125 0.5859375 +vt 0.296875 0.484375 +vt 0.3046875 0.3671875 +vt 0.3046875 0.484375 +vt 0.6328125 0.5625 +vt 0.515625 0.5703125 +vt 0.515625 0.5625 +vt 0.25 0.109375 +vt 0.2578125 0.1171875 +vt 0.25 0.1171875 +vt 0.890625 0.75 +vt 0.8828125 0.7421875 +vt 0.890625 0.7421875 +vt 0.3203125 0.484375 +vt 0.3125 0.3671875 +vt 0.3203125 0.3671875 +vt 0.515625 0.5546875 +vt 0.6328125 0.546875 +vt 0.6328125 0.5546875 +vt 0.328125 0.484375 +vt 0.3359375 0.3671875 +vt 0.3359375 0.484375 +vt 0.6328125 0.53125 +vt 0.515625 0.5390625 +vt 0.515625 0.53125 +vt 0.265625 0.109375 +vt 0.2734375 0.1171875 +vt 0.265625 0.1171875 +vt 0.890625 0.734375 +vt 0.8828125 0.7265625 +vt 0.890625 0.7265625 +vt 0.3515625 0.484375 +vt 0.34375 0.3671875 +vt 0.3515625 0.3671875 +vt 0.515625 0.5234375 +vt 0.6328125 0.515625 +vt 0.6328125 0.5234375 +vt 0.359375 0.484375 +vt 0.3671875 0.3671875 +vt 0.3671875 0.484375 +vt 0.6328125 0.5 +vt 0.515625 0.5078125 +vt 0.515625 0.5 +vt 0.28125 0.109375 +vt 0.2890625 0.1171875 +vt 0.28125 0.1171875 +vt 0.3046875 0.1171875 +vt 0.296875 0.109375 +vt 0.3046875 0.109375 +vt 0.3828125 0.484375 +vt 0.375 0.3671875 +vt 0.3828125 0.3671875 +vt 0.515625 0.4921875 +vt 0.6328125 0.484375 +vt 0.6328125 0.4921875 +vt 0.484375 0.4765625 +vt 0.4921875 0.359375 +vt 0.4921875 0.4765625 +vt 0.6328125 0.46875 +vt 0.515625 0.4765625 +vt 0.515625 0.46875 +vt 0.3125 0.109375 +vt 0.3203125 0.1171875 +vt 0.3125 0.1171875 +vt 0.3359375 0.1171875 +vt 0.328125 0.109375 +vt 0.3359375 0.109375 +vt 0.5390625 0.875 +vt 0.53125 0.7578125 +vt 0.5390625 0.7578125 +vt 0.5 0.4609375 +vt 0.6171875 0.453125 +vt 0.6171875 0.4609375 +vt 0.546875 0.875 +vt 0.5546875 0.7578125 +vt 0.5546875 0.875 +vt 0.671875 0.9921875 +vt 0.5546875 1 +vt 0.5546875 0.9921875 +vt 0.34375 0.109375 +vt 0.3515625 0.1171875 +vt 0.34375 0.1171875 +vt 0.3671875 0.1171875 +vt 0.359375 0.109375 +vt 0.3671875 0.109375 +vt 0.5078125 0.4453125 +vt 0.5 0.328125 +vt 0.5078125 0.328125 +vt 0.5546875 0.984375 +vt 0.671875 0.9765625 +vt 0.671875 0.984375 +vt 0.515625 0.4453125 +vt 0.5234375 0.328125 +vt 0.5234375 0.4453125 +vt 0.671875 0.9609375 +vt 0.5546875 0.96875 +vt 0.5546875 0.9609375 +vt 0.375 0.109375 +vt 0.3828125 0.1171875 +vt 0.375 0.1171875 +vt 0.890625 0.59375 +vt 0.8828125 0.5859375 +vt 0.890625 0.5859375 +vt 0.6171875 0.2421875 +vt 0.609375 0.1328125 +vt 0.6171875 0.1328125 +vt 0.75 0.609375 +vt 0.859375 0.6015625 +vt 0.859375 0.609375 +vt 0.625 0.1328125 +vt 0.6328125 0.2421875 +vt 0.625 0.2421875 +vt 0.859375 0.453125 +vt 0.75 0.4609375 +vt 0.75 0.453125 +vt 0.8828125 0.5703125 +vt 0.890625 0.578125 +vt 0.8828125 0.578125 +vt 0.890625 0.5625 +vt 0.8828125 0.5546875 +vt 0.890625 0.5546875 +vt 0.6484375 0.2421875 +vt 0.640625 0.1328125 +vt 0.6484375 0.1328125 +vt 0.7578125 0.71875 +vt 0.8671875 0.7109375 +vt 0.8671875 0.71875 +vt 0.65625 0.1328125 +vt 0.6640625 0.2421875 +vt 0.65625 0.2421875 +vt 0.8671875 0.6953125 +vt 0.7578125 0.703125 +vt 0.7578125 0.6953125 +vt 0.8828125 0.5390625 +vt 0.890625 0.546875 +vt 0.8828125 0.546875 +vt 0.890625 0.53125 +vt 0.8828125 0.5234375 +vt 0.890625 0.5234375 +vt 0.2109375 0.234375 +vt 0.203125 0.125 +vt 0.2109375 0.125 +vt 0.7578125 0.6875 +vt 0.8671875 0.6796875 +vt 0.8671875 0.6875 +vt 0.21875 0.125 +vt 0.2265625 0.234375 +vt 0.21875 0.234375 +vt 0.8671875 0.6640625 +vt 0.7578125 0.671875 +vt 0.7578125 0.6640625 +vt 0.8828125 0.5078125 +vt 0.890625 0.515625 +vt 0.8828125 0.515625 +vt 0.890625 0.5 +vt 0.8828125 0.4921875 +vt 0.890625 0.4921875 +vt 0.2421875 0.234375 +vt 0.234375 0.125 +vt 0.2421875 0.125 +vt 0.7578125 0.65625 +vt 0.8671875 0.6484375 +vt 0.8671875 0.65625 +vt 0.25 0.125 +vt 0.2578125 0.234375 +vt 0.25 0.234375 +vt 0.8671875 0.6328125 +vt 0.7578125 0.640625 +vt 0.7578125 0.6328125 +vt 0.8828125 0.4765625 +vt 0.890625 0.484375 +vt 0.8828125 0.484375 +vt 0.890625 0.46875 +vt 0.8828125 0.4609375 +vt 0.890625 0.4609375 +vt 0.2734375 0.234375 +vt 0.265625 0.125 +vt 0.2734375 0.125 +vt 0.765625 0.75 +vt 0.875 0.7421875 +vt 0.875 0.75 +vt 0.28125 0.125 +vt 0.2890625 0.234375 +vt 0.28125 0.234375 +vt 0.875 0.7265625 +vt 0.765625 0.734375 +vt 0.765625 0.7265625 +vt 0.8828125 0.296875 +vt 0.890625 0.3046875 +vt 0.8828125 0.3046875 +vt 0.7578125 0.1171875 +vt 0.75 0.109375 +vt 0.7578125 0.109375 +vt 0.3046875 0.234375 +vt 0.296875 0.125 +vt 0.3046875 0.125 +vt 0.765625 0.59375 +vt 0.875 0.5859375 +vt 0.875 0.59375 +vt 0.3125 0.125 +vt 0.3203125 0.234375 +vt 0.3125 0.234375 +vt 0.875 0.5703125 +vt 0.765625 0.578125 +vt 0.765625 0.5703125 +vt 0.765625 0.109375 +vt 0.7734375 0.1171875 +vt 0.765625 0.1171875 +vt 0.890625 0.2265625 +vt 0.8828125 0.21875 +vt 0.890625 0.21875 +vt 0.3359375 0.234375 +vt 0.328125 0.125 +vt 0.3359375 0.125 +vt 0.765625 0.5625 +vt 0.875 0.5546875 +vt 0.875 0.5625 +vt 0.34375 0.125 +vt 0.3515625 0.234375 +vt 0.34375 0.234375 +vt 0.875 0.5390625 +vt 0.765625 0.546875 +vt 0.765625 0.5390625 +vt 0.8828125 0.203125 +vt 0.890625 0.2109375 +vt 0.8828125 0.2109375 +vt 0.890625 0.1953125 +vt 0.8828125 0.1875 +vt 0.890625 0.1875 +vt 0.3671875 0.234375 +vt 0.359375 0.125 +vt 0.3671875 0.125 +vt 0.765625 0.53125 +vt 0.875 0.5234375 +vt 0.875 0.53125 +vt 0.375 0.125 +vt 0.3828125 0.234375 +vt 0.375 0.234375 +vt 0.875 0.5078125 +vt 0.765625 0.515625 +vt 0.765625 0.5078125 +vt 0.8828125 0.171875 +vt 0.890625 0.1796875 +vt 0.8828125 0.1796875 +vt 0.890625 0.1640625 +vt 0.8828125 0.15625 +vt 0.890625 0.15625 +vt 0.7734375 0.2578125 +vt 0.765625 0.1484375 +vt 0.7734375 0.1484375 +vt 0.765625 0.5 +vt 0.875 0.4921875 +vt 0.875 0.5 +vt 0.484375 0.1171875 +vt 0.4921875 0.2265625 +vt 0.484375 0.2265625 +vt 0.875 0.4765625 +vt 0.765625 0.484375 +vt 0.765625 0.4765625 +vt 0.8828125 0.140625 +vt 0.890625 0.1484375 +vt 0.8828125 0.1484375 +vt 0.8671875 0.1171875 +vt 0.859375 0.109375 +vt 0.8671875 0.109375 +vt 0.6796875 0.2265625 +vt 0.671875 0.1171875 +vt 0.6796875 0.1171875 +vt 0.78125 0.2578125 +vt 0.890625 0.25 +vt 0.890625 0.2578125 +vt 0.6875 0.1171875 +vt 0.6953125 0.2265625 +vt 0.6875 0.2265625 +vt 0.890625 0.234375 +vt 0.78125 0.2421875 +vt 0.78125 0.234375 +vt 0.8828125 0.125 +vt 0.890625 0.1328125 +vt 0.8828125 0.1328125 +vt 0.8828125 0.1171875 +vt 0.875 0.109375 +vt 0.8828125 0.109375 +vt 0.7890625 0.2265625 +vt 0.78125 0.1171875 +vt 0.7890625 0.1171875 +vt 0.796875 0.3671875 +vt 0.90625 0.359375 +vt 0.90625 0.3671875 +vt 0.796875 0.1171875 +vt 0.8046875 0.2265625 +vt 0.796875 0.2265625 +vt 0.9140625 0.9921875 +vt 0.8046875 1 +vt 0.8046875 0.9921875 +vt 0.171875 0.1015625 +vt 0.1796875 0.109375 +vt 0.171875 0.109375 +vt 0.1953125 0.109375 +vt 0.1875 0.1015625 +vt 0.1953125 0.1015625 +vt 0.5390625 0.4453125 +vt 0.53125 0.328125 +vt 0.5390625 0.328125 +vt 0.5546875 0.953125 +vt 0.671875 0.9453125 +vt 0.671875 0.953125 +vt 0.546875 0.4453125 +vt 0.5546875 0.328125 +vt 0.5546875 0.4453125 +vt 0.671875 0.9296875 +vt 0.5546875 0.9375 +vt 0.5546875 0.9296875 +vt 0.890625 0.6015625 +vt 0.8984375 0.609375 +vt 0.890625 0.609375 +vt 0.4921875 0.109375 +vt 0.484375 0.1015625 +vt 0.4921875 0.1015625 +vt 0.5703125 0.875 +vt 0.5625 0.7578125 +vt 0.5703125 0.7578125 +vt 0.5546875 0.921875 +vt 0.671875 0.9140625 +vt 0.671875 0.921875 +vt 0.5625 0.4453125 +vt 0.5703125 0.328125 +vt 0.5703125 0.4453125 +vt 0.6953125 0.8671875 +vt 0.578125 0.875 +vt 0.578125 0.8671875 +vt 0.640625 0.1015625 +vt 0.6484375 0.109375 +vt 0.640625 0.109375 +vt 0.6640625 0.109375 +vt 0.65625 0.1015625 +vt 0.6640625 0.1015625 +vt 0.1328125 0.421875 +vt 0.125 0.3046875 +vt 0.1328125 0.3046875 +vt 0.578125 0.859375 +vt 0.6953125 0.8515625 +vt 0.6953125 0.859375 +vt 0.140625 0.421875 +vt 0.1484375 0.3046875 +vt 0.1484375 0.421875 +vt 0.6953125 0.8359375 +vt 0.578125 0.84375 +vt 0.578125 0.8359375 +vt 0.671875 0.1015625 +vt 0.6796875 0.109375 +vt 0.671875 0.109375 +vt 0.6953125 0.109375 +vt 0.6875 0.1015625 +vt 0.6953125 0.1015625 +vt 0.1640625 0.421875 +vt 0.15625 0.3046875 +vt 0.1640625 0.3046875 +vt 0.578125 0.828125 +vt 0.6953125 0.8203125 +vt 0.6953125 0.828125 +vt 0.390625 0.421875 +vt 0.3984375 0.3046875 +vt 0.3984375 0.421875 +vt 0.6953125 0.8046875 +vt 0.578125 0.8125 +vt 0.578125 0.8046875 +vt 0.890625 0.28125 +vt 0.8984375 0.2890625 +vt 0.890625 0.2890625 +vt 0.8984375 0.2734375 +vt 0.890625 0.265625 +vt 0.8984375 0.265625 +vt 0.4140625 0.421875 +vt 0.40625 0.3046875 +vt 0.4140625 0.3046875 +vt 0.578125 0.796875 +vt 0.6953125 0.7890625 +vt 0.6953125 0.796875 +vt 0.421875 0.421875 +vt 0.4296875 0.3046875 +vt 0.4296875 0.421875 +vt 0.6953125 0.7734375 +vt 0.578125 0.78125 +vt 0.578125 0.7734375 +vt 0.734375 0.1015625 +vt 0.7421875 0.109375 +vt 0.734375 0.109375 +vt 0.7890625 0.109375 +vt 0.78125 0.1015625 +vt 0.7890625 0.1015625 +vt 0.4453125 0.421875 +vt 0.4375 0.3046875 +vt 0.4453125 0.3046875 +vt 0.578125 0.765625 +vt 0.6953125 0.7578125 +vt 0.6953125 0.765625 +vt 0.453125 0.421875 +vt 0.4609375 0.3046875 +vt 0.4609375 0.421875 +vt 0.6953125 0.4375 +vt 0.578125 0.4453125 +vt 0.578125 0.4375 +vt 0.796875 0.1015625 +vt 0.8046875 0.109375 +vt 0.796875 0.109375 +vt 0.8203125 0.109375 +vt 0.8125 0.1015625 +vt 0.8203125 0.1015625 +vt 0.5859375 0.4296875 +vt 0.578125 0.3125 +vt 0.5859375 0.3125 +vt 0.5859375 0.90625 +vt 0.703125 0.8984375 +vt 0.703125 0.90625 +vt 0.59375 0.4296875 +vt 0.6015625 0.3125 +vt 0.6015625 0.4296875 +vt 0.703125 0.8828125 +vt 0.5859375 0.890625 +vt 0.5859375 0.8828125 +vt 0.828125 0.1015625 +vt 0.8359375 0.109375 +vt 0.828125 0.109375 +vt 0.8515625 0.109375 +vt 0.84375 0.1015625 +vt 0.8515625 0.1015625 +vt 0.0078125 0.3984375 +vt 0 0.28125 +vt 0.0078125 0.28125 +vt 0.609375 0.6171875 +vt 0.7265625 0.609375 +vt 0.7265625 0.6171875 +vt 0.015625 0.3984375 +vt 0.0234375 0.28125 +vt 0.0234375 0.3984375 +vt 0.7265625 0.421875 +vt 0.609375 0.4296875 +vt 0.609375 0.421875 +vt 0.890625 0.109375 +vt 0.8984375 0.1171875 +vt 0.890625 0.1171875 +vt 0.0703125 0.1015625 +vt 0.0625 0.09375 +vt 0.0703125 0.09375 +vt 0.0390625 0.3984375 +vt 0.03125 0.28125 +vt 0.0390625 0.28125 +vt 0.609375 0.4140625 +vt 0.7265625 0.40625 +vt 0.7265625 0.4140625 +vt 0.046875 0.3984375 +vt 0.0546875 0.28125 +vt 0.0546875 0.3984375 +vt 0.7265625 0.390625 +vt 0.609375 0.3984375 +vt 0.609375 0.390625 +vt 0.078125 0.09375 +vt 0.0859375 0.1015625 +vt 0.078125 0.1015625 +vt 0.1015625 0.1015625 +vt 0.09375 0.09375 +vt 0.1015625 0.09375 +vt 0.0703125 0.3984375 +vt 0.0625 0.28125 +vt 0.0703125 0.28125 +vt 0.609375 0.3828125 +vt 0.7265625 0.375 +vt 0.7265625 0.3828125 +vt 0.078125 0.3984375 +vt 0.0859375 0.28125 +vt 0.0859375 0.3984375 +vt 0.7421875 0.59375 +vt 0.625 0.6015625 +vt 0.625 0.59375 +vt 0.109375 0.09375 +vt 0.1171875 0.1015625 +vt 0.109375 0.1015625 +vt 0.2109375 0.1015625 +vt 0.203125 0.09375 +vt 0.2109375 0.09375 +vt 0.1015625 0.3984375 +vt 0.09375 0.28125 +vt 0.1015625 0.28125 +vt 0.625 0.4609375 +vt 0.7421875 0.453125 +vt 0.7421875 0.4609375 +vt 0.109375 0.3984375 +vt 0.1171875 0.28125 +vt 0.1171875 0.3984375 +vt 0.75 0.7109375 +vt 0.6328125 0.71875 +vt 0.6328125 0.7109375 +vt 0.21875 0.09375 +vt 0.2265625 0.1015625 +vt 0.21875 0.1015625 +vt 0.2421875 0.1015625 +vt 0.234375 0.09375 +vt 0.2421875 0.09375 +vt 0.1796875 0.3984375 +vt 0.171875 0.28125 +vt 0.1796875 0.28125 +vt 0.390625 0.8515625 +vt 0.5078125 0.8359375 +vt 0.5078125 0.8515625 +vt 0.1875 0.3984375 +vt 0.1953125 0.28125 +vt 0.1953125 0.3984375 +vt 0.5078125 0.8125 +vt 0.390625 0.828125 +vt 0.390625 0.8125 +vt 0.171875 0.1328125 +vt 0.1796875 0.1171875 +vt 0.1796875 0.1328125 +vt 0.1953125 0.1328125 +vt 0.1875 0.1171875 +vt 0.1953125 0.1171875 +vt 0.4765625 0.6171875 +vt 0.46875 0.6171875 +vt 0.46875 0.5 +vt 0 0.6171875 +vt 0 0.6015625 +vt 0.1171875 0.6015625 +vt 0.171875 0.5234375 +vt 0.171875 0.40625 +vt 0.1796875 0.40625 +vt 0.5078125 0.859375 +vt 0.5078125 0.875 +vt 0.390625 0.875 +vt 0.109375 0.1484375 +vt 0.109375 0.1328125 +vt 0.1171875 0.1328125 +vt 0.8671875 0.2890625 +vt 0.859375 0.2890625 +vt 0.859375 0.2734375 +vt 0.7578125 0.2578125 +vt 0.75 0.2578125 +vt 0.75 0.1484375 +vt 0.390625 0.7109375 +vt 0.390625 0.6953125 +vt 0.5 0.6953125 +vt 0.46875 0.1328125 +vt 0.4765625 0.1328125 +vt 0.4765625 0.2421875 +vt 0.5 0.671875 +vt 0.5 0.6875 +vt 0.390625 0.6875 +vt 0.75 0.125 +vt 0.7578125 0.125 +vt 0.7578125 0.140625 +vt 0.7734375 0.140625 +vt 0.765625 0.140625 +vt 0.765625 0.125 +vt 0.875 0.2265625 +vt 0.859375 0.2265625 +vt 0.859375 0.21875 +vt 0.125 0.6171875 +vt 0.125 0.4296875 +vt 0.1328125 0.4296875 +vt 0.859375 0.203125 +vt 0.875 0.203125 +vt 0.875 0.2109375 +vt 0.140625 0.6171875 +vt 0.140625 0.4296875 +vt 0.1484375 0.44921875 +vt 0.140625 0.4296875 +vt 0.1484375 0.4296875 +vt 0.1484375 0.44921875 +vt 0.203125 0.875 +vt 0.203125 0.6875 +vt 0.21875 0.6875 +vt 0.2265625 0.6875 +vt 0.2421875 0.6875 +vt 0.2265625 0.70703125 +vt 0.2421875 0.6875 +vt 0.2421875 0.875 +vt 0.2265625 0.70703125 +vt 0.875 0.1953125 +vt 0.859375 0.1953125 +vt 0.859375 0.1875 +vt 0.15625 0.6171875 +vt 0.15625 0.4296875 +vt 0.1640625 0.4296875 +vt 0.859375 0.171875 +vt 0.875 0.171875 +vt 0.875 0.1796875 +vt 0.390625 0.6171875 +vt 0.390625 0.4296875 +vt 0.3984375 0.44921875 +vt 0.390625 0.4296875 +vt 0.3984375 0.4296875 +vt 0.3984375 0.44921875 +vt 0.25 0.875 +vt 0.25 0.6875 +vt 0.265625 0.6875 +vt 0.2734375 0.6875 +vt 0.2890625 0.6875 +vt 0.2734375 0.70703125 +vt 0.2890625 0.6875 +vt 0.2890625 0.875 +vt 0.2734375 0.70703125 +vt 0.875 0.1640625 +vt 0.859375 0.1640625 +vt 0.859375 0.15625 +vt 0 0.59375 +vt 0 0.40625 +vt 0.0078125 0.40625 +vt 0.859375 0.140625 +vt 0.875 0.140625 +vt 0.875 0.1484375 +vt 0.015625 0.59375 +vt 0.015625 0.40625 +vt 0.0234375 0.42578125 +vt 0.015625 0.40625 +vt 0.0234375 0.40625 +vt 0.0234375 0.42578125 +vt 0.296875 0.875 +vt 0.296875 0.6875 +vt 0.3125 0.6875 +vt 0.3203125 0.6875 +vt 0.3359375 0.6875 +vt 0.3203125 0.70703125 +vt 0.3359375 0.6875 +vt 0.3359375 0.875 +vt 0.3203125 0.70703125 +vt 0.078125 0.1328125 +vt 0.0625 0.1328125 +vt 0.0625 0.125 +vt 0.03125 0.59375 +vt 0.03125 0.40625 +vt 0.0390625 0.40625 +vt 0.0859375 0.125 +vt 0.1015625 0.125 +vt 0.1015625 0.1328125 +vt 0.046875 0.59375 +vt 0.046875 0.40625 +vt 0.0546875 0.42578125 +vt 0.046875 0.40625 +vt 0.0546875 0.40625 +vt 0.0546875 0.42578125 +vt 0.203125 0.6796875 +vt 0.203125 0.4921875 +vt 0.21875 0.4921875 +vt 0.2265625 0.4921875 +vt 0.2421875 0.4921875 +vt 0.2265625 0.51171875 +vt 0.2421875 0.4921875 +vt 0.2421875 0.6796875 +vt 0.2265625 0.51171875 +vt 0.1953125 0.5234375 +vt 0.1875 0.5234375 +vt 0.1875 0.40625 +vt 0.484375 0.6171875 +vt 0.484375 0.609375 +vt 0.6015625 0.609375 +vt 0.484375 0.6015625 +vt 0.484375 0.484375 +vt 0.4921875 0.484375 +vt 0.6171875 0.59375 +vt 0.6171875 0.6015625 +vt 0.5 0.6015625 +vt 0.640625 0.1171875 +vt 0.6484375 0.1171875 +vt 0.6484375 0.125 +vt 0.6640625 0.125 +vt 0.65625 0.125 +vt 0.65625 0.1171875 +vt 0.5078125 0.5859375 +vt 0.5 0.5859375 +vt 0.5 0.46875 +vt 0.5078125 0.7109375 +vt 0.5078125 0.703125 +vt 0.625 0.703125 +vt 0.46875 0.4921875 +vt 0.46875 0.375 +vt 0.4765625 0.375 +vt 0.625 0.6875 +vt 0.625 0.6953125 +vt 0.5078125 0.6953125 +vt 0.875 0.28125 +vt 0.8828125 0.28125 +vt 0.8828125 0.2890625 +vt 0.8828125 0.2734375 +vt 0.875 0.2734375 +vt 0.875 0.265625 +vt 0.5234375 0.875 +vt 0.515625 0.875 +vt 0.515625 0.7578125 +vt 0.5078125 0.6796875 +vt 0.5078125 0.671875 +vt 0.625 0.671875 +vt 0.203125 0.484375 +vt 0.203125 0.3671875 +vt 0.2109375 0.3671875 +vt 0.625 0.65625 +vt 0.625 0.6640625 +vt 0.5078125 0.6640625 +vt 0.0625 0.109375 +vt 0.0703125 0.109375 +vt 0.0703125 0.1171875 +vt 0.0859375 0.1171875 +vt 0.078125 0.1171875 +vt 0.078125 0.109375 +vt 0.2265625 0.484375 +vt 0.21875 0.484375 +vt 0.21875 0.3671875 +vt 0.5078125 0.6484375 +vt 0.5078125 0.640625 +vt 0.625 0.640625 +vt 0.234375 0.484375 +vt 0.234375 0.3671875 +vt 0.2421875 0.3671875 +vt 0.625 0.625 +vt 0.625 0.6328125 +vt 0.5078125 0.6328125 +vt 0.09375 0.109375 +vt 0.1015625 0.109375 +vt 0.1015625 0.1171875 +vt 0.2109375 0.1171875 +vt 0.203125 0.1171875 +vt 0.203125 0.109375 +vt 0.2578125 0.484375 +vt 0.25 0.484375 +vt 0.25 0.3671875 +vt 0.515625 0.75 +vt 0.515625 0.7421875 +vt 0.6328125 0.7421875 +vt 0.265625 0.484375 +vt 0.265625 0.3671875 +vt 0.2734375 0.3671875 +vt 0.6328125 0.7265625 +vt 0.6328125 0.734375 +vt 0.515625 0.734375 +vt 0.21875 0.109375 +vt 0.2265625 0.109375 +vt 0.2265625 0.1171875 +vt 0.2421875 0.1171875 +vt 0.234375 0.1171875 +vt 0.234375 0.109375 +vt 0.2890625 0.484375 +vt 0.28125 0.484375 +vt 0.28125 0.3671875 +vt 0.515625 0.5859375 +vt 0.515625 0.578125 +vt 0.6328125 0.578125 +vt 0.296875 0.484375 +vt 0.296875 0.3671875 +vt 0.3046875 0.3671875 +vt 0.6328125 0.5625 +vt 0.6328125 0.5703125 +vt 0.515625 0.5703125 +vt 0.25 0.109375 +vt 0.2578125 0.109375 +vt 0.2578125 0.1171875 +vt 0.890625 0.75 +vt 0.8828125 0.75 +vt 0.8828125 0.7421875 +vt 0.3203125 0.484375 +vt 0.3125 0.484375 +vt 0.3125 0.3671875 +vt 0.515625 0.5546875 +vt 0.515625 0.546875 +vt 0.6328125 0.546875 +vt 0.328125 0.484375 +vt 0.328125 0.3671875 +vt 0.3359375 0.3671875 +vt 0.6328125 0.53125 +vt 0.6328125 0.5390625 +vt 0.515625 0.5390625 +vt 0.265625 0.109375 +vt 0.2734375 0.109375 +vt 0.2734375 0.1171875 +vt 0.890625 0.734375 +vt 0.8828125 0.734375 +vt 0.8828125 0.7265625 +vt 0.3515625 0.484375 +vt 0.34375 0.484375 +vt 0.34375 0.3671875 +vt 0.515625 0.5234375 +vt 0.515625 0.515625 +vt 0.6328125 0.515625 +vt 0.359375 0.484375 +vt 0.359375 0.3671875 +vt 0.3671875 0.3671875 +vt 0.6328125 0.5 +vt 0.6328125 0.5078125 +vt 0.515625 0.5078125 +vt 0.28125 0.109375 +vt 0.2890625 0.109375 +vt 0.2890625 0.1171875 +vt 0.3046875 0.1171875 +vt 0.296875 0.1171875 +vt 0.296875 0.109375 +vt 0.3828125 0.484375 +vt 0.375 0.484375 +vt 0.375 0.3671875 +vt 0.515625 0.4921875 +vt 0.515625 0.484375 +vt 0.6328125 0.484375 +vt 0.484375 0.4765625 +vt 0.484375 0.359375 +vt 0.4921875 0.359375 +vt 0.6328125 0.46875 +vt 0.6328125 0.4765625 +vt 0.515625 0.4765625 +vt 0.3125 0.109375 +vt 0.3203125 0.109375 +vt 0.3203125 0.1171875 +vt 0.3359375 0.1171875 +vt 0.328125 0.1171875 +vt 0.328125 0.109375 +vt 0.5390625 0.875 +vt 0.53125 0.875 +vt 0.53125 0.7578125 +vt 0.5 0.4609375 +vt 0.5 0.453125 +vt 0.6171875 0.453125 +vt 0.546875 0.875 +vt 0.546875 0.7578125 +vt 0.5546875 0.7578125 +vt 0.671875 0.9921875 +vt 0.671875 1 +vt 0.5546875 1 +vt 0.34375 0.109375 +vt 0.3515625 0.109375 +vt 0.3515625 0.1171875 +vt 0.3671875 0.1171875 +vt 0.359375 0.1171875 +vt 0.359375 0.109375 +vt 0.5078125 0.4453125 +vt 0.5 0.4453125 +vt 0.5 0.328125 +vt 0.5546875 0.984375 +vt 0.5546875 0.9765625 +vt 0.671875 0.9765625 +vt 0.515625 0.4453125 +vt 0.515625 0.328125 +vt 0.5234375 0.328125 +vt 0.671875 0.9609375 +vt 0.671875 0.96875 +vt 0.5546875 0.96875 +vt 0.375 0.109375 +vt 0.3828125 0.109375 +vt 0.3828125 0.1171875 +vt 0.890625 0.59375 +vt 0.8828125 0.59375 +vt 0.8828125 0.5859375 +vt 0.6171875 0.2421875 +vt 0.609375 0.2421875 +vt 0.609375 0.1328125 +vt 0.75 0.609375 +vt 0.75 0.6015625 +vt 0.859375 0.6015625 +vt 0.625 0.1328125 +vt 0.6328125 0.1328125 +vt 0.6328125 0.2421875 +vt 0.859375 0.453125 +vt 0.859375 0.4609375 +vt 0.75 0.4609375 +vt 0.8828125 0.5703125 +vt 0.890625 0.5703125 +vt 0.890625 0.578125 +vt 0.890625 0.5625 +vt 0.8828125 0.5625 +vt 0.8828125 0.5546875 +vt 0.6484375 0.2421875 +vt 0.640625 0.2421875 +vt 0.640625 0.1328125 +vt 0.7578125 0.71875 +vt 0.7578125 0.7109375 +vt 0.8671875 0.7109375 +vt 0.65625 0.1328125 +vt 0.6640625 0.1328125 +vt 0.6640625 0.2421875 +vt 0.8671875 0.6953125 +vt 0.8671875 0.703125 +vt 0.7578125 0.703125 +vt 0.8828125 0.5390625 +vt 0.890625 0.5390625 +vt 0.890625 0.546875 +vt 0.890625 0.53125 +vt 0.8828125 0.53125 +vt 0.8828125 0.5234375 +vt 0.2109375 0.234375 +vt 0.203125 0.234375 +vt 0.203125 0.125 +vt 0.7578125 0.6875 +vt 0.7578125 0.6796875 +vt 0.8671875 0.6796875 +vt 0.21875 0.125 +vt 0.2265625 0.125 +vt 0.2265625 0.234375 +vt 0.8671875 0.6640625 +vt 0.8671875 0.671875 +vt 0.7578125 0.671875 +vt 0.8828125 0.5078125 +vt 0.890625 0.5078125 +vt 0.890625 0.515625 +vt 0.890625 0.5 +vt 0.8828125 0.5 +vt 0.8828125 0.4921875 +vt 0.2421875 0.234375 +vt 0.234375 0.234375 +vt 0.234375 0.125 +vt 0.7578125 0.65625 +vt 0.7578125 0.6484375 +vt 0.8671875 0.6484375 +vt 0.25 0.125 +vt 0.2578125 0.125 +vt 0.2578125 0.234375 +vt 0.8671875 0.6328125 +vt 0.8671875 0.640625 +vt 0.7578125 0.640625 +vt 0.8828125 0.4765625 +vt 0.890625 0.4765625 +vt 0.890625 0.484375 +vt 0.890625 0.46875 +vt 0.8828125 0.46875 +vt 0.8828125 0.4609375 +vt 0.2734375 0.234375 +vt 0.265625 0.234375 +vt 0.265625 0.125 +vt 0.765625 0.75 +vt 0.765625 0.7421875 +vt 0.875 0.7421875 +vt 0.28125 0.125 +vt 0.2890625 0.125 +vt 0.2890625 0.234375 +vt 0.875 0.7265625 +vt 0.875 0.734375 +vt 0.765625 0.734375 +vt 0.8828125 0.296875 +vt 0.890625 0.296875 +vt 0.890625 0.3046875 +vt 0.7578125 0.1171875 +vt 0.75 0.1171875 +vt 0.75 0.109375 +vt 0.3046875 0.234375 +vt 0.296875 0.234375 +vt 0.296875 0.125 +vt 0.765625 0.59375 +vt 0.765625 0.5859375 +vt 0.875 0.5859375 +vt 0.3125 0.125 +vt 0.3203125 0.125 +vt 0.3203125 0.234375 +vt 0.875 0.5703125 +vt 0.875 0.578125 +vt 0.765625 0.578125 +vt 0.765625 0.109375 +vt 0.7734375 0.109375 +vt 0.7734375 0.1171875 +vt 0.890625 0.2265625 +vt 0.8828125 0.2265625 +vt 0.8828125 0.21875 +vt 0.3359375 0.234375 +vt 0.328125 0.234375 +vt 0.328125 0.125 +vt 0.765625 0.5625 +vt 0.765625 0.5546875 +vt 0.875 0.5546875 +vt 0.34375 0.125 +vt 0.3515625 0.125 +vt 0.3515625 0.234375 +vt 0.875 0.5390625 +vt 0.875 0.546875 +vt 0.765625 0.546875 +vt 0.8828125 0.203125 +vt 0.890625 0.203125 +vt 0.890625 0.2109375 +vt 0.890625 0.1953125 +vt 0.8828125 0.1953125 +vt 0.8828125 0.1875 +vt 0.3671875 0.234375 +vt 0.359375 0.234375 +vt 0.359375 0.125 +vt 0.765625 0.53125 +vt 0.765625 0.5234375 +vt 0.875 0.5234375 +vt 0.375 0.125 +vt 0.3828125 0.125 +vt 0.3828125 0.234375 +vt 0.875 0.5078125 +vt 0.875 0.515625 +vt 0.765625 0.515625 +vt 0.8828125 0.171875 +vt 0.890625 0.171875 +vt 0.890625 0.1796875 +vt 0.890625 0.1640625 +vt 0.8828125 0.1640625 +vt 0.8828125 0.15625 +vt 0.7734375 0.2578125 +vt 0.765625 0.2578125 +vt 0.765625 0.1484375 +vt 0.765625 0.5 +vt 0.765625 0.4921875 +vt 0.875 0.4921875 +vt 0.484375 0.1171875 +vt 0.4921875 0.1171875 +vt 0.4921875 0.2265625 +vt 0.875 0.4765625 +vt 0.875 0.484375 +vt 0.765625 0.484375 +vt 0.8828125 0.140625 +vt 0.890625 0.140625 +vt 0.890625 0.1484375 +vt 0.8671875 0.1171875 +vt 0.859375 0.1171875 +vt 0.859375 0.109375 +vt 0.6796875 0.2265625 +vt 0.671875 0.2265625 +vt 0.671875 0.1171875 +vt 0.78125 0.2578125 +vt 0.78125 0.25 +vt 0.890625 0.25 +vt 0.6875 0.1171875 +vt 0.6953125 0.1171875 +vt 0.6953125 0.2265625 +vt 0.890625 0.234375 +vt 0.890625 0.2421875 +vt 0.78125 0.2421875 +vt 0.8828125 0.125 +vt 0.890625 0.125 +vt 0.890625 0.1328125 +vt 0.8828125 0.1171875 +vt 0.875 0.1171875 +vt 0.875 0.109375 +vt 0.7890625 0.2265625 +vt 0.78125 0.2265625 +vt 0.78125 0.1171875 +vt 0.796875 0.3671875 +vt 0.796875 0.359375 +vt 0.90625 0.359375 +vt 0.796875 0.1171875 +vt 0.8046875 0.1171875 +vt 0.8046875 0.2265625 +vt 0.9140625 0.9921875 +vt 0.9140625 1 +vt 0.8046875 1 +vt 0.171875 0.1015625 +vt 0.1796875 0.1015625 +vt 0.1796875 0.109375 +vt 0.1953125 0.109375 +vt 0.1875 0.109375 +vt 0.1875 0.1015625 +vt 0.5390625 0.4453125 +vt 0.53125 0.4453125 +vt 0.53125 0.328125 +vt 0.5546875 0.953125 +vt 0.5546875 0.9453125 +vt 0.671875 0.9453125 +vt 0.546875 0.4453125 +vt 0.546875 0.328125 +vt 0.5546875 0.328125 +vt 0.671875 0.9296875 +vt 0.671875 0.9375 +vt 0.5546875 0.9375 +vt 0.890625 0.6015625 +vt 0.8984375 0.6015625 +vt 0.8984375 0.609375 +vt 0.4921875 0.109375 +vt 0.484375 0.109375 +vt 0.484375 0.1015625 +vt 0.5703125 0.875 +vt 0.5625 0.875 +vt 0.5625 0.7578125 +vt 0.5546875 0.921875 +vt 0.5546875 0.9140625 +vt 0.671875 0.9140625 +vt 0.5625 0.4453125 +vt 0.5625 0.328125 +vt 0.5703125 0.328125 +vt 0.6953125 0.8671875 +vt 0.6953125 0.875 +vt 0.578125 0.875 +vt 0.640625 0.1015625 +vt 0.6484375 0.1015625 +vt 0.6484375 0.109375 +vt 0.6640625 0.109375 +vt 0.65625 0.109375 +vt 0.65625 0.1015625 +vt 0.1328125 0.421875 +vt 0.125 0.421875 +vt 0.125 0.3046875 +vt 0.578125 0.859375 +vt 0.578125 0.8515625 +vt 0.6953125 0.8515625 +vt 0.140625 0.421875 +vt 0.140625 0.3046875 +vt 0.1484375 0.3046875 +vt 0.6953125 0.8359375 +vt 0.6953125 0.84375 +vt 0.578125 0.84375 +vt 0.671875 0.1015625 +vt 0.6796875 0.1015625 +vt 0.6796875 0.109375 +vt 0.6953125 0.109375 +vt 0.6875 0.109375 +vt 0.6875 0.1015625 +vt 0.1640625 0.421875 +vt 0.15625 0.421875 +vt 0.15625 0.3046875 +vt 0.578125 0.828125 +vt 0.578125 0.8203125 +vt 0.6953125 0.8203125 +vt 0.390625 0.421875 +vt 0.390625 0.3046875 +vt 0.3984375 0.3046875 +vt 0.6953125 0.8046875 +vt 0.6953125 0.8125 +vt 0.578125 0.8125 +vt 0.890625 0.28125 +vt 0.8984375 0.28125 +vt 0.8984375 0.2890625 +vt 0.8984375 0.2734375 +vt 0.890625 0.2734375 +vt 0.890625 0.265625 +vt 0.4140625 0.421875 +vt 0.40625 0.421875 +vt 0.40625 0.3046875 +vt 0.578125 0.796875 +vt 0.578125 0.7890625 +vt 0.6953125 0.7890625 +vt 0.421875 0.421875 +vt 0.421875 0.3046875 +vt 0.4296875 0.3046875 +vt 0.6953125 0.7734375 +vt 0.6953125 0.78125 +vt 0.578125 0.78125 +vt 0.734375 0.1015625 +vt 0.7421875 0.1015625 +vt 0.7421875 0.109375 +vt 0.7890625 0.109375 +vt 0.78125 0.109375 +vt 0.78125 0.1015625 +vt 0.4453125 0.421875 +vt 0.4375 0.421875 +vt 0.4375 0.3046875 +vt 0.578125 0.765625 +vt 0.578125 0.7578125 +vt 0.6953125 0.7578125 +vt 0.453125 0.421875 +vt 0.453125 0.3046875 +vt 0.4609375 0.3046875 +vt 0.6953125 0.4375 +vt 0.6953125 0.4453125 +vt 0.578125 0.4453125 +vt 0.796875 0.1015625 +vt 0.8046875 0.1015625 +vt 0.8046875 0.109375 +vt 0.8203125 0.109375 +vt 0.8125 0.109375 +vt 0.8125 0.1015625 +vt 0.5859375 0.4296875 +vt 0.578125 0.4296875 +vt 0.578125 0.3125 +vt 0.5859375 0.90625 +vt 0.5859375 0.8984375 +vt 0.703125 0.8984375 +vt 0.59375 0.4296875 +vt 0.59375 0.3125 +vt 0.6015625 0.3125 +vt 0.703125 0.8828125 +vt 0.703125 0.890625 +vt 0.5859375 0.890625 +vt 0.828125 0.1015625 +vt 0.8359375 0.1015625 +vt 0.8359375 0.109375 +vt 0.8515625 0.109375 +vt 0.84375 0.109375 +vt 0.84375 0.1015625 +vt 0.0078125 0.3984375 +vt 0 0.3984375 +vt 0 0.28125 +vt 0.609375 0.6171875 +vt 0.609375 0.609375 +vt 0.7265625 0.609375 +vt 0.015625 0.3984375 +vt 0.015625 0.28125 +vt 0.0234375 0.28125 +vt 0.7265625 0.421875 +vt 0.7265625 0.4296875 +vt 0.609375 0.4296875 +vt 0.890625 0.109375 +vt 0.8984375 0.109375 +vt 0.8984375 0.1171875 +vt 0.0703125 0.1015625 +vt 0.0625 0.1015625 +vt 0.0625 0.09375 +vt 0.0390625 0.3984375 +vt 0.03125 0.3984375 +vt 0.03125 0.28125 +vt 0.609375 0.4140625 +vt 0.609375 0.40625 +vt 0.7265625 0.40625 +vt 0.046875 0.3984375 +vt 0.046875 0.28125 +vt 0.0546875 0.28125 +vt 0.7265625 0.390625 +vt 0.7265625 0.3984375 +vt 0.609375 0.3984375 +vt 0.078125 0.09375 +vt 0.0859375 0.09375 +vt 0.0859375 0.1015625 +vt 0.1015625 0.1015625 +vt 0.09375 0.1015625 +vt 0.09375 0.09375 +vt 0.0703125 0.3984375 +vt 0.0625 0.3984375 +vt 0.0625 0.28125 +vt 0.609375 0.3828125 +vt 0.609375 0.375 +vt 0.7265625 0.375 +vt 0.078125 0.3984375 +vt 0.078125 0.28125 +vt 0.0859375 0.28125 +vt 0.7421875 0.59375 +vt 0.7421875 0.6015625 +vt 0.625 0.6015625 +vt 0.109375 0.09375 +vt 0.1171875 0.09375 +vt 0.1171875 0.1015625 +vt 0.2109375 0.1015625 +vt 0.203125 0.1015625 +vt 0.203125 0.09375 +vt 0.1015625 0.3984375 +vt 0.09375 0.3984375 +vt 0.09375 0.28125 +vt 0.625 0.4609375 +vt 0.625 0.453125 +vt 0.7421875 0.453125 +vt 0.109375 0.3984375 +vt 0.109375 0.28125 +vt 0.1171875 0.28125 +vt 0.75 0.7109375 +vt 0.75 0.71875 +vt 0.6328125 0.71875 +vt 0.21875 0.09375 +vt 0.2265625 0.09375 +vt 0.2265625 0.1015625 +vt 0.2421875 0.1015625 +vt 0.234375 0.1015625 +vt 0.234375 0.09375 +vt 0.1796875 0.3984375 +vt 0.171875 0.3984375 +vt 0.171875 0.28125 +vt 0.390625 0.8515625 +vt 0.390625 0.8359375 +vt 0.5078125 0.8359375 +vt 0.1875 0.3984375 +vt 0.1875 0.28125 +vt 0.1953125 0.28125 +vt 0.5078125 0.8125 +vt 0.5078125 0.828125 +vt 0.390625 0.828125 +vt 0.171875 0.1328125 +vt 0.171875 0.1171875 +vt 0.1796875 0.1171875 +vt 0.1953125 0.1328125 +vt 0.1875 0.1328125 +vt 0.1875 0.1171875 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +usemtl m_5f175e4e-a6a7-9193-e88f-70334c8bfde8 +f 26/109/37 27/110/37 28/111/37 +f 29/112/38 30/113/38 27/114/38 +f 30/115/39 31/116/39 32/117/39 +f 31/118/40 28/119/40 32/120/40 +f 27/121/41 32/122/41 28/123/41 +f 29/124/42 31/125/42 33/126/42 +f 34/127/43 35/128/43 36/129/43 +f 37/130/44 38/131/44 35/132/44 +f 39/133/45 40/134/45 38/135/45 +f 41/136/46 36/137/46 40/138/46 +f 38/139/47 36/140/47 35/141/47 +f 37/142/48 41/143/48 39/144/48 +f 42/145/49 43/146/49 44/147/49 +f 45/148/50 46/149/50 43/150/50 +f 47/151/51 48/152/51 46/153/51 +f 49/154/52 42/155/52 44/156/52 +f 43/157/53 48/158/53 44/159/53 +f 45/160/54 42/161/54 49/162/54 +f 50/163/55 51/164/55 52/165/55 +f 53/166/56 54/167/56 51/168/56 +f 55/169/57 56/170/57 54/171/57 +f 57/172/58 50/173/58 52/174/58 +f 51/175/59 56/176/59 52/177/59 +f 53/178/60 50/179/60 57/180/60 +f 58/181/61 59/182/61 60/183/61 +f 61/184/62 62/185/62 59/186/62 +f 63/187/63 64/188/63 62/189/63 +f 65/190/64 58/191/64 60/192/64 +f 59/193/65 64/194/65 60/195/65 +f 61/196/66 58/197/66 65/198/66 +f 66/199/67 67/200/67 68/201/67 +f 69/202/68 70/203/68 67/204/68 +f 71/205/69 72/206/69 70/207/69 +f 73/208/70 66/209/70 68/210/70 +f 67/211/71 72/212/71 68/213/71 +f 69/214/72 66/215/72 73/216/72 +f 74/217/73 75/218/73 76/219/73 +f 77/220/74 78/221/74 75/222/74 +f 78/223/75 79/224/75 80/225/75 +f 79/226/76 76/227/76 80/228/76 +f 78/229/77 76/230/77 75/231/77 +f 77/232/78 79/233/78 81/234/78 +f 82/235/79 83/236/79 84/237/79 +f 85/238/80 86/239/80 83/240/80 +f 86/241/81 87/242/81 88/243/81 +f 87/244/82 84/245/82 88/246/82 +f 86/247/83 84/248/83 83/249/83 +f 85/250/84 87/251/84 89/252/84 +f 90/253/85 91/254/85 92/255/85 +f 93/256/86 94/257/86 91/258/86 +f 94/259/87 95/260/87 25/261/87 +f 95/262/88 92/263/88 25/264/88 +f 94/265/89 92/266/89 91/267/89 +f 93/268/90 95/269/90 96/270/90 +f 97/271/91 98/272/91 99/273/91 +f 100/274/92 101/275/92 98/276/92 +f 101/277/93 102/278/93 103/279/93 +f 102/280/94 99/281/94 103/282/94 +f 101/283/95 99/284/95 98/285/95 +f 100/286/96 102/287/96 104/288/96 +f 105/289/97 106/290/97 107/291/97 +f 108/292/98 109/293/98 106/294/98 +f 109/295/99 110/296/99 111/297/99 +f 110/298/100 107/299/100 111/300/100 +f 109/301/101 107/302/101 106/303/101 +f 108/304/102 110/305/102 112/306/102 +f 113/307/103 114/308/103 115/309/103 +f 116/310/104 117/311/104 114/312/104 +f 117/313/105 118/314/105 119/315/105 +f 118/316/106 115/317/106 119/318/106 +f 117/319/107 115/320/107 114/321/107 +f 116/322/108 118/323/108 120/324/108 +f 121/325/109 122/326/109 123/327/109 +f 124/328/110 125/329/110 122/330/110 +f 125/331/111 126/332/111 127/333/111 +f 126/334/112 123/335/112 127/336/112 +f 125/337/113 123/338/113 122/339/113 +f 124/340/114 126/341/114 128/342/114 +f 129/343/115 130/344/115 131/345/115 +f 132/346/116 133/347/116 130/348/116 +f 133/349/117 134/350/117 135/351/117 +f 134/352/118 131/353/118 135/354/118 +f 133/355/119 131/356/119 130/357/119 +f 132/358/120 134/359/120 136/360/120 +f 137/361/121 138/362/121 139/363/121 +f 140/364/122 141/365/122 138/366/122 +f 141/367/123 142/368/123 143/369/123 +f 142/370/124 139/371/124 143/372/124 +f 141/373/125 139/374/125 138/375/125 +f 140/376/126 142/377/126 144/378/126 +f 145/379/127 146/380/127 147/381/127 +f 148/382/128 149/383/128 146/384/128 +f 149/385/129 150/386/129 151/387/129 +f 150/388/130 147/389/130 151/390/130 +f 149/391/131 147/392/131 146/393/131 +f 148/394/132 150/395/132 152/396/132 +f 153/397/133 154/398/133 155/399/133 +f 156/400/134 157/401/134 154/402/134 +f 157/403/135 158/404/135 159/405/135 +f 158/406/136 155/407/136 159/408/136 +f 157/409/137 155/410/137 154/411/137 +f 156/412/138 158/413/138 160/414/138 +f 161/415/139 162/416/139 163/417/139 +f 164/418/140 165/419/140 162/420/140 +f 166/421/141 167/422/141 165/423/141 +f 168/424/142 163/425/142 167/426/142 +f 165/427/143 163/428/143 162/429/143 +f 164/430/144 168/431/144 166/432/144 +f 169/433/145 170/434/145 171/435/145 +f 172/436/146 173/437/146 170/438/146 +f 174/439/147 175/440/147 173/441/147 +f 176/442/148 171/443/148 175/444/148 +f 173/445/149 171/446/149 170/447/149 +f 172/448/150 176/449/150 174/450/150 +f 177/451/151 178/452/151 179/453/151 +f 180/454/152 181/455/152 178/456/152 +f 182/457/153 183/458/153 181/459/153 +f 184/460/154 179/461/154 183/462/154 +f 181/463/155 179/464/155 178/465/155 +f 180/466/156 184/467/156 182/468/156 +f 185/469/157 186/470/157 187/471/157 +f 188/472/158 189/473/158 186/474/158 +f 190/475/159 191/476/159 189/477/159 +f 192/478/160 187/479/160 191/480/160 +f 189/481/161 187/482/161 186/483/161 +f 188/484/162 192/485/162 190/486/162 +f 193/487/163 194/488/163 195/489/163 +f 196/490/164 197/491/164 194/492/164 +f 198/493/165 199/494/165 197/495/165 +f 200/496/166 195/497/166 199/498/166 +f 197/499/167 195/500/167 194/501/167 +f 196/502/168 200/503/168 198/504/168 +f 201/505/169 202/506/169 203/507/169 +f 204/508/170 205/509/170 202/510/170 +f 206/511/171 207/512/171 205/513/171 +f 208/514/172 203/515/172 207/516/172 +f 205/517/173 203/518/173 202/519/173 +f 204/520/174 208/521/174 206/522/174 +f 209/523/175 210/524/175 211/525/175 +f 212/526/176 213/527/176 210/528/176 +f 214/529/177 215/530/177 213/531/177 +f 216/532/178 211/533/178 215/534/178 +f 213/535/179 211/536/179 210/537/179 +f 212/538/180 216/539/180 214/540/180 +f 217/541/181 218/542/181 219/543/181 +f 220/544/182 221/545/182 218/546/182 +f 222/547/183 223/548/183 221/549/183 +f 224/550/184 219/551/184 223/552/184 +f 221/553/185 219/554/185 218/555/185 +f 220/556/186 224/557/186 222/558/186 +f 225/559/187 226/560/187 227/561/187 +f 228/562/188 229/563/188 226/564/188 +f 230/565/189 231/566/189 229/567/189 +f 232/568/190 227/569/190 231/570/190 +f 229/571/191 227/572/191 226/573/191 +f 228/574/192 232/575/192 230/576/192 +f 233/577/193 234/578/193 235/579/193 +f 236/580/194 237/581/194 234/582/194 +f 238/583/195 239/584/195 237/585/195 +f 240/586/196 235/587/196 239/588/196 +f 237/589/197 235/590/197 234/591/197 +f 236/592/198 240/593/198 238/594/198 +f 241/595/199 242/596/199 243/597/199 +f 244/598/200 245/599/200 242/600/200 +f 246/601/201 247/602/201 245/603/201 +f 248/604/202 243/605/202 247/606/202 +f 245/607/203 243/608/203 242/609/203 +f 244/610/204 248/611/204 246/612/204 +f 249/613/205 250/614/205 251/615/205 +f 252/616/206 253/617/206 250/618/206 +f 253/619/207 254/620/207 255/621/207 +f 254/622/208 251/623/208 255/624/208 +f 253/625/209 251/626/209 250/627/209 +f 252/628/210 254/629/210 256/630/210 +f 257/631/211 258/632/211 259/633/211 +f 260/634/212 261/635/212 258/636/212 +f 261/637/213 262/638/213 263/639/213 +f 262/640/214 259/641/214 263/642/214 +f 261/643/215 259/644/215 258/645/215 +f 260/646/216 262/647/216 264/648/216 +f 265/649/217 266/650/217 267/651/217 +f 268/652/218 269/653/218 266/654/218 +f 269/655/219 270/656/219 271/657/219 +f 270/658/220 267/659/220 271/660/220 +f 269/661/221 267/662/221 266/663/221 +f 268/664/222 270/665/222 272/666/222 +f 273/667/223 274/668/223 275/669/223 +f 276/670/224 277/671/224 274/672/224 +f 277/673/225 278/674/225 279/675/225 +f 278/676/226 275/677/226 279/678/226 +f 277/679/227 275/680/227 274/681/227 +f 276/682/228 278/683/228 280/684/228 +f 281/685/229 282/686/229 283/687/229 +f 284/688/230 285/689/230 282/690/230 +f 285/691/231 286/692/231 287/693/231 +f 286/694/232 283/695/232 287/696/232 +f 285/697/233 283/698/233 282/699/233 +f 284/700/234 286/701/234 288/702/234 +f 289/703/235 290/704/235 291/705/235 +f 292/706/236 293/707/236 290/708/236 +f 293/709/237 294/710/237 295/711/237 +f 294/712/238 291/713/238 295/714/238 +f 293/715/239 291/716/239 290/717/239 +f 292/718/240 294/719/240 296/720/240 +f 297/721/241 298/722/241 299/723/241 +f 300/724/242 301/725/242 298/726/242 +f 301/727/243 302/728/243 303/729/243 +f 302/730/244 299/731/244 303/732/244 +f 301/733/245 299/734/245 298/735/245 +f 300/736/246 302/737/246 304/738/246 +f 305/739/247 306/740/247 307/741/247 +f 308/742/248 309/743/248 306/744/248 +f 309/745/249 310/746/249 311/747/249 +f 310/748/250 307/749/250 311/750/250 +f 309/751/251 307/752/251 306/753/251 +f 308/754/252 310/755/252 312/756/252 +f 313/757/253 314/758/253 315/759/253 +f 316/760/254 317/761/254 314/762/254 +f 317/763/255 318/764/255 319/765/255 +f 318/766/256 315/767/256 319/768/256 +f 317/769/257 315/770/257 314/771/257 +f 316/772/258 318/773/258 320/774/258 +f 321/775/259 322/776/259 323/777/259 +f 324/778/260 325/779/260 322/780/260 +f 325/781/261 326/782/261 327/783/261 +f 326/784/262 323/785/262 327/786/262 +f 325/787/263 323/788/263 322/789/263 +f 324/790/264 326/791/264 328/792/264 +f 329/793/265 330/794/265 331/795/265 +f 332/796/266 333/797/266 330/798/266 +f 333/799/267 334/800/267 335/801/267 +f 334/802/268 331/803/268 335/804/268 +f 333/805/269 331/806/269 330/807/269 +f 332/808/270 334/809/270 336/810/270 +f 337/811/271 338/812/271 339/813/271 +f 340/814/272 341/815/272 338/816/272 +f 341/817/273 342/818/273 343/819/273 +f 342/820/274 339/821/274 343/822/274 +f 338/823/275 343/824/275 339/825/275 +f 340/826/276 342/827/276 344/828/276 +f 26/829/277 29/830/277 27/831/277 +f 29/832/278 33/833/278 30/834/278 +f 30/835/279 33/836/279 31/837/279 +f 31/838/280 26/839/280 28/840/280 +f 27/841/281 30/842/281 32/843/281 +f 29/844/282 26/845/282 31/846/282 +f 34/847/283 37/848/283 35/849/283 +f 37/850/284 39/851/284 38/852/284 +f 39/853/285 41/854/285 40/855/285 +f 41/856/286 34/857/286 36/858/286 +f 38/859/287 40/860/287 36/861/287 +f 37/862/288 34/863/288 41/864/288 +f 42/865/289 45/866/289 43/867/289 +f 45/868/290 47/869/290 46/870/290 +f 47/871/291 345/872/291 48/873/291 +f 44/874/292 48/875/292 49/876/292 +f 48/877/293 345/878/293 49/879/293 +f 43/880/294 46/881/294 48/882/294 +f 345/883/295 47/884/295 49/885/295 +f 47/886/296 45/887/296 49/888/296 +f 50/889/297 53/890/297 51/891/297 +f 53/892/298 55/893/298 54/894/298 +f 55/895/299 346/896/299 56/897/299 +f 52/898/300 56/899/300 57/900/300 +f 56/901/301 346/902/301 57/903/301 +f 51/904/302 54/905/302 56/906/302 +f 346/907/303 55/908/303 57/909/303 +f 55/910/304 53/911/304 57/912/304 +f 58/913/305 61/914/305 59/915/305 +f 61/916/306 63/917/306 62/918/306 +f 63/919/307 347/920/307 64/921/307 +f 60/922/308 64/923/308 65/924/308 +f 64/925/309 347/926/309 65/927/309 +f 59/928/310 62/929/310 64/930/310 +f 347/931/311 63/932/311 65/933/311 +f 63/934/312 61/935/312 65/936/312 +f 66/937/313 69/938/313 67/939/313 +f 69/940/314 71/941/314 70/942/314 +f 71/943/315 348/944/315 72/945/315 +f 68/946/316 72/947/316 73/948/316 +f 72/949/317 348/950/317 73/951/317 +f 67/952/318 70/953/318 72/954/318 +f 348/955/319 71/956/319 73/957/319 +f 71/958/320 69/959/320 73/960/320 +f 74/961/321 77/962/321 75/963/321 +f 77/964/322 81/965/322 78/966/322 +f 78/967/323 81/968/323 79/969/323 +f 79/970/324 74/971/324 76/972/324 +f 78/973/325 80/974/325 76/975/325 +f 77/976/326 74/977/326 79/978/326 +f 82/979/327 85/980/327 83/981/327 +f 85/982/328 89/983/328 86/984/328 +f 86/985/329 89/986/329 87/987/329 +f 87/988/330 82/989/330 84/990/330 +f 86/991/331 88/992/331 84/993/331 +f 85/994/332 82/995/332 87/996/332 +f 90/997/333 93/998/333 91/999/333 +f 93/1000/334 96/1001/334 94/1002/334 +f 94/1003/335 96/1004/335 95/1005/335 +f 95/1006/336 90/1007/336 92/1008/336 +f 94/1009/337 25/1010/337 92/1011/337 +f 93/1012/338 90/1013/338 95/1014/338 +f 97/1015/339 100/1016/339 98/1017/339 +f 100/1018/340 104/1019/340 101/1020/340 +f 101/1021/341 104/1022/341 102/1023/341 +f 102/1024/342 97/1025/342 99/1026/342 +f 101/1027/343 103/1028/343 99/1029/343 +f 100/1030/344 97/1031/344 102/1032/344 +f 105/1033/345 108/1034/345 106/1035/345 +f 108/1036/346 112/1037/346 109/1038/346 +f 109/1039/347 112/1040/347 110/1041/347 +f 110/1042/348 105/1043/348 107/1044/348 +f 109/1045/349 111/1046/349 107/1047/349 +f 108/1048/350 105/1049/350 110/1050/350 +f 113/1051/351 116/1052/351 114/1053/351 +f 116/1054/352 120/1055/352 117/1056/352 +f 117/1057/353 120/1058/353 118/1059/353 +f 118/1060/354 113/1061/354 115/1062/354 +f 117/1063/355 119/1064/355 115/1065/355 +f 116/1066/356 113/1067/356 118/1068/356 +f 121/1069/357 124/1070/357 122/1071/357 +f 124/1072/358 128/1073/358 125/1074/358 +f 125/1075/359 128/1076/359 126/1077/359 +f 126/1078/360 121/1079/360 123/1080/360 +f 125/1081/361 127/1082/361 123/1083/361 +f 124/1084/362 121/1085/362 126/1086/362 +f 129/1087/363 132/1088/363 130/1089/363 +f 132/1090/364 136/1091/364 133/1092/364 +f 133/1093/365 136/1094/365 134/1095/365 +f 134/1096/366 129/1097/366 131/1098/366 +f 133/1099/367 135/1100/367 131/1101/367 +f 132/1102/368 129/1103/368 134/1104/368 +f 137/1105/369 140/1106/369 138/1107/369 +f 140/1108/370 144/1109/370 141/1110/370 +f 141/1111/371 144/1112/371 142/1113/371 +f 142/1114/372 137/1115/372 139/1116/372 +f 141/1117/373 143/1118/373 139/1119/373 +f 140/1120/374 137/1121/374 142/1122/374 +f 145/1123/375 148/1124/375 146/1125/375 +f 148/1126/376 152/1127/376 149/1128/376 +f 149/1129/377 152/1130/377 150/1131/377 +f 150/1132/378 145/1133/378 147/1134/378 +f 149/1135/379 151/1136/379 147/1137/379 +f 148/1138/380 145/1139/380 150/1140/380 +f 153/1141/381 156/1142/381 154/1143/381 +f 156/1144/382 160/1145/382 157/1146/382 +f 157/1147/383 160/1148/383 158/1149/383 +f 158/1150/384 153/1151/384 155/1152/384 +f 157/1153/385 159/1154/385 155/1155/385 +f 156/1156/386 153/1157/386 158/1158/386 +f 161/1159/387 164/1160/387 162/1161/387 +f 164/1162/388 166/1163/388 165/1164/388 +f 166/1165/389 168/1166/389 167/1167/389 +f 168/1168/390 161/1169/390 163/1170/390 +f 165/1171/391 167/1172/391 163/1173/391 +f 164/1174/392 161/1175/392 168/1176/392 +f 169/1177/393 172/1178/393 170/1179/393 +f 172/1180/394 174/1181/394 173/1182/394 +f 174/1183/395 176/1184/395 175/1185/395 +f 176/1186/396 169/1187/396 171/1188/396 +f 173/1189/397 175/1190/397 171/1191/397 +f 172/1192/398 169/1193/398 176/1194/398 +f 177/1195/399 180/1196/399 178/1197/399 +f 180/1198/400 182/1199/400 181/1200/400 +f 182/1201/401 184/1202/401 183/1203/401 +f 184/1204/402 177/1205/402 179/1206/402 +f 181/1207/403 183/1208/403 179/1209/403 +f 180/1210/404 177/1211/404 184/1212/404 +f 185/1213/405 188/1214/405 186/1215/405 +f 188/1216/406 190/1217/406 189/1218/406 +f 190/1219/407 192/1220/407 191/1221/407 +f 192/1222/408 185/1223/408 187/1224/408 +f 189/1225/409 191/1226/409 187/1227/409 +f 188/1228/410 185/1229/410 192/1230/410 +f 193/1231/411 196/1232/411 194/1233/411 +f 196/1234/412 198/1235/412 197/1236/412 +f 198/1237/413 200/1238/413 199/1239/413 +f 200/1240/414 193/1241/414 195/1242/414 +f 197/1243/415 199/1244/415 195/1245/415 +f 196/1246/416 193/1247/416 200/1248/416 +f 201/1249/417 204/1250/417 202/1251/417 +f 204/1252/418 206/1253/418 205/1254/418 +f 206/1255/419 208/1256/419 207/1257/419 +f 208/1258/420 201/1259/420 203/1260/420 +f 205/1261/421 207/1262/421 203/1263/421 +f 204/1264/422 201/1265/422 208/1266/422 +f 209/1267/423 212/1268/423 210/1269/423 +f 212/1270/424 214/1271/424 213/1272/424 +f 214/1273/425 216/1274/425 215/1275/425 +f 216/1276/426 209/1277/426 211/1278/426 +f 213/1279/427 215/1280/427 211/1281/427 +f 212/1282/428 209/1283/428 216/1284/428 +f 217/1285/429 220/1286/429 218/1287/429 +f 220/1288/430 222/1289/430 221/1290/430 +f 222/1291/431 224/1292/431 223/1293/431 +f 224/1294/432 217/1295/432 219/1296/432 +f 221/1297/433 223/1298/433 219/1299/433 +f 220/1300/434 217/1301/434 224/1302/434 +f 225/1303/435 228/1304/435 226/1305/435 +f 228/1306/436 230/1307/436 229/1308/436 +f 230/1309/437 232/1310/437 231/1311/437 +f 232/1312/438 225/1313/438 227/1314/438 +f 229/1315/439 231/1316/439 227/1317/439 +f 228/1318/440 225/1319/440 232/1320/440 +f 233/1321/441 236/1322/441 234/1323/441 +f 236/1324/442 238/1325/442 237/1326/442 +f 238/1327/443 240/1328/443 239/1329/443 +f 240/1330/444 233/1331/444 235/1332/444 +f 237/1333/445 239/1334/445 235/1335/445 +f 236/1336/446 233/1337/446 240/1338/446 +f 241/1339/447 244/1340/447 242/1341/447 +f 244/1342/448 246/1343/448 245/1344/448 +f 246/1345/449 248/1346/449 247/1347/449 +f 248/1348/450 241/1349/450 243/1350/450 +f 245/1351/451 247/1352/451 243/1353/451 +f 244/1354/452 241/1355/452 248/1356/452 +f 249/1357/453 252/1358/453 250/1359/453 +f 252/1360/454 256/1361/454 253/1362/454 +f 253/1363/455 256/1364/455 254/1365/455 +f 254/1366/456 249/1367/456 251/1368/456 +f 253/1369/457 255/1370/457 251/1371/457 +f 252/1372/458 249/1373/458 254/1374/458 +f 257/1375/459 260/1376/459 258/1377/459 +f 260/1378/460 264/1379/460 261/1380/460 +f 261/1381/461 264/1382/461 262/1383/461 +f 262/1384/462 257/1385/462 259/1386/462 +f 261/1387/463 263/1388/463 259/1389/463 +f 260/1390/464 257/1391/464 262/1392/464 +f 265/1393/465 268/1394/465 266/1395/465 +f 268/1396/466 272/1397/466 269/1398/466 +f 269/1399/467 272/1400/467 270/1401/467 +f 270/1402/468 265/1403/468 267/1404/468 +f 269/1405/469 271/1406/469 267/1407/469 +f 268/1408/470 265/1409/470 270/1410/470 +f 273/1411/471 276/1412/471 274/1413/471 +f 276/1414/472 280/1415/472 277/1416/472 +f 277/1417/473 280/1418/473 278/1419/473 +f 278/1420/474 273/1421/474 275/1422/474 +f 277/1423/475 279/1424/475 275/1425/475 +f 276/1426/476 273/1427/476 278/1428/476 +f 281/1429/477 284/1430/477 282/1431/477 +f 284/1432/478 288/1433/478 285/1434/478 +f 285/1435/479 288/1436/479 286/1437/479 +f 286/1438/480 281/1439/480 283/1440/480 +f 285/1441/481 287/1442/481 283/1443/481 +f 284/1444/482 281/1445/482 286/1446/482 +f 289/1447/483 292/1448/483 290/1449/483 +f 292/1450/484 296/1451/484 293/1452/484 +f 293/1453/485 296/1454/485 294/1455/485 +f 294/1456/486 289/1457/486 291/1458/486 +f 293/1459/487 295/1460/487 291/1461/487 +f 292/1462/488 289/1463/488 294/1464/488 +f 297/1465/489 300/1466/489 298/1467/489 +f 300/1468/490 304/1469/490 301/1470/490 +f 301/1471/491 304/1472/491 302/1473/491 +f 302/1474/492 297/1475/492 299/1476/492 +f 301/1477/493 303/1478/493 299/1479/493 +f 300/1480/494 297/1481/494 302/1482/494 +f 305/1483/495 308/1484/495 306/1485/495 +f 308/1486/496 312/1487/496 309/1488/496 +f 309/1489/497 312/1490/497 310/1491/497 +f 310/1492/498 305/1493/498 307/1494/498 +f 309/1495/499 311/1496/499 307/1497/499 +f 308/1498/500 305/1499/500 310/1500/500 +f 313/1501/501 316/1502/501 314/1503/501 +f 316/1504/502 320/1505/502 317/1506/502 +f 317/1507/503 320/1508/503 318/1509/503 +f 318/1510/504 313/1511/504 315/1512/504 +f 317/1513/505 319/1514/505 315/1515/505 +f 316/1516/506 313/1517/506 318/1518/506 +f 321/1519/507 324/1520/507 322/1521/507 +f 324/1522/508 328/1523/508 325/1524/508 +f 325/1525/509 328/1526/509 326/1527/509 +f 326/1528/510 321/1529/510 323/1530/510 +f 325/1531/511 327/1532/511 323/1533/511 +f 324/1534/512 321/1535/512 326/1536/512 +f 329/1537/513 332/1538/513 330/1539/513 +f 332/1540/514 336/1541/514 333/1542/514 +f 333/1543/515 336/1544/515 334/1545/515 +f 334/1546/516 329/1547/516 331/1548/516 +f 333/1549/517 335/1550/517 331/1551/517 +f 332/1552/518 329/1553/518 334/1554/518 +f 337/1555/519 340/1556/519 338/1557/519 +f 340/1558/520 344/1559/520 341/1560/520 +f 341/1561/521 344/1562/521 342/1563/521 +f 342/1564/522 337/1565/522 339/1566/522 +f 338/1567/523 341/1568/523 343/1569/523 +f 340/1570/524 337/1571/524 342/1572/524 +o DoorBot +v 0.0625 1.5625 -1.4375 +v 0 1.5625 -0.5 +v 0.0625 1.5625 -0.5 +v 0 1.5625 -1.4375 +v 0 1.4375 -0.5 +v 0 1.4375 -1.4375 +v 0.0625 1.4375 -0.5 +v 0.0625 1.4375 -1.4375 +v 0.125 1.5625 1.4375 +v 0 1.5625 1.5 +v 0.125 1.5625 1.5 +v 0 1.5625 1.4375 +v 0 0.0625 1.5 +v 0 0.0625 1.4375 +v 0.125 0.0625 1.5 +v 0.125 1.46875 1.4375 +v 0.125 1.5625 -1.5 +v 0 1.5625 -1.4375 +v 0.125 1.5625 -1.4375 +v 0 1.5625 -1.5 +v 0 0.0625 -1.4375 +v 0 0.0625 -1.5 +v 0.125 0.0625 -1.4375 +v 0.125 1.46875 -1.5 +v 0.125 1.5625 -0.5 +v 0 1.5625 -0.4375 +v 0.125 1.5625 -0.4375 +v 0 1.5625 -0.5 +v 0 0.0625 -0.4375 +v 0 0.0625 -0.5 +v 0.125 0.0625 -0.4375 +v 0.125 0.15625 -0.5 +v 0.0625 0.125 -1.4375 +v 0 0.125 -0.5 +v 0.0625 0.125 -0.5 +v 0 0.125 -1.4375 +v 0 0.0625 -0.5 +v 0 0.0625 -1.4375 +v 0.0625 0.0625 -0.5 +v 0.0625 0.0625 -1.4375 +v 0.125 1.5625 0.4375 +v 0 1.5625 0.5 +v 0.125 1.5625 0.5 +v 0 1.5625 0.4375 +v 0 0.0625 0.5 +v 0 0.0625 0.4375 +v 0.125 0.0625 0.5 +v 0.125 0.15625 0.4375 +v 0.0625 0.25 -1.4375 +v 0 0.25 -0.5 +v 0.0625 0.25 -0.5 +v 0 0.25 -1.4375 +v 0 0.1875 -0.5 +v 0 0.1875 -1.4375 +v 0.0625 0.1875 -0.5 +v 0.0625 0.1875 -1.4375 +v 0.0625 0.375 -1.4375 +v 0 0.375 -0.5 +v 0.0625 0.375 -0.5 +v 0 0.375 -1.4375 +v 0 0.3125 -0.5 +v 0 0.3125 -1.4375 +v 0.0625 0.3125 -0.5 +v 0.0625 0.3125 -1.4375 +v 0.0625 0.5 -1.4375 +v 0 0.5 -0.5 +v 0.0625 0.5 -0.5 +v 0 0.5 -1.4375 +v 0 0.4375 -0.5 +v 0 0.4375 -1.4375 +v 0.0625 0.4375 -0.5 +v 0.0625 0.4375 -1.4375 +v 0.0625 0.625 -1.4375 +v 0 0.625 -0.5 +v 0.0625 0.625 -0.5 +v 0 0.625 -1.4375 +v 0 0.5625 -0.5 +v 0 0.5625 -1.4375 +v 0.0625 0.5625 -0.5 +v 0.0625 0.5625 -1.4375 +v 0.0625 0.75 -1.4375 +v 0 0.75 -0.5 +v 0.0625 0.75 -0.5 +v 0 0.75 -1.4375 +v 0 0.6875 -0.5 +v 0 0.6875 -1.4375 +v 0.0625 0.6875 -0.5 +v 0.0625 0.6875 -1.4375 +v 0.0625 0.875 -1.4375 +v 0 0.875 -0.5 +v 0.0625 0.875 -0.5 +v 0 0.875 -1.4375 +v 0 0.8125 -0.5 +v 0 0.8125 -1.4375 +v 0.0625 0.8125 -0.5 +v 0.0625 0.8125 -1.4375 +v 0.0625 1 -1.4375 +v 0 1 -0.5 +v 0.0625 1 -0.5 +v 0 1 -1.4375 +v 0 0.9375 -0.5 +v 0 0.9375 -1.4375 +v 0.0625 0.9375 -0.5 +v 0.0625 0.9375 -1.4375 +v 0.0625 1.125 -1.4375 +v 0 1.125 -0.5 +v 0.0625 1.125 -0.5 +v 0 1.125 -1.4375 +v 0 1.0625 -0.5 +v 0 1.0625 -1.4375 +v 0.0625 1.0625 -0.5 +v 0.0625 1.0625 -1.4375 +v 0.0625 1.25 -1.4375 +v 0 1.25 -0.5 +v 0.0625 1.25 -0.5 +v 0 1.25 -1.4375 +v 0 1.1875 -0.5 +v 0 1.1875 -1.4375 +v 0.0625 1.1875 -0.5 +v 0.0625 1.1875 -1.4375 +v 0.0625 1.375 -1.4375 +v 0 1.375 -0.5 +v 0.0625 1.375 -0.5 +v 0 1.375 -1.4375 +v 0 1.3125 -0.5 +v 0 1.3125 -1.4375 +v 0.0625 1.3125 -0.5 +v 0.0625 1.3125 -1.4375 +v 0.0625 1.5625 -0.4375 +v 0 1.5625 0.4375 +v 0.0625 1.5625 0.4375 +v 0 1.5625 -0.4375 +v 0 1.4375 0.4375 +v 0 1.4375 -0.4375 +v 0.0625 1.4375 0.4375 +v 0.0625 1.4375 -0.4375 +v 0.0625 1.375 -0.4375 +v 0 1.375 0.4375 +v 0.0625 1.375 0.4375 +v 0 1.375 -0.4375 +v 0 1.3125 0.4375 +v 0 1.3125 -0.4375 +v 0.0625 1.3125 0.4375 +v 0.0625 1.3125 -0.4375 +v 0.0625 1.25 -0.4375 +v 0 1.25 0.4375 +v 0.0625 1.25 0.4375 +v 0 1.25 -0.4375 +v 0 1.1875 0.4375 +v 0 1.1875 -0.4375 +v 0.0625 1.1875 0.4375 +v 0.0625 1.1875 -0.4375 +v 0.0625 1.125 -0.4375 +v 0 1.125 0.4375 +v 0.0625 1.125 0.4375 +v 0 1.125 -0.4375 +v 0 1.0625 0.4375 +v 0 1.0625 -0.4375 +v 0.0625 1.0625 0.4375 +v 0.0625 1.0625 -0.4375 +v 0.0625 1 -0.4375 +v 0 1 0.4375 +v 0.0625 1 0.4375 +v 0 1 -0.4375 +v 0 0.9375 0.4375 +v 0 0.9375 -0.4375 +v 0.0625 0.9375 0.4375 +v 0.0625 0.9375 -0.4375 +v 0.0625 0.875 -0.4375 +v 0 0.875 0.4375 +v 0.0625 0.875 0.4375 +v 0 0.875 -0.4375 +v 0 0.8125 0.4375 +v 0 0.8125 -0.4375 +v 0.0625 0.8125 0.4375 +v 0.0625 0.8125 -0.4375 +v 0.0625 0.75 -0.4375 +v 0 0.75 0.4375 +v 0.0625 0.75 0.4375 +v 0 0.75 -0.4375 +v 0 0.6875 0.4375 +v 0 0.6875 -0.4375 +v 0.0625 0.6875 0.4375 +v 0.0625 0.6875 -0.4375 +v 0.0625 0.625 -0.4375 +v 0 0.625 0.4375 +v 0.0625 0.625 0.4375 +v 0 0.625 -0.4375 +v 0 0.5625 0.4375 +v 0 0.5625 -0.4375 +v 0.0625 0.5625 0.4375 +v 0.0625 0.5625 -0.4375 +v 0.0625 0.5 -0.4375 +v 0 0.5 0.4375 +v 0.0625 0.5 0.4375 +v 0 0.5 -0.4375 +v 0 0.4375 0.4375 +v 0 0.4375 -0.4375 +v 0.0625 0.4375 0.4375 +v 0.0625 0.4375 -0.4375 +v 0.0625 0.375 -0.4375 +v 0 0.375 0.4375 +v 0.0625 0.375 0.4375 +v 0 0.375 -0.4375 +v 0 0.3125 0.4375 +v 0 0.3125 -0.4375 +v 0.0625 0.3125 0.4375 +v 0.0625 0.3125 -0.4375 +v 0.0625 0.25 -0.4375 +v 0 0.25 0.4375 +v 0.0625 0.25 0.4375 +v 0 0.25 -0.4375 +v 0 0.1875 0.4375 +v 0 0.1875 -0.4375 +v 0.0625 0.1875 0.4375 +v 0.0625 0.1875 -0.4375 +v 0.0625 0.125 0.5 +v 0 0.125 1.4375 +v 0.0625 0.125 1.4375 +v 0 0.125 0.5 +v 0 0.0625 1.4375 +v 0 0.0625 0.5 +v 0.0625 0.0625 1.4375 +v 0.0625 0.0625 0.5 +v 0.0625 0.25 0.5 +v 0 0.25 1.4375 +v 0.0625 0.25 1.4375 +v 0 0.25 0.5 +v 0 0.1875 1.4375 +v 0 0.1875 0.5 +v 0.0625 0.1875 1.4375 +v 0.0625 0.1875 0.5 +v 0.0625 0.375 0.5 +v 0 0.375 1.4375 +v 0.0625 0.375 1.4375 +v 0 0.375 0.5 +v 0 0.3125 1.4375 +v 0 0.3125 0.5 +v 0.0625 0.3125 1.4375 +v 0.0625 0.3125 0.5 +v 0.0625 0.5 0.5 +v 0 0.5 1.4375 +v 0.0625 0.5 1.4375 +v 0 0.5 0.5 +v 0 0.4375 1.4375 +v 0 0.4375 0.5 +v 0.0625 0.4375 1.4375 +v 0.0625 0.4375 0.5 +v 0.0625 0.625 0.5 +v 0 0.625 1.4375 +v 0.0625 0.625 1.4375 +v 0 0.625 0.5 +v 0 0.5625 1.4375 +v 0 0.5625 0.5 +v 0.0625 0.5625 1.4375 +v 0.0625 0.5625 0.5 +v 0.0625 0.75 0.5 +v 0 0.75 1.4375 +v 0.0625 0.75 1.4375 +v 0 0.75 0.5 +v 0 0.6875 1.4375 +v 0 0.6875 0.5 +v 0.0625 0.6875 1.4375 +v 0.0625 0.6875 0.5 +v 0.0625 0.875 0.5 +v 0 0.875 1.4375 +v 0.0625 0.875 1.4375 +v 0 0.875 0.5 +v 0 0.8125 1.4375 +v 0 0.8125 0.5 +v 0.0625 0.8125 1.4375 +v 0.0625 0.8125 0.5 +v 0.0625 1 0.5 +v 0 1 1.4375 +v 0.0625 1 1.4375 +v 0 1 0.5 +v 0 0.9375 1.4375 +v 0 0.9375 0.5 +v 0.0625 0.9375 1.4375 +v 0.0625 0.9375 0.5 +v 0.0625 1.125 0.5 +v 0 1.125 1.4375 +v 0.0625 1.125 1.4375 +v 0 1.125 0.5 +v 0 1.0625 1.4375 +v 0 1.0625 0.5 +v 0.0625 1.0625 1.4375 +v 0.0625 1.0625 0.5 +v 0.0625 1.25 0.5 +v 0 1.25 1.4375 +v 0.0625 1.25 1.4375 +v 0 1.25 0.5 +v 0 1.1875 1.4375 +v 0 1.1875 0.5 +v 0.0625 1.1875 1.4375 +v 0.0625 1.1875 0.5 +v 0.0625 1.375 0.5 +v 0 1.375 1.4375 +v 0.0625 1.375 1.4375 +v 0 1.375 0.5 +v 0 1.3125 1.4375 +v 0 1.3125 0.5 +v 0.0625 1.3125 1.4375 +v 0.0625 1.3125 0.5 +v 0.0625 1.5625 0.5 +v 0 1.5625 1.4375 +v 0.0625 1.5625 1.4375 +v 0 1.5625 0.5 +v 0 1.4375 1.4375 +v 0 1.4375 0.5 +v 0.0625 1.4375 1.4375 +v 0.0625 1.4375 0.5 +v 0.0625 0.125 -0.4375 +v 0 0.125 0.4375 +v 0.0625 0.125 0.4375 +v 0 0.125 -0.4375 +v 0 0.0625 0.4375 +v 0 0.0625 -0.4375 +v 0.0625 0.0625 0.4375 +v 0.0625 0.0625 -0.4375 +v 0.125 0.0625 1.4375 +v 0.125 0.0625 -1.5 +v 0.125 0.0625 -0.5 +v 0.125 0.0625 0.4375 +vt 0.4765625 0.3671875 +vt 0.46875 0.25 +vt 0.4765625 0.25 +vt 0.390625 0.8046875 +vt 0.5078125 0.7890625 +vt 0.5078125 0.8046875 +vt 0.609375 0.25 +vt 0.6171875 0.3671875 +vt 0.609375 0.3671875 +vt 0.5078125 0.765625 +vt 0.390625 0.78125 +vt 0.390625 0.765625 +vt 0.8671875 0.453125 +vt 0.875 0.46875 +vt 0.8671875 0.46875 +vt 0.7421875 0.1328125 +vt 0.734375 0.1171875 +vt 0.7421875 0.1171875 +vt 0.8828125 0.609375 +vt 0.8671875 0.6015625 +vt 0.8828125 0.6015625 +vt 0.0625 0.59375 +vt 0.0703125 0.40625 +vt 0.0703125 0.59375 +vt 0.859375 0.125 +vt 0.875 0.1328125 +vt 0.859375 0.1328125 +vt 0.0859375 0.58203125 +vt 0.0859375 0.59375 +vt 0.078125 0.59375 +vt 0.25 0.6796875 +vt 0.265625 0.4921875 +vt 0.265625 0.6796875 +vt 0.2890625 0.6796875 +vt 0.2734375 0.6796875 +vt 0.2734375 0.66796875 +vt 0.890625 0.71875 +vt 0.875 0.7109375 +vt 0.890625 0.7109375 +vt 0.09375 0.59375 +vt 0.1015625 0.40625 +vt 0.1015625 0.59375 +vt 0.875 0.6953125 +vt 0.890625 0.703125 +vt 0.875 0.703125 +vt 0.1171875 0.58203125 +vt 0.1171875 0.59375 +vt 0.109375 0.59375 +vt 0.296875 0.6796875 +vt 0.3125 0.4921875 +vt 0.3125 0.6796875 +vt 0.3359375 0.6796875 +vt 0.3203125 0.6796875 +vt 0.3203125 0.66796875 +vt 0.890625 0.6875 +vt 0.875 0.6796875 +vt 0.890625 0.6796875 +vt 0.40625 0.6171875 +vt 0.4140625 0.4296875 +vt 0.4140625 0.6171875 +vt 0.875 0.6640625 +vt 0.890625 0.671875 +vt 0.875 0.671875 +vt 0.4296875 0.44140625 +vt 0.4296875 0.6171875 +vt 0.421875 0.6171875 +vt 0.34375 0.875 +vt 0.359375 0.6875 +vt 0.359375 0.875 +vt 0.359375 0.6796875 +vt 0.34375 0.6796875 +vt 0.34375 0.50390625 +vt 0.6328125 0.3671875 +vt 0.625 0.25 +vt 0.6328125 0.25 +vt 0.6328125 0.703125 +vt 0.75 0.6953125 +vt 0.75 0.703125 +vt 0.203125 0.2421875 +vt 0.2109375 0.359375 +vt 0.203125 0.359375 +vt 0.75 0.6796875 +vt 0.6328125 0.6875 +vt 0.6328125 0.6796875 +vt 0.25 0.09375 +vt 0.2578125 0.1015625 +vt 0.25 0.1015625 +vt 0.90625 0.75 +vt 0.8984375 0.7421875 +vt 0.90625 0.7421875 +vt 0.890625 0.65625 +vt 0.875 0.6484375 +vt 0.890625 0.6484375 +vt 0.4375 0.6171875 +vt 0.4453125 0.4296875 +vt 0.4453125 0.6171875 +vt 0.875 0.6328125 +vt 0.890625 0.640625 +vt 0.875 0.640625 +vt 0.4609375 0.44140625 +vt 0.4609375 0.6171875 +vt 0.453125 0.6171875 +vt 0.3671875 0.875 +vt 0.3828125 0.6875 +vt 0.3828125 0.875 +vt 0.3828125 0.6796875 +vt 0.3671875 0.6796875 +vt 0.3671875 0.50390625 +vt 0.2265625 0.359375 +vt 0.21875 0.2421875 +vt 0.2265625 0.2421875 +vt 0.6328125 0.671875 +vt 0.75 0.6640625 +vt 0.75 0.671875 +vt 0.234375 0.2421875 +vt 0.2421875 0.359375 +vt 0.234375 0.359375 +vt 0.75 0.6484375 +vt 0.6328125 0.65625 +vt 0.6328125 0.6484375 +vt 0.265625 0.09375 +vt 0.2734375 0.1015625 +vt 0.265625 0.1015625 +vt 0.90625 0.734375 +vt 0.8984375 0.7265625 +vt 0.90625 0.7265625 +vt 0.2578125 0.359375 +vt 0.25 0.2421875 +vt 0.2578125 0.2421875 +vt 0.6328125 0.640625 +vt 0.75 0.6328125 +vt 0.75 0.640625 +vt 0.265625 0.2421875 +vt 0.2734375 0.359375 +vt 0.265625 0.359375 +vt 0.7578125 0.7421875 +vt 0.640625 0.75 +vt 0.640625 0.7421875 +vt 0.28125 0.09375 +vt 0.2890625 0.1015625 +vt 0.28125 0.1015625 +vt 0.90625 0.71875 +vt 0.8984375 0.7109375 +vt 0.90625 0.7109375 +vt 0.2890625 0.359375 +vt 0.28125 0.2421875 +vt 0.2890625 0.2421875 +vt 0.640625 0.734375 +vt 0.7578125 0.7265625 +vt 0.7578125 0.734375 +vt 0.296875 0.2421875 +vt 0.3046875 0.359375 +vt 0.296875 0.359375 +vt 0.7578125 0.578125 +vt 0.640625 0.5859375 +vt 0.640625 0.578125 +vt 0.296875 0.09375 +vt 0.3046875 0.1015625 +vt 0.296875 0.1015625 +vt 0.90625 0.703125 +vt 0.8984375 0.6953125 +vt 0.90625 0.6953125 +vt 0.3203125 0.359375 +vt 0.3125 0.2421875 +vt 0.3203125 0.2421875 +vt 0.640625 0.5703125 +vt 0.7578125 0.5625 +vt 0.7578125 0.5703125 +vt 0.328125 0.2421875 +vt 0.3359375 0.359375 +vt 0.328125 0.359375 +vt 0.7578125 0.546875 +vt 0.640625 0.5546875 +vt 0.640625 0.546875 +vt 0.3125 0.09375 +vt 0.3203125 0.1015625 +vt 0.3125 0.1015625 +vt 0.90625 0.6875 +vt 0.8984375 0.6796875 +vt 0.90625 0.6796875 +vt 0.3515625 0.359375 +vt 0.34375 0.2421875 +vt 0.3515625 0.2421875 +vt 0.640625 0.5390625 +vt 0.7578125 0.53125 +vt 0.7578125 0.5390625 +vt 0.359375 0.2421875 +vt 0.3671875 0.359375 +vt 0.359375 0.359375 +vt 0.7578125 0.515625 +vt 0.640625 0.5234375 +vt 0.640625 0.515625 +vt 0.328125 0.09375 +vt 0.3359375 0.1015625 +vt 0.328125 0.1015625 +vt 0.90625 0.671875 +vt 0.8984375 0.6640625 +vt 0.90625 0.6640625 +vt 0.3828125 0.359375 +vt 0.375 0.2421875 +vt 0.3828125 0.2421875 +vt 0.640625 0.5078125 +vt 0.7578125 0.5 +vt 0.7578125 0.5078125 +vt 0.640625 0.25 +vt 0.6484375 0.3671875 +vt 0.640625 0.3671875 +vt 0.7578125 0.484375 +vt 0.640625 0.4921875 +vt 0.640625 0.484375 +vt 0.34375 0.09375 +vt 0.3515625 0.1015625 +vt 0.34375 0.1015625 +vt 0.90625 0.65625 +vt 0.8984375 0.6484375 +vt 0.90625 0.6484375 +vt 0.4921875 0.3515625 +vt 0.484375 0.234375 +vt 0.4921875 0.234375 +vt 0.640625 0.4765625 +vt 0.7578125 0.46875 +vt 0.7578125 0.4765625 +vt 0.65625 0.25 +vt 0.6640625 0.3671875 +vt 0.65625 0.3671875 +vt 0.7890625 0.359375 +vt 0.671875 0.3671875 +vt 0.671875 0.359375 +vt 0.359375 0.09375 +vt 0.3671875 0.1015625 +vt 0.359375 0.1015625 +vt 0.90625 0.640625 +vt 0.8984375 0.6328125 +vt 0.90625 0.6328125 +vt 0.6796875 0.3515625 +vt 0.671875 0.234375 +vt 0.6796875 0.234375 +vt 0.6796875 1 +vt 0.796875 0.9921875 +vt 0.796875 1 +vt 0.5 0.203125 +vt 0.5078125 0.3203125 +vt 0.5 0.3203125 +vt 0.796875 0.9765625 +vt 0.6796875 0.984375 +vt 0.6796875 0.9765625 +vt 0.375 0.09375 +vt 0.3828125 0.1015625 +vt 0.375 0.1015625 +vt 0.90625 0.59375 +vt 0.8984375 0.5859375 +vt 0.90625 0.5859375 +vt 0.5234375 0.3203125 +vt 0.515625 0.203125 +vt 0.5234375 0.203125 +vt 0.6796875 0.96875 +vt 0.796875 0.9609375 +vt 0.796875 0.96875 +vt 0.53125 0.203125 +vt 0.5390625 0.3203125 +vt 0.53125 0.3203125 +vt 0.796875 0.9453125 +vt 0.6796875 0.953125 +vt 0.6796875 0.9453125 +vt 0.8984375 0.5703125 +vt 0.90625 0.578125 +vt 0.8984375 0.578125 +vt 0.90625 0.5625 +vt 0.8984375 0.5546875 +vt 0.90625 0.5546875 +vt 0.5546875 0.3203125 +vt 0.546875 0.203125 +vt 0.5546875 0.203125 +vt 0.6796875 0.9375 +vt 0.796875 0.9296875 +vt 0.796875 0.9375 +vt 0.5625 0.203125 +vt 0.5703125 0.3203125 +vt 0.5625 0.3203125 +vt 0.796875 0.9140625 +vt 0.6796875 0.921875 +vt 0.6796875 0.9140625 +vt 0.8984375 0.5390625 +vt 0.90625 0.546875 +vt 0.8984375 0.546875 +vt 0.4765625 0.1015625 +vt 0.46875 0.09375 +vt 0.4765625 0.09375 +vt 0.5078125 0.1953125 +vt 0.5 0.0859375 +vt 0.5078125 0.0859375 +vt 0.390625 0.6640625 +vt 0.5 0.6484375 +vt 0.5 0.6640625 +vt 0.515625 0.0859375 +vt 0.5234375 0.1953125 +vt 0.515625 0.1953125 +vt 0.5 0.625 +vt 0.390625 0.640625 +vt 0.390625 0.625 +vt 0.109375 0.109375 +vt 0.1171875 0.125 +vt 0.109375 0.125 +vt 0.4765625 0.125 +vt 0.46875 0.109375 +vt 0.4765625 0.109375 +vt 0.5390625 0.1953125 +vt 0.53125 0.0859375 +vt 0.5390625 0.0859375 +vt 0.8046875 0.984375 +vt 0.9140625 0.9765625 +vt 0.9140625 0.984375 +vt 0.546875 0.0859375 +vt 0.5546875 0.1953125 +vt 0.546875 0.1953125 +vt 0.9140625 0.9609375 +vt 0.8046875 0.96875 +vt 0.8046875 0.9609375 +vt 0.8984375 0.5234375 +vt 0.90625 0.53125 +vt 0.8984375 0.53125 +vt 0.90625 0.515625 +vt 0.8984375 0.5078125 +vt 0.90625 0.5078125 +vt 0.5703125 0.1953125 +vt 0.5625 0.0859375 +vt 0.5703125 0.0859375 +vt 0.8046875 0.953125 +vt 0.9140625 0.9453125 +vt 0.9140625 0.953125 +vt 0.703125 0.0859375 +vt 0.7109375 0.1953125 +vt 0.703125 0.1953125 +vt 0.9140625 0.9296875 +vt 0.8046875 0.9375 +vt 0.8046875 0.9296875 +vt 0.8984375 0.4921875 +vt 0.90625 0.5 +vt 0.8984375 0.5 +vt 0.90625 0.484375 +vt 0.8984375 0.4765625 +vt 0.90625 0.4765625 +vt 0.7265625 0.1953125 +vt 0.71875 0.0859375 +vt 0.7265625 0.0859375 +vt 0.8046875 0.921875 +vt 0.9140625 0.9140625 +vt 0.9140625 0.921875 +vt 0.8125 0.1171875 +vt 0.8203125 0.2265625 +vt 0.8125 0.2265625 +vt 0.9375 0.8671875 +vt 0.828125 0.875 +vt 0.828125 0.8671875 +vt 0.8984375 0.4609375 +vt 0.90625 0.46875 +vt 0.8984375 0.46875 +vt 0.6171875 0.1015625 +vt 0.609375 0.09375 +vt 0.6171875 0.09375 +vt 0.5859375 0.1796875 +vt 0.578125 0.0703125 +vt 0.5859375 0.0703125 +vt 0.828125 0.859375 +vt 0.9375 0.8515625 +vt 0.9375 0.859375 +vt 0.59375 0.0703125 +vt 0.6015625 0.1796875 +vt 0.59375 0.1796875 +vt 0.9375 0.8359375 +vt 0.828125 0.84375 +vt 0.828125 0.8359375 +vt 0.625 0.09375 +vt 0.6328125 0.1015625 +vt 0.625 0.1015625 +vt 0.90625 0.3046875 +vt 0.8984375 0.296875 +vt 0.90625 0.296875 +vt 0.1328125 0.171875 +vt 0.125 0.0625 +vt 0.1328125 0.0625 +vt 0.828125 0.828125 +vt 0.9375 0.8203125 +vt 0.9375 0.828125 +vt 0.140625 0.0625 +vt 0.1484375 0.171875 +vt 0.140625 0.171875 +vt 0.9375 0.8046875 +vt 0.828125 0.8125 +vt 0.828125 0.8046875 +vt 0.8984375 0.25 +vt 0.90625 0.2578125 +vt 0.8984375 0.2578125 +vt 0.7578125 0.1015625 +vt 0.75 0.09375 +vt 0.7578125 0.09375 +vt 0.1640625 0.171875 +vt 0.15625 0.0625 +vt 0.1640625 0.0625 +vt 0.828125 0.796875 +vt 0.9375 0.7890625 +vt 0.9375 0.796875 +vt 0.390625 0.0625 +vt 0.3984375 0.171875 +vt 0.390625 0.171875 +vt 0.9375 0.7734375 +vt 0.828125 0.78125 +vt 0.828125 0.7734375 +vt 0.8984375 0.234375 +vt 0.90625 0.2421875 +vt 0.8984375 0.2421875 +vt 0.7734375 0.1015625 +vt 0.765625 0.09375 +vt 0.7734375 0.09375 +vt 0.4140625 0.171875 +vt 0.40625 0.0625 +vt 0.4140625 0.0625 +vt 0.828125 0.765625 +vt 0.9375 0.7578125 +vt 0.9375 0.765625 +vt 0.421875 0.0625 +vt 0.4296875 0.171875 +vt 0.421875 0.171875 +vt 0.9375 0.4375 +vt 0.828125 0.4453125 +vt 0.828125 0.4375 +vt 0.8984375 0.21875 +vt 0.90625 0.2265625 +vt 0.8984375 0.2265625 +vt 0.90625 0.2109375 +vt 0.8984375 0.203125 +vt 0.90625 0.203125 +vt 0.4453125 0.171875 +vt 0.4375 0.0625 +vt 0.4453125 0.0625 +vt 0.828125 0.3515625 +vt 0.9375 0.34375 +vt 0.9375 0.3515625 +vt 0.453125 0.0625 +vt 0.4609375 0.171875 +vt 0.453125 0.171875 +vt 0.9375 0.328125 +vt 0.828125 0.3359375 +vt 0.828125 0.328125 +vt 0.8984375 0.1875 +vt 0.90625 0.1953125 +vt 0.8984375 0.1953125 +vt 0.90625 0.1796875 +vt 0.8984375 0.171875 +vt 0.90625 0.171875 +vt 0.8359375 0.2265625 +vt 0.828125 0.1171875 +vt 0.8359375 0.1171875 +vt 0.8359375 0.90625 +vt 0.9453125 0.8984375 +vt 0.9453125 0.90625 +vt 0.84375 0.1171875 +vt 0.8515625 0.2265625 +vt 0.84375 0.2265625 +vt 0.9453125 0.8828125 +vt 0.8359375 0.890625 +vt 0.8359375 0.8828125 +vt 0.8984375 0.15625 +vt 0.90625 0.1640625 +vt 0.8984375 0.1640625 +vt 0.90625 0.1484375 +vt 0.8984375 0.140625 +vt 0.90625 0.140625 +vt 0.0078125 0.1484375 +vt 0 0.0390625 +vt 0.0078125 0.0390625 +vt 0.859375 0.625 +vt 0.96875 0.6171875 +vt 0.96875 0.625 +vt 0.015625 0.0390625 +vt 0.0234375 0.1484375 +vt 0.015625 0.1484375 +vt 0.96875 0.421875 +vt 0.859375 0.4296875 +vt 0.859375 0.421875 +vt 0.859375 0.09375 +vt 0.8671875 0.1015625 +vt 0.859375 0.1015625 +vt 0.90625 0.1328125 +vt 0.8984375 0.125 +vt 0.90625 0.125 +vt 0.6953125 0.3515625 +vt 0.6875 0.234375 +vt 0.6953125 0.234375 +vt 0.703125 0.875 +vt 0.8203125 0.8671875 +vt 0.8203125 0.875 +vt 0.578125 0.1875 +vt 0.5859375 0.3046875 +vt 0.578125 0.3046875 +vt 0.8203125 0.8515625 +vt 0.703125 0.859375 +vt 0.703125 0.8515625 +vt 0.875 0.09375 +vt 0.8828125 0.1015625 +vt 0.875 0.1015625 +vt 0.8984375 0.1015625 +vt 0.890625 0.09375 +vt 0.8984375 0.09375 +vt 0.6015625 0.3046875 +vt 0.59375 0.1875 +vt 0.6015625 0.1875 +vt 0.703125 0.84375 +vt 0.8203125 0.8359375 +vt 0.8203125 0.84375 +vt 0.125 0.1796875 +vt 0.1328125 0.296875 +vt 0.125 0.296875 +vt 0.8203125 0.8203125 +vt 0.703125 0.828125 +vt 0.703125 0.8203125 +vt 0.171875 0.0859375 +vt 0.1796875 0.09375 +vt 0.171875 0.09375 +vt 0.1953125 0.09375 +vt 0.1875 0.0859375 +vt 0.1953125 0.0859375 +vt 0.1484375 0.296875 +vt 0.140625 0.1796875 +vt 0.1484375 0.1796875 +vt 0.703125 0.8125 +vt 0.8203125 0.8046875 +vt 0.8203125 0.8125 +vt 0.15625 0.1796875 +vt 0.1640625 0.296875 +vt 0.15625 0.296875 +vt 0.8203125 0.7890625 +vt 0.703125 0.796875 +vt 0.703125 0.7890625 +vt 0.90625 0.6015625 +vt 0.9140625 0.609375 +vt 0.90625 0.609375 +vt 0.4921875 0.09375 +vt 0.484375 0.0859375 +vt 0.4921875 0.0859375 +vt 0.3984375 0.296875 +vt 0.390625 0.1796875 +vt 0.3984375 0.1796875 +vt 0.703125 0.78125 +vt 0.8203125 0.7734375 +vt 0.8203125 0.78125 +vt 0.40625 0.1796875 +vt 0.4140625 0.296875 +vt 0.40625 0.296875 +vt 0.8203125 0.7578125 +vt 0.703125 0.765625 +vt 0.703125 0.7578125 +vt 0.640625 0.0859375 +vt 0.6484375 0.09375 +vt 0.640625 0.09375 +vt 0.6640625 0.09375 +vt 0.65625 0.0859375 +vt 0.6640625 0.0859375 +vt 0.4296875 0.296875 +vt 0.421875 0.1796875 +vt 0.4296875 0.1796875 +vt 0.703125 0.4453125 +vt 0.8203125 0.4375 +vt 0.8203125 0.4453125 +vt 0.4375 0.1796875 +vt 0.4453125 0.296875 +vt 0.4375 0.296875 +vt 0.8203125 0.34375 +vt 0.703125 0.3515625 +vt 0.703125 0.34375 +vt 0.671875 0.0859375 +vt 0.6796875 0.09375 +vt 0.671875 0.09375 +vt 0.6953125 0.09375 +vt 0.6875 0.0859375 +vt 0.6953125 0.0859375 +vt 0.4609375 0.296875 +vt 0.453125 0.1796875 +vt 0.4609375 0.1796875 +vt 0.703125 0.3359375 +vt 0.8203125 0.328125 +vt 0.8203125 0.3359375 +vt 0.703125 0.203125 +vt 0.7109375 0.3203125 +vt 0.703125 0.3203125 +vt 0.828125 0.8984375 +vt 0.7109375 0.90625 +vt 0.7109375 0.8984375 +vt 0.90625 0.28125 +vt 0.9140625 0.2890625 +vt 0.90625 0.2890625 +vt 0.9140625 0.2734375 +vt 0.90625 0.265625 +vt 0.9140625 0.265625 +vt 0.7265625 0.3203125 +vt 0.71875 0.203125 +vt 0.7265625 0.203125 +vt 0.7109375 0.890625 +vt 0.828125 0.8828125 +vt 0.828125 0.890625 +vt 0 0.15625 +vt 0.0078125 0.2734375 +vt 0 0.2734375 +vt 0.8515625 0.6171875 +vt 0.734375 0.625 +vt 0.734375 0.6171875 +vt 0.734375 0.0859375 +vt 0.7421875 0.09375 +vt 0.734375 0.09375 +vt 0.7890625 0.09375 +vt 0.78125 0.0859375 +vt 0.7890625 0.0859375 +vt 0.0234375 0.2734375 +vt 0.015625 0.15625 +vt 0.0234375 0.15625 +vt 0.734375 0.4296875 +vt 0.8515625 0.421875 +vt 0.8515625 0.4296875 +vt 0.03125 0.15625 +vt 0.0390625 0.2734375 +vt 0.03125 0.2734375 +vt 0.8515625 0.40625 +vt 0.734375 0.4140625 +vt 0.734375 0.40625 +vt 0.796875 0.0859375 +vt 0.8046875 0.09375 +vt 0.796875 0.09375 +vt 0.8203125 0.09375 +vt 0.8125 0.0859375 +vt 0.8203125 0.0859375 +vt 0.0546875 0.2734375 +vt 0.046875 0.15625 +vt 0.0546875 0.15625 +vt 0.734375 0.3984375 +vt 0.8515625 0.390625 +vt 0.8515625 0.3984375 +vt 0.0625 0.15625 +vt 0.0703125 0.2734375 +vt 0.0625 0.2734375 +vt 0.8515625 0.375 +vt 0.734375 0.3828125 +vt 0.734375 0.375 +vt 0.828125 0.0859375 +vt 0.8359375 0.09375 +vt 0.828125 0.09375 +vt 0.8515625 0.09375 +vt 0.84375 0.0859375 +vt 0.8515625 0.0859375 +vt 0.0859375 0.2734375 +vt 0.078125 0.15625 +vt 0.0859375 0.15625 +vt 0.734375 0.3203125 +vt 0.8515625 0.3125 +vt 0.8515625 0.3203125 +vt 0.09375 0.15625 +vt 0.1015625 0.2734375 +vt 0.09375 0.2734375 +vt 0.8515625 0.296875 +vt 0.734375 0.3046875 +vt 0.734375 0.296875 +vt 0.90625 0.109375 +vt 0.9140625 0.1171875 +vt 0.90625 0.1171875 +vt 0.9140625 0.1015625 +vt 0.90625 0.09375 +vt 0.9140625 0.09375 +vt 0.1171875 0.2734375 +vt 0.109375 0.15625 +vt 0.1171875 0.15625 +vt 0.734375 0.2890625 +vt 0.8515625 0.28125 +vt 0.8515625 0.2890625 +vt 0.171875 0.15625 +vt 0.1796875 0.2734375 +vt 0.171875 0.2734375 +vt 0.8515625 0.265625 +vt 0.734375 0.2734375 +vt 0.734375 0.265625 +vt 0.0625 0.078125 +vt 0.0703125 0.0859375 +vt 0.0625 0.0859375 +vt 0.0859375 0.0859375 +vt 0.078125 0.078125 +vt 0.0859375 0.078125 +vt 0.1953125 0.2734375 +vt 0.1875 0.15625 +vt 0.1953125 0.15625 +vt 0.390625 0.7578125 +vt 0.5078125 0.7421875 +vt 0.5078125 0.7578125 +vt 0.734375 0.140625 +vt 0.7421875 0.2578125 +vt 0.734375 0.2578125 +vt 0.5078125 0.71875 +vt 0.390625 0.734375 +vt 0.390625 0.71875 +vt 0.609375 0.109375 +vt 0.6171875 0.125 +vt 0.609375 0.125 +vt 0.6328125 0.125 +vt 0.625 0.109375 +vt 0.6328125 0.109375 +vt 0.0390625 0.1484375 +vt 0.03125 0.0390625 +vt 0.0390625 0.0390625 +vt 0.859375 0.4140625 +vt 0.96875 0.40625 +vt 0.96875 0.4140625 +vt 0.046875 0.0390625 +vt 0.0546875 0.1484375 +vt 0.046875 0.1484375 +vt 0.96875 0.390625 +vt 0.859375 0.3984375 +vt 0.859375 0.390625 +vt 0.09375 0.078125 +vt 0.1015625 0.0859375 +vt 0.09375 0.0859375 +vt 0.1171875 0.0859375 +vt 0.109375 0.078125 +vt 0.1171875 0.078125 +vt 0.4765625 0.3671875 +vt 0.46875 0.3671875 +vt 0.46875 0.25 +vt 0.390625 0.8046875 +vt 0.390625 0.7890625 +vt 0.5078125 0.7890625 +vt 0.609375 0.25 +vt 0.6171875 0.25 +vt 0.6171875 0.3671875 +vt 0.5078125 0.765625 +vt 0.5078125 0.78125 +vt 0.390625 0.78125 +vt 0.8671875 0.453125 +vt 0.875 0.453125 +vt 0.875 0.46875 +vt 0.7421875 0.1328125 +vt 0.734375 0.1328125 +vt 0.734375 0.1171875 +vt 0.8828125 0.609375 +vt 0.8671875 0.609375 +vt 0.8671875 0.6015625 +vt 0.0625 0.59375 +vt 0.0625 0.40625 +vt 0.0703125 0.40625 +vt 0.859375 0.125 +vt 0.875 0.125 +vt 0.875 0.1328125 +vt 0.078125 0.59375 +vt 0.078125 0.40625 +vt 0.0859375 0.58203125 +vt 0.078125 0.40625 +vt 0.0859375 0.40625 +vt 0.0859375 0.58203125 +vt 0.25 0.6796875 +vt 0.25 0.4921875 +vt 0.265625 0.4921875 +vt 0.2734375 0.4921875 +vt 0.2890625 0.4921875 +vt 0.2734375 0.66796875 +vt 0.2890625 0.4921875 +vt 0.2890625 0.6796875 +vt 0.2734375 0.66796875 +vt 0.890625 0.71875 +vt 0.875 0.71875 +vt 0.875 0.7109375 +vt 0.09375 0.59375 +vt 0.09375 0.40625 +vt 0.1015625 0.40625 +vt 0.875 0.6953125 +vt 0.890625 0.6953125 +vt 0.890625 0.703125 +vt 0.109375 0.59375 +vt 0.109375 0.40625 +vt 0.1171875 0.58203125 +vt 0.109375 0.40625 +vt 0.1171875 0.40625 +vt 0.1171875 0.58203125 +vt 0.296875 0.6796875 +vt 0.296875 0.4921875 +vt 0.3125 0.4921875 +vt 0.3203125 0.4921875 +vt 0.3359375 0.4921875 +vt 0.3203125 0.66796875 +vt 0.3359375 0.4921875 +vt 0.3359375 0.6796875 +vt 0.3203125 0.66796875 +vt 0.890625 0.6875 +vt 0.875 0.6875 +vt 0.875 0.6796875 +vt 0.40625 0.6171875 +vt 0.40625 0.4296875 +vt 0.4140625 0.4296875 +vt 0.875 0.6640625 +vt 0.890625 0.6640625 +vt 0.890625 0.671875 +vt 0.421875 0.6171875 +vt 0.421875 0.4296875 +vt 0.4296875 0.44140625 +vt 0.421875 0.4296875 +vt 0.4296875 0.4296875 +vt 0.4296875 0.44140625 +vt 0.34375 0.875 +vt 0.34375 0.6875 +vt 0.359375 0.6875 +vt 0.34375 0.4921875 +vt 0.359375 0.4921875 +vt 0.34375 0.50390625 +vt 0.359375 0.4921875 +vt 0.359375 0.6796875 +vt 0.34375 0.50390625 +vt 0.6328125 0.3671875 +vt 0.625 0.3671875 +vt 0.625 0.25 +vt 0.6328125 0.703125 +vt 0.6328125 0.6953125 +vt 0.75 0.6953125 +vt 0.203125 0.2421875 +vt 0.2109375 0.2421875 +vt 0.2109375 0.359375 +vt 0.75 0.6796875 +vt 0.75 0.6875 +vt 0.6328125 0.6875 +vt 0.25 0.09375 +vt 0.2578125 0.09375 +vt 0.2578125 0.1015625 +vt 0.90625 0.75 +vt 0.8984375 0.75 +vt 0.8984375 0.7421875 +vt 0.890625 0.65625 +vt 0.875 0.65625 +vt 0.875 0.6484375 +vt 0.4375 0.6171875 +vt 0.4375 0.4296875 +vt 0.4453125 0.4296875 +vt 0.875 0.6328125 +vt 0.890625 0.6328125 +vt 0.890625 0.640625 +vt 0.453125 0.6171875 +vt 0.453125 0.4296875 +vt 0.4609375 0.44140625 +vt 0.453125 0.4296875 +vt 0.4609375 0.4296875 +vt 0.4609375 0.44140625 +vt 0.3671875 0.875 +vt 0.3671875 0.6875 +vt 0.3828125 0.6875 +vt 0.3671875 0.4921875 +vt 0.3828125 0.4921875 +vt 0.3671875 0.50390625 +vt 0.3828125 0.4921875 +vt 0.3828125 0.6796875 +vt 0.3671875 0.50390625 +vt 0.2265625 0.359375 +vt 0.21875 0.359375 +vt 0.21875 0.2421875 +vt 0.6328125 0.671875 +vt 0.6328125 0.6640625 +vt 0.75 0.6640625 +vt 0.234375 0.2421875 +vt 0.2421875 0.2421875 +vt 0.2421875 0.359375 +vt 0.75 0.6484375 +vt 0.75 0.65625 +vt 0.6328125 0.65625 +vt 0.265625 0.09375 +vt 0.2734375 0.09375 +vt 0.2734375 0.1015625 +vt 0.90625 0.734375 +vt 0.8984375 0.734375 +vt 0.8984375 0.7265625 +vt 0.2578125 0.359375 +vt 0.25 0.359375 +vt 0.25 0.2421875 +vt 0.6328125 0.640625 +vt 0.6328125 0.6328125 +vt 0.75 0.6328125 +vt 0.265625 0.2421875 +vt 0.2734375 0.2421875 +vt 0.2734375 0.359375 +vt 0.7578125 0.7421875 +vt 0.7578125 0.75 +vt 0.640625 0.75 +vt 0.28125 0.09375 +vt 0.2890625 0.09375 +vt 0.2890625 0.1015625 +vt 0.90625 0.71875 +vt 0.8984375 0.71875 +vt 0.8984375 0.7109375 +vt 0.2890625 0.359375 +vt 0.28125 0.359375 +vt 0.28125 0.2421875 +vt 0.640625 0.734375 +vt 0.640625 0.7265625 +vt 0.7578125 0.7265625 +vt 0.296875 0.2421875 +vt 0.3046875 0.2421875 +vt 0.3046875 0.359375 +vt 0.7578125 0.578125 +vt 0.7578125 0.5859375 +vt 0.640625 0.5859375 +vt 0.296875 0.09375 +vt 0.3046875 0.09375 +vt 0.3046875 0.1015625 +vt 0.90625 0.703125 +vt 0.8984375 0.703125 +vt 0.8984375 0.6953125 +vt 0.3203125 0.359375 +vt 0.3125 0.359375 +vt 0.3125 0.2421875 +vt 0.640625 0.5703125 +vt 0.640625 0.5625 +vt 0.7578125 0.5625 +vt 0.328125 0.2421875 +vt 0.3359375 0.2421875 +vt 0.3359375 0.359375 +vt 0.7578125 0.546875 +vt 0.7578125 0.5546875 +vt 0.640625 0.5546875 +vt 0.3125 0.09375 +vt 0.3203125 0.09375 +vt 0.3203125 0.1015625 +vt 0.90625 0.6875 +vt 0.8984375 0.6875 +vt 0.8984375 0.6796875 +vt 0.3515625 0.359375 +vt 0.34375 0.359375 +vt 0.34375 0.2421875 +vt 0.640625 0.5390625 +vt 0.640625 0.53125 +vt 0.7578125 0.53125 +vt 0.359375 0.2421875 +vt 0.3671875 0.2421875 +vt 0.3671875 0.359375 +vt 0.7578125 0.515625 +vt 0.7578125 0.5234375 +vt 0.640625 0.5234375 +vt 0.328125 0.09375 +vt 0.3359375 0.09375 +vt 0.3359375 0.1015625 +vt 0.90625 0.671875 +vt 0.8984375 0.671875 +vt 0.8984375 0.6640625 +vt 0.3828125 0.359375 +vt 0.375 0.359375 +vt 0.375 0.2421875 +vt 0.640625 0.5078125 +vt 0.640625 0.5 +vt 0.7578125 0.5 +vt 0.640625 0.25 +vt 0.6484375 0.25 +vt 0.6484375 0.3671875 +vt 0.7578125 0.484375 +vt 0.7578125 0.4921875 +vt 0.640625 0.4921875 +vt 0.34375 0.09375 +vt 0.3515625 0.09375 +vt 0.3515625 0.1015625 +vt 0.90625 0.65625 +vt 0.8984375 0.65625 +vt 0.8984375 0.6484375 +vt 0.4921875 0.3515625 +vt 0.484375 0.3515625 +vt 0.484375 0.234375 +vt 0.640625 0.4765625 +vt 0.640625 0.46875 +vt 0.7578125 0.46875 +vt 0.65625 0.25 +vt 0.6640625 0.25 +vt 0.6640625 0.3671875 +vt 0.7890625 0.359375 +vt 0.7890625 0.3671875 +vt 0.671875 0.3671875 +vt 0.359375 0.09375 +vt 0.3671875 0.09375 +vt 0.3671875 0.1015625 +vt 0.90625 0.640625 +vt 0.8984375 0.640625 +vt 0.8984375 0.6328125 +vt 0.6796875 0.3515625 +vt 0.671875 0.3515625 +vt 0.671875 0.234375 +vt 0.6796875 1 +vt 0.6796875 0.9921875 +vt 0.796875 0.9921875 +vt 0.5 0.203125 +vt 0.5078125 0.203125 +vt 0.5078125 0.3203125 +vt 0.796875 0.9765625 +vt 0.796875 0.984375 +vt 0.6796875 0.984375 +vt 0.375 0.09375 +vt 0.3828125 0.09375 +vt 0.3828125 0.1015625 +vt 0.90625 0.59375 +vt 0.8984375 0.59375 +vt 0.8984375 0.5859375 +vt 0.5234375 0.3203125 +vt 0.515625 0.3203125 +vt 0.515625 0.203125 +vt 0.6796875 0.96875 +vt 0.6796875 0.9609375 +vt 0.796875 0.9609375 +vt 0.53125 0.203125 +vt 0.5390625 0.203125 +vt 0.5390625 0.3203125 +vt 0.796875 0.9453125 +vt 0.796875 0.953125 +vt 0.6796875 0.953125 +vt 0.8984375 0.5703125 +vt 0.90625 0.5703125 +vt 0.90625 0.578125 +vt 0.90625 0.5625 +vt 0.8984375 0.5625 +vt 0.8984375 0.5546875 +vt 0.5546875 0.3203125 +vt 0.546875 0.3203125 +vt 0.546875 0.203125 +vt 0.6796875 0.9375 +vt 0.6796875 0.9296875 +vt 0.796875 0.9296875 +vt 0.5625 0.203125 +vt 0.5703125 0.203125 +vt 0.5703125 0.3203125 +vt 0.796875 0.9140625 +vt 0.796875 0.921875 +vt 0.6796875 0.921875 +vt 0.8984375 0.5390625 +vt 0.90625 0.5390625 +vt 0.90625 0.546875 +vt 0.4765625 0.1015625 +vt 0.46875 0.1015625 +vt 0.46875 0.09375 +vt 0.5078125 0.1953125 +vt 0.5 0.1953125 +vt 0.5 0.0859375 +vt 0.390625 0.6640625 +vt 0.390625 0.6484375 +vt 0.5 0.6484375 +vt 0.515625 0.0859375 +vt 0.5234375 0.0859375 +vt 0.5234375 0.1953125 +vt 0.5 0.625 +vt 0.5 0.640625 +vt 0.390625 0.640625 +vt 0.109375 0.109375 +vt 0.1171875 0.109375 +vt 0.1171875 0.125 +vt 0.4765625 0.125 +vt 0.46875 0.125 +vt 0.46875 0.109375 +vt 0.5390625 0.1953125 +vt 0.53125 0.1953125 +vt 0.53125 0.0859375 +vt 0.8046875 0.984375 +vt 0.8046875 0.9765625 +vt 0.9140625 0.9765625 +vt 0.546875 0.0859375 +vt 0.5546875 0.0859375 +vt 0.5546875 0.1953125 +vt 0.9140625 0.9609375 +vt 0.9140625 0.96875 +vt 0.8046875 0.96875 +vt 0.8984375 0.5234375 +vt 0.90625 0.5234375 +vt 0.90625 0.53125 +vt 0.90625 0.515625 +vt 0.8984375 0.515625 +vt 0.8984375 0.5078125 +vt 0.5703125 0.1953125 +vt 0.5625 0.1953125 +vt 0.5625 0.0859375 +vt 0.8046875 0.953125 +vt 0.8046875 0.9453125 +vt 0.9140625 0.9453125 +vt 0.703125 0.0859375 +vt 0.7109375 0.0859375 +vt 0.7109375 0.1953125 +vt 0.9140625 0.9296875 +vt 0.9140625 0.9375 +vt 0.8046875 0.9375 +vt 0.8984375 0.4921875 +vt 0.90625 0.4921875 +vt 0.90625 0.5 +vt 0.90625 0.484375 +vt 0.8984375 0.484375 +vt 0.8984375 0.4765625 +vt 0.7265625 0.1953125 +vt 0.71875 0.1953125 +vt 0.71875 0.0859375 +vt 0.8046875 0.921875 +vt 0.8046875 0.9140625 +vt 0.9140625 0.9140625 +vt 0.8125 0.1171875 +vt 0.8203125 0.1171875 +vt 0.8203125 0.2265625 +vt 0.9375 0.8671875 +vt 0.9375 0.875 +vt 0.828125 0.875 +vt 0.8984375 0.4609375 +vt 0.90625 0.4609375 +vt 0.90625 0.46875 +vt 0.6171875 0.1015625 +vt 0.609375 0.1015625 +vt 0.609375 0.09375 +vt 0.5859375 0.1796875 +vt 0.578125 0.1796875 +vt 0.578125 0.0703125 +vt 0.828125 0.859375 +vt 0.828125 0.8515625 +vt 0.9375 0.8515625 +vt 0.59375 0.0703125 +vt 0.6015625 0.0703125 +vt 0.6015625 0.1796875 +vt 0.9375 0.8359375 +vt 0.9375 0.84375 +vt 0.828125 0.84375 +vt 0.625 0.09375 +vt 0.6328125 0.09375 +vt 0.6328125 0.1015625 +vt 0.90625 0.3046875 +vt 0.8984375 0.3046875 +vt 0.8984375 0.296875 +vt 0.1328125 0.171875 +vt 0.125 0.171875 +vt 0.125 0.0625 +vt 0.828125 0.828125 +vt 0.828125 0.8203125 +vt 0.9375 0.8203125 +vt 0.140625 0.0625 +vt 0.1484375 0.0625 +vt 0.1484375 0.171875 +vt 0.9375 0.8046875 +vt 0.9375 0.8125 +vt 0.828125 0.8125 +vt 0.8984375 0.25 +vt 0.90625 0.25 +vt 0.90625 0.2578125 +vt 0.7578125 0.1015625 +vt 0.75 0.1015625 +vt 0.75 0.09375 +vt 0.1640625 0.171875 +vt 0.15625 0.171875 +vt 0.15625 0.0625 +vt 0.828125 0.796875 +vt 0.828125 0.7890625 +vt 0.9375 0.7890625 +vt 0.390625 0.0625 +vt 0.3984375 0.0625 +vt 0.3984375 0.171875 +vt 0.9375 0.7734375 +vt 0.9375 0.78125 +vt 0.828125 0.78125 +vt 0.8984375 0.234375 +vt 0.90625 0.234375 +vt 0.90625 0.2421875 +vt 0.7734375 0.1015625 +vt 0.765625 0.1015625 +vt 0.765625 0.09375 +vt 0.4140625 0.171875 +vt 0.40625 0.171875 +vt 0.40625 0.0625 +vt 0.828125 0.765625 +vt 0.828125 0.7578125 +vt 0.9375 0.7578125 +vt 0.421875 0.0625 +vt 0.4296875 0.0625 +vt 0.4296875 0.171875 +vt 0.9375 0.4375 +vt 0.9375 0.4453125 +vt 0.828125 0.4453125 +vt 0.8984375 0.21875 +vt 0.90625 0.21875 +vt 0.90625 0.2265625 +vt 0.90625 0.2109375 +vt 0.8984375 0.2109375 +vt 0.8984375 0.203125 +vt 0.4453125 0.171875 +vt 0.4375 0.171875 +vt 0.4375 0.0625 +vt 0.828125 0.3515625 +vt 0.828125 0.34375 +vt 0.9375 0.34375 +vt 0.453125 0.0625 +vt 0.4609375 0.0625 +vt 0.4609375 0.171875 +vt 0.9375 0.328125 +vt 0.9375 0.3359375 +vt 0.828125 0.3359375 +vt 0.8984375 0.1875 +vt 0.90625 0.1875 +vt 0.90625 0.1953125 +vt 0.90625 0.1796875 +vt 0.8984375 0.1796875 +vt 0.8984375 0.171875 +vt 0.8359375 0.2265625 +vt 0.828125 0.2265625 +vt 0.828125 0.1171875 +vt 0.8359375 0.90625 +vt 0.8359375 0.8984375 +vt 0.9453125 0.8984375 +vt 0.84375 0.1171875 +vt 0.8515625 0.1171875 +vt 0.8515625 0.2265625 +vt 0.9453125 0.8828125 +vt 0.9453125 0.890625 +vt 0.8359375 0.890625 +vt 0.8984375 0.15625 +vt 0.90625 0.15625 +vt 0.90625 0.1640625 +vt 0.90625 0.1484375 +vt 0.8984375 0.1484375 +vt 0.8984375 0.140625 +vt 0.0078125 0.1484375 +vt 0 0.1484375 +vt 0 0.0390625 +vt 0.859375 0.625 +vt 0.859375 0.6171875 +vt 0.96875 0.6171875 +vt 0.015625 0.0390625 +vt 0.0234375 0.0390625 +vt 0.0234375 0.1484375 +vt 0.96875 0.421875 +vt 0.96875 0.4296875 +vt 0.859375 0.4296875 +vt 0.859375 0.09375 +vt 0.8671875 0.09375 +vt 0.8671875 0.1015625 +vt 0.90625 0.1328125 +vt 0.8984375 0.1328125 +vt 0.8984375 0.125 +vt 0.6953125 0.3515625 +vt 0.6875 0.3515625 +vt 0.6875 0.234375 +vt 0.703125 0.875 +vt 0.703125 0.8671875 +vt 0.8203125 0.8671875 +vt 0.578125 0.1875 +vt 0.5859375 0.1875 +vt 0.5859375 0.3046875 +vt 0.8203125 0.8515625 +vt 0.8203125 0.859375 +vt 0.703125 0.859375 +vt 0.875 0.09375 +vt 0.8828125 0.09375 +vt 0.8828125 0.1015625 +vt 0.8984375 0.1015625 +vt 0.890625 0.1015625 +vt 0.890625 0.09375 +vt 0.6015625 0.3046875 +vt 0.59375 0.3046875 +vt 0.59375 0.1875 +vt 0.703125 0.84375 +vt 0.703125 0.8359375 +vt 0.8203125 0.8359375 +vt 0.125 0.1796875 +vt 0.1328125 0.1796875 +vt 0.1328125 0.296875 +vt 0.8203125 0.8203125 +vt 0.8203125 0.828125 +vt 0.703125 0.828125 +vt 0.171875 0.0859375 +vt 0.1796875 0.0859375 +vt 0.1796875 0.09375 +vt 0.1953125 0.09375 +vt 0.1875 0.09375 +vt 0.1875 0.0859375 +vt 0.1484375 0.296875 +vt 0.140625 0.296875 +vt 0.140625 0.1796875 +vt 0.703125 0.8125 +vt 0.703125 0.8046875 +vt 0.8203125 0.8046875 +vt 0.15625 0.1796875 +vt 0.1640625 0.1796875 +vt 0.1640625 0.296875 +vt 0.8203125 0.7890625 +vt 0.8203125 0.796875 +vt 0.703125 0.796875 +vt 0.90625 0.6015625 +vt 0.9140625 0.6015625 +vt 0.9140625 0.609375 +vt 0.4921875 0.09375 +vt 0.484375 0.09375 +vt 0.484375 0.0859375 +vt 0.3984375 0.296875 +vt 0.390625 0.296875 +vt 0.390625 0.1796875 +vt 0.703125 0.78125 +vt 0.703125 0.7734375 +vt 0.8203125 0.7734375 +vt 0.40625 0.1796875 +vt 0.4140625 0.1796875 +vt 0.4140625 0.296875 +vt 0.8203125 0.7578125 +vt 0.8203125 0.765625 +vt 0.703125 0.765625 +vt 0.640625 0.0859375 +vt 0.6484375 0.0859375 +vt 0.6484375 0.09375 +vt 0.6640625 0.09375 +vt 0.65625 0.09375 +vt 0.65625 0.0859375 +vt 0.4296875 0.296875 +vt 0.421875 0.296875 +vt 0.421875 0.1796875 +vt 0.703125 0.4453125 +vt 0.703125 0.4375 +vt 0.8203125 0.4375 +vt 0.4375 0.1796875 +vt 0.4453125 0.1796875 +vt 0.4453125 0.296875 +vt 0.8203125 0.34375 +vt 0.8203125 0.3515625 +vt 0.703125 0.3515625 +vt 0.671875 0.0859375 +vt 0.6796875 0.0859375 +vt 0.6796875 0.09375 +vt 0.6953125 0.09375 +vt 0.6875 0.09375 +vt 0.6875 0.0859375 +vt 0.4609375 0.296875 +vt 0.453125 0.296875 +vt 0.453125 0.1796875 +vt 0.703125 0.3359375 +vt 0.703125 0.328125 +vt 0.8203125 0.328125 +vt 0.703125 0.203125 +vt 0.7109375 0.203125 +vt 0.7109375 0.3203125 +vt 0.828125 0.8984375 +vt 0.828125 0.90625 +vt 0.7109375 0.90625 +vt 0.90625 0.28125 +vt 0.9140625 0.28125 +vt 0.9140625 0.2890625 +vt 0.9140625 0.2734375 +vt 0.90625 0.2734375 +vt 0.90625 0.265625 +vt 0.7265625 0.3203125 +vt 0.71875 0.3203125 +vt 0.71875 0.203125 +vt 0.7109375 0.890625 +vt 0.7109375 0.8828125 +vt 0.828125 0.8828125 +vt 0 0.15625 +vt 0.0078125 0.15625 +vt 0.0078125 0.2734375 +vt 0.8515625 0.6171875 +vt 0.8515625 0.625 +vt 0.734375 0.625 +vt 0.734375 0.0859375 +vt 0.7421875 0.0859375 +vt 0.7421875 0.09375 +vt 0.7890625 0.09375 +vt 0.78125 0.09375 +vt 0.78125 0.0859375 +vt 0.0234375 0.2734375 +vt 0.015625 0.2734375 +vt 0.015625 0.15625 +vt 0.734375 0.4296875 +vt 0.734375 0.421875 +vt 0.8515625 0.421875 +vt 0.03125 0.15625 +vt 0.0390625 0.15625 +vt 0.0390625 0.2734375 +vt 0.8515625 0.40625 +vt 0.8515625 0.4140625 +vt 0.734375 0.4140625 +vt 0.796875 0.0859375 +vt 0.8046875 0.0859375 +vt 0.8046875 0.09375 +vt 0.8203125 0.09375 +vt 0.8125 0.09375 +vt 0.8125 0.0859375 +vt 0.0546875 0.2734375 +vt 0.046875 0.2734375 +vt 0.046875 0.15625 +vt 0.734375 0.3984375 +vt 0.734375 0.390625 +vt 0.8515625 0.390625 +vt 0.0625 0.15625 +vt 0.0703125 0.15625 +vt 0.0703125 0.2734375 +vt 0.8515625 0.375 +vt 0.8515625 0.3828125 +vt 0.734375 0.3828125 +vt 0.828125 0.0859375 +vt 0.8359375 0.0859375 +vt 0.8359375 0.09375 +vt 0.8515625 0.09375 +vt 0.84375 0.09375 +vt 0.84375 0.0859375 +vt 0.0859375 0.2734375 +vt 0.078125 0.2734375 +vt 0.078125 0.15625 +vt 0.734375 0.3203125 +vt 0.734375 0.3125 +vt 0.8515625 0.3125 +vt 0.09375 0.15625 +vt 0.1015625 0.15625 +vt 0.1015625 0.2734375 +vt 0.8515625 0.296875 +vt 0.8515625 0.3046875 +vt 0.734375 0.3046875 +vt 0.90625 0.109375 +vt 0.9140625 0.109375 +vt 0.9140625 0.1171875 +vt 0.9140625 0.1015625 +vt 0.90625 0.1015625 +vt 0.90625 0.09375 +vt 0.1171875 0.2734375 +vt 0.109375 0.2734375 +vt 0.109375 0.15625 +vt 0.734375 0.2890625 +vt 0.734375 0.28125 +vt 0.8515625 0.28125 +vt 0.171875 0.15625 +vt 0.1796875 0.15625 +vt 0.1796875 0.2734375 +vt 0.8515625 0.265625 +vt 0.8515625 0.2734375 +vt 0.734375 0.2734375 +vt 0.0625 0.078125 +vt 0.0703125 0.078125 +vt 0.0703125 0.0859375 +vt 0.0859375 0.0859375 +vt 0.078125 0.0859375 +vt 0.078125 0.078125 +vt 0.1953125 0.2734375 +vt 0.1875 0.2734375 +vt 0.1875 0.15625 +vt 0.390625 0.7578125 +vt 0.390625 0.7421875 +vt 0.5078125 0.7421875 +vt 0.734375 0.140625 +vt 0.7421875 0.140625 +vt 0.7421875 0.2578125 +vt 0.5078125 0.71875 +vt 0.5078125 0.734375 +vt 0.390625 0.734375 +vt 0.609375 0.109375 +vt 0.6171875 0.109375 +vt 0.6171875 0.125 +vt 0.6328125 0.125 +vt 0.625 0.125 +vt 0.625 0.109375 +vt 0.0390625 0.1484375 +vt 0.03125 0.1484375 +vt 0.03125 0.0390625 +vt 0.859375 0.4140625 +vt 0.859375 0.40625 +vt 0.96875 0.40625 +vt 0.046875 0.0390625 +vt 0.0546875 0.0390625 +vt 0.0546875 0.1484375 +vt 0.96875 0.390625 +vt 0.96875 0.3984375 +vt 0.859375 0.3984375 +vt 0.09375 0.078125 +vt 0.1015625 0.078125 +vt 0.1015625 0.0859375 +vt 0.1171875 0.0859375 +vt 0.109375 0.0859375 +vt 0.109375 0.078125 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +usemtl m_5f175e4e-a6a7-9193-e88f-70334c8bfde8 +f 349/1573/525 350/1574/525 351/1575/525 +f 352/1576/526 353/1577/526 350/1578/526 +f 354/1579/527 355/1580/527 353/1581/527 +f 356/1582/528 351/1583/528 355/1584/528 +f 353/1585/529 351/1586/529 350/1587/529 +f 352/1588/530 356/1589/530 354/1590/530 +f 357/1591/531 358/1592/531 359/1593/531 +f 360/1594/532 361/1595/532 358/1596/532 +f 362/1597/533 363/1598/533 361/1599/533 +f 364/1600/534 357/1601/534 359/1602/534 +f 358/1603/535 363/1604/535 359/1605/535 +f 360/1606/536 357/1607/536 364/1608/536 +f 365/1609/537 366/1610/537 367/1611/537 +f 368/1612/538 369/1613/538 366/1614/538 +f 370/1615/539 371/1616/539 369/1617/539 +f 372/1618/540 365/1619/540 367/1620/540 +f 366/1621/541 371/1622/541 367/1623/541 +f 368/1624/542 365/1625/542 372/1626/542 +f 373/1627/543 374/1628/543 375/1629/543 +f 376/1630/544 377/1631/544 374/1632/544 +f 378/1633/545 379/1634/545 377/1635/545 +f 380/1636/546 373/1637/546 375/1638/546 +f 374/1639/547 379/1640/547 375/1641/547 +f 376/1642/548 373/1643/548 380/1644/548 +f 381/1645/549 382/1646/549 383/1647/549 +f 384/1648/550 385/1649/550 382/1650/550 +f 386/1651/551 387/1652/551 385/1653/551 +f 388/1654/552 383/1655/552 387/1656/552 +f 385/1657/553 383/1658/553 382/1659/553 +f 384/1660/554 388/1661/554 386/1662/554 +f 389/1663/555 390/1664/555 391/1665/555 +f 392/1666/556 393/1667/556 390/1668/556 +f 394/1669/557 395/1670/557 393/1671/557 +f 396/1672/558 389/1673/558 391/1674/558 +f 390/1675/559 395/1676/559 391/1677/559 +f 392/1678/560 389/1679/560 396/1680/560 +f 397/1681/561 398/1682/561 399/1683/561 +f 400/1684/562 401/1685/562 398/1686/562 +f 402/1687/563 403/1688/563 401/1689/563 +f 404/1690/564 399/1691/564 403/1692/564 +f 401/1693/565 399/1694/565 398/1695/565 +f 400/1696/566 404/1697/566 402/1698/566 +f 405/1699/567 406/1700/567 407/1701/567 +f 408/1702/568 409/1703/568 406/1704/568 +f 410/1705/569 411/1706/569 409/1707/569 +f 412/1708/570 407/1709/570 411/1710/570 +f 409/1711/571 407/1712/571 406/1713/571 +f 408/1714/572 412/1715/572 410/1716/572 +f 413/1717/573 414/1718/573 415/1719/573 +f 416/1720/574 417/1721/574 414/1722/574 +f 418/1723/575 419/1724/575 417/1725/575 +f 420/1726/576 415/1727/576 419/1728/576 +f 417/1729/577 415/1730/577 414/1731/577 +f 416/1732/578 420/1733/578 418/1734/578 +f 421/1735/579 422/1736/579 423/1737/579 +f 424/1738/580 425/1739/580 422/1740/580 +f 426/1741/581 427/1742/581 425/1743/581 +f 428/1744/582 423/1745/582 427/1746/582 +f 425/1747/583 423/1748/583 422/1749/583 +f 424/1750/584 428/1751/584 426/1752/584 +f 429/1753/585 430/1754/585 431/1755/585 +f 432/1756/586 433/1757/586 430/1758/586 +f 434/1759/587 435/1760/587 433/1761/587 +f 436/1762/588 431/1763/588 435/1764/588 +f 433/1765/589 431/1766/589 430/1767/589 +f 432/1768/590 436/1769/590 434/1770/590 +f 437/1771/591 438/1772/591 439/1773/591 +f 440/1774/592 441/1775/592 438/1776/592 +f 442/1777/593 443/1778/593 441/1779/593 +f 444/1780/594 439/1781/594 443/1782/594 +f 441/1783/595 439/1784/595 438/1785/595 +f 440/1786/596 444/1787/596 442/1788/596 +f 445/1789/597 446/1790/597 447/1791/597 +f 448/1792/598 449/1793/598 446/1794/598 +f 450/1795/599 451/1796/599 449/1797/599 +f 452/1798/600 447/1799/600 451/1800/600 +f 449/1801/601 447/1802/601 446/1803/601 +f 448/1804/602 452/1805/602 450/1806/602 +f 453/1807/603 454/1808/603 455/1809/603 +f 456/1810/604 457/1811/604 454/1812/604 +f 458/1813/605 459/1814/605 457/1815/605 +f 460/1816/606 455/1817/606 459/1818/606 +f 457/1819/607 455/1820/607 454/1821/607 +f 456/1822/608 460/1823/608 458/1824/608 +f 461/1825/609 462/1826/609 463/1827/609 +f 464/1828/610 465/1829/610 462/1830/610 +f 466/1831/611 467/1832/611 465/1833/611 +f 468/1834/612 463/1835/612 467/1836/612 +f 465/1837/613 463/1838/613 462/1839/613 +f 464/1840/614 468/1841/614 466/1842/614 +f 469/1843/615 470/1844/615 471/1845/615 +f 472/1846/616 473/1847/616 470/1848/616 +f 474/1849/617 475/1850/617 473/1851/617 +f 476/1852/618 471/1853/618 475/1854/618 +f 473/1855/619 471/1856/619 470/1857/619 +f 472/1858/620 476/1859/620 474/1860/620 +f 477/1861/621 478/1862/621 479/1863/621 +f 480/1864/622 481/1865/622 478/1866/622 +f 482/1867/623 483/1868/623 481/1869/623 +f 484/1870/624 479/1871/624 483/1872/624 +f 481/1873/625 479/1874/625 478/1875/625 +f 480/1876/626 484/1877/626 482/1878/626 +f 485/1879/627 486/1880/627 487/1881/627 +f 488/1882/628 489/1883/628 486/1884/628 +f 490/1885/629 491/1886/629 489/1887/629 +f 492/1888/630 487/1889/630 491/1890/630 +f 489/1891/631 487/1892/631 486/1893/631 +f 488/1894/632 492/1895/632 490/1896/632 +f 493/1897/633 494/1898/633 495/1899/633 +f 496/1900/634 497/1901/634 494/1902/634 +f 498/1903/635 499/1904/635 497/1905/635 +f 500/1906/636 495/1907/636 499/1908/636 +f 497/1909/637 495/1910/637 494/1911/637 +f 496/1912/638 500/1913/638 498/1914/638 +f 501/1915/639 502/1916/639 503/1917/639 +f 504/1918/640 505/1919/640 502/1920/640 +f 506/1921/641 507/1922/641 505/1923/641 +f 508/1924/642 503/1925/642 507/1926/642 +f 505/1927/643 503/1928/643 502/1929/643 +f 504/1930/644 508/1931/644 506/1932/644 +f 509/1933/645 510/1934/645 511/1935/645 +f 512/1936/646 513/1937/646 510/1938/646 +f 514/1939/647 515/1940/647 513/1941/647 +f 516/1942/648 511/1943/648 515/1944/648 +f 513/1945/649 511/1946/649 510/1947/649 +f 512/1948/650 516/1949/650 514/1950/650 +f 517/1951/651 518/1952/651 519/1953/651 +f 520/1954/652 521/1955/652 518/1956/652 +f 522/1957/653 523/1958/653 521/1959/653 +f 524/1960/654 519/1961/654 523/1962/654 +f 521/1963/655 519/1964/655 518/1965/655 +f 520/1966/656 524/1967/656 522/1968/656 +f 525/1969/657 526/1970/657 527/1971/657 +f 528/1972/658 529/1973/658 526/1974/658 +f 530/1975/659 531/1976/659 529/1977/659 +f 532/1978/660 527/1979/660 531/1980/660 +f 529/1981/661 527/1982/661 526/1983/661 +f 528/1984/662 532/1985/662 530/1986/662 +f 533/1987/663 534/1988/663 535/1989/663 +f 536/1990/664 537/1991/664 534/1992/664 +f 538/1993/665 539/1994/665 537/1995/665 +f 540/1996/666 535/1997/666 539/1998/666 +f 537/1999/667 535/2000/667 534/2001/667 +f 536/2002/668 540/2003/668 538/2004/668 +f 541/2005/669 542/2006/669 543/2007/669 +f 544/2008/670 545/2009/670 542/2010/670 +f 546/2011/671 547/2012/671 545/2013/671 +f 548/2014/672 543/2015/672 547/2016/672 +f 545/2017/673 543/2018/673 542/2019/673 +f 544/2020/674 548/2021/674 546/2022/674 +f 549/2023/675 550/2024/675 551/2025/675 +f 552/2026/676 553/2027/676 550/2028/676 +f 554/2029/677 555/2030/677 553/2031/677 +f 556/2032/678 551/2033/678 555/2034/678 +f 553/2035/679 551/2036/679 550/2037/679 +f 552/2038/680 556/2039/680 554/2040/680 +f 557/2041/681 558/2042/681 559/2043/681 +f 560/2044/682 561/2045/682 558/2046/682 +f 562/2047/683 563/2048/683 561/2049/683 +f 564/2050/684 559/2051/684 563/2052/684 +f 561/2053/685 559/2054/685 558/2055/685 +f 560/2056/686 564/2057/686 562/2058/686 +f 565/2059/687 566/2060/687 567/2061/687 +f 568/2062/688 569/2063/688 566/2064/688 +f 570/2065/689 571/2066/689 569/2067/689 +f 572/2068/690 567/2069/690 571/2070/690 +f 569/2071/691 567/2072/691 566/2073/691 +f 568/2074/692 572/2075/692 570/2076/692 +f 573/2077/693 574/2078/693 575/2079/693 +f 576/2080/694 577/2081/694 574/2082/694 +f 578/2083/695 579/2084/695 577/2085/695 +f 580/2086/696 575/2087/696 579/2088/696 +f 577/2089/697 575/2090/697 574/2091/697 +f 576/2092/698 580/2093/698 578/2094/698 +f 581/2095/699 582/2096/699 583/2097/699 +f 584/2098/700 585/2099/700 582/2100/700 +f 586/2101/701 587/2102/701 585/2103/701 +f 588/2104/702 583/2105/702 587/2106/702 +f 585/2107/703 583/2108/703 582/2109/703 +f 584/2110/704 588/2111/704 586/2112/704 +f 589/2113/705 590/2114/705 591/2115/705 +f 592/2116/706 593/2117/706 590/2118/706 +f 594/2119/707 595/2120/707 593/2121/707 +f 596/2122/708 591/2123/708 595/2124/708 +f 593/2125/709 591/2126/709 590/2127/709 +f 592/2128/710 596/2129/710 594/2130/710 +f 597/2131/711 598/2132/711 599/2133/711 +f 600/2134/712 601/2135/712 598/2136/712 +f 602/2137/713 603/2138/713 601/2139/713 +f 604/2140/714 599/2141/714 603/2142/714 +f 601/2143/715 599/2144/715 598/2145/715 +f 600/2146/716 604/2147/716 602/2148/716 +f 605/2149/717 606/2150/717 607/2151/717 +f 608/2152/718 609/2153/718 606/2154/718 +f 610/2155/719 611/2156/719 609/2157/719 +f 612/2158/720 607/2159/720 611/2160/720 +f 609/2161/721 607/2162/721 606/2163/721 +f 608/2164/722 612/2165/722 610/2166/722 +f 613/2167/723 614/2168/723 615/2169/723 +f 616/2170/724 617/2171/724 614/2172/724 +f 618/2173/725 619/2174/725 617/2175/725 +f 620/2176/726 615/2177/726 619/2178/726 +f 617/2179/727 615/2180/727 614/2181/727 +f 616/2182/728 620/2183/728 618/2184/728 +f 621/2185/729 622/2186/729 623/2187/729 +f 624/2188/730 625/2189/730 622/2190/730 +f 626/2191/731 627/2192/731 625/2193/731 +f 628/2194/732 623/2195/732 627/2196/732 +f 625/2197/733 623/2198/733 622/2199/733 +f 624/2200/734 628/2201/734 626/2202/734 +f 629/2203/735 630/2204/735 631/2205/735 +f 632/2206/736 633/2207/736 630/2208/736 +f 634/2209/737 635/2210/737 633/2211/737 +f 636/2212/738 631/2213/738 635/2214/738 +f 633/2215/739 631/2216/739 630/2217/739 +f 632/2218/740 636/2219/740 634/2220/740 +f 637/2221/741 638/2222/741 639/2223/741 +f 640/2224/742 641/2225/742 638/2226/742 +f 642/2227/743 643/2228/743 641/2229/743 +f 644/2230/744 639/2231/744 643/2232/744 +f 641/2233/745 639/2234/745 638/2235/745 +f 640/2236/746 644/2237/746 642/2238/746 +f 645/2239/747 646/2240/747 647/2241/747 +f 648/2242/748 649/2243/748 646/2244/748 +f 650/2245/749 651/2246/749 649/2247/749 +f 652/2248/750 647/2249/750 651/2250/750 +f 649/2251/751 647/2252/751 646/2253/751 +f 648/2254/752 652/2255/752 650/2256/752 +f 653/2257/753 654/2258/753 655/2259/753 +f 656/2260/754 657/2261/754 654/2262/754 +f 658/2263/755 659/2264/755 657/2265/755 +f 660/2266/756 655/2267/756 659/2268/756 +f 657/2269/757 655/2270/757 654/2271/757 +f 656/2272/758 660/2273/758 658/2274/758 +f 661/2275/759 662/2276/759 663/2277/759 +f 664/2278/760 665/2279/760 662/2280/760 +f 666/2281/761 667/2282/761 665/2283/761 +f 668/2284/762 663/2285/762 667/2286/762 +f 665/2287/763 663/2288/763 662/2289/763 +f 664/2290/764 668/2291/764 666/2292/764 +f 349/2293/765 352/2294/765 350/2295/765 +f 352/2296/766 354/2297/766 353/2298/766 +f 354/2299/767 356/2300/767 355/2301/767 +f 356/2302/768 349/2303/768 351/2304/768 +f 353/2305/769 355/2306/769 351/2307/769 +f 352/2308/770 349/2309/770 356/2310/770 +f 357/2311/771 360/2312/771 358/2313/771 +f 360/2314/772 362/2315/772 361/2316/772 +f 362/2317/773 669/2318/773 363/2319/773 +f 359/2320/774 363/2321/774 364/2322/774 +f 363/2323/775 669/2324/775 364/2325/775 +f 358/2326/776 361/2327/776 363/2328/776 +f 669/2329/777 362/2330/777 364/2331/777 +f 362/2332/778 360/2333/778 364/2334/778 +f 365/2335/779 368/2336/779 366/2337/779 +f 368/2338/780 370/2339/780 369/2340/780 +f 370/2341/781 670/2342/781 371/2343/781 +f 367/2344/782 371/2345/782 372/2346/782 +f 371/2347/783 670/2348/783 372/2349/783 +f 366/2350/784 369/2351/784 371/2352/784 +f 670/2353/785 370/2354/785 372/2355/785 +f 370/2356/786 368/2357/786 372/2358/786 +f 373/2359/787 376/2360/787 374/2361/787 +f 376/2362/788 378/2363/788 377/2364/788 +f 378/2365/789 671/2366/789 379/2367/789 +f 375/2368/790 379/2369/790 380/2370/790 +f 379/2371/791 671/2372/791 380/2373/791 +f 374/2374/792 377/2375/792 379/2376/792 +f 671/2377/793 378/2378/793 380/2379/793 +f 378/2380/794 376/2381/794 380/2382/794 +f 381/2383/795 384/2384/795 382/2385/795 +f 384/2386/796 386/2387/796 385/2388/796 +f 386/2389/797 388/2390/797 387/2391/797 +f 388/2392/798 381/2393/798 383/2394/798 +f 385/2395/799 387/2396/799 383/2397/799 +f 384/2398/800 381/2399/800 388/2400/800 +f 389/2401/801 392/2402/801 390/2403/801 +f 392/2404/802 394/2405/802 393/2406/802 +f 394/2407/803 672/2408/803 395/2409/803 +f 391/2410/804 395/2411/804 396/2412/804 +f 395/2413/805 672/2414/805 396/2415/805 +f 390/2416/806 393/2417/806 395/2418/806 +f 672/2419/807 394/2420/807 396/2421/807 +f 394/2422/808 392/2423/808 396/2424/808 +f 397/2425/809 400/2426/809 398/2427/809 +f 400/2428/810 402/2429/810 401/2430/810 +f 402/2431/811 404/2432/811 403/2433/811 +f 404/2434/812 397/2435/812 399/2436/812 +f 401/2437/813 403/2438/813 399/2439/813 +f 400/2440/814 397/2441/814 404/2442/814 +f 405/2443/815 408/2444/815 406/2445/815 +f 408/2446/816 410/2447/816 409/2448/816 +f 410/2449/817 412/2450/817 411/2451/817 +f 412/2452/818 405/2453/818 407/2454/818 +f 409/2455/819 411/2456/819 407/2457/819 +f 408/2458/820 405/2459/820 412/2460/820 +f 413/2461/821 416/2462/821 414/2463/821 +f 416/2464/822 418/2465/822 417/2466/822 +f 418/2467/823 420/2468/823 419/2469/823 +f 420/2470/824 413/2471/824 415/2472/824 +f 417/2473/825 419/2474/825 415/2475/825 +f 416/2476/826 413/2477/826 420/2478/826 +f 421/2479/827 424/2480/827 422/2481/827 +f 424/2482/828 426/2483/828 425/2484/828 +f 426/2485/829 428/2486/829 427/2487/829 +f 428/2488/830 421/2489/830 423/2490/830 +f 425/2491/831 427/2492/831 423/2493/831 +f 424/2494/832 421/2495/832 428/2496/832 +f 429/2497/833 432/2498/833 430/2499/833 +f 432/2500/834 434/2501/834 433/2502/834 +f 434/2503/835 436/2504/835 435/2505/835 +f 436/2506/836 429/2507/836 431/2508/836 +f 433/2509/837 435/2510/837 431/2511/837 +f 432/2512/838 429/2513/838 436/2514/838 +f 437/2515/839 440/2516/839 438/2517/839 +f 440/2518/840 442/2519/840 441/2520/840 +f 442/2521/841 444/2522/841 443/2523/841 +f 444/2524/842 437/2525/842 439/2526/842 +f 441/2527/843 443/2528/843 439/2529/843 +f 440/2530/844 437/2531/844 444/2532/844 +f 445/2533/845 448/2534/845 446/2535/845 +f 448/2536/846 450/2537/846 449/2538/846 +f 450/2539/847 452/2540/847 451/2541/847 +f 452/2542/848 445/2543/848 447/2544/848 +f 449/2545/849 451/2546/849 447/2547/849 +f 448/2548/850 445/2549/850 452/2550/850 +f 453/2551/851 456/2552/851 454/2553/851 +f 456/2554/852 458/2555/852 457/2556/852 +f 458/2557/853 460/2558/853 459/2559/853 +f 460/2560/854 453/2561/854 455/2562/854 +f 457/2563/855 459/2564/855 455/2565/855 +f 456/2566/856 453/2567/856 460/2568/856 +f 461/2569/857 464/2570/857 462/2571/857 +f 464/2572/858 466/2573/858 465/2574/858 +f 466/2575/859 468/2576/859 467/2577/859 +f 468/2578/860 461/2579/860 463/2580/860 +f 465/2581/861 467/2582/861 463/2583/861 +f 464/2584/862 461/2585/862 468/2586/862 +f 469/2587/863 472/2588/863 470/2589/863 +f 472/2590/864 474/2591/864 473/2592/864 +f 474/2593/865 476/2594/865 475/2595/865 +f 476/2596/866 469/2597/866 471/2598/866 +f 473/2599/867 475/2600/867 471/2601/867 +f 472/2602/868 469/2603/868 476/2604/868 +f 477/2605/869 480/2606/869 478/2607/869 +f 480/2608/870 482/2609/870 481/2610/870 +f 482/2611/871 484/2612/871 483/2613/871 +f 484/2614/872 477/2615/872 479/2616/872 +f 481/2617/873 483/2618/873 479/2619/873 +f 480/2620/874 477/2621/874 484/2622/874 +f 485/2623/875 488/2624/875 486/2625/875 +f 488/2626/876 490/2627/876 489/2628/876 +f 490/2629/877 492/2630/877 491/2631/877 +f 492/2632/878 485/2633/878 487/2634/878 +f 489/2635/879 491/2636/879 487/2637/879 +f 488/2638/880 485/2639/880 492/2640/880 +f 493/2641/881 496/2642/881 494/2643/881 +f 496/2644/882 498/2645/882 497/2646/882 +f 498/2647/883 500/2648/883 499/2649/883 +f 500/2650/884 493/2651/884 495/2652/884 +f 497/2653/885 499/2654/885 495/2655/885 +f 496/2656/886 493/2657/886 500/2658/886 +f 501/2659/887 504/2660/887 502/2661/887 +f 504/2662/888 506/2663/888 505/2664/888 +f 506/2665/889 508/2666/889 507/2667/889 +f 508/2668/890 501/2669/890 503/2670/890 +f 505/2671/891 507/2672/891 503/2673/891 +f 504/2674/892 501/2675/892 508/2676/892 +f 509/2677/893 512/2678/893 510/2679/893 +f 512/2680/894 514/2681/894 513/2682/894 +f 514/2683/895 516/2684/895 515/2685/895 +f 516/2686/896 509/2687/896 511/2688/896 +f 513/2689/897 515/2690/897 511/2691/897 +f 512/2692/898 509/2693/898 516/2694/898 +f 517/2695/899 520/2696/899 518/2697/899 +f 520/2698/900 522/2699/900 521/2700/900 +f 522/2701/901 524/2702/901 523/2703/901 +f 524/2704/902 517/2705/902 519/2706/902 +f 521/2707/903 523/2708/903 519/2709/903 +f 520/2710/904 517/2711/904 524/2712/904 +f 525/2713/905 528/2714/905 526/2715/905 +f 528/2716/906 530/2717/906 529/2718/906 +f 530/2719/907 532/2720/907 531/2721/907 +f 532/2722/908 525/2723/908 527/2724/908 +f 529/2725/909 531/2726/909 527/2727/909 +f 528/2728/910 525/2729/910 532/2730/910 +f 533/2731/911 536/2732/911 534/2733/911 +f 536/2734/912 538/2735/912 537/2736/912 +f 538/2737/913 540/2738/913 539/2739/913 +f 540/2740/914 533/2741/914 535/2742/914 +f 537/2743/915 539/2744/915 535/2745/915 +f 536/2746/916 533/2747/916 540/2748/916 +f 541/2749/917 544/2750/917 542/2751/917 +f 544/2752/918 546/2753/918 545/2754/918 +f 546/2755/919 548/2756/919 547/2757/919 +f 548/2758/920 541/2759/920 543/2760/920 +f 545/2761/921 547/2762/921 543/2763/921 +f 544/2764/922 541/2765/922 548/2766/922 +f 549/2767/923 552/2768/923 550/2769/923 +f 552/2770/924 554/2771/924 553/2772/924 +f 554/2773/925 556/2774/925 555/2775/925 +f 556/2776/926 549/2777/926 551/2778/926 +f 553/2779/927 555/2780/927 551/2781/927 +f 552/2782/928 549/2783/928 556/2784/928 +f 557/2785/929 560/2786/929 558/2787/929 +f 560/2788/930 562/2789/930 561/2790/930 +f 562/2791/931 564/2792/931 563/2793/931 +f 564/2794/932 557/2795/932 559/2796/932 +f 561/2797/933 563/2798/933 559/2799/933 +f 560/2800/934 557/2801/934 564/2802/934 +f 565/2803/935 568/2804/935 566/2805/935 +f 568/2806/936 570/2807/936 569/2808/936 +f 570/2809/937 572/2810/937 571/2811/937 +f 572/2812/938 565/2813/938 567/2814/938 +f 569/2815/939 571/2816/939 567/2817/939 +f 568/2818/940 565/2819/940 572/2820/940 +f 573/2821/941 576/2822/941 574/2823/941 +f 576/2824/942 578/2825/942 577/2826/942 +f 578/2827/943 580/2828/943 579/2829/943 +f 580/2830/944 573/2831/944 575/2832/944 +f 577/2833/945 579/2834/945 575/2835/945 +f 576/2836/946 573/2837/946 580/2838/946 +f 581/2839/947 584/2840/947 582/2841/947 +f 584/2842/948 586/2843/948 585/2844/948 +f 586/2845/949 588/2846/949 587/2847/949 +f 588/2848/950 581/2849/950 583/2850/950 +f 585/2851/951 587/2852/951 583/2853/951 +f 584/2854/952 581/2855/952 588/2856/952 +f 589/2857/953 592/2858/953 590/2859/953 +f 592/2860/954 594/2861/954 593/2862/954 +f 594/2863/955 596/2864/955 595/2865/955 +f 596/2866/956 589/2867/956 591/2868/956 +f 593/2869/957 595/2870/957 591/2871/957 +f 592/2872/958 589/2873/958 596/2874/958 +f 597/2875/959 600/2876/959 598/2877/959 +f 600/2878/960 602/2879/960 601/2880/960 +f 602/2881/961 604/2882/961 603/2883/961 +f 604/2884/962 597/2885/962 599/2886/962 +f 601/2887/963 603/2888/963 599/2889/963 +f 600/2890/964 597/2891/964 604/2892/964 +f 605/2893/965 608/2894/965 606/2895/965 +f 608/2896/966 610/2897/966 609/2898/966 +f 610/2899/967 612/2900/967 611/2901/967 +f 612/2902/968 605/2903/968 607/2904/968 +f 609/2905/969 611/2906/969 607/2907/969 +f 608/2908/970 605/2909/970 612/2910/970 +f 613/2911/971 616/2912/971 614/2913/971 +f 616/2914/972 618/2915/972 617/2916/972 +f 618/2917/973 620/2918/973 619/2919/973 +f 620/2920/974 613/2921/974 615/2922/974 +f 617/2923/975 619/2924/975 615/2925/975 +f 616/2926/976 613/2927/976 620/2928/976 +f 621/2929/977 624/2930/977 622/2931/977 +f 624/2932/978 626/2933/978 625/2934/978 +f 626/2935/979 628/2936/979 627/2937/979 +f 628/2938/980 621/2939/980 623/2940/980 +f 625/2941/981 627/2942/981 623/2943/981 +f 624/2944/982 621/2945/982 628/2946/982 +f 629/2947/983 632/2948/983 630/2949/983 +f 632/2950/984 634/2951/984 633/2952/984 +f 634/2953/985 636/2954/985 635/2955/985 +f 636/2956/986 629/2957/986 631/2958/986 +f 633/2959/987 635/2960/987 631/2961/987 +f 632/2962/988 629/2963/988 636/2964/988 +f 637/2965/989 640/2966/989 638/2967/989 +f 640/2968/990 642/2969/990 641/2970/990 +f 642/2971/991 644/2972/991 643/2973/991 +f 644/2974/992 637/2975/992 639/2976/992 +f 641/2977/993 643/2978/993 639/2979/993 +f 640/2980/994 637/2981/994 644/2982/994 +f 645/2983/995 648/2984/995 646/2985/995 +f 648/2986/996 650/2987/996 649/2988/996 +f 650/2989/997 652/2990/997 651/2991/997 +f 652/2992/998 645/2993/998 647/2994/998 +f 649/2995/999 651/2996/999 647/2997/999 +f 648/2998/1000 645/2999/1000 652/3000/1000 +f 653/3001/1001 656/3002/1001 654/3003/1001 +f 656/3004/1002 658/3005/1002 657/3006/1002 +f 658/3007/1003 660/3008/1003 659/3009/1003 +f 660/3010/1004 653/3011/1004 655/3012/1004 +f 657/3013/1005 659/3014/1005 655/3015/1005 +f 656/3016/1006 653/3017/1006 660/3018/1006 +f 661/3019/1007 664/3020/1007 662/3021/1007 +f 664/3022/1008 666/3023/1008 665/3024/1008 +f 666/3025/1009 668/3026/1009 667/3027/1009 +f 668/3028/1010 661/3029/1010 663/3030/1010 +f 665/3031/1011 667/3032/1011 663/3033/1011 +f 664/3034/1012 661/3035/1012 668/3036/1012 \ No newline at end of file diff --git a/src/main/resources/assets/hbm/textures/models/pheodoors/cargo_door.png b/src/main/resources/assets/hbm/textures/models/pheodoors/cargo_door.png new file mode 100644 index 0000000000000000000000000000000000000000..86c06d74b933032bca600ddd16af10935a3e442c GIT binary patch literal 6851 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 xIqnUByBt3Q00960yF=Kj00006Nkl Date: Sun, 14 Jun 2026 20:19:52 -0400 Subject: [PATCH 012/107] i forgor lang --- src/main/resources/assets/hbm/lang/en_US.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d43f47da4..ac9b09f06 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5209,6 +5209,7 @@ tile.capacitor_niobium.name=Niobium Capacitor (LEGACY) tile.capacitor_schrabidate.name=Schrabidate Capacitor (LEGACY) tile.capacitor_tantalium.name=Tantalum Capacitor (LEGACY) tile.capacitor.desc=Input: Top$Output: Bottom, via Capacitor Bus +tile.cargo_door.name=Cargo Door tile.cargo_elevator.name=Cargo Elevator tile.charge_c4.name=Demolition Charge tile.charge_dynamite.name=Time Bomb From 702fae393d1fd021b8fc2a22af56076d6c83a0e9 Mon Sep 17 00:00:00 2001 From: FluffsADev Date: Sun, 14 Jun 2026 22:45:40 -0400 Subject: [PATCH 013/107] crafting and hardness cus im dum --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../inventory/recipes/AssemblyMachineRecipes.java | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 5dd1c775e..b49d77f65 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -2036,7 +2036,7 @@ public class ModBlocks { round_airlock_door = new BlockDoorGeneric(Material.iron, DoorDecl.ROUND_AIRLOCK_DOOR).setBlockName("round_airlock_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); sliding_seal_door = new BlockDoorGeneric(Material.iron, DoorDecl.SLIDING_SEAL_DOOR).setBlockName("sliding_seal_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); water_door = new BlockDoorGeneric(Material.iron, DoorDecl.WATER_DOOR).setBlockName("water_door").setHardness(5.0F).setResistance(50.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - cargo_door = new BlockDoorGeneric(Material.iron, DoorDecl.CARGO_DOOR).setBlockName("cargo_door").setHardness(20.0F).setResistance(2_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + cargo_door = new BlockDoorGeneric(Material.iron, DoorDecl.CARGO_DOOR).setBlockName("cargo_door").setHardness(5.0F).setResistance(50.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); door_metal = new BlockModDoor(Material.iron).setBlockName("door_metal").setHardness(5.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":door_metal"); door_office = new BlockModDoor(Material.iron).setBlockName("door_office").setHardness(10.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":door_office"); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index cb22a3c3c..4fe803180 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -58,7 +58,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { @Override public void registerDefaults() { boolean no528 = !GeneralConfig.enable528; - + // plates and ingots String autoPlate = "autoswitch.plates"; this.register(new GenericRecipe("ass.plateiron").setup(60, 100).outputItems(new ItemStack(ModItems.plate_iron, 1)).inputItems(new OreDictStack(IRON.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); @@ -74,7 +74,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.plateweaponsteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_weaponsteel, 1)).inputItems(new OreDictStack(WEAPONSTEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); this.register(new GenericRecipe("ass.platesaturnite").setup(60, 100).outputItems(new ItemStack(ModItems.plate_saturnite, 1)).inputItems(new OreDictStack(BIGMT.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); this.register(new GenericRecipe("ass.platedura").setup(60, 100).outputItems(new ItemStack(ModItems.plate_dura_steel, 1)).inputItems(new OreDictStack(DURA.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); - + this.register(new GenericRecipe("ass.platemixed").setup(50, 100).outputItems(new ItemStack(ModItems.plate_mixed, 4)) .inputItems(new OreDictStack(CU.plate(), 2), new ComparableStack(ModItems.neutron_reflector, 1), new OreDictStack(BIGMT.plate(), 1))); this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) @@ -118,7 +118,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(ASBESTOS.ingot(), 1), new ComparableStack(Items.string, 8))); this.register(new GenericRecipe("ass.filtercoal").setup(50, 100).outputItems(new ItemStack(ModItems.filter_coal, 1)) .inputItems(new OreDictStack(COAL.dust(), 4), new ComparableStack(Items.string, 2), new ComparableStack(Items.paper, 1))); - + // crafting parts if(!GeneralConfig.enable528) { // precass otherwise this.register(new GenericRecipe("ass.chip").setup(50, 250).outputItems(DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CHIP)) @@ -218,7 +218,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); this.register(new GenericRecipe("ass.silohatchlarge").setup(300, 100).outputItems(new ItemStack(ModBlocks.silo_hatch_large, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 8))); - + this.register(new GenericRecipe("ass.cargodoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.cargo_door, 1)) + .inputItems(new ComparableStack(ModBlocks.steel_beam, 32), new OreDictStack(STEEL.plate(), 4), new OreDictStack(DURA.bolt(), 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(KEY_GRAY, 1))); // decoration this.register(new GenericRecipe("ass.capnuka").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.NUKA)) .inputItems(new ComparableStack(ModItems.cap_nuka, 64), new ComparableStack(ModItems.cap_nuka, 64))); @@ -542,7 +543,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.pwrneutronsource").setup(200, 500).outputItems(new ItemStack(ModBlocks.pwr_neutron_source, 1)) .inputItems(new OreDictStack(ZR.plateWelded(), 1), new ComparableStack(ModItems.billet_ra226be, 3)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ZR.plateWelded(), 1), new ComparableStack(ModItems.billet_ra226be, 3))); - + // fusion reactor this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_torus_core, 1)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BISMOID)) @@ -584,7 +585,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(BSCCO.wireDense(), 32), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.PLASTIC), new OreDictStack(BSCCO.wireDense(), 32), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.COMPUTER)) .setPools528(GenericRecipes.POOL_PREFIX_528 + "chlorophyte")); - + // watz this.register(new GenericRecipe("ass.watzrod").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_element, 3)) .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(ZR.ingot(), 2), new OreDictStack(BIGMT.ingot(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4)) From 9106da853b573e0e978ea5a91cfaa65f5f42cd55 Mon Sep 17 00:00:00 2001 From: FluffsADev Date: Sun, 14 Jun 2026 23:02:33 -0400 Subject: [PATCH 014/107] Update cargo_door.png --- .../textures/models/pheodoors/cargo_door.png | Bin 6851 -> 7154 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/models/pheodoors/cargo_door.png b/src/main/resources/assets/hbm/textures/models/pheodoors/cargo_door.png index 86c06d74b933032bca600ddd16af10935a3e442c..141bcc969b3b9002987cdce7099214f6286300c4 100644 GIT binary patch literal 7154 zcmWkzcOX??9KUbyJTj67UObx!AtAg+*0ae@Mn<-0ZyutQl|tDW$sXD9Je0j9JL_d; zWN*Ls`{Uem?)lzx?z#7TKcDY7QQDfy)Rat=002;9R1|bcHSYgHK~B21$y)Z1DmYff z*aHA)zW-l9iTpIo0KlA!QION~P1|^?R*ca1zbGtfIK@*gU~a6qki#p`J1QS#dWKYN zpJBHxdXYDBcpuPH-EiSYetLBPhI7{56fm0RO(A1qq2aboYoUMECHto0J2*xm_e*%? zEs@RBm5z;4fx^p?kn^AmseG0(=ZA+=o-&&H>4hHsmm!ynX*B)mGVjE4C|=Cly{PtP z281Q0TKk^VLV&Ix<{6JToIbd-2JbKe(B=LN3^2D;GWBtT)I9br`S{yMLb`QwGBCg$ zsvcU-2mmRTA7mY+et0Gzoyb3E(j%e5iYIS=h&Sg;D^KkhFQw@wb^qHKXs!#Y7+K{E zZvhZfQ&RvgxY@M^uIDX$%fiR!!HTC82GOCmeE$kL#L3k)XLif#|6cEJ@bvY=(_fC( zw^t^oVfPe%9{t>AUSF4xkpA9&;$LG8TpivecpVSX}9aJz>cz9e}yBzy!Nm;qJJoeRmO`l1b+%?RVvqujFs_Udtc8w8nLE2781OE@S~8U zyb#LE-rd6v9#(R#HTlqIt8`tAiHbCA|F$50d(5_Z#(_A)TTBL{Q-mG!vybS|ylH6E#w*=!maOXg(JzusD=e5Xq=foAz+Onl);Qod|V z6oE_57xC2M!`NkVQZy&!g51c0S%ZVv;DdHz!c1{}p~6@0NlM9o8|`M8p4HL^=q)bi z2#8G0=e9pRrjO1JX&Whx?!&(LH_>Jf`8p|~{(jj&SJk8{BitiBiZ z=A4d>&R1S?C|JH)b&6D?vyfn76s*A4M7GV-^)1OqRGDayqySpL8l;!Z?RSmrv5UR?2|{*f;cB#wAS!kj@G#8YWbe#cMDFY8 z_lp*}cFMUJ&E_H{4m<0E=a?`h?LcAu(H7blP{85?Duw}ItfosN7sL;KzX-l_LQDHH z5~7|jx*mfHpwJ`q_xIDkNuKLXUw7PuVJ9vTdP$`N{Emw}XgPkss61%(+FYSU$R&`< z%*=SMh1`w%eg`l;`%`ayiEOf!VEVX75-c%}tTI^MvX%OM(Gpru`&4atHLXUggD84* zVe&1#zTY73JRCB8vd}Yk83Qd}4Z>%hfBQ$=|=Ybho-w$)CO~qz{p1$MJd4*bWO^k4Z-p}cbreg}V9?pC4yY*L2 zNW|qu*_H?%$NM^ZleR6Aag{a1e>c<+q<;?Rb9Ku6gSxkNFsBufptN0d^XtvYGXT+b zo3q6px~Jv_M(Q)_Iz)H8i{`o4$>!XMXdZA&7)-5ofz7x)czch;9dQz|q8ur)pdRn0 zpHtAgwuF5tH}EQ^_gk_W`-flo?MtPW_Or9+^C5H{Pq?{}B&dp{zglE-qegkAAs>N3 z*6L_>MLyWL=+f*`d*nQTC@~l@BJ+$5#(+67VMq#*O)F-loQk(#PimR){*jgCsnYf1 zni5&hbOB|0z(@gX&q-SG@PMn;K5^*lkDE>xL4qJ&2j0B6=&Rb+y2rg#a5Qz9S7cuw zHHo5LWmBxLJN`cGl{zNGNPhl%{RyexWP8Ujpv$UumV`X2$dJbOjmN>| zRn)mOmqZ%%^q|A=5ejc_Z~8*5+9~S(%M*9^#RrCc_~<@0rGDjX#E|Kw5dKrMD=sd0 z!(Z_2k)L6HRNbkMyJwa4<+V;@sDP6nn8)0YxKZtsTn{PRBfY1UpnFj<!&G=vYe}J%3#)2Ao}~!MelX#<9&Ugo<0k^n14FcD^oT7kSSD9C~f1`GT`@7 zdPlmvlV$;d%Y1hMGo}@S6Z{BH;%)6G4f>Q~Pc+1sV${X3Qt2s510$CN`FuxKx7`yi zoPLG}?&6F|0}Rc-85N?h(A-XDa2FIC0~uV&Z~v^0WTf&f_y$t#ov#2`fQ3(%U7!Vt zcG7o6LbQ42I9x7U?|**{9d8VV;{-uVEXt3~FPz3?f#r@wfefT%=-nqqOXQu!NERL9 zvgEsEghCJd!a%;cVMh$_>C4vU?*}$GI}ywe)G=5>;&=oh{r@%vmN)5H;)Nz;F*u%P zJmngpB`^A6ae#-FjtQvJ%;vyDkDwciN9@;(H>PpS^?)Q^LB_isCEwudL2t#5 zzg)u((d0tobqmEvST}`lFP$0>DQD3h6UPiezW_!Q;cT3wE7ht1fH6h^%e0c5+w(+# z@t%+pDvqqtlk2-}9TspKvUl|C0^zD!{F^+dY#)T2?)@1yKu5F>{FDoeo!Wso(-XMm zswBZUmWi)6w|aI(9KI;Bl?aI|Lj{!2ovzBfyMDzw5M((nd?#zvfyuD^`@w;@S%A+( zRI9nz0A<#qtN|gARq?=2#@W~CYdAZgX3L5JSg4RFg0F}i!qpgsTm~mVRJ5|FPj8l5 z2FMPF7DHdn1mjdIfRg#ux;<#O$TWHKL4EHgsPeP$!0x~m>Rc$b3%M%E6Iz^j$J)trV=e(eR~zA|^d$*}k}o2AiP{O!KHgR* zanW~=h68c%Nk^)!IrbaEJuh$?*1{dM1R00MM>YP7bGUX zdf4t-YI|T<(iS&LihCWtjq+5p?!HpSgzA z*aW91+IISayZ$;V4bcl_nG*h4C;Wq|hJ=#4kc}(c5y_a|_@1A8Lm!9RpQ209s0o{Kq5ZUAO02Q5qufPm_(nT^>546;EbI@=6wz*~O`- zA>bp6=2E76zACPq=&Z>yF(VdMAW)t*k$O{+=m^@DMllAxmwd@!U(5-zropB0peb_b za^^d~03Hx-YLaR2ItP%;blHLL}MnD|71EZWcygXz+MU;v6w%pL;S(`P3A7Ct-E6u0A zJMp5ps&!}oS#gN5Y8bm$9PY2Xa361&sVJbrMPQmV5MrwZ#|j+3fHDoaH;6XrxoFOv z8O<=twb&CiTZw$*1os@zZ!_H<6h)>3^~!v30tOLvZkKUeT}6_>V95Z64^l8Y2;lV4 zW}3*ceA6;_IDsotOBM(*&=J&5B-GpfTar`7H5xTTF~Dnyqy&I?kmtmba!+jv%56ojpqbcul3*#=IO* zl?jWyuioZqj#DD6D0xX7nXLWt>|BORCYnS zGFqGi;tzyhvtOgBIR*_oW!O~a%TY1&^KMWSsxBOv$U?_@XQWZheewy1%MBeY z0aZEl&=gMX6K0APVY37uLhRN_lZv?>xA5NDBeC=?I9f=s2MgEc;`q{8B}8NL;aIK) zoP?0erN=3bCrkVv?Mym4dj$avEae`+=H#C_nKY$C5+UC&wc>kS5Irtf0xoO_bq)q3 z56#1S5B^0#=muQs-g1ru?RQ<+`&}4EM`!2BFpKRT!Y8 z*FspB&w9_akoMernM!(4R`;b2+hLIt17>>X8JV8eD#6$*@+wWO_7Pbsn zr))kzW4BAb7MLgw2o zB#*lV#*J!C$FIYP=W0=Uk8Ji)fWjW~$w2rqP*XpgM9r`p@RlvSigmpAVcS*uHt85p6U|@KtTj#`{g#Q zC-zg&xb(vhq~%r421$pCLlP&nz*jb$Y0Mg=%y zsV_O~ZB4ZXSjCMraL#5|`vqiNz9H?$SI6`>lDq3%Yda9V1OTdWcug$nZXX6Lq|7L* z6&!Sb5l*zRQ&58wEEfU%1?5JN;ayNCWqE-}A3p^Nno7ZU4FI`9!0=`Ksdzx@=YU=N zxfC8@4djeyhcg~r-?#3p_Vw2qnE=ej>6zgZO3f3HugsBnh#{X`p%F-IN6i>inyW0Y zqlxbHpoa8ZmRa>s4ExGA&uT%`q9Jysk;riK!)vgtle$-uTk+Gh+Fg{}qx&Yx@r93K zD`#eAaNLnQ8QlTFlN3(@ceMFTP{>xJ5m#zXfs5_ ztRqYG6KYs|_V8Hv(rYr6@r%%K9*54|Nm)gU@tS+rtXW`TvfkGHI%g?ewbU%&pP!h&d0F+2=;2; zEW|$(ZIvk=hTB6nZ0iMXx6Cn|I$pVDlLJ|7JGX~SBr(}`nMxruoZ4ZVTG{W{KAksY zc^TOUtB#du+;@<@A$vPI#4v-;`k`Q1ZFN-AgrZmCtQ=P;eTu@M!k0$PaQ>2MF1eLP z?$*4_mi-Kqmx&#Q8xOuXKYQicl5I*zhIG=dC)`r(x%tZMMi?U0k3Wh|MY-n+dusJ3 zKaS9|=7dpB%Je4*fUbh-+fAvm(7;Wv_0k4OMV+WeM*9?{8sIvka!1tiZ@6~Q+b`K1 z7iMoYyVm}6j${`Q@zqbY#_GXtHF_*}11 z1G%T732Bm{f(*{_g||z2mE*A=Lru z*5==4lHcDb$?V~oV{RN)I6BW>e7b!AvBO4$_$an(4hbw4M)A34meDwzc6y?^u2>^u3){KX$(G&eHi1$TAx;Ucz_WA$9w(qy) zvJ%F))b@`zwd6jncgrWJ>Qe1J@g{cpmq~eNeG-B3zGlb7)tr;!f-~2@xW6WHX@L!4 zDuOh~IJMzBR&b^V!yhin%mQT@sg>=-Q|(?*_kI>t=U#nXl6VGq$+_dQsePuge?&Wj z`1mMF_xv_|N3U*75d`0F0U;;kxG6!N_vuCpROZd0LTriDynRN79o|j((c}((WHr;@ z&B~IGJz`bu=k<*%xkX4J%9*gD*=VuFn+a$JB6ya^#{SvOUvHhFl!)3`BReY zPU)G2q3lL$4fc`#H*@)2p}M5fg2{i~4YjKe_0MzoK2n|Cb^+4@bM@>0CyYw}tgJ;IAk0xXNA~D4R`fU80r*}N zMYj$w zi5b2e{Dn?P>m1X{`k`8QbmsVxY3WTiN3vOQ=~45vkgyvUh>n3;%2>svbfTanZS7yW zyCHv1{iZL^%ad4P_}UEK`{W*Hz6qPM$tYZ8@*H)t!r?fRo0%J%sM@UpY@yCerlN}; zs;@IuRB46yx?PMVHyP|FEK^y}a@Q=^Am!Gs&&Lr5lWF{CyXBP`|tNqO}iU`{@gcyeXGkPgqMt zZ~TGUa2bsj+qRmL*(%9m!q{I`iLEx6)}$=vIY`wz-WN9S*ZsL@Y(U?As!B6w;xe0% zWTqxSz~UA)8{@yELXK1gE*250-9dlvs}(r=DyG}r0e8eR3I?-nVHfT%F+=hh>H zyxO?rUW*rM}(2Wbm zF6|`fuRp8BZy+CNwDmYg-q^9f!JF>KZRs}fhHmdJ{A1(Bv)6%T6asz=Rnb23Eqp<#BWP>Dh=x=yEa0<>7CAT0=jL z2dCoidrS(L1Zz!i0zE}RC)^)@Ey1vo>J2lc6%YK%a$Y)IPih+eQ|Hz)DpwW7nRH?! zoA3r=x3#SMRxm0*#$e-H=i!#8ROJ7j1pav2{Rx#!gKdw4ZHnV$owU$l^+^wHex7>$ z8L)$&lxk9ZTuEHXTORx=7WP-W1{EvF1v2H(IS@4e%*W4FmVCN1rf*gh=NgTZiX{Rz zUid)sWOId6!Jp-&Ah|L7*`b^L*z&-8h6j8>=n3r||Bc{DzcG9uzD5Wo-7-dtj^D?6 z>4CjCrG#eNY8QJDgi7NUH3S-8x7EopNKt$T^!lRP-!YzbaO^6_7XSLz+86rDmLS;c zzu29C8-GBBq*O~Or9H8jbYgK*B!|!B2EFzdusILn!o81o=R8#fG@g+j)4V=c_-YCE zMP9v-FlK7C-+gu>)yQeeVengPy$(;GCHTb_dD}<-Mfba+eM_=KVOez}U69T4Z1U5{ zCKtq*ItNp|ep}1oZPU`ZYtqx({gkpTZSZQy^g2VuwX``Xk3nZFpRfJw z&+_Z;>Z0p1} zrsJ59+~iB!%LgvcZJm0L=lZPGy&y01+4J{5{OJ4(FT60{+uKVP=gysLkC!f8TAdTj zi{ph07bYlw_Uzds_aopw>O|crKby_wyoWRo+6IZ|dKg9Ld8p z#(0s64=p=f&(oqqb%sh0XV6(DVu>ETb)`KNz%b&b5Be#N9= zp@&nzAf4yO!2I{APRJFn3eWl1=xxx2m_jpZq*bn;61ew#AlD3r=>P zbGV&y2ibAvd3?y7rgK33RtvD5&f})B zHQ8Fb#^BkS^e3j;Irxs?0Qf`6pOgaFX#tde{^^~TYJo4mytyc_XJD<-~hQi zR&uxVwY3A}^nVNHW%;hWo_qrIk^%6CEKqF%b}DFPfcx)XoBs)_e`KpbV>p^4FUp`k zrsJB=KpM)}frm1zhh=%6_o8d2=`-v#^4fAQ3fMn5 z0A+w15ExINN+%JX9RN_t+s^5{hry#9#LnH`JZ?D!Iv>xsHUpOF;wY3KQXy7`Ap9qV zkOHaFEh;{f&OG=F>A(N$(=}TF&N=sQH>P4z`djb3cM=Ri8`a})i6zhqe73{w6aY&9 z&a>+UJv)F!!y)EPo(Yfi6SVi5DMPsi29dQSPCA4(o6pvBoI)tH0#Ky-0B{YevlPuV zK=pc^w~5GSVCQwp1Zqj_sw>A4R=v;8wx(g#??3rQY+v+9?1bfy`XMuKK5|!+VvF|U>QDx_euTsJXhYH zd+lL4%|{M^b8-PvqGtzCJHIE@)1v437d-pEr`z^b>|@zG#_@dlKS zIsd-7=`rUuNJb&Ov-(5-2Km5}(ZGNQx;zxhc=DGSG-<`ks+T_T2N(+NOp2s$q zUPDH~^VlAA^i#k8z4^tz{r>7&ee)`jTS`=lw)6ktH!QaeSn7|;TaIM!=LXHxnt$-@WF<3KB4Aa#Yv=oU~0|3Py+!q1-HI{ zmlo$>|27`Ls*84BR~Y~u2#UUNVR3CoDm(Xo9(k$lYychdXTSG(o8P8`;t6|>N2yHG z_qq#q{%89LPcyKv^S|{6c-nyV_}TK-CO{~s@rWeL0r1D_|JE^NL2uwq$Mk!{E>Xm-=6NXI4bro8|z=WfN!zfUe1iD+6>z^5}hl@{yGR>^-$VXgi8HfRzJ4{fGzjxB$F?aIso%Af|xH zDz2}4kaA9sJ|YCbWEyW}fJ@6V5eI-E$8t5SKavGbtPDWvXJ<1KNPPiqJiu}c!WYm; z&6u0k96;7JtTF&bB|3~U00)7kxG$dhK{^|7fOc@Cm;)>=j;r?CXXma{O4*OAQaqtD zffp^Tu>l$tWIc-ZzLn&y3=%~V+2`|^8@N+O|IqzQXgZ9G83{%H&NtLHDQI@1b& zk%0#<^YZKGjx^X_tF%uJ0QS#e(!l{*3{(SGh^By(8X>$E4`4gpO7{yp!0A>1B>T4? z%@h1o20$l6s)q~^&4rfI0djzU|Ml;!(qDf4E6v|Ue$@iBT|=%rrhp?c`bzblZ(i33 zl*#}WlmWc_QOsg#Y`|1iJ`MuQ+5rfF45^BMfzZVPUVLqx^%4A#t)OQ*V9gG&Ov51Z zI6#6`cc2}>$`2hv;K`H$*4VsIzx4%t`=#yl!1kd5$g)na(^Uol&|$B>x;XdrW>ET2 zEuf?9x)&elaR85l%z`xnK;+r;B8>IEdJQ8lWa>am{_6GfJbJ6B;0D$ffEWNy z0T>801uO7jo`2=25yie}mlnYE5-nhPo%&qcc6vCe(LwD1P_>U7!1@Ac2e{q{gO~=q z4`^ipl>yWe=mA>5xh16omIIv4+X1S40a3>@T`hr{$Lip!pKEjvV5!%}`FGg?Jo!M& zDT?d>&;V2xu$lpIs?h*o2fzSOYajzOtQx3518LdQ4^-j{$Z>$S9TmQS9BO5NP0J7w z))t476Ce#oE)H451MH{MyNA}nLtntnH5c&8GuUAVuog8ta=R>n1svd5eF2dj02m?z zbZG-h)z%JR)3qKC#l8Trd{8{tzvmG=WfpH(&H$8#VyWpirS+GApvNn`(2K7v&I>s} z)f7MqMg}U3;4Q` z0jM<;a)7ESfH4Ye&nG|m*Yxl=el6wT+3JDFULWcCcz#61Rz@If^fBTk{_Z!40JgIU>kD}Lw+|L7AY%H1 z{QdDU_N%P~sg0qnE-$^x|l zTy7O_7nB2Z`T7+zvx|t;22u}9Y4&9_4_D0coFL_cGuU+ji}G8k4^${pf$1>q%#rlt zhzQaJ7ewS{wVi@a*rWzf%K;{jJ^Gt-YX`6#0R!Og|KWo+=KiV2zuB6CA?RTMaG$`Z zp7^af@?+u0Gf#c1{g6Mp_>U7^8<>tCgA73_)weCO0T7W70HBr6i|5Pv4Mvdx*x@t+ z5#Ew<4>oY5Yh{ow^soy+s7m2w!0z!9So8rIz=l+79(#`aL!*JLt5?w#^39N|OJ1I#t$%t7Eo&YS5Ah`&)E^Y z$RAEWqu2r1`Sb~J?zb`lEQPQHT9+_k?EumK0Du?ftsjieAWRqJ0DN)HV>!U2A|j~I zvM&p6%zP(n0Y?l$oDu*UgD3+aEDQr6+8==B0Z#_7rd3UcRt(b>yvbMrJ9r0ifRc?H7VP!owX`?hUL0-ti|_r@VRVMb0M;F>GJpjs8Ztl> zLgsOR$|>Mh*eTYanuD$_@OB#^y!e9%Dx2uLf&)~!QPB{ZGpW~ma~cz+OEL zVC%Jc@a*=Siwzt^bMPh|I2O^0BWoG-)&STzL++LWBO8yY5YtIzJiY44k=_hg86X)d zwum@@mq*XNyf(rJ;FQEIU~<8pK(z4FQ{ke}Ed|xMv1|bB^gf*rOm%M@9+jnPdc^7p zFCM@Kd0q-EToDJzX#u)whsX(Xn^fT}$O*cll036?bxa^nbh);=YojP09_@w?9&Avk zS^{%2fPIe5qvtlC7j_OP2b;+zP#)FWI-?(HD%sfCLW4qTI6+lJ5ML+~gd&R453BjQ zWB{uLL=wK`0Jd&x{j>Qa6!;KY)M^4_#uP*=ehHn1hR*-Mln?SoJ|Aw=wc|CsyF>=i zzzpJ>q^cd(H}>cr6np|!Szq4Pg5wG9KJT`M%7 z4h)4S13drAqAqI*)cPYCz~=Wjz@D?F&Z}R+_uaHwrcuR&o*e}K000VXNkl_hB>bznpvwo4BttQJ81y~GlzA!J<~Ad+Et^r#=OLYRdPEW&b&oD9%44bhso zv8Z6%5Q|7Q$WauLvjgmz=Xesn0WCiZBTdfBaDN@M_46}@->!u#Of^-unD!Hw9Nw*v?0G8(C`fUtIeK^%Z5Y6sBt z=(+=~&7FoM8|H1df>GVt;{eJIy?6kdw+nq_0MDgsrFc^|yP2~suNcb?P{jd=XznK> zDO=S^!scUyPrC?oZ_mv`idGI_;mH7{_KN6zH_ZX41$a|gWEBL!0Z93yXaR&y0l5L8 z*Pg!3<=%D~cw`A&1dv`{rF*slJ-6-l!mOiq0qT_T*zUPtD>$_S*ml@+`>x7CYP0}S z{va(N7xYNQE}f2k0kz%M5aYeO=aRK;@;E@3 zAH~+SbjEE)22fU6YC+5S0us2 ziVUE0eyKF8Y|CyF?}2LASW`;Wt_aErbbVkcAy{8P?wj$RwGRNb5kgfmK+b>?vHa*I z`}*ViA__o>w2$0?nB69uKn;OXew7_S(MOL3B6l#Mmbc?V)b3~?+PPZ=Qg0C1_w;_s zMbEq1V$H; zBd1VwP4uPcq0n|lGE6BaQq)rVrtJ(7rlk}e;&jL(U;>8o2KB=I6zJc&RuuZ-NpmdZW7g(;%}AEISaOR;dSIq zrTNw?&vH3OoVT@Hsr^HR(dltf6sLe8s$fa|rO*$MGf0&Rt((>g##)gyEq&n#eLJLf z!1a|86gf38YM-Xt5H8OKpi;Ol=EymJJgT-F0NeZFHyp5G2RHD>7Czj?<&C%BEgB$4 zgut;nNOs}4WyrN(r>&eNG0L}Tz5as_KRzBUpf5-0TF79*4^P&mzsOO09ks_nE1RTB zP`1fg4!d-EFS-b@bNtzk^$1aXVd{a=IRHV*|Dzv1*IZplx(c~eZ!Z-}Q%~e<0;SHY zh=t!Sb9@fPc7O;u_wNOX*eQ)X8hSsc*4f=by^qZLR91+*ozaxx?NGw{BYi)b_pR1Y z;z#Jx`xVDF1q_t|at5YoKtvRK+@|PKxA~^MjuCoufU(uasKX!nTGg37EB&9xz zpWpesJ#t`05l=aAfOx)x94F|q{An5WOj=K3>cF&Cua54k9iY@C%l3Tw(@C##L!m+? zrv)B|Ql7SZ)4qcU)iOX|^a*ujXjNZABpXGN{&${z zat@t;r?Ca#2R!gQPW$_d9b2pH0AoRAfW94f+{nc<=(TbRA{Ra%rPoq)X$R*pd;t9P zllG9)%ZaWLJqAkc2BiY2cA%=Uxq+Q~PxS^yaRutl12A~(k8@Ooh1W{S5zCBx0s3M3 z${>;2*LVFu4!J1lTGVm?bUe?i!ot%~eC^@p&yQD^`oUg$XO_H;8*24_MPy&dZCz74 z@P?YV`JHNiXi7uD2X7QvYl@X?dZlv^qf*VK;)ArO6>qqJvJt=#3QJ_0brx%@<5UqDo^37BD|RO_9b zWp*sp@}7ITYH8SU1y`!N)VG6&hOI~Kjl$D%10vc3NoAr^J3-_tsj>NwvNWs|eJPhO zHkSWiuX`+9X(_I+)5#HXJJn7vF5hdHVwTyhtfSoVE)FfFFa<|Wpp`KH@8wUdmoQ^^nxQ2e96W2S2%WMAN1qM!6{;2*Q(YJH&IXP%K9+}P~ z2#Dv9{BZ;aNIg+30}K_;hQs+m|$foqgcPS6L_C`@`RlWk;psSPL3?FLpVv-Gui z4&{VeugU7)1pRx-eGnQ9}9Ed!KtEc<(bOYmps*XCHAduzXs*4G#My znF=O0UGt3%ekffhkXsa*i(bwVL|+c7GC=8OSHx&`fQV&sbUpFdBXj)MbB?yiX@ZzF z#;w`(p(q_Nx=ujRR|e?o2F}5WELsagkKQxzMbz5?av#?II(W%1jT1Iz4an*7xpw68 zM{{#&N9DAYT6eiquKhk5&{-N}I+`6IXE4DiqrPcJ9UmGsSVv{faFauBfJ6&Poc67K zq?`;8y{rcgekg1#< zKFpbmrPRykaA_K$1Iqj1=s_GHM~OPRN+nHgl$O_PJ?8R9?J4yUaNwv6Fm%q> z_s!WwqVK|v%@G94Mc=U$S$D9$ST6dMA5c3=%SZJ^_jA|!{ODRgJW*-~AhaF1fl6>7 z@xH!C>A=?*z@bsWTREYll=28tU@Zsed(?JE&<|K@h|zkr{kegv&<-yp6diE-J^RW5 zTe+y#T!SLvtd;}xJx0*?i#R}Ei>0=|lmjS-R7x)801?ORD+gq!fLuc&J3x(KQiD=; z&9rOnSZeT6EJhHvsN(+#3LQ xIqnUByBt3Q00960yF=Kj00006Nkl Date: Mon, 15 Jun 2026 17:27:13 +0300 Subject: [PATCH 015/107] again --- src/main/resources/assets/hbm/lang/ru_RU.lang | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 7cb42ebf1..62ff26f1e 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1645,8 +1645,8 @@ item.ammo_shell_apfsds_t.name=240мм APFSTS-T item.ammo_shell_explosive.name=240мм Фугасный снаряд item.ammo_shell_w9.name=240мм Ядерный снаряд W9 item.ammo_secret.bmg50_equestrian.name=Патрон .50 BMG (Разрушитель) -item.ammo_secret.folly_nuke.name=Серебрянная пуля (Ядерная) -item.ammo_secret.folly_sm.name=Серебрянная пуля +item.ammo_secret.folly_nuke.name=Серебряная пуля (Ядерная) +item.ammo_secret.folly_sm.name=Серебряная пуля item.ammo_secret.g12_equestrian.name=Картечь 12-го калибра (Железнодорожный гвоздь) item.ammo_secret.m44_equestrian.name=Патрон .44 магнум (Разрыватель голов) item.ammo_secret.p35_800.name=Патрон .35-800 V9 @@ -2610,7 +2610,7 @@ item.fluid_identifier_multi.name=Мульти-жидкостный иденти item.fluid_identifier_multi.info=Жидкостный идентификатор для: item.fluid_identifier_multi.info2=Второй тип: item.fluid_pack_empty.name=Большой жидкостный контейнер -item.fluid_pack_full.name=%s - упакованно +item.fluid_pack_full.name=%s - упаковано item.fluid_tank_empty.name=Пустой универсальный резервуар для жидкости item.fluid_tank_full.name=Универсальный резервуар для жидкости: %s item.fluid_tank_lead_empty.name=Пустой резервуар для опасных материалов From d91f85e610ea48b79f996c91db5432912d9a4872 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Mon, 15 Jun 2026 22:01:14 +0200 Subject: [PATCH 016/107] death --- changelog | 9 ++++++- src/main/java/com/hbm/config/WorldConfig.java | 2 -- .../inventory/gui/GUIPneumoStorageAccess.java | 2 -- .../inventory/recipes/ShredderRecipes.java | 5 ++-- src/main/java/com/hbm/lib/HbmWorldGen.java | 24 ++++--------------- .../java/com/hbm/main/CraftingManager.java | 1 - .../com/hbm/world/feature/BedrockOre.java | 23 ------------------ src/main/resources/assets/hbm/lang/de_DE.lang | 2 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- 9 files changed, 17 insertions(+), 53 deletions(-) diff --git a/changelog b/changelog index 00e00be3c..6b76f930a 100644 --- a/changelog +++ b/changelog @@ -3,8 +3,15 @@ * Watz powerplant now has OC and RoR integration * The automatic thresher now has a fluid port on the bottom as well * The foundry basins and outlet filters now use the properly translated name instead of the internal name for the material +* Removed config for new bedrock ores + * New ores are the default anyway and old bedrock ores are now properly deprecated + * Existing setups will continue to work for now +* Removed recipe for the small single block steam turbine + * We have steam engines and industrial turbines are really not that expensive +* Updated light brick texture ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised * Fixed broken thorium ore centrifuging recipe shown in NEI -* Fixed industrial turbine not properly saving its energy values, causing the flywheel to stop on relog \ No newline at end of file +* Fixed industrial turbine not properly saving its energy values, causing the flywheel to stop on relog +* Fixed lapis dust to cobalt shredder recipe not using oredict \ No newline at end of file diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index ce87ae285..d558ac37f 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -32,7 +32,6 @@ public class WorldConfig { public static int bedrockOilSpawn = 200; public static int meteoriteSpawn = 500; - public static boolean newBedrockOres = true; public static int bedrockIronSpawn = 100; public static int bedrockCopperSpawn = 200; public static int bedrockBoraxSpawn = 50; @@ -150,7 +149,6 @@ public class WorldConfig { bedrockOilSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.22_bedrockOilSpawnRate", "Spawns a bedrock oil node every nTH chunk", 200); meteoriteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.23_meteoriteSpawnRate", "Spawns a fallen meteorite every nTH chunk", 200); - newBedrockOres = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.NB_newBedrockOres", "Enables the newer genreric bedrock ores", true); bedrockIronSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B00_bedrockIronWeight", "Spawn weight for iron bedrock ore", 100); bedrockCopperSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B01_bedrockCopperWeight", "Spawn weight for copper bedrock ore", 200); bedrockBoraxSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B02_bedrockBoraxWeight", "Spawn weight for borax bedrock ore", 50); diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index d0594da9f..e36342035 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -3,7 +3,6 @@ package com.hbm.inventory.gui; import java.util.List; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; import static com.hbm.inventory.gui.element.GUIElements.*; import com.hbm.inventory.container.ContainerPneumoStorageAccess; @@ -18,7 +17,6 @@ import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index 6fd6e61e3..92285ffbf 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -173,7 +173,6 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(Blocks.tnt, new ItemStack(Items.gunpowder, Compat.isModLoaded(Compat.MOD_GT6) ? 4 : 5)); ShredderRecipes.setRecipe(DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.LIMESTONE), new ItemStack(ModItems.powder_limestone, 4)); ShredderRecipes.setRecipe(ModBlocks.stone_gneiss, new ItemStack(ModItems.powder_lithium_tiny, 1)); - ShredderRecipes.setRecipe(ModItems.powder_lapis, new ItemStack(ModItems.powder_cobalt_tiny, 1)); ShredderRecipes.setRecipe(ModItems.fragment_neodymium, new ItemStack(ModItems.powder_neodymium_tiny, 1)); ShredderRecipes.setRecipe(ModItems.fragment_cobalt, new ItemStack(ModItems.powder_cobalt_tiny, 1)); ShredderRecipes.setRecipe(ModItems.fragment_niobium, new ItemStack(ModItems.powder_niobium_tiny, 1)); @@ -213,11 +212,13 @@ public class ShredderRecipes extends SerializableRecipe { List logs = OreDictionary.getOres("logWood"); List planks = OreDictionary.getOres("plankWood"); List saplings = OreDictionary.getOres("treeSapling"); + List lapis = OreDictionary.getOres("dustLapis"); for(ItemStack log : logs) ShredderRecipes.setRecipe(log, new ItemStack(ModItems.powder_sawdust, 4)); for(ItemStack plank : planks) ShredderRecipes.setRecipe(plank, new ItemStack(ModItems.powder_sawdust, 1)); for(ItemStack sapling : saplings) ShredderRecipes.setRecipe(sapling, new ItemStack(Items.stick, 1)); - + for(ItemStack dust : lapis) ShredderRecipes.setRecipe(dust, new ItemStack(ModItems.powder_cobalt_tiny, 1)); + for(EnumBedrockOre ore : EnumBedrockOre.values()) { int i = ore.ordinal(); ShredderRecipes.setRecipe(new ItemStack(ModItems.ore_bedrock, 1, i), new ItemStack(ModItems.ore_enriched, 1, i)); diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 20ee810dd..7239e799c 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -140,26 +140,10 @@ public class HbmWorldGen implements IWorldGenerator { DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.limestoneSpawn, 16, 25, 30, ModBlocks.stone_resource, EnumStoneType.LIMESTONE.ordinal()); - if(WorldConfig.newBedrockOres) { - - if(rand.nextInt(10) == 0) { - int randPosX = i + rand.nextInt(2) + 8; - int randPosZ = j + rand.nextInt(2) + 8; - - BedrockOre.generateAuto(world, randPosX, randPosZ); - } - - } else { - - if(rand.nextInt(3) == 0) { - @SuppressWarnings("unchecked") - WeightedRandomGeneric item = (WeightedRandomGeneric) WeightedRandom.getRandomItem(rand, BedrockOre.weightedOres); - BedrockOreDefinition def = item.get(); - - int randPosX = i + rand.nextInt(2) + 8; - int randPosZ = j + rand.nextInt(2) + 8; - BedrockOre.generate(world, randPosX, randPosZ, def.stack, def.acid, def.color, def.tier); - } + if(rand.nextInt(10) == 0) { + int randPosX = i + rand.nextInt(2) + 8; + int randPosZ = j + rand.nextInt(2) + 8; + BedrockOre.generateAuto(world, randPosX, randPosZ); } if(GeneralConfig.enable528ColtanSpawn) { diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index b8830e883..6a2c5ab1e 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -248,7 +248,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.red_pylon_medium_steel, 2), new Object[] { "CCW", "IIW", " S", 'C', ModItems.coil_copper, 'W', STEEL.pipe(), 'I', ModItems.plate_polymer, 'S', KEY_COBBLESTONE }); addShapelessAuto(new ItemStack(ModBlocks.red_pylon_medium_steel_transformer, 1), new Object[] { ModBlocks.red_pylon_medium_steel, ModItems.plate_polymer, ModItems.coil_copper }); addRecipeAuto(new ItemStack(ModBlocks.machine_wood_burner, 1), new Object[] { "PPP", "CFC", "I I" , 'P', STEEL.plate(), 'C', ModItems.coil_copper, 'I', IRON.ingot(), 'F', Blocks.furnace}); - addRecipeAuto(new ItemStack(ModBlocks.machine_turbine, 1), new Object[] { "SMS", "PTP", "SMS", 'S', STEEL.ingot(), 'T', ModItems.turbine_titanium, 'M', ModItems.coil_copper, 'P', ANY_PLASTIC.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.machine_converter_he_rf, 1), new Object[] { "RRR", "WWW", "III", 'R', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CAPACITOR), 'W', REDSTONE.dust(), 'I', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.machine_converter_rf_he, 1), new Object[] { "RRR", "WWW", "III", 'R', REDSTONE.dust(), 'W', MINGRADE.wireFine(), 'I', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.crate_iron, 1), new Object[] { "PPP", "I I", "III", 'P', IRON.plate(), 'I', IRON.ingot() }); diff --git a/src/main/java/com/hbm/world/feature/BedrockOre.java b/src/main/java/com/hbm/world/feature/BedrockOre.java index 110675609..9c6a0b7a1 100644 --- a/src/main/java/com/hbm/world/feature/BedrockOre.java +++ b/src/main/java/com/hbm/world/feature/BedrockOre.java @@ -3,14 +3,12 @@ package com.hbm.world.feature; import java.util.ArrayList; import java.util.List; -import com.hbm.blocks.BlockEnums.EnumStoneType; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBedrockOreTE.TileEntityBedrockOre; import com.hbm.config.WorldConfig; import com.hbm.inventory.FluidStack; import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.inventory.fluid.Fluids; -import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ModItems; import com.hbm.items.special.ItemBedrockOreBase; import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; @@ -25,30 +23,9 @@ import net.minecraft.world.World; public class BedrockOre { - public static List> weightedOres = new ArrayList(); public static List> weightedOresNether = new ArrayList(); public static void init() { - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.IRON, 1), WorldConfig.bedrockIronSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.COPPER, 1), WorldConfig.bedrockCopperSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.BORAX, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockBoraxSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.CHLOROCALCITE, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockChlorocalciteSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.ASBESTOS, 2), WorldConfig.bedrockAsbestosSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.NIOBIUM, 2, new FluidStack(Fluids.PEROXIDE, 500)), WorldConfig.bedrockNiobiumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.NEODYMIUM, 3, new FluidStack(Fluids.PEROXIDE, 500)), WorldConfig.bedrockNeodymiumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.TITANIUM, 2, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockTitaniumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.TUNGSTEN, 2, new FluidStack(Fluids.PEROXIDE, 500)), WorldConfig.bedrockTungstenSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.GOLD, 1), WorldConfig.bedrockGoldSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.URANIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockUraniumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.THORIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockThoriumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.FLUORITE, 1), WorldConfig.bedrockFluoriteSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.coal, 8), 1, 0x202020), WorldConfig.bedrockCoalSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.niter, 4), 2, 0x808080, new FluidStack(Fluids.PEROXIDE, 500)), WorldConfig.bedrockNiterSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.redstone, 4), 1, 0xd01010), WorldConfig.bedrockRedstoneSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.emerald, 4), 1, 0x3FDD85), WorldConfig.bedrockEmeraldSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(DictFrame.fromOne(ModItems.chunk_ore, EnumChunkType.RARE), 2, 0x8F9999, new FluidStack(Fluids.PEROXIDE, 500)), WorldConfig.bedrockRareEarthSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.BAUXITE, 2),1, 0xEF7213), WorldConfig.bedrockBauxiteSpawn); - registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(Items.glowstone_dust, 4), 1, 0xF9FF4D), WorldConfig.bedrockGlowstoneSpawn); registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(ModItems.powder_fire, 4), 1, 0xD7341F), WorldConfig.bedrockPhosphorusSpawn); registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(Items.quartz, 4), 1, 0xF0EFDD), WorldConfig.bedrockQuartzSpawn); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 4aa6e7a9f..043478092 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4571,7 +4571,7 @@ tile.machine_transformer.name=10k-20Hz-Transformator tile.machine_transformer_20.name=10k-1Hz-Transformator tile.machine_transformer_dnt.name=DNT-20Hz-Transformator tile.machine_transformer_dnt_20.name=DNT-1Hz-Transformator -tile.machine_turbine.name=Dampfturbine +tile.machine_turbine.name=Dampfturbine (LEGACY) tile.machine_turbine.desc=Effizienz: 85%% tile.machine_turbinegas.name=Kombizyklus-Gasturbine tile.machine_turbofan.name=Turbofan diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d43f47da4..265646379 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5827,7 +5827,7 @@ tile.machine_transformer.name=10k-20Hz Transformer tile.machine_transformer_20.name=10k-1Hz Transformer tile.machine_transformer_dnt.name=DNT-20Hz Transformer tile.machine_transformer_dnt_20.name=DNT-1Hz Transformer -tile.machine_turbine.name=Steam Turbine +tile.machine_turbine.name=Steam Turbine (LEGACY) tile.machine_turbine.desc=Efficiency: 85%% tile.machine_turbinegas.name=Combined Cycle Gas Turbine tile.machine_turbofan.name=Turbofan From 128908096ba33bbd75e1207de925604e4535fed0 Mon Sep 17 00:00:00 2001 From: FluffsADev Date: Mon, 15 Jun 2026 17:53:13 -0400 Subject: [PATCH 017/107] inv render fix --- .../java/com/hbm/render/item/ItemRenderLibraryDoors.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibraryDoors.java b/src/main/java/com/hbm/render/item/ItemRenderLibraryDoors.java index e64949316..e4fb22b3f 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibraryDoors.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibraryDoors.java @@ -223,13 +223,14 @@ public class ItemRenderLibraryDoors { }}); ItemRenderLibrary.renderers.put(Item.getItemFromBlock(ModBlocks.cargo_door), new ItemRenderBase(){ public void renderInventory() { - GL11.glTranslated(0, -3.75, 0); - GL11.glScaled(2.4, 2.4, 2.4); + GL11.glTranslated(0, -4, 0); + GL11.glScaled(4, 4, 4); } public void renderCommon() { bindTexture(ResourceManager.pheo_cargo_door_tex); GL11.glShadeModel(GL11.GL_SMOOTH); - GL11.glTranslated(0, 1, 0); + GL11.glScaled(0.9, 0.9, 0.9); + GL11.glTranslated(0, 0.3, 0); ResourceManager.pheo_cargo_door.renderPart("Frame"); ResourceManager.pheo_cargo_door.renderPart("DoorTop"); ResourceManager.pheo_cargo_door.renderPart("DoorBot"); From 7c7df7c4598b5e8b1a2803eb9b81d1dec48d5029 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 16 Jun 2026 16:41:23 +0200 Subject: [PATCH 018/107] we are back in quacktion --- changelog | 2 + .../ContainerPneumoStorageAccess.java | 7 +++ .../inventory/gui/GUIPneumoStorageAccess.java | 12 +++++ src/main/java/com/hbm/items/ModItems.java | 46 +++++++++---------- 4 files changed, 44 insertions(+), 23 deletions(-) diff --git a/changelog b/changelog index 6b76f930a..23ace2f5c 100644 --- a/changelog +++ b/changelog @@ -6,8 +6,10 @@ * Removed config for new bedrock ores * New ores are the default anyway and old bedrock ores are now properly deprecated * Existing setups will continue to work for now + * Old bedrock ore items still exist but are no longer listed in the creative tab * Removed recipe for the small single block steam turbine * We have steam engines and industrial turbines are really not that expensive + * "oh no, i have to build an actually good looking setup now if i want to build a zirnox!" yeah you do * Updated light brick texture ## Fixed diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index c4ebcd71c..cb9010a07 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -34,6 +34,8 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa public static final int GRID_SIZE = 6 * 8; public static final String STACK_SIZE_KEY = "PNEUMO_STACK_SIZE"; + + public int itemCountForClient = 0; // TODO public ContainerPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { this.access = access; @@ -265,6 +267,9 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa if(list.tagCount() > 0) { NBTTagCompound masterTag = new NBTTagCompound(); + // if a null stack is indiced, skip + boolean hasNullStack = this.access.cache.cacheSlots.containsKey(this.access.cache.getNullIdentity()); + masterTag.setInteger("itemCount", this.access.cache.cacheSlots.size() - (hasNullStack ? 1 : 0)); masterTag.setTag("list", list); for(Object o : this.crafters) { if(o instanceof EntityPlayerMP) { @@ -288,6 +293,8 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa public void acceptData(int windowId, NBTTagCompound data) { if(windowId != this.windowId) return; + this.itemCountForClient = data.getInteger("itemCount"); + NBTTagList list = data.getTagList("list", 10); for(int i = 0; i < list.tagCount(); i++) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index e36342035..f35c071a6 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -25,6 +25,11 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_pneumatic_access.png"); protected TileEntityPneumoStorageAccess access; + + protected int scrollIndex = 0; + protected int scrollBounds = 0; + protected boolean wasClicking = false; + protected boolean draggingScroll = false; public GUIPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { super(new ContainerPneumoStorageAccess(invPlayer, access)); @@ -36,6 +41,13 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { + + ContainerPneumoStorageAccess container = (ContainerPneumoStorageAccess) this.inventorySlots; + this.scrollBounds = (container.itemCountForClient / 8 - 7); + if(this.scrollBounds < 0) this.scrollBounds = 0; + if(this.scrollIndex < 0) this.scrollIndex = 0; + if(this.scrollIndex > scrollBounds) this.scrollIndex = scrollBounds; + super.drawScreen(x, y, interp); } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 7eab23d58..f39c41fda 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -188,19 +188,19 @@ public class ModItems { public static Item ingot_mercury; //It's to prevent any ambiguity, as it was treated as a full ingot in the past anyway public static Item bottle_mercury; - public static Item ore_byproduct; //byproduct of variable purity and quantity, can be treated as a nugget, might require shredding or acidizing, depends on the type + @Deprecated public static Item ore_byproduct; - public static Item ore_bedrock; - public static Item ore_centrifuged; - public static Item ore_cleaned; - public static Item ore_separated; - public static Item ore_purified; - public static Item ore_nitrated; - public static Item ore_nitrocrystalline; - public static Item ore_deepcleaned; - public static Item ore_seared; - //public static Item ore_radcleaned; - public static Item ore_enriched; //final stage + @Deprecated public static Item ore_bedrock; + @Deprecated public static Item ore_centrifuged; + @Deprecated public static Item ore_cleaned; + @Deprecated public static Item ore_separated; + @Deprecated public static Item ore_purified; + @Deprecated public static Item ore_nitrated; + @Deprecated public static Item ore_nitrocrystalline; + @Deprecated public static Item ore_deepcleaned; + @Deprecated public static Item ore_seared; + @Deprecated public static Item ore_enriched; //final stage + public static Item bedrock_ore_base; public static Item bedrock_ore; public static Item bedrock_ore_fragment; @@ -2295,18 +2295,18 @@ public class ModItems { ingot_mud = new Item().setUnlocalizedName("ingot_mud").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_mud"); ingot_cft = new Item().setUnlocalizedName("ingot_cft").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_cft"); - ore_byproduct = new ItemByproduct().setUnlocalizedName("ore_byproduct").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":byproduct"); + ore_byproduct = new ItemByproduct().setUnlocalizedName("ore_byproduct").setCreativeTab(null).setTextureName(RefStrings.MODID + ":byproduct"); - ore_bedrock = new ItemBedrockOre().setUnlocalizedName("ore_bedrock").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_bedrock"); - ore_centrifuged = new ItemBedrockOre().setUnlocalizedName("ore_centrifuged").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_centrifuged"); - ore_cleaned = new ItemBedrockOre().setUnlocalizedName("ore_cleaned").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_cleaned"); - ore_separated = new ItemBedrockOre().setUnlocalizedName("ore_separated").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_separated"); - ore_purified = new ItemBedrockOre().setUnlocalizedName("ore_purified").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_purified"); - ore_nitrated = new ItemBedrockOre().setUnlocalizedName("ore_nitrated").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_nitrated"); - ore_nitrocrystalline = new ItemBedrockOre().setUnlocalizedName("ore_nitrocrystalline").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_nitrocrystalline"); - ore_deepcleaned = new ItemBedrockOre().setUnlocalizedName("ore_deepcleaned").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_deepcleaned"); - ore_seared = new ItemBedrockOre().setUnlocalizedName("ore_seared").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_seared"); - ore_enriched = new ItemBedrockOre().setUnlocalizedName("ore_enriched").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_enriched"); + ore_bedrock = new ItemBedrockOre().setUnlocalizedName("ore_bedrock").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_bedrock"); + ore_centrifuged = new ItemBedrockOre().setUnlocalizedName("ore_centrifuged").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_centrifuged"); + ore_cleaned = new ItemBedrockOre().setUnlocalizedName("ore_cleaned").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_cleaned"); + ore_separated = new ItemBedrockOre().setUnlocalizedName("ore_separated").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_separated"); + ore_purified = new ItemBedrockOre().setUnlocalizedName("ore_purified").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_purified"); + ore_nitrated = new ItemBedrockOre().setUnlocalizedName("ore_nitrated").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_nitrated"); + ore_nitrocrystalline = new ItemBedrockOre().setUnlocalizedName("ore_nitrocrystalline").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_nitrocrystalline"); + ore_deepcleaned = new ItemBedrockOre().setUnlocalizedName("ore_deepcleaned").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_deepcleaned"); + ore_seared = new ItemBedrockOre().setUnlocalizedName("ore_seared").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_seared"); + ore_enriched = new ItemBedrockOre().setUnlocalizedName("ore_enriched").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ore_enriched"); bedrock_ore_base = new ItemBedrockOreBase().setUnlocalizedName("bedrock_ore_base").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bedrock_ore_new"); bedrock_ore = new ItemBedrockOreNew().setUnlocalizedName("bedrock_ore").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bedrock_ore_new"); bedrock_ore_fragment = new ItemAutogen(MaterialShapes.FRAGMENT).aot(Mats.MAT_BISMUTH, "bedrock_ore_fragment_bismuth").setUnlocalizedName("bedrock_ore_fragment").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bedrock_ore_fragment"); From 2e292f2a2012a6631420991c9f31ba9acf97c848 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Tue, 16 Jun 2026 19:40:09 +0200 Subject: [PATCH 019/107] hell yeah, i have the power of god *pulls gun on cops* --- src/main/java/api/hbm/ntl/SlotMonitor.java | 7 +- src/main/java/api/hbm/ntl/StackCache.java | 3 + .../pneumatic/PneumoStorageClutter.java | 37 ++++++++++ .../ContainerPneumoStorageAccess.java | 29 ++++++-- .../inventory/gui/GUIPneumoStorageAccess.java | 69 +++++++++++++++++-- 5 files changed, 133 insertions(+), 12 deletions(-) diff --git a/src/main/java/api/hbm/ntl/SlotMonitor.java b/src/main/java/api/hbm/ntl/SlotMonitor.java index 63da74ef3..4b8bec70b 100644 --- a/src/main/java/api/hbm/ntl/SlotMonitor.java +++ b/src/main/java/api/hbm/ntl/SlotMonitor.java @@ -35,11 +35,13 @@ public class SlotMonitor { public long stacksize; public int meta; public NBTTagCompound nbt; - + protected boolean hasAvailabilityChanged = false; + protected boolean forceTypeUpdate = false; public SlotMonitor(int index, ISlotMonitorProvider parent) { this.hasAvailabilityChanged = true; + this.forceTypeUpdate = true; this.index = index; this.parent = parent; } @@ -101,7 +103,7 @@ public class SlotMonitor { else if(nbt != null && stack.hasTagCompound() && !nbt.equals(stack.stackTagCompound)) hasTypeChanged = true; } - if(hasTypeChanged) { + if(hasTypeChanged || forceTypeUpdate) { // remove from all existing monitors Iterator iterator = viewedBy.iterator(); @@ -134,6 +136,7 @@ public class SlotMonitor { } } + forceTypeUpdate = false; return; } diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index 11ffb61bc..34a9c31f5 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -44,6 +44,8 @@ public class StackCache { } cache.addMonitor(monitor); + + System.out.println(monitor.toZeroStack() + " " + cache.monitors.size()); } public CacheSlot getSlotFromStack(ItemStack stack) { @@ -195,6 +197,7 @@ public class StackCache { } public static long getStackIdentity(Item item, int meta, NBTTagCompound nbt) { + if(item == null) return getNullIdentity(); long identity = Item.getIdFromItem(item) * 27644437; identity += meta * 27644437; if(nbt != null) identity += nbt.toString().hashCode(); diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java index 33b18b6ae..d09d50974 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java @@ -4,9 +4,14 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageClutter; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -30,4 +35,36 @@ public class PneumoStorageClutter extends BlockContainer { } return false; } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + + TileEntity te = world.getTileEntity(x, y, z); + if(!(te instanceof ISidedInventory)) return; + ISidedInventory tileentityfurnace = (ISidedInventory) te; + if(tileentityfurnace != null) { + for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) { + ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); + if(itemstack != null) { + float f = world.rand.nextFloat() * 0.8F + 0.1F; + float f1 = world.rand.nextFloat() * 0.8F + 0.1F; + float f2 = world.rand.nextFloat() * 0.8F + 0.1F; + while(itemstack.stackSize > 0) { + int j1 = world.rand.nextInt(21) + 10; + if(j1 > itemstack.stackSize) j1 = itemstack.stackSize; + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + if(itemstack.hasTagCompound()) entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + float f3 = 0.05F; + entityitem.motionX = world.rand.nextGaussian() * f3; + entityitem.motionY = world.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = world.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + world.func_147453_f(x, y, z, block); + } + super.breakBlock(world, x, y, z, block, meta); + } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index cb9010a07..53f1e47b1 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -32,10 +32,12 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa protected TileEntityPneumoStorageAccess access; protected InventoryPneumoStorageAccess inventory; + public static final int SLOT_CLICK_ID_REFRESH = -666; public static final int GRID_SIZE = 6 * 8; public static final String STACK_SIZE_KEY = "PNEUMO_STACK_SIZE"; - public int itemCountForClient = 0; // TODO + public int itemCountForClient = 0; + public int listingStart = 0; public ContainerPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { this.access = access; @@ -57,11 +59,11 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa this.addSlotToContainer(new SlotNonRetarded(invPlayer, i, 8 + i * 18, 227)); } - updateListing(); + updateListing(0); this.detectAndSendChanges(); } - public void updateListing() { // DEMO + public void updateListing(int startingIndex) { // DEMO if(this.access.cache == null || this.access.cache.hasExpired) return; StackCache cache = this.access.cache; List cacheSlots = new ArrayList(cache.cacheSlots.size()); @@ -70,11 +72,16 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa Collections.sort(cacheSlots, SORT_BY_STACK_SIZE); int size = cacheSlots.size(); + int offset = startingIndex * 8; + for(int i = 0; i < inventory.slots.length; i++) { - if(i < size) { - CacheSlot cacheSlot = cacheSlots.get(i); + int grabIndex = offset + i; + if(grabIndex < size) { + CacheSlot cacheSlot = cacheSlots.get(grabIndex); if(cacheSlot.displayStack != null) { inventory.slots[i] = cacheSlot.displayStack.copy(); + } else { + inventory.slots[i] = null; } } else { inventory.slots[i] = null; @@ -101,6 +108,13 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa @Override public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { if(mode == 6) return null; + + if(index == SLOT_CLICK_ID_REFRESH) { + if(player.worldObj.isRemote) return null; + this.listingStart = mode; + this.detectAndSendChanges(); + return null; + } boolean leftClick = button == 0 && mode == 0; boolean rightClick = button == 1 && mode == 0; @@ -162,6 +176,7 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa ItemStack copy = held.copy(); copy.stackSize = remainder; InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, copy); + detectAndSendChanges(); } } @@ -210,7 +225,7 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa */ @Override public void detectAndSendChanges() { - this.updateListing(); + this.updateListing(listingStart); // skip the first 6*8 slots, i.e. all the ones visible in the access grid for(int i = GRID_SIZE; i < this.inventorySlots.size(); i++) { @@ -270,6 +285,7 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa // if a null stack is indiced, skip boolean hasNullStack = this.access.cache.cacheSlots.containsKey(this.access.cache.getNullIdentity()); masterTag.setInteger("itemCount", this.access.cache.cacheSlots.size() - (hasNullStack ? 1 : 0)); + masterTag.setInteger("listingStart", this.listingStart); masterTag.setTag("list", list); for(Object o : this.crafters) { if(o instanceof EntityPlayerMP) { @@ -294,6 +310,7 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa if(windowId != this.windowId) return; this.itemCountForClient = data.getInteger("itemCount"); + this.listingStart = data.getInteger("listingStart"); NBTTagList list = data.getTagList("list", 10); diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index f35c071a6..2fa63d3d7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -2,6 +2,7 @@ package com.hbm.inventory.gui; import java.util.List; +import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import static com.hbm.inventory.gui.element.GUIElements.*; @@ -19,6 +20,7 @@ import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class GUIPneumoStorageAccess extends GuiInfoContainer { @@ -43,10 +45,27 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { public void drawScreen(int x, int y, float interp) { ContainerPneumoStorageAccess container = (ContainerPneumoStorageAccess) this.inventorySlots; - this.scrollBounds = (container.itemCountForClient / 8 - 7); - if(this.scrollBounds < 0) this.scrollBounds = 0; - if(this.scrollIndex < 0) this.scrollIndex = 0; - if(this.scrollIndex > scrollBounds) this.scrollIndex = scrollBounds; + this.scrollBounds = (int) Math.ceil(container.itemCountForClient / 8D - 6D); + if(this.scrollBounds < 1) this.scrollBounds = 1; + if(this.scrollIndex < 0) this.setScroll(0); + if(this.scrollIndex > scrollBounds) this.setScroll(scrollBounds); + + boolean isClicking = Mouse.isButtonDown(0); + if(!isClicking) this.draggingScroll = false; + + if(!wasClicking && isClicking && guiLeft + 153 <= x && guiLeft + 153 + 14 > x && guiTop + 16 < y && guiTop + 16 + 108 >= y) { + draggingScroll = true; + } + + if(draggingScroll) { + int range = 92; // 106 scroll bar size, -7 pixels on top and bottom + int sY = MathHelper.clamp_int(y - guiTop - 24, 0, 92); + double scrollFrac = (double) sY / (double) range; + int row = (int) Math.round(scrollBounds * scrollFrac); + this.setScroll(row); + } + + this.wasClicking = isClicking; super.drawScreen(x, y, interp); } @@ -55,6 +74,20 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); } + + @Override + public void handleMouseInput() { + super.handleMouseInput(); + + int scrollDir = Mouse.getEventDWheel(); + + if(scrollDir != 0) { + + if(scrollDir > 0) scrollDir = 1; + if(scrollDir < 0) scrollDir = -1; + this.setScroll(this.getScroll() - scrollDir); + } + } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { @@ -90,6 +123,34 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + drawTexturedModalRect(guiLeft + getScrollBarXPos(), guiTop + getScrollBarYPos(), draggingScroll ? 188 : 176, 0, 12, 15); + } + + public int getScrollBarXPos() { + return 154; + } + + public int getScrollBarYPos() { + ContainerPneumoStorageAccess container = (ContainerPneumoStorageAccess) this.inventorySlots; + int scrollArea = 106 - 15; // bar height minus the scroll knob's height + double scrollProgress = (double) container.listingStart / (double) scrollBounds; + int scrollYPos = 17 + (int) (scrollProgress * scrollArea); + return scrollYPos; + } + + public int getScroll() { + return MathHelper.clamp_int(scrollIndex, 0, scrollBounds); + } + + public void setScroll(int scroll) { + int prevScroll = getScroll(); + this.scrollIndex = MathHelper.clamp_int(scroll, 0, scrollBounds); + if(prevScroll != this.scrollIndex) refreshContainer(); + } + + public void refreshContainer() { + this.mc.playerController.windowClick(this.inventorySlots.windowId, ContainerPneumoStorageAccess.SLOT_CLICK_ID_REFRESH, 0, this.scrollIndex, this.mc.thePlayer); } @Override From 64b1dbcd5a0a2175db73f92e20986bd747556e8c Mon Sep 17 00:00:00 2001 From: HbmMods Date: Tue, 16 Jun 2026 22:49:45 +0200 Subject: [PATCH 020/107] fuck fuck fuckedy fuck --- src/main/java/api/hbm/ntl/StackCache.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index 34a9c31f5..a71638a4c 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -199,7 +199,8 @@ public class StackCache { public static long getStackIdentity(Item item, int meta, NBTTagCompound nbt) { if(item == null) return getNullIdentity(); long identity = Item.getIdFromItem(item) * 27644437; - identity += meta * 27644437; + identity += meta; + identity *= 27644437; if(nbt != null) identity += nbt.toString().hashCode(); return identity; } From 1f36fd1a866a05253684dee8aaaf057afeff6461 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 17 Jun 2026 11:56:13 +0200 Subject: [PATCH 021/107] round 2: fight --- changelog | 5 +- .../ContainerPneumoStorageAccess.java | 48 +++++++++++++------ .../container/ICustomPayloadReceiver.java | 3 +- .../inventory/gui/GUIPneumoStorageAccess.java | 41 ++++++++++++++++ .../inventory/gui/GUIScreenRBMKDisplay.java | 2 +- .../hbm/inventory/gui/GUIScreenRBMKGauge.java | 2 +- .../hbm/inventory/gui/GUIScreenRBMKGraph.java | 2 +- .../inventory/gui/GUIScreenRBMKIndicator.java | 2 +- .../inventory/gui/GUIScreenRBMKKeyPad.java | 2 +- .../hbm/inventory/gui/GUIScreenRBMKLever.java | 2 +- .../inventory/gui/GUIScreenRadioTorch.java | 4 +- .../gui/GUIScreenRadioTorchController.java | 2 +- .../gui/GUIScreenRadioTorchLogic.java | 2 +- .../gui/GUIScreenRadioTorchReader.java | 2 +- .../java/com/hbm/packet/PacketDispatcher.java | 5 +- ...cket.java => ContainerNBTCommsPacket.java} | 19 ++++---- 16 files changed, 104 insertions(+), 39 deletions(-) rename src/main/java/com/hbm/packet/toclient/{ContainerCustomPayloadPacket.java => ContainerNBTCommsPacket.java} (67%) diff --git a/changelog b/changelog index 23ace2f5c..14053316c 100644 --- a/changelog +++ b/changelog @@ -11,9 +11,12 @@ * We have steam engines and industrial turbines are really not that expensive * "oh no, i have to build an actually good looking setup now if i want to build a zirnox!" yeah you do * Updated light brick texture +* The maximum character limit on RoR channels is now the same for all RoR devices, being 15 + * This does not include special RoR interactive devices that don't use GUI text fields like the RoR terminal or the AUTOCAL units ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised * Fixed broken thorium ore centrifuging recipe shown in NEI * Fixed industrial turbine not properly saving its energy values, causing the flywheel to stop on relog -* Fixed lapis dust to cobalt shredder recipe not using oredict \ No newline at end of file +* Fixed lapis dust to cobalt shredder recipe not using oredict +* Fixed AUTOCAL's file opening buttons not working on some systems, it will fall back to opening the folder instead \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index 53f1e47b1..779f6cea5 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -8,13 +8,14 @@ import java.util.List; import com.hbm.interfaces.NotableComments; import com.hbm.inventory.SlotNonRetarded; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.ContainerCustomPayloadPacket; +import com.hbm.packet.toclient.ContainerNBTCommsPacket; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; import com.hbm.util.EnumUtil; import com.hbm.util.InventoryUtil; import api.hbm.ntl.StackCache; import api.hbm.ntl.StackCache.CacheSlot; +import cpw.mods.fml.relauncher.Side; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; @@ -29,6 +30,19 @@ import net.minecraft.nbt.NBTTagList; @NotableComments // i long for the day when i never have to look at this fucking horseshit ever again public class ContainerPneumoStorageAccess extends Container implements ICustomPayloadReceiver { + /* + * time wasted on this fucking class: a lot + * + * this approach was great right until it just stopped working. + * a proper search requires the client to decide if the item matches + * the criteria, and we have to process all items in the network, so + * this entire approach of only sending 48 items at once to the client + * just absolutely will not work. + * + * i may have to rewrite absolutely everything here now, but at least i + * finally know what i am up against. didn't hear no bell. + */ + protected TileEntityPneumoStorageAccess access; protected InventoryPneumoStorageAccess inventory; @@ -290,7 +304,7 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa for(Object o : this.crafters) { if(o instanceof EntityPlayerMP) { EntityPlayerMP playerMP = (EntityPlayerMP) o; - PacketDispatcher.wrapper.sendTo(new ContainerCustomPayloadPacket(playerMP.currentWindowId, masterTag), playerMP); + PacketDispatcher.wrapper.sendTo(new ContainerNBTCommsPacket(playerMP.currentWindowId, masterTag), playerMP); } } } @@ -306,21 +320,25 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa } @Override - public void acceptData(int windowId, NBTTagCompound data) { + public void acceptData(Side side, int windowId, NBTTagCompound data) { if(windowId != this.windowId) return; - this.itemCountForClient = data.getInteger("itemCount"); - this.listingStart = data.getInteger("listingStart"); - - NBTTagList list = data.getTagList("list", 10); - - for(int i = 0; i < list.tagCount(); i++) { - NBTTagCompound listEntry = list.getCompoundTagAt(i); - PneumoMesageType msg = EnumUtil.grabEnumSafely(PneumoMesageType.class, listEntry.getByte(KEY_TYPE)); - int slotIndex = listEntry.getByte(KEY_SLOT_INDEX); - SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(slotIndex); - if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_COUNT) slot.amount = listEntry.getLong(KEY_LONG_COUNT); - if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_TYPE) slot.putStack(ItemStack.loadItemStackFromNBT(listEntry)); + if(side.isClient()) { + this.itemCountForClient = data.getInteger("itemCount"); + this.listingStart = data.getInteger("listingStart"); + + NBTTagList list = data.getTagList("list", 10); + + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound listEntry = list.getCompoundTagAt(i); + PneumoMesageType msg = EnumUtil.grabEnumSafely(PneumoMesageType.class, listEntry.getByte(KEY_TYPE)); + int slotIndex = listEntry.getByte(KEY_SLOT_INDEX); + SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(slotIndex); + if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_COUNT) slot.amount = listEntry.getLong(KEY_LONG_COUNT); + if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_TYPE) slot.putStack(ItemStack.loadItemStackFromNBT(listEntry)); + } + } else { + } } diff --git a/src/main/java/com/hbm/inventory/container/ICustomPayloadReceiver.java b/src/main/java/com/hbm/inventory/container/ICustomPayloadReceiver.java index 02067bf08..f0045c2ab 100644 --- a/src/main/java/com/hbm/inventory/container/ICustomPayloadReceiver.java +++ b/src/main/java/com/hbm/inventory/container/ICustomPayloadReceiver.java @@ -1,8 +1,9 @@ package com.hbm.inventory.container; +import cpw.mods.fml.relauncher.Side; import net.minecraft.nbt.NBTTagCompound; public interface ICustomPayloadReceiver { - public void acceptData(int windowsId, NBTTagCompound data); + public void acceptData(Side side, int windowsId, NBTTagCompound data); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index 2fa63d3d7..dfcd119a0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -2,6 +2,7 @@ package com.hbm.inventory.gui; import java.util.List; +import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -10,15 +11,19 @@ import com.hbm.inventory.container.ContainerPneumoStorageAccess; import com.hbm.inventory.container.ContainerPneumoStorageAccess.SlotPneumo; import com.hbm.inventory.gui.element.GUIElements; import com.hbm.lib.RefStrings; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.ContainerNBTCommsPacket; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; import com.hbm.util.BobMathUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; @@ -27,6 +32,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_pneumatic_access.png"); protected TileEntityPneumoStorageAccess access; + protected GuiTextField search; protected int scrollIndex = 0; protected int scrollBounds = 0; @@ -40,6 +46,19 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { this.xSize = 176; this.ySize = 251; } + + @Override + public void initGui() { + super.initGui(); + + Keyboard.enableRepeatEvents(true); + search = new GuiTextField(this.fontRendererObj, guiLeft + 43, guiTop + 127, 90, 12); + search.setTextColor(0xffffff); + search.setDisabledTextColour(0xa0a0a0); + search.setEnableBackgroundDrawing(false); + search.setMaxStringLength(50); + search.setText(""); + } @Override public void drawScreen(int x, int y, float interp) { @@ -73,6 +92,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { @Override protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); + search.mouseClicked(x, y, i); } @Override @@ -125,6 +145,8 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); drawTexturedModalRect(guiLeft + getScrollBarXPos(), guiTop + getScrollBarYPos(), draggingScroll ? 188 : 176, 0, 12, 15); + + search.drawTextBox(); } public int getScrollBarXPos() { @@ -169,4 +191,23 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { if(font == null) font = this.fontRendererObj; GUIElements.drawHoveringText(list, x, y, font, itemRender, width, height, STANDARD_HEADER_OFFSET, STANDARD_LINE_DIST, STANDARD_COLOR_BACKGROUND, STANDARD_COLOR_BACKGROUND, 0xD57C4F, 0xAB4223); } + + @Override + protected void keyTyped(char c, int b) { + + if(search.textboxKeyTyped(c, b)) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("search", search.getText()); + PacketDispatcher.wrapper.sendToServer(new ContainerNBTCommsPacket(this.inventorySlots.windowId, data)); + return; + } + + super.keyTyped(c, b); + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java index 71583b47f..a97c4b9cc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java @@ -51,7 +51,7 @@ public class GUIScreenRBMKDisplay extends GuiScreen { label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 73 + oY + i * 54, 85 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(label[i], 30, display.displays[i].label); rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 55 + oY + i * 54, 85 - oX * 2, 14); - GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], 10, display.displays[i].rtty); + GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], GUIScreenRadioTorch.MAX_CHAN_LENGTH, display.displays[i].rtty); active[i] = display.displays[i].active; polling[i] = display.displays[i].polling; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGauge.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGauge.java index f734d5b2e..d83fcdbd0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGauge.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGauge.java @@ -56,7 +56,7 @@ public class GUIScreenRBMKGauge extends GuiScreen { label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 175 + oX, guiTop + 55 + oY + i * 36, 72 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(label[i], 15, gauge.gauges[i].label); rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 73 + oY + i * 36, 72 - oX * 2, 14); - GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], 10, gauge.gauges[i].rtty); + GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], GUIScreenRadioTorch.MAX_CHAN_LENGTH, gauge.gauges[i].rtty); min[i] = new GuiTextField(this.fontRendererObj, guiLeft + 121 + oX, guiTop + 73 + oY + i * 36, 52 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(min[i], 32, gauge.gauges[i].min + ""); max[i] = new GuiTextField(this.fontRendererObj, guiLeft + 195 + oX, guiTop + 73 + oY + i * 36, 52 - oX * 2, 14); diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGraph.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGraph.java index c8803228e..a478dcb7f 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGraph.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKGraph.java @@ -51,7 +51,7 @@ public class GUIScreenRBMKGraph extends GuiScreen { label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 73 + oY + i * 54, 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 * 54, 72 - oX * 2, 14); - GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], 10, graph.graphs[i].rtty); + GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], GUIScreenRadioTorch.MAX_CHAN_LENGTH, graph.graphs[i].rtty); min[i] = new GuiTextField(this.fontRendererObj, guiLeft + 175 + oX, guiTop + 55 + oY + i * 54, 72 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(min[i], 15, graph.graphs[i].minBound ? graph.graphs[i].min + "" : ""); max[i] = new GuiTextField(this.fontRendererObj, guiLeft + 175 + oX, guiTop + 73 + oY + i * 54, 72 - oX * 2, 14); diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKIndicator.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKIndicator.java index ca4e7474c..5e9425127 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKIndicator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKIndicator.java @@ -56,7 +56,7 @@ public class GUIScreenRBMKIndicator extends GuiScreen { label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 175 + oX, guiTop + 37 + oY + i * 36, 72 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(label[i], 15, indicator.indicators[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, indicator.indicators[i].rtty); + GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], GUIScreenRadioTorch.MAX_CHAN_LENGTH, indicator.indicators[i].rtty); min[i] = new GuiTextField(this.fontRendererObj, guiLeft + 121 + oX, guiTop + 55 + oY + i * 36, 52 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(min[i], 32, indicator.indicators[i].min + ""); max[i] = new GuiTextField(this.fontRendererObj, guiLeft + 195 + oX, guiTop + 55 + oY + i * 36, 52 - oX * 2, 14); diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKKeyPad.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKKeyPad.java index 204061617..bedb318f7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKKeyPad.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKKeyPad.java @@ -66,7 +66,7 @@ public class GUIScreenRBMKKeyPad extends GuiScreen { label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 175 + oX, guiTop + 55 + oY + i * 36, 72 - oX * 2, 14); setupTextFieldStandard(label[i], 15, keypad.keys[i].label); rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 73 + oY + i * 36, 72 - oX * 2, 14); - setupTextFieldStandard(rtty[i], 10, keypad.keys[i].rtty); + setupTextFieldStandard(rtty[i], GUIScreenRadioTorch.MAX_CHAN_LENGTH, keypad.keys[i].rtty); cmd[i] = new GuiTextField(this.fontRendererObj, guiLeft + 121 + oX, guiTop + 73 + oY + i * 36, 126 - oX * 2, 14); setupTextFieldStandard(cmd[i], 32, keypad.keys[i].command); diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKLever.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKLever.java index a98861e2f..3f7445309 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKLever.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKLever.java @@ -52,7 +52,7 @@ public class GUIScreenRBMKLever extends GuiScreen { for(int i = 0; i < 2; i++) { rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 55 + oY + i * 54, 72 - oX * 2, 14); - GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], 10, lever.levers[i].rtty); + GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], GUIScreenRadioTorch.MAX_CHAN_LENGTH, lever.levers[i].rtty); label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 175 + oX, guiTop + 55 + oY + i * 54, 72 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(label[i], 15, lever.levers[i].label); cmdOn[i] = new GuiTextField(this.fontRendererObj, guiLeft + 45 + oX, guiTop + 73 + oY + i * 54, 81 - oX * 2, 14); diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java index 9300e8e60..5bc1a99da 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java @@ -20,6 +20,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; public class GUIScreenRadioTorch extends GuiScreen { + + public static final int MAX_CHAN_LENGTH = 15; protected ResourceLocation texture; protected static final ResourceLocation textureSender = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rtty_sender.png"); @@ -61,7 +63,7 @@ public class GUIScreenRadioTorch extends GuiScreen { this.frequency.setTextColor(0x00ff00); this.frequency.setDisabledTextColour(0x00ff00); this.frequency.setEnableBackgroundDrawing(false); - this.frequency.setMaxStringLength(10); + this.frequency.setMaxStringLength(MAX_CHAN_LENGTH); this.frequency.setText(radio.channel == null ? "" : radio.channel); this.remap = new GuiTextField[16]; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchController.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchController.java index fc86a1213..16ac83d4a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchController.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchController.java @@ -58,7 +58,7 @@ public class GUIScreenRadioTorchController extends GuiScreen { this.frequency.setTextColor(0x00ff00); this.frequency.setDisabledTextColour(0x00ff00); this.frequency.setEnableBackgroundDrawing(false); - this.frequency.setMaxStringLength(10); + this.frequency.setMaxStringLength(GUIScreenRadioTorch.MAX_CHAN_LENGTH); this.frequency.setText(rtty.channel == null ? "" : rtty.channel); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java index 565d86110..ef019650e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java @@ -52,7 +52,7 @@ public class GUIScreenRadioTorchLogic extends GuiScreen { this.frequency.setTextColor(0x00ff00); this.frequency.setDisabledTextColour(0x00ff00); this.frequency.setEnableBackgroundDrawing(false); - this.frequency.setMaxStringLength(10); + this.frequency.setMaxStringLength(GUIScreenRadioTorch.MAX_CHAN_LENGTH); this.frequency.setText(logic.channel == null ? "" : logic.channel); this.map = new GuiTextField[16]; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchReader.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchReader.java index 5e241a318..f08fff277 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchReader.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchReader.java @@ -59,7 +59,7 @@ public class GUIScreenRadioTorchReader extends GuiScreen { this.frequencies[i].setTextColor(0x00ff00); this.frequencies[i].setDisabledTextColour(0x00ff00); this.frequencies[i].setEnableBackgroundDrawing(false); - this.frequencies[i].setMaxStringLength(15); + this.frequencies[i].setMaxStringLength(GUIScreenRadioTorch.MAX_CHAN_LENGTH); this.frequencies[i].setText(rtty.channels[i] == null ? "" : rtty.channels[i]); this.names[i] = new GuiTextField(this.fontRendererObj, guiLeft + 119 + oX, guiTop + 53 + i * 18 + oY, 126 - oX * 2, 14); diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index fac0df938..460912a3a 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -69,8 +69,9 @@ public class PacketDispatcher { wrapper.registerMessage(HeldItemNBTPacket.Handler.class, HeldItemNBTPacket.class, i++, Side.CLIENT); //Syncs muzzle flashes of SEDNA guns for clients from other entities/players wrapper.registerMessage(MuzzleFlashPacket.Handler.class, MuzzleFlashPacket.class, i++, Side.CLIENT); - //Sends custom container-bound payload from a server container to a client one - wrapper.registerMessage(ContainerCustomPayloadPacket.Handler.class, ContainerCustomPayloadPacket.class, i++, Side.CLIENT); + //Sends custom container-bound payload between client and server, dual-use capable + wrapper.registerMessage(ContainerNBTCommsPacket.Handler.class, ContainerNBTCommsPacket.class, i++, Side.CLIENT); + wrapper.registerMessage(ContainerNBTCommsPacket.Handler.class, ContainerNBTCommsPacket.class, i++, Side.SERVER); } } diff --git a/src/main/java/com/hbm/packet/toclient/ContainerCustomPayloadPacket.java b/src/main/java/com/hbm/packet/toclient/ContainerNBTCommsPacket.java similarity index 67% rename from src/main/java/com/hbm/packet/toclient/ContainerCustomPayloadPacket.java rename to src/main/java/com/hbm/packet/toclient/ContainerNBTCommsPacket.java index d9ed25b6b..c53b8ac8f 100644 --- a/src/main/java/com/hbm/packet/toclient/ContainerCustomPayloadPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ContainerNBTCommsPacket.java @@ -7,20 +7,18 @@ import com.hbm.util.BufferUtil; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -public class ContainerCustomPayloadPacket implements IMessage { +public class ContainerNBTCommsPacket implements IMessage { int windowId; NBTTagCompound data; - public ContainerCustomPayloadPacket() { } + public ContainerNBTCommsPacket() { } - public ContainerCustomPayloadPacket(int windowId, NBTTagCompound data) { + public ContainerNBTCommsPacket(int windowId, NBTTagCompound data) { this.windowId = windowId; this.data = data; } @@ -37,14 +35,15 @@ public class ContainerCustomPayloadPacket implements IMessage { BufferUtil.writeNBT(buf, this.data); } - public static class Handler implements IMessageHandler { + public static class Handler implements IMessageHandler { - @SideOnly(Side.CLIENT) @Override - public IMessage onMessage(ContainerCustomPayloadPacket m, MessageContext ctx) { - EntityPlayer player = MainRegistry.proxy.me(); + @Override + public IMessage onMessage(ContainerNBTCommsPacket m, MessageContext ctx) { + + EntityPlayer player = ctx.side.isClient() ? MainRegistry.proxy.me() : ctx.getServerHandler().playerEntity; if(player.openContainer instanceof ICustomPayloadReceiver) { ICustomPayloadReceiver cus = (ICustomPayloadReceiver) player.openContainer; - cus.acceptData(m.windowId, m.data); + cus.acceptData(ctx.side, m.windowId, m.data); } return null; } From ab1e78b2a793cdc7f49f36635b013b8aa70667bc Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 18 Jun 2026 16:52:07 +0200 Subject: [PATCH 022/107] yeah let's just start over entirely --- changelog | 1 + src/main/java/api/hbm/ntl/StackCache.java | 2 - .../entity/projectile/EntityBulletBaseNT.java | 117 +----- .../com/hbm/handler/BulletConfiguration.java | 85 ---- .../handler/guncfg/BulletConfigFactory.java | 3 - .../com/hbm/handler/guncfg/GunNPCFactory.java | 4 - .../ContainerPneumoStorageAccess.java | 4 + .../ContainerPneumoStorageAccessMK2.java | 384 ++++++++++++++++++ .../inventory/gui/GUIPneumoStorageAccess.java | 14 +- .../inventory/recipes/anvil/AnvilRecipes.java | 13 - .../entity/projectile/RenderBullet.java | 208 +--------- .../TileEntityPneumoStorageAccess.java | 4 +- 12 files changed, 403 insertions(+), 436 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java diff --git a/changelog b/changelog index 14053316c..cd270ba11 100644 --- a/changelog +++ b/changelog @@ -13,6 +13,7 @@ * Updated light brick texture * The maximum character limit on RoR channels is now the same for all RoR devices, being 15 * This does not include special RoR interactive devices that don't use GUI text fields like the RoR terminal or the AUTOCAL units +* Pile output rods like the bred uranium and the plutonium rods can no longer be dismantled using the anvil, the PUREX is now mandatory ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index a71638a4c..225164256 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -44,8 +44,6 @@ public class StackCache { } cache.addMonitor(monitor); - - System.out.println(monitor.toZeroStack() + " " + cache.monitors.size()); } public CacheSlot getSlotFromStack(ItemStack stack) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java index 02970ee35..c272786aa 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java @@ -5,12 +5,6 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.bomb.BlockDetonatable; -import com.hbm.entity.effect.EntityCloudFleijaRainbow; -import com.hbm.entity.effect.EntityEMPBlast; -import com.hbm.entity.logic.EntityNukeExplosionMK3; -import com.hbm.entity.logic.EntityNukeExplosionMK5; -import com.hbm.explosion.ExplosionLarge; -import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard; import com.hbm.explosion.vanillant.standard.BlockMutatorFire; @@ -25,7 +19,6 @@ import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; -import com.hbm.util.ArmorUtil; import com.hbm.util.BobMathUtil; import com.hbm.util.Tuple.Pair; @@ -34,7 +27,6 @@ import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; @@ -182,29 +174,6 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet return; } - if(worldObj.isRemote && config.style == BulletConfiguration.STYLE_TAU) { - if(trailNodes.isEmpty()) { - this.ignoreFrustumCheck = true; - trailNodes.add(new Pair(Vec3.createVectorHelper(-motionX * 2, -motionY * 2, -motionZ * 2), 0D)); - } else { - trailNodes.add(new Pair(Vec3.createVectorHelper(0, 0, 0), 1D)); - } - } - - if(worldObj.isRemote && this.config.blackPowder && this.ticksExisted == 1) { - - for(int i = 0; i < 15; i++) { - double mod = rand.nextDouble(); - this.worldObj.spawnParticle("smoke", this.posX, this.posY, this.posZ, - (this.motionX + rand.nextGaussian() * 0.05) * mod, - (this.motionY + rand.nextGaussian() * 0.05) * mod, - (this.motionZ + rand.nextGaussian() * 0.05) * mod); - } - - double mod = 0.5; - this.worldObj.spawnParticle("flame", this.posX + this.motionX * mod, this.posY + this.motionY * mod, this.posZ + this.motionZ * mod, 0, 0, 0); - } - if(!worldObj.isRemote) { if(config.maxAge == 0) { @@ -251,7 +220,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet boolean hRic = rand.nextInt(100) < config.HBRC; boolean doesRic = config.doesRicochet && hRic; - if(!config.isSpectral && !doesRic) { + if(!doesRic) { this.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); this.onBlockImpact(mop.blockX, mop.blockY, mop.blockZ, mop.sideHit); } @@ -293,7 +262,6 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet worldObj.playSoundAtEntity(this, "hbm:weapon.gBounce", 1.0F, 1.0F); this.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); - onRicochet(mop.blockX, mop.blockY, mop.blockZ); //worldObj.setBlock((int) Math.floor(posX), (int) Math.floor(posY), (int) Math.floor(posZ), Blocks.dirt); @@ -304,10 +272,6 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet } } - /*this.posX += (mop.hitVec.xCoord - this.posX) * 0.6; - this.posY += (mop.hitVec.yCoord - this.posY) * 0.6; - this.posZ += (mop.hitVec.zCoord - this.posZ) * 0.6;*/ - this.motionX *= config.bounceMod; this.motionY *= config.bounceMod; this.motionZ *= config.bounceMod; @@ -380,7 +344,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet config.bntImpact.behaveBlockHit(this, bX, bY, bZ, sideHit); if(!worldObj.isRemote) { - if(!config.liveAfterImpact && !config.isSpectral && bY > -1 && !this.inGround) this.setDead(); + if(bY > -1 && !this.inGround) this.setDead(); if(!config.doesPenetrate && bY == -1) this.setDead(); } @@ -394,24 +358,6 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet if(worldObj.rand.nextInt(3) == 0 && worldObj.getBlock((int)posX, (int)posY, (int)posZ - 1) == Blocks.air) worldObj.setBlock((int)posX, (int)posY, (int)posZ - 1, Blocks.fire); } - if(config.emp > 0) - ExplosionNukeGeneric.empBlast(this.worldObj, (int)(this.posX + 0.5D), (int)(this.posY + 0.5D), (int)(this.posZ + 0.5D), config.emp); - - if(config.emp > 3) { - if (!this.worldObj.isRemote) { - - EntityEMPBlast cloud = new EntityEMPBlast(this.worldObj, config.emp); - cloud.posX = this.posX; - cloud.posY = this.posY + 0.5F; - cloud.posZ = this.posZ; - - this.worldObj.spawnEntityInWorld(cloud); - } - } - - if(config.jolt > 0 && !worldObj.isRemote) - ExplosionLarge.jolt(worldObj, posX, posY, posZ, config.jolt, 150, 0.25); - if(config.explosive > 0 && !worldObj.isRemote) { //worldObj.newExplosion(this.thrower, posX, posY, posZ, config.explosive, config.incendiary > 0, config.blockDamage); ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY, posZ, config.explosive, this.thrower); @@ -424,32 +370,6 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet vnt.explode(); } - if(config.shrapnel > 0 && !worldObj.isRemote) - ExplosionLarge.spawnShrapnels(worldObj, posX, posY, posZ, config.shrapnel); - - if(config.rainbow > 0 && !worldObj.isRemote) { - EntityNukeExplosionMK3 ex = EntityNukeExplosionMK3.statFacFleija(worldObj, posX, posY, posZ, config.rainbow); - if(!ex.isDead) { - this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); - worldObj.spawnEntityInWorld(ex); - - EntityCloudFleijaRainbow cloud = new EntityCloudFleijaRainbow(this.worldObj, config.rainbow); - cloud.posX = this.posX; - cloud.posY = this.posY; - cloud.posZ = this.posZ; - this.worldObj.spawnEntityInWorld(cloud); - } - } - - if(config.nuke > 0 && !worldObj.isRemote) { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, config.nuke, posX, posY, posZ)); - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "muke"); - if(MainRegistry.polaroidID == 11 || rand.nextInt(100) == 0) data.setBoolean("balefire", true); - PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); - worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); - } - if(config.destroysBlocks && !worldObj.isRemote) { if(block.getBlockHardness(worldObj, bX, bY, bZ) <= 120) worldObj.func_147480_a(bX, bY, bZ, false); @@ -463,30 +383,15 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet } } - //for when a bullet dies by hitting a block - private void onRicochet(int bX, int bY, int bZ) { - - if(config.bntRicochet != null) - config.bntRicochet.behaveBlockRicochet(this, bX, bY, bZ); - } - //for when a bullet dies by hitting an entity private void onEntityImpact(Entity e) { onEntityHurt(e); onBlockImpact(-1, -1, -1, -1); - - if(config.bntHit != null) - config.bntHit.behaveEntityHit(this, e); - - //this.setDead(); } //for when a bullet hurts an entity, not necessarily dying private void onEntityHurt(Entity e) { - if(config.bntHurt != null) - config.bntHurt.behaveEntityHurt(this, e); - if(config.incendiary > 0 && !worldObj.isRemote) { e.setFire(config.incendiary); } @@ -501,19 +406,6 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet ((EntityLivingBase)e).addPotionEffect(new PotionEffect(effect)); } } - - if(config.instakill && e instanceof EntityLivingBase && !worldObj.isRemote) { - - if(!(e instanceof EntityPlayer && ((EntityPlayer)e).capabilities.isCreativeMode)) - ((EntityLivingBase)e).setHealth(0.0F); - } - - if(config.caustic > 0 && e instanceof EntityPlayer){ - ArmorUtil.damageSuit((EntityPlayer)e, 0, config.caustic); - ArmorUtil.damageSuit((EntityPlayer)e, 1, config.caustic); - ArmorUtil.damageSuit((EntityPlayer)e, 2, config.caustic); - ArmorUtil.damageSuit((EntityPlayer)e, 3, config.caustic); - } } @Override @@ -521,11 +413,6 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet return this.config.doesPenetrate; } - @Override - public boolean isSpectral() { - return this.config.isSpectral; - } - @Override public int selfDamageDelay() { return this.config.selfDamageDelay; diff --git a/src/main/java/com/hbm/handler/BulletConfiguration.java b/src/main/java/com/hbm/handler/BulletConfiguration.java index c2b269b27..f17400d9e 100644 --- a/src/main/java/com/hbm/handler/BulletConfiguration.java +++ b/src/main/java/com/hbm/handler/BulletConfiguration.java @@ -4,32 +4,24 @@ import java.util.List; import com.hbm.entity.projectile.EntityBulletBaseNT; import com.hbm.entity.projectile.EntityBulletBaseNT.*; -import com.hbm.handler.guncfg.BulletConfigFactory; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.particle.SpentCasing; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSourceIndirect; -import net.minecraft.util.EnumChatFormatting; @Deprecated public class BulletConfiguration implements Cloneable { //what item this specific configuration consumes public ComparableStack ammo; - //how many ammo units one item restores - public int ammoCount = 1; //how fast the bullet is (in sanics per second, or sps) public float velocity; //spread of bullets in gaussian range public float spread; - //weapon durability reduced (centered around 10) - public int wear; //greatest amount of pellets created each shot public int bulletsMin; //least amount of pellets created each shot @@ -60,39 +52,16 @@ public class BulletConfiguration implements Cloneable { //whether or not the bullet should penetrate mobs public boolean doesPenetrate; - //disables collisions with blocks entirely - public boolean isSpectral; //whether or not the bullet should break glass public boolean doesBreakGlass; - //bullets still call the impact function when hitting blocks but do not get destroyed - public boolean liveAfterImpact; - - //creates a "muzzle flash" and a ton of smoke with every projectile spawned - public boolean blackPowder = false; //bullet effects public List effects; public int incendiary; - public int emp; public boolean blockDamage = true; public float explosive; - public double jolt; - public int rainbow; - public int nuke; - public int shrapnel; - public int chlorine; public int leadChance; - public int caustic; public boolean destroysBlocks; - public boolean instakill; - /*public IBulletHurtBehavior bHurt; - public IBulletHitBehavior bHit; - public IBulletRicochetBehavior bRicochet; - public IBulletImpactBehavior bImpact; - public IBulletUpdateBehavior bUpdate;*/ - public IBulletHurtBehaviorNT bntHurt; - public IBulletHitBehaviorNT bntHit; - public IBulletRicochetBehaviorNT bntRicochet; public IBulletImpactBehaviorNT bntImpact; public IBulletUpdateBehaviorNT bntUpdate; @@ -104,17 +73,6 @@ public class BulletConfiguration implements Cloneable { public int plink; //vanilla particle FX public String vPFX = ""; - public SpentCasing spentCasing; - - //energy projectiles - //power consumed per shot - public int dischargePerShot; - //unlocalised firing mode name - public String modeName; - //firing mode text colour - public EnumChatFormatting chatColour = EnumChatFormatting.WHITE; - //firing rate - public int firingRate; public String damageType = ModDamageSource.s_bullet; public boolean dmgProj = true; @@ -122,23 +80,14 @@ public class BulletConfiguration implements Cloneable { public boolean dmgExplosion = false; public boolean dmgBypass = false; - public static final int STYLE_NONE = -1; public static final int STYLE_NORMAL = 0; - public static final int STYLE_PISTOL = 1; public static final int STYLE_FLECHETTE = 2; - public static final int STYLE_PELLET = 3; public static final int STYLE_BOLT = 4; - public static final int STYLE_FOLLY = 5; public static final int STYLE_ROCKET = 6; - public static final int STYLE_STINGER = 7; public static final int STYLE_GRENADE = 10; - public static final int STYLE_BF = 11; public static final int STYLE_ORB = 12; public static final int STYLE_METEOR = 13; - public static final int STYLE_APDS = 14; public static final int STYLE_BLADE = 15; - public static final int STYLE_TAU = 17; - public static final int STYLE_LEADBURSTER = 18; public static final int PLINK_NONE = 0; public static final int PLINK_BULLET = 1; @@ -149,10 +98,7 @@ public class BulletConfiguration implements Cloneable { public static final int BOLT_LACUNAE = 0; public static final int BOLT_NIGHTMARE = 1; public static final int BOLT_LASER = 2; - public static final int BOLT_ZOMG = 3; public static final int BOLT_WORM = 4; - public static final int BOLT_GLASS_CYAN = 5; - public static final int BOLT_GLASS_BLUE = 6; public BulletConfiguration setToBolt(int trail) { @@ -172,37 +118,6 @@ public class BulletConfiguration implements Cloneable { return this; } - public BulletConfiguration getChlorophyte() { - this.bntUpdate = BulletConfigFactory.getHomingBehavior(30, 180); - this.bntHurt = BulletConfigFactory.getPenHomingBehavior(); - this.dmgMin *= 2F; - this.dmgMax *= 2F; - this.wear *= 0.5; - this.velocity *= 0.3; - this.doesRicochet = false; - this.doesPenetrate = true; - this.vPFX = "greendust"; - - if(this.spentCasing != null) { - int[] colors = this.spentCasing.getColors(); - this.spentCasing = this.spentCasing.clone(); - - if(colors != null && colors.length > 0) { - int[] colorClone = new int[colors.length]; - for(int i = 0; i < colors.length; i++) colorClone[i] = colors[i]; - colorClone[colorClone.length - 1] = 0x659750; // <- standard chlorophyte coloring in last place - this.spentCasing.setColor(colorClone).register(this.spentCasing.getName() + "Cl"); - } - } - - return this; - } - - public BulletConfiguration setToHoming(ItemStack ammo) { - this.ammo = new ComparableStack(ammo); - return getChlorophyte(); - } - public BulletConfiguration accuracyMod(float mod) { this.spread *= mod; diff --git a/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java b/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java index 83332e52a..1040f0c0a 100644 --- a/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java @@ -23,7 +23,6 @@ public class BulletConfigFactory { bullet.velocity = 5.0F; bullet.spread = defaultSpread; - bullet.wear = 10; bullet.bulletsMin = 1; bullet.bulletsMax = 1; bullet.gravity = 0D; @@ -49,7 +48,6 @@ public class BulletConfigFactory { bullet.velocity = 2.0F; bullet.spread = defaultSpread; - bullet.wear = 10; bullet.bulletsMin = 1; bullet.bulletsMax = 1; bullet.gravity = 0.005D; @@ -75,7 +73,6 @@ public class BulletConfigFactory { bullet.velocity = 2.0F; bullet.spread = defaultSpread; - bullet.wear = 10; bullet.bulletsMin = 1; bullet.bulletsMax = 1; bullet.gravity = 0.035D; diff --git a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java index aa33eba4f..d6ffd12f6 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java @@ -33,7 +33,6 @@ public class GunNPCFactory { bullet.ammo = new ComparableStack(ModItems.coin_maskman); bullet.velocity = 0.25F; bullet.spread = 0.000F; - bullet.wear = 10; bullet.bulletsMin = 1; bullet.bulletsMax = 1; bullet.dmgMin = 100; @@ -85,7 +84,6 @@ public class GunNPCFactory { bullet.spread = 0.0F; bullet.dmgMin = 15; bullet.dmgMax = 20; - bullet.wear = 10; bullet.leadChance = 0; bullet.explosive = 0.5F; bullet.setToBolt(BulletConfiguration.BOLT_LACUNAE); @@ -103,7 +101,6 @@ public class GunNPCFactory { bullet.spread = 0.0F; bullet.dmgMin = 5; bullet.dmgMax = 10; - bullet.wear = 10; bullet.leadChance = 15; bullet.style = BulletConfiguration.STYLE_FLECHETTE; bullet.vPFX = "bluedust"; @@ -119,7 +116,6 @@ public class GunNPCFactory { bullet.spread = 0.0F; bullet.dmgMin = 15; bullet.dmgMax = 20; - bullet.wear = 10; bullet.leadChance = 0; bullet.setToBolt(BulletConfiguration.BOLT_NIGHTMARE); bullet.vPFX = "reddust"; diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index 779f6cea5..53ffeaea2 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -77,6 +77,10 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa this.detectAndSendChanges(); } + public int getStackCount() { + return itemCountForClient; + } + public void updateListing(int startingIndex) { // DEMO if(this.access.cache == null || this.access.cache.hasExpired) return; StackCache cache = this.access.cache; diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java new file mode 100644 index 000000000..293be4f8a --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java @@ -0,0 +1,384 @@ +package com.hbm.inventory.container; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.inventory.SlotNonRetarded; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.ContainerNBTCommsPacket; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; +import com.hbm.util.EnumUtil; + +import api.hbm.ntl.StackCache; +import api.hbm.ntl.StackCache.CacheSlot; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class ContainerPneumoStorageAccessMK2 extends Container implements ICustomPayloadReceiver { + + protected TileEntityPneumoStorageAccess access; + protected InventoryPneumoStorageAccess inventory; + + /** On the server, this is used to find changes in the system and then send them to the client. On the client, this is just to keep track of all items. */ + protected LinkedHashMap cachedEntries = new LinkedHashMap(); + /** Server to client queue, contains NBT tags that represents deltas yet to be sent to the client */ + public LinkedList s2cQueue = new LinkedList(); + + /** Used to temporarily store the previous CacheSlot contents to calculate deltas with (i.e. detect changes) */ + public static class CacheSlotDummy { + + public final ItemStack displayStack; + public long stacksize; + public final int itemId; + public final int meta; + public final NBTTagCompound nbt; + + public CacheSlotDummy(ItemStack displayStack, long stacksize) { + this.displayStack = displayStack; + this.stacksize = stacksize; + this.itemId = Item.getIdFromItem(displayStack.getItem()); + this.meta = displayStack.getItemDamage(); + if(displayStack.hasTagCompound()) this.nbt = (NBTTagCompound) displayStack.stackTagCompound.copy(); + else this.nbt = null; + } + + public CacheSlotDummy(CacheSlot original) { + this(original.displayStack.copy(), original.stacksize); + } + } + + public static final int GRID_SIZE = 6 * 8; + public static final int DELTAS_PER_MSG = 6 * 8; + + public int listingStart = 0; + + public int getStackCount() { + return cachedEntries.size(); + } + + /** Serverside, creates a new delta for a new item stack */ + public void pushNewItem(ItemStack zeroStack, long amount) { + NBTTagCompound data = new NBTTagCompound(); + data.setByte("type", (byte) DeltaType.NEW_TYPE.ordinal()); + zeroStack.writeToNBT(data); + data.setLong("amount", amount); + s2cQueue.add(data); + } + + /** Serverside, creates a new delta for an amount update */ + public void updateCount(long hash, long amount) { + NBTTagCompound data = new NBTTagCompound(); + data.setByte("type", (byte) DeltaType.COUNT_CHANGE.ordinal()); + data.setLong("hash", hash); + data.setLong("amount", amount); + s2cQueue.add(data); + } + + /** Serverside, bunches up deltas into NBTTagLists and sends them, 48 (DELTAS_PER_MSG) at a time */ + public void processDeltasAndSync(EntityPlayerMP playerMP) { + if(s2cQueue.isEmpty()) return; + + NBTTagList list = null; + + while(!s2cQueue.isEmpty()) { + if(list == null) list = new NBTTagList(); + list.appendTag(s2cQueue.removeFirst()); + if(list.tagCount() >= DELTAS_PER_MSG) { bonVoyage(list, playerMP); list = null; } + } + + if(list != null) bonVoyage(list, playerMP); + } + + /** Wraps the NBTTagList into a master compound tag and sends it to the client */ + public void bonVoyage(NBTTagList list, EntityPlayerMP playerMP) { + NBTTagCompound masterTag = new NBTTagCompound(); + masterTag.setTag("list", list); + PacketDispatcher.wrapper.sendTo(new ContainerNBTCommsPacket(playerMP.currentWindowId, masterTag), playerMP); + } + + /** Compares the original access stack cache with the one we have buffered to detect changes and pushes them to the s2c sending queue */ + public void checkAndSyncCache() { + if(this.access.cache == null || this.access.cache.hasExpired) return; + + for(Entry entry : this.access.cache.cacheSlots.entrySet()) { + + Long hash = entry.getKey(); + if(hash == StackCache.getNullIdentity()) continue; + + CacheSlotDummy existingCache = this.cachedEntries.get(hash); + CacheSlot properCache = entry.getValue(); + + // if the previous entries already contain this type, check for amount change + if(existingCache != null) { + if(existingCache.stacksize != properCache.stacksize) { + this.updateCount(hash, properCache.stacksize); + existingCache.stacksize = properCache.stacksize; + } + // if not, add that type to our index + } else { + existingCache = new CacheSlotDummy(properCache); + existingCache.stacksize = properCache.stacksize; + this.cachedEntries.put(hash, existingCache); + this.pushNewItem(existingCache.displayStack, existingCache.stacksize); + } + } + } + + public ContainerPneumoStorageAccessMK2(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { + this.access = access; + this.inventory = new InventoryPneumoStorageAccess(access); + + for(int i = 0; i < 6; i++) for(int j = 0; j < 8; j++) { + this.addSlotToContainer(new SlotPneumo(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); + } + + for(int i = 0; i < 3; i++) for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new SlotNonRetarded(invPlayer, j + i * 9 + 9, 8 + j * 18, 169 + i * 18)); + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new SlotNonRetarded(invPlayer, i, 8 + i * 18, 227)); + } + + this.detectAndSendChanges(); + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + if(mode == 6) return null; + + boolean leftClick = button == 0 && mode == 0; + boolean rightClick = button == 1 && mode == 0; + boolean shiftClick = button == 0 && mode == 1; + + if(index >= 0 && index < GRID_SIZE) { + + // TODO: in this new version, the server has no fucking idea what slot we are even clicking on + + // shift clicking an item from the player inv to the storage + } else if(index >= GRID_SIZE && index < this.inventorySlots.size()) { + + Slot slot = this.getSlot(index); + + if(shiftClick && slot.getHasStack()) { + ItemStack stack = slot.getStack().copy(); + if(this.access.cache == null || this.access.cache.hasExpired) return null; + StackCache cache = this.access.cache; + int remainder = (int) cache.addItemsAndReturnQuantity(stack, stack.stackSize); + slot.decrStackSize(stack.stackSize - remainder); + if(remainder <= 0) slot.putStack(null); + slot.onSlotChanged(); + detectAndSendChanges(); + } + } + + return super.slotClick(index, button, mode, player); + } + + public long[] previousStackSizes = new long[GRID_SIZE]; + + @Override + public void detectAndSendChanges() { + + // skip the first 6*8 slots, i.e. all the ones visible in the access grid + for(int i = GRID_SIZE; i < this.inventorySlots.size(); i++) { + ItemStack stack0 = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack stack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if(!ItemStack.areItemStacksEqual(stack1, stack0)) { + stack1 = stack0 == null ? null : stack0.copy(); + this.inventoryItemStacks.set(i, stack1); + + for(int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, stack1); + } + } + } + + boolean isServer = !this.access.getWorldObj().isRemote; + + if(isServer) { + checkAndSyncCache(); + } else { + rebuildClientIndex(); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return access.getDistanceFrom(player.posX, player.posY, player.posZ) <= 15 * 15; + } + + public static enum DeltaType { + NEW_TYPE, + COUNT_CHANGE; + } + + @Override + public void acceptData(Side side, int windowId, NBTTagCompound data) { + if(windowId != this.windowId) return; + + if(side == Side.CLIENT) { + NBTTagList list = data.getTagList("list", 10); + + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound line = list.getCompoundTagAt(i); + DeltaType type = EnumUtil.grabEnumSafely(DeltaType.class, line.getByte("type")); + + if(type == DeltaType.NEW_TYPE) { + ItemStack stack = ItemStack.loadItemStackFromNBT(line); + long amount = line.getLong("amount"); + long hash = StackCache.getStackIdentity(stack); + CacheSlotDummy dummy = new CacheSlotDummy(stack, amount); + this.cachedEntries.put(hash, dummy); + + } else if(type == DeltaType.COUNT_CHANGE) { + long hash = line.getLong("hash"); + CacheSlotDummy dummy = this.cachedEntries.get(hash); + if(dummy != null) dummy.stacksize = line.getLong("amount"); + } + } + } + } + + public int startingIndex; + + public void rebuildClientIndex() { + + List cacheSlots = new ArrayList(this.cachedEntries.size()); + cacheSlots.addAll(this.cachedEntries.values()); + cacheSlots.removeIf(x -> { return x.stacksize <= 0; }); + Collections.sort(cacheSlots, SORT_BY_STACK_SIZE); + int size = cacheSlots.size(); + + int offset = startingIndex * 8; + + for(int i = 0; i < inventory.slots.length; i++) { + int grabIndex = offset + i; + if(grabIndex < size) { + CacheSlotDummy cacheSlot = cacheSlots.get(grabIndex); + if(cacheSlot.displayStack != null) { + inventory.slots[i] = cacheSlot.displayStack.copy(); + } else { + inventory.slots[i] = null; + } + } else { + inventory.slots[i] = null; + } + } + } + + public static final Comparator SORT_BY_STACK_SIZE = new Comparator() { + @Override + public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { + if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; + if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; + if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; + if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; + return 0; + } + }; + + public static final Comparator SORT_BY_ID = new Comparator() { + @Override + public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { + if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; + if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; + if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; + if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; + return 0; + } + }; + + public static final Comparator SORT_BY_INTERNAL = new Comparator() { + @Override + public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { + String name1 = o1.displayStack.getItem().getUnlocalizedName(o1.displayStack); + String name2 = o2.displayStack.getItem().getUnlocalizedName(o2.displayStack); + int compare = name1.compareToIgnoreCase(name2); + if(compare != 0) return compare; + return SORT_BY_ID.compare(o1, o2); + } + }; + + public static final Comparator SORT_BY_LOCALIZED = new Comparator() { + @Override + public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { + String name1 = o1.displayStack.getItem().getItemStackDisplayName(o1.displayStack); + String name2 = o2.displayStack.getItem().getItemStackDisplayName(o2.displayStack); + int compare = name1.compareToIgnoreCase(name2); + if(compare != 0) return compare; + return SORT_BY_ID.compare(o1, o2); + } + }; + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + return null; + } + + public static class SlotPneumo extends SlotNonRetarded { + + public long amount; + + public SlotPneumo(IInventory inventory, int id, int x, int y) { + super(inventory, id, x, y); + } + + @Override + public boolean canTakeStack(EntityPlayer player) { + return true; + } + } + + /** This inventory instance only exists to prepare the contents of a StackCache in such a way that we can use it in a container. */ + public static class InventoryPneumoStorageAccess implements IInventory { + + public StackCache cache; + public ItemStack[] slots; + + public InventoryPneumoStorageAccess(TileEntityPneumoStorageAccess access) { + this.slots = new ItemStack[getSizeInventory()]; + this.cache = access.cache; + } + + @Override public int getSizeInventory() { return GRID_SIZE; } + @Override public ItemStack getStackInSlot(int slot) { return slots[slot]; } + @Override public int getInventoryStackLimit() { return 1; } + @Override public ItemStack decrStackSize(int slot, int amount) { return null; } + @Override public void setInventorySlotContents(int slot, ItemStack stack) { this.slots[slot] = stack; } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + if(slots[slot] != null) { + ItemStack stack = slots[slot]; + slots[slot] = null; + return stack; + } + return null; + } + + @Override public String getInventoryName() { return "null"; } + @Override public boolean hasCustomInventoryName() { return false; } + @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return false; } + @Override public void markDirty() { } + @Override public boolean isUseableByPlayer(EntityPlayer player) { return true; } + @Override public void openInventory() { } + @Override public void closeInventory() { } + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index dfcd119a0..5780ac391 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -7,8 +7,8 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import static com.hbm.inventory.gui.element.GUIElements.*; -import com.hbm.inventory.container.ContainerPneumoStorageAccess; -import com.hbm.inventory.container.ContainerPneumoStorageAccess.SlotPneumo; +import com.hbm.inventory.container.ContainerPneumoStorageAccessMK2; +import com.hbm.inventory.container.ContainerPneumoStorageAccessMK2.SlotPneumo; import com.hbm.inventory.gui.element.GUIElements; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; @@ -40,7 +40,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { protected boolean draggingScroll = false; public GUIPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { - super(new ContainerPneumoStorageAccess(invPlayer, access)); + super(new ContainerPneumoStorageAccessMK2(invPlayer, access)); this.access = access; this.xSize = 176; @@ -63,8 +63,8 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { - ContainerPneumoStorageAccess container = (ContainerPneumoStorageAccess) this.inventorySlots; - this.scrollBounds = (int) Math.ceil(container.itemCountForClient / 8D - 6D); + ContainerPneumoStorageAccessMK2 container = (ContainerPneumoStorageAccessMK2) this.inventorySlots; + this.scrollBounds = (int) Math.ceil(container.getStackCount() / 8D - 6D); if(this.scrollBounds < 1) this.scrollBounds = 1; if(this.scrollIndex < 0) this.setScroll(0); if(this.scrollIndex > scrollBounds) this.setScroll(scrollBounds); @@ -154,7 +154,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { } public int getScrollBarYPos() { - ContainerPneumoStorageAccess container = (ContainerPneumoStorageAccess) this.inventorySlots; + ContainerPneumoStorageAccessMK2 container = (ContainerPneumoStorageAccessMK2) this.inventorySlots; int scrollArea = 106 - 15; // bar height minus the scroll knob's height double scrollProgress = (double) container.listingStart / (double) scrollBounds; int scrollYPos = 17 + (int) (scrollProgress * scrollArea); @@ -172,7 +172,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { } public void refreshContainer() { - this.mc.playerController.windowClick(this.inventorySlots.windowId, ContainerPneumoStorageAccess.SLOT_CLICK_ID_REFRESH, 0, this.scrollIndex, this.mc.thePlayer); + //this.mc.playerController.windowClick(this.inventorySlots.windowId, ContainerPneumoStorageAccessMK2.SLOT_CLICK_ID_REFRESH, 0, this.scrollIndex, this.mc.thePlayer); } @Override 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 959dc6be2..43a7edd7d 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -967,19 +967,6 @@ public class AnvilRecipes extends SerializableRecipe { new AnvilOutput(new ItemStack(ModItems.circuit, 1, EnumCircuitType.BASIC.ordinal())), new AnvilOutput(new ItemStack(ModItems.circuit, 1, EnumCircuitType.BASIC.ordinal()), 0.5F), }).setTier(4)); - constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_plutonium), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.billet_pu_mix, 2)), - new AnvilOutput(new ItemStack(ModItems.billet_uranium, 1)), - new AnvilOutput(new ItemStack(ModItems.plate_iron, 2)) - }).setTier(2)); - constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_pu239), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.billet_pu239, 1)), //Might need to be cut to 3 nuggets, but a full billet is nice and round - new AnvilOutput(new ItemStack(ModItems.billet_pu_mix, 1)), - new AnvilOutput(new ItemStack(ModItems.billet_uranium, 1)), - new AnvilOutput(new ItemStack(ModItems.plate_iron, 2)) - }).setTier(2)); } else { constructionRecipes.add(new AnvilConstructionRecipe( diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderBullet.java b/src/main/java/com/hbm/render/entity/projectile/RenderBullet.java index 492b62051..748556702 100644 --- a/src/main/java/com/hbm/render/entity/projectile/RenderBullet.java +++ b/src/main/java/com/hbm/render/entity/projectile/RenderBullet.java @@ -3,17 +3,12 @@ package com.hbm.render.entity.projectile; import java.util.Random; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; -import com.hbm.entity.projectile.EntityBulletBaseNT; -import com.hbm.entity.projectile.IBulletBase; import com.hbm.handler.BulletConfiguration; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; -import com.hbm.render.model.ModelBullet; import com.hbm.render.util.RenderSparks; -import com.hbm.util.Tuple.Pair; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; @@ -22,20 +17,12 @@ import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Vec3; -@Deprecated +@Deprecated // the entire old bullet system should finally fucking die i hate it public class RenderBullet extends Render { - private ModelBullet bullet; - - public RenderBullet() { - bullet = new ModelBullet(); - } - @Override public void doRender(Entity bullet, double x, double y, double z, float f0, float f1) { @@ -54,21 +41,14 @@ public class RenderBullet extends Render { GL11.glEnable(GL11.GL_CULL_FACE); switch(style) { - case BulletConfiguration.STYLE_NONE: break; case BulletConfiguration.STYLE_NORMAL: renderBullet(trail); break; - case BulletConfiguration.STYLE_PISTOL: renderPistol(trail); break; case BulletConfiguration.STYLE_BOLT: renderDart(trail, bullet.getEntityId()); break; case BulletConfiguration.STYLE_FLECHETTE: renderFlechette(); break; - case BulletConfiguration.STYLE_FOLLY: renderBullet(trail); break; - case BulletConfiguration.STYLE_PELLET: renderBuckshot(); break; case BulletConfiguration.STYLE_ROCKET: renderRocket(trail); break; case BulletConfiguration.STYLE_GRENADE: renderGrenade(trail); break; case BulletConfiguration.STYLE_ORB: renderOrb(trail); break; case BulletConfiguration.STYLE_METEOR: renderMeteor(trail); break; - case BulletConfiguration.STYLE_APDS: renderAPDS(); break; case BulletConfiguration.STYLE_BLADE: renderBlade(); break; - case BulletConfiguration.STYLE_TAU: renderTau(bullet, trail, f1); break; - case BulletConfiguration.STYLE_LEADBURSTER: renderLeadburster(bullet, f1); break; default: renderBullet(trail); break; } @@ -78,48 +58,13 @@ public class RenderBullet extends Render { private void renderBullet(int type) { - if (type == 2) { - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/models/emplacer.png")); - bullet.renderAll(0.0625F); - } else if (type == 1) { - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/models/tau.png")); - bullet.renderAll(0.0625F); - } else if (type == 0) { - - GL11.glScaled(0.5, 0.5, 0.5); - GL11.glRotated(90, 0, 0, 1); - GL11.glRotated(90, 0, 1, 0); - - GL11.glShadeModel(GL11.GL_SMOOTH); - bindTexture(ResourceManager.bullet_rifle_tex); - ResourceManager.projectiles.renderPart("BulletRifle"); - GL11.glShadeModel(GL11.GL_FLAT); - } - - } - - private void renderPistol(int type) { - GL11.glScaled(0.5, 0.5, 0.5); GL11.glRotated(90, 0, 0, 1); GL11.glRotated(90, 0, 1, 0); GL11.glShadeModel(GL11.GL_SMOOTH); - bindTexture(ResourceManager.bullet_pistol_tex); - ResourceManager.projectiles.renderPart("BulletPistol"); - GL11.glShadeModel(GL11.GL_FLAT); - - } - - private void renderBuckshot() { - - GL11.glScaled(0.5, 0.5, 0.5); - GL11.glRotated(90, 0, 0, 1); - GL11.glRotated(90, 0, 1, 0); - - GL11.glShadeModel(GL11.GL_SMOOTH); - bindTexture(ResourceManager.buckshot_tex); - ResourceManager.projectiles.renderPart("Buckshot"); + bindTexture(ResourceManager.bullet_rifle_tex); + ResourceManager.projectiles.renderPart("BulletRifle"); GL11.glShadeModel(GL11.GL_FLAT); } @@ -216,18 +161,6 @@ public class RenderBullet extends Render { GL11.glShadeModel(GL11.GL_FLAT); } - private void renderAPDS() { - - GL11.glScaled(2, 2, 2); - GL11.glRotated(90, 0, 0, 1); - GL11.glRotated(90, 0, 1, 0); - - GL11.glShadeModel(GL11.GL_SMOOTH); - bindTexture(ResourceManager.flechette_tex); - ResourceManager.projectiles.renderPart("Flechette"); - GL11.glShadeModel(GL11.GL_FLAT); - } - private void renderDart(int style, int eID) { float red = 1F; @@ -239,15 +172,6 @@ public class RenderBullet extends Render { case BulletConfiguration.BOLT_NIGHTMARE: red = 1F; green = 1F; blue = 0F; break; case BulletConfiguration.BOLT_LACUNAE: red = 0.25F; green = 0F; blue = 0.75F; break; case BulletConfiguration.BOLT_WORM: red = 0F; green = 1F; blue = 0F; break; - case BulletConfiguration.BOLT_GLASS_CYAN: red = 0F; green = 1F; blue = 1F; break; - case BulletConfiguration.BOLT_GLASS_BLUE: red = 0F; green = 0F; blue = 1F; break; - - case BulletConfiguration.BOLT_ZOMG: - Random rand = new Random(eID * eID); - red = rand.nextInt(2) * 0.6F; - green = rand.nextInt(2) * 0.6F; - blue = rand.nextInt(2) * 0.6F; - break; } GL11.glPushMatrix(); @@ -397,134 +321,8 @@ public class RenderBullet extends Render { GL11.glPopMatrix(); } - private void renderTau(Entity bullet, int trail, float interp) { - - Tessellator tessellator = Tessellator.instance; - - float scale = 0.125F; - - double pX = bullet.prevPosX + (bullet.posX - bullet.prevPosX) * interp; - double pY = bullet.prevPosY + (bullet.posY - bullet.prevPosY) * interp; - double pZ = bullet.prevPosZ + (bullet.posZ - bullet.prevPosZ) * interp; - - IBulletBase iface = (IBulletBase) bullet; - - if(iface.prevY() == 0) { - iface.prevX(pX); - iface.prevY(pY); - iface.prevZ(pZ); - } - - double deltaX = iface.prevX() - pX; - double deltaY = iface.prevY() - pY; - double deltaZ = iface.prevZ() - pZ; - - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - double dX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double)interp; - double dY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double)interp; - double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp; - - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glTranslated(pX - dX, pY - dY, pZ - dZ); - - float r = 1F; - float g = 0.5F; - float b = 0F; - - if(trail == 1) { - r = 1; - g = 1; - b = 1; - } - - for(Pair pair : iface.nodes()) { - Vec3 pos = pair.getKey(); - - double mult = 1D; - pos.xCoord += deltaX * mult; - pos.yCoord += deltaY * mult; - pos.zCoord += deltaZ * mult; - } - - tessellator.startDrawingQuads(); - tessellator.setNormal(0F, 1F, 0F); - - for(int i = 0; i < iface.nodes().size() - 1; i++) { - final Pair node = iface.nodes().get(i), past = iface.nodes().get(i + 1); - final Vec3 nodeLoc = node.getKey(), pastLoc = past.getKey(); - float nodeAlpha = node.getValue().floatValue(); - float pastAlpha = past.getValue().floatValue(); - - double timeAlpha = Math.max(2D - bullet.ticksExisted * 0.2, 0D); - nodeAlpha *= timeAlpha; - pastAlpha *= timeAlpha; - float outerAlpha = 0.25F; - - if(nodeAlpha == 0 && pastAlpha == 0) { - break; - } - - tessellator.setNormal(0F, 1F, 0F); - tessellator.setColorRGBA_F(r, g, b, nodeAlpha); - tessellator.addVertex(nodeLoc.xCoord, nodeLoc.yCoord, nodeLoc.zCoord); - tessellator.setColorRGBA_F(r, g, b, nodeAlpha * outerAlpha); - tessellator.addVertex(nodeLoc.xCoord, nodeLoc.yCoord + scale, nodeLoc.zCoord); - tessellator.setColorRGBA_F(r, g, b, pastAlpha * outerAlpha); - tessellator.addVertex(pastLoc.xCoord, pastLoc.yCoord + scale, pastLoc.zCoord); - tessellator.setColorRGBA_F(r, g, b, pastAlpha); - tessellator.addVertex(pastLoc.xCoord, pastLoc.yCoord, pastLoc.zCoord); - - tessellator.setColorRGBA_F(r, g, b, nodeAlpha); - tessellator.addVertex(nodeLoc.xCoord, nodeLoc.yCoord, nodeLoc.zCoord); - tessellator.setColorRGBA_F(r, g, b, nodeAlpha * outerAlpha); - tessellator.addVertex(nodeLoc.xCoord, nodeLoc.yCoord - scale, nodeLoc.zCoord); - tessellator.setColorRGBA_F(r, g, b, pastAlpha * outerAlpha); - tessellator.addVertex(pastLoc.xCoord, pastLoc.yCoord - scale, pastLoc.zCoord); - tessellator.setColorRGBA_F(r, g, b, pastAlpha); - tessellator.addVertex(pastLoc.xCoord, pastLoc.yCoord, pastLoc.zCoord); - } - - GL11.glColor3f(1F, 1F, 1F); - GL11.glDepthMask(true); - GL11.glAlphaFunc(GL11.GL_GREATER, 0F); - GL11.glEnable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glShadeModel(GL11.GL_SMOOTH); - tessellator.draw(); - GL11.glShadeModel(GL11.GL_FLAT); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_BLEND); - GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.1F); - - iface.prevX(pX); - iface.prevY(pY); - iface.prevZ(pZ); - } - - private void renderLeadburster(Entity bullet, float interp) { - EntityBulletBaseNT bulletnt = (EntityBulletBaseNT) bullet; - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glRotated(90, 0, 0, -1); - double scale = 0.05; - GL11.glScaled(scale, scale, scale); - bindTexture(ResourceManager.leadburster_tex); - ResourceManager.leadburster.renderPart("Based"); - if(bulletnt.getStuckIn() != -1) { - GL11.glRotated((bullet.ticksExisted + interp) * -18, 0, 1, 0); - } - ResourceManager.leadburster.renderPart("Based.001"); - ResourceManager.leadburster.renderPart("Backlight"); - GL11.glPopMatrix(); - } - @Override protected ResourceLocation getEntityTexture(Entity p_110775_1_) { return new ResourceLocation(RefStrings.MODID + ":textures/models/bullet.png"); } - } diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java index 140b396de..d59a9d658 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java @@ -1,6 +1,6 @@ package com.hbm.tileentity.network.pneumatic; -import com.hbm.inventory.container.ContainerPneumoStorageAccess; +import com.hbm.inventory.container.ContainerPneumoStorageAccessMK2; import com.hbm.inventory.gui.GUIPneumoStorageAccess; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; @@ -75,6 +75,6 @@ public class TileEntityPneumoStorageAccess extends TileEntityLoadedBase implemen return dir == selfdir.getOpposite(); } - @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageAccess(player.inventory, this); } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageAccessMK2(player.inventory, this); } @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageAccess(player.inventory, this); } } From a186c75111de57e33113d406c2f872ee511e2300 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Thu, 18 Jun 2026 22:59:48 +0200 Subject: [PATCH 023/107] this bitch actually works --- .../ContainerPneumoStorageAccessMK2.java | 240 +++++++++++++----- .../inventory/gui/GUIPneumoStorageAccess.java | 79 ++++-- src/main/java/com/hbm/main/ClientProxy.java | 3 + src/main/java/com/hbm/main/ServerProxy.java | 2 + .../toclient/ContainerNBTCommsPacket.java | 2 +- .../gui/storage/gui_pneumatic_access.png | Bin 1942 -> 2626 bytes 6 files changed, 239 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java index 293be4f8a..14407b500 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java @@ -6,13 +6,18 @@ import java.util.Comparator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map.Entry; import com.hbm.inventory.SlotNonRetarded; +import com.hbm.inventory.container.ContainerPneumoStorageAccess.InventoryPneumoStorageAccess; +import com.hbm.inventory.container.ContainerPneumoStorageAccess.SlotPneumo; +import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.ContainerNBTCommsPacket; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; import com.hbm.util.EnumUtil; +import com.hbm.util.InventoryUtil; import api.hbm.ntl.StackCache; import api.hbm.ntl.StackCache.CacheSlot; @@ -22,7 +27,6 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -33,12 +37,28 @@ public class ContainerPneumoStorageAccessMK2 extends Container implements ICusto protected TileEntityPneumoStorageAccess access; protected InventoryPneumoStorageAccess inventory; + protected EntityPlayer player; + protected String searchString = ""; + + public static boolean detailedSearch = false; /** On the server, this is used to find changes in the system and then send them to the client. On the client, this is just to keep track of all items. */ protected LinkedHashMap cachedEntries = new LinkedHashMap(); /** Server to client queue, contains NBT tags that represents deltas yet to be sent to the client */ public LinkedList s2cQueue = new LinkedList(); + public void setSorter(Comparator sorter) { + this.listingStart = 0; + this.sorter = sorter; + this.rebuildClientIndex(); + } + + public void setSearchString(String search) { + this.listingStart = 0; + this.searchString = search.toLowerCase(Locale.US); + this.rebuildClientIndex(); + } + /** Used to temporarily store the previous CacheSlot contents to calculate deltas with (i.e. detect changes) */ public static class CacheSlotDummy { @@ -64,11 +84,12 @@ public class ContainerPneumoStorageAccessMK2 extends Container implements ICusto public static final int GRID_SIZE = 6 * 8; public static final int DELTAS_PER_MSG = 6 * 8; - + public int listingStart = 0; + public int listingSize = 0; public int getStackCount() { - return cachedEntries.size(); + return listingSize; } /** Serverside, creates a new delta for a new item stack */ @@ -137,38 +158,79 @@ public class ContainerPneumoStorageAccessMK2 extends Container implements ICusto this.pushNewItem(existingCache.displayStack, existingCache.stacksize); } } + + if(player instanceof EntityPlayerMP) processDeltasAndSync((EntityPlayerMP) this.player); } public ContainerPneumoStorageAccessMK2(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { this.access = access; this.inventory = new InventoryPneumoStorageAccess(access); + this.player = invPlayer.player; + + int hOffset = 34; for(int i = 0; i < 6; i++) for(int j = 0; j < 8; j++) { - this.addSlotToContainer(new SlotPneumo(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); + this.addSlotToContainer(new SlotPneumo(inventory, j + i * 8, 8 + j * 18 + hOffset, 17 + i * 18)); } for(int i = 0; i < 3; i++) for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new SlotNonRetarded(invPlayer, j + i * 9 + 9, 8 + j * 18, 169 + i * 18)); + this.addSlotToContainer(new SlotNonRetarded(invPlayer, j + i * 9 + 9, 8 + j * 18 + hOffset, 169 + i * 18)); } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new SlotNonRetarded(invPlayer, i, 8 + i * 18, 227)); + this.addSlotToContainer(new SlotNonRetarded(invPlayer, i, 8 + i * 18 + hOffset, 227)); } - - this.detectAndSendChanges(); } @Override public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { if(mode == 6) return null; + + if(index == ContainerPneumoStorageAccess.SLOT_CLICK_ID_REFRESH) { + this.listingStart = mode; + this.detectAndSendChanges(); + return null; + } + boolean client = player.worldObj.isRemote; boolean leftClick = button == 0 && mode == 0; boolean rightClick = button == 1 && mode == 0; boolean shiftClick = button == 0 && mode == 1; if(index >= 0 && index < GRID_SIZE) { - - // TODO: in this new version, the server has no fucking idea what slot we are even clicking on + if(!client) return null; + SlotPneumo slot = (SlotPneumo) this.getSlot(index); + long hash = StackCache.getStackIdentity(slot.getStack()); + ItemStack held = player.inventory.getItemStack(); + long heldHash = StackCache.getStackIdentity(held); + if(leftClick) { + if(held != null && hash != heldHash) held = null; + else if(held != null && hash == heldHash) { + held.stackSize += slot.amount; + held.stackSize = Math.min(held.stackSize, held.getMaxStackSize()); + } else if(held == null && slot.getHasStack()) { + held = slot.getStack().copy(); + held.stackSize = (int) Math.min(slot.amount, held.getMaxStackSize()); + } + this.player.inventory.setItemStack(held); + sendClickToServer(ClickType.LEFT_CLICK, hash); + return null; + } + if(rightClick) { + if(held != null && hash != heldHash) held.stackSize--; + else if(held != null && hash == heldHash) { + held.stackSize += 1; + held.stackSize = Math.min(held.stackSize, held.getMaxStackSize()); + } else if(held == null && slot.getHasStack()) { + held = slot.getStack().copy(); + held.stackSize = 1; + } + if(held.stackSize <= 0) held = null; + this.player.inventory.setItemStack(held); + sendClickToServer(ClickType.RIGHT_CLICK, hash); + return null; + } + if(shiftClick) { sendClickToServer(ClickType.SHIFT_CLICK, hash); return null; } // shift clicking an item from the player inv to the storage } else if(index >= GRID_SIZE && index < this.inventorySlots.size()) { @@ -184,12 +246,21 @@ public class ContainerPneumoStorageAccessMK2 extends Container implements ICusto if(remainder <= 0) slot.putStack(null); slot.onSlotChanged(); detectAndSendChanges(); + return null; // technically not needed but we don't have to run 500,000 lines of code that ends up doing nothing } } return super.slotClick(index, button, mode, player); } + public void sendClickToServer(ClickType type, long hash) { + + NBTTagCompound data = new NBTTagCompound(); + data.setByte("type", (byte) type.ordinal()); + data.setLong("hash", hash); + PacketDispatcher.wrapper.sendToServer(new ContainerNBTCommsPacket(this.windowId, data)); + } + public long[] previousStackSizes = new long[GRID_SIZE]; @Override @@ -224,11 +295,18 @@ public class ContainerPneumoStorageAccessMK2 extends Container implements ICusto return access.getDistanceFrom(player.posX, player.posY, player.posZ) <= 15 * 15; } + /** For S2C to send deltas updating the available items */ public static enum DeltaType { NEW_TYPE, COUNT_CHANGE; } + public static enum ClickType { + LEFT_CLICK, + RIGHT_CLICK, + SHIFT_CLICK + } + @Override public void acceptData(Side side, int windowId, NBTTagCompound data) { if(windowId != this.windowId) return; @@ -253,29 +331,107 @@ public class ContainerPneumoStorageAccessMK2 extends Container implements ICusto if(dummy != null) dummy.stacksize = line.getLong("amount"); } } + + rebuildClientIndex(); + + } else { + if(this.access.cache == null || this.access.cache.hasExpired) return; + ClickType type = EnumUtil.grabEnumSafely(ClickType.class, data.getByte("type")); + long hash = data.getLong("hash"); + CacheSlotDummy cache = this.cachedEntries.get(hash); + ItemStack held = this.player.inventory.getItemStack(); + long heldHash = StackCache.getStackIdentity(held); + + // left click + if(type == ClickType.LEFT_CLICK || type == ClickType.RIGHT_CLICK) { + + // if we drop an item onto a different stack, or no stack at all, deposit + if(hash != heldHash && held != null) { + int toDeposit = type == ClickType.LEFT_CLICK ? held.stackSize : 1; + held.stackSize -= toDeposit; + int leftover = (int) this.access.cache.addItemsAndReturnQuantity(held, toDeposit); + held.stackSize += leftover; + this.player.inventory.setItemStack(null); + if(held.stackSize > 0) InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, held); + detectAndSendChanges(); + return; + } + + // if our hand is empty or we have the same type, withdraw + if(cache != null && (held == null || hash == heldHash)) { + ItemStack stack = cache.displayStack.copy(); + int alreadyHeld = held == null ? 0 : held.stackSize; + int capacity = stack.getMaxStackSize() - alreadyHeld; + if(type == ClickType.RIGHT_CLICK && capacity > 1) capacity = 1; + int toGrab = (int) Math.min(capacity, cache.stacksize); + int grabbed = (int) this.access.cache.consumeItemsAndReturnQuantity(stack, toGrab); + stack.stackSize = alreadyHeld + grabbed; + this.player.inventory.setItemStack(stack); + detectAndSendChanges(); + return; + } + } + + if(type == ClickType.SHIFT_CLICK && cache != null) { + ItemStack stack = cache.displayStack.copy(); + int originalStacksize = (int) Math.min(stack.getMaxStackSize(), cache.stacksize); + stack.stackSize = originalStacksize; + ItemStack ret = InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, stack); + int remainder = ret == null ? 0 : ret.stackSize; + int itemsUsed = originalStacksize - remainder; + this.access.cache.consumeItemsAndReturnQuantity(stack, itemsUsed); + detectAndSendChanges(); + return; + } } } - public int startingIndex; - public void rebuildClientIndex() { List cacheSlots = new ArrayList(this.cachedEntries.size()); cacheSlots.addAll(this.cachedEntries.values()); cacheSlots.removeIf(x -> { return x.stacksize <= 0; }); - Collections.sort(cacheSlots, SORT_BY_STACK_SIZE); + + if(this.searchString != null && !this.searchString.isEmpty()) { + if(!detailedSearch) { + cacheSlots.removeIf(x -> { + return !x.displayStack.getDisplayName().toLowerCase(Locale.US).contains(searchString); + }); + } else { + cacheSlots.removeIf(x -> { + boolean contains = x.displayStack.getDisplayName().toLowerCase(Locale.US).contains(searchString); + List toolTip = new ArrayList(); + if(!contains) { + x.displayStack.getItem().addInformation(x.displayStack, MainRegistry.proxy.me(), toolTip, MainRegistry.proxy.advancedTooltips()); + for(String string : toolTip) { + if(string.toLowerCase(Locale.US).contains(searchString)) { + contains = true; + break; + } + } + } + return !contains; + }); + } + } + + listingSize = cacheSlots.size(); + Collections.sort(cacheSlots, this.sorter); int size = cacheSlots.size(); - int offset = startingIndex * 8; + int offset = listingStart * 8; for(int i = 0; i < inventory.slots.length; i++) { int grabIndex = offset + i; if(grabIndex < size) { CacheSlotDummy cacheSlot = cacheSlots.get(grabIndex); + SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(i); if(cacheSlot.displayStack != null) { - inventory.slots[i] = cacheSlot.displayStack.copy(); + slot.putStack(cacheSlot.displayStack.copy()); + slot.amount = cacheSlot.stacksize; } else { - inventory.slots[i] = null; + slot.putStack(null); + slot.amount = 0; } } else { inventory.slots[i] = null; @@ -326,59 +482,11 @@ public class ContainerPneumoStorageAccessMK2 extends Container implements ICusto return SORT_BY_ID.compare(o1, o2); } }; + + protected static Comparator sorter = SORT_BY_STACK_SIZE; @Override public ItemStack transferStackInSlot(EntityPlayer player, int index) { return null; } - - public static class SlotPneumo extends SlotNonRetarded { - - public long amount; - - public SlotPneumo(IInventory inventory, int id, int x, int y) { - super(inventory, id, x, y); - } - - @Override - public boolean canTakeStack(EntityPlayer player) { - return true; - } - } - - /** This inventory instance only exists to prepare the contents of a StackCache in such a way that we can use it in a container. */ - public static class InventoryPneumoStorageAccess implements IInventory { - - public StackCache cache; - public ItemStack[] slots; - - public InventoryPneumoStorageAccess(TileEntityPneumoStorageAccess access) { - this.slots = new ItemStack[getSizeInventory()]; - this.cache = access.cache; - } - - @Override public int getSizeInventory() { return GRID_SIZE; } - @Override public ItemStack getStackInSlot(int slot) { return slots[slot]; } - @Override public int getInventoryStackLimit() { return 1; } - @Override public ItemStack decrStackSize(int slot, int amount) { return null; } - @Override public void setInventorySlotContents(int slot, ItemStack stack) { this.slots[slot] = stack; } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - if(slots[slot] != null) { - ItemStack stack = slots[slot]; - slots[slot] = null; - return stack; - } - return null; - } - - @Override public String getInventoryName() { return "null"; } - @Override public boolean hasCustomInventoryName() { return false; } - @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return false; } - @Override public void markDirty() { } - @Override public boolean isUseableByPlayer(EntityPlayer player) { return true; } - @Override public void openInventory() { } - @Override public void closeInventory() { } - } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index 5780ac391..e3bc9e05c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -8,11 +8,10 @@ import org.lwjgl.opengl.GL11; import static com.hbm.inventory.gui.element.GUIElements.*; import com.hbm.inventory.container.ContainerPneumoStorageAccessMK2; -import com.hbm.inventory.container.ContainerPneumoStorageAccessMK2.SlotPneumo; +import com.hbm.inventory.container.ContainerPneumoStorageAccess; +import com.hbm.inventory.container.ContainerPneumoStorageAccess.SlotPneumo; import com.hbm.inventory.gui.element.GUIElements; import com.hbm.lib.RefStrings; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.ContainerNBTCommsPacket; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; import com.hbm.util.BobMathUtil; @@ -23,7 +22,6 @@ import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; @@ -32,18 +30,24 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_pneumatic_access.png"); protected TileEntityPneumoStorageAccess access; + protected ContainerPneumoStorageAccessMK2 container; protected GuiTextField search; protected int scrollIndex = 0; - protected int scrollBounds = 0; + protected int scrollBounds = 1; protected boolean wasClicking = false; protected boolean draggingScroll = false; + protected boolean wasMouseinGUI = false; + + protected static int sorting = 0; + protected static boolean startFocussed = false; public GUIPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { super(new ContainerPneumoStorageAccessMK2(invPlayer, access)); + this.container = (ContainerPneumoStorageAccessMK2) this.inventorySlots; this.access = access; - this.xSize = 176; + this.xSize = 176 + 34; this.ySize = 251; } @@ -52,18 +56,21 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { super.initGui(); Keyboard.enableRepeatEvents(true); - search = new GuiTextField(this.fontRendererObj, guiLeft + 43, guiTop + 127, 90, 12); + search = new GuiTextField(this.fontRendererObj, guiLeft + 45 + 34, guiTop + 127, 86, 12); search.setTextColor(0xffffff); search.setDisabledTextColour(0xa0a0a0); search.setEnableBackgroundDrawing(false); search.setMaxStringLength(50); search.setText(""); + + if(this.startFocussed) search.setFocused(true); } @Override public void drawScreen(int x, int y, float interp) { - ContainerPneumoStorageAccessMK2 container = (ContainerPneumoStorageAccessMK2) this.inventorySlots; + this.wasMouseinGUI = this.checkClick(x, y, 0, 0, xSize, ySize); + this.scrollBounds = (int) Math.ceil(container.getStackCount() / 8D - 6D); if(this.scrollBounds < 1) this.scrollBounds = 1; if(this.scrollIndex < 0) this.setScroll(0); @@ -72,7 +79,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { boolean isClicking = Mouse.isButtonDown(0); if(!isClicking) this.draggingScroll = false; - if(!wasClicking && isClicking && guiLeft + 153 <= x && guiLeft + 153 + 14 > x && guiTop + 16 < y && guiTop + 16 + 108 >= y) { + if(!wasClicking && isClicking && guiLeft + 153 + 34 <= x && guiLeft + 153 + 34 + 14 > x && guiTop + 16 < y && guiTop + 16 + 108 >= y) { draggingScroll = true; } @@ -87,34 +94,54 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { this.wasClicking = isClicking; super.drawScreen(x, y, interp); + + //TODO localization + this.drawCustomInfoStat(x, y, guiLeft + 7, guiTop + 7, 18, 18, x, y, "Sorting: " + EnumChatFormatting.YELLOW + "Amount"); + this.drawCustomInfoStat(x, y, guiLeft + 7, guiTop + 25, 18, 18, x, y, "Sorting: " + EnumChatFormatting.YELLOW + "Item ID"); + this.drawCustomInfoStat(x, y, guiLeft + 7, guiTop + 43, 18, 18, x, y, "Sorting: " + EnumChatFormatting.YELLOW + "Name"); + this.drawCustomInfoStat(x, y, guiLeft + 7, guiTop + 61, 18, 18, x, y, "Sorting: " + EnumChatFormatting.YELLOW + "Internal Name"); + + this.drawCustomInfoStat(x, y, guiLeft + 7, guiTop + 79, 18, 18, x, y, "Focus search by default: " + (this.startFocussed ? EnumChatFormatting.GREEN + "ON" : EnumChatFormatting.RED + "OFF")); + this.drawCustomInfoStat(x, y, guiLeft + 7, guiTop + 97, 18, 18, x, y, "Inlude tooltips in search: " + (this.container.detailedSearch ? EnumChatFormatting.GREEN + "ON" : EnumChatFormatting.RED + "OFF")); } @Override protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); + + if(this.checkClick(x, y, 7, 7, 18, 18)) { this.click(); this.sorting = 0; this.scrollIndex = 0; this.container.setSorter(this.container.SORT_BY_STACK_SIZE); } + if(this.checkClick(x, y, 7, 25, 18, 18)) { this.click(); this.sorting = 1; this.scrollIndex = 0; this.container.setSorter(this.container.SORT_BY_ID); } + if(this.checkClick(x, y, 7, 43, 18, 18)) { this.click(); this.sorting = 2; this.scrollIndex = 0; this.container.setSorter(this.container.SORT_BY_LOCALIZED); } + if(this.checkClick(x, y, 7, 61, 18, 18)) { this.click(); this.sorting = 3; this.scrollIndex = 0; this.container.setSorter(this.container.SORT_BY_INTERNAL); } + + if(this.checkClick(x, y, 7, 79, 18, 18)) { this.click(); this.startFocussed = !this.startFocussed; } + if(this.checkClick(x, y, 7, 97, 18, 18)) { this.click(); this.container.detailedSearch = !this.container.detailedSearch; container.setSearchString(search.getText()); } + search.mouseClicked(x, y, i); } @Override public void handleMouseInput() { - super.handleMouseInput(); int scrollDir = Mouse.getEventDWheel(); - if(scrollDir != 0) { + if(scrollDir != 0 && wasMouseinGUI) { if(scrollDir > 0) scrollDir = 1; if(scrollDir < 0) scrollDir = -1; this.setScroll(this.getScroll() - scrollDir); + return; } + + super.handleMouseInput(); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = "container.pneumoStorageAccess"; - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + this.fontRendererObj.drawString(name, 34 + 176 / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 34 + 8, this.ySize - 96 + 2, 4210752); GL11.glPushMatrix(); RenderHelper.disableStandardItemLighting(); @@ -142,11 +169,20 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + drawTexturedModalRect(guiLeft + 34, guiTop, 0, 0, 176, ySize); - drawTexturedModalRect(guiLeft + getScrollBarXPos(), guiTop + getScrollBarYPos(), draggingScroll ? 188 : 176, 0, 12, 15); + drawTexturedModalRect(guiLeft, guiTop, 176, 15, 32, 122); + + drawTexturedModalRect(guiLeft + 7, guiTop + 7 + this.sorting * 18, 208, 0, 18, 18); + if(this.startFocussed) drawTexturedModalRect(guiLeft + 7, guiTop + 79, 208, 18, 18, 18); + if(this.container.detailedSearch) drawTexturedModalRect(guiLeft + 7, guiTop + 97, 208, 18, 18, 18); + drawTexturedModalRect(guiLeft + 34 + getScrollBarXPos(), guiTop + getScrollBarYPos(), draggingScroll ? 188 : 176, 0, 12, 15); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2, 0); search.drawTextBox(); + GL11.glPopMatrix(); } public int getScrollBarXPos() { @@ -154,9 +190,13 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { } public int getScrollBarYPos() { - ContainerPneumoStorageAccessMK2 container = (ContainerPneumoStorageAccessMK2) this.inventorySlots; int scrollArea = 106 - 15; // bar height minus the scroll knob's height double scrollProgress = (double) container.listingStart / (double) scrollBounds; + if(scrollProgress > 1) { + scrollProgress = 1; + this.setScroll(scrollBounds); + refreshContainer(); + } int scrollYPos = 17 + (int) (scrollProgress * scrollArea); return scrollYPos; } @@ -172,7 +212,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { } public void refreshContainer() { - //this.mc.playerController.windowClick(this.inventorySlots.windowId, ContainerPneumoStorageAccessMK2.SLOT_CLICK_ID_REFRESH, 0, this.scrollIndex, this.mc.thePlayer); + this.mc.playerController.windowClick(this.inventorySlots.windowId, ContainerPneumoStorageAccess.SLOT_CLICK_ID_REFRESH, 0, this.scrollIndex, this.mc.thePlayer); } @Override @@ -196,9 +236,8 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { protected void keyTyped(char c, int b) { if(search.textboxKeyTyped(c, b)) { - NBTTagCompound data = new NBTTagCompound(); - data.setString("search", search.getText()); - PacketDispatcher.wrapper.sendToServer(new ContainerNBTCommsPacket(this.inventorySlots.windowId, data)); + this.scrollIndex = 0; + container.setSearchString(search.getText()); return; } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 8309e41c6..a8a5f5251 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -189,6 +189,9 @@ public class ClientProxy extends ServerProxy { GunFactoryClient.init(); } + @Override + public boolean advancedTooltips() { return Minecraft.getMinecraft().gameSettings.advancedItemTooltips; } + @Override public void registerTileEntitySpecialRenderer() { //test crap diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index bd7ca8782..da3b0f27c 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -72,6 +72,8 @@ public class ServerProxy { public EntityPlayer me() { return null; } + + public boolean advancedTooltips() { return false; } public boolean isVanished(Entity e) { return false; diff --git a/src/main/java/com/hbm/packet/toclient/ContainerNBTCommsPacket.java b/src/main/java/com/hbm/packet/toclient/ContainerNBTCommsPacket.java index c53b8ac8f..2b4bbed2a 100644 --- a/src/main/java/com/hbm/packet/toclient/ContainerNBTCommsPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ContainerNBTCommsPacket.java @@ -39,7 +39,7 @@ public class ContainerNBTCommsPacket implements IMessage { @Override public IMessage onMessage(ContainerNBTCommsPacket m, MessageContext ctx) { - + EntityPlayer player = ctx.side.isClient() ? MainRegistry.proxy.me() : ctx.getServerHandler().playerEntity; if(player.openContainer instanceof ICustomPayloadReceiver) { ICustomPayloadReceiver cus = (ICustomPayloadReceiver) player.openContainer; diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_access.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_access.png index f8c4929a4a1fcc6b67604677930d4ecc971f40dc..5538e63a307025f50815269384b346632159066e 100644 GIT binary patch literal 2626 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 S-y0!+;DFDA)|IV^O8XrRU?(vE From 2c68d2ab9a7b91b5ed093c619345ff1fe1e26651 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 19 Jun 2026 13:28:39 +0200 Subject: [PATCH 024/107] i think these are called hoovsies --- changelog | 6 + src/main/java/com/hbm/blocks/ModBlocks.java | 21 +- .../com/hbm/blocks/generic/BlockCrate.java | 2 +- .../hbm/blocks/machine/MachineMiniRTG.java | 36 -- .../com/hbm/blocks/machine/MachineRTG.java | 6 +- .../pneumatic/PneumoStorageClutter.java | 140 ++++- .../java/com/hbm/config/VersatileConfig.java | 2 +- .../item/EntityMovingConveyorObject.java | 19 + .../com/hbm/entity/item/EntityMovingItem.java | 1 + .../java/com/hbm/entity/mob/EntityFBI.java | 4 +- .../com/hbm/handler/nei/RTGRecipeHandler.java | 2 +- .../ContainerPneumoStorageAccess.java | 577 +++++++++++------- .../ContainerPneumoStorageAccessMK2.java | 492 --------------- .../inventory/gui/GUIPneumoStorageAccess.java | 7 +- .../recipes/AssemblyMachineRecipes.java | 2 +- .../com/hbm/items/machine/ItemBatterySC.java | 5 + .../com/hbm/items/special/ItemStarterKit.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 1 - src/main/java/com/hbm/main/MainRegistry.java | 2 + .../java/com/hbm/main/ResourceManager.java | 2 - .../com/hbm/render/tileentity/RenderRTG.java | 74 ++- .../java/com/hbm/tileentity/TileMappings.java | 1 - .../machine/TileEntityMachineMiniRTG.java | 60 -- .../machine/TileEntityReactorZirnox.java | 3 +- .../TileEntityPneumoStorageAccess.java | 4 +- src/main/resources/assets/hbm/lang/en_US.lang | 8 +- 26 files changed, 567 insertions(+), 912 deletions(-) delete mode 100644 src/main/java/com/hbm/blocks/machine/MachineMiniRTG.java delete mode 100644 src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java delete mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java diff --git a/changelog b/changelog index cd270ba11..8ffdbccb2 100644 --- a/changelog +++ b/changelog @@ -14,6 +14,12 @@ * The maximum character limit on RoR channels is now the same for all RoR devices, being 15 * This does not include special RoR interactive devices that don't use GUI text fields like the RoR terminal or the AUTOCAL units * Pile output rods like the bred uranium and the plutonium rods can no longer be dismantled using the anvil, the PUREX is now mandatory +* If too many conveyor item entities intersect with one another, they explode + * The conveyor belt the items were on is broken, preventing further item buildup +* Items that leave the covneyor belt, usually by trying to enter a full inserter, now have a shortened lifespan of 1 minute instead of 5 +* Base steam production per consumed heat has been increased by 50% on the ZIRNOX +* Both radioisotope cell variants have been finally removed after being deprecated for a while +* Selfchargers now have a tooltip explaining the hazards of using them in a battery socket ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f038a84ed..47c7cdeb7 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -914,9 +914,7 @@ public class ModBlocks { public static Block teleanchor; public static Block field_disturber; - public static Block machine_rtg_grey; - @Deprecated public static Block machine_minirtg; - @Deprecated public static Block machine_powerrtg; + public static Block machine_rtg; public static Block machine_radiolysis; public static Block machine_hephaestus; @@ -1840,9 +1838,7 @@ public class ModBlocks { teleanchor = new MachineTeleanchor().setBlockName("teleanchor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); field_disturber = new MachineFieldDisturber().setBlockName("field_disturber").setHardness(5.0F).setResistance(200.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":field_disturber"); - machine_rtg_grey = new MachineRTG(Material.iron).setBlockName("machine_rtg_grey").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rtg"); - machine_minirtg = new MachineMiniRTG(Material.iron).setBlockName("machine_minirtg").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":rtg_cell"); - machine_powerrtg = new MachineMiniRTG(Material.iron).setBlockName("machine_powerrtg").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":rtg_polonium"); + machine_rtg = new MachineRTG(Material.iron).setBlockName("machine_rtg_grey").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rtg"); machine_radiolysis = new MachineRadiolysis(Material.iron).setBlockName("machine_radiolysis").setHardness(10.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel_machine"); machine_hephaestus = new MachineHephaestus(Material.iron).setBlockName("machine_hephaestus").setHardness(10.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel_machine"); @@ -1910,11 +1906,11 @@ public class ModBlocks { drone_crate_provider = new DroneDock().setBlockName("drone_crate_provider").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_provider"); drone_crate_requester = new DroneDock().setBlockName("drone_crate_requester").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_requester"); - pneumatic_tube = new PneumoTube().setBlockName("pneumatic_tube").setStepSound(ModSoundTypes.pipe).setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_tube"); + pneumatic_tube = new PneumoTube().setBlockName("pneumatic_tube").setStepSound(ModSoundTypes.pipe).setHardness(2F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_tube"); pneumatic_tube_paintable = new PneumoTubePaintableBlock().setBlockName("pneumatic_tube_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - pneumatic_storage_access = new PneumoStorageAccess().setBlockName("pneumatic_storage_access").setStepSound(ModSoundTypes.pipe).setHardness(0.1F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_access"); - pneumatic_storage_clutter = new PneumoStorageClutter().setBlockName("pneumatic_storage_clutter").setStepSound(ModSoundTypes.pipe).setHardness(0.1F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_clutter"); - pneumatic_storage_mono = new PneumoStorageMono().setBlockName("pneumatic_storage_mono").setStepSound(ModSoundTypes.pipe).setHardness(0.1F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_mono"); + pneumatic_storage_access = new PneumoStorageAccess().setBlockName("pneumatic_storage_access").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_access"); + pneumatic_storage_clutter = new PneumoStorageClutter().setBlockName("pneumatic_storage_clutter").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_clutter"); + pneumatic_storage_mono = new PneumoStorageMono().setBlockName("pneumatic_storage_mono").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_mono"); chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); @@ -2348,7 +2344,6 @@ public class ModBlocks { logic_block = new LogicBlock().setBlockName("logic_block").setBlockTextureName(RefStrings.MODID + ":logic_block"); logic_block_invis = new LogicBlockInvis().setBlockName("logic_block_invis").setBlockTextureName(RefStrings.MODID + ":logic_block"); - } private static void registerBlock() { @@ -3056,9 +3051,7 @@ public class ModBlocks { GameRegistry.registerBlock(machine_radgen, machine_radgen.getUnlocalizedName()); GameRegistry.registerBlock(machine_cyclotron, machine_cyclotron.getUnlocalizedName()); GameRegistry.registerBlock(machine_exposure_chamber, machine_exposure_chamber.getUnlocalizedName()); - GameRegistry.registerBlock(machine_rtg_grey, machine_rtg_grey.getUnlocalizedName()); - GameRegistry.registerBlock(machine_minirtg, machine_minirtg.getUnlocalizedName()); - GameRegistry.registerBlock(machine_powerrtg, machine_powerrtg.getUnlocalizedName()); + GameRegistry.registerBlock(machine_rtg, machine_rtg.getUnlocalizedName()); GameRegistry.registerBlock(machine_radiolysis, machine_radiolysis.getUnlocalizedName()); GameRegistry.registerBlock(machine_hephaestus, machine_hephaestus.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockCrate.java b/src/main/java/com/hbm/blocks/generic/BlockCrate.java index b016e53c7..487165f10 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockCrate.java +++ b/src/main/java/com/hbm/blocks/generic/BlockCrate.java @@ -104,7 +104,7 @@ public class BlockCrate extends BlockFalling { BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_reactor_breeding), 6); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_wood_burner), 10); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_diesel), 8); - BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_rtg_grey), 4); + BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_rtg), 4); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.red_pylon), 9); BlockCrate.addToListWithWeight(metalList, new ItemStack(ModItems.battery_pack, 1, EnumBatteryPack.BATTERY_LEAD.ordinal()), 10); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 8); diff --git a/src/main/java/com/hbm/blocks/machine/MachineMiniRTG.java b/src/main/java/com/hbm/blocks/machine/MachineMiniRTG.java deleted file mode 100644 index 68bc2b9a6..000000000 --- a/src/main/java/com/hbm/blocks/machine/MachineMiniRTG.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.hbm.blocks.machine; - -import com.hbm.tileentity.machine.TileEntityMachineMiniRTG; - -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class MachineMiniRTG extends BlockContainer { - - public MachineMiniRTG(Material mat) { - super(mat); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachineMiniRTG(); - } - - @Override - public int getRenderType() { - return MachineRTG.renderID; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - -} diff --git a/src/main/java/com/hbm/blocks/machine/MachineRTG.java b/src/main/java/com/hbm/blocks/machine/MachineRTG.java index 2b3d14099..cda3389dc 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineRTG.java +++ b/src/main/java/com/hbm/blocks/machine/MachineRTG.java @@ -47,7 +47,7 @@ public class MachineRTG extends BlockContainer { @Override public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - if(this == ModBlocks.machine_rtg_grey) + if(this == ModBlocks.machine_rtg) return new TileEntityMachineRTG(); return null; @@ -60,7 +60,7 @@ public class MachineRTG extends BlockContainer { return true; } else if(!player.isSneaking()) { - if(this == ModBlocks.machine_rtg_grey) { + if(this == ModBlocks.machine_rtg) { TileEntityMachineRTG entity = (TileEntityMachineRTG) world.getTileEntity(x, y, z); if(entity != null) { @@ -78,7 +78,7 @@ public class MachineRTG extends BlockContainer { { if (!keepInventory) { - if (this == ModBlocks.machine_rtg_grey) { + if (this == ModBlocks.machine_rtg) { TileEntityMachineRTG tileentityfurnace = (TileEntityMachineRTG) p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java index d09d50974..b07d30c30 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java @@ -1,5 +1,9 @@ package com.hbm.blocks.network.pneumatic; +import java.io.IOException; +import java.util.Random; + +import com.hbm.config.ServerConfig; import com.hbm.main.MainRegistry; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageClutter; @@ -7,12 +11,16 @@ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; public class PneumoStorageClutter extends BlockContainer { @@ -39,32 +47,120 @@ public class PneumoStorageClutter extends BlockContainer { @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntity te = world.getTileEntity(x, y, z); - if(!(te instanceof ISidedInventory)) return; - ISidedInventory tileentityfurnace = (ISidedInventory) te; - if(tileentityfurnace != null) { - for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - if(itemstack != null) { - float f = world.rand.nextFloat() * 0.8F + 0.1F; - float f1 = world.rand.nextFloat() * 0.8F + 0.1F; - float f2 = world.rand.nextFloat() * 0.8F + 0.1F; - while(itemstack.stackSize > 0) { - int j1 = world.rand.nextInt(21) + 10; - if(j1 > itemstack.stackSize) j1 = itemstack.stackSize; - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - if(itemstack.hasTagCompound()) entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - float f3 = 0.05F; - entityitem.motionX = world.rand.nextGaussian() * f3; - entityitem.motionY = world.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = world.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); + if(dropInv) { + TileEntityPneumoStorageClutter storage = (TileEntityPneumoStorageClutter) world.getTileEntity(x, y, z); + Random rand = world.rand; + if(storage != null) { + for(int i = 0; i < storage.getSizeInventory(); ++i) { + ItemStack itemstack = storage.getStackInSlot(i); + if(itemstack != null) { + float offsetX = rand.nextFloat() * 0.8F + 0.1F; + float offsetY = rand.nextFloat() * 0.8F + 0.1F; + float offsetZ = rand.nextFloat() * 0.8F + 0.1F; + + while(itemstack.stackSize > 0) { + int split = rand.nextInt(21) + 10; + if(split > itemstack.stackSize) split = itemstack.stackSize; + itemstack.stackSize -= split; + EntityItem entityitem = new EntityItem(world, x + offsetX, y + offsetY, z + offsetZ, new ItemStack(itemstack.getItem(), split, itemstack.getItemDamage())); + + if(itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + float intensity = 0.05F; + entityitem.motionX = rand.nextGaussian() * intensity; + entityitem.motionY = rand.nextGaussian() * intensity + 0.2F; + entityitem.motionZ = rand.nextGaussian() * intensity; + world.spawnEntityInWorld(entityitem); + } } } + + world.func_147453_f(x, y, z, block); } - world.func_147453_f(x, y, z, block); } + super.breakBlock(world, x, y, z, block, meta); } + + private static boolean dropInv = true; + + @Override + public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) { + + if(!world.isRemote && !ServerConfig.CRATE_KEEP_CONTENTS.get()) { + if(!player.capabilities.isCreativeMode) { + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(this))); + } + dropInv = true; + boolean flag = world.setBlockToAir(x, y, z); + return flag; + } + + if(!player.capabilities.isCreativeMode && !world.isRemote && willHarvest) { + + ItemStack drop = new ItemStack(this); + ISidedInventory inv = (ISidedInventory)world.getTileEntity(x, y, z); + + NBTTagCompound nbt = new NBTTagCompound(); + + if(inv != null) { + + for(int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack stack = inv.getStackInSlot(i); + if(stack == null) continue; + NBTTagCompound slot = new NBTTagCompound(); + stack.writeToNBT(slot); + nbt.setTag("slot" + i, slot); + } + } + + if(!nbt.hasNoTags()) { + drop.stackTagCompound = nbt; + } + + if(inv instanceof TileEntityPneumoStorageClutter) { + TileEntityPneumoStorageClutter crate = (TileEntityPneumoStorageClutter) inv; + if (crate.hasCustomInventoryName()) { + drop.setStackDisplayName(crate.getInventoryName()); + } + } + + if(drop.hasTagCompound()) { + try { + byte[] abyte = CompressedStreamTools.compress(drop.stackTagCompound); + + if(abyte.length > 6000) { + player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Warning: Container NBT exceeds 6kB, contents will be ejected!")); + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(this))); + return world.setBlockToAir(x, y, z); + } + + } catch(IOException e) { } + } + + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, drop)); + } + + dropInv = false; + boolean flag = world.setBlockToAir(x, y, z); + dropInv = true; + + return flag; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + + TileEntityPneumoStorageClutter inv = (TileEntityPneumoStorageClutter) world.getTileEntity(x, y, z); + + if(inv != null && stack.hasTagCompound()) { + for(int i = 0; i < inv.getSizeInventory(); i++) { + inv.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("slot" + i))); + } + if(stack.hasDisplayName()) inv.setCustomName(stack.getDisplayName()); + } + + super.onBlockPlacedBy(world, x, y, z, player, stack); + } } diff --git a/src/main/java/com/hbm/config/VersatileConfig.java b/src/main/java/com/hbm/config/VersatileConfig.java index ee0b4ac8d..31ada5393 100644 --- a/src/main/java/com/hbm/config/VersatileConfig.java +++ b/src/main/java/com/hbm/config/VersatileConfig.java @@ -18,7 +18,7 @@ public class VersatileConfig { public static int getSchrabOreChance() { if(GeneralConfig.enableLBSM) return GeneralConfig.schrabRate; - return 100; + return 250; } public static void applyPotionSickness(EntityLivingBase entity, int duration) { diff --git a/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java b/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java index 228c8230a..a2175a581 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java @@ -1,5 +1,9 @@ package com.hbm.entity.item; +import java.util.List; + +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.standard.ExplosionEffectTiny; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -76,6 +80,21 @@ public abstract class EntityMovingConveyorObject extends Entity { if(this.ticksExisted <= 5) { return; } + + // cram check every 20s + if((ticksExisted + this.getEntityId()) % 400 == 0) { + List objs = worldObj.getEntitiesWithinAABB(EntityMovingConveyorObject.class, this.boundingBox.expand(0.125, 0.125, 0.125)); + if(objs.size() >= 25) { + for(EntityMovingConveyorObject obj : objs) obj.setDead(); + ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY + 0.125, posZ, 1, this); + vnt.setSFX(new ExplosionEffectTiny()); + vnt.explode(); + int x = (int) Math.floor(posX); + int y = (int) Math.floor(posY); + int z = (int) Math.floor(posZ); + if(worldObj.getBlock(x, y, z) instanceof IConveyorBelt) worldObj.func_147480_a(x, y, z, false); + } + } int blockX = (int) Math.floor(posX); int blockY = (int) Math.floor(posY); diff --git a/src/main/java/com/hbm/entity/item/EntityMovingItem.java b/src/main/java/com/hbm/entity/item/EntityMovingItem.java index 364aafc29..16c9aa7c4 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingItem.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingItem.java @@ -122,6 +122,7 @@ public class EntityMovingItem extends EntityMovingConveyorObject implements ICon this.setDead(); EntityItem item = new EntityItem(worldObj, posX + motionX * 2, posY + motionY * 2, posZ + motionZ * 2, this.getItemStack()); + item.lifespan = 60 * 20; item.motionX = this.motionX * 2; item.motionY = 0.1; item.motionZ = this.motionZ * 2; diff --git a/src/main/java/com/hbm/entity/mob/EntityFBI.java b/src/main/java/com/hbm/entity/mob/EntityFBI.java index c1f29e7a4..3480c0c60 100644 --- a/src/main/java/com/hbm/entity/mob/EntityFBI.java +++ b/src/main/java/com/hbm/entity/mob/EntityFBI.java @@ -160,9 +160,7 @@ public class EntityFBI extends EntityMob implements IRangedAttackMob { canDestroy.add(ModBlocks.crate_iron); canDestroy.add(ModBlocks.crate_steel); canDestroy.add(ModBlocks.machine_diesel); - canDestroy.add(ModBlocks.machine_rtg_grey); - canDestroy.add(ModBlocks.machine_minirtg); - canDestroy.add(ModBlocks.machine_powerrtg); + canDestroy.add(ModBlocks.machine_rtg); canDestroy.add(ModBlocks.machine_cyclotron); canDestroy.add(Blocks.chest); canDestroy.add(Blocks.trapped_chest); diff --git a/src/main/java/com/hbm/handler/nei/RTGRecipeHandler.java b/src/main/java/com/hbm/handler/nei/RTGRecipeHandler.java index ed76b9d91..8f1a767e2 100644 --- a/src/main/java/com/hbm/handler/nei/RTGRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/RTGRecipeHandler.java @@ -9,7 +9,7 @@ public class RTGRecipeHandler extends NEIUniversalHandler { public RTGRecipeHandler() { super("RTG", new ItemStack[] { - new ItemStack(ModBlocks.machine_rtg_grey), + new ItemStack(ModBlocks.machine_rtg), new ItemStack(ModBlocks.machine_difurnace_rtg_off) }, ItemRTGPellet.getRecipeMap()); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index 53ffeaea2..d3fd06ff5 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -3,10 +3,14 @@ package com.hbm.inventory.container; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; +import java.util.Locale; +import java.util.Map.Entry; -import com.hbm.interfaces.NotableComments; import com.hbm.inventory.SlotNonRetarded; +import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.ContainerNBTCommsPacket; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; @@ -23,104 +27,159 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -@NotableComments // i long for the day when i never have to look at this fucking horseshit ever again public class ContainerPneumoStorageAccess extends Container implements ICustomPayloadReceiver { - /* - * time wasted on this fucking class: a lot - * - * this approach was great right until it just stopped working. - * a proper search requires the client to decide if the item matches - * the criteria, and we have to process all items in the network, so - * this entire approach of only sending 48 items at once to the client - * just absolutely will not work. - * - * i may have to rewrite absolutely everything here now, but at least i - * finally know what i am up against. didn't hear no bell. - */ - protected TileEntityPneumoStorageAccess access; protected InventoryPneumoStorageAccess inventory; + protected EntityPlayer player; + protected String searchString = ""; - public static final int SLOT_CLICK_ID_REFRESH = -666; + public static boolean detailedSearch = false; + + /** On the server, this is used to find changes in the system and then send them to the client. On the client, this is just to keep track of all items. */ + protected LinkedHashMap cachedEntries = new LinkedHashMap(); + /** Server to client queue, contains NBT tags that represents deltas yet to be sent to the client */ + public LinkedList s2cQueue = new LinkedList(); + + public void setSorter(Comparator sorter) { + this.listingStart = 0; + this.sorter = sorter; + this.rebuildClientIndex(); + } + + public void setSearchString(String search) { + this.listingStart = 0; + this.searchString = search.toLowerCase(Locale.US); + this.rebuildClientIndex(); + } + + /** Used to temporarily store the previous CacheSlot contents to calculate deltas with (i.e. detect changes) */ + public static class CacheSlotDummy { + + public final ItemStack displayStack; + public long stacksize; + public final int itemId; + public final int meta; + public final NBTTagCompound nbt; + + public CacheSlotDummy(ItemStack displayStack, long stacksize) { + this.displayStack = displayStack; + this.stacksize = stacksize; + this.itemId = Item.getIdFromItem(displayStack.getItem()); + this.meta = displayStack.getItemDamage(); + if(displayStack.hasTagCompound()) this.nbt = (NBTTagCompound) displayStack.stackTagCompound.copy(); + else this.nbt = null; + } + + public CacheSlotDummy(CacheSlot original) { + this(original.displayStack.copy(), original.stacksize); + } + } + public static final int GRID_SIZE = 6 * 8; - public static final String STACK_SIZE_KEY = "PNEUMO_STACK_SIZE"; - - public int itemCountForClient = 0; + public static final int DELTAS_PER_MSG = 6 * 8; + public static final int SLOT_CLICK_ID_REFRESH = -666; + public int listingStart = 0; + public int listingSize = 0; + + public int getStackCount() { + return listingSize; + } + + /** Serverside, creates a new delta for a new item stack */ + public void pushNewItem(ItemStack zeroStack, long amount) { + NBTTagCompound data = new NBTTagCompound(); + data.setByte("type", (byte) DeltaType.NEW_TYPE.ordinal()); + zeroStack.writeToNBT(data); + data.setLong("amount", amount); + s2cQueue.add(data); + } + + /** Serverside, creates a new delta for an amount update */ + public void updateCount(long hash, long amount) { + NBTTagCompound data = new NBTTagCompound(); + data.setByte("type", (byte) DeltaType.COUNT_CHANGE.ordinal()); + data.setLong("hash", hash); + data.setLong("amount", amount); + s2cQueue.add(data); + } + + /** Serverside, bunches up deltas into NBTTagLists and sends them, 48 (DELTAS_PER_MSG) at a time */ + public void processDeltasAndSync(EntityPlayerMP playerMP) { + if(s2cQueue.isEmpty()) return; + + NBTTagList list = null; + + while(!s2cQueue.isEmpty()) { + if(list == null) list = new NBTTagList(); + list.appendTag(s2cQueue.removeFirst()); + if(list.tagCount() >= DELTAS_PER_MSG) { bonVoyage(list, playerMP); list = null; } + } + + if(list != null) bonVoyage(list, playerMP); + } + + /** Wraps the NBTTagList into a master compound tag and sends it to the client */ + public void bonVoyage(NBTTagList list, EntityPlayerMP playerMP) { + NBTTagCompound masterTag = new NBTTagCompound(); + masterTag.setTag("list", list); + PacketDispatcher.wrapper.sendTo(new ContainerNBTCommsPacket(playerMP.currentWindowId, masterTag), playerMP); + } + + /** Compares the original access stack cache with the one we have buffered to detect changes and pushes them to the s2c sending queue */ + public void checkAndSyncCache() { + if(this.access.cache == null || this.access.cache.hasExpired) return; + + for(Entry entry : this.access.cache.cacheSlots.entrySet()) { + + Long hash = entry.getKey(); + if(hash == StackCache.getNullIdentity()) continue; + + CacheSlotDummy existingCache = this.cachedEntries.get(hash); + CacheSlot properCache = entry.getValue(); + + // if the previous entries already contain this type, check for amount change + if(existingCache != null) { + if(existingCache.stacksize != properCache.stacksize) { + this.updateCount(hash, properCache.stacksize); + existingCache.stacksize = properCache.stacksize; + } + // if not, add that type to our index + } else { + existingCache = new CacheSlotDummy(properCache); + existingCache.stacksize = properCache.stacksize; + this.cachedEntries.put(hash, existingCache); + this.pushNewItem(existingCache.displayStack, existingCache.stacksize); + } + } + + if(player instanceof EntityPlayerMP) processDeltasAndSync((EntityPlayerMP) this.player); + } public ContainerPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { this.access = access; this.inventory = new InventoryPneumoStorageAccess(access); + this.player = invPlayer.player; - for(int i = 0; i < 6; i++) { - for(int j = 0; j < 8; j++) { - this.addSlotToContainer(new SlotPneumo(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); - } + int hOffset = 34; + + for(int i = 0; i < 6; i++) for(int j = 0; j < 8; j++) { + this.addSlotToContainer(new SlotPneumo(inventory, j + i * 8, 8 + j * 18 + hOffset, 17 + i * 18)); } - for(int i = 0; i < 3; i++) { - for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new SlotNonRetarded(invPlayer, j + i * 9 + 9, 8 + j * 18, 169 + i * 18)); - } + for(int i = 0; i < 3; i++) for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new SlotNonRetarded(invPlayer, j + i * 9 + 9, 8 + j * 18 + hOffset, 169 + i * 18)); } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new SlotNonRetarded(invPlayer, i, 8 + i * 18, 227)); + this.addSlotToContainer(new SlotNonRetarded(invPlayer, i, 8 + i * 18 + hOffset, 227)); } - - updateListing(0); - this.detectAndSendChanges(); - } - - public int getStackCount() { - return itemCountForClient; - } - - public void updateListing(int startingIndex) { // DEMO - if(this.access.cache == null || this.access.cache.hasExpired) return; - StackCache cache = this.access.cache; - List cacheSlots = new ArrayList(cache.cacheSlots.size()); - cacheSlots.addAll(cache.cacheSlots.values()); - cacheSlots.removeIf(x -> { return x.stacksize <= 0; }); - Collections.sort(cacheSlots, SORT_BY_STACK_SIZE); - int size = cacheSlots.size(); - - int offset = startingIndex * 8; - - for(int i = 0; i < inventory.slots.length; i++) { - int grabIndex = offset + i; - if(grabIndex < size) { - CacheSlot cacheSlot = cacheSlots.get(grabIndex); - if(cacheSlot.displayStack != null) { - inventory.slots[i] = cacheSlot.displayStack.copy(); - } else { - inventory.slots[i] = null; - } - } else { - inventory.slots[i] = null; - } - } - } - - public static final Comparator SORT_BY_STACK_SIZE = new Comparator() { - @Override - public int compare(CacheSlot o1, CacheSlot o2) { - if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; - if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; - if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; - if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; - return 0; - } - }; - - @Override - public boolean canInteractWith(EntityPlayer player) { - return access.getDistanceFrom(player.posX, player.posY, player.posZ) <= 15 * 15; } @Override @@ -128,77 +187,50 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa if(mode == 6) return null; if(index == SLOT_CLICK_ID_REFRESH) { - if(player.worldObj.isRemote) return null; this.listingStart = mode; this.detectAndSendChanges(); return null; } + boolean client = player.worldObj.isRemote; boolean leftClick = button == 0 && mode == 0; boolean rightClick = button == 1 && mode == 0; boolean shiftClick = button == 0 && mode == 1; if(index >= 0 && index < GRID_SIZE) { - boolean client = player.worldObj.isRemote; + if(!client) return null; SlotPneumo slot = (SlotPneumo) this.getSlot(index); + long hash = StackCache.getStackIdentity(slot.getStack()); ItemStack held = player.inventory.getItemStack(); - - if(slot.getHasStack()) { - - // left click, can't hold an item and provides a full stack to the held item - if(leftClick || rightClick) { - ItemStack stack = slot.getStack().copy(); - - int alreadyHeld = held == null ? 0 : held.stackSize; - int capacity = stack.getMaxStackSize() - alreadyHeld; - if(rightClick && capacity > 1) capacity = 1; - int toGrab = (int) Math.min(capacity, slot.amount); - - if(capacity > 0 && (held == null || StackCache.getStackIdentity(held) == StackCache.getStackIdentity(stack))) { - if(client) { - stack.stackSize = toGrab + alreadyHeld; - player.inventory.setItemStack(stack); - } else { - if(this.access.cache == null || this.access.cache.hasExpired) return null; - StackCache cache = this.access.cache; - stack.stackSize = (int) cache.consumeItemsAndReturnQuantity(stack, toGrab) + alreadyHeld; - player.inventory.setItemStack(stack); - } - - return null; // for some reason we gotta terminate here and not below - } - - // shift click, works even if there's a held stack, serverside only and the nwe just sync - } else if(shiftClick && !client) { - ItemStack stack = slot.getStack().copy(); - if(this.access.cache == null || this.access.cache.hasExpired) return null; - StackCache cache = this.access.cache; - int originalStacksize = (int) Math.min(stack.getMaxStackSize(), slot.amount); - stack.stackSize = originalStacksize; - ItemStack ret = InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, stack); - int remainder = ret == null ? 0 : ret.stackSize; - int itemsUsed = originalStacksize - remainder; - cache.consumeItemsAndReturnQuantity(stack, itemsUsed); - detectAndSendChanges(); + long heldHash = StackCache.getStackIdentity(held); + if(leftClick) { + if(held != null && hash != heldHash) held = null; + else if(held != null && hash == heldHash) { + held.stackSize += slot.amount; + held.stackSize = Math.min(held.stackSize, held.getMaxStackSize()); + } else if(held == null && slot.getHasStack()) { + held = slot.getStack().copy(); + held.stackSize = (int) Math.min(slot.amount, held.getMaxStackSize()); } + this.player.inventory.setItemStack(held); + sendClickToServer(ClickType.LEFT_CLICK, hash); + return null; } - - if(held != null) { - int toDeposit = rightClick ? 1 : held.stackSize; - player.inventory.getItemStack().stackSize -= toDeposit; - if(player.inventory.getItemStack().stackSize <= 0) player.inventory.setItemStack(null); - if(this.access.cache == null || this.access.cache.hasExpired) return null; - StackCache cache = this.access.cache; - int remainder = (int) cache.addItemsAndReturnQuantity(held, toDeposit); - if(remainder > 0) { - ItemStack copy = held.copy(); - copy.stackSize = remainder; - InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, copy); - detectAndSendChanges(); + if(rightClick) { + if(held != null && hash != heldHash) held.stackSize--; + else if(held != null && hash == heldHash) { + held.stackSize += 1; + held.stackSize = Math.min(held.stackSize, held.getMaxStackSize()); + } else if(held == null && slot.getHasStack()) { + held = slot.getStack().copy(); + held.stackSize = 1; } + if(held.stackSize <= 0) held = null; + this.player.inventory.setItemStack(held); + sendClickToServer(ClickType.RIGHT_CLICK, hash); + return null; } - - return slot.getHasStack() ? slot.getStack().copy() : null; + if(shiftClick) { sendClickToServer(ClickType.SHIFT_CLICK, hash); return null; } // shift clicking an item from the player inv to the storage } else if(index >= GRID_SIZE && index < this.inventorySlots.size()) { @@ -214,36 +246,25 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa if(remainder <= 0) slot.putStack(null); slot.onSlotChanged(); detectAndSendChanges(); + return null; // technically not needed but we don't have to run 500,000 lines of code that ends up doing nothing } } return super.slotClick(index, button, mode, player); } - - @Override - public void addCraftingToCrafters(ICrafting crafting) { - super.addCraftingToCrafters(crafting); - } - /** Used only on the client side to set the contents of a slot after a sync */ - @Override - public void putStackInSlot(int index, ItemStack slot) { - this.getSlot(index).putStack(slot); + public void sendClickToServer(ClickType type, long hash) { + + NBTTagCompound data = new NBTTagCompound(); + data.setByte("type", (byte) type.ordinal()); + data.setLong("hash", hash); + PacketDispatcher.wrapper.sendToServer(new ContainerNBTCommsPacket(this.windowId, data)); } public long[] previousStackSizes = new long[GRID_SIZE]; - /** - * All syncing is done using the ICrafting interface (which only EntityPlayerMP implements), each single slot change is one entire fucking - * packet that is sent like a massive pile of pricks to each client. Who cares, right. Issue is, this interface only supports sending of - * ItemStacks and integer values with integer keys for the progress bars. We need longs which are indexed, so at least an extra byte along - * with that. After some fucking about I decided, well vanilla container code is complete fucking shit anyway, why bother with any of that? - * Instead, we just skip all the syncing for that and use our custom crap packet. Depending on whether the stack, the count, or both has changed, - * we send the requested data in a single packet. - */ @Override public void detectAndSendChanges() { - this.updateListing(listingStart); // skip the first 6*8 slots, i.e. all the ones visible in the access grid for(int i = GRID_SIZE; i < this.inventorySlots.size(); i++) { @@ -260,91 +281,209 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa } } - // custom horseshit scum fuck + boolean isServer = !this.access.getWorldObj().isRemote; - NBTTagList list = new NBTTagList(); - - if(this.access.cache != null && !this.access.cache.hasExpired) for(int i = 0; i < GRID_SIZE; i++) { - PneumoMesageType msg = null; - SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(i); - ItemStack actualStack = slot.getStack(); - long cachedSize = slot.amount; - CacheSlot cacheSlot = actualStack != null ? this.access.cache.getSlotFromStack(actualStack) : null; - long actualSize = cacheSlot != null ? cacheSlot.stacksize : 0; - if(actualSize <= 0) actualStack = null; - ItemStack cachedStack = (ItemStack) this.inventoryItemStacks.get(i); - - if(!ItemStack.areItemStacksEqual(cachedStack, actualStack)) msg = PneumoMesageType.UPDATE_TYPE; - - if(cachedSize != actualSize || actualSize > 0 /* HACK: solve this by moving the listing change to the container class and writing the correct amounts on init */) { - if(msg == PneumoMesageType.UPDATE_TYPE) msg = PneumoMesageType.UPDATE_ALL; - if(msg == null) msg = PneumoMesageType.UPDATE_COUNT; - } - - if(msg != null) { - cachedStack = actualStack == null ? null : actualStack.copy(); - this.inventoryItemStacks.set(i, cachedStack); - slot.amount = actualSize; - - NBTTagCompound listEntry = new NBTTagCompound(); - listEntry.setByte(KEY_TYPE, (byte) msg.ordinal()); - listEntry.setByte(KEY_SLOT_INDEX, (byte) i); - if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_COUNT) { - listEntry.setLong(KEY_LONG_COUNT, actualSize); - } - if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_TYPE) if(actualStack != null) actualStack.writeToNBT(listEntry); - - list.appendTag(listEntry); - } - } - - if(list.tagCount() > 0) { - NBTTagCompound masterTag = new NBTTagCompound(); - // if a null stack is indiced, skip - boolean hasNullStack = this.access.cache.cacheSlots.containsKey(this.access.cache.getNullIdentity()); - masterTag.setInteger("itemCount", this.access.cache.cacheSlots.size() - (hasNullStack ? 1 : 0)); - masterTag.setInteger("listingStart", this.listingStart); - masterTag.setTag("list", list); - for(Object o : this.crafters) { - if(o instanceof EntityPlayerMP) { - EntityPlayerMP playerMP = (EntityPlayerMP) o; - PacketDispatcher.wrapper.sendTo(new ContainerNBTCommsPacket(playerMP.currentWindowId, masterTag), playerMP); - } - } + if(isServer) { + checkAndSyncCache(); + } else { + rebuildClientIndex(); } } - public static final String KEY_TYPE = "t"; - public static final String KEY_SLOT_INDEX = "s"; - public static final String KEY_LONG_COUNT = "lc"; - public static enum PneumoMesageType { - UPDATE_COUNT, - UPDATE_TYPE, - UPDATE_ALL; + @Override + public boolean canInteractWith(EntityPlayer player) { + return access.getDistanceFrom(player.posX, player.posY, player.posZ) <= 15 * 15; + } + + /** For S2C to send deltas updating the available items */ + public static enum DeltaType { + NEW_TYPE, + COUNT_CHANGE; + } + + public static enum ClickType { + LEFT_CLICK, + RIGHT_CLICK, + SHIFT_CLICK } @Override public void acceptData(Side side, int windowId, NBTTagCompound data) { if(windowId != this.windowId) return; - if(side.isClient()) { - this.itemCountForClient = data.getInteger("itemCount"); - this.listingStart = data.getInteger("listingStart"); - + if(side == Side.CLIENT) { NBTTagList list = data.getTagList("list", 10); for(int i = 0; i < list.tagCount(); i++) { - NBTTagCompound listEntry = list.getCompoundTagAt(i); - PneumoMesageType msg = EnumUtil.grabEnumSafely(PneumoMesageType.class, listEntry.getByte(KEY_TYPE)); - int slotIndex = listEntry.getByte(KEY_SLOT_INDEX); - SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(slotIndex); - if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_COUNT) slot.amount = listEntry.getLong(KEY_LONG_COUNT); - if(msg == PneumoMesageType.UPDATE_ALL || msg == PneumoMesageType.UPDATE_TYPE) slot.putStack(ItemStack.loadItemStackFromNBT(listEntry)); + NBTTagCompound line = list.getCompoundTagAt(i); + DeltaType type = EnumUtil.grabEnumSafely(DeltaType.class, line.getByte("type")); + + if(type == DeltaType.NEW_TYPE) { + ItemStack stack = ItemStack.loadItemStackFromNBT(line); + long amount = line.getLong("amount"); + long hash = StackCache.getStackIdentity(stack); + CacheSlotDummy dummy = new CacheSlotDummy(stack, amount); + this.cachedEntries.put(hash, dummy); + + } else if(type == DeltaType.COUNT_CHANGE) { + long hash = line.getLong("hash"); + CacheSlotDummy dummy = this.cachedEntries.get(hash); + if(dummy != null) dummy.stacksize = line.getLong("amount"); + } } - } else { + rebuildClientIndex(); + + } else { + if(this.access.cache == null || this.access.cache.hasExpired) return; + ClickType type = EnumUtil.grabEnumSafely(ClickType.class, data.getByte("type")); + long hash = data.getLong("hash"); + CacheSlotDummy cache = this.cachedEntries.get(hash); + ItemStack held = this.player.inventory.getItemStack(); + long heldHash = StackCache.getStackIdentity(held); + + // left click + if(type == ClickType.LEFT_CLICK || type == ClickType.RIGHT_CLICK) { + + // if we drop an item onto a different stack, or no stack at all, deposit + if(hash != heldHash && held != null) { + int toDeposit = type == ClickType.LEFT_CLICK ? held.stackSize : 1; + held.stackSize -= toDeposit; + int leftover = (int) this.access.cache.addItemsAndReturnQuantity(held, toDeposit); + held.stackSize += leftover; + this.player.inventory.setItemStack(null); + if(held.stackSize > 0) InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, held); + detectAndSendChanges(); + return; + } + + // if our hand is empty or we have the same type, withdraw + if(cache != null && (held == null || hash == heldHash)) { + ItemStack stack = cache.displayStack.copy(); + int alreadyHeld = held == null ? 0 : held.stackSize; + int capacity = stack.getMaxStackSize() - alreadyHeld; + if(type == ClickType.RIGHT_CLICK && capacity > 1) capacity = 1; + int toGrab = (int) Math.min(capacity, cache.stacksize); + int grabbed = (int) this.access.cache.consumeItemsAndReturnQuantity(stack, toGrab); + stack.stackSize = alreadyHeld + grabbed; + this.player.inventory.setItemStack(stack); + detectAndSendChanges(); + return; + } + } + + if(type == ClickType.SHIFT_CLICK && cache != null) { + ItemStack stack = cache.displayStack.copy(); + int originalStacksize = (int) Math.min(stack.getMaxStackSize(), cache.stacksize); + stack.stackSize = originalStacksize; + ItemStack ret = InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, stack); + int remainder = ret == null ? 0 : ret.stackSize; + int itemsUsed = originalStacksize - remainder; + this.access.cache.consumeItemsAndReturnQuantity(stack, itemsUsed); + detectAndSendChanges(); + return; + } } } + + public void rebuildClientIndex() { + + List cacheSlots = new ArrayList(this.cachedEntries.size()); + cacheSlots.addAll(this.cachedEntries.values()); + cacheSlots.removeIf(x -> { return x.stacksize <= 0; }); + + if(this.searchString != null && !this.searchString.isEmpty()) { + if(!detailedSearch) { + cacheSlots.removeIf(x -> { + return !x.displayStack.getDisplayName().toLowerCase(Locale.US).contains(searchString); + }); + } else { + cacheSlots.removeIf(x -> { + boolean contains = x.displayStack.getDisplayName().toLowerCase(Locale.US).contains(searchString); + List toolTip = new ArrayList(); + if(!contains) { + x.displayStack.getItem().addInformation(x.displayStack, MainRegistry.proxy.me(), toolTip, MainRegistry.proxy.advancedTooltips()); + for(String string : toolTip) { + if(string.toLowerCase(Locale.US).contains(searchString)) { + contains = true; + break; + } + } + } + return !contains; + }); + } + } + + listingSize = cacheSlots.size(); + Collections.sort(cacheSlots, this.sorter); + int size = cacheSlots.size(); + + int offset = listingStart * 8; + + for(int i = 0; i < inventory.slots.length; i++) { + int grabIndex = offset + i; + if(grabIndex < size) { + CacheSlotDummy cacheSlot = cacheSlots.get(grabIndex); + SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(i); + if(cacheSlot.displayStack != null) { + slot.putStack(cacheSlot.displayStack.copy()); + slot.amount = cacheSlot.stacksize; + } else { + slot.putStack(null); + slot.amount = 0; + } + } else { + inventory.slots[i] = null; + } + } + } + + public static final Comparator SORT_BY_STACK_SIZE = new Comparator() { + @Override + public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { + if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; + if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; + if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; + if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; + return 0; + } + }; + + public static final Comparator SORT_BY_ID = new Comparator() { + @Override + public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { + if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; + if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; + if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; + if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; + return 0; + } + }; + + public static final Comparator SORT_BY_INTERNAL = new Comparator() { + @Override + public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { + String name1 = o1.displayStack.getItem().getUnlocalizedName(o1.displayStack); + String name2 = o2.displayStack.getItem().getUnlocalizedName(o2.displayStack); + int compare = name1.compareToIgnoreCase(name2); + if(compare != 0) return compare; + return SORT_BY_ID.compare(o1, o2); + } + }; + + public static final Comparator SORT_BY_LOCALIZED = new Comparator() { + @Override + public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { + String name1 = o1.displayStack.getItem().getItemStackDisplayName(o1.displayStack); + String name2 = o2.displayStack.getItem().getItemStackDisplayName(o2.displayStack); + int compare = name1.compareToIgnoreCase(name2); + if(compare != 0) return compare; + return SORT_BY_ID.compare(o1, o2); + } + }; + + protected static Comparator sorter = SORT_BY_STACK_SIZE; @Override public ItemStack transferStackInSlot(EntityPlayer player, int index) { @@ -378,7 +517,7 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa @Override public int getSizeInventory() { return GRID_SIZE; } @Override public ItemStack getStackInSlot(int slot) { return slots[slot]; } - @Override public int getInventoryStackLimit() { return 64; } + @Override public int getInventoryStackLimit() { return 1; } @Override public ItemStack decrStackSize(int slot, int amount) { return null; } @Override public void setInventorySlotContents(int slot, ItemStack stack) { this.slots[slot] = stack; } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java deleted file mode 100644 index 14407b500..000000000 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccessMK2.java +++ /dev/null @@ -1,492 +0,0 @@ -package com.hbm.inventory.container; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map.Entry; - -import com.hbm.inventory.SlotNonRetarded; -import com.hbm.inventory.container.ContainerPneumoStorageAccess.InventoryPneumoStorageAccess; -import com.hbm.inventory.container.ContainerPneumoStorageAccess.SlotPneumo; -import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.ContainerNBTCommsPacket; -import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; -import com.hbm.util.EnumUtil; -import com.hbm.util.InventoryUtil; - -import api.hbm.ntl.StackCache; -import api.hbm.ntl.StackCache.CacheSlot; -import cpw.mods.fml.relauncher.Side; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.ICrafting; -import net.minecraft.inventory.Slot; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; - -public class ContainerPneumoStorageAccessMK2 extends Container implements ICustomPayloadReceiver { - - protected TileEntityPneumoStorageAccess access; - protected InventoryPneumoStorageAccess inventory; - protected EntityPlayer player; - protected String searchString = ""; - - public static boolean detailedSearch = false; - - /** On the server, this is used to find changes in the system and then send them to the client. On the client, this is just to keep track of all items. */ - protected LinkedHashMap cachedEntries = new LinkedHashMap(); - /** Server to client queue, contains NBT tags that represents deltas yet to be sent to the client */ - public LinkedList s2cQueue = new LinkedList(); - - public void setSorter(Comparator sorter) { - this.listingStart = 0; - this.sorter = sorter; - this.rebuildClientIndex(); - } - - public void setSearchString(String search) { - this.listingStart = 0; - this.searchString = search.toLowerCase(Locale.US); - this.rebuildClientIndex(); - } - - /** Used to temporarily store the previous CacheSlot contents to calculate deltas with (i.e. detect changes) */ - public static class CacheSlotDummy { - - public final ItemStack displayStack; - public long stacksize; - public final int itemId; - public final int meta; - public final NBTTagCompound nbt; - - public CacheSlotDummy(ItemStack displayStack, long stacksize) { - this.displayStack = displayStack; - this.stacksize = stacksize; - this.itemId = Item.getIdFromItem(displayStack.getItem()); - this.meta = displayStack.getItemDamage(); - if(displayStack.hasTagCompound()) this.nbt = (NBTTagCompound) displayStack.stackTagCompound.copy(); - else this.nbt = null; - } - - public CacheSlotDummy(CacheSlot original) { - this(original.displayStack.copy(), original.stacksize); - } - } - - public static final int GRID_SIZE = 6 * 8; - public static final int DELTAS_PER_MSG = 6 * 8; - - public int listingStart = 0; - public int listingSize = 0; - - public int getStackCount() { - return listingSize; - } - - /** Serverside, creates a new delta for a new item stack */ - public void pushNewItem(ItemStack zeroStack, long amount) { - NBTTagCompound data = new NBTTagCompound(); - data.setByte("type", (byte) DeltaType.NEW_TYPE.ordinal()); - zeroStack.writeToNBT(data); - data.setLong("amount", amount); - s2cQueue.add(data); - } - - /** Serverside, creates a new delta for an amount update */ - public void updateCount(long hash, long amount) { - NBTTagCompound data = new NBTTagCompound(); - data.setByte("type", (byte) DeltaType.COUNT_CHANGE.ordinal()); - data.setLong("hash", hash); - data.setLong("amount", amount); - s2cQueue.add(data); - } - - /** Serverside, bunches up deltas into NBTTagLists and sends them, 48 (DELTAS_PER_MSG) at a time */ - public void processDeltasAndSync(EntityPlayerMP playerMP) { - if(s2cQueue.isEmpty()) return; - - NBTTagList list = null; - - while(!s2cQueue.isEmpty()) { - if(list == null) list = new NBTTagList(); - list.appendTag(s2cQueue.removeFirst()); - if(list.tagCount() >= DELTAS_PER_MSG) { bonVoyage(list, playerMP); list = null; } - } - - if(list != null) bonVoyage(list, playerMP); - } - - /** Wraps the NBTTagList into a master compound tag and sends it to the client */ - public void bonVoyage(NBTTagList list, EntityPlayerMP playerMP) { - NBTTagCompound masterTag = new NBTTagCompound(); - masterTag.setTag("list", list); - PacketDispatcher.wrapper.sendTo(new ContainerNBTCommsPacket(playerMP.currentWindowId, masterTag), playerMP); - } - - /** Compares the original access stack cache with the one we have buffered to detect changes and pushes them to the s2c sending queue */ - public void checkAndSyncCache() { - if(this.access.cache == null || this.access.cache.hasExpired) return; - - for(Entry entry : this.access.cache.cacheSlots.entrySet()) { - - Long hash = entry.getKey(); - if(hash == StackCache.getNullIdentity()) continue; - - CacheSlotDummy existingCache = this.cachedEntries.get(hash); - CacheSlot properCache = entry.getValue(); - - // if the previous entries already contain this type, check for amount change - if(existingCache != null) { - if(existingCache.stacksize != properCache.stacksize) { - this.updateCount(hash, properCache.stacksize); - existingCache.stacksize = properCache.stacksize; - } - // if not, add that type to our index - } else { - existingCache = new CacheSlotDummy(properCache); - existingCache.stacksize = properCache.stacksize; - this.cachedEntries.put(hash, existingCache); - this.pushNewItem(existingCache.displayStack, existingCache.stacksize); - } - } - - if(player instanceof EntityPlayerMP) processDeltasAndSync((EntityPlayerMP) this.player); - } - - public ContainerPneumoStorageAccessMK2(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { - this.access = access; - this.inventory = new InventoryPneumoStorageAccess(access); - this.player = invPlayer.player; - - int hOffset = 34; - - for(int i = 0; i < 6; i++) for(int j = 0; j < 8; j++) { - this.addSlotToContainer(new SlotPneumo(inventory, j + i * 8, 8 + j * 18 + hOffset, 17 + i * 18)); - } - - for(int i = 0; i < 3; i++) for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new SlotNonRetarded(invPlayer, j + i * 9 + 9, 8 + j * 18 + hOffset, 169 + i * 18)); - } - - for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new SlotNonRetarded(invPlayer, i, 8 + i * 18 + hOffset, 227)); - } - } - - @Override - public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { - if(mode == 6) return null; - - if(index == ContainerPneumoStorageAccess.SLOT_CLICK_ID_REFRESH) { - this.listingStart = mode; - this.detectAndSendChanges(); - return null; - } - - boolean client = player.worldObj.isRemote; - boolean leftClick = button == 0 && mode == 0; - boolean rightClick = button == 1 && mode == 0; - boolean shiftClick = button == 0 && mode == 1; - - if(index >= 0 && index < GRID_SIZE) { - if(!client) return null; - SlotPneumo slot = (SlotPneumo) this.getSlot(index); - long hash = StackCache.getStackIdentity(slot.getStack()); - ItemStack held = player.inventory.getItemStack(); - long heldHash = StackCache.getStackIdentity(held); - if(leftClick) { - if(held != null && hash != heldHash) held = null; - else if(held != null && hash == heldHash) { - held.stackSize += slot.amount; - held.stackSize = Math.min(held.stackSize, held.getMaxStackSize()); - } else if(held == null && slot.getHasStack()) { - held = slot.getStack().copy(); - held.stackSize = (int) Math.min(slot.amount, held.getMaxStackSize()); - } - this.player.inventory.setItemStack(held); - sendClickToServer(ClickType.LEFT_CLICK, hash); - return null; - } - if(rightClick) { - if(held != null && hash != heldHash) held.stackSize--; - else if(held != null && hash == heldHash) { - held.stackSize += 1; - held.stackSize = Math.min(held.stackSize, held.getMaxStackSize()); - } else if(held == null && slot.getHasStack()) { - held = slot.getStack().copy(); - held.stackSize = 1; - } - if(held.stackSize <= 0) held = null; - this.player.inventory.setItemStack(held); - sendClickToServer(ClickType.RIGHT_CLICK, hash); - return null; - } - if(shiftClick) { sendClickToServer(ClickType.SHIFT_CLICK, hash); return null; } - - // shift clicking an item from the player inv to the storage - } else if(index >= GRID_SIZE && index < this.inventorySlots.size()) { - - Slot slot = this.getSlot(index); - - if(shiftClick && slot.getHasStack()) { - ItemStack stack = slot.getStack().copy(); - if(this.access.cache == null || this.access.cache.hasExpired) return null; - StackCache cache = this.access.cache; - int remainder = (int) cache.addItemsAndReturnQuantity(stack, stack.stackSize); - slot.decrStackSize(stack.stackSize - remainder); - if(remainder <= 0) slot.putStack(null); - slot.onSlotChanged(); - detectAndSendChanges(); - return null; // technically not needed but we don't have to run 500,000 lines of code that ends up doing nothing - } - } - - return super.slotClick(index, button, mode, player); - } - - public void sendClickToServer(ClickType type, long hash) { - - NBTTagCompound data = new NBTTagCompound(); - data.setByte("type", (byte) type.ordinal()); - data.setLong("hash", hash); - PacketDispatcher.wrapper.sendToServer(new ContainerNBTCommsPacket(this.windowId, data)); - } - - public long[] previousStackSizes = new long[GRID_SIZE]; - - @Override - public void detectAndSendChanges() { - - // skip the first 6*8 slots, i.e. all the ones visible in the access grid - for(int i = GRID_SIZE; i < this.inventorySlots.size(); i++) { - ItemStack stack0 = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack stack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if(!ItemStack.areItemStacksEqual(stack1, stack0)) { - stack1 = stack0 == null ? null : stack0.copy(); - this.inventoryItemStacks.set(i, stack1); - - for(int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, stack1); - } - } - } - - boolean isServer = !this.access.getWorldObj().isRemote; - - if(isServer) { - checkAndSyncCache(); - } else { - rebuildClientIndex(); - } - } - - @Override - public boolean canInteractWith(EntityPlayer player) { - return access.getDistanceFrom(player.posX, player.posY, player.posZ) <= 15 * 15; - } - - /** For S2C to send deltas updating the available items */ - public static enum DeltaType { - NEW_TYPE, - COUNT_CHANGE; - } - - public static enum ClickType { - LEFT_CLICK, - RIGHT_CLICK, - SHIFT_CLICK - } - - @Override - public void acceptData(Side side, int windowId, NBTTagCompound data) { - if(windowId != this.windowId) return; - - if(side == Side.CLIENT) { - NBTTagList list = data.getTagList("list", 10); - - for(int i = 0; i < list.tagCount(); i++) { - NBTTagCompound line = list.getCompoundTagAt(i); - DeltaType type = EnumUtil.grabEnumSafely(DeltaType.class, line.getByte("type")); - - if(type == DeltaType.NEW_TYPE) { - ItemStack stack = ItemStack.loadItemStackFromNBT(line); - long amount = line.getLong("amount"); - long hash = StackCache.getStackIdentity(stack); - CacheSlotDummy dummy = new CacheSlotDummy(stack, amount); - this.cachedEntries.put(hash, dummy); - - } else if(type == DeltaType.COUNT_CHANGE) { - long hash = line.getLong("hash"); - CacheSlotDummy dummy = this.cachedEntries.get(hash); - if(dummy != null) dummy.stacksize = line.getLong("amount"); - } - } - - rebuildClientIndex(); - - } else { - if(this.access.cache == null || this.access.cache.hasExpired) return; - ClickType type = EnumUtil.grabEnumSafely(ClickType.class, data.getByte("type")); - long hash = data.getLong("hash"); - CacheSlotDummy cache = this.cachedEntries.get(hash); - ItemStack held = this.player.inventory.getItemStack(); - long heldHash = StackCache.getStackIdentity(held); - - // left click - if(type == ClickType.LEFT_CLICK || type == ClickType.RIGHT_CLICK) { - - // if we drop an item onto a different stack, or no stack at all, deposit - if(hash != heldHash && held != null) { - int toDeposit = type == ClickType.LEFT_CLICK ? held.stackSize : 1; - held.stackSize -= toDeposit; - int leftover = (int) this.access.cache.addItemsAndReturnQuantity(held, toDeposit); - held.stackSize += leftover; - this.player.inventory.setItemStack(null); - if(held.stackSize > 0) InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, held); - detectAndSendChanges(); - return; - } - - // if our hand is empty or we have the same type, withdraw - if(cache != null && (held == null || hash == heldHash)) { - ItemStack stack = cache.displayStack.copy(); - int alreadyHeld = held == null ? 0 : held.stackSize; - int capacity = stack.getMaxStackSize() - alreadyHeld; - if(type == ClickType.RIGHT_CLICK && capacity > 1) capacity = 1; - int toGrab = (int) Math.min(capacity, cache.stacksize); - int grabbed = (int) this.access.cache.consumeItemsAndReturnQuantity(stack, toGrab); - stack.stackSize = alreadyHeld + grabbed; - this.player.inventory.setItemStack(stack); - detectAndSendChanges(); - return; - } - } - - if(type == ClickType.SHIFT_CLICK && cache != null) { - ItemStack stack = cache.displayStack.copy(); - int originalStacksize = (int) Math.min(stack.getMaxStackSize(), cache.stacksize); - stack.stackSize = originalStacksize; - ItemStack ret = InventoryUtil.tryAddItemToInventory(player.inventory.mainInventory, stack); - int remainder = ret == null ? 0 : ret.stackSize; - int itemsUsed = originalStacksize - remainder; - this.access.cache.consumeItemsAndReturnQuantity(stack, itemsUsed); - detectAndSendChanges(); - return; - } - } - } - - public void rebuildClientIndex() { - - List cacheSlots = new ArrayList(this.cachedEntries.size()); - cacheSlots.addAll(this.cachedEntries.values()); - cacheSlots.removeIf(x -> { return x.stacksize <= 0; }); - - if(this.searchString != null && !this.searchString.isEmpty()) { - if(!detailedSearch) { - cacheSlots.removeIf(x -> { - return !x.displayStack.getDisplayName().toLowerCase(Locale.US).contains(searchString); - }); - } else { - cacheSlots.removeIf(x -> { - boolean contains = x.displayStack.getDisplayName().toLowerCase(Locale.US).contains(searchString); - List toolTip = new ArrayList(); - if(!contains) { - x.displayStack.getItem().addInformation(x.displayStack, MainRegistry.proxy.me(), toolTip, MainRegistry.proxy.advancedTooltips()); - for(String string : toolTip) { - if(string.toLowerCase(Locale.US).contains(searchString)) { - contains = true; - break; - } - } - } - return !contains; - }); - } - } - - listingSize = cacheSlots.size(); - Collections.sort(cacheSlots, this.sorter); - int size = cacheSlots.size(); - - int offset = listingStart * 8; - - for(int i = 0; i < inventory.slots.length; i++) { - int grabIndex = offset + i; - if(grabIndex < size) { - CacheSlotDummy cacheSlot = cacheSlots.get(grabIndex); - SlotPneumo slot = (SlotPneumo) this.inventorySlots.get(i); - if(cacheSlot.displayStack != null) { - slot.putStack(cacheSlot.displayStack.copy()); - slot.amount = cacheSlot.stacksize; - } else { - slot.putStack(null); - slot.amount = 0; - } - } else { - inventory.slots[i] = null; - } - } - } - - public static final Comparator SORT_BY_STACK_SIZE = new Comparator() { - @Override - public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { - if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; - if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; - if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; - if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; - return 0; - } - }; - - public static final Comparator SORT_BY_ID = new Comparator() { - @Override - public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { - if(o1.itemId < o2.itemId) return -1; if(o1.itemId > o2.itemId) return 1; - if(o1.meta < o2.meta) return -1; if(o1.meta > o2.meta) return 1; - if(o1.stacksize > o2.stacksize) return -1; if(o1.stacksize < o2.stacksize) return 1; - if(o1.nbt == null && o2.nbt != null) return -1; if(o1.nbt != null && o2.nbt == null) return 1; - return 0; - } - }; - - public static final Comparator SORT_BY_INTERNAL = new Comparator() { - @Override - public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { - String name1 = o1.displayStack.getItem().getUnlocalizedName(o1.displayStack); - String name2 = o2.displayStack.getItem().getUnlocalizedName(o2.displayStack); - int compare = name1.compareToIgnoreCase(name2); - if(compare != 0) return compare; - return SORT_BY_ID.compare(o1, o2); - } - }; - - public static final Comparator SORT_BY_LOCALIZED = new Comparator() { - @Override - public int compare(CacheSlotDummy o1, CacheSlotDummy o2) { - String name1 = o1.displayStack.getItem().getItemStackDisplayName(o1.displayStack); - String name2 = o2.displayStack.getItem().getItemStackDisplayName(o2.displayStack); - int compare = name1.compareToIgnoreCase(name2); - if(compare != 0) return compare; - return SORT_BY_ID.compare(o1, o2); - } - }; - - protected static Comparator sorter = SORT_BY_STACK_SIZE; - - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - return null; - } -} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index e3bc9e05c..f2016b39e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -7,7 +7,6 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import static com.hbm.inventory.gui.element.GUIElements.*; -import com.hbm.inventory.container.ContainerPneumoStorageAccessMK2; import com.hbm.inventory.container.ContainerPneumoStorageAccess; import com.hbm.inventory.container.ContainerPneumoStorageAccess.SlotPneumo; import com.hbm.inventory.gui.element.GUIElements; @@ -30,7 +29,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_pneumatic_access.png"); protected TileEntityPneumoStorageAccess access; - protected ContainerPneumoStorageAccessMK2 container; + protected ContainerPneumoStorageAccess container; protected GuiTextField search; protected int scrollIndex = 0; @@ -43,8 +42,8 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { protected static boolean startFocussed = false; public GUIPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { - super(new ContainerPneumoStorageAccessMK2(invPlayer, access)); - this.container = (ContainerPneumoStorageAccessMK2) this.inventorySlots; + super(new ContainerPneumoStorageAccess(invPlayer, access)); + this.container = (ContainerPneumoStorageAccess) this.inventorySlots; this.access = access; this.xSize = 176 + 34; diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index cb22a3c3c..861da5e38 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -264,7 +264,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.electrolyzer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_electrolyser, 1)) .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate(), 16), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); - this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) + this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg, 1)) .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plateCast(), 2), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.drill_titanium, 1)) diff --git a/src/main/java/com/hbm/items/machine/ItemBatterySC.java b/src/main/java/com/hbm/items/machine/ItemBatterySC.java index 691b60b1a..db2fc8a6f 100644 --- a/src/main/java/com/hbm/items/machine/ItemBatterySC.java +++ b/src/main/java/com/hbm/items/machine/ItemBatterySC.java @@ -6,6 +6,7 @@ import com.hbm.items.ItemEnumMulti; import com.hbm.main.MainRegistry; import com.hbm.util.BobMathUtil; import com.hbm.util.EnumUtil; +import com.hbm.util.i18n.I18nUtil; import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; @@ -58,5 +59,9 @@ public class ItemBatterySC extends ItemEnumMulti implements IBatteryItem { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { EnumBatterySC pack = EnumUtil.grabEnumSafely(EnumBatterySC.class, stack.getItemDamage()); if(pack.power > 0) list.add(EnumChatFormatting.YELLOW + "Discharge rate: " + BobMathUtil.getShortNumber(pack.power) + "HE/t"); + + for(String line : I18nUtil.resolveKeyArray(this.getUnlocalizedName() + ".desc")) { + list.add(EnumChatFormatting.RED + line); + } } } diff --git a/src/main/java/com/hbm/items/special/ItemStarterKit.java b/src/main/java/com/hbm/items/special/ItemStarterKit.java index 8be4b13ef..bd9cc77e7 100644 --- a/src/main/java/com/hbm/items/special/ItemStarterKit.java +++ b/src/main/java/com/hbm/items/special/ItemStarterKit.java @@ -108,7 +108,7 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.reactor_research, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_turbine, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_radgen, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_rtg_grey, 1)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_rtg, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembly_machine, 3)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemical_plant, 2)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_fluidtank, 1)); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index a8a5f5251..a97f4d088 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -307,7 +307,6 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineCrystallizer.class, new RenderCrystallizer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMicrowave.class, new RenderMicrowave()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRTG.class, new RenderRTG()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineMiniRTG.class, new RenderRTG()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFF.class, new RenderForceField()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityForceField.class, new RenderMachineForceField()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineFENSU.class, new RenderFENSU()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index c01312845..0f4b640a6 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1629,6 +1629,8 @@ public class MainRegistry { ignoreMappings.add("hbm:item.coil_advanced_alloy"); ignoreMappings.add("hbm:item.coil_advanced_torus"); ignoreMappings.add("hbm:item.blades_advanced_alloy"); + ignoreMappings.add("hbm:tile.machine_minirtg"); + ignoreMappings.add("hbm:tile.machine_powerrtg"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 8347de40f..16ea81e66 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -672,8 +672,6 @@ public class ResourceManager { //RTG public static final ResourceLocation rtg_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rtg.png"); - public static final ResourceLocation rtg_cell_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rtg_cell.png"); - public static final ResourceLocation rtg_polonium_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rtg_polonium.png"); //Waste Drum public static final ResourceLocation waste_drum_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/drum_gray.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderRTG.java b/src/main/java/com/hbm/render/tileentity/RenderRTG.java index 71198573c..d9d0c0de1 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRTG.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRTG.java @@ -2,7 +2,6 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; -import com.hbm.blocks.ModBlocks; import com.hbm.lib.Library; import com.hbm.main.ResourceManager; @@ -13,48 +12,43 @@ public class RenderRTG extends TileEntitySpecialRenderer { @Override public void renderTileEntityAt(TileEntity te, double x, double y, double z, float inter) { - - GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5D, y, z + 0.5D); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_CULL_FACE); + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); GL11.glRotatef(180, 0F, 1F, 0F); - - if(te.getBlockType() == ModBlocks.machine_rtg_grey) - bindTexture(ResourceManager.rtg_tex); - else if(te.getBlockType() == ModBlocks.machine_powerrtg) - bindTexture(ResourceManager.rtg_polonium_tex); - else - bindTexture(ResourceManager.rtg_cell_tex); - - ResourceManager.rtg.renderPart("Gen"); - - int ix = te.xCoord; - int iy = te.yCoord; - int iz = te.zCoord; - if(Library.canConnect(te.getWorldObj(), ix + 1, iy, iz, Library.POS_X)) - ResourceManager.rtg.renderPart("Connector"); - - if(Library.canConnect(te.getWorldObj(), ix - 1, iy, iz, Library.NEG_X)) { - GL11.glRotatef(180, 0F, 1F, 0F); - ResourceManager.rtg.renderPart("Connector"); - GL11.glRotatef(-180, 0F, 1F, 0F); - } - - if(Library.canConnect(te.getWorldObj(), ix, iy, iz - 1, Library.NEG_Z)) { - GL11.glRotatef(90, 0F, 1F, 0F); - ResourceManager.rtg.renderPart("Connector"); - GL11.glRotatef(-90, 0F, 1F, 0F); - } - - if(Library.canConnect(te.getWorldObj(), ix, iy, iz + 1, Library.POS_Z)) { - GL11.glRotatef(-90, 0F, 1F, 0F); - ResourceManager.rtg.renderPart("Connector"); - GL11.glRotatef(90, 0F, 1F, 0F); - } + bindTexture(ResourceManager.rtg_tex); - GL11.glPopMatrix(); + ResourceManager.rtg.renderPart("Gen"); + + int ix = te.xCoord; + int iy = te.yCoord; + int iz = te.zCoord; + + if(Library.canConnect(te.getWorldObj(), ix + 1, iy, iz, Library.POS_X)) + ResourceManager.rtg.renderPart("Connector"); + + if(Library.canConnect(te.getWorldObj(), ix - 1, iy, iz, Library.NEG_X)) { + GL11.glRotatef(180, 0F, 1F, 0F); + ResourceManager.rtg.renderPart("Connector"); + GL11.glRotatef(-180, 0F, 1F, 0F); + } + + if(Library.canConnect(te.getWorldObj(), ix, iy, iz - 1, Library.NEG_Z)) { + GL11.glRotatef(90, 0F, 1F, 0F); + ResourceManager.rtg.renderPart("Connector"); + GL11.glRotatef(-90, 0F, 1F, 0F); + } + + if(Library.canConnect(te.getWorldObj(), ix, iy, iz + 1, Library.POS_Z)) { + GL11.glRotatef(-90, 0F, 1F, 0F); + ResourceManager.rtg.renderPart("Connector"); + GL11.glRotatef(90, 0F, 1F, 0F); + } + + GL11.glPopMatrix(); } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index f0b1c29e8..b343c854e 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -179,7 +179,6 @@ public class TileMappings { put(TileEntityMachineMiningLaser.class, "tileentity_mining_laser"); put(TileEntityNukeBalefire.class, "tileentity_nuke_fstbmb"); put(TileEntityMicrowave.class, "tileentity_microwave"); - put(TileEntityMachineMiniRTG.class, "tileentity_mini_rtg"); put(TileEntityBlockICF.class, "tileentity_block_icf"); put(TileEntityICFPress.class, "tileentity_icf_press"); put(TileEntityICFController.class, "tileentity_icf_controller"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java deleted file mode 100644 index ba194d48d..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.hbm.tileentity.machine; - -import com.hbm.blocks.ModBlocks; -import com.hbm.tileentity.TileEntityLoadedBase; -import com.hbm.util.CompatEnergyControl; - -import api.hbm.energymk2.IEnergyProviderMK2; -import api.hbm.tile.IInfoProviderEC; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyProviderMK2, IInfoProviderEC { - - public long power; - boolean tact = false; - - @Override - public void updateEntity() { - - if(!worldObj.isRemote) { - - power += this.getOutput(); - - if(power > getMaxPower()) - power = getMaxPower(); - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - } - } - } - - public long getOutput() { - if(this.getBlockType() == ModBlocks.machine_powerrtg) return 2_500; - return 700; - } - - @Override - public long getMaxPower() { - if(this.getBlockType() == ModBlocks.machine_powerrtg) return 50_000; - return 1_400; - } - - @Override - public long getPower() { - return power; - } - - @Override - public void setPower(long i) { - power = i; - } - - - @Override - public void provideExtraInfo(NBTTagCompound data) { - data.setBoolean(CompatEnergyControl.B_ACTIVE, true); - data.setDouble(CompatEnergyControl.D_OUTPUT_HE, this.getOutput()); - } -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index 51a4a8e11..30a686426 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -270,7 +270,8 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC // function of SHS produced per tick // (heat - 10256)/100000 * steamFill (max efficiency at 14b) * 25 * 5 (should get rid of any rounding errors) if(this.heat > 10256) { - int cycle = (int)((((float)heat - 10256F) / (float)maxHeat) * Math.min(((float)carbonDioxide.getFill() / 14000F), 1F) * 25F * 5F); + float mult = 7.5F; // was 5 originally + int cycle = (int)((((float)heat - 10256F) / (float)maxHeat) * Math.min(((float)carbonDioxide.getFill() / 14000F), 1F) * 25F * mult); this.output = cycle; water.setFill(water.getFill() - cycle); diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java index d59a9d658..140b396de 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java @@ -1,6 +1,6 @@ package com.hbm.tileentity.network.pneumatic; -import com.hbm.inventory.container.ContainerPneumoStorageAccessMK2; +import com.hbm.inventory.container.ContainerPneumoStorageAccess; import com.hbm.inventory.gui.GUIPneumoStorageAccess; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; @@ -75,6 +75,6 @@ public class TileEntityPneumoStorageAccess extends TileEntityLoadedBase implemen return dir == selfdir.getOpposite(); } - @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageAccessMK2(player.inventory, this); } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageAccess(player.inventory, this); } @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageAccess(player.inventory, this); } } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 265646379..10b6b3264 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2016,13 +2016,7 @@ item.battery_sc.pu238.name=Plutonium-238 Self-Charging Battery item.battery_sc.ra226.name=Radium-226 Self-Charging Battery item.battery_sc.tc99.name=Technetium-99 Self-Charging Battery item.battery_sc.waste.name=Spent Fuel Self-Charging Battery -item.battery_sc_americium.name=Self-Charging Americium-241 Battery (LEGACY) -item.battery_sc_gold.name=Self-Charging Gold-198 Battery (LEGACY) -item.battery_sc_lead.name=Self-Charging Lead-209 Battery (LEGACY) -item.battery_sc_plutonium.name=Self-Charging Plutonium-238 Battery (LEGACY) -item.battery_sc_polonium.name=Self-Charging Polonium-210 Battery (LEGACY) -item.battery_sc_technetium.name=Self-Charging Technetium-99 Battery (LEGACY) -item.battery_sc_uranium.name=Self-Charging Uranium-238 Battery (LEGACY) +item.battery_sc.desc=Radiovoltaic devices are not suitable for$battery sockets! Power output may$be unreliable, and hazardous arcing$may occur! item.battery_schrabidium.name=Schrabidium Battery (LEGACY) item.battery_schrabidium_cell.name=Schrabidium Power Cell (LEGACY) item.battery_schrabidium_cell_2.name=Double Schrabidium Power Cell (LEGACY) From 62ef4554327362a5e82a274c3363fd61886b78b8 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 19 Jun 2026 15:00:39 +0200 Subject: [PATCH 025/107] 'smuth --- changelog | 4 +++- src/main/java/com/hbm/crafting/ToolRecipes.java | 6 +++--- src/main/java/com/hbm/inventory/OreDictManager.java | 4 ++-- .../com/hbm/inventory/recipes/AssemblyMachineRecipes.java | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/changelog b/changelog index 8ffdbccb2..c9e872645 100644 --- a/changelog +++ b/changelog @@ -26,4 +26,6 @@ * Fixed broken thorium ore centrifuging recipe shown in NEI * Fixed industrial turbine not properly saving its energy values, causing the flywheel to stop on relog * Fixed lapis dust to cobalt shredder recipe not using oredict -* Fixed AUTOCAL's file opening buttons not working on some systems, it will fall back to opening the folder instead \ No newline at end of file +* Fixed AUTOCAL's file opening buttons not working on some systems, it will fall back to opening the folder instead +* Fixed some recipes not using ore dict when they should +* Fixed `anyBismoid` group not being a proper group, causing other mods' bismuth and arsenic to not be included \ No newline at end of file diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 1640cae61..abe8c9dec 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -68,14 +68,14 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.dwarven_pickaxe, 1), new Object[] { "CIC", " S ", " S ", 'C', CU.ingot(), 'I', IRON.ingot(), 'S', KEY_STICK }); //Super pickaxes - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bismuth_pickaxe, 1), new Object[] { " BM", "BPB", "TB ", 'B', ModItems.ingot_bismuth, 'M', ModItems.ingot_meteorite, 'P', ModItems.starmetal_pickaxe, 'T', W.bolt() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bismuth_pickaxe, 1), new Object[] { " BM", "BPB", "TB ", 'B', BI.ingot(), 'M', ModItems.ingot_meteorite, 'P', ModItems.starmetal_pickaxe, 'T', W.bolt() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.volcanic_pickaxe, 1), new Object[] { " BM", "BPB", "TB ", 'B', ModItems.gem_volcanic, 'M', ModItems.ingot_meteorite, 'P', ModItems.starmetal_pickaxe, 'T', W.bolt() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.chlorophyte_pickaxe, 1), new Object[] { " SD", "APS", "FA ", 'S', ModItems.blades_steel, 'D', ModItems.powder_chlorophyte, 'A', FIBER.ingot(), 'P', ModItems.bismuth_pickaxe, 'F', DURA.bolt() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.chlorophyte_pickaxe, 1), new Object[] { " SD", "APS", "FA ", 'S', ModItems.blades_steel, 'D', ModItems.powder_chlorophyte, 'A', FIBER.ingot(), 'P', ModItems.volcanic_pickaxe, 'F', DURA.bolt() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.mese_pickaxe, 1), new Object[] { " SD", "APS", "FA ", 'S', ModItems.blades_desh, 'D', ModItems.powder_dineutronium, 'A', ModItems.plate_paa, 'P', ModItems.chlorophyte_pickaxe, 'F', ModItems.shimmer_handle }); //Super Axes - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bismuth_axe, 1), new Object[] { " BM", "BPB", "TB ", 'B', ModItems.ingot_bismuth, 'M', ModItems.ingot_meteorite, 'P', ModItems.starmetal_axe, 'T', W.bolt() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bismuth_axe, 1), new Object[] { " BM", "BPB", "TB ", 'B', BI.ingot(), 'M', ModItems.ingot_meteorite, 'P', ModItems.starmetal_axe, 'T', W.bolt() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.volcanic_axe, 1), new Object[] { " BM", "BPB", "TB ", 'B', ModItems.gem_volcanic, 'M', ModItems.ingot_meteorite, 'P', ModItems.starmetal_axe, 'T', W.bolt() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.chlorophyte_axe, 1), new Object[] { " SD", "APS", "FA ", 'S', ModItems.blades_steel, 'D', ModItems.powder_chlorophyte, 'A', FIBER.ingot(), 'P', ModItems.bismuth_axe, 'F', DURA.bolt() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.chlorophyte_axe, 1), new Object[] { " SD", "APS", "FA ", 'S', ModItems.blades_steel, 'D', ModItems.powder_chlorophyte, 'A', FIBER.ingot(), 'P', ModItems.volcanic_axe, 'F', DURA.bolt() }); @@ -111,7 +111,7 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.oil_detector, 1), new Object[] { "W I", "WCI", "PPP", 'W', GOLD.wireFine(), 'I', CU.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ANALOG), 'P', STEEL.plate() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.turret_chip, 1), new Object[] { "WWW", "CPC", "WWW", 'W', GOLD.wireFine(), 'P', ANY_PLASTIC.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.survey_scanner, 1), new Object[] { "SWS", " G ", "PCP", 'W', GOLD.wireFine(), 'P', ANY_PLASTIC.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'S', STEEL.plate(), 'G', GOLD.ingot() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.geiger_counter, 1), new Object[] { "GPP", "WCS", "WBB", 'W', GOLD.wireFine(), 'P', ANY_RUBBER.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'G', GOLD.ingot(), 'S', STEEL.plate(), 'B', ModItems.ingot_beryllium }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.geiger_counter, 1), new Object[] { "GPP", "WCS", "WBB", 'W', GOLD.wireFine(), 'P', ANY_RUBBER.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'G', GOLD.ingot(), 'S', STEEL.plate(), 'B', BE.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.dosimeter, 1), new Object[] { "WGW", "WCW", "WBW", 'W', KEY_PLANKS, 'G', KEY_ANYPANE, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE), 'B', BE.ingot() }); CraftingManager.addShapelessAuto(new ItemStack(ModBlocks.geiger), new Object[] { ModItems.geiger_counter }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.digamma_diagnostic), new Object[] { ModItems.geiger_counter, PO210.billet(), ASBESTOS.ingot() }); diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index f3b7bb742..ae0b7e181 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -320,7 +320,7 @@ public class OreDictManager { public static final DictFrame ANY_CONCRETE = new DictFrame("Concrete"); //no any prefix means that any has to be appended with the any() or anys() getters, registering works with the any (i.e. no shape) setter public static final DictGroup ANY_TAR = new DictGroup("Tar", KEY_OIL_TAR, KEY_COAL_TAR, KEY_CRACK_TAR, KEY_WOOD_TAR); /** Any special post-RBMK gating material, namely bismuth and arsenic */ - public static final DictFrame ANY_BISMOID = new DictFrame("AnyBismoid"); + public static final DictGroup ANY_BISMOID = new DictGroup("AnyBismoid"); public static final DictFrame ANY_ASH = new DictFrame("Ash"); @@ -501,7 +501,6 @@ public class OreDictManager { for(int i = 0; i < 16; i++) { ANY_CONCRETE.any(new ItemStack(ModBlocks.concrete_colored, 1, i)); } for(int i = 0; i < 16; i++) { ANY_CONCRETE.any(new ItemStack(ModBlocks.concrete_colored_ext, 1, i)); } ANY_COKE .gem(fromAll(coke, EnumCokeType.class)).block(fromAll(block_coke, EnumCokeType.class)); - ANY_BISMOID .ingot(ingot_bismuth, ingot_arsenic).nugget(nugget_bismuth, nugget_arsenic).block(block_bismuth); ANY_ASH .any(fromOne(ModItems.powder_ash, EnumAshType.WOOD), fromOne(ModItems.powder_ash, EnumAshType.COAL), fromOne(ModItems.powder_ash, EnumAshType.MISC), fromOne(ModItems.powder_ash, EnumAshType.FLY), fromOne(ModItems.powder_ash, EnumAshType.SOOT)); /* @@ -666,6 +665,7 @@ public class OreDictManager { .addPrefix(LIGHTBARREL, true).addPrefix(HEAVYBARREL, true).addPrefix(LIGHTRECEIVER, true).addPrefix(HEAVYRECEIVER, true); ANY_BISMOIDBRONZE.addPrefix(INGOT, true).addPrefix(CASTPLATE, true).addPrefix(LIGHTBARREL, true).addPrefix(HEAVYBARREL, true).addPrefix(LIGHTRECEIVER, true).addPrefix(HEAVYRECEIVER, true); ANY_TAR.addPrefix(ANY, false); + ANY_BISMOID.addPrefix(NUGGET, true).addPrefix(INGOT, true).addPrefix(BLOCK, true); } private static boolean recursionBrake = false; diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 861da5e38..f812b42cc 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -398,7 +398,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal())) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 3), new OreDictStack(GOLD.wireDense(), 16), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal())) + .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal())) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.turbine_tungsten, 2), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.hephaestus").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hephaestus, 1)) .inputItems(new OreDictStack(STEEL.pipe(), 12), new OreDictStack(STEEL.ingot(), 24), new OreDictStack(CU.plate(), 24), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16)) From 7fdd48f29f7161b37d57819d2cb7f9b989e174a4 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sat, 20 Jun 2026 18:36:37 +0200 Subject: [PATCH 026/107] storag --- changelog | 3 +- .../api/hbm/ntl/ISlotMonitorProvider.java | 3 + src/main/java/api/hbm/ntl/StackCache.java | 1 + .../network/pneumatic/PneumoStorageMono.java | 16 +- .../com/hbm/inventory/OreDictManager.java | 2 +- .../container/ContainerPneumoStorageMono.java | 52 +++++ .../inventory/gui/GUIPneumoStorageAccess.java | 2 +- .../gui/GUIPneumoStorageClutter.java | 9 + .../inventory/gui/GUIPneumoStorageMono.java | 77 ++++++++ .../com/hbm/inventory/gui/GUIPneumoTube.java | 23 +-- .../hbm/inventory/gui/GuiInfoContainer.java | 9 + .../render/tileentity/RenderRBMKGauge.java | 4 +- .../hbm/tileentity/TileEntityDoorGeneric.java | 1 + .../java/com/hbm/tileentity/TileMappings.java | 2 + .../TileEntityPneumaticStorageBase.java | 183 ++++++++++++++++++ .../TileEntityPneumoStorageClutter.java | 113 +---------- .../TileEntityPneumoStorageMono.java | 89 +++++++++ src/main/java/com/hbm/util/BobMathUtil.java | 30 +-- src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 4 + .../gui/storage/gui_pneumatic_mono.png | Bin 0 -> 2077 bytes 21 files changed, 480 insertions(+), 147 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIPneumoStorageMono.java create mode 100644 src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java create mode 100644 src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java create mode 100644 src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_mono.png diff --git a/changelog b/changelog index c9e872645..a59d61d30 100644 --- a/changelog +++ b/changelog @@ -28,4 +28,5 @@ * Fixed lapis dust to cobalt shredder recipe not using oredict * Fixed AUTOCAL's file opening buttons not working on some systems, it will fall back to opening the folder instead * Fixed some recipes not using ore dict when they should -* Fixed `anyBismoid` group not being a proper group, causing other mods' bismuth and arsenic to not be included \ No newline at end of file +* Fixed `anyBismoid` group not being a proper group, causing other mods' bismuth and arsenic to not be included +* Fixed RoR gauge not using SI suffixes on values below 0 \ No newline at end of file diff --git a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java index 8cbdf135b..da57797ba 100644 --- a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java +++ b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java @@ -30,6 +30,9 @@ public interface ISlotMonitorProvider { /** Sets the slot contents, returns the number of items that couldn't be added */ public long setupType(int index, ItemStack zeroStack, long amount); + /** Whether this container allows types to be set via the access terminal */ + public boolean allowTypeSetting(); + /** Whether this storage unit is reachable by the access point */ public boolean isAvailableToCache(StackCache cache); diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index 225164256..f7ef2fc4b 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -90,6 +90,7 @@ public class StackCache { CacheSlot nullCache = this.cacheSlots.get(getNullIdentity()); if(nullCache != null) { // quite ironic, isn't it? for(SlotMonitor monitor : nullCache.monitors) { + if(!monitor.parent.allowTypeSetting()) continue; if(monitor.parent.getSlotAt(monitor.index) != null) continue; amount = monitor.parent.setupType(monitor.index, stack, amount); if(amount <= 0) break; diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageMono.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageMono.java index 47428aff2..898af831e 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageMono.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageMono.java @@ -1,7 +1,12 @@ package com.hbm.blocks.network.pneumatic; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageMono; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -13,7 +18,16 @@ public class PneumoStorageMono extends BlockContainer { @Override public TileEntity createNewTileEntity(World world, int meta) { - return null; + return new TileEntityPneumoStorageMono(); } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) return true; + if(!player.isSneaking()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } + return false; + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index ae0b7e181..32fa4d16c 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -320,7 +320,7 @@ public class OreDictManager { public static final DictFrame ANY_CONCRETE = new DictFrame("Concrete"); //no any prefix means that any has to be appended with the any() or anys() getters, registering works with the any (i.e. no shape) setter public static final DictGroup ANY_TAR = new DictGroup("Tar", KEY_OIL_TAR, KEY_COAL_TAR, KEY_CRACK_TAR, KEY_WOOD_TAR); /** Any special post-RBMK gating material, namely bismuth and arsenic */ - public static final DictGroup ANY_BISMOID = new DictGroup("AnyBismoid"); + public static final DictGroup ANY_BISMOID = new DictGroup("AnyBismoid", BI, AS); public static final DictFrame ANY_ASH = new DictFrame("Ash"); diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java new file mode 100644 index 000000000..5d7523014 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java @@ -0,0 +1,52 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotPattern; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageMono; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerPneumoStorageMono extends ContainerBase { + + public ContainerPneumoStorageMono(InventoryPlayer invPlayer, TileEntityPneumoStorageMono storage) { + super(invPlayer, storage); + + for(int i = 0; i < 3; i++) { + this.addSlotToContainer(new SlotPattern(storage, i, 8, 17 + i * 18)); + } + + playerInv(invPlayer, 99); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot) { + return null; + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + //L/R: 0 + //M3: 3 + //SHIFT: 1 + //DRAG: 5 + + if(index < 0 || index >= 3) { + return super.slotClick(index, button, mode, player); + } + + TileEntityPneumoStorageMono mono = (TileEntityPneumoStorageMono) this.tile; + if(mono.amounts[index] > 0) return null; + + Slot slot = this.getSlot(index); + + ItemStack ret = null; + ItemStack held = player.inventory.getItemStack(); + + if(slot.getHasStack()) ret = slot.getStack().copy(); + slot.putStack(held); + return ret; + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java index f2016b39e..0a904dada 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageAccess.java @@ -137,7 +137,7 @@ public class GUIPneumoStorageAccess extends GuiInfoContainer { @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = "container.pneumoStorageAccess"; + String name = I18n.format("container.pneumoStorageAccess"); this.fontRendererObj.drawString(name, 34 + 176 / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 34 + 8, this.ySize - 96 + 2, 4210752); diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageClutter.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageClutter.java index 39ebd6863..595d31075 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageClutter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageClutter.java @@ -3,8 +3,10 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerPneumoStorageClutter; +import com.hbm.inventory.gui.element.GUIElements; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageClutter; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; @@ -27,11 +29,15 @@ public class GUIPneumoStorageClutter extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { super.drawScreen(x, y, interp); + + this.drawCustomInfoStat(x, y, guiLeft + 174, guiTop + 36, 20, 8, x, y, "Compressor: " + storage.compair.getPressure() + " PU", "Max range: " + TileEntityPneumoTube.getRangeFromPressure(storage.compair.getPressure()) + "m"); } @Override protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); + + clickSendFlag(storage, x, y, 174, 36, 20, 8, "pressure"); } @Override @@ -47,5 +53,8 @@ public class GUIPneumoStorageClutter extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + drawTexturedModalRect(guiLeft + 174 + 4 * (storage.compair.getPressure() - 1), guiTop + 36, 200, 0, 4, 8); + GUIElements.drawSmoothGauge(guiLeft + 184, guiTop + 25, this.zLevel, (double) storage.compair.getFill() / (double) storage.compair.getMaxFill(), 5, 2, 1, 0xCA6C43, 0xAB4223); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageMono.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageMono.java new file mode 100644 index 000000000..a4c0fd348 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageMono.java @@ -0,0 +1,77 @@ +package com.hbm.inventory.gui; + +import java.util.Locale; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerPneumoStorageMono; +import com.hbm.inventory.gui.element.GUIElements; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageMono; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUIPneumoStorageMono extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_pneumatic_mono.png"); + protected TileEntityPneumoStorageMono storage; + + public GUIPneumoStorageMono(InventoryPlayer invPlayer, TileEntityPneumoStorageMono storage) { + super(new ContainerPneumoStorageMono(invPlayer, storage)); + this.storage = storage; + + this.xSize = 200; + this.ySize = 181; + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + this.drawCustomInfoStat(x, y, guiLeft + 174, guiTop + 36, 20, 8, x, y, "Compressor: " + storage.compair.getPressure() + " PU", "Max range: " + TileEntityPneumoTube.getRangeFromPressure(storage.compair.getPressure()) + "m"); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + clickSendFlag(storage, x, y, 174, 36, 20, 8, "pressure"); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.storage.hasCustomInventoryName() ? this.storage.getInventoryName() : I18n.format(this.storage.getInventoryName()); + + this.fontRendererObj.drawString(name, 176 / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + + for(int k = 0; k < 3; k++) { + if(this.storage.slots[k] != null) { + int amount = this.storage.amounts[k]; + String percent = " (" + (((int) (amount * 1000D / (double) storage.CAPACITY)) / 10D) + "%)"; + this.fontRendererObj.drawString(String.format(Locale.US, "%,d", amount) + percent, 50, 22 + k * 18, 0x000000); + } + } + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + for(int i = 0; i < 3; i++) { + if(this.storage.slots[i] != null) { + int bar = this.storage.amounts[i] * 124 / this.storage.CAPACITY; + drawTexturedModalRect(guiLeft + 44, guiTop + 17 + i * 18, 0, 181, bar, 16); + } + } + + drawTexturedModalRect(guiLeft + 174 + 4 * (storage.compair.getPressure() - 1), guiTop + 36, 200, 0, 4, 8); + GUIElements.drawSmoothGauge(guiLeft + 184, guiTop + 25, this.zLevel, (double) storage.compair.getFill() / (double) storage.compair.getMaxFill(), 5, 2, 1, 0xCA6C43, 0xAB4223); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoTube.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoTube.java index aa9f968d3..409e522f1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoTube.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoTube.java @@ -8,17 +8,13 @@ import com.hbm.inventory.container.ContainerPneumoTube; import com.hbm.inventory.gui.element.GUIElements; import com.hbm.lib.RefStrings; import com.hbm.module.ModulePatternMatcher; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube; import com.hbm.uninos.networkproviders.PneumaticNetwork; import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Slot; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; @@ -68,22 +64,13 @@ public class GUIPneumoTube extends GuiInfoContainer { super.mouseClicked(x, y, i); if(!endpointOnly) { - click(x, y, 7, 52, 18, 18, "redstone"); - click(x, y, 6, 36, 20, 8, "pressure"); - click(x, y, 151, 16, 18, 18, "receive"); - click(x, y, 151, 52, 18, 18, "send"); + clickSendFlag(tube, x, y, 7, 52, 18, 18, "redstone"); + clickSendFlag(tube, x, y, 6, 36, 20, 8, "pressure"); + clickSendFlag(tube, x, y, 151, 16, 18, 18, "receive"); + clickSendFlag(tube, x, y, 151, 52, 18, 18, "send"); } - click(x, y, 128, 30, 14, 26, "whitelist"); - } - - public void click(int x, int y, int left, int top, int sizeX, int sizeY, String name) { - if(checkClick(x, y, left, top, sizeX, sizeY)) { - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean(name, true); - PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, tube.xCoord, tube.yCoord, tube.zCoord)); - } + clickSendFlag(tube, x, y, 128, 30, 14, 26, "whitelist"); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index c966dd9f4..f99f75244 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -328,6 +328,15 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); } + public void clickSendFlag(TileEntity tile, int x, int y, int left, int top, int sizeX, int sizeY, String name) { + if(checkClick(x, y, left, top, sizeX, sizeY)) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean(name, true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, tile.xCoord, tile.yCoord, tile.zCoord)); + } + } + ///NEI drag and drop support @Override @Optional.Method(modid = "NotEnoughItems") diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKGauge.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKGauge.java index 0b8052969..55503d662 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKGauge.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKGauge.java @@ -74,8 +74,8 @@ public class RenderRBMKGauge extends TileEntitySpecialRenderer { int height = font.FONT_HEIGHT; double lineScale = 0.0025D; - String lineLower = unit.min <= 10_000 ? unit.min + "" : BobMathUtil.getShortNumber(unit.min); - String lineUpper = unit.max <= 10_000 ? unit.max + "" : BobMathUtil.getShortNumber(unit.max); + String lineLower = Math.abs(unit.min) <= 10_000 ? unit.min + "" : BobMathUtil.getShortNumber(unit.min); + String lineUpper = Math.abs(unit.max) <= 10_000 ? unit.max + "" : BobMathUtil.getShortNumber(unit.max); for(int j = 0; j < 2; j++) { GL11.glPushMatrix(); diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index 0e828407d..29bfb46ae 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -47,6 +47,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { @Override public void updateEntity() { + if(this.getBlockMetadata() < 12) return; if(getDoorType().onDoorUpdate() != null) { getDoorType().onDoorUpdate().accept(this); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index b343c854e..0efef5c6c 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -59,6 +59,7 @@ import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.network.*; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageClutter; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageMono; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube; import com.hbm.tileentity.turret.*; import com.hbm.util.Compat; @@ -474,6 +475,7 @@ public class TileMappings { put(TileEntityPneumoTubePaintable.class, "tileentity_pneumatic_tube_paintable"); put(TileEntityPneumoStorageAccess.class, "tileentity_pneumatic_storage_access"); put(TileEntityPneumoStorageClutter.class, "tileentity_pneumatic_storage_clutter"); + put(TileEntityPneumoStorageMono.class, "tileentity_pneumatic_storage_mono"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); put(TileEntityRadioTorchReceiver.class, "tileentity_rtty_rec"); diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java new file mode 100644 index 000000000..c9dca5229 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java @@ -0,0 +1,183 @@ +package com.hbm.tileentity.network.pneumatic; + +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube.PneumaticNode; +import com.hbm.uninos.UniNodespace; +import com.hbm.uninos.networkproviders.PneumaticNetwork; +import com.hbm.uninos.networkproviders.PneumaticNetworkProvider; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import api.hbm.fluidmk2.IFluidStandardReceiverMK2; +import api.hbm.ntl.IPneumaticConnector; +import api.hbm.ntl.ISlotMonitorProvider; +import api.hbm.ntl.SlotMonitor; +import api.hbm.ntl.StackCache; +import api.hbm.ntl.StackCache.CacheSlot; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class TileEntityPneumaticStorageBase extends TileEntityMachineBase implements IPneumaticConnector, IFluidStandardReceiverMK2, ISlotMonitorProvider, IControlReceiver, IGUIProvider { + + public FluidTank compair; + public SlotMonitor[] monitors; + + protected PneumaticNode node; + protected boolean wasAvailable = false; + + public TileEntityPneumaticStorageBase(int slots) { + super(slots); + this.compair = new FluidTank(Fluids.AIR, 4_000).withPressure(1); + this.monitors = new SlotMonitor[slots]; + + for(int i = 0; i < monitors.length; i++) this.monitors[i] = new SlotMonitor(i, this); + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + + if(data.hasKey("pressure")) { + int pressure = this.compair.getPressure() + 1; + if(pressure > 5) pressure = 1; + this.compair.setTankType(Fluids.AIR); + this.compair.withPressure(pressure); + for(SlotMonitor monitor : this.monitors) monitor.availabilityHasChanged(); + } + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + boolean isAvailable = this.isAvailable(); + + if(isAvailable != wasAvailable) { + this.wasAvailable = isAvailable; + for(SlotMonitor monitor : monitors) monitor.availabilityHasChanged(); + } + + if(this.node == null || this.node.expired) { + this.node = (PneumaticNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); + + if(this.node == null || this.node.expired) { + this.node = (PneumaticNode) new PneumaticNode(new BlockPos(xCoord, yCoord, zCoord)).setStandardConnections(xCoord, yCoord, zCoord); + UniNodespace.createNode(worldObj, this.node); + } + } + + if(node != null && !node.expired && node.hasValidNet()) { + this.node.net.storages.add(this); + } + + if(worldObj.getTotalWorldTime() % 10 == 0) for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + this.trySubscribe(compair.getTankType(), worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } + + if(this.compair.getFill() > 0) { + int consumption = (int) Math.ceil(this.compair.getFill() * 17 / this.compair.getMaxFill()) + 3; + this.compair.setFill(Math.max(this.compair.getFill() - consumption, 0)); + } + + this.updateMonitors(); + this.networkPackNT(15); + } + } + + public boolean isAvailable() { + return this.isLoaded && !this.isInvalid() && this.compair.getFill() > 0; + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote) { + + for(SlotMonitor monitor : this.monitors) { + for(CacheSlot cache : monitor.viewedBy) cache.removeMonitor(monitor); + } + + if(this.node != null) { + + if(node.hasValidNet()) { + this.node.net.storages.remove(this); + } + + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); + } + } + } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + for(SlotMonitor monitor : this.monitors) { + for(CacheSlot cache : monitor.viewedBy) cache.removeMonitor(monitor); + } + + if(node != null && node.hasValidNet()) { + this.node.net.storages.remove(this); + } + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + compair.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + compair.deserialize(buf); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.compair.readFromNBT(nbt, "tank"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + this.compair.writeToNBT(nbt, "tank"); + } + + @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return true; } + + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {compair}; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {compair}; } + + @Override public SlotMonitor[] getMonitors() { return monitors; } + @Override public ItemStack getSlotAt(int index) { return this.getStackInSlot(index); } + + @Override + public PneumaticNetwork getRelevantNetwork() { + if(this.node == null || this.node.expired || !this.node.hasValidNet()) return null; + return this.node.net; + } + + @Override + public boolean isAvailableToCache(StackCache cache) { + if(!isAvailable()) return false; + int range = TileEntityPneumoTube.getRangeFromPressure(this.compair.getPressure()); + int dX = xCoord - cache.x; + int dY = yCoord - cache.y; + int dZ = zCoord - cache.z; + return dX * dX + dY * dY + dZ * dZ <= range * range; + } +} diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java index 9ee354b43..cc7b1f798 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java @@ -1,42 +1,22 @@ package com.hbm.tileentity.network.pneumatic; +import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPneumoStorageClutter; -import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIPneumoStorageClutter; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.TileEntityMachineBase; -import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube.PneumaticNode; -import com.hbm.uninos.UniNodespace; -import com.hbm.uninos.networkproviders.PneumaticNetwork; -import com.hbm.uninos.networkproviders.PneumaticNetworkProvider; -import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.fluidmk2.IFluidStandardReceiverMK2; import api.hbm.ntl.IPneumaticConnector; import api.hbm.ntl.ISlotMonitorProvider; -import api.hbm.ntl.SlotMonitor; -import api.hbm.ntl.StackCache; -import api.hbm.ntl.StackCache.CacheSlot; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class TileEntityPneumoStorageClutter extends TileEntityMachineBase implements IPneumaticConnector, IFluidStandardReceiverMK2, ISlotMonitorProvider, IGUIProvider { - - public FluidTank compair; - public SlotMonitor[] monitors; - - protected PneumaticNode node; - protected boolean wasAvailable = false; +public class TileEntityPneumoStorageClutter extends TileEntityPneumaticStorageBase implements IPneumaticConnector, IFluidStandardReceiverMK2, ISlotMonitorProvider, IControlReceiver, IGUIProvider { public TileEntityPneumoStorageClutter() { super(6 * 9); - this.compair = new FluidTank(Fluids.AIR, 4_000).withPressure(1); - this.monitors = new SlotMonitor[6 * 9]; - - for(int i = 0; i < monitors.length; i++) this.monitors[i] = new SlotMonitor(i, this); } @Override @@ -44,79 +24,6 @@ public class TileEntityPneumoStorageClutter extends TileEntityMachineBase implem return "container.pneumoStorageClutter"; } - @Override - public void updateEntity() { - - if(!worldObj.isRemote) { - - boolean isAvailable = this.isAvailable(); - - if(isAvailable != wasAvailable) { - this.wasAvailable = isAvailable; - for(SlotMonitor monitor : monitors) monitor.availabilityHasChanged(); - } - - if(this.node == null || this.node.expired) { - this.node = (PneumaticNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); - - if(this.node == null || this.node.expired) { - this.node = (PneumaticNode) new PneumaticNode(new BlockPos(xCoord, yCoord, zCoord)).setStandardConnections(xCoord, yCoord, zCoord); - UniNodespace.createNode(worldObj, this.node); - } - } - - if(node != null && !node.expired && node.hasValidNet()) { - this.node.net.storages.add(this); - } - - this.updateMonitors(); - this.networkPackNT(15); - } - } - - public boolean isAvailable() { - return this.isLoaded && !this.isInvalid(); - } - - @Override - public void invalidate() { - super.invalidate(); - - if(!worldObj.isRemote) { - - for(SlotMonitor monitor : this.monitors) { - for(CacheSlot cache : monitor.viewedBy) cache.removeMonitor(monitor); - } - - if(this.node != null) { - - if(node.hasValidNet()) { - this.node.net.storages.remove(this); - } - - UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); - } - } - } - - @Override - public void onChunkUnload() { - super.onChunkUnload(); - - for(SlotMonitor monitor : this.monitors) { - for(CacheSlot cache : monitor.viewedBy) cache.removeMonitor(monitor); - } - - if(node != null && node.hasValidNet()) { - this.node.net.storages.remove(this); - } - } - - @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return true; } - - @Override public FluidTank[] getAllTanks() { return new FluidTank[] {compair}; } - @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {compair}; } - @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageClutter(player.inventory, this); @@ -126,21 +33,9 @@ public class TileEntityPneumoStorageClutter extends TileEntityMachineBase implem public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageClutter(player.inventory, this); } - - @Override public SlotMonitor[] getMonitors() { return monitors; } - @Override public ItemStack getSlotAt(int index) { return this.getStackInSlot(index); } + @Override public long getAmountAt(int index) { ItemStack stack = getSlotAt(index); return stack != null ? stack.stackSize : 0; } - - @Override - public PneumaticNetwork getRelevantNetwork() { - if(this.node == null || this.node.expired || !this.node.hasValidNet()) return null; - return this.node.net; - } - - @Override - public boolean isAvailableToCache(StackCache cache) { - return this.isLoaded && !this.isInvalid(); - } + @Override public boolean allowTypeSetting() { return true; } @Override public long useUpItem(int index, long amount) { diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java new file mode 100644 index 000000000..30f7c62e4 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java @@ -0,0 +1,89 @@ +package com.hbm.tileentity.network.pneumatic; + +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.container.ContainerPneumoStorageMono; +import com.hbm.inventory.gui.GUIPneumoStorageMono; +import com.hbm.tileentity.IGUIProvider; + +import api.hbm.fluidmk2.IFluidStandardReceiverMK2; +import api.hbm.ntl.IPneumaticConnector; +import api.hbm.ntl.ISlotMonitorProvider; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class TileEntityPneumoStorageMono extends TileEntityPneumaticStorageBase implements IPneumaticConnector, IFluidStandardReceiverMK2, ISlotMonitorProvider, IControlReceiver, IGUIProvider { + + public static final int CAPACITY = 100_000; + public int[] amounts; + + public TileEntityPneumoStorageMono() { + super(3); + + this.amounts = new int[this.monitors.length]; + } + + @Override + public String getName() { + return "container.pneumoStorageMono"; + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + for(int i = 0; i < amounts.length; i++) buf.writeInt(amounts[i]); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + for(int i = 0; i < amounts.length; i++) amounts[i]= buf.readInt(); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.amounts = nbt.getIntArray("amounts"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setIntArray("amounts", amounts); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerPneumoStorageMono(player.inventory, this); + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIPneumoStorageMono(player.inventory, this); + } + + @Override public long getAmountAt(int index) { return amounts[index]; } + @Override public boolean allowTypeSetting() { return false; } + + @Override + public long useUpItem(int index, long amount) { + if(amounts[index] <= 0) return amount; + int toRemove = (int) Math.min(amount, amounts[index]); + amounts[index] -= toRemove; + return amount - toRemove; + } + + @Override + public long addItem(int index, long amount) { + int capacity = CAPACITY - amounts[index]; + if(capacity <= 0) return amount; + int toAdd = (int) Math.min(amount, capacity); + amounts[index] += toAdd; + return amount - toAdd; + } + + @Override public long setupType(int index, ItemStack zeroStack, long amount) { return amount; } +} diff --git a/src/main/java/com/hbm/util/BobMathUtil.java b/src/main/java/com/hbm/util/BobMathUtil.java index a38522a07..5bb09570e 100644 --- a/src/main/java/com/hbm/util/BobMathUtil.java +++ b/src/main/java/com/hbm/util/BobMathUtil.java @@ -193,32 +193,34 @@ public class BobMathUtil { } public static String getShortNumber(long l) { + double res; - String magnitude_letter = ""; + String suffix = ""; + long abs = Math.abs(l); - if(Math.abs(l) >= Math.pow(10, 18)) { + if(abs >= Math.pow(10, 18)) { res = l / Math.pow(10, 18); - magnitude_letter = "E"; + suffix = "E"; } - else if(Math.abs(l) >= Math.pow(10, 15)) { + else if(abs >= Math.pow(10, 15)) { res = l / Math.pow(10, 15); - magnitude_letter = "P"; + suffix = "P"; } - else if(Math.abs(l) >= Math.pow(10, 12)) { + else if(abs >= Math.pow(10, 12)) { res = l / Math.pow(10, 12); - magnitude_letter = "T"; + suffix = "T"; } - else if(Math.abs(l) >= Math.pow(10, 9)) { + else if(abs >= Math.pow(10, 9)) { res = l / Math.pow(10, 9); - magnitude_letter = "G"; + suffix = "G"; } - else if(Math.abs(l) >= Math.pow(10, 6)) { + else if(abs >= Math.pow(10, 6)) { res = l / Math.pow(10, 6); - magnitude_letter = "M"; + suffix = "M"; } - else if(Math.abs(l) >= Math.pow(10, 3)) { + else if(abs >= Math.pow(10, 3)) { res = l / Math.pow(10, 3); - magnitude_letter = "k"; + suffix = "k"; } else { return Long.toString(l); @@ -231,7 +233,7 @@ public class BobMathUtil { res = Math.round(res * 100.0) / 100.0; } - return res + magnitude_letter; + return res + suffix; } /** diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 043478092..5fadd08b5 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -357,6 +357,8 @@ container.paDipole=Dipol container.paQuadrupole=Quad. container.paSource=Teilchenquelle container.plasmaHeater=Plasmaerhitzer +container.pneumoStorageAccess=PLS Zugangsterminal +container.pneumoStorageClutter=PLS Gerümpelkiste container.pneumoTube=Rohrpost container.press=Befeuerte Presse container.puf6_tank=PuF6 Tank @@ -4736,6 +4738,8 @@ tile.plant_tall.weed.name=Hanf tile.plasma.name=Plasma tile.plasma_heater.name=Plasmaerhitzer tile.plushie.name=%s Plüschfigur +tile.pneumatic_storage_access.name=Pneumatisches Lagersystem - Zugangsterminal +tile.pneumatic_storage_clutter.name=Pneumatisches Lagersystem - Gerümpelkiste tile.pneumatic_tube.name=Rohrpost tile.pneumatic_tube.desc=Sendted Items mit Druckluft.$Rechtsklick mit Schraubenzieher aktiviert den Eingang.$Shift-Rechtskick mit Schrabuenzieher aktiviert den Ausgang.$Eingänge können konfiguriert und mit Druckluft verbunden werden.$Sendet bis zu einem Stack, vier Mal pro Sekunde. tile.pneumatic_tube_paintable.name=Geschirmte Rohrpost (Färbbar) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 10b6b3264..be081a936 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -759,6 +759,8 @@ container.paDipole=Dipole container.paQuadrupole=Quad. container.paSource=Particle Source container.plasmaHeater=Plasma Heater +container.pneumoStorageAccess=PSN Access Terminal +container.pneumoStorageClutter=PSN Clutter Storage container.pneumoTube=Pneumatic Tube container.press=Burner Press container.puf6_tank=PuF6 Tank @@ -5996,6 +5998,8 @@ tile.plant_tall.weed.name=Hemp tile.plasma.name=Plasma tile.plasma_heater.name=Plasma Heater tile.plushie.name=%s Plushie +tile.pneumatic_storage_access.name=Pneumatic Storage Network - Access Terminal +tile.pneumatic_storage_clutter.name=Pneumatic Storage Network - Clutter Storage tile.pneumatic_tube.name=Pneumatic Tube tile.pneumatic_tube.desc=Sends items using compressed air.$Right-click with screwdriver to toggle an input.$Shift right-click with screwdriver to toggle an output.$Inputs can be configured, and connected to compressed air.$Sends up to one stack, four times per second. tile.pneumatic_tube_paintable.name=Paintable Pneumatic Tube diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_mono.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_mono.png new file mode 100644 index 0000000000000000000000000000000000000000..443b32d5fe72a4d869e09641e1f4b5d839460ac8 GIT binary patch literal 2077 zcmbVN2~ZPO8h%L-Fp6v{P;Rn8F%T$Ti$V$kHZ4jmr-pD0K~e!pkfUHC6cVJY$RUg( zw2L7i1+*ODFhGG2L9Q)lpj45wP_7{%;D$p8$p+VTXFFYIXWz`5_h$Z?@BPR3eebrL zi<25$7Y+bWJAV%E0RTjCg#cA$#o-tAC`fTAed&1qqN-wjrTRq*04hJ7$2(l4KM+j} zP{uZOR92m?!kdIR^ipBHn)&kGETiLSjeS0<2Xp7LDFcusys6Mic+awln(Lrm7~r`W zfOPlK*2vRJJ$mnJKj$;5^sXHLDASh?Ip#ezfxdT(Ir+~II2wD&7Ly(>RAkysaq`1W z@5De;Qqb$NSIacL-Nr51u;uJLiEox6yC2w?AerjtOojEvpsLW54c_8*dsTdNnw&o% zKgHhPH^_C9Mzqzs8sZO@r|{*Hp4XoTbylj&r#o<)^C#4a+5>C^am+Lj3XY831yLVI=yhpdO4=1 zrsiaZsm1;0`Kr<4jf&fb(<^b}F22l;1yUAUkljUoAF;6@Hkt7=<-1Ypr(Ywrf4yLz z)7IMRz+aVDRqG%SMqUJCRG_@}X8|u1Ay9+wYK~K z19CcjcPh3TYIJ!P%wKrSAD@l9;1BDr<=yaxxDk`YGD}R^+D>ek&?J)Uld&C6aUbQv z7ZJcbxqicyUz^)AhtBOOO}M5R(dz`@;yFREJXav(fFI|go{Wi77FV`66DFxvMLIm* zP3sHSTZs_+KmyR1OyY~2@a<&-%e!pum`HXTm$U;N3H_6mRnsllat^IMj7-?xX$ z=&zt>MnczrDw*z_54uS3;zWfW_#C(qF&K=1YBf8uur4zz*sR1ki{+wvA9s$m4%!h^ z9r2I%&r|?Nk^-`K2^h1oGI!2Mf3vFhgCkPRq@o5o*KoW1stNhQQWn?mJdQ#*Yxyjq)gnq=iR6(%Jmi#(|5!Skh zFKv}(s4>GgS~3)ywFof@L!W#!O1(2NcjdKT2_)SShciedhJ3iB+TJk=E67sbkzFbq zIgEMMGv5C)e8?TZ%V;H}a8k(7n9f^%Lcs@zLDn~b*{-krUDjV{;$uA4eNd2fNL}5P zg*?3^N>>8O!y%`K@*7TtL78ojC$_BTikpL5O^^raEj!VZo(&#~Hha`LvNSOOzF?Lr zf5u@bMA;`zobQD*+ic8+yuG()G6xYUGkU&{T=PF(!t0;ezhqz=!u2tQOJkyy0t>H# zQ@%FP>cMEGzgpxm-=w4TTP3~8)VyNy>eB~(xryi}f7kdSEjhmr&MdYfN?)e1g7(=L zvNk8;tG40~uPTK2nd=%`5p`_puJK=EE28jJ#%Y5@^yy^VZ>u4z!c5Iuu_Ivxc1kPM4(j&=Q_bl6?4@#n`EQ~v<< zjI_|e?W=8S(!1PYqgkvCXYzQw*L}+Umnjqs3RPEMZ(Ocq5;fBVQjMb4t{~qy$iFA_ z`z^_O@qz-gOOVoMREWO5X)Kn(toFjt>^LuuHWR5GMg{n2ImD#8rNt17#dex*StiyrTWgw|JSEVFjaf$203{Jz@5CNm)^Cyz%90iQ8F8g&vq{M2&U1V zE4U;ffMP6dMe$2TAgn+sd27G0_lj0TWGVyh%(%0d{cwls-@&FBQm$pvBv|+@yZ6fD i_ms28$^Ua5r^r>v&B3)_S_9WTi1VMg;42*iZvF$-PHwya literal 0 HcmV?d00001 From c06957824e2f5f21e4f3c5161eff9762bc86117d Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sun, 21 Jun 2026 18:32:16 +0200 Subject: [PATCH 027/107] shitboner --- src/main/java/api/hbm/ntl/StackCache.java | 2 +- .../container/ContainerPneumoStorageMono.java | 6 +- .../hbm/models/machines/supercomputer.obj | 3229 +++++++++++++++++ .../models/machines/supercomputer.png | Bin 0 -> 2652 bytes .../models/machines/supercomputer_scan.png | Bin 0 -> 113 bytes 5 files changed, 3233 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/hbm/models/machines/supercomputer.obj create mode 100644 src/main/resources/assets/hbm/textures/models/machines/supercomputer.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/supercomputer_scan.png diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index f7ef2fc4b..004ead61a 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -200,7 +200,7 @@ public class StackCache { long identity = Item.getIdFromItem(item) * 27644437; identity += meta; identity *= 27644437; - if(nbt != null) identity += nbt.toString().hashCode(); + if(nbt != null) identity += nbt.hashCode(); return identity; } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java index 5d7523014..a99bb56da 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java @@ -36,11 +36,11 @@ public class ContainerPneumoStorageMono extends ContainerBase { if(index < 0 || index >= 3) { return super.slotClick(index, button, mode, player); } - - TileEntityPneumoStorageMono mono = (TileEntityPneumoStorageMono) this.tile; - if(mono.amounts[index] > 0) return null; + Slot slot = this.getSlot(index); + TileEntityPneumoStorageMono mono = (TileEntityPneumoStorageMono) this.tile; + if(mono.amounts[index] > 0 && slot.getHasStack()) return null; ItemStack ret = null; ItemStack held = player.inventory.getItemStack(); diff --git a/src/main/resources/assets/hbm/models/machines/supercomputer.obj b/src/main/resources/assets/hbm/models/machines/supercomputer.obj new file mode 100644 index 000000000..3d03af43b --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/supercomputer.obj @@ -0,0 +1,3229 @@ +# Blender v2.79 (sub 0) OBJ File: 'supercomputer.blend' +# www.blender.org +o Lights +v -2.078729 1.500000 -0.861038 +v -2.078729 2.000000 -0.861038 +v -1.590990 2.000000 1.590990 +v -1.590990 1.500000 1.590990 +v 0.000000 2.000000 2.250000 +v 0.000000 1.500000 2.250000 +v 2.078729 1.500000 -0.861038 +v 2.078729 2.000000 -0.861038 +v 0.861037 1.500000 -2.078729 +v 0.861037 2.000000 -2.078729 +v -0.861038 2.000000 -2.078729 +v -0.861038 1.500000 -2.078729 +v 2.250000 2.000000 -0.000000 +v 2.250000 1.500000 -0.000000 +v 2.078729 1.500000 0.861038 +v 2.078729 2.000000 0.861038 +v -0.861038 2.000000 2.078729 +v -0.861038 1.500000 2.078729 +v -2.250000 2.000000 0.000000 +v -2.250000 1.500000 0.000000 +v 1.590990 2.000000 -1.590991 +v 1.590990 1.500000 -1.590991 +v -2.078729 2.000000 0.861038 +v -2.078729 1.500000 0.861038 +v 0.861037 1.500000 2.078729 +v 0.861037 2.000000 2.078729 +v 1.590990 2.000000 1.590991 +v 1.590990 1.500000 1.590991 +v 0.000000 2.000000 -2.250000 +v 0.000000 1.500000 -2.250000 +v -1.590990 1.500000 -1.590990 +v -1.590990 2.000000 -1.590990 +vt 0.999900 0.000100 +vt 0.749950 0.996590 +vt 0.749950 0.000100 +vt 0.500000 0.000100 +vt 0.250050 0.996590 +vt 0.250050 0.000100 +vt 0.250000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.750000 1.000000 +vt 0.750000 0.000000 +vt 0.750000 0.000000 +vt 0.500000 1.000000 +vt 0.500000 0.000000 +vt 0.250000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.500000 0.996590 +vt 0.000100 0.996590 +vt 0.000100 0.000100 +vt 0.500000 0.000000 +vt 0.250000 1.000000 +vt 0.750000 0.000000 +vt 0.500000 1.000000 +vt 1.000000 0.000000 +vt 0.750000 1.000000 +vt 0.250000 1.000000 +vt 1.000000 0.000000 +vt 0.750000 1.000000 +vt 0.250000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.250000 1.000000 +vt 0.500000 1.000000 +vt 0.999900 0.996590 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vn 1.0000 0.0000 -0.0000 +vn 0.9239 0.0000 0.3827 +vn 0.7071 0.0000 0.7071 +vn 0.3827 0.0000 0.9239 +vn -0.9239 0.0000 0.3827 +vn -1.0000 0.0000 0.0000 +vn -0.9239 0.0000 -0.3827 +vn 0.3827 0.0000 -0.9239 +vn 0.7071 0.0000 -0.7071 +vn 0.9239 0.0000 -0.3827 +vn -0.0000 0.0000 1.0000 +vn -0.7071 0.0000 0.7071 +vn -0.3827 0.0000 0.9239 +vn -0.0000 0.0000 -1.0000 +vn -0.3827 0.0000 -0.9239 +vn -0.7071 0.0000 -0.7071 +s 1 +f 14/1/1 16/2/2 15/3/2 +f 28/4/3 26/5/4 25/6/4 +f 24/7/5 19/8/6 20/9/6 +f 20/10/6 2/11/7 1/12/7 +f 9/13/8 21/14/9 22/15/9 +f 7/16/10 13/17/1 14/18/1 +f 15/3/2 27/19/3 28/4/3 +f 25/6/4 5/20/11 6/21/11 +f 4/22/12 23/23/5 24/7/5 +f 18/24/13 3/25/12 4/22/12 +f 6/26/11 17/27/13 18/24/13 +f 22/15/9 8/28/10 7/16/10 +f 30/29/14 10/30/8 9/13/8 +f 12/31/15 29/32/14 30/33/14 +f 31/34/16 11/35/15 12/31/15 +f 1/12/7 32/36/16 31/34/16 +f 14/1/1 13/37/1 16/2/2 +f 28/4/3 27/19/3 26/5/4 +f 24/7/5 23/23/5 19/8/6 +f 20/10/6 19/38/6 2/11/7 +f 9/13/8 10/30/8 21/14/9 +f 7/16/10 8/28/10 13/17/1 +f 15/3/2 16/2/2 27/19/3 +f 25/6/4 26/5/4 5/20/11 +f 4/22/12 3/25/12 23/23/5 +f 18/24/13 17/27/13 3/25/12 +f 6/26/11 5/39/11 17/27/13 +f 22/15/9 21/14/9 8/28/10 +f 30/29/14 29/40/14 10/30/8 +f 12/31/15 11/35/15 29/32/14 +f 31/34/16 32/36/16 11/35/15 +f 1/12/7 2/11/7 32/36/16 +o Computer +v -2.500000 0.000000 3.500000 +v 2.500000 0.000000 3.500000 +v -2.500000 0.000000 -3.500000 +v 2.500000 0.000000 -3.500000 +v 3.500000 0.000000 2.500000 +v 3.500000 0.000000 -2.500000 +v -3.500000 0.000000 2.500000 +v -3.500000 0.000000 -2.500000 +v -2.500000 1.000000 3.500000 +v 2.500000 1.000000 3.500000 +v -2.500000 1.000000 -3.500000 +v 2.500000 1.000000 -3.500000 +v 3.500000 1.000000 2.500000 +v 3.500000 1.000000 -2.500000 +v -3.500000 1.000000 2.500000 +v -3.500000 1.000000 -2.500000 +v -2.250000 0.000000 3.000000 +v 2.250000 0.000000 3.000000 +v -2.250000 1.000000 3.000000 +v 2.250000 1.000000 3.000000 +v -2.250000 0.000000 -3.000000 +v 2.250000 0.000000 -3.000000 +v -2.250000 1.000000 -3.000000 +v 2.250000 1.000000 -3.000000 +v 3.000000 0.000000 2.250000 +v 3.000000 0.000000 -2.250000 +v 3.000000 1.000000 2.250000 +v 3.000000 1.000000 -2.250000 +v -3.000000 0.000000 2.250000 +v -3.000000 0.000000 -2.250000 +v -3.000000 1.000000 2.250000 +v -3.000000 1.000000 -2.250000 +v 0.000000 0.500000 -2.000000 +v -0.765367 0.500000 -1.847759 +v -1.414213 0.500000 -1.414214 +v -1.847759 0.500000 -0.765367 +v -2.000000 0.500000 0.000000 +v -1.847759 0.500000 0.765367 +v -1.414213 0.500000 1.414214 +v -0.765367 0.500000 1.847759 +v -0.000000 0.500000 2.000000 +v 0.765367 0.500000 1.847759 +v 1.414213 0.500000 1.414214 +v 1.847759 0.500000 0.765367 +v 2.000000 0.500000 -0.000000 +v 1.847759 0.500000 -0.765367 +v 1.414213 0.500000 -1.414214 +v 0.765366 0.500000 -1.847759 +v 0.000000 2.500000 -2.250000 +v -0.861038 2.500000 -2.078729 +v -1.590990 2.500000 -1.590990 +v -2.078729 2.500000 -0.861038 +v -2.250000 2.500000 0.000000 +v -2.078729 2.500000 0.861038 +v -1.590990 2.500000 1.590990 +v -0.861038 2.500000 2.078729 +v 0.000000 2.500000 2.250000 +v 0.861037 2.500000 2.078729 +v 1.590990 2.500000 1.590991 +v 2.078729 2.500000 0.861038 +v 2.250000 2.500000 -0.000000 +v 2.078729 2.500000 -0.861038 +v 1.590990 2.500000 -1.590991 +v 0.861037 2.500000 -2.078729 +v 0.861037 1.000000 -2.078729 +v 1.590990 1.000000 -1.590991 +v 2.078729 1.000000 -0.861038 +v 2.250000 1.000000 -0.000000 +v 2.078729 1.000000 0.861038 +v 1.590990 1.000000 1.590991 +v 0.861037 1.000000 2.078729 +v 0.000000 1.000000 2.250000 +v -0.861038 1.000000 2.078729 +v -1.590990 1.000000 1.590990 +v -2.078729 1.000000 0.861038 +v -2.250000 1.000000 0.000000 +v -2.078729 1.000000 -0.861038 +v -1.590990 1.000000 -1.590990 +v -0.861038 1.000000 -2.078729 +v 0.000000 1.000000 -2.250000 +v 0.000000 3.000000 -2.000000 +v -0.765367 3.000000 -1.847759 +v -1.414213 3.000000 -1.414214 +v -1.847759 3.000000 -0.765367 +v -2.000000 3.000000 0.000000 +v -1.847759 3.000000 0.765367 +v -1.414213 3.000000 1.414214 +v -0.765367 3.000000 1.847759 +v -0.000000 3.000000 2.000000 +v 0.765367 3.000000 1.847759 +v 1.414213 3.000000 1.414214 +v 1.847759 3.000000 0.765367 +v 2.000000 3.000000 -0.000000 +v 1.847759 3.000000 -0.765367 +v 1.414213 3.000000 -1.414214 +v 0.765366 3.000000 -1.847759 +v 0.861037 7.500000 -2.078729 +v 1.590990 7.500000 -1.590991 +v 2.078729 7.500000 -0.861038 +v 2.250000 7.500000 -0.000000 +v 2.078729 7.500000 0.861038 +v 1.590990 7.500000 1.590991 +v 0.861037 7.500000 2.078729 +v 0.000000 7.500000 2.250000 +v -0.861038 7.500000 2.078729 +v -1.590990 7.500000 1.590990 +v -2.078729 7.500000 0.861038 +v -2.250000 7.500000 0.000000 +v -2.078729 7.500000 -0.861038 +v -1.590990 7.500000 -1.590990 +v -0.861038 7.500000 -2.078729 +v 0.000000 7.500000 -2.250000 +v 0.765366 6.000000 -1.847759 +v 1.414213 6.000000 -1.414214 +v 1.847759 6.000000 -0.765367 +v 2.000000 6.000000 -0.000000 +v 1.847759 6.000000 0.765367 +v 1.414213 6.000000 1.414214 +v 0.765367 6.000000 1.847759 +v -0.000000 6.000000 2.000000 +v -0.765367 6.000000 1.847759 +v -1.414213 6.000000 1.414214 +v -1.847759 6.000000 0.765367 +v -2.000000 6.000000 0.000000 +v -1.847759 6.000000 -0.765367 +v -1.414213 6.000000 -1.414214 +v -0.765367 6.000000 -1.847759 +v 0.000000 6.000000 -2.000000 +v 0.861037 6.500000 -2.078729 +v 1.590990 6.500000 -1.590991 +v 2.078729 6.500000 -0.861038 +v 2.250000 6.500000 -0.000000 +v 2.078729 6.500000 0.861038 +v 1.590990 6.500000 1.590991 +v 0.861037 6.500000 2.078729 +v 0.000000 6.500000 2.250000 +v -0.861038 6.500000 2.078729 +v -1.590990 6.500000 1.590990 +v -2.078729 6.500000 0.861038 +v -2.250000 6.500000 0.000000 +v -2.078729 6.500000 -0.861038 +v -1.590990 6.500000 -1.590990 +v -0.861038 6.500000 -2.078729 +v 0.000000 6.500000 -2.250000 +v 0.000000 8.000000 -2.000000 +v -0.765367 8.000000 -1.847759 +v -1.414213 8.000000 -1.414214 +v -1.847759 8.000000 -0.765367 +v -2.000000 8.000000 0.000000 +v -1.847759 8.000000 0.765367 +v -1.414213 8.000000 1.414214 +v -0.765367 8.000000 1.847759 +v -0.000000 8.000000 2.000000 +v 0.765367 8.000000 1.847759 +v 1.414213 8.000000 1.414214 +v 1.847759 8.000000 0.765367 +v 2.000000 8.000000 -0.000000 +v 1.847759 8.000000 -0.765367 +v 1.414213 8.000000 -1.414214 +v 0.765366 8.000000 -1.847759 +v 0.000000 8.000000 -1.750000 +v -0.669696 8.000000 -1.616789 +v -1.237436 8.000000 -1.237437 +v -1.616789 8.000000 -0.669696 +v -1.750000 8.000000 0.000000 +v -1.616789 8.000000 0.669696 +v -1.237436 8.000000 1.237437 +v -0.669696 8.000000 1.616789 +v 0.000000 8.000000 1.750000 +v 0.669696 8.000000 1.616789 +v 1.237436 8.000000 1.237437 +v 1.616789 8.000000 0.669696 +v 1.750000 8.000000 -0.000000 +v 1.616789 8.000000 -0.669696 +v 1.237436 8.000000 -1.237437 +v 0.669695 8.000000 -1.616790 +v 0.000000 7.500000 -1.750000 +v -0.669696 7.500000 -1.616789 +v -1.237436 7.500000 -1.237437 +v -1.616789 7.500000 -0.669696 +v -1.750000 7.500000 0.000000 +v -1.616789 7.500000 0.669696 +v -1.237436 7.500000 1.237437 +v -0.669696 7.500000 1.616789 +v 0.000000 7.500000 1.750000 +v 0.669696 7.500000 1.616789 +v 1.237436 7.500000 1.237437 +v 1.616789 7.500000 0.669696 +v 1.750000 7.500000 -0.000000 +v 1.616789 7.500000 -0.669696 +v 1.237436 7.500000 -1.237437 +v 0.669695 7.500000 -1.616790 +v 1.500000 5.500000 3.500000 +v 1.500000 6.000000 3.500000 +v 1.500000 5.500000 3.000000 +v 1.500000 6.000000 3.000000 +v -1.500000 5.500000 3.500000 +v -1.500000 6.000000 3.500000 +v -1.500000 5.500000 3.000000 +v -1.500000 6.000000 3.000000 +v 2.500000 1.000000 3.000000 +v 2.000000 1.000000 3.000000 +v 2.500000 1.000000 3.500000 +v 2.000000 1.000000 3.500000 +v 2.000000 5.000000 3.500000 +v 2.500000 5.000000 3.500000 +v 2.000000 5.000000 3.000000 +v 2.500000 5.000000 3.000000 +v -2.000000 5.000000 3.000000 +v -2.500000 5.000000 3.000000 +v -2.000000 5.000000 3.500000 +v -2.500000 5.000000 3.500000 +v -2.500000 1.000000 3.500000 +v -2.000000 1.000000 3.500000 +v -2.500000 1.000000 3.000000 +v -2.000000 1.000000 3.000000 +v 1.000000 6.000000 3.000000 +v -1.000000 6.000000 3.000000 +v 1.000000 6.000000 3.500000 +v -1.000000 6.000000 3.500000 +v -1.000000 7.250000 1.875000 +v 1.000000 7.250000 1.875000 +v -1.000000 6.750000 1.875000 +v 1.000000 6.750000 1.875000 +v 1.000000 6.750000 2.750000 +v -1.000000 6.750000 2.750000 +v 1.000000 7.250000 2.750000 +v -1.000000 7.250000 2.750000 +v -1.000000 6.500000 3.500000 +v 1.000000 6.500000 3.500000 +v -1.000000 6.500000 3.000000 +v 1.000000 6.500000 3.000000 +v -1.500000 0.000000 8.500000 +v 1.500000 0.000000 8.500000 +v -1.500000 0.000000 3.500000 +v 1.500000 0.000000 3.500000 +v -1.500000 1.000000 3.500000 +v -1.500000 1.000000 8.500000 +v 1.500000 1.000000 8.500000 +v 1.500000 1.000000 3.500000 +v -1.250000 1.000000 3.500000 +v -1.250000 1.000000 8.500000 +v 1.250000 1.000000 8.500000 +v 1.250000 1.000000 3.500000 +v -1.250000 2.500000 3.500000 +v -1.250000 2.500000 8.500000 +v 1.250000 2.500000 8.500000 +v 1.250000 2.500000 3.500000 +v -1.250000 1.000000 8.375000 +v 1.250000 1.000000 8.375000 +v -1.250000 2.500000 8.375000 +v 1.250000 2.500000 8.375000 +v -1.375000 1.000000 8.375000 +v -1.375000 2.500000 8.375000 +v -1.250000 2.625000 8.375000 +v 1.250000 2.625000 8.375000 +v 1.375000 1.000000 8.375000 +v 1.375000 2.500000 8.375000 +v -1.250000 2.500000 8.125000 +v 1.250000 2.500000 8.125000 +v -1.250000 1.000000 8.125000 +v 1.250000 1.000000 8.125000 +v -1.375000 1.000000 8.125000 +v -1.375000 2.500000 8.125000 +v -1.250000 2.625000 8.125000 +v 1.250000 2.625000 8.125000 +v 1.375000 1.000000 8.125000 +v 1.375000 2.500000 8.125000 +v -0.750000 2.500000 7.500000 +v 0.750000 2.500000 7.500000 +v -0.750000 2.500000 4.500000 +v 0.750000 2.500000 4.500000 +v -0.750000 3.000000 4.500000 +v -0.750000 3.000000 7.500000 +v 0.750000 3.000000 7.500000 +v 0.750000 3.000000 4.500000 +v 1.250000 2.125000 6.750000 +v 1.250000 1.375000 6.750000 +v 1.250000 2.125000 5.250000 +v 1.250000 1.375000 5.250000 +v 1.375000 2.125000 5.250000 +v 1.375000 2.125000 6.750000 +v 1.375000 1.375000 6.750000 +v 1.375000 1.375000 5.250000 +v -1.375000 2.125000 6.750000 +v -1.375000 1.375000 6.750000 +v -1.375000 2.125000 5.250000 +v -1.375000 1.375000 5.250000 +v -1.250000 2.125000 5.250000 +v -1.250000 2.125000 6.750000 +v -1.250000 1.375000 6.750000 +v -1.250000 1.375000 5.250000 +v -1.000000 7.500000 1.000000 +v 1.000000 7.500000 1.000000 +v -1.000000 7.500000 -1.000000 +v 1.000000 7.500000 -1.000000 +v -1.000000 7.750000 -1.000000 +v -1.000000 7.750000 1.000000 +v 1.000000 7.750000 1.000000 +v 1.000000 7.750000 -1.000000 +v -0.500000 7.750000 0.625000 +v 0.500000 7.750000 0.625000 +v -0.500000 7.750000 0.375000 +v 0.500000 7.750000 0.375000 +v -0.500000 8.000000 0.375000 +v -0.500000 8.000000 0.625000 +v 0.500000 8.000000 0.625000 +v 0.500000 8.000000 0.375000 +v 0.500000 8.000000 2.000000 +v -0.500000 8.250000 0.625000 +v 0.500000 8.250000 0.625000 +v -0.500000 8.000000 2.000000 +v -0.500000 8.250000 2.000000 +v 0.500000 8.250000 2.000000 +v -0.500000 6.500000 3.750000 +v 0.500000 6.500000 3.750000 +v -0.500000 6.500000 3.500000 +v 0.500000 6.500000 3.500000 +v -0.500000 3.500000 3.750000 +v 0.500000 3.500000 3.750000 +v -0.500000 3.500000 3.500000 +v 0.500000 3.500000 3.500000 +v -0.500000 3.250000 4.000000 +v 0.500000 3.250000 4.000000 +v -0.500000 3.000000 4.000000 +v 0.500000 3.000000 4.000000 +v -0.500000 3.250000 7.000000 +v 0.500000 3.250000 7.000000 +v -0.500000 3.000000 7.250000 +v 0.500000 3.000000 7.250000 +v -0.500000 7.750000 0.000000 +v 0.500000 7.750000 0.000000 +v -0.500000 7.750000 -0.750000 +v 0.500000 7.750000 -0.750000 +v -0.500000 8.250000 -0.750000 +v -0.500000 8.250000 0.000000 +v 0.500000 8.250000 0.000000 +v 0.500000 8.250000 -0.750000 +v 0.500000 8.125000 -0.062500 +v 0.500000 7.875000 -0.062500 +v 0.500000 8.125000 -0.312500 +v 0.500000 7.875000 -0.312500 +v 1.125000 8.125000 -0.312500 +v 1.125000 8.125000 -0.062500 +v 1.125000 7.875000 -0.062500 +v 1.125000 7.875000 -0.312500 +v 0.500000 7.875000 -0.437500 +v 0.500000 8.125000 -0.437500 +v 1.375000 7.875000 -0.062500 +v 1.375000 7.875000 -0.312500 +v 1.125000 7.500000 -0.062500 +v 1.125000 7.500000 -0.312500 +v 1.375000 7.500000 -0.062500 +v 1.375000 7.500000 -0.312500 +v 0.500000 8.125000 -0.687500 +v 0.500000 7.875000 -0.687500 +v 0.750000 8.250000 -0.687500 +v 0.750000 8.250000 -0.437500 +v 0.750000 8.000000 -0.437500 +v 0.750000 8.000000 -0.687500 +v 1.750000 8.250000 -0.687500 +v 1.750000 8.250000 -0.437500 +v 1.750000 8.000000 -0.437500 +v 1.750000 8.000000 -0.687500 +v 2.000000 8.250000 -0.437500 +v 2.000000 8.000000 -0.437500 +v 1.750000 8.250000 1.312500 +v 1.750000 8.000000 1.312500 +v 2.000000 8.250000 1.312500 +v 2.000000 8.000000 1.312500 +v 1.750000 8.000000 1.562500 +v 2.000000 8.000000 1.562500 +v 1.750000 2.875000 1.312500 +v 2.000000 2.875000 1.312500 +v 1.750000 2.875000 1.562500 +v 2.000000 2.875000 1.562500 +v 1.750000 2.625000 1.562500 +v 2.000000 2.625000 1.562500 +v 0.750000 2.875000 3.562500 +v 1.000000 2.875000 3.562500 +v 0.750000 2.625000 3.562500 +v 1.000000 2.625000 3.562500 +v 0.750000 2.875000 6.812500 +v 1.000000 2.875000 6.562500 +v 0.750000 2.625000 6.812500 +v 1.000000 2.625000 6.562500 +v 1.750000 2.875000 2.062500 +v 2.000000 2.875000 2.062500 +v 1.750000 2.625000 2.062500 +v 2.000000 2.625000 2.062500 +v 0.437500 7.875000 -0.750000 +v 0.187500 7.875000 -0.750000 +v 0.187500 8.125000 -0.750000 +v 0.437500 8.125000 -0.750000 +v 0.187500 7.875000 -1.250000 +v 0.437500 7.875000 -1.250000 +v 0.187500 8.125000 -1.250000 +v 0.437500 8.125000 -1.250000 +v 0.187500 7.875000 -1.500000 +v 0.437500 7.875000 -1.500000 +v 0.187500 7.500000 -1.250000 +v 0.437500 7.500000 -1.250000 +v 0.187500 7.500000 -1.500000 +v 0.437500 7.500000 -1.500000 +v -2.078729 1.500000 -0.861038 +v -2.078729 2.000000 -0.861038 +v -1.590990 2.000000 1.590990 +v -1.590990 1.500000 1.590990 +v 0.000000 2.000000 2.250000 +v 0.000000 1.500000 2.250000 +v 2.078729 1.500000 -0.861038 +v 2.078729 2.000000 -0.861038 +v 0.861037 1.500000 -2.078729 +v 0.861037 2.000000 -2.078729 +v -0.861038 2.000000 -2.078729 +v -0.861038 1.500000 -2.078729 +v 2.250000 2.000000 -0.000000 +v 2.250000 1.500000 -0.000000 +v 2.078729 1.500000 0.861038 +v 2.078729 2.000000 0.861038 +v -0.861038 2.000000 2.078729 +v -0.861038 1.500000 2.078729 +v -2.250000 2.000000 0.000000 +v -2.250000 1.500000 0.000000 +v 1.590990 2.000000 -1.590991 +v 1.590990 1.500000 -1.590991 +v -2.078729 2.000000 0.861038 +v -2.078729 1.500000 0.861038 +v 0.861037 1.500000 2.078729 +v 0.861037 2.000000 2.078729 +v 1.590990 2.000000 1.590991 +v 1.590990 1.500000 1.590991 +v 0.000000 2.000000 -2.250000 +v 0.000000 1.500000 -2.250000 +v -1.590990 1.500000 -1.590990 +v -1.590990 2.000000 -1.590990 +v -1.250000 1.000000 7.875000 +v 1.250000 1.000000 7.875000 +v -1.250000 2.500000 7.875000 +v 1.250000 2.500000 7.875000 +v -1.375000 1.000000 7.875000 +v -1.375000 2.500000 7.875000 +v -1.250000 2.625000 7.875000 +v 1.250000 2.625000 7.875000 +v 1.375000 1.000000 7.875000 +v 1.375000 2.500000 7.875000 +v -1.250000 2.500000 7.625000 +v 1.250000 2.500000 7.625000 +v -1.250000 1.000000 7.625000 +v 1.250000 1.000000 7.625000 +v -1.375000 1.000000 7.625000 +v -1.375000 2.500000 7.625000 +v -1.250000 2.625000 7.625000 +v 1.250000 2.625000 7.625000 +v 1.375000 1.000000 7.625000 +v 1.375000 2.500000 7.625000 +v -1.250000 1.000000 7.375000 +v 1.250000 1.000000 7.375000 +v -1.250000 2.500000 7.375000 +v 1.250000 2.500000 7.375000 +v -1.375000 1.000000 7.375000 +v -1.375000 2.500000 7.375000 +v -1.250000 2.625000 7.375000 +v 1.250000 2.625000 7.375000 +v 1.375000 1.000000 7.375000 +v 1.375000 2.500000 7.375000 +v -1.250000 2.500000 7.125000 +v 1.250000 2.500000 7.125000 +v -1.250000 1.000000 7.125000 +v 1.250000 1.000000 7.125000 +v -1.375000 1.000000 7.125000 +v -1.375000 2.500000 7.125000 +v -1.250000 2.625000 7.125000 +v 1.250000 2.625000 7.125000 +v 1.375000 1.000000 7.125000 +v 1.375000 2.500000 7.125000 +v -1.250000 1.000000 4.875000 +v 1.250000 1.000000 4.875000 +v -1.250000 2.500000 4.875000 +v 1.250000 2.500000 4.875000 +v -1.375000 1.000000 4.875000 +v -1.375000 2.500000 4.875000 +v -1.250000 2.625000 4.875000 +v 1.250000 2.625000 4.875000 +v 1.375000 1.000000 4.875000 +v 1.375000 2.500000 4.875000 +v -1.250000 2.500000 4.625000 +v 1.250000 2.500000 4.625000 +v -1.250000 1.000000 4.625000 +v 1.250000 1.000000 4.625000 +v -1.375000 1.000000 4.625000 +v -1.375000 2.500000 4.625000 +v -1.250000 2.625000 4.625000 +v 1.250000 2.625000 4.625000 +v 1.375000 1.000000 4.625000 +v 1.375000 2.500000 4.625000 +v -1.250000 1.000000 4.375000 +v 1.250000 1.000000 4.375000 +v -1.250000 2.500000 4.375000 +v 1.250000 2.500000 4.375000 +v -1.375000 1.000000 4.375000 +v -1.375000 2.500000 4.375000 +v -1.250000 2.625000 4.375000 +v 1.250000 2.625000 4.375000 +v 1.375000 1.000000 4.375000 +v 1.375000 2.500000 4.375000 +v -1.250000 2.500000 4.125000 +v 1.250000 2.500000 4.125000 +v -1.250000 1.000000 4.125000 +v 1.250000 1.000000 4.125000 +v -1.375000 1.000000 4.125000 +v -1.375000 2.500000 4.125000 +v -1.250000 2.625000 4.125000 +v 1.250000 2.625000 4.125000 +v 1.375000 1.000000 4.125000 +v 1.375000 2.500000 4.125000 +v -1.250000 1.000000 3.875000 +v 1.250000 1.000000 3.875000 +v -1.250000 2.500000 3.875000 +v 1.250000 2.500000 3.875000 +v -1.375000 1.000000 3.875000 +v -1.375000 2.500000 3.875000 +v -1.250000 2.625000 3.875000 +v 1.250000 2.625000 3.875000 +v 1.375000 1.000000 3.875000 +v 1.375000 2.500000 3.875000 +v -1.250000 2.500000 3.625000 +v 1.250000 2.500000 3.625000 +v -1.250000 1.000000 3.625000 +v 1.250000 1.000000 3.625000 +v -1.375000 1.000000 3.625000 +v -1.375000 2.500000 3.625000 +v -1.250000 2.625000 3.625000 +v 1.250000 2.625000 3.625000 +v 1.375000 1.000000 3.625000 +v 1.375000 2.500000 3.625000 +v -1.500000 5.500000 -3.500000 +v -1.500000 6.000000 -3.500000 +v -1.500000 5.500000 -3.000000 +v -1.500000 6.000000 -3.000000 +v 1.500000 5.500000 -3.500000 +v 1.500000 6.000000 -3.500000 +v 1.500000 5.500000 -3.000000 +v 1.500000 6.000000 -3.000000 +v -2.500000 1.000000 -3.000000 +v -2.000000 1.000000 -3.000000 +v -2.500000 1.000000 -3.500000 +v -2.000000 1.000000 -3.500000 +v -2.000000 5.000000 -3.500000 +v -2.500000 5.000000 -3.500000 +v -2.000000 5.000000 -3.000000 +v -2.500000 5.000000 -3.000000 +v 2.000000 5.000000 -3.000000 +v 2.500000 5.000000 -3.000000 +v 2.000000 5.000000 -3.500000 +v 2.500000 5.000000 -3.500000 +v 2.500000 1.000000 -3.500000 +v 2.000000 1.000000 -3.500000 +v 2.500000 1.000000 -3.000000 +v 2.000000 1.000000 -3.000000 +v -1.000000 6.000000 -3.000000 +v 1.000000 6.000000 -3.000000 +v -1.000000 6.000000 -3.500000 +v 1.000000 6.000000 -3.500000 +v 1.000000 7.250000 -1.875000 +v -1.000000 7.250000 -1.875000 +v 1.000000 6.750000 -1.875000 +v -1.000000 6.750000 -1.875000 +v -1.000000 6.750000 -2.750000 +v 0.999999 6.750000 -2.750000 +v -1.000000 7.250000 -2.750000 +v 0.999999 7.250000 -2.750000 +v 1.000000 6.500000 -3.500000 +v -1.000000 6.500000 -3.500000 +v 1.000000 6.500000 -3.000000 +v -1.000000 6.500000 -3.000000 +v 3.500000 5.500000 -1.500000 +v 3.500000 6.000000 -1.500000 +v 3.000000 5.500000 -1.500000 +v 3.000000 6.000000 -1.500000 +v 3.500000 5.500000 1.500000 +v 3.500000 6.000000 1.500000 +v 3.000000 5.500000 1.500000 +v 3.000000 6.000000 1.500000 +v 3.000000 1.000000 -2.500000 +v 3.000000 1.000000 -2.000000 +v 3.500000 1.000000 -2.500000 +v 3.500000 1.000000 -2.000000 +v 3.500000 5.000000 -2.000000 +v 3.500000 5.000000 -2.500000 +v 3.000000 5.000000 -2.000000 +v 3.000000 5.000000 -2.500000 +v 3.000000 5.000000 2.000000 +v 3.000000 5.000000 2.500000 +v 3.500000 5.000000 2.000000 +v 3.500000 5.000000 2.500000 +v 3.500000 1.000000 2.500000 +v 3.500000 1.000000 2.000000 +v 3.000000 1.000000 2.500000 +v 3.000000 1.000000 2.000000 +v 3.000000 6.000000 -1.000000 +v 3.000000 6.000000 1.000000 +v 3.500000 6.000000 -1.000000 +v 3.500000 6.000000 1.000000 +v 1.875000 7.250000 1.000000 +v 1.875000 7.250000 -1.000000 +v 1.875000 6.750000 1.000000 +v 1.875000 6.750000 -1.000000 +v 2.750000 6.750000 -1.000000 +v 2.750000 6.750000 0.999999 +v 2.750000 7.250000 -1.000000 +v 2.750000 7.250000 0.999999 +v 3.500000 6.500000 1.000000 +v 3.500000 6.500000 -1.000000 +v 3.000000 6.500000 1.000000 +v 3.000000 6.500000 -1.000000 +v -3.500000 5.500000 1.500000 +v -3.500000 6.000000 1.500000 +v -3.000000 5.500000 1.500000 +v -3.000000 6.000000 1.500000 +v -3.500000 5.500000 -1.500000 +v -3.500000 6.000000 -1.500000 +v -3.000000 5.500000 -1.500000 +v -3.000000 6.000000 -1.500000 +v -3.000000 1.000000 2.500000 +v -3.000000 1.000000 2.000000 +v -3.500000 1.000000 2.500000 +v -3.500000 1.000000 2.000000 +v -3.500000 5.000000 2.000000 +v -3.500000 5.000000 2.500000 +v -3.000000 5.000000 2.000000 +v -3.000000 5.000000 2.500000 +v -3.000000 5.000000 -2.000000 +v -3.000000 5.000000 -2.500000 +v -3.500000 5.000000 -1.999999 +v -3.500000 5.000000 -2.500000 +v -3.500000 1.000000 -2.500000 +v -3.500000 1.000000 -1.999999 +v -3.000000 1.000000 -2.500000 +v -3.000000 1.000000 -2.000000 +v -3.000000 6.000000 1.000000 +v -3.000000 6.000000 -1.000000 +v -3.500000 6.000000 1.000000 +v -3.500000 6.000000 -1.000000 +v -1.875000 7.250000 -1.000000 +v -1.875000 7.250000 1.000000 +v -1.875000 6.750000 -1.000000 +v -1.875000 6.750000 1.000000 +v -2.750000 6.750000 1.000000 +v -2.750000 6.750000 -0.999999 +v -2.750000 7.250000 1.000000 +v -2.750000 7.250000 -0.999999 +v -3.500000 6.500000 -1.000000 +v -3.500000 6.500000 1.000000 +v -3.000000 6.500000 -1.000000 +v -3.000000 6.500000 1.000000 +v -0.500000 7.875000 -0.437500 +v -0.500000 8.125000 -0.437500 +v -0.500000 8.125000 -0.687500 +v -0.500000 7.875000 -0.687500 +v -0.750000 8.250000 -0.687500 +v -0.750000 8.250000 -0.437500 +v -0.750000 8.000000 -0.437500 +v -0.750000 8.000000 -0.687500 +v -1.750000 8.250000 -0.687500 +v -1.750000 8.250000 -0.437500 +v -1.750000 8.000000 -0.437500 +v -1.750000 8.000000 -0.687500 +v -2.000000 8.250000 -0.437500 +v -2.000000 8.000000 -0.437500 +v -1.750000 8.250000 1.312500 +v -1.750000 8.000000 1.312500 +v -2.000000 8.250000 1.312500 +v -2.000000 8.000000 1.312500 +v -1.750000 8.000000 1.562500 +v -2.000000 8.000000 1.562500 +v -1.750000 2.875000 1.312500 +v -2.000000 2.875000 1.312500 +v -1.750000 2.875000 1.562500 +v -2.000000 2.875000 1.562500 +v -1.750000 2.625000 1.562500 +v -2.000000 2.625000 1.562500 +v -0.750000 2.875000 3.562500 +v -1.000000 2.875000 3.562500 +v -0.750000 2.625000 3.562500 +v -1.000000 2.625000 3.562500 +v -0.750000 2.875000 6.812500 +v -1.000000 2.875000 6.562500 +v -0.750000 2.625000 6.812500 +v -1.000000 2.625000 6.562500 +v -1.750000 2.875000 2.062500 +v -2.000000 2.875000 2.062500 +v -1.750000 2.625000 2.062500 +v -2.000000 2.625000 2.062500 +vt 0.185185 0.634615 +vt 0.000000 0.711538 +vt 0.000000 0.634615 +vt 0.185185 0.634615 +vt 0.000000 0.711538 +vt 0.000000 0.634615 +vt 0.240741 0.634615 +vt 0.185185 0.711538 +vt 0.240741 0.634615 +vt 0.185185 0.711538 +vt 0.185185 0.634615 +vt 0.000000 0.711538 +vt 0.000000 0.634615 +vt 0.185185 0.634615 +vt 0.000000 0.711538 +vt 0.000000 0.634615 +vt 0.240741 0.711538 +vt 0.240741 0.634615 +vt 0.240741 0.711538 +vt 0.240741 0.634615 +vt 0.009259 0.750000 +vt 0.175926 0.596154 +vt 0.009259 0.750000 +vt 0.175926 0.596154 +vt 0.185185 0.711538 +vt 0.009259 0.750000 +vt 0.175926 0.596154 +vt 0.185185 0.711538 +vt 0.009259 0.750000 +vt 0.175926 0.596154 +vt 0.194444 0.750000 +vt 0.194444 0.596154 +vt 0.231481 0.750000 +vt 0.240741 0.711538 +vt 0.231481 0.596154 +vt 0.194444 0.596154 +vt 0.194444 0.750000 +vt 0.231481 0.750000 +vt 0.240741 0.711538 +vt 0.231481 0.596154 +vt 0.009259 0.826923 +vt 0.175926 0.750000 +vt 0.175926 0.826923 +vt 0.231481 0.750000 +vt 0.194444 0.826923 +vt 0.009259 0.826923 +vt 0.175926 0.750000 +vt 0.175926 0.826923 +vt 0.231481 0.826923 +vt 0.194444 0.750000 +vt 0.009259 0.826923 +vt 0.175926 0.750000 +vt 0.175926 0.826923 +vt 0.231481 0.826923 +vt 0.194444 0.826923 +vt 0.009259 0.826923 +vt 0.175926 0.750000 +vt 0.175926 0.826923 +vt 0.231481 0.826923 +vt 0.194444 0.750000 +vt 0.021710 0.262602 +vt 0.021710 0.045090 +vt 0.126438 0.045090 +vt 0.340278 0.538462 +vt 0.312500 0.557692 +vt 0.312500 0.538462 +vt 0.344907 0.538462 +vt 0.370370 0.557692 +vt 0.344907 0.557692 +vt 0.377315 0.538462 +vt 0.402778 0.557692 +vt 0.377315 0.557692 +vt 0.437500 0.538462 +vt 0.409722 0.557692 +vt 0.409722 0.538462 +vt 0.469907 0.538462 +vt 0.442130 0.557692 +vt 0.442130 0.538462 +vt 0.502315 0.538462 +vt 0.474537 0.557692 +vt 0.474537 0.538462 +vt 0.534722 0.538462 +vt 0.506944 0.557692 +vt 0.506944 0.538462 +vt 0.539352 0.538462 +vt 0.564815 0.557692 +vt 0.539352 0.557692 +vt 0.571759 0.538462 +vt 0.597222 0.557692 +vt 0.571759 0.557692 +vt 0.604167 0.538462 +vt 0.629630 0.557692 +vt 0.604167 0.557692 +vt 0.636574 0.538462 +vt 0.662037 0.557692 +vt 0.636574 0.557692 +vt 0.178241 0.538462 +vt 0.150463 0.557692 +vt 0.150463 0.538462 +vt 0.210648 0.538462 +vt 0.182870 0.557692 +vt 0.182870 0.538462 +vt 0.243056 0.538462 +vt 0.215278 0.557692 +vt 0.215278 0.538462 +vt 0.275463 0.538462 +vt 0.247685 0.557692 +vt 0.247685 0.538462 +vt 0.307870 0.538462 +vt 0.280093 0.557692 +vt 0.280093 0.538462 +vt 0.000002 0.442307 +vt 0.064815 0.307697 +vt 0.129627 0.442308 +vt 0.555556 0.730769 +vt 0.597222 0.701923 +vt 0.611111 0.730769 +vt 0.555556 0.769231 +vt 0.611111 0.769231 +vt 0.569444 0.798077 +vt 0.597222 0.798077 +vt 0.569444 0.701923 +vt 0.597222 0.663462 +vt 0.444444 0.730769 +vt 0.444444 0.769231 +vt 0.444444 0.653846 +vt 0.555556 0.692308 +vt 0.444444 0.692308 +vt 0.555556 0.807692 +vt 0.444444 0.807692 +vt 0.402778 0.701923 +vt 0.388889 0.730769 +vt 0.388889 0.769231 +vt 0.430556 0.798077 +vt 0.402778 0.798077 +vt 0.402778 0.663462 +vt 0.430556 0.701923 +vt 0.611111 0.807692 +vt 0.759259 0.769231 +vt 0.759259 0.807692 +vt 0.759259 0.692308 +vt 0.759259 0.730769 +vt 0.611111 0.692308 +vt 0.759259 0.653846 +vt 0.240741 0.769231 +vt 0.240741 0.730769 +vt 0.388889 0.653846 +vt 0.240741 0.692308 +vt 0.240741 0.653846 +vt 0.388889 0.692308 +vt 0.240741 0.807692 +vt 0.194444 0.865385 +vt 0.268519 0.826923 +vt 0.268519 0.865385 +vt 0.041667 0.865385 +vt 0.060185 0.826923 +vt 0.060185 0.865385 +vt 0.134259 0.865385 +vt 0.152778 0.826923 +vt 0.152778 0.865385 +vt 0.134259 0.826923 +vt 0.268519 0.884615 +vt 0.194444 0.951923 +vt 0.194444 0.884615 +vt 0.134259 0.990385 +vt 0.060185 0.923077 +vt 0.134259 0.923077 +vt 0.194444 0.884615 +vt 0.162037 0.923077 +vt 0.162037 0.884615 +vt -0.000000 0.923077 +vt 0.032407 0.884615 +vt 0.032407 0.923077 +vt 0.944444 -0.000000 +vt 0.759259 0.230769 +vt 0.759259 -0.000000 +vt 0.944444 0.307692 +vt 0.759259 0.326923 +vt 0.759259 0.307692 +vt 0.759259 0.769231 +vt 0.944444 0.750000 +vt 0.944444 0.769231 +vt 0.759259 0.750000 +vt 0.944444 0.634615 +vt 0.944444 0.230769 +vt 0.759259 0.846154 +vt 0.944444 0.846154 +vt 0.759259 0.634615 +vt 0.944444 0.442308 +vt 1.000000 0.634615 +vt 1.000000 0.442308 +vt 0.703704 0.442308 +vt 0.703704 0.634615 +vt 0.944444 0.326923 +vt 0.759259 0.442308 +vt 0.703704 0.653846 +vt 0.666667 0.653846 +vt 0.296296 0.605769 +vt 0.240741 0.596154 +vt 0.296296 0.596154 +vt 0.393519 0.605769 +vt 0.300926 0.596154 +vt 0.393519 0.596154 +vt 0.453704 0.596154 +vt 0.398148 0.605769 +vt 0.398148 0.596154 +vt 0.393519 0.596154 +vt 0.300926 0.596154 +vt 0.240741 0.634615 +vt 0.296296 0.625000 +vt 0.296296 0.634615 +vt 0.300926 0.634615 +vt 0.393519 0.625000 +vt 0.393519 0.634615 +vt 0.398148 0.625000 +vt 0.453704 0.634615 +vt 0.398148 0.634615 +vt 0.393519 0.634615 +vt 0.300926 0.634615 +vt 0.453704 0.625000 +vt 0.453704 0.605769 +vt 0.300926 0.625000 +vt 0.300926 0.605769 +vt 0.240741 0.625000 +vt 0.240741 0.605769 +vt 0.611111 0.192308 +vt 0.722222 0.307692 +vt 0.611111 0.307692 +vt 0.740741 0.307692 +vt 0.722222 0.192308 +vt 0.740741 0.192308 +vt 0.592593 0.192308 +vt 0.592593 0.307692 +vt 0.722222 0.153846 +vt 0.611111 0.153846 +vt 0.611111 0.346154 +vt 0.722222 0.346154 +vt 0.671296 0.009615 +vt 0.726852 0.000000 +vt 0.726852 0.009615 +vt 0.671296 0.009615 +vt 0.726852 0.067308 +vt 0.671296 0.067308 +vt 0.726852 0.000000 +vt 0.671296 0.000000 +vt 0.671296 0.076923 +vt 0.726852 0.076923 +vt 0.731481 0.067308 +vt 0.726852 0.009615 +vt 0.731481 0.009615 +vt 0.666667 0.009615 +vt 0.666667 0.067308 +vt 0.726852 0.067308 +vt 0.671296 0.076923 +vt 0.671296 0.067308 +vt 0.666667 0.009615 +vt 0.731481 0.067308 +vt 0.277778 0.826923 +vt 0.351852 0.980769 +vt 0.277778 0.980769 +vt 0.361111 0.980769 +vt 0.351852 0.826923 +vt 0.361111 0.826923 +vt 0.268519 0.826923 +vt 0.268519 0.980769 +vt 0.351852 0.807692 +vt 0.277778 0.807692 +vt 0.277778 1.000000 +vt 0.351852 1.000000 +vt 0.835648 0.846154 +vt 0.842593 0.865385 +vt 0.828704 0.865385 +vt 0.851852 0.865385 +vt 0.842593 0.846154 +vt 0.851852 0.846154 +vt 0.851852 0.923077 +vt 0.842593 0.903846 +vt 0.851852 0.903846 +vt 0.851852 0.923077 +vt 0.842593 0.846154 +vt 0.851852 0.846154 +vt 0.828704 0.923077 +vt 0.819444 0.846154 +vt 0.828704 0.846154 +vt 0.777778 0.865385 +vt 0.694444 0.846154 +vt 0.768519 0.846154 +vt 0.835648 0.923077 +vt 0.828704 0.903846 +vt 0.828704 0.923077 +vt 0.777778 0.846154 +vt 0.828704 0.846154 +vt 0.777778 0.846154 +vt 0.828704 0.846154 +vt 0.842593 0.923077 +vt 0.828704 0.923077 +vt 0.777778 0.903846 +vt 0.819444 0.923077 +vt 0.768519 0.846154 +vt 0.685185 0.923077 +vt 0.574074 0.903846 +vt 0.685185 0.903846 +vt 0.768519 0.923077 +vt 0.768519 0.923077 +vt 0.689815 0.846154 +vt 0.777778 0.923077 +vt 0.685185 0.846154 +vt 0.574074 0.865385 +vt 0.550926 0.846154 +vt 0.583333 0.846154 +vt 0.689815 0.923077 +vt 0.578704 0.846154 +vt 0.685185 0.865385 +vt 0.574074 0.846154 +vt 0.685185 0.846154 +vt 0.685185 0.923077 +vt 0.574074 0.846154 +vt 0.560185 0.923077 +vt 0.449074 0.846154 +vt 0.560185 0.846154 +vt 0.574074 0.923077 +vt 0.583333 0.923077 +vt 0.560185 0.903846 +vt 0.578704 0.923077 +vt 0.550926 0.846154 +vt 0.435185 0.846154 +vt 0.449074 0.923077 +vt 0.435185 0.923077 +vt 0.560185 0.923077 +vt 0.449074 0.903846 +vt 0.550926 0.923077 +vt 0.435185 0.846154 +vt 0.560185 0.846154 +vt 0.449074 0.865385 +vt 0.439815 0.846154 +vt 0.731481 0.125000 +vt 0.731481 0.105769 +vt 0.740741 0.105769 +vt 0.416667 0.846154 +vt 0.379630 0.903846 +vt 0.379630 0.846154 +vt 0.435185 0.903846 +vt 0.435185 0.846154 +vt 0.361111 0.846154 +vt 0.361111 0.903846 +vt 0.379630 0.942308 +vt 0.416667 0.903846 +vt 0.416667 0.942308 +vt 0.416667 0.807692 +vt 0.379630 0.807692 +vt 0.750000 0.173077 +vt 0.759259 0.125000 +vt 0.759259 0.173077 +vt 0.731481 0.173077 +vt 0.740741 0.125000 +vt 0.740741 0.173077 +vt 0.722222 0.173077 +vt 0.731481 0.125000 +vt 0.750000 0.125000 +vt 0.939815 0.961538 +vt 0.930556 0.942308 +vt 0.939815 0.942308 +vt 0.740741 0.076923 +vt 0.939815 0.980769 +vt 0.930556 1.000000 +vt 0.930556 0.980769 +vt 0.759259 0.105769 +vt 0.759259 0.125000 +vt 0.750000 0.105769 +vt 0.750000 0.076923 +vt 0.722222 0.105769 +vt 0.731481 0.076923 +vt 0.759259 0.076923 +vt 0.930556 0.923077 +vt 0.939815 0.923077 +vt 0.930556 0.961538 +vt 0.893519 0.942308 +vt 0.893519 0.980769 +vt 0.893519 0.923077 +vt 0.893519 0.961538 +vt 0.884259 1.000000 +vt 0.819444 0.980769 +vt 0.884259 0.980769 +vt 0.884259 0.923077 +vt 0.893519 0.923077 +vt 0.884259 0.942308 +vt 0.893519 0.980769 +vt 0.884259 0.961538 +vt 0.819444 0.923077 +vt 0.819444 0.961538 +vt 0.819444 0.942308 +vt 0.810185 0.942308 +vt 0.819444 0.942308 +vt 0.810185 0.961538 +vt 0.620370 0.942308 +vt 0.819444 1.000000 +vt 0.810185 1.000000 +vt 0.810185 0.980769 +vt 0.620370 0.961538 +vt 0.611111 0.961538 +vt 0.611111 0.942308 +vt 0.620370 0.961538 +vt 0.620370 0.980769 +vt 0.620370 0.923077 +vt 0.810185 0.923077 +vt 0.611111 0.980769 +vt 0.620370 0.980769 +vt 0.611111 1.000000 +vt 0.537037 0.961538 +vt 0.425926 0.942308 +vt 0.537037 0.942308 +vt 0.592593 0.923077 +vt 0.611111 0.923077 +vt 0.416667 0.961538 +vt 0.425926 0.961538 +vt 0.537037 0.980769 +vt 0.537037 1.000000 +vt 0.416667 0.980769 +vt 0.537037 0.923077 +vt 0.416667 0.923077 +vt 0.592593 0.980769 +vt 0.592593 0.961538 +vt 0.592593 0.942308 +vt 0.731481 0.163462 +vt 0.740741 0.125000 +vt 0.740741 0.163462 +vt 0.722222 0.163462 +vt 0.731481 0.125000 +vt 0.750000 0.125000 +vt 0.750000 0.163462 +vt 0.759259 0.125000 +vt 0.759259 0.163462 +vt 0.740741 0.105769 +vt 0.750000 0.076923 +vt 0.750000 0.105769 +vt 0.731481 0.125000 +vt 0.731481 0.105769 +vt 0.759259 0.105769 +vt 0.759259 0.125000 +vt 0.759259 0.076923 +vt 0.722222 0.105769 +vt 0.731481 0.076923 +vt 0.740741 0.076923 +vt 0.296296 0.605769 +vt 0.240741 0.596154 +vt 0.296296 0.596154 +vt 0.393519 0.605769 +vt 0.300926 0.596154 +vt 0.393519 0.596154 +vt 0.453704 0.596154 +vt 0.398148 0.605769 +vt 0.398148 0.596154 +vt 0.393519 0.596154 +vt 0.300926 0.596154 +vt 0.240741 0.634615 +vt 0.296296 0.625000 +vt 0.296296 0.634615 +vt 0.300926 0.634615 +vt 0.393519 0.625000 +vt 0.393519 0.634615 +vt 0.398148 0.625000 +vt 0.453704 0.634615 +vt 0.398148 0.634615 +vt 0.393519 0.634615 +vt 0.300926 0.634615 +vt 0.453704 0.625000 +vt 0.453704 0.605769 +vt 0.300926 0.625000 +vt 0.300926 0.605769 +vt 0.240741 0.625000 +vt 0.240741 0.605769 +vt 0.296296 0.605769 +vt 0.240741 0.596154 +vt 0.296296 0.596154 +vt 0.393519 0.605769 +vt 0.300926 0.596154 +vt 0.393519 0.596154 +vt 0.453704 0.596154 +vt 0.398148 0.605769 +vt 0.398148 0.596154 +vt 0.393519 0.596154 +vt 0.300926 0.596154 +vt 0.240741 0.634615 +vt 0.296296 0.625000 +vt 0.296296 0.634615 +vt 0.300926 0.634615 +vt 0.393519 0.625000 +vt 0.393519 0.634615 +vt 0.398148 0.625000 +vt 0.453704 0.634615 +vt 0.398148 0.634615 +vt 0.393519 0.634615 +vt 0.300926 0.634615 +vt 0.453704 0.625000 +vt 0.453704 0.605769 +vt 0.300926 0.625000 +vt 0.300926 0.605769 +vt 0.240741 0.625000 +vt 0.240741 0.605769 +vt 0.296296 0.605769 +vt 0.240741 0.596154 +vt 0.296296 0.596154 +vt 0.393519 0.605769 +vt 0.300926 0.596154 +vt 0.393519 0.596154 +vt 0.453704 0.596154 +vt 0.398148 0.605769 +vt 0.398148 0.596154 +vt 0.393519 0.596154 +vt 0.300926 0.596154 +vt 0.240741 0.634615 +vt 0.296296 0.625000 +vt 0.296296 0.634615 +vt 0.300926 0.634615 +vt 0.393519 0.625000 +vt 0.393519 0.634615 +vt 0.398148 0.625000 +vt 0.453704 0.634615 +vt 0.398148 0.634615 +vt 0.393519 0.634615 +vt 0.300926 0.634615 +vt 0.453704 0.625000 +vt 0.453704 0.605769 +vt 0.300926 0.625000 +vt 0.300926 0.605769 +vt 0.240741 0.625000 +vt 0.240741 0.605769 +vt 0.296296 0.605769 +vt 0.240741 0.596154 +vt 0.296296 0.596154 +vt 0.393519 0.605769 +vt 0.300926 0.596154 +vt 0.393519 0.596154 +vt 0.453704 0.596154 +vt 0.398148 0.605769 +vt 0.398148 0.596154 +vt 0.393519 0.596154 +vt 0.300926 0.596154 +vt 0.240741 0.634615 +vt 0.296296 0.625000 +vt 0.296296 0.634615 +vt 0.300926 0.634615 +vt 0.393519 0.625000 +vt 0.393519 0.634615 +vt 0.398148 0.625000 +vt 0.453704 0.634615 +vt 0.398148 0.634615 +vt 0.393519 0.634615 +vt 0.300926 0.634615 +vt 0.453704 0.625000 +vt 0.453704 0.605769 +vt 0.300926 0.625000 +vt 0.300926 0.605769 +vt 0.240741 0.625000 +vt 0.240741 0.605769 +vt 0.296296 0.605769 +vt 0.240741 0.596154 +vt 0.296296 0.596154 +vt 0.393519 0.605769 +vt 0.300926 0.596154 +vt 0.393519 0.596154 +vt 0.453704 0.596154 +vt 0.398148 0.605769 +vt 0.398148 0.596154 +vt 0.393519 0.596154 +vt 0.300926 0.596154 +vt 0.240741 0.634615 +vt 0.296296 0.625000 +vt 0.296296 0.634615 +vt 0.300926 0.634615 +vt 0.393519 0.625000 +vt 0.393519 0.634615 +vt 0.398148 0.625000 +vt 0.453704 0.634615 +vt 0.398148 0.634615 +vt 0.393519 0.634615 +vt 0.300926 0.634615 +vt 0.453704 0.625000 +vt 0.453704 0.605769 +vt 0.300926 0.625000 +vt 0.300926 0.605769 +vt 0.240741 0.625000 +vt 0.240741 0.605769 +vt 0.611111 0.730769 +vt 0.569444 0.701923 +vt 0.597222 0.701923 +vt 0.555556 0.769231 +vt 0.611111 0.769231 +vt 0.569444 0.798077 +vt 0.597222 0.798077 +vt 0.569444 0.663462 +vt 0.597222 0.663462 +vt 0.444444 0.730769 +vt 0.444444 0.769231 +vt 0.444444 0.692308 +vt 0.555556 0.653846 +vt 0.555556 0.692308 +vt 0.555556 0.807692 +vt 0.444444 0.807692 +vt 0.555556 0.730769 +vt 0.402778 0.701923 +vt 0.388889 0.730769 +vt 0.388889 0.769231 +vt 0.430556 0.798077 +vt 0.402778 0.798077 +vt 0.430556 0.663462 +vt 0.430556 0.701923 +vt 0.611111 0.807692 +vt 0.759259 0.769231 +vt 0.759259 0.807692 +vt 0.759259 0.692308 +vt 0.759259 0.730769 +vt 0.611111 0.692308 +vt 0.759259 0.653846 +vt 0.240741 0.769231 +vt 0.240741 0.730769 +vt 0.388889 0.653846 +vt 0.240741 0.692308 +vt 0.240741 0.653846 +vt 0.388889 0.692308 +vt 0.240741 0.807692 +vt 0.194444 0.865385 +vt 0.268519 0.826923 +vt 0.268519 0.865385 +vt 0.041667 0.865385 +vt 0.060185 0.826923 +vt 0.060185 0.865385 +vt 0.134259 0.865385 +vt 0.152778 0.826923 +vt 0.152778 0.865385 +vt 0.134259 0.826923 +vt 0.268519 0.884615 +vt 0.194444 0.951923 +vt 0.194444 0.884615 +vt 0.134259 0.990385 +vt 0.060185 0.923077 +vt 0.134259 0.923077 +vt 0.194444 0.884615 +vt 0.162037 0.923077 +vt 0.162037 0.884615 +vt -0.000000 0.923077 +vt 0.032407 0.884615 +vt 0.032407 0.923077 +vt 0.555556 0.730769 +vt 0.597222 0.701923 +vt 0.611111 0.730769 +vt 0.555556 0.769231 +vt 0.611111 0.769231 +vt 0.569444 0.798077 +vt 0.597222 0.798077 +vt 0.569444 0.701923 +vt 0.597222 0.663462 +vt 0.444444 0.730769 +vt 0.444444 0.769231 +vt 0.444444 0.653846 +vt 0.555556 0.692308 +vt 0.444444 0.692308 +vt 0.555556 0.807692 +vt 0.444444 0.807692 +vt 0.402778 0.701923 +vt 0.388889 0.730769 +vt 0.388889 0.769231 +vt 0.430556 0.798077 +vt 0.402778 0.798077 +vt 0.402778 0.663462 +vt 0.430556 0.701923 +vt 0.611111 0.807692 +vt 0.759259 0.769231 +vt 0.759259 0.807692 +vt 0.759259 0.692308 +vt 0.759259 0.730769 +vt 0.611111 0.692308 +vt 0.759259 0.653846 +vt 0.240741 0.769231 +vt 0.240741 0.730769 +vt 0.388889 0.653846 +vt 0.240741 0.692308 +vt 0.240741 0.653846 +vt 0.388889 0.692308 +vt 0.240741 0.807692 +vt 0.194444 0.865385 +vt 0.268519 0.826923 +vt 0.268519 0.865385 +vt 0.041667 0.865385 +vt 0.060185 0.826923 +vt 0.060185 0.865385 +vt 0.134259 0.865385 +vt 0.152778 0.826923 +vt 0.152778 0.865385 +vt 0.134259 0.826923 +vt 0.268519 0.884615 +vt 0.194444 0.951923 +vt 0.194444 0.884615 +vt 0.134259 0.990385 +vt 0.060185 0.923077 +vt 0.134259 0.923077 +vt 0.194444 0.884615 +vt 0.162037 0.923077 +vt 0.162037 0.884615 +vt -0.000000 0.923077 +vt 0.032407 0.884615 +vt 0.032407 0.923077 +vt 0.611111 0.730769 +vt 0.569444 0.701923 +vt 0.597222 0.701923 +vt 0.555556 0.769231 +vt 0.611111 0.769231 +vt 0.569444 0.798077 +vt 0.597222 0.798077 +vt 0.597222 0.663462 +vt 0.444444 0.730769 +vt 0.444444 0.769231 +vt 0.444444 0.653846 +vt 0.555556 0.692308 +vt 0.444444 0.692308 +vt 0.555556 0.807692 +vt 0.444444 0.807692 +vt 0.555556 0.730769 +vt 0.402778 0.701923 +vt 0.388889 0.730769 +vt 0.388889 0.769231 +vt 0.430556 0.798077 +vt 0.402778 0.798077 +vt 0.430556 0.663462 +vt 0.430556 0.701923 +vt 0.611111 0.807692 +vt 0.759259 0.769231 +vt 0.759259 0.807692 +vt 0.759259 0.692308 +vt 0.759259 0.730769 +vt 0.611111 0.692308 +vt 0.759259 0.653846 +vt 0.240741 0.769231 +vt 0.240741 0.730769 +vt 0.388889 0.653846 +vt 0.240741 0.692308 +vt 0.240741 0.653846 +vt 0.388889 0.692308 +vt 0.240741 0.807692 +vt 0.194444 0.865385 +vt 0.268519 0.826923 +vt 0.268519 0.865385 +vt 0.041667 0.865385 +vt 0.060185 0.826923 +vt 0.060185 0.865385 +vt 0.134259 0.865385 +vt 0.152778 0.826923 +vt 0.152778 0.865385 +vt 0.134259 0.826923 +vt 0.268519 0.884615 +vt 0.194444 0.951923 +vt 0.194444 0.884615 +vt 0.134259 0.990385 +vt 0.060185 0.923077 +vt 0.134259 0.923077 +vt 0.194444 0.884615 +vt 0.162037 0.923077 +vt 0.162037 0.884615 +vt -0.000000 0.923077 +vt 0.032407 0.884615 +vt 0.032407 0.923077 +vt 0.930556 0.942308 +vt 0.939815 0.961538 +vt 0.939815 0.942308 +vt 0.939815 0.980769 +vt 0.930556 1.000000 +vt 0.939815 1.000000 +vt 0.930556 0.923077 +vt 0.939815 0.923077 +vt 0.930556 0.961538 +vt 0.893519 0.942308 +vt 0.893519 0.980769 +vt 0.930556 0.980769 +vt 0.893519 0.923077 +vt 0.893519 0.961538 +vt 0.819444 0.980769 +vt 0.884259 1.000000 +vt 0.884259 0.980769 +vt 0.884259 0.923077 +vt 0.884259 0.942308 +vt 0.893519 0.923077 +vt 0.893519 0.980769 +vt 0.884259 0.961538 +vt 0.819444 0.923077 +vt 0.819444 0.961538 +vt 0.819444 0.942308 +vt 0.810185 0.942308 +vt 0.810185 0.961538 +vt 0.819444 0.942308 +vt 0.620370 0.942308 +vt 0.819444 1.000000 +vt 0.810185 0.980769 +vt 0.810185 1.000000 +vt 0.620370 0.961538 +vt 0.611111 0.942308 +vt 0.611111 0.961538 +vt 0.620370 0.961538 +vt 0.620370 0.980769 +vt 0.620370 0.923077 +vt 0.810185 0.923077 +vt 0.611111 0.980769 +vt 0.611111 1.000000 +vt 0.620370 0.980769 +vt 0.425926 0.942308 +vt 0.537037 0.961538 +vt 0.537037 0.942308 +vt 0.592593 0.923077 +vt 0.611111 0.923077 +vt 0.416667 0.961538 +vt 0.425926 0.961538 +vt 0.537037 0.980769 +vt 0.416667 0.980769 +vt 0.537037 1.000000 +vt 0.537037 0.923077 +vt 0.592593 0.980769 +vt 0.592593 0.961538 +vt 0.592593 0.942308 +vt 0.009259 0.596154 +vt 0.009259 0.596154 +vt 0.009259 0.596154 +vt 0.009259 0.596154 +vt 0.231481 0.596154 +vt 0.194444 0.596154 +vt 0.231481 0.596154 +vt 0.231481 0.750000 +vt 0.194444 0.596154 +vt 0.231481 0.826923 +vt 0.194444 0.826923 +vt 0.194444 0.826923 +vt 0.142491 0.094988 +vt 0.148128 0.153846 +vt 0.142491 0.212705 +vt 0.126438 0.262602 +vt 0.102413 0.295943 +vt 0.074074 0.307651 +vt 0.045735 0.295943 +vt 0.005657 0.212704 +vt 0.000020 0.153846 +vt 0.005657 0.094988 +vt 0.045735 0.011749 +vt 0.074074 0.000042 +vt 0.102413 0.011749 +vt 0.337963 0.557692 +vt 0.372685 0.538462 +vt 0.405093 0.538462 +vt 0.435185 0.557692 +vt 0.467593 0.557692 +vt 0.500000 0.557692 +vt 0.532407 0.557692 +vt 0.567130 0.538462 +vt 0.599537 0.538462 +vt 0.631944 0.538462 +vt 0.664352 0.538462 +vt 0.175926 0.557692 +vt 0.208333 0.557692 +vt 0.240741 0.557692 +vt 0.273148 0.557692 +vt 0.305556 0.557692 +vt 0.124694 0.493821 +vt 0.110644 0.537492 +vt 0.089617 0.566672 +vt 0.064815 0.576918 +vt 0.040012 0.566672 +vt 0.018985 0.537492 +vt 0.004936 0.493821 +vt 0.004936 0.390794 +vt 0.018985 0.347123 +vt 0.040012 0.317944 +vt 0.089618 0.317944 +vt 0.110644 0.347124 +vt 0.124694 0.390795 +vt 0.569444 0.663462 +vt 0.555556 0.653846 +vt 0.430556 0.663462 +vt 0.611111 0.653846 +vt 0.388889 0.807692 +vt 0.194444 0.826923 +vt 0.041667 0.826923 +vt 0.268519 0.951923 +vt 0.060185 0.990385 +vt 0.194444 0.923077 +vt -0.000000 0.884615 +vt 0.666667 0.423077 +vt 0.703704 0.423077 +vt 0.671296 0.000000 +vt 0.726852 0.076923 +vt 0.666667 0.067308 +vt 0.731481 0.009615 +vt 0.842593 0.923077 +vt 0.777778 0.923077 +vt 0.574074 0.923077 +vt 0.694444 0.923077 +vt 0.560185 0.865385 +vt 0.550926 0.923077 +vt 0.439815 0.923077 +vt 0.435185 0.923077 +vt 0.722222 0.125000 +vt 0.939815 1.000000 +vt 0.722222 0.076923 +vt 0.893519 1.000000 +vt 0.819444 1.000000 +vt 0.620370 1.000000 +vt 0.416667 0.942308 +vt 0.416667 1.000000 +vt 0.592593 1.000000 +vt 0.722222 0.125000 +vt 0.722222 0.076923 +vt 0.444444 0.653846 +vt 0.402778 0.663462 +vt 0.611111 0.653846 +vt 0.388889 0.807692 +vt 0.194444 0.826923 +vt 0.041667 0.826923 +vt 0.268519 0.951923 +vt 0.060185 0.990385 +vt 0.194444 0.923077 +vt -0.000000 0.884615 +vt 0.569444 0.663462 +vt 0.555556 0.653846 +vt 0.430556 0.663462 +vt 0.611111 0.653846 +vt 0.388889 0.807692 +vt 0.194444 0.826923 +vt 0.041667 0.826923 +vt 0.268519 0.951923 +vt 0.060185 0.990385 +vt 0.194444 0.923077 +vt -0.000000 0.884615 +vt 0.569444 0.663462 +vt 0.555556 0.653846 +vt 0.402778 0.663462 +vt 0.611111 0.653846 +vt 0.388889 0.807692 +vt 0.194444 0.826923 +vt 0.041667 0.826923 +vt 0.268519 0.951923 +vt 0.060185 0.990385 +vt 0.194444 0.923077 +vt -0.000000 0.884615 +vt 0.893519 1.000000 +vt 0.819444 1.000000 +vt 0.620370 1.000000 +vt 0.416667 0.942308 +vt 0.416667 1.000000 +vt 0.416667 0.923077 +vt 0.592593 1.000000 +vt 0.634259 0.076923 +vt 0.601852 0.115385 +vt 0.601852 0.076923 +vt 0.342593 0.115385 +vt 0.372685 0.153846 +vt 0.344907 0.153846 +vt 0.409722 0.153846 +vt 0.439815 0.115385 +vt 0.437500 0.153846 +vt 0.474537 0.153846 +vt 0.504630 0.115385 +vt 0.502315 0.153846 +vt 0.539352 0.153846 +vt 0.569444 0.115385 +vt 0.567130 0.153846 +vt 0.631944 0.153846 +vt 0.604167 0.153846 +vt 0.150463 0.153846 +vt 0.180556 0.115385 +vt 0.178241 0.153846 +vt 0.307870 0.153846 +vt 0.277778 0.115385 +vt 0.310185 0.115385 +vt 0.212963 0.115385 +vt 0.243056 0.153846 +vt 0.215278 0.153846 +vt 0.569444 0.076923 +vt 0.537037 0.115385 +vt 0.537037 0.076923 +vt 0.504630 0.076923 +vt 0.472222 0.076923 +vt 0.439815 0.076923 +vt 0.277778 0.076923 +vt 0.245370 0.115385 +vt 0.245370 0.076923 +vt 0.212963 0.076923 +vt 0.180556 0.076923 +vt 0.571759 0.153846 +vt 0.599537 0.153846 +vt 0.310185 0.076923 +vt 0.506944 0.153846 +vt 0.534722 0.153846 +vt 0.375000 0.076923 +vt 0.342593 0.076923 +vt 0.469907 0.153846 +vt 0.472222 0.115385 +vt 0.407407 0.115385 +vt 0.407407 0.076923 +vt 0.377315 0.153846 +vt 0.405093 0.153846 +vt 0.666667 0.076923 +vt 0.634259 0.115385 +vt 0.340278 0.153846 +vt 0.312500 0.153846 +vt 0.275463 0.153846 +vt 0.247685 0.153846 +vt 0.148148 0.115385 +vt 0.148148 0.076923 +vt 0.210648 0.153846 +vt 0.182870 0.153846 +vt 0.666667 0.115385 +vt 0.636574 0.153846 +vt 0.375000 0.115385 +vt 0.407407 0.500000 +vt 0.469907 0.000000 +vt 0.439815 0.038462 +vt 0.442130 0.000000 +vt 0.437500 -0.000000 +vt 0.407407 0.038462 +vt 0.409722 0.000000 +vt 0.405093 -0.000000 +vt 0.375000 0.038462 +vt 0.377315 -0.000000 +vt 0.372685 -0.000000 +vt 0.342593 0.038462 +vt 0.344907 -0.000000 +vt 0.340278 -0.000000 +vt 0.310185 0.038462 +vt 0.312500 0.000000 +vt 0.275463 -0.000000 +vt 0.245370 0.038462 +vt 0.247685 0.000000 +vt 0.307870 0.000000 +vt 0.277778 0.038462 +vt 0.280093 -0.000000 +vt 0.243056 0.000000 +vt 0.212963 0.038462 +vt 0.215278 0.000000 +vt 0.210648 0.000000 +vt 0.180556 0.038462 +vt 0.182870 -0.000000 +vt 0.178241 0.000000 +vt 0.148148 0.038462 +vt 0.150463 0.000000 +vt 0.664352 -0.000000 +vt 0.634259 0.038462 +vt 0.636574 -0.000000 +vt 0.631944 -0.000000 +vt 0.601852 0.038462 +vt 0.604167 0.000000 +vt 0.599537 0.000000 +vt 0.569444 0.038462 +vt 0.571759 -0.000000 +vt 0.539352 0.000000 +vt 0.537037 0.038462 +vt 0.534722 0.000000 +vt 0.504630 0.038462 +vt 0.506944 0.000000 +vt 0.474537 0.000000 +vt 0.472222 0.038462 +vt 0.180556 0.423077 +vt 0.148148 0.500000 +vt 0.148148 0.423077 +vt 0.601852 0.500000 +vt 0.634259 0.423077 +vt 0.601852 0.423077 +vt 0.245370 0.423077 +vt 0.212963 0.500000 +vt 0.212963 0.423077 +vt 0.666667 0.500000 +vt 0.634259 0.500000 +vt 0.245370 0.500000 +vt 0.472222 0.423077 +vt 0.439815 0.500000 +vt 0.439815 0.423077 +vt 0.180556 0.500000 +vt 0.569444 0.423077 +vt 0.537037 0.500000 +vt 0.537037 0.423077 +vt 0.666667 0.423077 +vt 0.472222 0.500000 +vt 0.569444 0.500000 +vt 0.504630 0.500000 +vt 0.342593 0.500000 +vt 0.277778 0.500000 +vt 0.310185 0.500000 +vt 0.504630 0.423077 +vt 0.277778 0.423077 +vt 0.310185 0.423077 +vt 0.375000 0.423077 +vt 0.342593 0.423077 +vt 0.407407 0.423077 +vt 0.375000 0.500000 +vt 0.469907 0.384615 +vt 0.442130 0.384615 +vt 0.437500 0.384615 +vt 0.409722 0.384615 +vt 0.405093 0.384615 +vt 0.377315 0.384615 +vt 0.372685 0.384615 +vt 0.344907 0.384615 +vt 0.340278 0.384615 +vt 0.312500 0.384615 +vt 0.275463 0.384615 +vt 0.247685 0.384615 +vt 0.307870 0.384615 +vt 0.280093 0.384615 +vt 0.243056 0.384615 +vt 0.215278 0.384615 +vt 0.210648 0.384615 +vt 0.182870 0.384615 +vt 0.178241 0.384615 +vt 0.150463 0.384615 +vt 0.664352 0.384615 +vt 0.636574 0.384615 +vt 0.631944 0.384615 +vt 0.604167 0.384615 +vt 0.599537 0.384615 +vt 0.571759 0.384615 +vt 0.567130 0.384615 +vt 0.539352 0.384615 +vt 0.534722 0.384615 +vt 0.506944 0.384615 +vt 0.474537 0.384615 +vt 0.377315 0.596154 +vt 0.150463 0.596154 +vt 0.409722 0.596154 +vt 0.182870 0.596154 +vt 0.442130 0.596154 +vt 0.215278 0.596154 +vt 0.474537 0.596154 +vt 0.247685 0.596154 +vt 0.539352 0.596154 +vt 0.506944 0.596154 +vt 0.280093 0.596154 +vt 0.571759 0.596154 +vt 0.312500 0.596154 +vt 0.604167 0.596154 +vt 0.344907 0.596154 +vt 0.636574 0.596154 +vt 0.342593 0.384615 +vt 0.314815 0.153846 +vt 0.342593 0.153846 +vt 0.314815 0.384615 +vt 0.287037 0.153846 +vt 0.287037 0.384615 +vt 0.259259 0.153846 +vt 0.259259 0.384615 +vt 0.231481 0.153846 +vt 0.231481 0.384615 +vt 0.203704 0.153846 +vt 0.203704 0.384615 +vt 0.175926 0.153846 +vt 0.175926 0.384615 +vt 0.148148 0.153846 +vt 0.592593 0.384615 +vt 0.564815 0.153846 +vt 0.592593 0.153846 +vt 0.564815 0.384615 +vt 0.537037 0.153846 +vt 0.537037 0.384615 +vt 0.509259 0.153846 +vt 0.509259 0.384615 +vt 0.481481 0.153846 +vt 0.481481 0.384615 +vt 0.453704 0.153846 +vt 0.453704 0.384615 +vt 0.425926 0.153846 +vt 0.425926 0.384615 +vt 0.398148 0.153846 +vt 0.398148 0.384615 +vt 0.370370 0.153846 +vt 0.370370 0.384615 +vt 0.375000 0.076923 +vt 0.310185 0.076923 +vt 0.148148 0.076923 +vt 0.666667 0.038462 +vt 0.634259 0.076923 +vt 0.472222 0.076923 +vt 0.407407 0.076923 +vt 0.342593 0.076923 +vt 0.277778 0.076923 +vt 0.180556 0.076923 +vt 0.212963 0.076923 +vt 0.245370 0.076923 +vt 0.439815 0.076923 +vt 0.504630 0.076923 +vt 0.537037 0.076923 +vt 0.569444 0.076923 +vt 0.601852 0.076923 +vt 0.280093 0.153846 +vt 0.442130 0.153846 +vt 0.664352 0.153846 +vt 0.567130 -0.000000 +vt 0.502315 0.000000 +vt 0.502315 0.384615 +vt 0.402778 0.596154 +vt 0.175926 0.596154 +vt 0.435185 0.596154 +vt 0.208333 0.596154 +vt 0.467593 0.596154 +vt 0.240741 0.596154 +vt 0.500000 0.596154 +vt 0.273148 0.596154 +vt 0.564815 0.596154 +vt 0.532407 0.596154 +vt 0.305556 0.596154 +vt 0.597222 0.596154 +vt 0.337963 0.596154 +vt 0.629630 0.596154 +vt 0.370370 0.596154 +vt 0.662037 0.596154 +vt 0.148148 0.384615 +vt 0.666667 0.076923 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 0.7071 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.4472 -0.8944 0.0000 +vn -0.4472 0.8944 0.0000 +vn -0.8321 0.0000 -0.5547 +vn 0.8321 0.0000 0.5547 +vn 0.0000 -0.7071 0.7071 +vn -0.4472 -0.8944 0.0000 +vn 0.4472 0.8944 0.0000 +vn 0.8321 0.0000 -0.5547 +vn -0.8321 0.0000 0.5547 +vn -0.9239 0.0000 -0.3827 +vn 0.6325 0.4472 0.6325 +vn 0.8263 0.4472 0.3423 +vn 0.8944 0.4472 -0.0000 +vn 0.8263 0.4472 -0.3423 +vn 0.6325 0.4472 -0.6325 +vn 0.3423 0.4472 -0.8263 +vn -0.0000 0.4472 -0.8944 +vn -0.3423 0.4472 -0.8263 +vn -0.6325 0.4472 -0.6325 +vn -0.8263 0.4472 -0.3423 +vn -0.8944 0.4472 0.0000 +vn -0.8263 0.4472 0.3423 +vn 0.3423 0.4472 0.8263 +vn -0.0000 0.4472 0.8944 +vn -0.6325 0.4472 0.6325 +vn -0.3423 0.4472 0.8263 +vn -0.3827 0.0000 -0.9239 +vn 0.3827 0.0000 -0.9239 +vn 0.9239 0.0000 -0.3827 +vn -0.3827 0.0000 0.9239 +vn -0.9239 0.0000 0.3827 +vn 0.3827 0.0000 0.9239 +vn 0.9239 0.0000 0.3827 +vn 0.6325 -0.4472 -0.6325 +vn 0.8263 -0.4472 -0.3423 +vn 0.8944 -0.4472 -0.0000 +vn 0.8263 -0.4472 0.3423 +vn 0.6325 -0.4472 0.6325 +vn 0.3423 -0.4472 0.8263 +vn -0.0000 -0.4472 0.8944 +vn -0.3423 -0.4472 0.8263 +vn -0.6325 -0.4472 0.6325 +vn -0.8263 -0.4472 0.3423 +vn -0.8944 -0.4472 -0.0000 +vn -0.8263 -0.4472 -0.3423 +vn -0.6325 -0.4472 -0.6325 +vn -0.3423 -0.4472 -0.8263 +vn -0.0000 -0.4472 -0.8944 +vn 0.3423 -0.4472 -0.8263 +s off +f 34/41/17 41/42/17 33/43/17 +f 35/44/18 44/45/18 36/46/18 +f 40/47/19 43/48/19 35/44/19 +f 37/49/20 42/50/20 34/41/20 +f 39/51/21 48/52/21 40/53/21 +f 38/54/22 45/55/22 37/56/22 +f 44/57/23 38/54/23 36/58/23 +f 41/59/24 39/51/24 33/60/24 +f 42/50/25 51/61/25 41/42/25 +f 33/43/26 50/62/26 34/41/26 +f 43/48/25 56/63/25 44/45/25 +f 36/46/26 53/64/26 35/44/26 +f 46/65/25 59/66/25 45/55/25 +f 37/56/26 58/67/26 38/54/26 +f 47/68/25 64/69/25 48/52/25 +f 40/53/26 61/70/26 39/51/26 +f 41/59/25 63/71/25 47/68/25 +f 61/72/26 33/60/26 39/51/26 +f 64/73/25 43/48/25 48/74/25 +f 35/44/26 62/75/26 40/47/26 +f 58/76/26 36/58/26 38/54/26 +f 44/57/25 60/77/25 46/65/25 +f 59/78/25 42/50/25 45/79/25 +f 34/41/26 57/80/26 37/49/26 +f 49/81/18 52/82/18 50/83/18 +f 51/84/23 61/85/23 63/71/23 +f 62/86/22 63/87/22 61/88/22 +f 62/89/20 55/90/20 64/73/20 +f 54/91/17 55/92/17 53/93/17 +f 60/77/24 54/94/24 58/95/24 +f 57/96/21 60/97/21 58/98/21 +f 57/99/19 52/100/19 59/78/19 +f 75/101/26 71/102/26 67/103/26 +f 187/104/25 202/105/25 186/106/25 +f 187/107/25 204/108/25 203/109/25 +f 188/110/25 205/111/25 204/112/25 +f 190/113/25 205/114/25 189/115/25 +f 191/116/25 206/117/25 190/118/25 +f 192/119/25 207/120/25 191/121/25 +f 177/122/25 208/123/25 192/124/25 +f 177/125/25 194/126/25 193/127/25 +f 178/128/25 195/129/25 194/130/25 +f 179/131/25 196/132/25 195/133/25 +f 180/134/25 197/135/25 196/136/25 +f 182/137/25 197/138/25 181/139/25 +f 183/140/25 198/141/25 182/142/25 +f 184/143/25 199/144/25 183/145/25 +f 185/146/25 200/147/25 184/148/25 +f 186/149/25 201/150/25 185/151/25 +f 217/152/25 221/153/25 209/154/25 +f 226/155/17 237/156/17 238/157/17 +f 228/158/27 238/157/27 240/159/27 +f 227/160/18 240/159/18 239/161/18 +f 225/162/28 239/163/28 237/156/28 +f 230/164/25 228/158/25 232/165/25 +f 231/166/26 225/167/26 229/168/26 +f 232/165/18 227/169/18 231/170/18 +f 229/168/17 226/155/17 230/164/17 +f 243/171/17 230/164/17 244/172/17 +f 244/172/29 232/165/29 242/173/29 +f 242/173/18 231/174/18 241/175/18 +f 241/176/30 229/177/30 243/171/30 +f 239/178/18 233/179/18 234/180/18 +f 238/157/17 236/181/17 235/182/17 +f 240/159/22 235/182/22 233/179/22 +f 237/183/21 234/184/21 236/181/21 +f 244/172/21 247/185/21 245/186/21 +f 241/187/22 246/188/22 248/189/22 +f 243/190/17 245/186/17 246/188/17 +f 242/173/18 248/191/18 247/185/18 +f 264/192/18 250/193/18 263/194/18 +f 263/195/21 252/196/21 261/197/21 +f 262/198/22 249/199/22 264/200/22 +f 261/197/17 251/201/17 262/198/17 +f 258/202/26 256/203/26 257/204/26 +f 254/205/25 260/206/25 259/207/25 +f 256/208/22 259/209/22 257/210/22 +f 253/211/21 258/212/21 260/213/21 +f 258/202/31 264/192/31 263/194/31 +f 260/213/21 263/195/21 261/197/21 +f 257/210/22 262/198/22 264/200/22 +f 262/198/32 260/206/32 261/197/32 +f 267/214/26 266/215/26 265/216/26 +f 272/217/25 275/218/25 271/219/25 +f 270/220/25 273/221/25 269/222/25 +f 274/223/21 277/224/21 273/221/21 +f 268/225/22 271/219/22 266/215/22 +f 265/226/21 269/222/21 267/227/21 +f 278/228/25 280/229/25 277/224/25 +f 273/230/18 280/229/18 276/231/18 +f 275/232/17 278/228/17 274/233/17 +f 276/234/22 279/235/22 275/218/22 +f 274/233/17 270/236/17 265/237/17 +f 286/238/17 281/239/17 283/240/17 +f 288/241/17 283/242/17 284/243/17 +f 282/244/17 290/245/17 284/246/17 +f 284/246/17 290/245/17 288/247/17 +f 283/240/17 287/248/17 286/238/17 +f 293/249/18 296/250/18 291/251/18 +f 291/252/18 298/253/18 292/254/18 +f 300/255/18 294/256/18 292/257/18 +f 292/257/18 298/258/18 300/255/18 +f 291/251/18 296/250/18 297/259/18 +f 290/245/27 298/253/27 288/241/27 +f 299/260/22 290/245/22 289/261/22 +f 288/241/25 297/262/25 287/263/25 +f 287/263/29 296/250/29 286/238/29 +f 286/238/21 295/264/21 285/265/21 +f 307/266/25 305/267/25 306/268/25 +f 303/269/18 308/270/18 304/271/18 +f 302/272/17 306/268/17 301/273/17 +f 304/274/22 307/266/22 302/275/22 +f 301/276/21 305/267/21 303/277/21 +f 320/278/26 323/279/26 318/280/26 +f 315/281/22 313/282/22 314/283/22 +f 312/284/26 315/281/26 310/285/26 +f 309/286/25 313/282/25 311/287/25 +f 311/288/18 316/289/18 312/290/18 +f 310/291/17 314/283/17 309/292/17 +f 317/293/25 321/294/25 319/295/25 +f 319/295/18 324/296/18 320/278/18 +f 318/280/17 322/297/17 317/293/17 +f 320/278/21 317/293/21 319/295/21 +f 331/298/25 329/299/25 330/300/25 +f 327/301/18 332/302/18 328/303/18 +f 326/304/17 330/300/17 325/305/17 +f 328/306/22 331/298/22 326/307/22 +f 325/308/21 329/299/21 327/309/21 +f 339/310/22 340/311/22 343/312/22 +f 336/313/22 339/314/22 334/315/22 +f 333/316/21 337/317/21 335/318/21 +f 335/319/18 340/320/18 336/321/18 +f 334/322/17 338/323/17 333/324/17 +f 346/325/22 350/326/22 341/327/22 +f 337/317/21 338/328/21 342/329/21 +f 342/330/25 346/331/25 343/332/25 +f 343/312/22 341/333/22 339/334/22 +f 337/335/33 343/332/33 340/320/33 +f 338/336/21 345/337/21 342/329/21 +f 339/338/26 344/339/26 338/323/26 +f 349/340/21 351/341/21 347/342/21 +f 344/343/21 347/342/21 345/337/21 +f 341/344/31 349/345/31 344/339/31 +f 345/346/32 348/347/32 346/331/32 +f 352/348/22 358/349/22 354/350/22 +f 350/351/18 353/352/18 349/345/18 +f 348/353/22 354/354/22 350/355/22 +f 347/356/17 352/357/17 348/347/17 +f 355/358/25 360/359/25 356/360/25 +f 351/361/32 356/360/32 352/357/32 +f 353/362/21 355/363/21 351/341/21 +f 354/364/31 357/365/31 353/352/31 +f 362/366/32 359/367/32 361/368/32 +f 357/369/21 359/370/21 355/363/21 +f 358/371/26 361/372/26 357/365/26 +f 358/373/22 360/374/22 362/375/22 +f 376/376/17 377/377/17 381/378/17 +f 369/379/25 367/380/25 368/381/25 +f 366/382/22 369/379/22 364/383/22 +f 363/384/21 367/380/21 365/385/21 +f 365/386/18 370/387/18 366/388/18 +f 364/389/17 368/381/17 363/390/17 +f 373/391/18 378/392/18 374/393/18 +f 372/394/17 376/395/17 371/396/17 +f 374/397/26 377/398/26 372/394/26 +f 371/396/25 375/399/25 373/391/25 +f 387/400/18 392/401/18 388/402/18 +f 377/377/17 385/403/17 381/378/17 +f 380/404/17 391/405/17 390/406/17 +f 378/407/18 375/408/18 382/409/18 +f 376/395/27 382/409/27 375/399/27 +f 381/378/22 386/410/22 382/409/22 +f 378/411/21 383/412/21 377/377/21 +f 382/409/18 384/413/18 378/407/18 +f 388/402/34 391/414/34 379/415/34 +f 380/404/35 389/416/35 387/400/35 +f 389/416/18 396/417/18 392/401/18 +f 391/405/17 394/418/17 390/406/17 +f 392/401/26 395/419/26 391/414/26 +f 390/406/25 393/420/25 389/416/25 +f 395/421/21 399/422/21 394/423/21 +f 395/424/26 396/425/26 398/426/26 +f 393/427/25 394/423/25 397/428/25 +f 398/426/26 400/429/26 395/424/26 +f 394/423/25 401/430/25 397/428/25 +f 397/428/22 402/431/22 398/426/22 +f 393/420/23 398/426/23 396/417/23 +f 402/432/22 401/433/22 404/434/22 +f 404/434/22 406/435/22 402/432/22 +f 399/436/21 400/437/21 403/438/21 +f 406/439/22 408/440/22 410/441/22 +f 403/438/17 408/442/17 404/434/17 +f 400/437/21 407/443/21 403/438/21 +f 402/432/18 405/444/18 400/445/18 +f 399/422/32 404/434/32 401/430/32 +f 407/446/21 405/447/21 409/448/21 +f 412/449/22 418/450/22 414/451/22 +f 410/441/26 421/452/26 409/453/26 +f 415/454/20 418/450/20 416/455/20 +f 411/456/25 416/455/25 412/449/25 +f 413/457/21 415/458/21 411/456/21 +f 413/459/26 418/450/26 417/460/26 +f 406/435/31 409/453/31 405/444/31 +f 412/449/25 419/461/25 411/456/25 +f 419/461/36 413/457/36 411/456/36 +f 409/448/21 419/461/21 407/446/21 +f 407/446/25 420/462/25 408/440/25 +f 408/440/22 422/463/22 410/441/22 +f 422/463/37 412/449/37 414/451/37 +f 414/451/26 421/452/26 422/463/26 +f 423/464/22 430/465/22 426/466/22 +f 424/467/26 428/468/26 423/464/26 +f 426/466/25 429/469/25 425/470/25 +f 425/470/21 427/471/21 424/472/21 +f 432/473/18 435/474/18 431/475/18 +f 430/476/22 428/477/22 432/473/22 +f 427/478/21 429/479/21 431/475/21 +f 431/475/33 430/465/33 432/473/33 +f 431/475/21 433/480/21 427/478/21 +f 427/481/17 434/482/17 428/477/17 +f 428/477/22 436/483/22 432/473/22 +f 474/484/17 469/485/17 471/486/17 +f 476/487/17 471/488/17 472/489/17 +f 470/490/17 478/491/17 472/492/17 +f 472/492/17 478/491/17 476/493/17 +f 471/486/17 475/494/17 474/484/17 +f 481/495/18 484/496/18 479/497/18 +f 479/498/18 486/499/18 480/500/18 +f 488/501/18 482/502/18 480/503/18 +f 480/503/18 486/504/18 488/501/18 +f 479/497/18 484/496/18 485/505/18 +f 478/491/27 486/499/27 476/487/27 +f 487/506/22 478/491/22 477/507/22 +f 476/487/25 485/508/25 475/509/25 +f 475/509/29 484/496/29 474/484/29 +f 474/484/21 483/510/21 473/511/21 +f 494/512/17 489/513/17 491/514/17 +f 496/515/17 491/516/17 492/517/17 +f 490/518/17 498/519/17 492/520/17 +f 492/520/17 498/519/17 496/521/17 +f 491/514/17 495/522/17 494/512/17 +f 501/523/18 504/524/18 499/525/18 +f 499/526/18 506/527/18 500/528/18 +f 508/529/18 502/530/18 500/531/18 +f 500/531/18 506/532/18 508/529/18 +f 499/525/18 504/524/18 505/533/18 +f 498/519/27 506/527/27 496/515/27 +f 507/534/22 498/519/22 497/535/22 +f 496/515/25 505/536/25 495/537/25 +f 495/537/29 504/524/29 494/512/29 +f 494/512/21 503/538/21 493/539/21 +f 514/540/17 509/541/17 511/542/17 +f 516/543/17 511/544/17 512/545/17 +f 510/546/17 518/547/17 512/548/17 +f 512/548/17 518/547/17 516/549/17 +f 511/542/17 515/550/17 514/540/17 +f 521/551/18 524/552/18 519/553/18 +f 519/554/18 526/555/18 520/556/18 +f 528/557/18 522/558/18 520/559/18 +f 520/559/18 526/560/18 528/557/18 +f 519/553/18 524/552/18 525/561/18 +f 518/547/27 526/555/27 516/543/27 +f 527/562/22 518/547/22 517/563/22 +f 516/543/25 525/564/25 515/565/25 +f 515/565/29 524/552/29 514/540/29 +f 514/540/21 523/566/21 513/567/21 +f 534/568/17 529/569/17 531/570/17 +f 536/571/17 531/572/17 532/573/17 +f 530/574/17 538/575/17 532/576/17 +f 532/576/17 538/575/17 536/577/17 +f 531/570/17 535/578/17 534/568/17 +f 541/579/18 544/580/18 539/581/18 +f 539/582/18 546/583/18 540/584/18 +f 548/585/18 542/586/18 540/587/18 +f 540/587/18 546/588/18 548/585/18 +f 539/581/18 544/580/18 545/589/18 +f 538/575/27 546/583/27 536/571/27 +f 547/590/22 538/575/22 537/591/22 +f 536/571/25 545/592/25 535/593/25 +f 535/593/29 544/580/29 534/568/29 +f 534/568/21 543/594/21 533/595/21 +f 554/596/17 549/597/17 551/598/17 +f 556/599/17 551/600/17 552/601/17 +f 550/602/17 558/603/17 552/604/17 +f 552/604/17 558/603/17 556/605/17 +f 551/598/17 555/606/17 554/596/17 +f 561/607/18 564/608/18 559/609/18 +f 559/610/18 566/611/18 560/612/18 +f 568/613/18 562/614/18 560/615/18 +f 560/615/18 566/616/18 568/613/18 +f 559/609/18 564/608/18 565/617/18 +f 558/603/27 566/611/27 556/599/27 +f 567/618/22 558/603/22 557/619/22 +f 556/599/25 565/620/25 555/621/25 +f 555/621/29 564/608/29 554/596/29 +f 554/596/21 563/622/21 553/623/21 +f 582/624/18 569/625/18 581/626/18 +f 572/627/29 582/624/29 584/628/29 +f 571/629/17 584/628/17 583/630/17 +f 581/626/30 571/631/30 583/632/30 +f 574/633/25 572/627/25 576/634/25 +f 573/635/26 571/636/26 569/637/26 +f 576/634/17 571/638/17 575/639/17 +f 573/635/18 570/640/18 574/633/18 +f 587/641/18 574/633/18 588/642/18 +f 588/642/27 576/634/27 586/643/27 +f 586/643/17 575/644/17 585/645/17 +f 587/641/28 575/646/28 573/647/28 +f 583/648/17 577/649/17 578/650/17 +f 582/624/18 580/651/18 579/652/18 +f 584/628/21 579/652/21 577/649/21 +f 581/653/22 578/654/22 580/651/22 +f 588/642/22 591/655/22 589/656/22 +f 585/657/21 590/658/21 592/659/21 +f 587/660/18 589/656/18 590/658/18 +f 586/643/17 592/661/17 591/655/17 +f 608/662/17 594/663/17 607/664/17 +f 607/665/22 596/666/22 605/667/22 +f 606/668/21 593/669/21 608/670/21 +f 605/667/18 595/671/18 606/668/18 +f 602/672/26 600/673/26 601/674/26 +f 598/675/25 604/676/25 603/677/25 +f 600/678/21 603/679/21 601/680/21 +f 597/681/22 602/682/22 604/683/22 +f 602/672/38 608/662/38 607/664/38 +f 604/683/22 607/665/22 605/667/22 +f 601/680/21 606/668/21 608/670/21 +f 603/677/33 605/667/33 606/668/33 +f 610/684/22 621/685/22 622/686/22 +f 612/687/33 622/686/33 624/688/33 +f 611/689/21 624/688/21 623/690/21 +f 609/691/38 623/692/38 621/685/38 +f 614/693/25 612/687/25 616/694/25 +f 615/695/26 609/696/26 613/697/26 +f 616/694/21 611/698/21 615/699/21 +f 613/697/22 610/684/22 614/693/22 +f 627/700/22 614/693/22 628/701/22 +f 626/702/32 614/693/32 616/694/32 +f 626/702/21 615/703/21 625/704/21 +f 625/705/31 613/706/31 627/700/31 +f 623/707/21 617/708/21 618/709/21 +f 622/686/22 620/710/22 619/711/22 +f 624/688/18 619/711/18 617/708/18 +f 621/712/17 618/713/17 620/710/17 +f 628/701/17 631/714/17 629/715/17 +f 625/716/18 630/717/18 632/718/18 +f 627/719/22 629/715/22 630/717/22 +f 626/702/21 632/720/21 631/714/21 +f 648/721/21 634/722/21 647/723/21 +f 647/724/17 636/725/17 645/726/17 +f 646/727/18 633/728/18 648/729/18 +f 645/726/22 635/730/22 646/727/22 +f 642/731/26 640/732/26 641/733/26 +f 638/734/25 644/735/25 643/736/25 +f 640/737/18 643/738/18 641/739/18 +f 637/740/17 642/741/17 644/742/17 +f 642/731/28 648/721/28 647/723/28 +f 644/742/17 647/724/17 645/726/17 +f 641/739/18 646/727/18 648/729/18 +f 646/727/27 644/735/27 645/726/27 +f 662/743/21 649/744/21 661/745/21 +f 652/746/32 662/743/32 664/747/32 +f 651/748/22 664/747/22 663/749/22 +f 649/744/31 663/750/31 661/745/31 +f 654/751/25 652/746/25 656/752/25 +f 655/753/26 649/754/26 653/755/26 +f 656/752/22 651/756/22 655/757/22 +f 653/755/21 650/758/21 654/751/21 +f 667/759/21 654/751/21 668/760/21 +f 668/760/33 656/752/33 666/761/33 +f 666/761/22 655/762/22 665/763/22 +f 667/759/38 655/764/38 653/765/38 +f 663/766/22 657/767/22 658/768/22 +f 662/743/21 660/769/21 659/770/21 +f 664/747/17 659/770/17 657/767/17 +f 661/771/18 658/772/18 660/769/18 +f 668/760/18 671/773/18 669/774/18 +f 665/775/17 670/776/17 672/777/17 +f 667/778/21 669/774/21 670/776/21 +f 666/761/22 672/779/22 671/773/22 +f 688/780/22 674/781/22 687/782/22 +f 687/783/18 676/784/18 685/785/18 +f 686/786/17 673/787/17 688/788/17 +f 685/785/21 675/789/21 686/786/21 +f 682/790/26 680/791/26 681/792/26 +f 678/793/25 684/794/25 683/795/25 +f 680/796/17 683/797/17 681/798/17 +f 677/799/18 682/800/18 684/801/18 +f 682/790/30 688/780/30 687/782/30 +f 684/801/18 687/783/18 685/785/18 +f 681/798/17 686/786/17 688/788/17 +f 686/786/29 684/794/29 685/785/29 +f 696/802/18 691/803/18 692/804/18 +f 690/805/17 695/806/17 689/807/17 +f 695/808/39 692/804/39 689/809/39 +f 693/810/40 690/805/40 691/803/40 +f 700/811/18 693/810/18 696/802/18 +f 698/812/17 695/806/17 694/813/17 +f 699/814/26 696/802/26 695/808/26 +f 697/815/25 694/813/25 693/810/25 +f 703/816/22 699/817/22 698/818/22 +f 699/819/26 702/820/26 700/821/26 +f 697/822/25 701/823/25 698/818/25 +f 704/824/26 702/820/26 699/819/26 +f 705/825/25 698/818/25 701/823/25 +f 706/826/21 701/823/21 702/820/21 +f 702/820/19 697/815/19 700/811/19 +f 706/827/21 708/828/21 705/829/21 +f 710/830/21 708/828/21 706/827/21 +f 703/831/22 707/832/22 704/833/22 +f 710/834/21 714/835/21 712/836/21 +f 712/837/17 707/832/17 708/828/17 +f 711/838/22 704/833/22 707/832/22 +f 709/839/18 706/827/18 704/840/18 +f 708/828/32 703/816/32 705/825/32 +f 711/841/22 713/842/22 709/843/22 +f 722/844/21 716/845/21 718/846/21 +f 725/847/26 714/835/26 713/848/26 +f 722/844/24 719/849/24 720/850/24 +f 720/850/25 715/851/25 716/845/25 +f 719/852/22 717/853/22 715/851/22 +f 717/854/26 722/844/26 718/846/26 +f 713/848/31 710/830/31 709/839/31 +f 716/845/25 723/855/25 724/856/25 +f 717/853/41 723/855/41 715/851/41 +f 723/855/22 713/842/22 711/841/22 +f 724/856/25 711/841/25 712/836/25 +f 726/857/21 712/836/21 714/835/21 +f 716/845/42 726/857/42 718/846/42 +f 718/846/26 725/847/26 717/854/26 +f 34/41/17 42/50/17 41/42/17 +f 35/44/18 43/48/18 44/45/18 +f 40/47/19 48/74/19 43/48/19 +f 37/49/20 45/79/20 42/50/20 +f 39/51/21 47/68/21 48/52/21 +f 38/54/22 46/65/22 45/55/22 +f 44/57/23 46/65/23 38/54/23 +f 41/59/24 47/68/24 39/51/24 +f 42/50/25 52/82/25 51/61/25 +f 33/43/26 49/858/26 50/62/26 +f 43/48/25 55/92/25 56/63/25 +f 36/46/26 54/859/26 53/64/26 +f 46/65/25 60/97/25 59/66/25 +f 37/56/26 57/860/26 58/67/26 +f 47/68/25 63/87/25 64/69/25 +f 40/53/26 62/861/26 61/70/26 +f 41/59/25 51/84/25 63/71/25 +f 61/72/26 49/862/26 33/60/26 +f 64/73/25 55/90/25 43/48/25 +f 35/44/26 53/863/26 62/75/26 +f 58/76/26 54/864/26 36/58/26 +f 44/57/25 56/865/25 60/77/25 +f 59/78/25 52/100/25 42/50/25 +f 34/41/26 50/866/26 57/80/26 +f 49/81/18 51/61/18 52/82/18 +f 51/84/23 49/867/23 61/85/23 +f 62/86/22 64/69/22 63/87/22 +f 62/89/20 53/868/20 55/90/20 +f 54/91/17 56/63/17 55/92/17 +f 60/77/24 56/865/24 54/94/24 +f 57/96/21 59/66/21 60/97/21 +f 57/99/19 50/869/19 52/100/19 +f 67/103/26 66/870/26 65/871/26 +f 65/871/26 80/872/26 79/873/26 +f 79/873/26 78/874/26 77/875/26 +f 77/875/26 76/876/26 75/101/26 +f 75/101/26 74/877/26 73/878/26 +f 73/878/26 72/879/26 71/102/26 +f 71/102/26 70/880/26 69/881/26 +f 69/881/26 68/882/26 67/103/26 +f 67/103/26 65/871/26 79/873/26 +f 79/873/26 77/875/26 67/103/26 +f 77/875/26 75/101/26 67/103/26 +f 75/101/26 73/878/26 71/102/26 +f 71/102/26 69/881/26 67/103/26 +f 187/104/25 203/883/25 202/105/25 +f 187/107/25 188/884/25 204/108/25 +f 188/110/25 189/885/25 205/111/25 +f 190/113/25 206/886/25 205/114/25 +f 191/116/25 207/887/25 206/117/25 +f 192/119/25 208/888/25 207/120/25 +f 177/122/25 193/889/25 208/123/25 +f 177/125/25 178/890/25 194/126/25 +f 178/128/25 179/891/25 195/129/25 +f 179/131/25 180/892/25 196/132/25 +f 180/134/25 181/893/25 197/135/25 +f 182/137/25 198/894/25 197/138/25 +f 183/140/25 199/895/25 198/141/25 +f 184/143/25 200/896/25 199/144/25 +f 185/146/25 201/897/25 200/147/25 +f 186/149/25 202/898/25 201/150/25 +f 209/154/25 210/899/25 211/900/25 +f 211/900/25 212/901/25 213/902/25 +f 213/902/25 214/903/25 215/904/25 +f 215/904/25 216/905/25 217/152/25 +f 217/152/25 218/906/25 219/907/25 +f 219/907/25 220/908/25 217/152/25 +f 220/908/25 221/153/25 217/152/25 +f 221/153/25 222/909/25 209/154/25 +f 222/909/25 223/910/25 209/154/25 +f 223/910/25 224/911/25 209/154/25 +f 209/154/25 211/900/25 213/902/25 +f 213/902/25 215/904/25 209/154/25 +f 215/904/25 217/152/25 209/154/25 +f 226/155/17 225/162/17 237/156/17 +f 228/158/27 226/155/27 238/157/27 +f 227/160/18 228/158/18 240/159/18 +f 225/162/28 227/912/28 239/163/28 +f 230/164/25 226/155/25 228/158/25 +f 231/166/26 227/913/26 225/167/26 +f 232/165/18 228/158/18 227/169/18 +f 229/168/17 225/167/17 226/155/17 +f 243/171/17 229/177/17 230/164/17 +f 244/172/29 230/164/29 232/165/29 +f 242/173/18 232/165/18 231/174/18 +f 241/176/30 231/914/30 229/177/30 +f 239/178/18 240/159/18 233/179/18 +f 238/157/17 237/183/17 236/181/17 +f 240/159/22 238/157/22 235/182/22 +f 237/183/21 239/915/21 234/184/21 +f 244/172/21 242/173/21 247/185/21 +f 241/187/22 243/190/22 246/188/22 +f 243/190/17 244/172/17 245/186/17 +f 242/173/18 241/916/18 248/191/18 +f 264/192/18 249/917/18 250/193/18 +f 263/195/21 250/918/21 252/196/21 +f 262/198/22 251/201/22 249/199/22 +f 261/197/17 252/196/17 251/201/17 +f 258/202/26 255/919/26 256/203/26 +f 254/205/25 253/920/25 260/206/25 +f 256/208/22 254/921/22 259/209/22 +f 253/211/21 255/922/21 258/212/21 +f 258/202/31 257/204/31 264/192/31 +f 260/213/21 258/212/21 263/195/21 +f 257/210/22 259/209/22 262/198/22 +f 262/198/32 259/207/32 260/206/32 +f 267/214/26 268/225/26 266/215/26 +f 272/217/25 276/234/25 275/218/25 +f 270/220/25 274/223/25 273/221/25 +f 274/223/21 278/228/21 277/224/21 +f 268/225/22 272/217/22 271/219/22 +f 265/226/21 270/220/21 269/222/21 +f 278/228/25 279/235/25 280/229/25 +f 273/230/18 277/224/18 280/229/18 +f 275/232/17 279/235/17 278/228/17 +f 276/234/22 280/229/22 279/235/22 +f 265/237/17 266/923/17 275/232/17 +f 266/923/17 271/924/17 275/232/17 +f 275/232/17 274/233/17 265/237/17 +f 286/238/17 285/265/17 281/239/17 +f 288/241/17 287/263/17 283/242/17 +f 282/244/17 289/261/17 290/245/17 +f 293/249/18 295/264/18 296/250/18 +f 291/252/18 297/262/18 298/253/18 +f 300/255/18 299/260/18 294/256/18 +f 290/245/27 300/255/27 298/253/27 +f 299/260/22 300/255/22 290/245/22 +f 288/241/25 298/253/25 297/262/25 +f 287/263/29 297/262/29 296/250/29 +f 286/238/21 296/250/21 295/264/21 +f 307/266/25 308/270/25 305/267/25 +f 303/269/18 305/267/18 308/270/18 +f 302/272/17 307/266/17 306/268/17 +f 304/274/22 308/270/22 307/266/22 +f 301/276/21 306/268/21 305/267/21 +f 320/278/26 324/925/26 323/279/26 +f 315/281/22 316/289/22 313/282/22 +f 312/284/26 316/289/26 315/281/26 +f 309/286/25 314/283/25 313/282/25 +f 311/288/18 313/282/18 316/289/18 +f 310/291/17 315/281/17 314/283/17 +f 317/293/25 322/926/25 321/294/25 +f 319/295/18 321/927/18 324/296/18 +f 318/280/17 323/928/17 322/297/17 +f 320/278/21 318/280/21 317/293/21 +f 331/298/25 332/302/25 329/299/25 +f 327/301/18 329/299/18 332/302/18 +f 326/304/17 331/298/17 330/300/17 +f 328/306/22 332/302/22 331/298/22 +f 325/308/21 330/300/21 329/299/21 +f 336/313/22 340/311/22 339/314/22 +f 333/316/21 338/929/21 337/317/21 +f 335/319/18 337/335/18 340/320/18 +f 334/322/17 339/338/17 338/323/17 +f 346/325/22 348/353/22 350/326/22 +f 342/330/25 345/346/25 346/331/25 +f 343/312/22 346/325/22 341/333/22 +f 337/335/33 342/330/33 343/332/33 +f 338/336/21 344/930/21 345/337/21 +f 339/338/26 341/344/26 344/339/26 +f 349/340/21 353/931/21 351/341/21 +f 344/343/21 349/932/21 347/342/21 +f 341/344/31 350/351/31 349/345/31 +f 345/346/32 347/356/32 348/347/32 +f 352/348/22 356/933/22 358/349/22 +f 350/351/18 354/364/18 353/352/18 +f 348/353/22 352/348/22 354/354/22 +f 347/356/17 351/361/17 352/357/17 +f 355/358/25 359/367/25 360/359/25 +f 351/361/32 355/358/32 356/360/32 +f 353/362/21 357/934/21 355/363/21 +f 354/364/31 358/371/31 357/365/31 +f 362/366/32 360/359/32 359/367/32 +f 357/369/21 361/935/21 359/370/21 +f 358/371/26 362/936/26 361/372/26 +f 358/373/22 356/933/22 360/374/22 +f 369/379/25 370/387/25 367/380/25 +f 366/382/22 370/387/22 369/379/22 +f 363/384/21 368/381/21 367/380/21 +f 365/386/18 367/380/18 370/387/18 +f 364/389/17 369/379/17 368/381/17 +f 373/391/18 375/399/18 378/392/18 +f 372/394/17 377/398/17 376/395/17 +f 374/397/26 378/937/26 377/398/26 +f 371/396/25 376/395/25 375/399/25 +f 387/400/18 389/416/18 392/401/18 +f 377/377/17 383/412/17 385/403/17 +f 380/404/17 379/938/17 391/405/17 +f 376/395/27 381/378/27 382/409/27 +f 381/378/22 385/403/22 386/410/22 +f 378/411/21 384/939/21 383/412/21 +f 382/409/18 386/410/18 384/413/18 +f 388/402/34 392/401/34 391/414/34 +f 380/404/35 390/406/35 389/416/35 +f 389/416/18 393/420/18 396/417/18 +f 391/405/17 395/940/17 394/418/17 +f 392/401/26 396/417/26 395/419/26 +f 390/406/25 394/418/25 393/420/25 +f 395/421/21 400/941/21 399/422/21 +f 398/426/26 402/431/26 400/429/26 +f 394/423/25 399/422/25 401/430/25 +f 397/428/22 401/430/22 402/431/22 +f 393/420/23 397/428/23 398/426/23 +f 404/434/22 408/442/22 406/435/22 +f 403/438/17 407/443/17 408/442/17 +f 400/437/21 405/942/21 407/443/21 +f 402/432/18 406/435/18 405/444/18 +f 399/422/32 403/438/32 404/434/32 +f 412/449/22 416/455/22 418/450/22 +f 410/441/26 422/463/26 421/452/26 +f 415/454/20 417/943/20 418/450/20 +f 411/456/25 415/458/25 416/455/25 +f 413/457/21 417/944/21 415/458/21 +f 413/459/26 414/451/26 418/450/26 +f 406/435/31 410/441/31 409/453/31 +f 412/449/25 420/462/25 419/461/25 +f 419/461/36 421/945/36 413/457/36 +f 409/448/21 421/945/21 419/461/21 +f 407/446/25 419/461/25 420/462/25 +f 408/440/22 420/462/22 422/463/22 +f 422/463/37 420/462/37 412/449/37 +f 414/451/26 413/459/26 421/452/26 +f 423/464/22 428/468/22 430/465/22 +f 424/467/26 427/946/26 428/468/26 +f 426/466/25 430/465/25 429/469/25 +f 425/470/21 429/469/21 427/471/21 +f 432/473/18 436/483/18 435/474/18 +f 431/475/33 429/469/33 430/465/33 +f 431/475/21 435/474/21 433/480/21 +f 427/481/17 433/947/17 434/482/17 +f 428/477/22 434/482/22 436/483/22 +f 474/484/17 473/511/17 469/485/17 +f 476/487/17 475/509/17 471/488/17 +f 470/490/17 477/507/17 478/491/17 +f 481/495/18 483/510/18 484/496/18 +f 479/498/18 485/508/18 486/499/18 +f 488/501/18 487/506/18 482/502/18 +f 478/491/27 488/501/27 486/499/27 +f 487/506/22 488/501/22 478/491/22 +f 476/487/25 486/499/25 485/508/25 +f 475/509/29 485/508/29 484/496/29 +f 474/484/21 484/496/21 483/510/21 +f 494/512/17 493/539/17 489/513/17 +f 496/515/17 495/537/17 491/516/17 +f 490/518/17 497/535/17 498/519/17 +f 501/523/18 503/538/18 504/524/18 +f 499/526/18 505/536/18 506/527/18 +f 508/529/18 507/534/18 502/530/18 +f 498/519/27 508/529/27 506/527/27 +f 507/534/22 508/529/22 498/519/22 +f 496/515/25 506/527/25 505/536/25 +f 495/537/29 505/536/29 504/524/29 +f 494/512/21 504/524/21 503/538/21 +f 514/540/17 513/567/17 509/541/17 +f 516/543/17 515/565/17 511/544/17 +f 510/546/17 517/563/17 518/547/17 +f 521/551/18 523/566/18 524/552/18 +f 519/554/18 525/564/18 526/555/18 +f 528/557/18 527/562/18 522/558/18 +f 518/547/27 528/557/27 526/555/27 +f 527/562/22 528/557/22 518/547/22 +f 516/543/25 526/555/25 525/564/25 +f 515/565/29 525/564/29 524/552/29 +f 514/540/21 524/552/21 523/566/21 +f 534/568/17 533/595/17 529/569/17 +f 536/571/17 535/593/17 531/572/17 +f 530/574/17 537/591/17 538/575/17 +f 541/579/18 543/594/18 544/580/18 +f 539/582/18 545/592/18 546/583/18 +f 548/585/18 547/590/18 542/586/18 +f 538/575/27 548/585/27 546/583/27 +f 547/590/22 548/585/22 538/575/22 +f 536/571/25 546/583/25 545/592/25 +f 535/593/29 545/592/29 544/580/29 +f 534/568/21 544/580/21 543/594/21 +f 554/596/17 553/623/17 549/597/17 +f 556/599/17 555/621/17 551/600/17 +f 550/602/17 557/619/17 558/603/17 +f 561/607/18 563/622/18 564/608/18 +f 559/610/18 565/620/18 566/611/18 +f 568/613/18 567/618/18 562/614/18 +f 558/603/27 568/613/27 566/611/27 +f 567/618/22 568/613/22 558/603/22 +f 556/599/25 566/611/25 565/620/25 +f 555/621/29 565/620/29 564/608/29 +f 554/596/21 564/608/21 563/622/21 +f 582/624/18 570/640/18 569/625/18 +f 572/627/29 570/640/29 582/624/29 +f 571/629/17 572/627/17 584/628/17 +f 581/626/30 569/625/30 571/631/30 +f 574/633/25 570/640/25 572/627/25 +f 573/635/26 575/948/26 571/636/26 +f 576/634/17 572/627/17 571/638/17 +f 573/635/18 569/637/18 570/640/18 +f 587/641/18 573/647/18 574/633/18 +f 588/642/27 574/633/27 576/634/27 +f 586/643/17 576/634/17 575/644/17 +f 587/641/28 585/949/28 575/646/28 +f 583/648/17 584/628/17 577/649/17 +f 582/624/18 581/653/18 580/651/18 +f 584/628/21 582/624/21 579/652/21 +f 581/653/22 583/950/22 578/654/22 +f 588/642/22 586/643/22 591/655/22 +f 585/657/21 587/660/21 590/658/21 +f 587/660/18 588/642/18 589/656/18 +f 586/643/17 585/951/17 592/661/17 +f 608/662/17 593/952/17 594/663/17 +f 607/665/22 594/953/22 596/666/22 +f 606/668/21 595/671/21 593/669/21 +f 605/667/18 596/666/18 595/671/18 +f 602/672/26 599/954/26 600/673/26 +f 598/675/25 597/955/25 604/676/25 +f 600/678/21 598/956/21 603/679/21 +f 597/681/22 599/957/22 602/682/22 +f 602/672/38 601/674/38 608/662/38 +f 604/683/22 602/682/22 607/665/22 +f 601/680/21 603/679/21 606/668/21 +f 603/677/33 604/676/33 605/667/33 +f 610/684/22 609/691/22 621/685/22 +f 612/687/33 610/684/33 622/686/33 +f 611/689/21 612/687/21 624/688/21 +f 609/691/38 611/958/38 623/692/38 +f 614/693/25 610/684/25 612/687/25 +f 615/695/26 611/959/26 609/696/26 +f 616/694/21 612/687/21 611/698/21 +f 613/697/22 609/696/22 610/684/22 +f 627/700/22 613/706/22 614/693/22 +f 626/702/32 628/701/32 614/693/32 +f 626/702/21 616/694/21 615/703/21 +f 625/705/31 615/960/31 613/706/31 +f 623/707/21 624/688/21 617/708/21 +f 622/686/22 621/712/22 620/710/22 +f 624/688/18 622/686/18 619/711/18 +f 621/712/17 623/961/17 618/713/17 +f 628/701/17 626/702/17 631/714/17 +f 625/716/18 627/719/18 630/717/18 +f 627/719/22 628/701/22 629/715/22 +f 626/702/21 625/962/21 632/720/21 +f 648/721/21 633/963/21 634/722/21 +f 647/724/17 634/964/17 636/725/17 +f 646/727/18 635/730/18 633/728/18 +f 645/726/22 636/725/22 635/730/22 +f 642/731/26 639/965/26 640/732/26 +f 638/734/25 637/966/25 644/735/25 +f 640/737/18 638/967/18 643/738/18 +f 637/740/17 639/968/17 642/741/17 +f 642/731/28 641/733/28 648/721/28 +f 644/742/17 642/741/17 647/724/17 +f 641/739/18 643/738/18 646/727/18 +f 646/727/27 643/736/27 644/735/27 +f 662/743/21 650/758/21 649/744/21 +f 652/746/32 650/758/32 662/743/32 +f 651/748/22 652/746/22 664/747/22 +f 649/744/31 651/969/31 663/750/31 +f 654/751/25 650/758/25 652/746/25 +f 655/753/26 651/970/26 649/754/26 +f 656/752/22 652/746/22 651/756/22 +f 653/755/21 649/754/21 650/758/21 +f 667/759/21 653/765/21 654/751/21 +f 668/760/33 654/751/33 656/752/33 +f 666/761/22 656/752/22 655/762/22 +f 667/759/38 665/971/38 655/764/38 +f 663/766/22 664/747/22 657/767/22 +f 662/743/21 661/771/21 660/769/21 +f 664/747/17 662/743/17 659/770/17 +f 661/771/18 663/972/18 658/772/18 +f 668/760/18 666/761/18 671/773/18 +f 665/775/17 667/778/17 670/776/17 +f 667/778/21 668/760/21 669/774/21 +f 666/761/22 665/973/22 672/779/22 +f 688/780/22 673/974/22 674/781/22 +f 687/783/18 674/975/18 676/784/18 +f 686/786/17 675/789/17 673/787/17 +f 685/785/21 676/784/21 675/789/21 +f 682/790/26 679/976/26 680/791/26 +f 678/793/25 677/977/25 684/794/25 +f 680/796/17 678/978/17 683/797/17 +f 677/799/18 679/979/18 682/800/18 +f 682/790/30 681/792/30 688/780/30 +f 684/801/18 682/800/18 687/783/18 +f 681/798/17 683/797/17 686/786/17 +f 686/786/29 683/795/29 684/794/29 +f 696/802/18 693/810/18 691/803/18 +f 690/805/17 694/813/17 695/806/17 +f 695/808/39 696/802/39 692/804/39 +f 693/810/40 694/813/40 690/805/40 +f 700/811/18 697/815/18 693/810/18 +f 698/812/17 699/980/17 695/806/17 +f 699/814/26 700/811/26 696/802/26 +f 697/815/25 698/812/25 694/813/25 +f 703/816/22 704/981/22 699/817/22 +f 704/824/26 706/826/26 702/820/26 +f 705/825/25 703/816/25 698/818/25 +f 706/826/21 705/825/21 701/823/21 +f 702/820/19 701/823/19 697/815/19 +f 710/830/21 712/837/21 708/828/21 +f 712/837/17 711/838/17 707/832/17 +f 711/838/22 709/982/22 704/833/22 +f 709/839/18 710/830/18 706/827/18 +f 708/828/32 707/832/32 703/816/32 +f 722/844/21 720/850/21 716/845/21 +f 725/847/26 726/857/26 714/835/26 +f 722/844/24 721/983/24 719/849/24 +f 720/850/25 719/852/25 715/851/25 +f 719/852/22 721/984/22 717/853/22 +f 717/854/26 721/985/26 722/844/26 +f 713/848/31 714/835/31 710/830/31 +f 716/845/25 715/851/25 723/855/25 +f 717/853/41 725/986/41 723/855/41 +f 723/855/22 725/986/22 713/842/22 +f 724/856/25 723/855/25 711/841/25 +f 726/857/21 724/856/21 712/836/21 +f 716/845/42 724/856/42 726/857/42 +f 718/846/26 726/857/26 725/847/26 +s 1 +f 438/987/43 83/988/19 468/989/19 +f 91/990/44 124/991/45 123/992/44 +f 125/993/46 94/994/47 126/995/47 +f 127/996/48 96/997/49 128/998/49 +f 113/999/50 82/1000/51 114/1001/51 +f 83/988/52 116/1002/53 115/1003/52 +f 117/1004/54 86/1005/55 118/1006/55 +f 122/1007/56 89/1008/57 90/1009/56 +f 87/1010/58 120/1011/59 119/1012/58 +f 468/989/19 82/1000/60 447/1013/60 +f 447/1013/60 81/1014/18 465/1015/18 +f 465/1015/18 96/997/61 446/1016/61 +f 457/1017/23 94/994/62 444/1018/62 +f 441/1019/17 88/1020/63 453/1021/63 +f 453/1021/63 87/1010/24 439/1022/24 +f 439/1022/24 86/1005/64 459/1023/64 +f 114/1024/51 83/988/52 115/1025/52 +f 462/1026/65 89/1008/17 441/1019/17 +f 128/1027/49 81/1014/50 113/1028/50 +f 452/1029/66 91/990/20 463/1030/20 +f 127/1031/48 94/994/47 95/1032/48 +f 444/1018/62 93/1033/22 449/1034/22 +f 124/1035/45 93/1033/46 125/1036/46 +f 446/1016/61 95/1032/23 457/1017/23 +f 455/1037/21 84/1038/43 438/987/43 +f 90/1009/56 123/1039/44 122/1040/56 +f 88/1020/59 121/1041/57 120/1042/59 +f 459/1023/64 85/1043/21 455/1044/21 +f 86/1005/55 119/1045/58 118/1046/55 +f 463/1030/20 90/1009/65 462/1026/65 +f 85/1047/54 116/1048/53 84/1038/53 +f 449/1034/22 92/1049/66 452/1029/66 +f 132/1050/46 190/113/47 189/115/46 +f 79/1051/67 99/1052/68 78/1053/68 +f 78/1054/68 100/1055/69 77/1056/69 +f 77/1057/69 101/1058/70 76/1059/70 +f 76/1060/70 102/1061/71 75/1062/71 +f 75/1063/71 103/1064/72 74/1065/72 +f 73/1066/73 105/1067/74 72/1068/74 +f 74/1069/72 104/1070/73 73/1071/73 +f 72/1072/74 106/1073/75 71/1074/75 +f 71/1075/75 107/1076/76 70/1077/76 +f 70/1078/76 108/1079/77 69/1080/77 +f 69/1081/77 109/1082/78 68/1083/78 +f 68/1084/78 110/1085/79 67/1086/79 +f 67/1087/79 111/1088/80 66/1089/80 +f 65/1090/81 111/1088/80 112/1091/81 +f 65/1092/81 97/1093/82 80/1094/82 +f 79/1095/67 97/1093/82 98/1096/67 +f 171/1097/64 140/1098/21 172/1099/21 +f 178/128/51 142/1100/52 179/891/52 +f 173/1101/43 142/1100/19 174/1102/19 +f 169/1103/63 138/1104/24 170/1105/24 +f 140/1106/54 180/134/53 141/1107/53 +f 137/1108/59 185/146/57 184/148/59 +f 162/1109/23 131/1110/62 163/1111/62 +f 139/1112/55 183/140/58 182/142/55 +f 175/1113/60 144/1114/18 176/1115/18 +f 172/1116/21 141/1107/43 173/1101/43 +f 138/1104/58 184/143/59 183/145/58 +f 188/110/45 132/1050/46 189/885/46 +f 181/139/54 139/1112/55 182/137/55 +f 191/116/48 131/1110/47 130/1117/48 +f 177/125/50 143/1118/51 178/890/51 +f 129/1119/49 177/122/50 192/124/49 +f 134/1120/44 188/884/45 187/107/44 +f 191/121/48 129/1119/49 192/119/49 +f 142/1100/52 180/892/53 179/131/52 +f 186/149/56 136/1121/57 135/1122/56 +f 176/1115/18 129/1119/61 161/1123/61 +f 174/1102/19 143/1118/60 175/1113/60 +f 168/1124/17 137/1108/63 169/1103/63 +f 170/1105/24 139/1112/64 171/1097/64 +f 167/1125/65 136/1121/17 168/1124/17 +f 165/1126/66 134/1120/20 166/1127/20 +f 163/1111/62 132/1050/22 164/1128/22 +f 161/1123/61 130/1117/23 162/1109/23 +f 135/1122/56 187/104/44 186/106/56 +f 166/1127/20 135/1122/65 167/1125/65 +f 164/1128/22 133/1129/66 165/1126/66 +f 146/1130/67 163/1111/68 147/1131/68 +f 147/1132/68 164/1128/69 148/1133/69 +f 148/1134/69 165/1126/70 149/1135/70 +f 149/1136/70 166/1127/71 150/1137/71 +f 150/1138/71 167/1125/72 151/1139/72 +f 152/1140/73 169/1103/74 153/1141/74 +f 151/1142/72 168/1124/73 152/1143/73 +f 153/1144/74 170/1105/75 154/1145/75 +f 154/1146/75 171/1097/76 155/1147/76 +f 155/1148/76 172/1099/77 156/1149/77 +f 156/1150/77 173/1101/78 157/1151/78 +f 157/1152/78 174/1102/79 158/1153/79 +f 158/1154/79 175/1113/80 159/1155/80 +f 159/1156/80 176/1115/81 160/1157/81 +f 160/1158/81 161/1123/82 145/1159/82 +f 146/1160/67 161/1123/82 162/1109/67 +f 205/111/21 220/1161/43 204/112/43 +f 198/894/62 213/1162/22 197/138/22 +f 206/886/64 221/1163/21 205/114/21 +f 199/895/23 214/1164/62 198/141/62 +f 207/887/24 222/1165/64 206/117/64 +f 200/896/61 215/1166/23 199/144/23 +f 208/888/63 223/1167/24 207/120/24 +f 201/897/18 216/1168/61 200/147/61 +f 194/126/65 209/1169/17 193/127/17 +f 193/889/17 224/1170/63 208/123/63 +f 202/898/60 217/1171/18 201/150/18 +f 195/129/20 210/1172/65 194/130/65 +f 203/883/19 218/1173/60 202/105/60 +f 196/132/66 211/1174/20 195/133/20 +f 204/108/43 219/1175/19 203/109/19 +f 197/135/22 212/1176/66 196/136/66 +f 149/1177/66 123/1178/20 124/1179/66 +f 150/1180/20 122/1181/65 123/1178/20 +f 151/1182/65 121/1183/17 122/1181/65 +f 152/1184/17 120/1185/63 121/1183/17 +f 153/1186/63 119/1187/24 120/1185/63 +f 154/1188/24 118/1189/64 119/1187/24 +f 155/1190/64 117/1191/21 118/1189/64 +f 156/1192/21 116/1193/43 117/1194/21 +f 157/1195/43 115/1196/19 116/1193/43 +f 158/1197/19 114/1198/60 115/1196/19 +f 159/1199/60 113/1200/18 114/1198/60 +f 160/1201/18 128/1202/61 113/1200/18 +f 145/1203/61 127/1204/23 128/1202/61 +f 146/1205/23 126/1206/62 127/1204/23 +f 147/1207/62 125/1208/22 126/1206/62 +f 148/1209/22 124/1179/66 125/1208/22 +f 100/1055/22 451/1210/66 101/1058/66 +f 102/1061/20 461/1211/65 103/1064/65 +f 107/1076/64 456/1212/21 108/1079/21 +f 108/1213/21 437/1214/43 109/1082/43 +f 97/1093/61 458/1215/23 98/1096/23 +f 99/1052/62 450/1216/22 100/1055/22 +f 101/1058/66 464/1217/20 102/1061/20 +f 103/1064/65 442/1218/17 104/1070/17 +f 106/1073/24 460/1219/64 107/1076/64 +f 105/1067/63 440/1220/24 106/1073/24 +f 104/1070/17 454/1221/63 105/1067/63 +f 98/1096/23 443/1222/62 99/1052/62 +f 112/1091/18 445/1223/61 97/1093/61 +f 111/1088/60 466/1224/18 112/1091/18 +f 110/1085/19 448/1225/60 111/1088/60 +f 109/1082/43 467/1226/19 110/1085/19 +f 438/987/43 84/1038/43 83/988/19 +f 91/990/44 92/1049/45 124/991/45 +f 125/993/46 93/1033/46 94/994/47 +f 127/996/48 95/1032/48 96/997/49 +f 113/999/50 81/1014/50 82/1000/51 +f 83/988/52 84/1038/53 116/1002/53 +f 117/1004/54 85/1043/54 86/1005/55 +f 122/1007/56 121/1227/57 89/1008/57 +f 87/1010/58 88/1020/59 120/1011/59 +f 468/989/19 83/988/19 82/1000/60 +f 447/1013/60 82/1000/60 81/1014/18 +f 465/1015/18 81/1014/18 96/997/61 +f 457/1017/23 95/1032/23 94/994/62 +f 441/1019/17 89/1008/17 88/1020/63 +f 453/1021/63 88/1020/63 87/1010/24 +f 439/1022/24 87/1010/24 86/1005/64 +f 114/1024/51 82/1000/51 83/988/52 +f 462/1026/65 90/1009/65 89/1008/17 +f 128/1027/49 96/997/49 81/1014/50 +f 452/1029/66 92/1049/66 91/990/20 +f 127/1031/48 126/1228/47 94/994/47 +f 444/1018/62 94/994/62 93/1033/22 +f 124/1035/45 92/1049/45 93/1033/46 +f 446/1016/61 96/997/61 95/1032/23 +f 455/1037/21 85/1047/21 84/1038/43 +f 90/1009/56 91/990/44 123/1039/44 +f 88/1020/59 89/1008/57 121/1041/57 +f 459/1023/64 86/1005/64 85/1043/21 +f 86/1005/55 87/1010/58 119/1045/58 +f 463/1030/20 91/990/20 90/1009/65 +f 85/1047/54 117/1229/54 116/1048/53 +f 449/1034/22 93/1033/22 92/1049/66 +f 132/1050/46 131/1110/47 190/113/47 +f 79/1051/67 98/1096/67 99/1052/68 +f 78/1054/68 99/1052/68 100/1055/69 +f 77/1057/69 100/1055/69 101/1058/70 +f 76/1060/70 101/1058/70 102/1061/71 +f 75/1063/71 102/1061/71 103/1064/72 +f 73/1066/73 104/1070/73 105/1067/74 +f 74/1069/72 103/1064/72 104/1070/73 +f 72/1072/74 105/1067/74 106/1073/75 +f 71/1075/75 106/1073/75 107/1076/76 +f 70/1078/76 107/1076/76 108/1079/77 +f 69/1081/77 108/1213/77 109/1082/78 +f 68/1084/78 109/1082/78 110/1085/79 +f 67/1087/79 110/1085/79 111/1088/80 +f 65/1090/81 66/1230/80 111/1088/80 +f 65/1092/81 112/1091/81 97/1093/82 +f 79/1095/67 80/1231/82 97/1093/82 +f 171/1097/64 139/1112/64 140/1098/21 +f 178/128/51 143/1118/51 142/1100/52 +f 173/1101/43 141/1107/43 142/1100/19 +f 169/1103/63 137/1108/63 138/1104/24 +f 140/1106/54 181/893/54 180/134/53 +f 137/1108/59 136/1121/57 185/146/57 +f 162/1109/23 130/1117/23 131/1110/62 +f 139/1112/55 138/1104/58 183/140/58 +f 175/1113/60 143/1118/60 144/1114/18 +f 172/1116/21 140/1106/21 141/1107/43 +f 138/1104/58 137/1108/59 184/143/59 +f 188/110/45 133/1129/45 132/1050/46 +f 181/139/54 140/1098/54 139/1112/55 +f 191/116/48 190/118/47 131/1110/47 +f 177/125/50 144/1114/50 143/1118/51 +f 129/1119/49 144/1114/50 177/122/50 +f 134/1120/44 133/1129/45 188/884/45 +f 191/121/48 130/1117/48 129/1119/49 +f 142/1100/52 141/1107/53 180/892/53 +f 186/149/56 185/151/57 136/1121/57 +f 176/1115/18 144/1114/18 129/1119/61 +f 174/1102/19 142/1100/19 143/1118/60 +f 168/1124/17 136/1121/17 137/1108/63 +f 170/1105/24 138/1104/24 139/1112/64 +f 167/1125/65 135/1122/65 136/1121/17 +f 165/1126/66 133/1129/66 134/1120/20 +f 163/1111/62 131/1110/62 132/1050/22 +f 161/1123/61 129/1119/61 130/1117/23 +f 135/1122/56 134/1120/44 187/104/44 +f 166/1127/20 134/1120/20 135/1122/65 +f 164/1128/22 132/1050/22 133/1129/66 +f 146/1130/67 162/1109/67 163/1111/68 +f 147/1132/68 163/1111/68 164/1128/69 +f 148/1134/69 164/1128/69 165/1126/70 +f 149/1136/70 165/1126/70 166/1127/71 +f 150/1138/71 166/1127/71 167/1125/72 +f 152/1140/73 168/1124/73 169/1103/74 +f 151/1142/72 167/1125/72 168/1124/73 +f 153/1144/74 169/1103/74 170/1105/75 +f 154/1146/75 170/1105/75 171/1097/76 +f 155/1148/76 171/1097/76 172/1099/77 +f 156/1150/77 172/1116/77 173/1101/78 +f 157/1152/78 173/1101/78 174/1102/79 +f 158/1154/79 174/1102/79 175/1113/80 +f 159/1156/80 175/1113/80 176/1115/81 +f 160/1158/81 176/1115/81 161/1123/82 +f 146/1160/67 145/1232/82 161/1123/82 +f 205/111/21 221/1233/21 220/1161/43 +f 198/894/62 214/1234/62 213/1162/22 +f 206/886/64 222/1235/64 221/1163/21 +f 199/895/23 215/1236/23 214/1164/62 +f 207/887/24 223/1237/24 222/1165/64 +f 200/896/61 216/1238/61 215/1166/23 +f 208/888/63 224/1239/63 223/1167/24 +f 201/897/18 217/1240/18 216/1168/61 +f 194/126/65 210/1241/65 209/1169/17 +f 193/889/17 209/1242/17 224/1170/63 +f 202/898/60 218/1243/60 217/1171/18 +f 195/129/20 211/1244/20 210/1172/65 +f 203/883/19 219/1245/19 218/1173/60 +f 196/132/66 212/1246/66 211/1174/20 +f 204/108/43 220/1247/43 219/1175/19 +f 197/135/22 213/1248/22 212/1176/66 +f 149/1177/66 150/1180/20 123/1178/20 +f 150/1180/20 151/1182/65 122/1181/65 +f 151/1182/65 152/1184/17 121/1183/17 +f 152/1184/17 153/1186/63 120/1185/63 +f 153/1186/63 154/1188/24 119/1187/24 +f 154/1188/24 155/1190/64 118/1189/64 +f 155/1190/64 156/1249/21 117/1191/21 +f 156/1192/21 157/1195/43 116/1193/43 +f 157/1195/43 158/1197/19 115/1196/19 +f 158/1197/19 159/1199/60 114/1198/60 +f 159/1199/60 160/1201/18 113/1200/18 +f 160/1201/18 145/1203/61 128/1202/61 +f 145/1203/61 146/1205/23 127/1204/23 +f 146/1205/23 147/1207/62 126/1206/62 +f 147/1207/62 148/1209/22 125/1208/22 +f 148/1209/22 149/1177/66 124/1179/66 +f 100/1055/22 450/1216/22 451/1210/66 +f 102/1061/20 464/1217/20 461/1211/65 +f 107/1076/64 460/1219/64 456/1212/21 +f 108/1213/21 456/1250/21 437/1214/43 +f 97/1093/61 445/1223/61 458/1215/23 +f 99/1052/62 443/1222/62 450/1216/22 +f 101/1058/66 451/1210/66 464/1217/20 +f 103/1064/65 461/1211/65 442/1218/17 +f 106/1073/24 440/1220/24 460/1219/64 +f 105/1067/63 454/1221/63 440/1220/24 +f 104/1070/17 442/1218/17 454/1221/63 +f 98/1096/23 458/1215/23 443/1222/62 +f 112/1091/18 466/1224/18 445/1223/61 +f 111/1088/60 448/1225/60 466/1224/18 +f 110/1085/19 467/1226/19 448/1225/60 +f 109/1082/43 437/1214/43 467/1226/19 diff --git a/src/main/resources/assets/hbm/textures/models/machines/supercomputer.png b/src/main/resources/assets/hbm/textures/models/machines/supercomputer.png new file mode 100644 index 0000000000000000000000000000000000000000..0095b0695979a82db0bf4c0af56ad1311edff535 GIT binary patch literal 2652 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/supercomputer_scan.png b/src/main/resources/assets/hbm/textures/models/machines/supercomputer_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..afc9d0439691452cdf038eaa6d557567ded313df GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^7C_9w!3HGP{IS^#q*#ibJVQ8upoSx*1IX9#ba4!^ z=uJ*ZNceHyz=dJ8!pj+%3uJw>4PG5w$meEjapm9&_I4`<25Vs^-D>{wK%gE5Pgg&e IbxsLQ0JLcxuK)l5 literal 0 HcmV?d00001 From c64d10f62dcb0a9cbe14708a0c9a459e8ddebd1d Mon Sep 17 00:00:00 2001 From: FluffsADev <181914317+FluffsADev@users.noreply.github.com> Date: Sun, 21 Jun 2026 22:44:48 -0400 Subject: [PATCH 028/107] Added Vitya's Model and Texture Changes Co-Authored-By: TheVitya2127 --- .../hbm/models/pheodoors/cargo_door.obj | 6145 ++--------------- 1 file changed, 406 insertions(+), 5739 deletions(-) diff --git a/src/main/resources/assets/hbm/models/pheodoors/cargo_door.obj b/src/main/resources/assets/hbm/models/pheodoors/cargo_door.obj index 2f82cd0a4..734593a9c 100644 --- a/src/main/resources/assets/hbm/models/pheodoors/cargo_door.obj +++ b/src/main/resources/assets/hbm/models/pheodoors/cargo_door.obj @@ -1,5741 +1,408 @@ -# Made in Blockbench 5.0.7 -mtllib cargo_door.mtl +# Blender 5.1.2 +# www.blender.org + +# Made By TheVitya2127 -o Frame -v 0.1875 0.0625 1.5 -v -0.1875 0.0625 -1.5 -v -0.1875 0.0625 1.5 -v -0.25 0 1.5 -v -0.25 0 -1.5 -v 0.25 0 1.5 -v 0.25 0 -1.5 -v 0.1875 2.9375 1.5 -v 0.125 2.9375 -1.5 -v 0.1875 2.9375 -1.5 -v -0.1875 2.9375 -1.5 -v -0.125 2.9375 1.5 -v -0.1875 2.9375 1.5 -v 0.25 3 1.5 -v -0.25 3 -1.5 -v -0.125 3 1.5 -v -0.125 3 -1.5 -v 0.25 3 -1.5 -v 0.125 3 1.5 -v -0.25 3 1.5 -v 0.125 2.9375 1.5 -v -0.125 2.9375 -1.5 -v 0.125 3 -1.5 -v 0.1875 0.0625 -1.5 -vt 0.1171875 0.625 -vt 0.0703125 1 -vt 0.0703125 0.625 -vt 0.171875 0.953125 -vt 0.546875 0.9420765625 -vt 0.546875 0.953125 -vt 0 0.625 -vt 0.0625 1 -vt 0 1 -vt 0.546875 0.9186390625 -vt 0.171875 0.9296875 -vt 0.171875 0.9186390625 -vt 0.859375 0.375 -vt 0.9140625 0.3828125 -vt 0.8671875 0.3828125 -vt 0.9140625 0.3203125 -vt 0.859375 0.3125 -vt 0.921875 0.3125 -vt 0.1796875 0.90625 -vt 0.171875 0.53125 -vt 0.1796875 0.53125 -vt 0.1875 0.53125 -vt 0.1953125 0.90625 -vt 0.1875 0.90625 -vt 0.546875 0.984375 -vt 0.171875 0.99542421875 -vt 0.171875 0.984375 -vt 0.125 1 -vt 0.140625 0.625 -vt 0.140625 1 -vt 0.1640625 1 -vt 0.1484375 0.625 -vt 0.1640625 0.625 -vt 0.171875 0.97198671875 -vt 0.546875 0.9609375 -vt 0.546875 0.97198671875 -vt 0.0703125 0.140625 -vt 0.078125 0.1484375 -vt 0.0625 0.1484375 -vt 0.09375 0.140625 -vt 0.0859375 0.1484375 -vt 0.0859375 0.140625 -vt 0.1796875 0.140625 -vt 0.171875 0.1484375 -vt 0.171875 0.140625 -vt 0.875 0.3046875 -vt 0.8671875 0.296875 -vt 0.875 0.296875 -vt 0.578125 0.8984375 -vt 0.203125 0.90625 -vt 0.203125 0.8984375 -vt 0.578125 0.8828125 -vt 0.203125 0.890625 -vt 0.203125 0.8828125 -vt 0.1171875 0.625 -vt 0.1171875 1 -vt 0.0703125 1 -vt 0.171875 0.953125 -vt 0.171875 0.9420765625 -vt 0.546875 0.9420765625 -vt 0 0.625 -vt 0.0625 0.625 -vt 0.0625 1 -vt 0.546875 0.9186390625 -vt 0.546875 0.9296875 -vt 0.171875 0.9296875 -vt 0.859375 0.375 -vt 0.921875 0.375 -vt 0.9140625 0.3828125 -vt 0.9140625 0.3203125 -vt 0.8671875 0.3203125 -vt 0.859375 0.3125 -vt 0.1796875 0.90625 -vt 0.171875 0.90625 -vt 0.171875 0.53125 -vt 0.1875 0.53125 -vt 0.1953125 0.53125 -vt 0.1953125 0.90625 -vt 0.546875 0.984375 -vt 0.546875 0.99542421875 -vt 0.171875 0.99542421875 -vt 0.125 1 -vt 0.125 0.625 -vt 0.140625 0.625 -vt 0.1640625 1 -vt 0.1484375 1 -vt 0.1484375 0.625 -vt 0.171875 0.97198671875 -vt 0.171875 0.9609375 -vt 0.546875 0.9609375 -vt 0.0703125 0.140625 -vt 0.078125 0.140625 -vt 0.078125 0.1484375 -vt 0.09375 0.140625 -vt 0.1015625 0.1484375 -vt 0.0859375 0.1484375 -vt 0.1796875 0.140625 -vt 0.1875 0.1484375 -vt 0.171875 0.1484375 -vt 0.875 0.3046875 -vt 0.859375 0.3046875 -vt 0.8671875 0.296875 -vt 0.578125 0.8984375 -vt 0.578125 0.90625 -vt 0.203125 0.90625 -vt 0.578125 0.8828125 -vt 0.578125 0.890625 -vt 0.203125 0.890625 -vn 0 1 0 -vn -0.7071067811865476 0.7071067811865476 0 -vn 0 -1 0 -vn 0.7071067811865476 0.7071067811865476 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 -1 0 -vn 0 -1 0 -vn 0.7071067811865476 -0.7071067811865476 0 -vn 0 1 0 -vn 0 1 0 -vn -0.7071067811865476 -0.7071067811865476 0 -vn 0 0 1 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 -vn 0 1 0 -vn -0.7071067811865476 0.7071067811865476 0 -vn 0 -1 0 -vn 0.7071067811865476 0.7071067811865476 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 -1 0 -vn 0 -1 0 -vn 0.7071067811865476 -0.7071067811865476 0 -vn 0 1 0 -vn 0 1 0 -vn -0.7071067811865476 -0.7071067811865476 0 -vn 0 0 1 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 -usemtl m_5f175e4e-a6a7-9193-e88f-70334c8bfde8 -f 1/1/1 2/2/1 3/3/1 -f 2/4/2 4/5/2 3/6/2 -f 5/7/3 6/8/3 4/9/3 -f 7/10/4 1/11/4 6/12/4 -f 4/13/5 1/14/5 3/15/5 -f 2/16/6 7/17/6 5/18/6 -f 8/19/7 9/20/7 10/21/7 -f 11/22/8 12/23/8 13/24/8 -f 10/25/9 14/26/9 8/27/9 -f 15/28/10 16/29/10 17/30/10 -f 18/31/11 19/32/11 14/33/11 -f 15/34/12 13/35/12 20/36/12 -f 13/37/13 16/38/13 20/39/13 -f 8/40/14 19/41/14 21/42/14 -f 11/43/15 17/44/15 22/45/15 -f 23/46/16 10/47/16 9/48/16 -f 22/49/17 16/50/17 12/51/17 -f 21/52/18 23/53/18 9/54/18 -f 1/55/19 24/56/19 2/57/19 -f 2/58/20 5/59/20 4/60/20 -f 5/61/21 7/62/21 6/63/21 -f 7/64/22 24/65/22 1/66/22 -f 4/67/23 6/68/23 1/69/23 -f 2/70/24 24/71/24 7/72/24 -f 8/73/25 21/74/25 9/75/25 -f 11/76/26 22/77/26 12/78/26 -f 10/79/27 18/80/27 14/81/27 -f 15/82/28 20/83/28 16/84/28 -f 18/85/29 23/86/29 19/87/29 -f 15/88/30 11/89/30 13/90/30 -f 13/91/31 12/92/31 16/93/31 -f 8/94/32 14/95/32 19/96/32 -f 11/97/33 15/98/33 17/99/33 -f 23/100/34 18/101/34 10/102/34 -f 22/103/35 17/104/35 16/105/35 -f 21/106/36 19/107/36 23/108/36 -o DoorTop -v 0 2.625 1.4375 -v 0 1.5625 0.5 -v -0.0625 1.5625 1.4375 -v 0 1.5625 1.4375 -v -0.0625 1.5625 0.5 -v -0.0625 1.4375 1.4375 -v 0 1.4375 0.5 -v 0 1.4375 1.4375 -v -0.0625 1.4375 0.5 -v 0 1.5625 -0.4375 -v -0.0625 1.5625 0.4375 -v 0 1.5625 0.4375 -v -0.0625 1.5625 -0.4375 -v -0.0625 1.4375 0.4375 -v -0.0625 1.4375 -0.4375 -v 0 1.4375 0.4375 -v 0 1.4375 -0.4375 -v 0 2.9375 -1.5 -v -0.125 2.9375 -1.4375 -v 0 2.9375 -1.4375 -v -0.125 2.9375 -1.5 -v -0.125 1.4375 -1.4375 -v -0.125 1.4375 -1.5 -v 0 1.4375 -1.4375 -v 0 1.59375 -1.5 -v 0 2.9375 1.4375 -v -0.125 2.9375 1.5 -v 0 2.9375 1.5 -v -0.125 2.9375 1.4375 -v -0.125 1.4375 1.5 -v -0.125 1.4375 1.4375 -v 0 1.4375 1.5 -v 0 1.59375 1.4375 -v 0 2.9375 0.4375 -v -0.125 2.9375 0.5 -v 0 2.9375 0.5 -v -0.125 2.9375 0.4375 -v -0.125 1.4375 0.5 -v -0.125 1.4375 0.4375 -v 0 1.4375 0.5 -v 0 1.59375 0.4375 -v 0 2.9375 -0.5 -v -0.125 2.9375 -0.4375 -v 0 2.9375 -0.4375 -v -0.125 2.9375 -0.5 -v -0.125 1.4375 -0.4375 -v -0.125 1.4375 -0.5 -v 0 1.4375 -0.4375 -v 0 1.59375 -0.5 -v 0 2.9375 0.5 -v -0.0625 2.9375 1.4375 -v 0 2.9375 1.4375 -v -0.0625 2.9375 0.5 -v -0.0625 2.875 1.4375 -v 0 2.875 0.5 -v 0 2.875 1.4375 -v -0.0625 2.875 0.5 -v 0 2.8125 0.5 -v -0.0625 2.8125 1.4375 -v 0 2.8125 1.4375 -v -0.0625 2.8125 0.5 -v -0.0625 2.75 1.4375 -v 0 2.75 0.5 -v 0 2.75 1.4375 -v -0.0625 2.75 0.5 -v 0 2.6875 0.5 -v -0.0625 2.6875 1.4375 -v 0 2.6875 1.4375 -v -0.0625 2.6875 0.5 -v -0.0625 2.625 1.4375 -v 0 2.625 0.5 -v -0.0625 2.625 0.5 -v 0 2.5625 0.5 -v -0.0625 2.5625 1.4375 -v 0 2.5625 1.4375 -v -0.0625 2.5625 0.5 -v -0.0625 2.5 1.4375 -v 0 2.5 0.5 -v 0 2.5 1.4375 -v -0.0625 2.5 0.5 -v 0 2.4375 0.5 -v -0.0625 2.4375 1.4375 -v 0 2.4375 1.4375 -v -0.0625 2.4375 0.5 -v -0.0625 2.375 1.4375 -v 0 2.375 0.5 -v 0 2.375 1.4375 -v -0.0625 2.375 0.5 -v 0 2.3125 0.5 -v -0.0625 2.3125 1.4375 -v 0 2.3125 1.4375 -v -0.0625 2.3125 0.5 -v -0.0625 2.25 1.4375 -v 0 2.25 0.5 -v 0 2.25 1.4375 -v -0.0625 2.25 0.5 -v 0 2.1875 0.5 -v -0.0625 2.1875 1.4375 -v 0 2.1875 1.4375 -v -0.0625 2.1875 0.5 -v -0.0625 2.125 1.4375 -v 0 2.125 0.5 -v 0 2.125 1.4375 -v -0.0625 2.125 0.5 -v 0 2.0625 0.5 -v -0.0625 2.0625 1.4375 -v 0 2.0625 1.4375 -v -0.0625 2.0625 0.5 -v -0.0625 2 1.4375 -v 0 2 0.5 -v 0 2 1.4375 -v -0.0625 2 0.5 -v 0 1.9375 0.5 -v -0.0625 1.9375 1.4375 -v 0 1.9375 1.4375 -v -0.0625 1.9375 0.5 -v -0.0625 1.875 1.4375 -v 0 1.875 0.5 -v 0 1.875 1.4375 -v -0.0625 1.875 0.5 -v 0 1.8125 0.5 -v -0.0625 1.8125 1.4375 -v 0 1.8125 1.4375 -v -0.0625 1.8125 0.5 -v -0.0625 1.75 1.4375 -v 0 1.75 0.5 -v 0 1.75 1.4375 -v -0.0625 1.75 0.5 -v 0 1.6875 0.5 -v -0.0625 1.6875 1.4375 -v 0 1.6875 1.4375 -v -0.0625 1.6875 0.5 -v -0.0625 1.625 1.4375 -v 0 1.625 0.5 -v 0 1.625 1.4375 -v -0.0625 1.625 0.5 -v 0 1.6875 -0.4375 -v -0.0625 1.6875 0.4375 -v 0 1.6875 0.4375 -v -0.0625 1.6875 -0.4375 -v -0.0625 1.625 0.4375 -v -0.0625 1.625 -0.4375 -v 0 1.625 0.4375 -v 0 1.625 -0.4375 -v 0 1.8125 -0.4375 -v -0.0625 1.8125 0.4375 -v 0 1.8125 0.4375 -v -0.0625 1.8125 -0.4375 -v -0.0625 1.75 0.4375 -v -0.0625 1.75 -0.4375 -v 0 1.75 0.4375 -v 0 1.75 -0.4375 -v 0 1.9375 -0.4375 -v -0.0625 1.9375 0.4375 -v 0 1.9375 0.4375 -v -0.0625 1.9375 -0.4375 -v -0.0625 1.875 0.4375 -v -0.0625 1.875 -0.4375 -v 0 1.875 0.4375 -v 0 1.875 -0.4375 -v 0 2.0625 -0.4375 -v -0.0625 2.0625 0.4375 -v 0 2.0625 0.4375 -v -0.0625 2.0625 -0.4375 -v -0.0625 2 0.4375 -v -0.0625 2 -0.4375 -v 0 2 0.4375 -v 0 2 -0.4375 -v 0 2.1875 -0.4375 -v -0.0625 2.1875 0.4375 -v 0 2.1875 0.4375 -v -0.0625 2.1875 -0.4375 -v -0.0625 2.125 0.4375 -v -0.0625 2.125 -0.4375 -v 0 2.125 0.4375 -v 0 2.125 -0.4375 -v 0 2.3125 -0.4375 -v -0.0625 2.3125 0.4375 -v 0 2.3125 0.4375 -v -0.0625 2.3125 -0.4375 -v -0.0625 2.25 0.4375 -v -0.0625 2.25 -0.4375 -v 0 2.25 0.4375 -v 0 2.25 -0.4375 -v 0 2.4375 -0.4375 -v -0.0625 2.4375 0.4375 -v 0 2.4375 0.4375 -v -0.0625 2.4375 -0.4375 -v -0.0625 2.375 0.4375 -v -0.0625 2.375 -0.4375 -v 0 2.375 0.4375 -v 0 2.375 -0.4375 -v 0 2.5625 -0.4375 -v -0.0625 2.5625 0.4375 -v 0 2.5625 0.4375 -v -0.0625 2.5625 -0.4375 -v -0.0625 2.5 0.4375 -v -0.0625 2.5 -0.4375 -v 0 2.5 0.4375 -v 0 2.5 -0.4375 -v 0 2.6875 -0.4375 -v -0.0625 2.6875 0.4375 -v 0 2.6875 0.4375 -v -0.0625 2.6875 -0.4375 -v -0.0625 2.625 0.4375 -v -0.0625 2.625 -0.4375 -v 0 2.625 0.4375 -v 0 2.625 -0.4375 -v 0 2.8125 -0.4375 -v -0.0625 2.8125 0.4375 -v 0 2.8125 0.4375 -v -0.0625 2.8125 -0.4375 -v -0.0625 2.75 0.4375 -v -0.0625 2.75 -0.4375 -v 0 2.75 0.4375 -v 0 2.75 -0.4375 -v 0 2.9375 -0.4375 -v -0.0625 2.9375 0.4375 -v 0 2.9375 0.4375 -v -0.0625 2.9375 -0.4375 -v -0.0625 2.875 0.4375 -v -0.0625 2.875 -0.4375 -v 0 2.875 0.4375 -v 0 2.875 -0.4375 -v 0 2.9375 -1.4375 -v -0.0625 2.9375 -0.5 -v 0 2.9375 -0.5 -v -0.0625 2.9375 -1.4375 -v -0.0625 2.875 -0.5 -v 0 2.875 -1.4375 -v 0 2.875 -0.5 -v -0.0625 2.875 -1.4375 -v 0 2.8125 -1.4375 -v -0.0625 2.8125 -0.5 -v 0 2.8125 -0.5 -v -0.0625 2.8125 -1.4375 -v -0.0625 2.75 -0.5 -v 0 2.75 -1.4375 -v 0 2.75 -0.5 -v -0.0625 2.75 -1.4375 -v 0 2.6875 -1.4375 -v -0.0625 2.6875 -0.5 -v 0 2.6875 -0.5 -v -0.0625 2.6875 -1.4375 -v -0.0625 2.625 -0.5 -v 0 2.625 -1.4375 -v 0 2.625 -0.5 -v -0.0625 2.625 -1.4375 -v 0 2.5625 -1.4375 -v -0.0625 2.5625 -0.5 -v 0 2.5625 -0.5 -v -0.0625 2.5625 -1.4375 -v -0.0625 2.5 -0.5 -v 0 2.5 -1.4375 -v 0 2.5 -0.5 -v -0.0625 2.5 -1.4375 -v 0 2.4375 -1.4375 -v -0.0625 2.4375 -0.5 -v 0 2.4375 -0.5 -v -0.0625 2.4375 -1.4375 -v -0.0625 2.375 -0.5 -v 0 2.375 -1.4375 -v 0 2.375 -0.5 -v -0.0625 2.375 -1.4375 -v 0 2.3125 -1.4375 -v -0.0625 2.3125 -0.5 -v 0 2.3125 -0.5 -v -0.0625 2.3125 -1.4375 -v -0.0625 2.25 -0.5 -v 0 2.25 -1.4375 -v 0 2.25 -0.5 -v -0.0625 2.25 -1.4375 -v 0 2.1875 -1.4375 -v -0.0625 2.1875 -0.5 -v 0 2.1875 -0.5 -v -0.0625 2.1875 -1.4375 -v -0.0625 2.125 -0.5 -v 0 2.125 -1.4375 -v 0 2.125 -0.5 -v -0.0625 2.125 -1.4375 -v 0 2.0625 -1.4375 -v -0.0625 2.0625 -0.5 -v 0 2.0625 -0.5 -v -0.0625 2.0625 -1.4375 -v -0.0625 2 -0.5 -v 0 2 -1.4375 -v 0 2 -0.5 -v -0.0625 2 -1.4375 -v 0 1.9375 -1.4375 -v -0.0625 1.9375 -0.5 -v 0 1.9375 -0.5 -v -0.0625 1.9375 -1.4375 -v -0.0625 1.875 -0.5 -v 0 1.875 -1.4375 -v 0 1.875 -0.5 -v -0.0625 1.875 -1.4375 -v 0 1.8125 -1.4375 -v -0.0625 1.8125 -0.5 -v 0 1.8125 -0.5 -v -0.0625 1.8125 -1.4375 -v -0.0625 1.75 -0.5 -v 0 1.75 -1.4375 -v 0 1.75 -0.5 -v -0.0625 1.75 -1.4375 -v 0 1.6875 -1.4375 -v -0.0625 1.6875 -0.5 -v 0 1.6875 -0.5 -v -0.0625 1.6875 -1.4375 -v -0.0625 1.625 -0.5 -v 0 1.625 -1.4375 -v 0 1.625 -0.5 -v -0.0625 1.625 -1.4375 -v 0 1.5625 -1.4375 -v -0.0625 1.5625 -0.5 -v 0 1.5625 -0.5 -v -0.0625 1.5625 -1.4375 -v -0.0625 1.4375 -0.5 -v 0 1.4375 -1.4375 -v 0 1.4375 -0.5 -v -0.0625 1.4375 -1.4375 -v 0 1.4375 -1.5 -v 0 1.4375 1.4375 -v 0 1.4375 0.4375 -v 0 1.4375 -0.5 -vt 0.4765625 0.6171875 -vt 0.46875 0.5 -vt 0.4765625 0.5 -vt 0 0.6171875 -vt 0.1171875 0.6015625 -vt 0.1171875 0.6171875 -vt 0.171875 0.5234375 -vt 0.1796875 0.40625 -vt 0.1796875 0.5234375 -vt 0.5078125 0.859375 -vt 0.390625 0.875 -vt 0.390625 0.859375 -vt 0.109375 0.1484375 -vt 0.1171875 0.1328125 -vt 0.1171875 0.1484375 -vt 0.8671875 0.2890625 -vt 0.859375 0.2734375 -vt 0.8671875 0.2734375 -vt 0.7578125 0.2578125 -vt 0.75 0.1484375 -vt 0.7578125 0.1484375 -vt 0.390625 0.7109375 -vt 0.5 0.6953125 -vt 0.5 0.7109375 -vt 0.46875 0.1328125 -vt 0.4765625 0.2421875 -vt 0.46875 0.2421875 -vt 0.5 0.671875 -vt 0.390625 0.6875 -vt 0.390625 0.671875 -vt 0.75 0.125 -vt 0.7578125 0.140625 -vt 0.75 0.140625 -vt 0.7734375 0.140625 -vt 0.765625 0.125 -vt 0.7734375 0.125 -vt 0.875 0.2265625 -vt 0.859375 0.21875 -vt 0.875 0.21875 -vt 0.125 0.6171875 -vt 0.1328125 0.4296875 -vt 0.1328125 0.6171875 -vt 0.859375 0.203125 -vt 0.875 0.2109375 -vt 0.859375 0.2109375 -vt 0.1484375 0.44921875 -vt 0.1484375 0.6171875 -vt 0.140625 0.6171875 -vt 0.203125 0.875 -vt 0.21875 0.6875 -vt 0.21875 0.875 -vt 0.2421875 0.875 -vt 0.2265625 0.875 -vt 0.2265625 0.70703125 -vt 0.875 0.1953125 -vt 0.859375 0.1875 -vt 0.875 0.1875 -vt 0.15625 0.6171875 -vt 0.1640625 0.4296875 -vt 0.1640625 0.6171875 -vt 0.859375 0.171875 -vt 0.875 0.1796875 -vt 0.859375 0.1796875 -vt 0.3984375 0.44921875 -vt 0.3984375 0.6171875 -vt 0.390625 0.6171875 -vt 0.25 0.875 -vt 0.265625 0.6875 -vt 0.265625 0.875 -vt 0.2890625 0.875 -vt 0.2734375 0.875 -vt 0.2734375 0.70703125 -vt 0.875 0.1640625 -vt 0.859375 0.15625 -vt 0.875 0.15625 -vt 0 0.59375 -vt 0.0078125 0.40625 -vt 0.0078125 0.59375 -vt 0.859375 0.140625 -vt 0.875 0.1484375 -vt 0.859375 0.1484375 -vt 0.0234375 0.42578125 -vt 0.0234375 0.59375 -vt 0.015625 0.59375 -vt 0.296875 0.875 -vt 0.3125 0.6875 -vt 0.3125 0.875 -vt 0.3359375 0.875 -vt 0.3203125 0.875 -vt 0.3203125 0.70703125 -vt 0.078125 0.1328125 -vt 0.0625 0.125 -vt 0.078125 0.125 -vt 0.03125 0.59375 -vt 0.0390625 0.40625 -vt 0.0390625 0.59375 -vt 0.0859375 0.125 -vt 0.1015625 0.1328125 -vt 0.0859375 0.1328125 -vt 0.0546875 0.42578125 -vt 0.0546875 0.59375 -vt 0.046875 0.59375 -vt 0.203125 0.6796875 -vt 0.21875 0.4921875 -vt 0.21875 0.6796875 -vt 0.2421875 0.6796875 -vt 0.2265625 0.6796875 -vt 0.2265625 0.51171875 -vt 0.1953125 0.5234375 -vt 0.1875 0.40625 -vt 0.1953125 0.40625 -vt 0.484375 0.6171875 -vt 0.6015625 0.609375 -vt 0.6015625 0.6171875 -vt 0.484375 0.6015625 -vt 0.4921875 0.484375 -vt 0.4921875 0.6015625 -vt 0.6171875 0.59375 -vt 0.5 0.6015625 -vt 0.5 0.59375 -vt 0.640625 0.1171875 -vt 0.6484375 0.125 -vt 0.640625 0.125 -vt 0.6640625 0.125 -vt 0.65625 0.1171875 -vt 0.6640625 0.1171875 -vt 0.5078125 0.5859375 -vt 0.5 0.46875 -vt 0.5078125 0.46875 -vt 0.5078125 0.7109375 -vt 0.625 0.703125 -vt 0.625 0.7109375 -vt 0.46875 0.4921875 -vt 0.4765625 0.375 -vt 0.4765625 0.4921875 -vt 0.625 0.6875 -vt 0.5078125 0.6953125 -vt 0.5078125 0.6875 -vt 0.875 0.28125 -vt 0.8828125 0.2890625 -vt 0.875 0.2890625 -vt 0.8828125 0.2734375 -vt 0.875 0.265625 -vt 0.8828125 0.265625 -vt 0.5234375 0.875 -vt 0.515625 0.7578125 -vt 0.5234375 0.7578125 -vt 0.5078125 0.6796875 -vt 0.625 0.671875 -vt 0.625 0.6796875 -vt 0.203125 0.484375 -vt 0.2109375 0.3671875 -vt 0.2109375 0.484375 -vt 0.625 0.65625 -vt 0.5078125 0.6640625 -vt 0.5078125 0.65625 -vt 0.0625 0.109375 -vt 0.0703125 0.1171875 -vt 0.0625 0.1171875 -vt 0.0859375 0.1171875 -vt 0.078125 0.109375 -vt 0.0859375 0.109375 -vt 0.2265625 0.484375 -vt 0.21875 0.3671875 -vt 0.2265625 0.3671875 -vt 0.5078125 0.6484375 -vt 0.625 0.640625 -vt 0.625 0.6484375 -vt 0.234375 0.484375 -vt 0.2421875 0.3671875 -vt 0.2421875 0.484375 -vt 0.625 0.625 -vt 0.5078125 0.6328125 -vt 0.5078125 0.625 -vt 0.09375 0.109375 -vt 0.1015625 0.1171875 -vt 0.09375 0.1171875 -vt 0.2109375 0.1171875 -vt 0.203125 0.109375 -vt 0.2109375 0.109375 -vt 0.2578125 0.484375 -vt 0.25 0.3671875 -vt 0.2578125 0.3671875 -vt 0.515625 0.75 -vt 0.6328125 0.7421875 -vt 0.6328125 0.75 -vt 0.265625 0.484375 -vt 0.2734375 0.3671875 -vt 0.2734375 0.484375 -vt 0.6328125 0.7265625 -vt 0.515625 0.734375 -vt 0.515625 0.7265625 -vt 0.21875 0.109375 -vt 0.2265625 0.1171875 -vt 0.21875 0.1171875 -vt 0.2421875 0.1171875 -vt 0.234375 0.109375 -vt 0.2421875 0.109375 -vt 0.2890625 0.484375 -vt 0.28125 0.3671875 -vt 0.2890625 0.3671875 -vt 0.515625 0.5859375 -vt 0.6328125 0.578125 -vt 0.6328125 0.5859375 -vt 0.296875 0.484375 -vt 0.3046875 0.3671875 -vt 0.3046875 0.484375 -vt 0.6328125 0.5625 -vt 0.515625 0.5703125 -vt 0.515625 0.5625 -vt 0.25 0.109375 -vt 0.2578125 0.1171875 -vt 0.25 0.1171875 -vt 0.890625 0.75 -vt 0.8828125 0.7421875 -vt 0.890625 0.7421875 -vt 0.3203125 0.484375 -vt 0.3125 0.3671875 -vt 0.3203125 0.3671875 -vt 0.515625 0.5546875 -vt 0.6328125 0.546875 -vt 0.6328125 0.5546875 -vt 0.328125 0.484375 -vt 0.3359375 0.3671875 -vt 0.3359375 0.484375 -vt 0.6328125 0.53125 -vt 0.515625 0.5390625 -vt 0.515625 0.53125 -vt 0.265625 0.109375 -vt 0.2734375 0.1171875 -vt 0.265625 0.1171875 -vt 0.890625 0.734375 -vt 0.8828125 0.7265625 -vt 0.890625 0.7265625 -vt 0.3515625 0.484375 -vt 0.34375 0.3671875 -vt 0.3515625 0.3671875 -vt 0.515625 0.5234375 -vt 0.6328125 0.515625 -vt 0.6328125 0.5234375 -vt 0.359375 0.484375 -vt 0.3671875 0.3671875 -vt 0.3671875 0.484375 -vt 0.6328125 0.5 -vt 0.515625 0.5078125 -vt 0.515625 0.5 -vt 0.28125 0.109375 -vt 0.2890625 0.1171875 -vt 0.28125 0.1171875 -vt 0.3046875 0.1171875 -vt 0.296875 0.109375 -vt 0.3046875 0.109375 -vt 0.3828125 0.484375 -vt 0.375 0.3671875 -vt 0.3828125 0.3671875 -vt 0.515625 0.4921875 -vt 0.6328125 0.484375 -vt 0.6328125 0.4921875 -vt 0.484375 0.4765625 -vt 0.4921875 0.359375 -vt 0.4921875 0.4765625 -vt 0.6328125 0.46875 -vt 0.515625 0.4765625 -vt 0.515625 0.46875 -vt 0.3125 0.109375 -vt 0.3203125 0.1171875 -vt 0.3125 0.1171875 -vt 0.3359375 0.1171875 -vt 0.328125 0.109375 -vt 0.3359375 0.109375 -vt 0.5390625 0.875 -vt 0.53125 0.7578125 -vt 0.5390625 0.7578125 -vt 0.5 0.4609375 -vt 0.6171875 0.453125 -vt 0.6171875 0.4609375 -vt 0.546875 0.875 -vt 0.5546875 0.7578125 -vt 0.5546875 0.875 -vt 0.671875 0.9921875 -vt 0.5546875 1 -vt 0.5546875 0.9921875 -vt 0.34375 0.109375 -vt 0.3515625 0.1171875 -vt 0.34375 0.1171875 -vt 0.3671875 0.1171875 -vt 0.359375 0.109375 -vt 0.3671875 0.109375 -vt 0.5078125 0.4453125 -vt 0.5 0.328125 -vt 0.5078125 0.328125 -vt 0.5546875 0.984375 -vt 0.671875 0.9765625 -vt 0.671875 0.984375 -vt 0.515625 0.4453125 -vt 0.5234375 0.328125 -vt 0.5234375 0.4453125 -vt 0.671875 0.9609375 -vt 0.5546875 0.96875 -vt 0.5546875 0.9609375 -vt 0.375 0.109375 -vt 0.3828125 0.1171875 -vt 0.375 0.1171875 -vt 0.890625 0.59375 -vt 0.8828125 0.5859375 -vt 0.890625 0.5859375 -vt 0.6171875 0.2421875 -vt 0.609375 0.1328125 -vt 0.6171875 0.1328125 -vt 0.75 0.609375 -vt 0.859375 0.6015625 -vt 0.859375 0.609375 -vt 0.625 0.1328125 -vt 0.6328125 0.2421875 -vt 0.625 0.2421875 -vt 0.859375 0.453125 -vt 0.75 0.4609375 -vt 0.75 0.453125 -vt 0.8828125 0.5703125 -vt 0.890625 0.578125 -vt 0.8828125 0.578125 -vt 0.890625 0.5625 -vt 0.8828125 0.5546875 -vt 0.890625 0.5546875 -vt 0.6484375 0.2421875 -vt 0.640625 0.1328125 -vt 0.6484375 0.1328125 -vt 0.7578125 0.71875 -vt 0.8671875 0.7109375 -vt 0.8671875 0.71875 -vt 0.65625 0.1328125 -vt 0.6640625 0.2421875 -vt 0.65625 0.2421875 -vt 0.8671875 0.6953125 -vt 0.7578125 0.703125 -vt 0.7578125 0.6953125 -vt 0.8828125 0.5390625 -vt 0.890625 0.546875 -vt 0.8828125 0.546875 -vt 0.890625 0.53125 -vt 0.8828125 0.5234375 -vt 0.890625 0.5234375 -vt 0.2109375 0.234375 -vt 0.203125 0.125 -vt 0.2109375 0.125 -vt 0.7578125 0.6875 -vt 0.8671875 0.6796875 -vt 0.8671875 0.6875 -vt 0.21875 0.125 -vt 0.2265625 0.234375 -vt 0.21875 0.234375 -vt 0.8671875 0.6640625 -vt 0.7578125 0.671875 -vt 0.7578125 0.6640625 -vt 0.8828125 0.5078125 -vt 0.890625 0.515625 -vt 0.8828125 0.515625 -vt 0.890625 0.5 -vt 0.8828125 0.4921875 -vt 0.890625 0.4921875 -vt 0.2421875 0.234375 -vt 0.234375 0.125 -vt 0.2421875 0.125 -vt 0.7578125 0.65625 -vt 0.8671875 0.6484375 -vt 0.8671875 0.65625 -vt 0.25 0.125 -vt 0.2578125 0.234375 -vt 0.25 0.234375 -vt 0.8671875 0.6328125 -vt 0.7578125 0.640625 -vt 0.7578125 0.6328125 -vt 0.8828125 0.4765625 -vt 0.890625 0.484375 -vt 0.8828125 0.484375 -vt 0.890625 0.46875 -vt 0.8828125 0.4609375 -vt 0.890625 0.4609375 -vt 0.2734375 0.234375 -vt 0.265625 0.125 -vt 0.2734375 0.125 -vt 0.765625 0.75 -vt 0.875 0.7421875 -vt 0.875 0.75 -vt 0.28125 0.125 -vt 0.2890625 0.234375 -vt 0.28125 0.234375 -vt 0.875 0.7265625 -vt 0.765625 0.734375 -vt 0.765625 0.7265625 -vt 0.8828125 0.296875 -vt 0.890625 0.3046875 -vt 0.8828125 0.3046875 -vt 0.7578125 0.1171875 -vt 0.75 0.109375 -vt 0.7578125 0.109375 -vt 0.3046875 0.234375 -vt 0.296875 0.125 -vt 0.3046875 0.125 -vt 0.765625 0.59375 -vt 0.875 0.5859375 -vt 0.875 0.59375 -vt 0.3125 0.125 -vt 0.3203125 0.234375 -vt 0.3125 0.234375 -vt 0.875 0.5703125 -vt 0.765625 0.578125 -vt 0.765625 0.5703125 -vt 0.765625 0.109375 -vt 0.7734375 0.1171875 -vt 0.765625 0.1171875 -vt 0.890625 0.2265625 -vt 0.8828125 0.21875 -vt 0.890625 0.21875 -vt 0.3359375 0.234375 -vt 0.328125 0.125 -vt 0.3359375 0.125 -vt 0.765625 0.5625 -vt 0.875 0.5546875 -vt 0.875 0.5625 -vt 0.34375 0.125 -vt 0.3515625 0.234375 -vt 0.34375 0.234375 -vt 0.875 0.5390625 -vt 0.765625 0.546875 -vt 0.765625 0.5390625 -vt 0.8828125 0.203125 -vt 0.890625 0.2109375 -vt 0.8828125 0.2109375 -vt 0.890625 0.1953125 -vt 0.8828125 0.1875 -vt 0.890625 0.1875 -vt 0.3671875 0.234375 -vt 0.359375 0.125 -vt 0.3671875 0.125 -vt 0.765625 0.53125 -vt 0.875 0.5234375 -vt 0.875 0.53125 -vt 0.375 0.125 -vt 0.3828125 0.234375 -vt 0.375 0.234375 -vt 0.875 0.5078125 -vt 0.765625 0.515625 -vt 0.765625 0.5078125 -vt 0.8828125 0.171875 -vt 0.890625 0.1796875 -vt 0.8828125 0.1796875 -vt 0.890625 0.1640625 -vt 0.8828125 0.15625 -vt 0.890625 0.15625 -vt 0.7734375 0.2578125 -vt 0.765625 0.1484375 -vt 0.7734375 0.1484375 -vt 0.765625 0.5 -vt 0.875 0.4921875 -vt 0.875 0.5 -vt 0.484375 0.1171875 -vt 0.4921875 0.2265625 -vt 0.484375 0.2265625 -vt 0.875 0.4765625 -vt 0.765625 0.484375 -vt 0.765625 0.4765625 -vt 0.8828125 0.140625 -vt 0.890625 0.1484375 -vt 0.8828125 0.1484375 -vt 0.8671875 0.1171875 -vt 0.859375 0.109375 -vt 0.8671875 0.109375 -vt 0.6796875 0.2265625 -vt 0.671875 0.1171875 -vt 0.6796875 0.1171875 -vt 0.78125 0.2578125 -vt 0.890625 0.25 -vt 0.890625 0.2578125 -vt 0.6875 0.1171875 -vt 0.6953125 0.2265625 -vt 0.6875 0.2265625 -vt 0.890625 0.234375 -vt 0.78125 0.2421875 -vt 0.78125 0.234375 -vt 0.8828125 0.125 -vt 0.890625 0.1328125 -vt 0.8828125 0.1328125 -vt 0.8828125 0.1171875 -vt 0.875 0.109375 -vt 0.8828125 0.109375 -vt 0.7890625 0.2265625 -vt 0.78125 0.1171875 -vt 0.7890625 0.1171875 -vt 0.796875 0.3671875 -vt 0.90625 0.359375 -vt 0.90625 0.3671875 -vt 0.796875 0.1171875 -vt 0.8046875 0.2265625 -vt 0.796875 0.2265625 -vt 0.9140625 0.9921875 -vt 0.8046875 1 -vt 0.8046875 0.9921875 -vt 0.171875 0.1015625 -vt 0.1796875 0.109375 -vt 0.171875 0.109375 -vt 0.1953125 0.109375 -vt 0.1875 0.1015625 -vt 0.1953125 0.1015625 -vt 0.5390625 0.4453125 -vt 0.53125 0.328125 -vt 0.5390625 0.328125 -vt 0.5546875 0.953125 -vt 0.671875 0.9453125 -vt 0.671875 0.953125 -vt 0.546875 0.4453125 -vt 0.5546875 0.328125 -vt 0.5546875 0.4453125 -vt 0.671875 0.9296875 -vt 0.5546875 0.9375 -vt 0.5546875 0.9296875 -vt 0.890625 0.6015625 -vt 0.8984375 0.609375 -vt 0.890625 0.609375 -vt 0.4921875 0.109375 -vt 0.484375 0.1015625 -vt 0.4921875 0.1015625 -vt 0.5703125 0.875 -vt 0.5625 0.7578125 -vt 0.5703125 0.7578125 -vt 0.5546875 0.921875 -vt 0.671875 0.9140625 -vt 0.671875 0.921875 -vt 0.5625 0.4453125 -vt 0.5703125 0.328125 -vt 0.5703125 0.4453125 -vt 0.6953125 0.8671875 -vt 0.578125 0.875 -vt 0.578125 0.8671875 -vt 0.640625 0.1015625 -vt 0.6484375 0.109375 -vt 0.640625 0.109375 -vt 0.6640625 0.109375 -vt 0.65625 0.1015625 -vt 0.6640625 0.1015625 -vt 0.1328125 0.421875 -vt 0.125 0.3046875 -vt 0.1328125 0.3046875 -vt 0.578125 0.859375 -vt 0.6953125 0.8515625 -vt 0.6953125 0.859375 -vt 0.140625 0.421875 -vt 0.1484375 0.3046875 -vt 0.1484375 0.421875 -vt 0.6953125 0.8359375 -vt 0.578125 0.84375 -vt 0.578125 0.8359375 -vt 0.671875 0.1015625 -vt 0.6796875 0.109375 -vt 0.671875 0.109375 -vt 0.6953125 0.109375 -vt 0.6875 0.1015625 -vt 0.6953125 0.1015625 -vt 0.1640625 0.421875 -vt 0.15625 0.3046875 -vt 0.1640625 0.3046875 -vt 0.578125 0.828125 -vt 0.6953125 0.8203125 -vt 0.6953125 0.828125 -vt 0.390625 0.421875 -vt 0.3984375 0.3046875 -vt 0.3984375 0.421875 -vt 0.6953125 0.8046875 -vt 0.578125 0.8125 -vt 0.578125 0.8046875 -vt 0.890625 0.28125 -vt 0.8984375 0.2890625 -vt 0.890625 0.2890625 -vt 0.8984375 0.2734375 -vt 0.890625 0.265625 -vt 0.8984375 0.265625 -vt 0.4140625 0.421875 -vt 0.40625 0.3046875 -vt 0.4140625 0.3046875 -vt 0.578125 0.796875 -vt 0.6953125 0.7890625 -vt 0.6953125 0.796875 -vt 0.421875 0.421875 -vt 0.4296875 0.3046875 -vt 0.4296875 0.421875 -vt 0.6953125 0.7734375 -vt 0.578125 0.78125 -vt 0.578125 0.7734375 -vt 0.734375 0.1015625 -vt 0.7421875 0.109375 -vt 0.734375 0.109375 -vt 0.7890625 0.109375 -vt 0.78125 0.1015625 -vt 0.7890625 0.1015625 -vt 0.4453125 0.421875 -vt 0.4375 0.3046875 -vt 0.4453125 0.3046875 -vt 0.578125 0.765625 -vt 0.6953125 0.7578125 -vt 0.6953125 0.765625 -vt 0.453125 0.421875 -vt 0.4609375 0.3046875 -vt 0.4609375 0.421875 -vt 0.6953125 0.4375 -vt 0.578125 0.4453125 -vt 0.578125 0.4375 -vt 0.796875 0.1015625 -vt 0.8046875 0.109375 -vt 0.796875 0.109375 -vt 0.8203125 0.109375 -vt 0.8125 0.1015625 -vt 0.8203125 0.1015625 -vt 0.5859375 0.4296875 -vt 0.578125 0.3125 -vt 0.5859375 0.3125 -vt 0.5859375 0.90625 -vt 0.703125 0.8984375 -vt 0.703125 0.90625 -vt 0.59375 0.4296875 -vt 0.6015625 0.3125 -vt 0.6015625 0.4296875 -vt 0.703125 0.8828125 -vt 0.5859375 0.890625 -vt 0.5859375 0.8828125 -vt 0.828125 0.1015625 -vt 0.8359375 0.109375 -vt 0.828125 0.109375 -vt 0.8515625 0.109375 -vt 0.84375 0.1015625 -vt 0.8515625 0.1015625 -vt 0.0078125 0.3984375 -vt 0 0.28125 -vt 0.0078125 0.28125 -vt 0.609375 0.6171875 -vt 0.7265625 0.609375 -vt 0.7265625 0.6171875 -vt 0.015625 0.3984375 -vt 0.0234375 0.28125 -vt 0.0234375 0.3984375 -vt 0.7265625 0.421875 -vt 0.609375 0.4296875 -vt 0.609375 0.421875 -vt 0.890625 0.109375 -vt 0.8984375 0.1171875 -vt 0.890625 0.1171875 -vt 0.0703125 0.1015625 -vt 0.0625 0.09375 -vt 0.0703125 0.09375 -vt 0.0390625 0.3984375 -vt 0.03125 0.28125 -vt 0.0390625 0.28125 -vt 0.609375 0.4140625 -vt 0.7265625 0.40625 -vt 0.7265625 0.4140625 -vt 0.046875 0.3984375 -vt 0.0546875 0.28125 -vt 0.0546875 0.3984375 -vt 0.7265625 0.390625 -vt 0.609375 0.3984375 -vt 0.609375 0.390625 -vt 0.078125 0.09375 -vt 0.0859375 0.1015625 -vt 0.078125 0.1015625 -vt 0.1015625 0.1015625 -vt 0.09375 0.09375 -vt 0.1015625 0.09375 -vt 0.0703125 0.3984375 -vt 0.0625 0.28125 -vt 0.0703125 0.28125 -vt 0.609375 0.3828125 -vt 0.7265625 0.375 -vt 0.7265625 0.3828125 -vt 0.078125 0.3984375 -vt 0.0859375 0.28125 -vt 0.0859375 0.3984375 -vt 0.7421875 0.59375 -vt 0.625 0.6015625 -vt 0.625 0.59375 -vt 0.109375 0.09375 -vt 0.1171875 0.1015625 -vt 0.109375 0.1015625 -vt 0.2109375 0.1015625 -vt 0.203125 0.09375 -vt 0.2109375 0.09375 -vt 0.1015625 0.3984375 -vt 0.09375 0.28125 -vt 0.1015625 0.28125 -vt 0.625 0.4609375 -vt 0.7421875 0.453125 -vt 0.7421875 0.4609375 -vt 0.109375 0.3984375 -vt 0.1171875 0.28125 -vt 0.1171875 0.3984375 -vt 0.75 0.7109375 -vt 0.6328125 0.71875 -vt 0.6328125 0.7109375 -vt 0.21875 0.09375 -vt 0.2265625 0.1015625 -vt 0.21875 0.1015625 -vt 0.2421875 0.1015625 -vt 0.234375 0.09375 -vt 0.2421875 0.09375 -vt 0.1796875 0.3984375 -vt 0.171875 0.28125 -vt 0.1796875 0.28125 -vt 0.390625 0.8515625 -vt 0.5078125 0.8359375 -vt 0.5078125 0.8515625 -vt 0.1875 0.3984375 -vt 0.1953125 0.28125 -vt 0.1953125 0.3984375 -vt 0.5078125 0.8125 -vt 0.390625 0.828125 -vt 0.390625 0.8125 -vt 0.171875 0.1328125 -vt 0.1796875 0.1171875 -vt 0.1796875 0.1328125 -vt 0.1953125 0.1328125 -vt 0.1875 0.1171875 -vt 0.1953125 0.1171875 -vt 0.4765625 0.6171875 -vt 0.46875 0.6171875 -vt 0.46875 0.5 -vt 0 0.6171875 -vt 0 0.6015625 -vt 0.1171875 0.6015625 -vt 0.171875 0.5234375 -vt 0.171875 0.40625 -vt 0.1796875 0.40625 -vt 0.5078125 0.859375 -vt 0.5078125 0.875 -vt 0.390625 0.875 -vt 0.109375 0.1484375 -vt 0.109375 0.1328125 -vt 0.1171875 0.1328125 -vt 0.8671875 0.2890625 -vt 0.859375 0.2890625 -vt 0.859375 0.2734375 -vt 0.7578125 0.2578125 -vt 0.75 0.2578125 -vt 0.75 0.1484375 -vt 0.390625 0.7109375 -vt 0.390625 0.6953125 -vt 0.5 0.6953125 -vt 0.46875 0.1328125 -vt 0.4765625 0.1328125 -vt 0.4765625 0.2421875 -vt 0.5 0.671875 -vt 0.5 0.6875 -vt 0.390625 0.6875 -vt 0.75 0.125 -vt 0.7578125 0.125 -vt 0.7578125 0.140625 -vt 0.7734375 0.140625 -vt 0.765625 0.140625 -vt 0.765625 0.125 -vt 0.875 0.2265625 -vt 0.859375 0.2265625 -vt 0.859375 0.21875 -vt 0.125 0.6171875 -vt 0.125 0.4296875 -vt 0.1328125 0.4296875 -vt 0.859375 0.203125 -vt 0.875 0.203125 -vt 0.875 0.2109375 -vt 0.140625 0.6171875 -vt 0.140625 0.4296875 -vt 0.1484375 0.44921875 -vt 0.140625 0.4296875 -vt 0.1484375 0.4296875 -vt 0.1484375 0.44921875 -vt 0.203125 0.875 -vt 0.203125 0.6875 -vt 0.21875 0.6875 -vt 0.2265625 0.6875 -vt 0.2421875 0.6875 -vt 0.2265625 0.70703125 -vt 0.2421875 0.6875 -vt 0.2421875 0.875 -vt 0.2265625 0.70703125 -vt 0.875 0.1953125 -vt 0.859375 0.1953125 -vt 0.859375 0.1875 -vt 0.15625 0.6171875 -vt 0.15625 0.4296875 -vt 0.1640625 0.4296875 -vt 0.859375 0.171875 -vt 0.875 0.171875 -vt 0.875 0.1796875 -vt 0.390625 0.6171875 -vt 0.390625 0.4296875 -vt 0.3984375 0.44921875 -vt 0.390625 0.4296875 -vt 0.3984375 0.4296875 -vt 0.3984375 0.44921875 -vt 0.25 0.875 -vt 0.25 0.6875 -vt 0.265625 0.6875 -vt 0.2734375 0.6875 -vt 0.2890625 0.6875 -vt 0.2734375 0.70703125 -vt 0.2890625 0.6875 -vt 0.2890625 0.875 -vt 0.2734375 0.70703125 -vt 0.875 0.1640625 -vt 0.859375 0.1640625 -vt 0.859375 0.15625 -vt 0 0.59375 -vt 0 0.40625 -vt 0.0078125 0.40625 -vt 0.859375 0.140625 -vt 0.875 0.140625 -vt 0.875 0.1484375 -vt 0.015625 0.59375 -vt 0.015625 0.40625 -vt 0.0234375 0.42578125 -vt 0.015625 0.40625 -vt 0.0234375 0.40625 -vt 0.0234375 0.42578125 -vt 0.296875 0.875 -vt 0.296875 0.6875 -vt 0.3125 0.6875 -vt 0.3203125 0.6875 -vt 0.3359375 0.6875 -vt 0.3203125 0.70703125 -vt 0.3359375 0.6875 -vt 0.3359375 0.875 -vt 0.3203125 0.70703125 -vt 0.078125 0.1328125 -vt 0.0625 0.1328125 -vt 0.0625 0.125 -vt 0.03125 0.59375 -vt 0.03125 0.40625 -vt 0.0390625 0.40625 -vt 0.0859375 0.125 -vt 0.1015625 0.125 -vt 0.1015625 0.1328125 -vt 0.046875 0.59375 -vt 0.046875 0.40625 -vt 0.0546875 0.42578125 -vt 0.046875 0.40625 -vt 0.0546875 0.40625 -vt 0.0546875 0.42578125 -vt 0.203125 0.6796875 -vt 0.203125 0.4921875 -vt 0.21875 0.4921875 -vt 0.2265625 0.4921875 -vt 0.2421875 0.4921875 -vt 0.2265625 0.51171875 -vt 0.2421875 0.4921875 -vt 0.2421875 0.6796875 -vt 0.2265625 0.51171875 -vt 0.1953125 0.5234375 -vt 0.1875 0.5234375 -vt 0.1875 0.40625 -vt 0.484375 0.6171875 -vt 0.484375 0.609375 -vt 0.6015625 0.609375 -vt 0.484375 0.6015625 -vt 0.484375 0.484375 -vt 0.4921875 0.484375 -vt 0.6171875 0.59375 -vt 0.6171875 0.6015625 -vt 0.5 0.6015625 -vt 0.640625 0.1171875 -vt 0.6484375 0.1171875 -vt 0.6484375 0.125 -vt 0.6640625 0.125 -vt 0.65625 0.125 -vt 0.65625 0.1171875 -vt 0.5078125 0.5859375 -vt 0.5 0.5859375 -vt 0.5 0.46875 -vt 0.5078125 0.7109375 -vt 0.5078125 0.703125 -vt 0.625 0.703125 -vt 0.46875 0.4921875 -vt 0.46875 0.375 -vt 0.4765625 0.375 -vt 0.625 0.6875 -vt 0.625 0.6953125 -vt 0.5078125 0.6953125 -vt 0.875 0.28125 -vt 0.8828125 0.28125 -vt 0.8828125 0.2890625 -vt 0.8828125 0.2734375 -vt 0.875 0.2734375 -vt 0.875 0.265625 -vt 0.5234375 0.875 -vt 0.515625 0.875 -vt 0.515625 0.7578125 -vt 0.5078125 0.6796875 -vt 0.5078125 0.671875 -vt 0.625 0.671875 -vt 0.203125 0.484375 -vt 0.203125 0.3671875 -vt 0.2109375 0.3671875 -vt 0.625 0.65625 -vt 0.625 0.6640625 -vt 0.5078125 0.6640625 -vt 0.0625 0.109375 -vt 0.0703125 0.109375 -vt 0.0703125 0.1171875 -vt 0.0859375 0.1171875 -vt 0.078125 0.1171875 -vt 0.078125 0.109375 -vt 0.2265625 0.484375 -vt 0.21875 0.484375 -vt 0.21875 0.3671875 -vt 0.5078125 0.6484375 -vt 0.5078125 0.640625 -vt 0.625 0.640625 -vt 0.234375 0.484375 -vt 0.234375 0.3671875 -vt 0.2421875 0.3671875 -vt 0.625 0.625 -vt 0.625 0.6328125 -vt 0.5078125 0.6328125 -vt 0.09375 0.109375 -vt 0.1015625 0.109375 -vt 0.1015625 0.1171875 -vt 0.2109375 0.1171875 -vt 0.203125 0.1171875 -vt 0.203125 0.109375 -vt 0.2578125 0.484375 -vt 0.25 0.484375 -vt 0.25 0.3671875 -vt 0.515625 0.75 -vt 0.515625 0.7421875 -vt 0.6328125 0.7421875 -vt 0.265625 0.484375 -vt 0.265625 0.3671875 -vt 0.2734375 0.3671875 -vt 0.6328125 0.7265625 -vt 0.6328125 0.734375 -vt 0.515625 0.734375 -vt 0.21875 0.109375 -vt 0.2265625 0.109375 -vt 0.2265625 0.1171875 -vt 0.2421875 0.1171875 -vt 0.234375 0.1171875 -vt 0.234375 0.109375 -vt 0.2890625 0.484375 -vt 0.28125 0.484375 -vt 0.28125 0.3671875 -vt 0.515625 0.5859375 -vt 0.515625 0.578125 -vt 0.6328125 0.578125 -vt 0.296875 0.484375 -vt 0.296875 0.3671875 -vt 0.3046875 0.3671875 -vt 0.6328125 0.5625 -vt 0.6328125 0.5703125 -vt 0.515625 0.5703125 -vt 0.25 0.109375 -vt 0.2578125 0.109375 -vt 0.2578125 0.1171875 -vt 0.890625 0.75 -vt 0.8828125 0.75 -vt 0.8828125 0.7421875 -vt 0.3203125 0.484375 -vt 0.3125 0.484375 -vt 0.3125 0.3671875 -vt 0.515625 0.5546875 -vt 0.515625 0.546875 -vt 0.6328125 0.546875 -vt 0.328125 0.484375 -vt 0.328125 0.3671875 -vt 0.3359375 0.3671875 -vt 0.6328125 0.53125 -vt 0.6328125 0.5390625 -vt 0.515625 0.5390625 -vt 0.265625 0.109375 -vt 0.2734375 0.109375 -vt 0.2734375 0.1171875 -vt 0.890625 0.734375 -vt 0.8828125 0.734375 -vt 0.8828125 0.7265625 -vt 0.3515625 0.484375 -vt 0.34375 0.484375 -vt 0.34375 0.3671875 -vt 0.515625 0.5234375 -vt 0.515625 0.515625 -vt 0.6328125 0.515625 -vt 0.359375 0.484375 -vt 0.359375 0.3671875 -vt 0.3671875 0.3671875 -vt 0.6328125 0.5 -vt 0.6328125 0.5078125 -vt 0.515625 0.5078125 -vt 0.28125 0.109375 -vt 0.2890625 0.109375 -vt 0.2890625 0.1171875 -vt 0.3046875 0.1171875 -vt 0.296875 0.1171875 -vt 0.296875 0.109375 -vt 0.3828125 0.484375 -vt 0.375 0.484375 -vt 0.375 0.3671875 -vt 0.515625 0.4921875 -vt 0.515625 0.484375 -vt 0.6328125 0.484375 -vt 0.484375 0.4765625 -vt 0.484375 0.359375 -vt 0.4921875 0.359375 -vt 0.6328125 0.46875 -vt 0.6328125 0.4765625 -vt 0.515625 0.4765625 -vt 0.3125 0.109375 -vt 0.3203125 0.109375 -vt 0.3203125 0.1171875 -vt 0.3359375 0.1171875 -vt 0.328125 0.1171875 -vt 0.328125 0.109375 -vt 0.5390625 0.875 -vt 0.53125 0.875 -vt 0.53125 0.7578125 -vt 0.5 0.4609375 -vt 0.5 0.453125 -vt 0.6171875 0.453125 -vt 0.546875 0.875 -vt 0.546875 0.7578125 -vt 0.5546875 0.7578125 -vt 0.671875 0.9921875 -vt 0.671875 1 -vt 0.5546875 1 -vt 0.34375 0.109375 -vt 0.3515625 0.109375 -vt 0.3515625 0.1171875 -vt 0.3671875 0.1171875 -vt 0.359375 0.1171875 -vt 0.359375 0.109375 -vt 0.5078125 0.4453125 -vt 0.5 0.4453125 -vt 0.5 0.328125 -vt 0.5546875 0.984375 -vt 0.5546875 0.9765625 -vt 0.671875 0.9765625 -vt 0.515625 0.4453125 -vt 0.515625 0.328125 -vt 0.5234375 0.328125 -vt 0.671875 0.9609375 -vt 0.671875 0.96875 -vt 0.5546875 0.96875 -vt 0.375 0.109375 -vt 0.3828125 0.109375 -vt 0.3828125 0.1171875 -vt 0.890625 0.59375 -vt 0.8828125 0.59375 -vt 0.8828125 0.5859375 -vt 0.6171875 0.2421875 -vt 0.609375 0.2421875 -vt 0.609375 0.1328125 -vt 0.75 0.609375 -vt 0.75 0.6015625 -vt 0.859375 0.6015625 -vt 0.625 0.1328125 -vt 0.6328125 0.1328125 -vt 0.6328125 0.2421875 -vt 0.859375 0.453125 -vt 0.859375 0.4609375 -vt 0.75 0.4609375 -vt 0.8828125 0.5703125 -vt 0.890625 0.5703125 -vt 0.890625 0.578125 -vt 0.890625 0.5625 -vt 0.8828125 0.5625 -vt 0.8828125 0.5546875 -vt 0.6484375 0.2421875 -vt 0.640625 0.2421875 -vt 0.640625 0.1328125 -vt 0.7578125 0.71875 -vt 0.7578125 0.7109375 -vt 0.8671875 0.7109375 -vt 0.65625 0.1328125 -vt 0.6640625 0.1328125 -vt 0.6640625 0.2421875 -vt 0.8671875 0.6953125 -vt 0.8671875 0.703125 -vt 0.7578125 0.703125 -vt 0.8828125 0.5390625 -vt 0.890625 0.5390625 -vt 0.890625 0.546875 -vt 0.890625 0.53125 -vt 0.8828125 0.53125 -vt 0.8828125 0.5234375 -vt 0.2109375 0.234375 -vt 0.203125 0.234375 -vt 0.203125 0.125 -vt 0.7578125 0.6875 -vt 0.7578125 0.6796875 -vt 0.8671875 0.6796875 -vt 0.21875 0.125 -vt 0.2265625 0.125 -vt 0.2265625 0.234375 -vt 0.8671875 0.6640625 -vt 0.8671875 0.671875 -vt 0.7578125 0.671875 -vt 0.8828125 0.5078125 -vt 0.890625 0.5078125 -vt 0.890625 0.515625 -vt 0.890625 0.5 -vt 0.8828125 0.5 -vt 0.8828125 0.4921875 -vt 0.2421875 0.234375 -vt 0.234375 0.234375 -vt 0.234375 0.125 -vt 0.7578125 0.65625 -vt 0.7578125 0.6484375 -vt 0.8671875 0.6484375 -vt 0.25 0.125 -vt 0.2578125 0.125 -vt 0.2578125 0.234375 -vt 0.8671875 0.6328125 -vt 0.8671875 0.640625 -vt 0.7578125 0.640625 -vt 0.8828125 0.4765625 -vt 0.890625 0.4765625 -vt 0.890625 0.484375 -vt 0.890625 0.46875 -vt 0.8828125 0.46875 -vt 0.8828125 0.4609375 -vt 0.2734375 0.234375 -vt 0.265625 0.234375 -vt 0.265625 0.125 -vt 0.765625 0.75 -vt 0.765625 0.7421875 -vt 0.875 0.7421875 -vt 0.28125 0.125 -vt 0.2890625 0.125 -vt 0.2890625 0.234375 -vt 0.875 0.7265625 -vt 0.875 0.734375 -vt 0.765625 0.734375 -vt 0.8828125 0.296875 -vt 0.890625 0.296875 -vt 0.890625 0.3046875 -vt 0.7578125 0.1171875 -vt 0.75 0.1171875 -vt 0.75 0.109375 -vt 0.3046875 0.234375 -vt 0.296875 0.234375 -vt 0.296875 0.125 -vt 0.765625 0.59375 -vt 0.765625 0.5859375 -vt 0.875 0.5859375 -vt 0.3125 0.125 -vt 0.3203125 0.125 -vt 0.3203125 0.234375 -vt 0.875 0.5703125 -vt 0.875 0.578125 -vt 0.765625 0.578125 -vt 0.765625 0.109375 -vt 0.7734375 0.109375 -vt 0.7734375 0.1171875 -vt 0.890625 0.2265625 -vt 0.8828125 0.2265625 -vt 0.8828125 0.21875 -vt 0.3359375 0.234375 -vt 0.328125 0.234375 -vt 0.328125 0.125 -vt 0.765625 0.5625 -vt 0.765625 0.5546875 -vt 0.875 0.5546875 -vt 0.34375 0.125 -vt 0.3515625 0.125 -vt 0.3515625 0.234375 -vt 0.875 0.5390625 -vt 0.875 0.546875 -vt 0.765625 0.546875 -vt 0.8828125 0.203125 -vt 0.890625 0.203125 -vt 0.890625 0.2109375 -vt 0.890625 0.1953125 -vt 0.8828125 0.1953125 -vt 0.8828125 0.1875 -vt 0.3671875 0.234375 -vt 0.359375 0.234375 -vt 0.359375 0.125 -vt 0.765625 0.53125 -vt 0.765625 0.5234375 -vt 0.875 0.5234375 -vt 0.375 0.125 -vt 0.3828125 0.125 -vt 0.3828125 0.234375 -vt 0.875 0.5078125 -vt 0.875 0.515625 -vt 0.765625 0.515625 -vt 0.8828125 0.171875 -vt 0.890625 0.171875 -vt 0.890625 0.1796875 -vt 0.890625 0.1640625 -vt 0.8828125 0.1640625 -vt 0.8828125 0.15625 -vt 0.7734375 0.2578125 -vt 0.765625 0.2578125 -vt 0.765625 0.1484375 -vt 0.765625 0.5 -vt 0.765625 0.4921875 -vt 0.875 0.4921875 -vt 0.484375 0.1171875 -vt 0.4921875 0.1171875 -vt 0.4921875 0.2265625 -vt 0.875 0.4765625 -vt 0.875 0.484375 -vt 0.765625 0.484375 -vt 0.8828125 0.140625 -vt 0.890625 0.140625 -vt 0.890625 0.1484375 -vt 0.8671875 0.1171875 -vt 0.859375 0.1171875 -vt 0.859375 0.109375 -vt 0.6796875 0.2265625 -vt 0.671875 0.2265625 -vt 0.671875 0.1171875 -vt 0.78125 0.2578125 -vt 0.78125 0.25 -vt 0.890625 0.25 -vt 0.6875 0.1171875 -vt 0.6953125 0.1171875 -vt 0.6953125 0.2265625 -vt 0.890625 0.234375 -vt 0.890625 0.2421875 -vt 0.78125 0.2421875 -vt 0.8828125 0.125 -vt 0.890625 0.125 -vt 0.890625 0.1328125 -vt 0.8828125 0.1171875 -vt 0.875 0.1171875 -vt 0.875 0.109375 -vt 0.7890625 0.2265625 -vt 0.78125 0.2265625 -vt 0.78125 0.1171875 -vt 0.796875 0.3671875 -vt 0.796875 0.359375 -vt 0.90625 0.359375 -vt 0.796875 0.1171875 -vt 0.8046875 0.1171875 -vt 0.8046875 0.2265625 -vt 0.9140625 0.9921875 -vt 0.9140625 1 -vt 0.8046875 1 -vt 0.171875 0.1015625 -vt 0.1796875 0.1015625 -vt 0.1796875 0.109375 -vt 0.1953125 0.109375 -vt 0.1875 0.109375 -vt 0.1875 0.1015625 -vt 0.5390625 0.4453125 -vt 0.53125 0.4453125 -vt 0.53125 0.328125 -vt 0.5546875 0.953125 -vt 0.5546875 0.9453125 -vt 0.671875 0.9453125 -vt 0.546875 0.4453125 -vt 0.546875 0.328125 -vt 0.5546875 0.328125 -vt 0.671875 0.9296875 -vt 0.671875 0.9375 -vt 0.5546875 0.9375 -vt 0.890625 0.6015625 -vt 0.8984375 0.6015625 -vt 0.8984375 0.609375 -vt 0.4921875 0.109375 -vt 0.484375 0.109375 -vt 0.484375 0.1015625 -vt 0.5703125 0.875 -vt 0.5625 0.875 -vt 0.5625 0.7578125 -vt 0.5546875 0.921875 -vt 0.5546875 0.9140625 -vt 0.671875 0.9140625 -vt 0.5625 0.4453125 -vt 0.5625 0.328125 -vt 0.5703125 0.328125 -vt 0.6953125 0.8671875 -vt 0.6953125 0.875 -vt 0.578125 0.875 -vt 0.640625 0.1015625 -vt 0.6484375 0.1015625 -vt 0.6484375 0.109375 -vt 0.6640625 0.109375 -vt 0.65625 0.109375 -vt 0.65625 0.1015625 -vt 0.1328125 0.421875 -vt 0.125 0.421875 -vt 0.125 0.3046875 -vt 0.578125 0.859375 -vt 0.578125 0.8515625 -vt 0.6953125 0.8515625 -vt 0.140625 0.421875 -vt 0.140625 0.3046875 -vt 0.1484375 0.3046875 -vt 0.6953125 0.8359375 -vt 0.6953125 0.84375 -vt 0.578125 0.84375 -vt 0.671875 0.1015625 -vt 0.6796875 0.1015625 -vt 0.6796875 0.109375 -vt 0.6953125 0.109375 -vt 0.6875 0.109375 -vt 0.6875 0.1015625 -vt 0.1640625 0.421875 -vt 0.15625 0.421875 -vt 0.15625 0.3046875 -vt 0.578125 0.828125 -vt 0.578125 0.8203125 -vt 0.6953125 0.8203125 -vt 0.390625 0.421875 -vt 0.390625 0.3046875 -vt 0.3984375 0.3046875 -vt 0.6953125 0.8046875 -vt 0.6953125 0.8125 -vt 0.578125 0.8125 -vt 0.890625 0.28125 -vt 0.8984375 0.28125 -vt 0.8984375 0.2890625 -vt 0.8984375 0.2734375 -vt 0.890625 0.2734375 -vt 0.890625 0.265625 -vt 0.4140625 0.421875 -vt 0.40625 0.421875 -vt 0.40625 0.3046875 -vt 0.578125 0.796875 -vt 0.578125 0.7890625 -vt 0.6953125 0.7890625 -vt 0.421875 0.421875 -vt 0.421875 0.3046875 -vt 0.4296875 0.3046875 -vt 0.6953125 0.7734375 -vt 0.6953125 0.78125 -vt 0.578125 0.78125 -vt 0.734375 0.1015625 -vt 0.7421875 0.1015625 -vt 0.7421875 0.109375 -vt 0.7890625 0.109375 -vt 0.78125 0.109375 -vt 0.78125 0.1015625 -vt 0.4453125 0.421875 -vt 0.4375 0.421875 -vt 0.4375 0.3046875 -vt 0.578125 0.765625 -vt 0.578125 0.7578125 -vt 0.6953125 0.7578125 -vt 0.453125 0.421875 -vt 0.453125 0.3046875 -vt 0.4609375 0.3046875 -vt 0.6953125 0.4375 -vt 0.6953125 0.4453125 -vt 0.578125 0.4453125 -vt 0.796875 0.1015625 -vt 0.8046875 0.1015625 -vt 0.8046875 0.109375 -vt 0.8203125 0.109375 -vt 0.8125 0.109375 -vt 0.8125 0.1015625 -vt 0.5859375 0.4296875 -vt 0.578125 0.4296875 -vt 0.578125 0.3125 -vt 0.5859375 0.90625 -vt 0.5859375 0.8984375 -vt 0.703125 0.8984375 -vt 0.59375 0.4296875 -vt 0.59375 0.3125 -vt 0.6015625 0.3125 -vt 0.703125 0.8828125 -vt 0.703125 0.890625 -vt 0.5859375 0.890625 -vt 0.828125 0.1015625 -vt 0.8359375 0.1015625 -vt 0.8359375 0.109375 -vt 0.8515625 0.109375 -vt 0.84375 0.109375 -vt 0.84375 0.1015625 -vt 0.0078125 0.3984375 -vt 0 0.3984375 -vt 0 0.28125 -vt 0.609375 0.6171875 -vt 0.609375 0.609375 -vt 0.7265625 0.609375 -vt 0.015625 0.3984375 -vt 0.015625 0.28125 -vt 0.0234375 0.28125 -vt 0.7265625 0.421875 -vt 0.7265625 0.4296875 -vt 0.609375 0.4296875 -vt 0.890625 0.109375 -vt 0.8984375 0.109375 -vt 0.8984375 0.1171875 -vt 0.0703125 0.1015625 -vt 0.0625 0.1015625 -vt 0.0625 0.09375 -vt 0.0390625 0.3984375 -vt 0.03125 0.3984375 -vt 0.03125 0.28125 -vt 0.609375 0.4140625 -vt 0.609375 0.40625 -vt 0.7265625 0.40625 -vt 0.046875 0.3984375 -vt 0.046875 0.28125 -vt 0.0546875 0.28125 -vt 0.7265625 0.390625 -vt 0.7265625 0.3984375 -vt 0.609375 0.3984375 -vt 0.078125 0.09375 -vt 0.0859375 0.09375 -vt 0.0859375 0.1015625 -vt 0.1015625 0.1015625 -vt 0.09375 0.1015625 -vt 0.09375 0.09375 -vt 0.0703125 0.3984375 -vt 0.0625 0.3984375 -vt 0.0625 0.28125 -vt 0.609375 0.3828125 -vt 0.609375 0.375 -vt 0.7265625 0.375 -vt 0.078125 0.3984375 -vt 0.078125 0.28125 -vt 0.0859375 0.28125 -vt 0.7421875 0.59375 -vt 0.7421875 0.6015625 -vt 0.625 0.6015625 -vt 0.109375 0.09375 -vt 0.1171875 0.09375 -vt 0.1171875 0.1015625 -vt 0.2109375 0.1015625 -vt 0.203125 0.1015625 -vt 0.203125 0.09375 -vt 0.1015625 0.3984375 -vt 0.09375 0.3984375 -vt 0.09375 0.28125 -vt 0.625 0.4609375 -vt 0.625 0.453125 -vt 0.7421875 0.453125 -vt 0.109375 0.3984375 -vt 0.109375 0.28125 -vt 0.1171875 0.28125 -vt 0.75 0.7109375 -vt 0.75 0.71875 -vt 0.6328125 0.71875 -vt 0.21875 0.09375 -vt 0.2265625 0.09375 -vt 0.2265625 0.1015625 -vt 0.2421875 0.1015625 -vt 0.234375 0.1015625 -vt 0.234375 0.09375 -vt 0.1796875 0.3984375 -vt 0.171875 0.3984375 -vt 0.171875 0.28125 -vt 0.390625 0.8515625 -vt 0.390625 0.8359375 -vt 0.5078125 0.8359375 -vt 0.1875 0.3984375 -vt 0.1875 0.28125 -vt 0.1953125 0.28125 -vt 0.5078125 0.8125 -vt 0.5078125 0.828125 -vt 0.390625 0.828125 -vt 0.171875 0.1328125 -vt 0.171875 0.1171875 -vt 0.1796875 0.1171875 -vt 0.1953125 0.1328125 -vt 0.1875 0.1328125 -vt 0.1875 0.1171875 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -usemtl m_5f175e4e-a6a7-9193-e88f-70334c8bfde8 -f 26/109/37 27/110/37 28/111/37 -f 29/112/38 30/113/38 27/114/38 -f 30/115/39 31/116/39 32/117/39 -f 31/118/40 28/119/40 32/120/40 -f 27/121/41 32/122/41 28/123/41 -f 29/124/42 31/125/42 33/126/42 -f 34/127/43 35/128/43 36/129/43 -f 37/130/44 38/131/44 35/132/44 -f 39/133/45 40/134/45 38/135/45 -f 41/136/46 36/137/46 40/138/46 -f 38/139/47 36/140/47 35/141/47 -f 37/142/48 41/143/48 39/144/48 -f 42/145/49 43/146/49 44/147/49 -f 45/148/50 46/149/50 43/150/50 -f 47/151/51 48/152/51 46/153/51 -f 49/154/52 42/155/52 44/156/52 -f 43/157/53 48/158/53 44/159/53 -f 45/160/54 42/161/54 49/162/54 -f 50/163/55 51/164/55 52/165/55 -f 53/166/56 54/167/56 51/168/56 -f 55/169/57 56/170/57 54/171/57 -f 57/172/58 50/173/58 52/174/58 -f 51/175/59 56/176/59 52/177/59 -f 53/178/60 50/179/60 57/180/60 -f 58/181/61 59/182/61 60/183/61 -f 61/184/62 62/185/62 59/186/62 -f 63/187/63 64/188/63 62/189/63 -f 65/190/64 58/191/64 60/192/64 -f 59/193/65 64/194/65 60/195/65 -f 61/196/66 58/197/66 65/198/66 -f 66/199/67 67/200/67 68/201/67 -f 69/202/68 70/203/68 67/204/68 -f 71/205/69 72/206/69 70/207/69 -f 73/208/70 66/209/70 68/210/70 -f 67/211/71 72/212/71 68/213/71 -f 69/214/72 66/215/72 73/216/72 -f 74/217/73 75/218/73 76/219/73 -f 77/220/74 78/221/74 75/222/74 -f 78/223/75 79/224/75 80/225/75 -f 79/226/76 76/227/76 80/228/76 -f 78/229/77 76/230/77 75/231/77 -f 77/232/78 79/233/78 81/234/78 -f 82/235/79 83/236/79 84/237/79 -f 85/238/80 86/239/80 83/240/80 -f 86/241/81 87/242/81 88/243/81 -f 87/244/82 84/245/82 88/246/82 -f 86/247/83 84/248/83 83/249/83 -f 85/250/84 87/251/84 89/252/84 -f 90/253/85 91/254/85 92/255/85 -f 93/256/86 94/257/86 91/258/86 -f 94/259/87 95/260/87 25/261/87 -f 95/262/88 92/263/88 25/264/88 -f 94/265/89 92/266/89 91/267/89 -f 93/268/90 95/269/90 96/270/90 -f 97/271/91 98/272/91 99/273/91 -f 100/274/92 101/275/92 98/276/92 -f 101/277/93 102/278/93 103/279/93 -f 102/280/94 99/281/94 103/282/94 -f 101/283/95 99/284/95 98/285/95 -f 100/286/96 102/287/96 104/288/96 -f 105/289/97 106/290/97 107/291/97 -f 108/292/98 109/293/98 106/294/98 -f 109/295/99 110/296/99 111/297/99 -f 110/298/100 107/299/100 111/300/100 -f 109/301/101 107/302/101 106/303/101 -f 108/304/102 110/305/102 112/306/102 -f 113/307/103 114/308/103 115/309/103 -f 116/310/104 117/311/104 114/312/104 -f 117/313/105 118/314/105 119/315/105 -f 118/316/106 115/317/106 119/318/106 -f 117/319/107 115/320/107 114/321/107 -f 116/322/108 118/323/108 120/324/108 -f 121/325/109 122/326/109 123/327/109 -f 124/328/110 125/329/110 122/330/110 -f 125/331/111 126/332/111 127/333/111 -f 126/334/112 123/335/112 127/336/112 -f 125/337/113 123/338/113 122/339/113 -f 124/340/114 126/341/114 128/342/114 -f 129/343/115 130/344/115 131/345/115 -f 132/346/116 133/347/116 130/348/116 -f 133/349/117 134/350/117 135/351/117 -f 134/352/118 131/353/118 135/354/118 -f 133/355/119 131/356/119 130/357/119 -f 132/358/120 134/359/120 136/360/120 -f 137/361/121 138/362/121 139/363/121 -f 140/364/122 141/365/122 138/366/122 -f 141/367/123 142/368/123 143/369/123 -f 142/370/124 139/371/124 143/372/124 -f 141/373/125 139/374/125 138/375/125 -f 140/376/126 142/377/126 144/378/126 -f 145/379/127 146/380/127 147/381/127 -f 148/382/128 149/383/128 146/384/128 -f 149/385/129 150/386/129 151/387/129 -f 150/388/130 147/389/130 151/390/130 -f 149/391/131 147/392/131 146/393/131 -f 148/394/132 150/395/132 152/396/132 -f 153/397/133 154/398/133 155/399/133 -f 156/400/134 157/401/134 154/402/134 -f 157/403/135 158/404/135 159/405/135 -f 158/406/136 155/407/136 159/408/136 -f 157/409/137 155/410/137 154/411/137 -f 156/412/138 158/413/138 160/414/138 -f 161/415/139 162/416/139 163/417/139 -f 164/418/140 165/419/140 162/420/140 -f 166/421/141 167/422/141 165/423/141 -f 168/424/142 163/425/142 167/426/142 -f 165/427/143 163/428/143 162/429/143 -f 164/430/144 168/431/144 166/432/144 -f 169/433/145 170/434/145 171/435/145 -f 172/436/146 173/437/146 170/438/146 -f 174/439/147 175/440/147 173/441/147 -f 176/442/148 171/443/148 175/444/148 -f 173/445/149 171/446/149 170/447/149 -f 172/448/150 176/449/150 174/450/150 -f 177/451/151 178/452/151 179/453/151 -f 180/454/152 181/455/152 178/456/152 -f 182/457/153 183/458/153 181/459/153 -f 184/460/154 179/461/154 183/462/154 -f 181/463/155 179/464/155 178/465/155 -f 180/466/156 184/467/156 182/468/156 -f 185/469/157 186/470/157 187/471/157 -f 188/472/158 189/473/158 186/474/158 -f 190/475/159 191/476/159 189/477/159 -f 192/478/160 187/479/160 191/480/160 -f 189/481/161 187/482/161 186/483/161 -f 188/484/162 192/485/162 190/486/162 -f 193/487/163 194/488/163 195/489/163 -f 196/490/164 197/491/164 194/492/164 -f 198/493/165 199/494/165 197/495/165 -f 200/496/166 195/497/166 199/498/166 -f 197/499/167 195/500/167 194/501/167 -f 196/502/168 200/503/168 198/504/168 -f 201/505/169 202/506/169 203/507/169 -f 204/508/170 205/509/170 202/510/170 -f 206/511/171 207/512/171 205/513/171 -f 208/514/172 203/515/172 207/516/172 -f 205/517/173 203/518/173 202/519/173 -f 204/520/174 208/521/174 206/522/174 -f 209/523/175 210/524/175 211/525/175 -f 212/526/176 213/527/176 210/528/176 -f 214/529/177 215/530/177 213/531/177 -f 216/532/178 211/533/178 215/534/178 -f 213/535/179 211/536/179 210/537/179 -f 212/538/180 216/539/180 214/540/180 -f 217/541/181 218/542/181 219/543/181 -f 220/544/182 221/545/182 218/546/182 -f 222/547/183 223/548/183 221/549/183 -f 224/550/184 219/551/184 223/552/184 -f 221/553/185 219/554/185 218/555/185 -f 220/556/186 224/557/186 222/558/186 -f 225/559/187 226/560/187 227/561/187 -f 228/562/188 229/563/188 226/564/188 -f 230/565/189 231/566/189 229/567/189 -f 232/568/190 227/569/190 231/570/190 -f 229/571/191 227/572/191 226/573/191 -f 228/574/192 232/575/192 230/576/192 -f 233/577/193 234/578/193 235/579/193 -f 236/580/194 237/581/194 234/582/194 -f 238/583/195 239/584/195 237/585/195 -f 240/586/196 235/587/196 239/588/196 -f 237/589/197 235/590/197 234/591/197 -f 236/592/198 240/593/198 238/594/198 -f 241/595/199 242/596/199 243/597/199 -f 244/598/200 245/599/200 242/600/200 -f 246/601/201 247/602/201 245/603/201 -f 248/604/202 243/605/202 247/606/202 -f 245/607/203 243/608/203 242/609/203 -f 244/610/204 248/611/204 246/612/204 -f 249/613/205 250/614/205 251/615/205 -f 252/616/206 253/617/206 250/618/206 -f 253/619/207 254/620/207 255/621/207 -f 254/622/208 251/623/208 255/624/208 -f 253/625/209 251/626/209 250/627/209 -f 252/628/210 254/629/210 256/630/210 -f 257/631/211 258/632/211 259/633/211 -f 260/634/212 261/635/212 258/636/212 -f 261/637/213 262/638/213 263/639/213 -f 262/640/214 259/641/214 263/642/214 -f 261/643/215 259/644/215 258/645/215 -f 260/646/216 262/647/216 264/648/216 -f 265/649/217 266/650/217 267/651/217 -f 268/652/218 269/653/218 266/654/218 -f 269/655/219 270/656/219 271/657/219 -f 270/658/220 267/659/220 271/660/220 -f 269/661/221 267/662/221 266/663/221 -f 268/664/222 270/665/222 272/666/222 -f 273/667/223 274/668/223 275/669/223 -f 276/670/224 277/671/224 274/672/224 -f 277/673/225 278/674/225 279/675/225 -f 278/676/226 275/677/226 279/678/226 -f 277/679/227 275/680/227 274/681/227 -f 276/682/228 278/683/228 280/684/228 -f 281/685/229 282/686/229 283/687/229 -f 284/688/230 285/689/230 282/690/230 -f 285/691/231 286/692/231 287/693/231 -f 286/694/232 283/695/232 287/696/232 -f 285/697/233 283/698/233 282/699/233 -f 284/700/234 286/701/234 288/702/234 -f 289/703/235 290/704/235 291/705/235 -f 292/706/236 293/707/236 290/708/236 -f 293/709/237 294/710/237 295/711/237 -f 294/712/238 291/713/238 295/714/238 -f 293/715/239 291/716/239 290/717/239 -f 292/718/240 294/719/240 296/720/240 -f 297/721/241 298/722/241 299/723/241 -f 300/724/242 301/725/242 298/726/242 -f 301/727/243 302/728/243 303/729/243 -f 302/730/244 299/731/244 303/732/244 -f 301/733/245 299/734/245 298/735/245 -f 300/736/246 302/737/246 304/738/246 -f 305/739/247 306/740/247 307/741/247 -f 308/742/248 309/743/248 306/744/248 -f 309/745/249 310/746/249 311/747/249 -f 310/748/250 307/749/250 311/750/250 -f 309/751/251 307/752/251 306/753/251 -f 308/754/252 310/755/252 312/756/252 -f 313/757/253 314/758/253 315/759/253 -f 316/760/254 317/761/254 314/762/254 -f 317/763/255 318/764/255 319/765/255 -f 318/766/256 315/767/256 319/768/256 -f 317/769/257 315/770/257 314/771/257 -f 316/772/258 318/773/258 320/774/258 -f 321/775/259 322/776/259 323/777/259 -f 324/778/260 325/779/260 322/780/260 -f 325/781/261 326/782/261 327/783/261 -f 326/784/262 323/785/262 327/786/262 -f 325/787/263 323/788/263 322/789/263 -f 324/790/264 326/791/264 328/792/264 -f 329/793/265 330/794/265 331/795/265 -f 332/796/266 333/797/266 330/798/266 -f 333/799/267 334/800/267 335/801/267 -f 334/802/268 331/803/268 335/804/268 -f 333/805/269 331/806/269 330/807/269 -f 332/808/270 334/809/270 336/810/270 -f 337/811/271 338/812/271 339/813/271 -f 340/814/272 341/815/272 338/816/272 -f 341/817/273 342/818/273 343/819/273 -f 342/820/274 339/821/274 343/822/274 -f 338/823/275 343/824/275 339/825/275 -f 340/826/276 342/827/276 344/828/276 -f 26/829/277 29/830/277 27/831/277 -f 29/832/278 33/833/278 30/834/278 -f 30/835/279 33/836/279 31/837/279 -f 31/838/280 26/839/280 28/840/280 -f 27/841/281 30/842/281 32/843/281 -f 29/844/282 26/845/282 31/846/282 -f 34/847/283 37/848/283 35/849/283 -f 37/850/284 39/851/284 38/852/284 -f 39/853/285 41/854/285 40/855/285 -f 41/856/286 34/857/286 36/858/286 -f 38/859/287 40/860/287 36/861/287 -f 37/862/288 34/863/288 41/864/288 -f 42/865/289 45/866/289 43/867/289 -f 45/868/290 47/869/290 46/870/290 -f 47/871/291 345/872/291 48/873/291 -f 44/874/292 48/875/292 49/876/292 -f 48/877/293 345/878/293 49/879/293 -f 43/880/294 46/881/294 48/882/294 -f 345/883/295 47/884/295 49/885/295 -f 47/886/296 45/887/296 49/888/296 -f 50/889/297 53/890/297 51/891/297 -f 53/892/298 55/893/298 54/894/298 -f 55/895/299 346/896/299 56/897/299 -f 52/898/300 56/899/300 57/900/300 -f 56/901/301 346/902/301 57/903/301 -f 51/904/302 54/905/302 56/906/302 -f 346/907/303 55/908/303 57/909/303 -f 55/910/304 53/911/304 57/912/304 -f 58/913/305 61/914/305 59/915/305 -f 61/916/306 63/917/306 62/918/306 -f 63/919/307 347/920/307 64/921/307 -f 60/922/308 64/923/308 65/924/308 -f 64/925/309 347/926/309 65/927/309 -f 59/928/310 62/929/310 64/930/310 -f 347/931/311 63/932/311 65/933/311 -f 63/934/312 61/935/312 65/936/312 -f 66/937/313 69/938/313 67/939/313 -f 69/940/314 71/941/314 70/942/314 -f 71/943/315 348/944/315 72/945/315 -f 68/946/316 72/947/316 73/948/316 -f 72/949/317 348/950/317 73/951/317 -f 67/952/318 70/953/318 72/954/318 -f 348/955/319 71/956/319 73/957/319 -f 71/958/320 69/959/320 73/960/320 -f 74/961/321 77/962/321 75/963/321 -f 77/964/322 81/965/322 78/966/322 -f 78/967/323 81/968/323 79/969/323 -f 79/970/324 74/971/324 76/972/324 -f 78/973/325 80/974/325 76/975/325 -f 77/976/326 74/977/326 79/978/326 -f 82/979/327 85/980/327 83/981/327 -f 85/982/328 89/983/328 86/984/328 -f 86/985/329 89/986/329 87/987/329 -f 87/988/330 82/989/330 84/990/330 -f 86/991/331 88/992/331 84/993/331 -f 85/994/332 82/995/332 87/996/332 -f 90/997/333 93/998/333 91/999/333 -f 93/1000/334 96/1001/334 94/1002/334 -f 94/1003/335 96/1004/335 95/1005/335 -f 95/1006/336 90/1007/336 92/1008/336 -f 94/1009/337 25/1010/337 92/1011/337 -f 93/1012/338 90/1013/338 95/1014/338 -f 97/1015/339 100/1016/339 98/1017/339 -f 100/1018/340 104/1019/340 101/1020/340 -f 101/1021/341 104/1022/341 102/1023/341 -f 102/1024/342 97/1025/342 99/1026/342 -f 101/1027/343 103/1028/343 99/1029/343 -f 100/1030/344 97/1031/344 102/1032/344 -f 105/1033/345 108/1034/345 106/1035/345 -f 108/1036/346 112/1037/346 109/1038/346 -f 109/1039/347 112/1040/347 110/1041/347 -f 110/1042/348 105/1043/348 107/1044/348 -f 109/1045/349 111/1046/349 107/1047/349 -f 108/1048/350 105/1049/350 110/1050/350 -f 113/1051/351 116/1052/351 114/1053/351 -f 116/1054/352 120/1055/352 117/1056/352 -f 117/1057/353 120/1058/353 118/1059/353 -f 118/1060/354 113/1061/354 115/1062/354 -f 117/1063/355 119/1064/355 115/1065/355 -f 116/1066/356 113/1067/356 118/1068/356 -f 121/1069/357 124/1070/357 122/1071/357 -f 124/1072/358 128/1073/358 125/1074/358 -f 125/1075/359 128/1076/359 126/1077/359 -f 126/1078/360 121/1079/360 123/1080/360 -f 125/1081/361 127/1082/361 123/1083/361 -f 124/1084/362 121/1085/362 126/1086/362 -f 129/1087/363 132/1088/363 130/1089/363 -f 132/1090/364 136/1091/364 133/1092/364 -f 133/1093/365 136/1094/365 134/1095/365 -f 134/1096/366 129/1097/366 131/1098/366 -f 133/1099/367 135/1100/367 131/1101/367 -f 132/1102/368 129/1103/368 134/1104/368 -f 137/1105/369 140/1106/369 138/1107/369 -f 140/1108/370 144/1109/370 141/1110/370 -f 141/1111/371 144/1112/371 142/1113/371 -f 142/1114/372 137/1115/372 139/1116/372 -f 141/1117/373 143/1118/373 139/1119/373 -f 140/1120/374 137/1121/374 142/1122/374 -f 145/1123/375 148/1124/375 146/1125/375 -f 148/1126/376 152/1127/376 149/1128/376 -f 149/1129/377 152/1130/377 150/1131/377 -f 150/1132/378 145/1133/378 147/1134/378 -f 149/1135/379 151/1136/379 147/1137/379 -f 148/1138/380 145/1139/380 150/1140/380 -f 153/1141/381 156/1142/381 154/1143/381 -f 156/1144/382 160/1145/382 157/1146/382 -f 157/1147/383 160/1148/383 158/1149/383 -f 158/1150/384 153/1151/384 155/1152/384 -f 157/1153/385 159/1154/385 155/1155/385 -f 156/1156/386 153/1157/386 158/1158/386 -f 161/1159/387 164/1160/387 162/1161/387 -f 164/1162/388 166/1163/388 165/1164/388 -f 166/1165/389 168/1166/389 167/1167/389 -f 168/1168/390 161/1169/390 163/1170/390 -f 165/1171/391 167/1172/391 163/1173/391 -f 164/1174/392 161/1175/392 168/1176/392 -f 169/1177/393 172/1178/393 170/1179/393 -f 172/1180/394 174/1181/394 173/1182/394 -f 174/1183/395 176/1184/395 175/1185/395 -f 176/1186/396 169/1187/396 171/1188/396 -f 173/1189/397 175/1190/397 171/1191/397 -f 172/1192/398 169/1193/398 176/1194/398 -f 177/1195/399 180/1196/399 178/1197/399 -f 180/1198/400 182/1199/400 181/1200/400 -f 182/1201/401 184/1202/401 183/1203/401 -f 184/1204/402 177/1205/402 179/1206/402 -f 181/1207/403 183/1208/403 179/1209/403 -f 180/1210/404 177/1211/404 184/1212/404 -f 185/1213/405 188/1214/405 186/1215/405 -f 188/1216/406 190/1217/406 189/1218/406 -f 190/1219/407 192/1220/407 191/1221/407 -f 192/1222/408 185/1223/408 187/1224/408 -f 189/1225/409 191/1226/409 187/1227/409 -f 188/1228/410 185/1229/410 192/1230/410 -f 193/1231/411 196/1232/411 194/1233/411 -f 196/1234/412 198/1235/412 197/1236/412 -f 198/1237/413 200/1238/413 199/1239/413 -f 200/1240/414 193/1241/414 195/1242/414 -f 197/1243/415 199/1244/415 195/1245/415 -f 196/1246/416 193/1247/416 200/1248/416 -f 201/1249/417 204/1250/417 202/1251/417 -f 204/1252/418 206/1253/418 205/1254/418 -f 206/1255/419 208/1256/419 207/1257/419 -f 208/1258/420 201/1259/420 203/1260/420 -f 205/1261/421 207/1262/421 203/1263/421 -f 204/1264/422 201/1265/422 208/1266/422 -f 209/1267/423 212/1268/423 210/1269/423 -f 212/1270/424 214/1271/424 213/1272/424 -f 214/1273/425 216/1274/425 215/1275/425 -f 216/1276/426 209/1277/426 211/1278/426 -f 213/1279/427 215/1280/427 211/1281/427 -f 212/1282/428 209/1283/428 216/1284/428 -f 217/1285/429 220/1286/429 218/1287/429 -f 220/1288/430 222/1289/430 221/1290/430 -f 222/1291/431 224/1292/431 223/1293/431 -f 224/1294/432 217/1295/432 219/1296/432 -f 221/1297/433 223/1298/433 219/1299/433 -f 220/1300/434 217/1301/434 224/1302/434 -f 225/1303/435 228/1304/435 226/1305/435 -f 228/1306/436 230/1307/436 229/1308/436 -f 230/1309/437 232/1310/437 231/1311/437 -f 232/1312/438 225/1313/438 227/1314/438 -f 229/1315/439 231/1316/439 227/1317/439 -f 228/1318/440 225/1319/440 232/1320/440 -f 233/1321/441 236/1322/441 234/1323/441 -f 236/1324/442 238/1325/442 237/1326/442 -f 238/1327/443 240/1328/443 239/1329/443 -f 240/1330/444 233/1331/444 235/1332/444 -f 237/1333/445 239/1334/445 235/1335/445 -f 236/1336/446 233/1337/446 240/1338/446 -f 241/1339/447 244/1340/447 242/1341/447 -f 244/1342/448 246/1343/448 245/1344/448 -f 246/1345/449 248/1346/449 247/1347/449 -f 248/1348/450 241/1349/450 243/1350/450 -f 245/1351/451 247/1352/451 243/1353/451 -f 244/1354/452 241/1355/452 248/1356/452 -f 249/1357/453 252/1358/453 250/1359/453 -f 252/1360/454 256/1361/454 253/1362/454 -f 253/1363/455 256/1364/455 254/1365/455 -f 254/1366/456 249/1367/456 251/1368/456 -f 253/1369/457 255/1370/457 251/1371/457 -f 252/1372/458 249/1373/458 254/1374/458 -f 257/1375/459 260/1376/459 258/1377/459 -f 260/1378/460 264/1379/460 261/1380/460 -f 261/1381/461 264/1382/461 262/1383/461 -f 262/1384/462 257/1385/462 259/1386/462 -f 261/1387/463 263/1388/463 259/1389/463 -f 260/1390/464 257/1391/464 262/1392/464 -f 265/1393/465 268/1394/465 266/1395/465 -f 268/1396/466 272/1397/466 269/1398/466 -f 269/1399/467 272/1400/467 270/1401/467 -f 270/1402/468 265/1403/468 267/1404/468 -f 269/1405/469 271/1406/469 267/1407/469 -f 268/1408/470 265/1409/470 270/1410/470 -f 273/1411/471 276/1412/471 274/1413/471 -f 276/1414/472 280/1415/472 277/1416/472 -f 277/1417/473 280/1418/473 278/1419/473 -f 278/1420/474 273/1421/474 275/1422/474 -f 277/1423/475 279/1424/475 275/1425/475 -f 276/1426/476 273/1427/476 278/1428/476 -f 281/1429/477 284/1430/477 282/1431/477 -f 284/1432/478 288/1433/478 285/1434/478 -f 285/1435/479 288/1436/479 286/1437/479 -f 286/1438/480 281/1439/480 283/1440/480 -f 285/1441/481 287/1442/481 283/1443/481 -f 284/1444/482 281/1445/482 286/1446/482 -f 289/1447/483 292/1448/483 290/1449/483 -f 292/1450/484 296/1451/484 293/1452/484 -f 293/1453/485 296/1454/485 294/1455/485 -f 294/1456/486 289/1457/486 291/1458/486 -f 293/1459/487 295/1460/487 291/1461/487 -f 292/1462/488 289/1463/488 294/1464/488 -f 297/1465/489 300/1466/489 298/1467/489 -f 300/1468/490 304/1469/490 301/1470/490 -f 301/1471/491 304/1472/491 302/1473/491 -f 302/1474/492 297/1475/492 299/1476/492 -f 301/1477/493 303/1478/493 299/1479/493 -f 300/1480/494 297/1481/494 302/1482/494 -f 305/1483/495 308/1484/495 306/1485/495 -f 308/1486/496 312/1487/496 309/1488/496 -f 309/1489/497 312/1490/497 310/1491/497 -f 310/1492/498 305/1493/498 307/1494/498 -f 309/1495/499 311/1496/499 307/1497/499 -f 308/1498/500 305/1499/500 310/1500/500 -f 313/1501/501 316/1502/501 314/1503/501 -f 316/1504/502 320/1505/502 317/1506/502 -f 317/1507/503 320/1508/503 318/1509/503 -f 318/1510/504 313/1511/504 315/1512/504 -f 317/1513/505 319/1514/505 315/1515/505 -f 316/1516/506 313/1517/506 318/1518/506 -f 321/1519/507 324/1520/507 322/1521/507 -f 324/1522/508 328/1523/508 325/1524/508 -f 325/1525/509 328/1526/509 326/1527/509 -f 326/1528/510 321/1529/510 323/1530/510 -f 325/1531/511 327/1532/511 323/1533/511 -f 324/1534/512 321/1535/512 326/1536/512 -f 329/1537/513 332/1538/513 330/1539/513 -f 332/1540/514 336/1541/514 333/1542/514 -f 333/1543/515 336/1544/515 334/1545/515 -f 334/1546/516 329/1547/516 331/1548/516 -f 333/1549/517 335/1550/517 331/1551/517 -f 332/1552/518 329/1553/518 334/1554/518 -f 337/1555/519 340/1556/519 338/1557/519 -f 340/1558/520 344/1559/520 341/1560/520 -f 341/1561/521 344/1562/521 342/1563/521 -f 342/1564/522 337/1565/522 339/1566/522 -f 338/1567/523 341/1568/523 343/1569/523 -f 340/1570/524 337/1571/524 342/1572/524 o DoorBot -v 0.0625 1.5625 -1.4375 -v 0 1.5625 -0.5 -v 0.0625 1.5625 -0.5 -v 0 1.5625 -1.4375 -v 0 1.4375 -0.5 -v 0 1.4375 -1.4375 -v 0.0625 1.4375 -0.5 -v 0.0625 1.4375 -1.4375 -v 0.125 1.5625 1.4375 -v 0 1.5625 1.5 -v 0.125 1.5625 1.5 -v 0 1.5625 1.4375 -v 0 0.0625 1.5 -v 0 0.0625 1.4375 -v 0.125 0.0625 1.5 -v 0.125 1.46875 1.4375 -v 0.125 1.5625 -1.5 -v 0 1.5625 -1.4375 -v 0.125 1.5625 -1.4375 -v 0 1.5625 -1.5 -v 0 0.0625 -1.4375 -v 0 0.0625 -1.5 -v 0.125 0.0625 -1.4375 -v 0.125 1.46875 -1.5 -v 0.125 1.5625 -0.5 -v 0 1.5625 -0.4375 -v 0.125 1.5625 -0.4375 -v 0 1.5625 -0.5 -v 0 0.0625 -0.4375 -v 0 0.0625 -0.5 -v 0.125 0.0625 -0.4375 -v 0.125 0.15625 -0.5 -v 0.0625 0.125 -1.4375 -v 0 0.125 -0.5 -v 0.0625 0.125 -0.5 -v 0 0.125 -1.4375 -v 0 0.0625 -0.5 -v 0 0.0625 -1.4375 -v 0.0625 0.0625 -0.5 -v 0.0625 0.0625 -1.4375 -v 0.125 1.5625 0.4375 -v 0 1.5625 0.5 -v 0.125 1.5625 0.5 -v 0 1.5625 0.4375 -v 0 0.0625 0.5 -v 0 0.0625 0.4375 -v 0.125 0.0625 0.5 -v 0.125 0.15625 0.4375 -v 0.0625 0.25 -1.4375 -v 0 0.25 -0.5 -v 0.0625 0.25 -0.5 -v 0 0.25 -1.4375 -v 0 0.1875 -0.5 -v 0 0.1875 -1.4375 -v 0.0625 0.1875 -0.5 -v 0.0625 0.1875 -1.4375 -v 0.0625 0.375 -1.4375 -v 0 0.375 -0.5 -v 0.0625 0.375 -0.5 -v 0 0.375 -1.4375 -v 0 0.3125 -0.5 -v 0 0.3125 -1.4375 -v 0.0625 0.3125 -0.5 -v 0.0625 0.3125 -1.4375 -v 0.0625 0.5 -1.4375 -v 0 0.5 -0.5 -v 0.0625 0.5 -0.5 -v 0 0.5 -1.4375 -v 0 0.4375 -0.5 -v 0 0.4375 -1.4375 -v 0.0625 0.4375 -0.5 -v 0.0625 0.4375 -1.4375 -v 0.0625 0.625 -1.4375 -v 0 0.625 -0.5 -v 0.0625 0.625 -0.5 -v 0 0.625 -1.4375 -v 0 0.5625 -0.5 -v 0 0.5625 -1.4375 -v 0.0625 0.5625 -0.5 -v 0.0625 0.5625 -1.4375 -v 0.0625 0.75 -1.4375 -v 0 0.75 -0.5 -v 0.0625 0.75 -0.5 -v 0 0.75 -1.4375 -v 0 0.6875 -0.5 -v 0 0.6875 -1.4375 -v 0.0625 0.6875 -0.5 -v 0.0625 0.6875 -1.4375 -v 0.0625 0.875 -1.4375 -v 0 0.875 -0.5 -v 0.0625 0.875 -0.5 -v 0 0.875 -1.4375 -v 0 0.8125 -0.5 -v 0 0.8125 -1.4375 -v 0.0625 0.8125 -0.5 -v 0.0625 0.8125 -1.4375 -v 0.0625 1 -1.4375 -v 0 1 -0.5 -v 0.0625 1 -0.5 -v 0 1 -1.4375 -v 0 0.9375 -0.5 -v 0 0.9375 -1.4375 -v 0.0625 0.9375 -0.5 -v 0.0625 0.9375 -1.4375 -v 0.0625 1.125 -1.4375 -v 0 1.125 -0.5 -v 0.0625 1.125 -0.5 -v 0 1.125 -1.4375 -v 0 1.0625 -0.5 -v 0 1.0625 -1.4375 -v 0.0625 1.0625 -0.5 -v 0.0625 1.0625 -1.4375 -v 0.0625 1.25 -1.4375 -v 0 1.25 -0.5 -v 0.0625 1.25 -0.5 -v 0 1.25 -1.4375 -v 0 1.1875 -0.5 -v 0 1.1875 -1.4375 -v 0.0625 1.1875 -0.5 -v 0.0625 1.1875 -1.4375 -v 0.0625 1.375 -1.4375 -v 0 1.375 -0.5 -v 0.0625 1.375 -0.5 -v 0 1.375 -1.4375 -v 0 1.3125 -0.5 -v 0 1.3125 -1.4375 -v 0.0625 1.3125 -0.5 -v 0.0625 1.3125 -1.4375 -v 0.0625 1.5625 -0.4375 -v 0 1.5625 0.4375 -v 0.0625 1.5625 0.4375 -v 0 1.5625 -0.4375 -v 0 1.4375 0.4375 -v 0 1.4375 -0.4375 -v 0.0625 1.4375 0.4375 -v 0.0625 1.4375 -0.4375 -v 0.0625 1.375 -0.4375 -v 0 1.375 0.4375 -v 0.0625 1.375 0.4375 -v 0 1.375 -0.4375 -v 0 1.3125 0.4375 -v 0 1.3125 -0.4375 -v 0.0625 1.3125 0.4375 -v 0.0625 1.3125 -0.4375 -v 0.0625 1.25 -0.4375 -v 0 1.25 0.4375 -v 0.0625 1.25 0.4375 -v 0 1.25 -0.4375 -v 0 1.1875 0.4375 -v 0 1.1875 -0.4375 -v 0.0625 1.1875 0.4375 -v 0.0625 1.1875 -0.4375 -v 0.0625 1.125 -0.4375 -v 0 1.125 0.4375 -v 0.0625 1.125 0.4375 -v 0 1.125 -0.4375 -v 0 1.0625 0.4375 -v 0 1.0625 -0.4375 -v 0.0625 1.0625 0.4375 -v 0.0625 1.0625 -0.4375 -v 0.0625 1 -0.4375 -v 0 1 0.4375 -v 0.0625 1 0.4375 -v 0 1 -0.4375 -v 0 0.9375 0.4375 -v 0 0.9375 -0.4375 -v 0.0625 0.9375 0.4375 -v 0.0625 0.9375 -0.4375 -v 0.0625 0.875 -0.4375 -v 0 0.875 0.4375 -v 0.0625 0.875 0.4375 -v 0 0.875 -0.4375 -v 0 0.8125 0.4375 -v 0 0.8125 -0.4375 -v 0.0625 0.8125 0.4375 -v 0.0625 0.8125 -0.4375 -v 0.0625 0.75 -0.4375 -v 0 0.75 0.4375 -v 0.0625 0.75 0.4375 -v 0 0.75 -0.4375 -v 0 0.6875 0.4375 -v 0 0.6875 -0.4375 -v 0.0625 0.6875 0.4375 -v 0.0625 0.6875 -0.4375 -v 0.0625 0.625 -0.4375 -v 0 0.625 0.4375 -v 0.0625 0.625 0.4375 -v 0 0.625 -0.4375 -v 0 0.5625 0.4375 -v 0 0.5625 -0.4375 -v 0.0625 0.5625 0.4375 -v 0.0625 0.5625 -0.4375 -v 0.0625 0.5 -0.4375 -v 0 0.5 0.4375 -v 0.0625 0.5 0.4375 -v 0 0.5 -0.4375 -v 0 0.4375 0.4375 -v 0 0.4375 -0.4375 -v 0.0625 0.4375 0.4375 -v 0.0625 0.4375 -0.4375 -v 0.0625 0.375 -0.4375 -v 0 0.375 0.4375 -v 0.0625 0.375 0.4375 -v 0 0.375 -0.4375 -v 0 0.3125 0.4375 -v 0 0.3125 -0.4375 -v 0.0625 0.3125 0.4375 -v 0.0625 0.3125 -0.4375 -v 0.0625 0.25 -0.4375 -v 0 0.25 0.4375 -v 0.0625 0.25 0.4375 -v 0 0.25 -0.4375 -v 0 0.1875 0.4375 -v 0 0.1875 -0.4375 -v 0.0625 0.1875 0.4375 -v 0.0625 0.1875 -0.4375 -v 0.0625 0.125 0.5 -v 0 0.125 1.4375 -v 0.0625 0.125 1.4375 -v 0 0.125 0.5 -v 0 0.0625 1.4375 -v 0 0.0625 0.5 -v 0.0625 0.0625 1.4375 -v 0.0625 0.0625 0.5 -v 0.0625 0.25 0.5 -v 0 0.25 1.4375 -v 0.0625 0.25 1.4375 -v 0 0.25 0.5 -v 0 0.1875 1.4375 -v 0 0.1875 0.5 -v 0.0625 0.1875 1.4375 -v 0.0625 0.1875 0.5 -v 0.0625 0.375 0.5 -v 0 0.375 1.4375 -v 0.0625 0.375 1.4375 -v 0 0.375 0.5 -v 0 0.3125 1.4375 -v 0 0.3125 0.5 -v 0.0625 0.3125 1.4375 -v 0.0625 0.3125 0.5 -v 0.0625 0.5 0.5 -v 0 0.5 1.4375 -v 0.0625 0.5 1.4375 -v 0 0.5 0.5 -v 0 0.4375 1.4375 -v 0 0.4375 0.5 -v 0.0625 0.4375 1.4375 -v 0.0625 0.4375 0.5 -v 0.0625 0.625 0.5 -v 0 0.625 1.4375 -v 0.0625 0.625 1.4375 -v 0 0.625 0.5 -v 0 0.5625 1.4375 -v 0 0.5625 0.5 -v 0.0625 0.5625 1.4375 -v 0.0625 0.5625 0.5 -v 0.0625 0.75 0.5 -v 0 0.75 1.4375 -v 0.0625 0.75 1.4375 -v 0 0.75 0.5 -v 0 0.6875 1.4375 -v 0 0.6875 0.5 -v 0.0625 0.6875 1.4375 -v 0.0625 0.6875 0.5 -v 0.0625 0.875 0.5 -v 0 0.875 1.4375 -v 0.0625 0.875 1.4375 -v 0 0.875 0.5 -v 0 0.8125 1.4375 -v 0 0.8125 0.5 -v 0.0625 0.8125 1.4375 -v 0.0625 0.8125 0.5 -v 0.0625 1 0.5 -v 0 1 1.4375 -v 0.0625 1 1.4375 -v 0 1 0.5 -v 0 0.9375 1.4375 -v 0 0.9375 0.5 -v 0.0625 0.9375 1.4375 -v 0.0625 0.9375 0.5 -v 0.0625 1.125 0.5 -v 0 1.125 1.4375 -v 0.0625 1.125 1.4375 -v 0 1.125 0.5 -v 0 1.0625 1.4375 -v 0 1.0625 0.5 -v 0.0625 1.0625 1.4375 -v 0.0625 1.0625 0.5 -v 0.0625 1.25 0.5 -v 0 1.25 1.4375 -v 0.0625 1.25 1.4375 -v 0 1.25 0.5 -v 0 1.1875 1.4375 -v 0 1.1875 0.5 -v 0.0625 1.1875 1.4375 -v 0.0625 1.1875 0.5 -v 0.0625 1.375 0.5 -v 0 1.375 1.4375 -v 0.0625 1.375 1.4375 -v 0 1.375 0.5 -v 0 1.3125 1.4375 -v 0 1.3125 0.5 -v 0.0625 1.3125 1.4375 -v 0.0625 1.3125 0.5 -v 0.0625 1.5625 0.5 -v 0 1.5625 1.4375 -v 0.0625 1.5625 1.4375 -v 0 1.5625 0.5 -v 0 1.4375 1.4375 -v 0 1.4375 0.5 -v 0.0625 1.4375 1.4375 -v 0.0625 1.4375 0.5 -v 0.0625 0.125 -0.4375 -v 0 0.125 0.4375 -v 0.0625 0.125 0.4375 -v 0 0.125 -0.4375 -v 0 0.0625 0.4375 -v 0 0.0625 -0.4375 -v 0.0625 0.0625 0.4375 -v 0.0625 0.0625 -0.4375 -v 0.125 0.0625 1.4375 -v 0.125 0.0625 -1.5 -v 0.125 0.0625 -0.5 -v 0.125 0.0625 0.4375 -vt 0.4765625 0.3671875 -vt 0.46875 0.25 -vt 0.4765625 0.25 -vt 0.390625 0.8046875 -vt 0.5078125 0.7890625 -vt 0.5078125 0.8046875 -vt 0.609375 0.25 -vt 0.6171875 0.3671875 -vt 0.609375 0.3671875 -vt 0.5078125 0.765625 -vt 0.390625 0.78125 -vt 0.390625 0.765625 -vt 0.8671875 0.453125 -vt 0.875 0.46875 -vt 0.8671875 0.46875 -vt 0.7421875 0.1328125 -vt 0.734375 0.1171875 -vt 0.7421875 0.1171875 -vt 0.8828125 0.609375 -vt 0.8671875 0.6015625 -vt 0.8828125 0.6015625 -vt 0.0625 0.59375 -vt 0.0703125 0.40625 -vt 0.0703125 0.59375 -vt 0.859375 0.125 -vt 0.875 0.1328125 -vt 0.859375 0.1328125 -vt 0.0859375 0.58203125 -vt 0.0859375 0.59375 -vt 0.078125 0.59375 -vt 0.25 0.6796875 -vt 0.265625 0.4921875 -vt 0.265625 0.6796875 -vt 0.2890625 0.6796875 -vt 0.2734375 0.6796875 -vt 0.2734375 0.66796875 -vt 0.890625 0.71875 -vt 0.875 0.7109375 -vt 0.890625 0.7109375 -vt 0.09375 0.59375 -vt 0.1015625 0.40625 -vt 0.1015625 0.59375 -vt 0.875 0.6953125 -vt 0.890625 0.703125 -vt 0.875 0.703125 -vt 0.1171875 0.58203125 -vt 0.1171875 0.59375 -vt 0.109375 0.59375 -vt 0.296875 0.6796875 -vt 0.3125 0.4921875 -vt 0.3125 0.6796875 -vt 0.3359375 0.6796875 -vt 0.3203125 0.6796875 -vt 0.3203125 0.66796875 -vt 0.890625 0.6875 -vt 0.875 0.6796875 -vt 0.890625 0.6796875 -vt 0.40625 0.6171875 -vt 0.4140625 0.4296875 -vt 0.4140625 0.6171875 -vt 0.875 0.6640625 -vt 0.890625 0.671875 -vt 0.875 0.671875 -vt 0.4296875 0.44140625 -vt 0.4296875 0.6171875 -vt 0.421875 0.6171875 -vt 0.34375 0.875 -vt 0.359375 0.6875 -vt 0.359375 0.875 -vt 0.359375 0.6796875 -vt 0.34375 0.6796875 -vt 0.34375 0.50390625 -vt 0.6328125 0.3671875 -vt 0.625 0.25 -vt 0.6328125 0.25 -vt 0.6328125 0.703125 -vt 0.75 0.6953125 -vt 0.75 0.703125 -vt 0.203125 0.2421875 -vt 0.2109375 0.359375 -vt 0.203125 0.359375 -vt 0.75 0.6796875 -vt 0.6328125 0.6875 -vt 0.6328125 0.6796875 -vt 0.25 0.09375 -vt 0.2578125 0.1015625 -vt 0.25 0.1015625 -vt 0.90625 0.75 -vt 0.8984375 0.7421875 -vt 0.90625 0.7421875 -vt 0.890625 0.65625 -vt 0.875 0.6484375 -vt 0.890625 0.6484375 -vt 0.4375 0.6171875 -vt 0.4453125 0.4296875 -vt 0.4453125 0.6171875 -vt 0.875 0.6328125 -vt 0.890625 0.640625 -vt 0.875 0.640625 -vt 0.4609375 0.44140625 -vt 0.4609375 0.6171875 -vt 0.453125 0.6171875 -vt 0.3671875 0.875 -vt 0.3828125 0.6875 -vt 0.3828125 0.875 -vt 0.3828125 0.6796875 -vt 0.3671875 0.6796875 -vt 0.3671875 0.50390625 -vt 0.2265625 0.359375 -vt 0.21875 0.2421875 -vt 0.2265625 0.2421875 -vt 0.6328125 0.671875 -vt 0.75 0.6640625 -vt 0.75 0.671875 -vt 0.234375 0.2421875 -vt 0.2421875 0.359375 -vt 0.234375 0.359375 -vt 0.75 0.6484375 -vt 0.6328125 0.65625 -vt 0.6328125 0.6484375 -vt 0.265625 0.09375 -vt 0.2734375 0.1015625 -vt 0.265625 0.1015625 -vt 0.90625 0.734375 -vt 0.8984375 0.7265625 -vt 0.90625 0.7265625 -vt 0.2578125 0.359375 -vt 0.25 0.2421875 -vt 0.2578125 0.2421875 -vt 0.6328125 0.640625 -vt 0.75 0.6328125 -vt 0.75 0.640625 -vt 0.265625 0.2421875 -vt 0.2734375 0.359375 -vt 0.265625 0.359375 -vt 0.7578125 0.7421875 -vt 0.640625 0.75 -vt 0.640625 0.7421875 -vt 0.28125 0.09375 -vt 0.2890625 0.1015625 -vt 0.28125 0.1015625 -vt 0.90625 0.71875 -vt 0.8984375 0.7109375 -vt 0.90625 0.7109375 -vt 0.2890625 0.359375 -vt 0.28125 0.2421875 -vt 0.2890625 0.2421875 -vt 0.640625 0.734375 -vt 0.7578125 0.7265625 -vt 0.7578125 0.734375 -vt 0.296875 0.2421875 -vt 0.3046875 0.359375 -vt 0.296875 0.359375 -vt 0.7578125 0.578125 -vt 0.640625 0.5859375 -vt 0.640625 0.578125 -vt 0.296875 0.09375 -vt 0.3046875 0.1015625 -vt 0.296875 0.1015625 -vt 0.90625 0.703125 -vt 0.8984375 0.6953125 -vt 0.90625 0.6953125 -vt 0.3203125 0.359375 -vt 0.3125 0.2421875 -vt 0.3203125 0.2421875 -vt 0.640625 0.5703125 -vt 0.7578125 0.5625 -vt 0.7578125 0.5703125 -vt 0.328125 0.2421875 -vt 0.3359375 0.359375 -vt 0.328125 0.359375 -vt 0.7578125 0.546875 -vt 0.640625 0.5546875 -vt 0.640625 0.546875 -vt 0.3125 0.09375 -vt 0.3203125 0.1015625 -vt 0.3125 0.1015625 -vt 0.90625 0.6875 -vt 0.8984375 0.6796875 -vt 0.90625 0.6796875 -vt 0.3515625 0.359375 -vt 0.34375 0.2421875 -vt 0.3515625 0.2421875 -vt 0.640625 0.5390625 -vt 0.7578125 0.53125 -vt 0.7578125 0.5390625 -vt 0.359375 0.2421875 -vt 0.3671875 0.359375 -vt 0.359375 0.359375 -vt 0.7578125 0.515625 -vt 0.640625 0.5234375 -vt 0.640625 0.515625 -vt 0.328125 0.09375 -vt 0.3359375 0.1015625 -vt 0.328125 0.1015625 -vt 0.90625 0.671875 -vt 0.8984375 0.6640625 -vt 0.90625 0.6640625 -vt 0.3828125 0.359375 -vt 0.375 0.2421875 -vt 0.3828125 0.2421875 -vt 0.640625 0.5078125 -vt 0.7578125 0.5 -vt 0.7578125 0.5078125 -vt 0.640625 0.25 -vt 0.6484375 0.3671875 -vt 0.640625 0.3671875 -vt 0.7578125 0.484375 -vt 0.640625 0.4921875 -vt 0.640625 0.484375 -vt 0.34375 0.09375 -vt 0.3515625 0.1015625 -vt 0.34375 0.1015625 -vt 0.90625 0.65625 -vt 0.8984375 0.6484375 -vt 0.90625 0.6484375 -vt 0.4921875 0.3515625 -vt 0.484375 0.234375 -vt 0.4921875 0.234375 -vt 0.640625 0.4765625 -vt 0.7578125 0.46875 -vt 0.7578125 0.4765625 -vt 0.65625 0.25 -vt 0.6640625 0.3671875 -vt 0.65625 0.3671875 -vt 0.7890625 0.359375 -vt 0.671875 0.3671875 -vt 0.671875 0.359375 -vt 0.359375 0.09375 -vt 0.3671875 0.1015625 -vt 0.359375 0.1015625 -vt 0.90625 0.640625 -vt 0.8984375 0.6328125 -vt 0.90625 0.6328125 -vt 0.6796875 0.3515625 -vt 0.671875 0.234375 -vt 0.6796875 0.234375 -vt 0.6796875 1 -vt 0.796875 0.9921875 -vt 0.796875 1 -vt 0.5 0.203125 -vt 0.5078125 0.3203125 -vt 0.5 0.3203125 -vt 0.796875 0.9765625 -vt 0.6796875 0.984375 -vt 0.6796875 0.9765625 -vt 0.375 0.09375 -vt 0.3828125 0.1015625 -vt 0.375 0.1015625 -vt 0.90625 0.59375 -vt 0.8984375 0.5859375 -vt 0.90625 0.5859375 -vt 0.5234375 0.3203125 -vt 0.515625 0.203125 -vt 0.5234375 0.203125 -vt 0.6796875 0.96875 -vt 0.796875 0.9609375 -vt 0.796875 0.96875 -vt 0.53125 0.203125 -vt 0.5390625 0.3203125 -vt 0.53125 0.3203125 -vt 0.796875 0.9453125 -vt 0.6796875 0.953125 -vt 0.6796875 0.9453125 -vt 0.8984375 0.5703125 -vt 0.90625 0.578125 -vt 0.8984375 0.578125 -vt 0.90625 0.5625 -vt 0.8984375 0.5546875 -vt 0.90625 0.5546875 -vt 0.5546875 0.3203125 -vt 0.546875 0.203125 -vt 0.5546875 0.203125 -vt 0.6796875 0.9375 -vt 0.796875 0.9296875 -vt 0.796875 0.9375 -vt 0.5625 0.203125 -vt 0.5703125 0.3203125 -vt 0.5625 0.3203125 -vt 0.796875 0.9140625 -vt 0.6796875 0.921875 -vt 0.6796875 0.9140625 -vt 0.8984375 0.5390625 -vt 0.90625 0.546875 -vt 0.8984375 0.546875 -vt 0.4765625 0.1015625 -vt 0.46875 0.09375 -vt 0.4765625 0.09375 -vt 0.5078125 0.1953125 -vt 0.5 0.0859375 -vt 0.5078125 0.0859375 -vt 0.390625 0.6640625 -vt 0.5 0.6484375 -vt 0.5 0.6640625 -vt 0.515625 0.0859375 -vt 0.5234375 0.1953125 -vt 0.515625 0.1953125 -vt 0.5 0.625 -vt 0.390625 0.640625 -vt 0.390625 0.625 -vt 0.109375 0.109375 -vt 0.1171875 0.125 -vt 0.109375 0.125 -vt 0.4765625 0.125 -vt 0.46875 0.109375 -vt 0.4765625 0.109375 -vt 0.5390625 0.1953125 -vt 0.53125 0.0859375 -vt 0.5390625 0.0859375 -vt 0.8046875 0.984375 -vt 0.9140625 0.9765625 -vt 0.9140625 0.984375 -vt 0.546875 0.0859375 -vt 0.5546875 0.1953125 -vt 0.546875 0.1953125 -vt 0.9140625 0.9609375 -vt 0.8046875 0.96875 -vt 0.8046875 0.9609375 -vt 0.8984375 0.5234375 -vt 0.90625 0.53125 -vt 0.8984375 0.53125 -vt 0.90625 0.515625 -vt 0.8984375 0.5078125 -vt 0.90625 0.5078125 -vt 0.5703125 0.1953125 -vt 0.5625 0.0859375 -vt 0.5703125 0.0859375 -vt 0.8046875 0.953125 -vt 0.9140625 0.9453125 -vt 0.9140625 0.953125 -vt 0.703125 0.0859375 -vt 0.7109375 0.1953125 -vt 0.703125 0.1953125 -vt 0.9140625 0.9296875 -vt 0.8046875 0.9375 -vt 0.8046875 0.9296875 -vt 0.8984375 0.4921875 -vt 0.90625 0.5 -vt 0.8984375 0.5 -vt 0.90625 0.484375 -vt 0.8984375 0.4765625 -vt 0.90625 0.4765625 -vt 0.7265625 0.1953125 -vt 0.71875 0.0859375 -vt 0.7265625 0.0859375 -vt 0.8046875 0.921875 -vt 0.9140625 0.9140625 -vt 0.9140625 0.921875 -vt 0.8125 0.1171875 -vt 0.8203125 0.2265625 -vt 0.8125 0.2265625 -vt 0.9375 0.8671875 -vt 0.828125 0.875 -vt 0.828125 0.8671875 -vt 0.8984375 0.4609375 -vt 0.90625 0.46875 -vt 0.8984375 0.46875 -vt 0.6171875 0.1015625 -vt 0.609375 0.09375 -vt 0.6171875 0.09375 -vt 0.5859375 0.1796875 -vt 0.578125 0.0703125 -vt 0.5859375 0.0703125 -vt 0.828125 0.859375 -vt 0.9375 0.8515625 -vt 0.9375 0.859375 -vt 0.59375 0.0703125 -vt 0.6015625 0.1796875 -vt 0.59375 0.1796875 -vt 0.9375 0.8359375 -vt 0.828125 0.84375 -vt 0.828125 0.8359375 -vt 0.625 0.09375 -vt 0.6328125 0.1015625 -vt 0.625 0.1015625 -vt 0.90625 0.3046875 -vt 0.8984375 0.296875 -vt 0.90625 0.296875 -vt 0.1328125 0.171875 -vt 0.125 0.0625 -vt 0.1328125 0.0625 -vt 0.828125 0.828125 -vt 0.9375 0.8203125 -vt 0.9375 0.828125 -vt 0.140625 0.0625 -vt 0.1484375 0.171875 -vt 0.140625 0.171875 -vt 0.9375 0.8046875 -vt 0.828125 0.8125 -vt 0.828125 0.8046875 -vt 0.8984375 0.25 -vt 0.90625 0.2578125 -vt 0.8984375 0.2578125 -vt 0.7578125 0.1015625 -vt 0.75 0.09375 -vt 0.7578125 0.09375 -vt 0.1640625 0.171875 -vt 0.15625 0.0625 -vt 0.1640625 0.0625 -vt 0.828125 0.796875 -vt 0.9375 0.7890625 -vt 0.9375 0.796875 -vt 0.390625 0.0625 -vt 0.3984375 0.171875 -vt 0.390625 0.171875 -vt 0.9375 0.7734375 -vt 0.828125 0.78125 -vt 0.828125 0.7734375 -vt 0.8984375 0.234375 -vt 0.90625 0.2421875 -vt 0.8984375 0.2421875 -vt 0.7734375 0.1015625 -vt 0.765625 0.09375 -vt 0.7734375 0.09375 -vt 0.4140625 0.171875 -vt 0.40625 0.0625 -vt 0.4140625 0.0625 -vt 0.828125 0.765625 -vt 0.9375 0.7578125 -vt 0.9375 0.765625 -vt 0.421875 0.0625 -vt 0.4296875 0.171875 -vt 0.421875 0.171875 -vt 0.9375 0.4375 -vt 0.828125 0.4453125 -vt 0.828125 0.4375 -vt 0.8984375 0.21875 -vt 0.90625 0.2265625 -vt 0.8984375 0.2265625 -vt 0.90625 0.2109375 -vt 0.8984375 0.203125 -vt 0.90625 0.203125 -vt 0.4453125 0.171875 -vt 0.4375 0.0625 -vt 0.4453125 0.0625 -vt 0.828125 0.3515625 -vt 0.9375 0.34375 -vt 0.9375 0.3515625 -vt 0.453125 0.0625 -vt 0.4609375 0.171875 -vt 0.453125 0.171875 -vt 0.9375 0.328125 -vt 0.828125 0.3359375 -vt 0.828125 0.328125 -vt 0.8984375 0.1875 -vt 0.90625 0.1953125 -vt 0.8984375 0.1953125 -vt 0.90625 0.1796875 -vt 0.8984375 0.171875 -vt 0.90625 0.171875 -vt 0.8359375 0.2265625 -vt 0.828125 0.1171875 -vt 0.8359375 0.1171875 -vt 0.8359375 0.90625 -vt 0.9453125 0.8984375 -vt 0.9453125 0.90625 -vt 0.84375 0.1171875 -vt 0.8515625 0.2265625 -vt 0.84375 0.2265625 -vt 0.9453125 0.8828125 -vt 0.8359375 0.890625 -vt 0.8359375 0.8828125 -vt 0.8984375 0.15625 -vt 0.90625 0.1640625 -vt 0.8984375 0.1640625 -vt 0.90625 0.1484375 -vt 0.8984375 0.140625 -vt 0.90625 0.140625 -vt 0.0078125 0.1484375 -vt 0 0.0390625 -vt 0.0078125 0.0390625 -vt 0.859375 0.625 -vt 0.96875 0.6171875 -vt 0.96875 0.625 -vt 0.015625 0.0390625 -vt 0.0234375 0.1484375 -vt 0.015625 0.1484375 -vt 0.96875 0.421875 -vt 0.859375 0.4296875 -vt 0.859375 0.421875 -vt 0.859375 0.09375 -vt 0.8671875 0.1015625 -vt 0.859375 0.1015625 -vt 0.90625 0.1328125 -vt 0.8984375 0.125 -vt 0.90625 0.125 -vt 0.6953125 0.3515625 -vt 0.6875 0.234375 -vt 0.6953125 0.234375 -vt 0.703125 0.875 -vt 0.8203125 0.8671875 -vt 0.8203125 0.875 -vt 0.578125 0.1875 -vt 0.5859375 0.3046875 -vt 0.578125 0.3046875 -vt 0.8203125 0.8515625 -vt 0.703125 0.859375 -vt 0.703125 0.8515625 -vt 0.875 0.09375 -vt 0.8828125 0.1015625 -vt 0.875 0.1015625 -vt 0.8984375 0.1015625 -vt 0.890625 0.09375 -vt 0.8984375 0.09375 -vt 0.6015625 0.3046875 -vt 0.59375 0.1875 -vt 0.6015625 0.1875 -vt 0.703125 0.84375 -vt 0.8203125 0.8359375 -vt 0.8203125 0.84375 -vt 0.125 0.1796875 -vt 0.1328125 0.296875 -vt 0.125 0.296875 -vt 0.8203125 0.8203125 -vt 0.703125 0.828125 -vt 0.703125 0.8203125 -vt 0.171875 0.0859375 -vt 0.1796875 0.09375 -vt 0.171875 0.09375 -vt 0.1953125 0.09375 -vt 0.1875 0.0859375 -vt 0.1953125 0.0859375 -vt 0.1484375 0.296875 -vt 0.140625 0.1796875 -vt 0.1484375 0.1796875 -vt 0.703125 0.8125 -vt 0.8203125 0.8046875 -vt 0.8203125 0.8125 -vt 0.15625 0.1796875 -vt 0.1640625 0.296875 -vt 0.15625 0.296875 -vt 0.8203125 0.7890625 -vt 0.703125 0.796875 -vt 0.703125 0.7890625 -vt 0.90625 0.6015625 -vt 0.9140625 0.609375 -vt 0.90625 0.609375 -vt 0.4921875 0.09375 -vt 0.484375 0.0859375 -vt 0.4921875 0.0859375 -vt 0.3984375 0.296875 -vt 0.390625 0.1796875 -vt 0.3984375 0.1796875 -vt 0.703125 0.78125 -vt 0.8203125 0.7734375 -vt 0.8203125 0.78125 -vt 0.40625 0.1796875 -vt 0.4140625 0.296875 -vt 0.40625 0.296875 -vt 0.8203125 0.7578125 -vt 0.703125 0.765625 -vt 0.703125 0.7578125 -vt 0.640625 0.0859375 -vt 0.6484375 0.09375 -vt 0.640625 0.09375 -vt 0.6640625 0.09375 -vt 0.65625 0.0859375 -vt 0.6640625 0.0859375 -vt 0.4296875 0.296875 -vt 0.421875 0.1796875 -vt 0.4296875 0.1796875 -vt 0.703125 0.4453125 -vt 0.8203125 0.4375 -vt 0.8203125 0.4453125 -vt 0.4375 0.1796875 -vt 0.4453125 0.296875 -vt 0.4375 0.296875 -vt 0.8203125 0.34375 -vt 0.703125 0.3515625 -vt 0.703125 0.34375 -vt 0.671875 0.0859375 -vt 0.6796875 0.09375 -vt 0.671875 0.09375 -vt 0.6953125 0.09375 -vt 0.6875 0.0859375 -vt 0.6953125 0.0859375 -vt 0.4609375 0.296875 -vt 0.453125 0.1796875 -vt 0.4609375 0.1796875 -vt 0.703125 0.3359375 -vt 0.8203125 0.328125 -vt 0.8203125 0.3359375 -vt 0.703125 0.203125 -vt 0.7109375 0.3203125 -vt 0.703125 0.3203125 -vt 0.828125 0.8984375 -vt 0.7109375 0.90625 -vt 0.7109375 0.8984375 -vt 0.90625 0.28125 -vt 0.9140625 0.2890625 -vt 0.90625 0.2890625 -vt 0.9140625 0.2734375 -vt 0.90625 0.265625 -vt 0.9140625 0.265625 -vt 0.7265625 0.3203125 -vt 0.71875 0.203125 -vt 0.7265625 0.203125 -vt 0.7109375 0.890625 -vt 0.828125 0.8828125 -vt 0.828125 0.890625 -vt 0 0.15625 -vt 0.0078125 0.2734375 -vt 0 0.2734375 -vt 0.8515625 0.6171875 -vt 0.734375 0.625 -vt 0.734375 0.6171875 -vt 0.734375 0.0859375 -vt 0.7421875 0.09375 -vt 0.734375 0.09375 -vt 0.7890625 0.09375 -vt 0.78125 0.0859375 -vt 0.7890625 0.0859375 -vt 0.0234375 0.2734375 -vt 0.015625 0.15625 -vt 0.0234375 0.15625 -vt 0.734375 0.4296875 -vt 0.8515625 0.421875 -vt 0.8515625 0.4296875 -vt 0.03125 0.15625 -vt 0.0390625 0.2734375 -vt 0.03125 0.2734375 -vt 0.8515625 0.40625 -vt 0.734375 0.4140625 -vt 0.734375 0.40625 -vt 0.796875 0.0859375 -vt 0.8046875 0.09375 -vt 0.796875 0.09375 -vt 0.8203125 0.09375 -vt 0.8125 0.0859375 -vt 0.8203125 0.0859375 -vt 0.0546875 0.2734375 -vt 0.046875 0.15625 -vt 0.0546875 0.15625 -vt 0.734375 0.3984375 -vt 0.8515625 0.390625 -vt 0.8515625 0.3984375 -vt 0.0625 0.15625 -vt 0.0703125 0.2734375 -vt 0.0625 0.2734375 -vt 0.8515625 0.375 -vt 0.734375 0.3828125 -vt 0.734375 0.375 -vt 0.828125 0.0859375 -vt 0.8359375 0.09375 -vt 0.828125 0.09375 -vt 0.8515625 0.09375 -vt 0.84375 0.0859375 -vt 0.8515625 0.0859375 -vt 0.0859375 0.2734375 -vt 0.078125 0.15625 -vt 0.0859375 0.15625 -vt 0.734375 0.3203125 -vt 0.8515625 0.3125 -vt 0.8515625 0.3203125 -vt 0.09375 0.15625 -vt 0.1015625 0.2734375 -vt 0.09375 0.2734375 -vt 0.8515625 0.296875 -vt 0.734375 0.3046875 -vt 0.734375 0.296875 -vt 0.90625 0.109375 -vt 0.9140625 0.1171875 -vt 0.90625 0.1171875 -vt 0.9140625 0.1015625 -vt 0.90625 0.09375 -vt 0.9140625 0.09375 -vt 0.1171875 0.2734375 -vt 0.109375 0.15625 -vt 0.1171875 0.15625 -vt 0.734375 0.2890625 -vt 0.8515625 0.28125 -vt 0.8515625 0.2890625 -vt 0.171875 0.15625 -vt 0.1796875 0.2734375 -vt 0.171875 0.2734375 -vt 0.8515625 0.265625 -vt 0.734375 0.2734375 -vt 0.734375 0.265625 -vt 0.0625 0.078125 -vt 0.0703125 0.0859375 -vt 0.0625 0.0859375 -vt 0.0859375 0.0859375 -vt 0.078125 0.078125 -vt 0.0859375 0.078125 -vt 0.1953125 0.2734375 -vt 0.1875 0.15625 -vt 0.1953125 0.15625 -vt 0.390625 0.7578125 -vt 0.5078125 0.7421875 -vt 0.5078125 0.7578125 -vt 0.734375 0.140625 -vt 0.7421875 0.2578125 -vt 0.734375 0.2578125 -vt 0.5078125 0.71875 -vt 0.390625 0.734375 -vt 0.390625 0.71875 -vt 0.609375 0.109375 -vt 0.6171875 0.125 -vt 0.609375 0.125 -vt 0.6328125 0.125 -vt 0.625 0.109375 -vt 0.6328125 0.109375 -vt 0.0390625 0.1484375 -vt 0.03125 0.0390625 -vt 0.0390625 0.0390625 -vt 0.859375 0.4140625 -vt 0.96875 0.40625 -vt 0.96875 0.4140625 -vt 0.046875 0.0390625 -vt 0.0546875 0.1484375 -vt 0.046875 0.1484375 -vt 0.96875 0.390625 -vt 0.859375 0.3984375 -vt 0.859375 0.390625 -vt 0.09375 0.078125 -vt 0.1015625 0.0859375 -vt 0.09375 0.0859375 -vt 0.1171875 0.0859375 -vt 0.109375 0.078125 -vt 0.1171875 0.078125 -vt 0.4765625 0.3671875 -vt 0.46875 0.3671875 -vt 0.46875 0.25 -vt 0.390625 0.8046875 -vt 0.390625 0.7890625 -vt 0.5078125 0.7890625 -vt 0.609375 0.25 -vt 0.6171875 0.25 -vt 0.6171875 0.3671875 -vt 0.5078125 0.765625 -vt 0.5078125 0.78125 -vt 0.390625 0.78125 -vt 0.8671875 0.453125 -vt 0.875 0.453125 -vt 0.875 0.46875 -vt 0.7421875 0.1328125 -vt 0.734375 0.1328125 -vt 0.734375 0.1171875 -vt 0.8828125 0.609375 -vt 0.8671875 0.609375 -vt 0.8671875 0.6015625 -vt 0.0625 0.59375 -vt 0.0625 0.40625 -vt 0.0703125 0.40625 -vt 0.859375 0.125 -vt 0.875 0.125 -vt 0.875 0.1328125 -vt 0.078125 0.59375 -vt 0.078125 0.40625 -vt 0.0859375 0.58203125 -vt 0.078125 0.40625 -vt 0.0859375 0.40625 -vt 0.0859375 0.58203125 -vt 0.25 0.6796875 -vt 0.25 0.4921875 -vt 0.265625 0.4921875 -vt 0.2734375 0.4921875 -vt 0.2890625 0.4921875 -vt 0.2734375 0.66796875 -vt 0.2890625 0.4921875 -vt 0.2890625 0.6796875 -vt 0.2734375 0.66796875 -vt 0.890625 0.71875 -vt 0.875 0.71875 -vt 0.875 0.7109375 -vt 0.09375 0.59375 -vt 0.09375 0.40625 -vt 0.1015625 0.40625 -vt 0.875 0.6953125 -vt 0.890625 0.6953125 -vt 0.890625 0.703125 -vt 0.109375 0.59375 -vt 0.109375 0.40625 -vt 0.1171875 0.58203125 -vt 0.109375 0.40625 -vt 0.1171875 0.40625 -vt 0.1171875 0.58203125 -vt 0.296875 0.6796875 -vt 0.296875 0.4921875 -vt 0.3125 0.4921875 -vt 0.3203125 0.4921875 -vt 0.3359375 0.4921875 -vt 0.3203125 0.66796875 -vt 0.3359375 0.4921875 -vt 0.3359375 0.6796875 -vt 0.3203125 0.66796875 -vt 0.890625 0.6875 -vt 0.875 0.6875 -vt 0.875 0.6796875 -vt 0.40625 0.6171875 -vt 0.40625 0.4296875 -vt 0.4140625 0.4296875 -vt 0.875 0.6640625 -vt 0.890625 0.6640625 -vt 0.890625 0.671875 -vt 0.421875 0.6171875 -vt 0.421875 0.4296875 -vt 0.4296875 0.44140625 -vt 0.421875 0.4296875 -vt 0.4296875 0.4296875 -vt 0.4296875 0.44140625 -vt 0.34375 0.875 -vt 0.34375 0.6875 -vt 0.359375 0.6875 -vt 0.34375 0.4921875 -vt 0.359375 0.4921875 -vt 0.34375 0.50390625 -vt 0.359375 0.4921875 -vt 0.359375 0.6796875 -vt 0.34375 0.50390625 -vt 0.6328125 0.3671875 -vt 0.625 0.3671875 -vt 0.625 0.25 -vt 0.6328125 0.703125 -vt 0.6328125 0.6953125 -vt 0.75 0.6953125 -vt 0.203125 0.2421875 -vt 0.2109375 0.2421875 -vt 0.2109375 0.359375 -vt 0.75 0.6796875 -vt 0.75 0.6875 -vt 0.6328125 0.6875 -vt 0.25 0.09375 -vt 0.2578125 0.09375 -vt 0.2578125 0.1015625 -vt 0.90625 0.75 -vt 0.8984375 0.75 -vt 0.8984375 0.7421875 -vt 0.890625 0.65625 -vt 0.875 0.65625 -vt 0.875 0.6484375 -vt 0.4375 0.6171875 -vt 0.4375 0.4296875 -vt 0.4453125 0.4296875 -vt 0.875 0.6328125 -vt 0.890625 0.6328125 -vt 0.890625 0.640625 -vt 0.453125 0.6171875 -vt 0.453125 0.4296875 -vt 0.4609375 0.44140625 -vt 0.453125 0.4296875 -vt 0.4609375 0.4296875 -vt 0.4609375 0.44140625 -vt 0.3671875 0.875 -vt 0.3671875 0.6875 -vt 0.3828125 0.6875 -vt 0.3671875 0.4921875 -vt 0.3828125 0.4921875 -vt 0.3671875 0.50390625 -vt 0.3828125 0.4921875 -vt 0.3828125 0.6796875 -vt 0.3671875 0.50390625 -vt 0.2265625 0.359375 -vt 0.21875 0.359375 -vt 0.21875 0.2421875 -vt 0.6328125 0.671875 -vt 0.6328125 0.6640625 -vt 0.75 0.6640625 -vt 0.234375 0.2421875 -vt 0.2421875 0.2421875 -vt 0.2421875 0.359375 -vt 0.75 0.6484375 -vt 0.75 0.65625 -vt 0.6328125 0.65625 -vt 0.265625 0.09375 -vt 0.2734375 0.09375 -vt 0.2734375 0.1015625 -vt 0.90625 0.734375 -vt 0.8984375 0.734375 -vt 0.8984375 0.7265625 -vt 0.2578125 0.359375 -vt 0.25 0.359375 -vt 0.25 0.2421875 -vt 0.6328125 0.640625 -vt 0.6328125 0.6328125 -vt 0.75 0.6328125 -vt 0.265625 0.2421875 -vt 0.2734375 0.2421875 -vt 0.2734375 0.359375 -vt 0.7578125 0.7421875 -vt 0.7578125 0.75 -vt 0.640625 0.75 -vt 0.28125 0.09375 -vt 0.2890625 0.09375 -vt 0.2890625 0.1015625 -vt 0.90625 0.71875 -vt 0.8984375 0.71875 -vt 0.8984375 0.7109375 -vt 0.2890625 0.359375 -vt 0.28125 0.359375 -vt 0.28125 0.2421875 -vt 0.640625 0.734375 -vt 0.640625 0.7265625 -vt 0.7578125 0.7265625 -vt 0.296875 0.2421875 -vt 0.3046875 0.2421875 -vt 0.3046875 0.359375 -vt 0.7578125 0.578125 -vt 0.7578125 0.5859375 -vt 0.640625 0.5859375 -vt 0.296875 0.09375 -vt 0.3046875 0.09375 -vt 0.3046875 0.1015625 -vt 0.90625 0.703125 -vt 0.8984375 0.703125 -vt 0.8984375 0.6953125 -vt 0.3203125 0.359375 -vt 0.3125 0.359375 -vt 0.3125 0.2421875 -vt 0.640625 0.5703125 -vt 0.640625 0.5625 -vt 0.7578125 0.5625 -vt 0.328125 0.2421875 -vt 0.3359375 0.2421875 -vt 0.3359375 0.359375 -vt 0.7578125 0.546875 -vt 0.7578125 0.5546875 -vt 0.640625 0.5546875 -vt 0.3125 0.09375 -vt 0.3203125 0.09375 -vt 0.3203125 0.1015625 -vt 0.90625 0.6875 -vt 0.8984375 0.6875 -vt 0.8984375 0.6796875 -vt 0.3515625 0.359375 -vt 0.34375 0.359375 -vt 0.34375 0.2421875 -vt 0.640625 0.5390625 -vt 0.640625 0.53125 -vt 0.7578125 0.53125 -vt 0.359375 0.2421875 -vt 0.3671875 0.2421875 -vt 0.3671875 0.359375 -vt 0.7578125 0.515625 -vt 0.7578125 0.5234375 -vt 0.640625 0.5234375 -vt 0.328125 0.09375 -vt 0.3359375 0.09375 -vt 0.3359375 0.1015625 -vt 0.90625 0.671875 -vt 0.8984375 0.671875 -vt 0.8984375 0.6640625 -vt 0.3828125 0.359375 -vt 0.375 0.359375 -vt 0.375 0.2421875 -vt 0.640625 0.5078125 -vt 0.640625 0.5 -vt 0.7578125 0.5 -vt 0.640625 0.25 -vt 0.6484375 0.25 -vt 0.6484375 0.3671875 -vt 0.7578125 0.484375 -vt 0.7578125 0.4921875 -vt 0.640625 0.4921875 -vt 0.34375 0.09375 -vt 0.3515625 0.09375 -vt 0.3515625 0.1015625 -vt 0.90625 0.65625 -vt 0.8984375 0.65625 -vt 0.8984375 0.6484375 -vt 0.4921875 0.3515625 -vt 0.484375 0.3515625 -vt 0.484375 0.234375 -vt 0.640625 0.4765625 -vt 0.640625 0.46875 -vt 0.7578125 0.46875 -vt 0.65625 0.25 -vt 0.6640625 0.25 -vt 0.6640625 0.3671875 -vt 0.7890625 0.359375 -vt 0.7890625 0.3671875 -vt 0.671875 0.3671875 -vt 0.359375 0.09375 -vt 0.3671875 0.09375 -vt 0.3671875 0.1015625 -vt 0.90625 0.640625 -vt 0.8984375 0.640625 -vt 0.8984375 0.6328125 -vt 0.6796875 0.3515625 -vt 0.671875 0.3515625 -vt 0.671875 0.234375 -vt 0.6796875 1 -vt 0.6796875 0.9921875 -vt 0.796875 0.9921875 -vt 0.5 0.203125 -vt 0.5078125 0.203125 -vt 0.5078125 0.3203125 -vt 0.796875 0.9765625 -vt 0.796875 0.984375 -vt 0.6796875 0.984375 -vt 0.375 0.09375 -vt 0.3828125 0.09375 -vt 0.3828125 0.1015625 -vt 0.90625 0.59375 -vt 0.8984375 0.59375 -vt 0.8984375 0.5859375 -vt 0.5234375 0.3203125 -vt 0.515625 0.3203125 -vt 0.515625 0.203125 -vt 0.6796875 0.96875 -vt 0.6796875 0.9609375 -vt 0.796875 0.9609375 -vt 0.53125 0.203125 -vt 0.5390625 0.203125 -vt 0.5390625 0.3203125 -vt 0.796875 0.9453125 -vt 0.796875 0.953125 -vt 0.6796875 0.953125 -vt 0.8984375 0.5703125 -vt 0.90625 0.5703125 -vt 0.90625 0.578125 -vt 0.90625 0.5625 -vt 0.8984375 0.5625 -vt 0.8984375 0.5546875 -vt 0.5546875 0.3203125 -vt 0.546875 0.3203125 -vt 0.546875 0.203125 -vt 0.6796875 0.9375 -vt 0.6796875 0.9296875 -vt 0.796875 0.9296875 -vt 0.5625 0.203125 -vt 0.5703125 0.203125 -vt 0.5703125 0.3203125 -vt 0.796875 0.9140625 -vt 0.796875 0.921875 -vt 0.6796875 0.921875 -vt 0.8984375 0.5390625 -vt 0.90625 0.5390625 -vt 0.90625 0.546875 -vt 0.4765625 0.1015625 -vt 0.46875 0.1015625 -vt 0.46875 0.09375 -vt 0.5078125 0.1953125 -vt 0.5 0.1953125 -vt 0.5 0.0859375 -vt 0.390625 0.6640625 -vt 0.390625 0.6484375 -vt 0.5 0.6484375 -vt 0.515625 0.0859375 -vt 0.5234375 0.0859375 -vt 0.5234375 0.1953125 -vt 0.5 0.625 -vt 0.5 0.640625 -vt 0.390625 0.640625 -vt 0.109375 0.109375 -vt 0.1171875 0.109375 -vt 0.1171875 0.125 -vt 0.4765625 0.125 -vt 0.46875 0.125 -vt 0.46875 0.109375 -vt 0.5390625 0.1953125 -vt 0.53125 0.1953125 -vt 0.53125 0.0859375 -vt 0.8046875 0.984375 -vt 0.8046875 0.9765625 -vt 0.9140625 0.9765625 -vt 0.546875 0.0859375 -vt 0.5546875 0.0859375 -vt 0.5546875 0.1953125 -vt 0.9140625 0.9609375 -vt 0.9140625 0.96875 -vt 0.8046875 0.96875 -vt 0.8984375 0.5234375 -vt 0.90625 0.5234375 -vt 0.90625 0.53125 -vt 0.90625 0.515625 -vt 0.8984375 0.515625 -vt 0.8984375 0.5078125 -vt 0.5703125 0.1953125 -vt 0.5625 0.1953125 -vt 0.5625 0.0859375 -vt 0.8046875 0.953125 -vt 0.8046875 0.9453125 -vt 0.9140625 0.9453125 -vt 0.703125 0.0859375 -vt 0.7109375 0.0859375 -vt 0.7109375 0.1953125 -vt 0.9140625 0.9296875 -vt 0.9140625 0.9375 -vt 0.8046875 0.9375 -vt 0.8984375 0.4921875 -vt 0.90625 0.4921875 -vt 0.90625 0.5 -vt 0.90625 0.484375 -vt 0.8984375 0.484375 -vt 0.8984375 0.4765625 -vt 0.7265625 0.1953125 -vt 0.71875 0.1953125 -vt 0.71875 0.0859375 -vt 0.8046875 0.921875 -vt 0.8046875 0.9140625 -vt 0.9140625 0.9140625 -vt 0.8125 0.1171875 -vt 0.8203125 0.1171875 -vt 0.8203125 0.2265625 -vt 0.9375 0.8671875 -vt 0.9375 0.875 -vt 0.828125 0.875 -vt 0.8984375 0.4609375 -vt 0.90625 0.4609375 -vt 0.90625 0.46875 -vt 0.6171875 0.1015625 -vt 0.609375 0.1015625 -vt 0.609375 0.09375 -vt 0.5859375 0.1796875 -vt 0.578125 0.1796875 -vt 0.578125 0.0703125 -vt 0.828125 0.859375 -vt 0.828125 0.8515625 -vt 0.9375 0.8515625 -vt 0.59375 0.0703125 -vt 0.6015625 0.0703125 -vt 0.6015625 0.1796875 -vt 0.9375 0.8359375 -vt 0.9375 0.84375 -vt 0.828125 0.84375 -vt 0.625 0.09375 -vt 0.6328125 0.09375 -vt 0.6328125 0.1015625 -vt 0.90625 0.3046875 -vt 0.8984375 0.3046875 -vt 0.8984375 0.296875 -vt 0.1328125 0.171875 -vt 0.125 0.171875 -vt 0.125 0.0625 -vt 0.828125 0.828125 -vt 0.828125 0.8203125 -vt 0.9375 0.8203125 -vt 0.140625 0.0625 -vt 0.1484375 0.0625 -vt 0.1484375 0.171875 -vt 0.9375 0.8046875 -vt 0.9375 0.8125 -vt 0.828125 0.8125 -vt 0.8984375 0.25 -vt 0.90625 0.25 -vt 0.90625 0.2578125 -vt 0.7578125 0.1015625 -vt 0.75 0.1015625 -vt 0.75 0.09375 -vt 0.1640625 0.171875 -vt 0.15625 0.171875 -vt 0.15625 0.0625 -vt 0.828125 0.796875 -vt 0.828125 0.7890625 -vt 0.9375 0.7890625 -vt 0.390625 0.0625 -vt 0.3984375 0.0625 -vt 0.3984375 0.171875 -vt 0.9375 0.7734375 -vt 0.9375 0.78125 -vt 0.828125 0.78125 -vt 0.8984375 0.234375 -vt 0.90625 0.234375 -vt 0.90625 0.2421875 -vt 0.7734375 0.1015625 -vt 0.765625 0.1015625 -vt 0.765625 0.09375 -vt 0.4140625 0.171875 -vt 0.40625 0.171875 -vt 0.40625 0.0625 -vt 0.828125 0.765625 -vt 0.828125 0.7578125 -vt 0.9375 0.7578125 -vt 0.421875 0.0625 -vt 0.4296875 0.0625 -vt 0.4296875 0.171875 -vt 0.9375 0.4375 -vt 0.9375 0.4453125 -vt 0.828125 0.4453125 -vt 0.8984375 0.21875 -vt 0.90625 0.21875 -vt 0.90625 0.2265625 -vt 0.90625 0.2109375 -vt 0.8984375 0.2109375 -vt 0.8984375 0.203125 -vt 0.4453125 0.171875 -vt 0.4375 0.171875 -vt 0.4375 0.0625 -vt 0.828125 0.3515625 -vt 0.828125 0.34375 -vt 0.9375 0.34375 -vt 0.453125 0.0625 -vt 0.4609375 0.0625 -vt 0.4609375 0.171875 -vt 0.9375 0.328125 -vt 0.9375 0.3359375 -vt 0.828125 0.3359375 -vt 0.8984375 0.1875 -vt 0.90625 0.1875 -vt 0.90625 0.1953125 -vt 0.90625 0.1796875 -vt 0.8984375 0.1796875 -vt 0.8984375 0.171875 -vt 0.8359375 0.2265625 -vt 0.828125 0.2265625 -vt 0.828125 0.1171875 -vt 0.8359375 0.90625 -vt 0.8359375 0.8984375 -vt 0.9453125 0.8984375 -vt 0.84375 0.1171875 -vt 0.8515625 0.1171875 -vt 0.8515625 0.2265625 -vt 0.9453125 0.8828125 -vt 0.9453125 0.890625 -vt 0.8359375 0.890625 -vt 0.8984375 0.15625 -vt 0.90625 0.15625 -vt 0.90625 0.1640625 -vt 0.90625 0.1484375 -vt 0.8984375 0.1484375 -vt 0.8984375 0.140625 -vt 0.0078125 0.1484375 -vt 0 0.1484375 -vt 0 0.0390625 -vt 0.859375 0.625 -vt 0.859375 0.6171875 -vt 0.96875 0.6171875 -vt 0.015625 0.0390625 -vt 0.0234375 0.0390625 -vt 0.0234375 0.1484375 -vt 0.96875 0.421875 -vt 0.96875 0.4296875 -vt 0.859375 0.4296875 -vt 0.859375 0.09375 -vt 0.8671875 0.09375 -vt 0.8671875 0.1015625 -vt 0.90625 0.1328125 -vt 0.8984375 0.1328125 -vt 0.8984375 0.125 -vt 0.6953125 0.3515625 -vt 0.6875 0.3515625 -vt 0.6875 0.234375 -vt 0.703125 0.875 -vt 0.703125 0.8671875 -vt 0.8203125 0.8671875 -vt 0.578125 0.1875 -vt 0.5859375 0.1875 -vt 0.5859375 0.3046875 -vt 0.8203125 0.8515625 -vt 0.8203125 0.859375 -vt 0.703125 0.859375 -vt 0.875 0.09375 -vt 0.8828125 0.09375 -vt 0.8828125 0.1015625 -vt 0.8984375 0.1015625 -vt 0.890625 0.1015625 -vt 0.890625 0.09375 -vt 0.6015625 0.3046875 -vt 0.59375 0.3046875 -vt 0.59375 0.1875 -vt 0.703125 0.84375 -vt 0.703125 0.8359375 -vt 0.8203125 0.8359375 -vt 0.125 0.1796875 -vt 0.1328125 0.1796875 -vt 0.1328125 0.296875 -vt 0.8203125 0.8203125 -vt 0.8203125 0.828125 -vt 0.703125 0.828125 -vt 0.171875 0.0859375 -vt 0.1796875 0.0859375 -vt 0.1796875 0.09375 -vt 0.1953125 0.09375 -vt 0.1875 0.09375 -vt 0.1875 0.0859375 -vt 0.1484375 0.296875 -vt 0.140625 0.296875 -vt 0.140625 0.1796875 -vt 0.703125 0.8125 -vt 0.703125 0.8046875 -vt 0.8203125 0.8046875 -vt 0.15625 0.1796875 -vt 0.1640625 0.1796875 -vt 0.1640625 0.296875 -vt 0.8203125 0.7890625 -vt 0.8203125 0.796875 -vt 0.703125 0.796875 -vt 0.90625 0.6015625 -vt 0.9140625 0.6015625 -vt 0.9140625 0.609375 -vt 0.4921875 0.09375 -vt 0.484375 0.09375 -vt 0.484375 0.0859375 -vt 0.3984375 0.296875 -vt 0.390625 0.296875 -vt 0.390625 0.1796875 -vt 0.703125 0.78125 -vt 0.703125 0.7734375 -vt 0.8203125 0.7734375 -vt 0.40625 0.1796875 -vt 0.4140625 0.1796875 -vt 0.4140625 0.296875 -vt 0.8203125 0.7578125 -vt 0.8203125 0.765625 -vt 0.703125 0.765625 -vt 0.640625 0.0859375 -vt 0.6484375 0.0859375 -vt 0.6484375 0.09375 -vt 0.6640625 0.09375 -vt 0.65625 0.09375 -vt 0.65625 0.0859375 -vt 0.4296875 0.296875 -vt 0.421875 0.296875 -vt 0.421875 0.1796875 -vt 0.703125 0.4453125 -vt 0.703125 0.4375 -vt 0.8203125 0.4375 -vt 0.4375 0.1796875 -vt 0.4453125 0.1796875 -vt 0.4453125 0.296875 -vt 0.8203125 0.34375 -vt 0.8203125 0.3515625 -vt 0.703125 0.3515625 -vt 0.671875 0.0859375 -vt 0.6796875 0.0859375 -vt 0.6796875 0.09375 -vt 0.6953125 0.09375 -vt 0.6875 0.09375 -vt 0.6875 0.0859375 -vt 0.4609375 0.296875 -vt 0.453125 0.296875 -vt 0.453125 0.1796875 -vt 0.703125 0.3359375 -vt 0.703125 0.328125 -vt 0.8203125 0.328125 -vt 0.703125 0.203125 -vt 0.7109375 0.203125 -vt 0.7109375 0.3203125 -vt 0.828125 0.8984375 -vt 0.828125 0.90625 -vt 0.7109375 0.90625 -vt 0.90625 0.28125 -vt 0.9140625 0.28125 -vt 0.9140625 0.2890625 -vt 0.9140625 0.2734375 -vt 0.90625 0.2734375 -vt 0.90625 0.265625 -vt 0.7265625 0.3203125 -vt 0.71875 0.3203125 -vt 0.71875 0.203125 -vt 0.7109375 0.890625 -vt 0.7109375 0.8828125 -vt 0.828125 0.8828125 -vt 0 0.15625 -vt 0.0078125 0.15625 -vt 0.0078125 0.2734375 -vt 0.8515625 0.6171875 -vt 0.8515625 0.625 -vt 0.734375 0.625 -vt 0.734375 0.0859375 -vt 0.7421875 0.0859375 -vt 0.7421875 0.09375 -vt 0.7890625 0.09375 -vt 0.78125 0.09375 -vt 0.78125 0.0859375 -vt 0.0234375 0.2734375 -vt 0.015625 0.2734375 -vt 0.015625 0.15625 -vt 0.734375 0.4296875 -vt 0.734375 0.421875 -vt 0.8515625 0.421875 -vt 0.03125 0.15625 -vt 0.0390625 0.15625 -vt 0.0390625 0.2734375 -vt 0.8515625 0.40625 -vt 0.8515625 0.4140625 -vt 0.734375 0.4140625 -vt 0.796875 0.0859375 -vt 0.8046875 0.0859375 -vt 0.8046875 0.09375 -vt 0.8203125 0.09375 -vt 0.8125 0.09375 -vt 0.8125 0.0859375 -vt 0.0546875 0.2734375 -vt 0.046875 0.2734375 -vt 0.046875 0.15625 -vt 0.734375 0.3984375 -vt 0.734375 0.390625 -vt 0.8515625 0.390625 -vt 0.0625 0.15625 -vt 0.0703125 0.15625 -vt 0.0703125 0.2734375 -vt 0.8515625 0.375 -vt 0.8515625 0.3828125 -vt 0.734375 0.3828125 -vt 0.828125 0.0859375 -vt 0.8359375 0.0859375 -vt 0.8359375 0.09375 -vt 0.8515625 0.09375 -vt 0.84375 0.09375 -vt 0.84375 0.0859375 -vt 0.0859375 0.2734375 -vt 0.078125 0.2734375 -vt 0.078125 0.15625 -vt 0.734375 0.3203125 -vt 0.734375 0.3125 -vt 0.8515625 0.3125 -vt 0.09375 0.15625 -vt 0.1015625 0.15625 -vt 0.1015625 0.2734375 -vt 0.8515625 0.296875 -vt 0.8515625 0.3046875 -vt 0.734375 0.3046875 -vt 0.90625 0.109375 -vt 0.9140625 0.109375 -vt 0.9140625 0.1171875 -vt 0.9140625 0.1015625 -vt 0.90625 0.1015625 -vt 0.90625 0.09375 -vt 0.1171875 0.2734375 -vt 0.109375 0.2734375 -vt 0.109375 0.15625 -vt 0.734375 0.2890625 -vt 0.734375 0.28125 -vt 0.8515625 0.28125 -vt 0.171875 0.15625 -vt 0.1796875 0.15625 -vt 0.1796875 0.2734375 -vt 0.8515625 0.265625 -vt 0.8515625 0.2734375 -vt 0.734375 0.2734375 -vt 0.0625 0.078125 -vt 0.0703125 0.078125 -vt 0.0703125 0.0859375 -vt 0.0859375 0.0859375 -vt 0.078125 0.0859375 -vt 0.078125 0.078125 -vt 0.1953125 0.2734375 -vt 0.1875 0.2734375 -vt 0.1875 0.15625 -vt 0.390625 0.7578125 -vt 0.390625 0.7421875 -vt 0.5078125 0.7421875 -vt 0.734375 0.140625 -vt 0.7421875 0.140625 -vt 0.7421875 0.2578125 -vt 0.5078125 0.71875 -vt 0.5078125 0.734375 -vt 0.390625 0.734375 -vt 0.609375 0.109375 -vt 0.6171875 0.109375 -vt 0.6171875 0.125 -vt 0.6328125 0.125 -vt 0.625 0.125 -vt 0.625 0.109375 -vt 0.0390625 0.1484375 -vt 0.03125 0.1484375 -vt 0.03125 0.0390625 -vt 0.859375 0.4140625 -vt 0.859375 0.40625 -vt 0.96875 0.40625 -vt 0.046875 0.0390625 -vt 0.0546875 0.0390625 -vt 0.0546875 0.1484375 -vt 0.96875 0.390625 -vt 0.96875 0.3984375 -vt 0.859375 0.3984375 -vt 0.09375 0.078125 -vt 0.1015625 0.078125 -vt 0.1015625 0.0859375 -vt 0.1171875 0.0859375 -vt 0.109375 0.0859375 -vt 0.109375 0.078125 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -usemtl m_5f175e4e-a6a7-9193-e88f-70334c8bfde8 -f 349/1573/525 350/1574/525 351/1575/525 -f 352/1576/526 353/1577/526 350/1578/526 -f 354/1579/527 355/1580/527 353/1581/527 -f 356/1582/528 351/1583/528 355/1584/528 -f 353/1585/529 351/1586/529 350/1587/529 -f 352/1588/530 356/1589/530 354/1590/530 -f 357/1591/531 358/1592/531 359/1593/531 -f 360/1594/532 361/1595/532 358/1596/532 -f 362/1597/533 363/1598/533 361/1599/533 -f 364/1600/534 357/1601/534 359/1602/534 -f 358/1603/535 363/1604/535 359/1605/535 -f 360/1606/536 357/1607/536 364/1608/536 -f 365/1609/537 366/1610/537 367/1611/537 -f 368/1612/538 369/1613/538 366/1614/538 -f 370/1615/539 371/1616/539 369/1617/539 -f 372/1618/540 365/1619/540 367/1620/540 -f 366/1621/541 371/1622/541 367/1623/541 -f 368/1624/542 365/1625/542 372/1626/542 -f 373/1627/543 374/1628/543 375/1629/543 -f 376/1630/544 377/1631/544 374/1632/544 -f 378/1633/545 379/1634/545 377/1635/545 -f 380/1636/546 373/1637/546 375/1638/546 -f 374/1639/547 379/1640/547 375/1641/547 -f 376/1642/548 373/1643/548 380/1644/548 -f 381/1645/549 382/1646/549 383/1647/549 -f 384/1648/550 385/1649/550 382/1650/550 -f 386/1651/551 387/1652/551 385/1653/551 -f 388/1654/552 383/1655/552 387/1656/552 -f 385/1657/553 383/1658/553 382/1659/553 -f 384/1660/554 388/1661/554 386/1662/554 -f 389/1663/555 390/1664/555 391/1665/555 -f 392/1666/556 393/1667/556 390/1668/556 -f 394/1669/557 395/1670/557 393/1671/557 -f 396/1672/558 389/1673/558 391/1674/558 -f 390/1675/559 395/1676/559 391/1677/559 -f 392/1678/560 389/1679/560 396/1680/560 -f 397/1681/561 398/1682/561 399/1683/561 -f 400/1684/562 401/1685/562 398/1686/562 -f 402/1687/563 403/1688/563 401/1689/563 -f 404/1690/564 399/1691/564 403/1692/564 -f 401/1693/565 399/1694/565 398/1695/565 -f 400/1696/566 404/1697/566 402/1698/566 -f 405/1699/567 406/1700/567 407/1701/567 -f 408/1702/568 409/1703/568 406/1704/568 -f 410/1705/569 411/1706/569 409/1707/569 -f 412/1708/570 407/1709/570 411/1710/570 -f 409/1711/571 407/1712/571 406/1713/571 -f 408/1714/572 412/1715/572 410/1716/572 -f 413/1717/573 414/1718/573 415/1719/573 -f 416/1720/574 417/1721/574 414/1722/574 -f 418/1723/575 419/1724/575 417/1725/575 -f 420/1726/576 415/1727/576 419/1728/576 -f 417/1729/577 415/1730/577 414/1731/577 -f 416/1732/578 420/1733/578 418/1734/578 -f 421/1735/579 422/1736/579 423/1737/579 -f 424/1738/580 425/1739/580 422/1740/580 -f 426/1741/581 427/1742/581 425/1743/581 -f 428/1744/582 423/1745/582 427/1746/582 -f 425/1747/583 423/1748/583 422/1749/583 -f 424/1750/584 428/1751/584 426/1752/584 -f 429/1753/585 430/1754/585 431/1755/585 -f 432/1756/586 433/1757/586 430/1758/586 -f 434/1759/587 435/1760/587 433/1761/587 -f 436/1762/588 431/1763/588 435/1764/588 -f 433/1765/589 431/1766/589 430/1767/589 -f 432/1768/590 436/1769/590 434/1770/590 -f 437/1771/591 438/1772/591 439/1773/591 -f 440/1774/592 441/1775/592 438/1776/592 -f 442/1777/593 443/1778/593 441/1779/593 -f 444/1780/594 439/1781/594 443/1782/594 -f 441/1783/595 439/1784/595 438/1785/595 -f 440/1786/596 444/1787/596 442/1788/596 -f 445/1789/597 446/1790/597 447/1791/597 -f 448/1792/598 449/1793/598 446/1794/598 -f 450/1795/599 451/1796/599 449/1797/599 -f 452/1798/600 447/1799/600 451/1800/600 -f 449/1801/601 447/1802/601 446/1803/601 -f 448/1804/602 452/1805/602 450/1806/602 -f 453/1807/603 454/1808/603 455/1809/603 -f 456/1810/604 457/1811/604 454/1812/604 -f 458/1813/605 459/1814/605 457/1815/605 -f 460/1816/606 455/1817/606 459/1818/606 -f 457/1819/607 455/1820/607 454/1821/607 -f 456/1822/608 460/1823/608 458/1824/608 -f 461/1825/609 462/1826/609 463/1827/609 -f 464/1828/610 465/1829/610 462/1830/610 -f 466/1831/611 467/1832/611 465/1833/611 -f 468/1834/612 463/1835/612 467/1836/612 -f 465/1837/613 463/1838/613 462/1839/613 -f 464/1840/614 468/1841/614 466/1842/614 -f 469/1843/615 470/1844/615 471/1845/615 -f 472/1846/616 473/1847/616 470/1848/616 -f 474/1849/617 475/1850/617 473/1851/617 -f 476/1852/618 471/1853/618 475/1854/618 -f 473/1855/619 471/1856/619 470/1857/619 -f 472/1858/620 476/1859/620 474/1860/620 -f 477/1861/621 478/1862/621 479/1863/621 -f 480/1864/622 481/1865/622 478/1866/622 -f 482/1867/623 483/1868/623 481/1869/623 -f 484/1870/624 479/1871/624 483/1872/624 -f 481/1873/625 479/1874/625 478/1875/625 -f 480/1876/626 484/1877/626 482/1878/626 -f 485/1879/627 486/1880/627 487/1881/627 -f 488/1882/628 489/1883/628 486/1884/628 -f 490/1885/629 491/1886/629 489/1887/629 -f 492/1888/630 487/1889/630 491/1890/630 -f 489/1891/631 487/1892/631 486/1893/631 -f 488/1894/632 492/1895/632 490/1896/632 -f 493/1897/633 494/1898/633 495/1899/633 -f 496/1900/634 497/1901/634 494/1902/634 -f 498/1903/635 499/1904/635 497/1905/635 -f 500/1906/636 495/1907/636 499/1908/636 -f 497/1909/637 495/1910/637 494/1911/637 -f 496/1912/638 500/1913/638 498/1914/638 -f 501/1915/639 502/1916/639 503/1917/639 -f 504/1918/640 505/1919/640 502/1920/640 -f 506/1921/641 507/1922/641 505/1923/641 -f 508/1924/642 503/1925/642 507/1926/642 -f 505/1927/643 503/1928/643 502/1929/643 -f 504/1930/644 508/1931/644 506/1932/644 -f 509/1933/645 510/1934/645 511/1935/645 -f 512/1936/646 513/1937/646 510/1938/646 -f 514/1939/647 515/1940/647 513/1941/647 -f 516/1942/648 511/1943/648 515/1944/648 -f 513/1945/649 511/1946/649 510/1947/649 -f 512/1948/650 516/1949/650 514/1950/650 -f 517/1951/651 518/1952/651 519/1953/651 -f 520/1954/652 521/1955/652 518/1956/652 -f 522/1957/653 523/1958/653 521/1959/653 -f 524/1960/654 519/1961/654 523/1962/654 -f 521/1963/655 519/1964/655 518/1965/655 -f 520/1966/656 524/1967/656 522/1968/656 -f 525/1969/657 526/1970/657 527/1971/657 -f 528/1972/658 529/1973/658 526/1974/658 -f 530/1975/659 531/1976/659 529/1977/659 -f 532/1978/660 527/1979/660 531/1980/660 -f 529/1981/661 527/1982/661 526/1983/661 -f 528/1984/662 532/1985/662 530/1986/662 -f 533/1987/663 534/1988/663 535/1989/663 -f 536/1990/664 537/1991/664 534/1992/664 -f 538/1993/665 539/1994/665 537/1995/665 -f 540/1996/666 535/1997/666 539/1998/666 -f 537/1999/667 535/2000/667 534/2001/667 -f 536/2002/668 540/2003/668 538/2004/668 -f 541/2005/669 542/2006/669 543/2007/669 -f 544/2008/670 545/2009/670 542/2010/670 -f 546/2011/671 547/2012/671 545/2013/671 -f 548/2014/672 543/2015/672 547/2016/672 -f 545/2017/673 543/2018/673 542/2019/673 -f 544/2020/674 548/2021/674 546/2022/674 -f 549/2023/675 550/2024/675 551/2025/675 -f 552/2026/676 553/2027/676 550/2028/676 -f 554/2029/677 555/2030/677 553/2031/677 -f 556/2032/678 551/2033/678 555/2034/678 -f 553/2035/679 551/2036/679 550/2037/679 -f 552/2038/680 556/2039/680 554/2040/680 -f 557/2041/681 558/2042/681 559/2043/681 -f 560/2044/682 561/2045/682 558/2046/682 -f 562/2047/683 563/2048/683 561/2049/683 -f 564/2050/684 559/2051/684 563/2052/684 -f 561/2053/685 559/2054/685 558/2055/685 -f 560/2056/686 564/2057/686 562/2058/686 -f 565/2059/687 566/2060/687 567/2061/687 -f 568/2062/688 569/2063/688 566/2064/688 -f 570/2065/689 571/2066/689 569/2067/689 -f 572/2068/690 567/2069/690 571/2070/690 -f 569/2071/691 567/2072/691 566/2073/691 -f 568/2074/692 572/2075/692 570/2076/692 -f 573/2077/693 574/2078/693 575/2079/693 -f 576/2080/694 577/2081/694 574/2082/694 -f 578/2083/695 579/2084/695 577/2085/695 -f 580/2086/696 575/2087/696 579/2088/696 -f 577/2089/697 575/2090/697 574/2091/697 -f 576/2092/698 580/2093/698 578/2094/698 -f 581/2095/699 582/2096/699 583/2097/699 -f 584/2098/700 585/2099/700 582/2100/700 -f 586/2101/701 587/2102/701 585/2103/701 -f 588/2104/702 583/2105/702 587/2106/702 -f 585/2107/703 583/2108/703 582/2109/703 -f 584/2110/704 588/2111/704 586/2112/704 -f 589/2113/705 590/2114/705 591/2115/705 -f 592/2116/706 593/2117/706 590/2118/706 -f 594/2119/707 595/2120/707 593/2121/707 -f 596/2122/708 591/2123/708 595/2124/708 -f 593/2125/709 591/2126/709 590/2127/709 -f 592/2128/710 596/2129/710 594/2130/710 -f 597/2131/711 598/2132/711 599/2133/711 -f 600/2134/712 601/2135/712 598/2136/712 -f 602/2137/713 603/2138/713 601/2139/713 -f 604/2140/714 599/2141/714 603/2142/714 -f 601/2143/715 599/2144/715 598/2145/715 -f 600/2146/716 604/2147/716 602/2148/716 -f 605/2149/717 606/2150/717 607/2151/717 -f 608/2152/718 609/2153/718 606/2154/718 -f 610/2155/719 611/2156/719 609/2157/719 -f 612/2158/720 607/2159/720 611/2160/720 -f 609/2161/721 607/2162/721 606/2163/721 -f 608/2164/722 612/2165/722 610/2166/722 -f 613/2167/723 614/2168/723 615/2169/723 -f 616/2170/724 617/2171/724 614/2172/724 -f 618/2173/725 619/2174/725 617/2175/725 -f 620/2176/726 615/2177/726 619/2178/726 -f 617/2179/727 615/2180/727 614/2181/727 -f 616/2182/728 620/2183/728 618/2184/728 -f 621/2185/729 622/2186/729 623/2187/729 -f 624/2188/730 625/2189/730 622/2190/730 -f 626/2191/731 627/2192/731 625/2193/731 -f 628/2194/732 623/2195/732 627/2196/732 -f 625/2197/733 623/2198/733 622/2199/733 -f 624/2200/734 628/2201/734 626/2202/734 -f 629/2203/735 630/2204/735 631/2205/735 -f 632/2206/736 633/2207/736 630/2208/736 -f 634/2209/737 635/2210/737 633/2211/737 -f 636/2212/738 631/2213/738 635/2214/738 -f 633/2215/739 631/2216/739 630/2217/739 -f 632/2218/740 636/2219/740 634/2220/740 -f 637/2221/741 638/2222/741 639/2223/741 -f 640/2224/742 641/2225/742 638/2226/742 -f 642/2227/743 643/2228/743 641/2229/743 -f 644/2230/744 639/2231/744 643/2232/744 -f 641/2233/745 639/2234/745 638/2235/745 -f 640/2236/746 644/2237/746 642/2238/746 -f 645/2239/747 646/2240/747 647/2241/747 -f 648/2242/748 649/2243/748 646/2244/748 -f 650/2245/749 651/2246/749 649/2247/749 -f 652/2248/750 647/2249/750 651/2250/750 -f 649/2251/751 647/2252/751 646/2253/751 -f 648/2254/752 652/2255/752 650/2256/752 -f 653/2257/753 654/2258/753 655/2259/753 -f 656/2260/754 657/2261/754 654/2262/754 -f 658/2263/755 659/2264/755 657/2265/755 -f 660/2266/756 655/2267/756 659/2268/756 -f 657/2269/757 655/2270/757 654/2271/757 -f 656/2272/758 660/2273/758 658/2274/758 -f 661/2275/759 662/2276/759 663/2277/759 -f 664/2278/760 665/2279/760 662/2280/760 -f 666/2281/761 667/2282/761 665/2283/761 -f 668/2284/762 663/2285/762 667/2286/762 -f 665/2287/763 663/2288/763 662/2289/763 -f 664/2290/764 668/2291/764 666/2292/764 -f 349/2293/765 352/2294/765 350/2295/765 -f 352/2296/766 354/2297/766 353/2298/766 -f 354/2299/767 356/2300/767 355/2301/767 -f 356/2302/768 349/2303/768 351/2304/768 -f 353/2305/769 355/2306/769 351/2307/769 -f 352/2308/770 349/2309/770 356/2310/770 -f 357/2311/771 360/2312/771 358/2313/771 -f 360/2314/772 362/2315/772 361/2316/772 -f 362/2317/773 669/2318/773 363/2319/773 -f 359/2320/774 363/2321/774 364/2322/774 -f 363/2323/775 669/2324/775 364/2325/775 -f 358/2326/776 361/2327/776 363/2328/776 -f 669/2329/777 362/2330/777 364/2331/777 -f 362/2332/778 360/2333/778 364/2334/778 -f 365/2335/779 368/2336/779 366/2337/779 -f 368/2338/780 370/2339/780 369/2340/780 -f 370/2341/781 670/2342/781 371/2343/781 -f 367/2344/782 371/2345/782 372/2346/782 -f 371/2347/783 670/2348/783 372/2349/783 -f 366/2350/784 369/2351/784 371/2352/784 -f 670/2353/785 370/2354/785 372/2355/785 -f 370/2356/786 368/2357/786 372/2358/786 -f 373/2359/787 376/2360/787 374/2361/787 -f 376/2362/788 378/2363/788 377/2364/788 -f 378/2365/789 671/2366/789 379/2367/789 -f 375/2368/790 379/2369/790 380/2370/790 -f 379/2371/791 671/2372/791 380/2373/791 -f 374/2374/792 377/2375/792 379/2376/792 -f 671/2377/793 378/2378/793 380/2379/793 -f 378/2380/794 376/2381/794 380/2382/794 -f 381/2383/795 384/2384/795 382/2385/795 -f 384/2386/796 386/2387/796 385/2388/796 -f 386/2389/797 388/2390/797 387/2391/797 -f 388/2392/798 381/2393/798 383/2394/798 -f 385/2395/799 387/2396/799 383/2397/799 -f 384/2398/800 381/2399/800 388/2400/800 -f 389/2401/801 392/2402/801 390/2403/801 -f 392/2404/802 394/2405/802 393/2406/802 -f 394/2407/803 672/2408/803 395/2409/803 -f 391/2410/804 395/2411/804 396/2412/804 -f 395/2413/805 672/2414/805 396/2415/805 -f 390/2416/806 393/2417/806 395/2418/806 -f 672/2419/807 394/2420/807 396/2421/807 -f 394/2422/808 392/2423/808 396/2424/808 -f 397/2425/809 400/2426/809 398/2427/809 -f 400/2428/810 402/2429/810 401/2430/810 -f 402/2431/811 404/2432/811 403/2433/811 -f 404/2434/812 397/2435/812 399/2436/812 -f 401/2437/813 403/2438/813 399/2439/813 -f 400/2440/814 397/2441/814 404/2442/814 -f 405/2443/815 408/2444/815 406/2445/815 -f 408/2446/816 410/2447/816 409/2448/816 -f 410/2449/817 412/2450/817 411/2451/817 -f 412/2452/818 405/2453/818 407/2454/818 -f 409/2455/819 411/2456/819 407/2457/819 -f 408/2458/820 405/2459/820 412/2460/820 -f 413/2461/821 416/2462/821 414/2463/821 -f 416/2464/822 418/2465/822 417/2466/822 -f 418/2467/823 420/2468/823 419/2469/823 -f 420/2470/824 413/2471/824 415/2472/824 -f 417/2473/825 419/2474/825 415/2475/825 -f 416/2476/826 413/2477/826 420/2478/826 -f 421/2479/827 424/2480/827 422/2481/827 -f 424/2482/828 426/2483/828 425/2484/828 -f 426/2485/829 428/2486/829 427/2487/829 -f 428/2488/830 421/2489/830 423/2490/830 -f 425/2491/831 427/2492/831 423/2493/831 -f 424/2494/832 421/2495/832 428/2496/832 -f 429/2497/833 432/2498/833 430/2499/833 -f 432/2500/834 434/2501/834 433/2502/834 -f 434/2503/835 436/2504/835 435/2505/835 -f 436/2506/836 429/2507/836 431/2508/836 -f 433/2509/837 435/2510/837 431/2511/837 -f 432/2512/838 429/2513/838 436/2514/838 -f 437/2515/839 440/2516/839 438/2517/839 -f 440/2518/840 442/2519/840 441/2520/840 -f 442/2521/841 444/2522/841 443/2523/841 -f 444/2524/842 437/2525/842 439/2526/842 -f 441/2527/843 443/2528/843 439/2529/843 -f 440/2530/844 437/2531/844 444/2532/844 -f 445/2533/845 448/2534/845 446/2535/845 -f 448/2536/846 450/2537/846 449/2538/846 -f 450/2539/847 452/2540/847 451/2541/847 -f 452/2542/848 445/2543/848 447/2544/848 -f 449/2545/849 451/2546/849 447/2547/849 -f 448/2548/850 445/2549/850 452/2550/850 -f 453/2551/851 456/2552/851 454/2553/851 -f 456/2554/852 458/2555/852 457/2556/852 -f 458/2557/853 460/2558/853 459/2559/853 -f 460/2560/854 453/2561/854 455/2562/854 -f 457/2563/855 459/2564/855 455/2565/855 -f 456/2566/856 453/2567/856 460/2568/856 -f 461/2569/857 464/2570/857 462/2571/857 -f 464/2572/858 466/2573/858 465/2574/858 -f 466/2575/859 468/2576/859 467/2577/859 -f 468/2578/860 461/2579/860 463/2580/860 -f 465/2581/861 467/2582/861 463/2583/861 -f 464/2584/862 461/2585/862 468/2586/862 -f 469/2587/863 472/2588/863 470/2589/863 -f 472/2590/864 474/2591/864 473/2592/864 -f 474/2593/865 476/2594/865 475/2595/865 -f 476/2596/866 469/2597/866 471/2598/866 -f 473/2599/867 475/2600/867 471/2601/867 -f 472/2602/868 469/2603/868 476/2604/868 -f 477/2605/869 480/2606/869 478/2607/869 -f 480/2608/870 482/2609/870 481/2610/870 -f 482/2611/871 484/2612/871 483/2613/871 -f 484/2614/872 477/2615/872 479/2616/872 -f 481/2617/873 483/2618/873 479/2619/873 -f 480/2620/874 477/2621/874 484/2622/874 -f 485/2623/875 488/2624/875 486/2625/875 -f 488/2626/876 490/2627/876 489/2628/876 -f 490/2629/877 492/2630/877 491/2631/877 -f 492/2632/878 485/2633/878 487/2634/878 -f 489/2635/879 491/2636/879 487/2637/879 -f 488/2638/880 485/2639/880 492/2640/880 -f 493/2641/881 496/2642/881 494/2643/881 -f 496/2644/882 498/2645/882 497/2646/882 -f 498/2647/883 500/2648/883 499/2649/883 -f 500/2650/884 493/2651/884 495/2652/884 -f 497/2653/885 499/2654/885 495/2655/885 -f 496/2656/886 493/2657/886 500/2658/886 -f 501/2659/887 504/2660/887 502/2661/887 -f 504/2662/888 506/2663/888 505/2664/888 -f 506/2665/889 508/2666/889 507/2667/889 -f 508/2668/890 501/2669/890 503/2670/890 -f 505/2671/891 507/2672/891 503/2673/891 -f 504/2674/892 501/2675/892 508/2676/892 -f 509/2677/893 512/2678/893 510/2679/893 -f 512/2680/894 514/2681/894 513/2682/894 -f 514/2683/895 516/2684/895 515/2685/895 -f 516/2686/896 509/2687/896 511/2688/896 -f 513/2689/897 515/2690/897 511/2691/897 -f 512/2692/898 509/2693/898 516/2694/898 -f 517/2695/899 520/2696/899 518/2697/899 -f 520/2698/900 522/2699/900 521/2700/900 -f 522/2701/901 524/2702/901 523/2703/901 -f 524/2704/902 517/2705/902 519/2706/902 -f 521/2707/903 523/2708/903 519/2709/903 -f 520/2710/904 517/2711/904 524/2712/904 -f 525/2713/905 528/2714/905 526/2715/905 -f 528/2716/906 530/2717/906 529/2718/906 -f 530/2719/907 532/2720/907 531/2721/907 -f 532/2722/908 525/2723/908 527/2724/908 -f 529/2725/909 531/2726/909 527/2727/909 -f 528/2728/910 525/2729/910 532/2730/910 -f 533/2731/911 536/2732/911 534/2733/911 -f 536/2734/912 538/2735/912 537/2736/912 -f 538/2737/913 540/2738/913 539/2739/913 -f 540/2740/914 533/2741/914 535/2742/914 -f 537/2743/915 539/2744/915 535/2745/915 -f 536/2746/916 533/2747/916 540/2748/916 -f 541/2749/917 544/2750/917 542/2751/917 -f 544/2752/918 546/2753/918 545/2754/918 -f 546/2755/919 548/2756/919 547/2757/919 -f 548/2758/920 541/2759/920 543/2760/920 -f 545/2761/921 547/2762/921 543/2763/921 -f 544/2764/922 541/2765/922 548/2766/922 -f 549/2767/923 552/2768/923 550/2769/923 -f 552/2770/924 554/2771/924 553/2772/924 -f 554/2773/925 556/2774/925 555/2775/925 -f 556/2776/926 549/2777/926 551/2778/926 -f 553/2779/927 555/2780/927 551/2781/927 -f 552/2782/928 549/2783/928 556/2784/928 -f 557/2785/929 560/2786/929 558/2787/929 -f 560/2788/930 562/2789/930 561/2790/930 -f 562/2791/931 564/2792/931 563/2793/931 -f 564/2794/932 557/2795/932 559/2796/932 -f 561/2797/933 563/2798/933 559/2799/933 -f 560/2800/934 557/2801/934 564/2802/934 -f 565/2803/935 568/2804/935 566/2805/935 -f 568/2806/936 570/2807/936 569/2808/936 -f 570/2809/937 572/2810/937 571/2811/937 -f 572/2812/938 565/2813/938 567/2814/938 -f 569/2815/939 571/2816/939 567/2817/939 -f 568/2818/940 565/2819/940 572/2820/940 -f 573/2821/941 576/2822/941 574/2823/941 -f 576/2824/942 578/2825/942 577/2826/942 -f 578/2827/943 580/2828/943 579/2829/943 -f 580/2830/944 573/2831/944 575/2832/944 -f 577/2833/945 579/2834/945 575/2835/945 -f 576/2836/946 573/2837/946 580/2838/946 -f 581/2839/947 584/2840/947 582/2841/947 -f 584/2842/948 586/2843/948 585/2844/948 -f 586/2845/949 588/2846/949 587/2847/949 -f 588/2848/950 581/2849/950 583/2850/950 -f 585/2851/951 587/2852/951 583/2853/951 -f 584/2854/952 581/2855/952 588/2856/952 -f 589/2857/953 592/2858/953 590/2859/953 -f 592/2860/954 594/2861/954 593/2862/954 -f 594/2863/955 596/2864/955 595/2865/955 -f 596/2866/956 589/2867/956 591/2868/956 -f 593/2869/957 595/2870/957 591/2871/957 -f 592/2872/958 589/2873/958 596/2874/958 -f 597/2875/959 600/2876/959 598/2877/959 -f 600/2878/960 602/2879/960 601/2880/960 -f 602/2881/961 604/2882/961 603/2883/961 -f 604/2884/962 597/2885/962 599/2886/962 -f 601/2887/963 603/2888/963 599/2889/963 -f 600/2890/964 597/2891/964 604/2892/964 -f 605/2893/965 608/2894/965 606/2895/965 -f 608/2896/966 610/2897/966 609/2898/966 -f 610/2899/967 612/2900/967 611/2901/967 -f 612/2902/968 605/2903/968 607/2904/968 -f 609/2905/969 611/2906/969 607/2907/969 -f 608/2908/970 605/2909/970 612/2910/970 -f 613/2911/971 616/2912/971 614/2913/971 -f 616/2914/972 618/2915/972 617/2916/972 -f 618/2917/973 620/2918/973 619/2919/973 -f 620/2920/974 613/2921/974 615/2922/974 -f 617/2923/975 619/2924/975 615/2925/975 -f 616/2926/976 613/2927/976 620/2928/976 -f 621/2929/977 624/2930/977 622/2931/977 -f 624/2932/978 626/2933/978 625/2934/978 -f 626/2935/979 628/2936/979 627/2937/979 -f 628/2938/980 621/2939/980 623/2940/980 -f 625/2941/981 627/2942/981 623/2943/981 -f 624/2944/982 621/2945/982 628/2946/982 -f 629/2947/983 632/2948/983 630/2949/983 -f 632/2950/984 634/2951/984 633/2952/984 -f 634/2953/985 636/2954/985 635/2955/985 -f 636/2956/986 629/2957/986 631/2958/986 -f 633/2959/987 635/2960/987 631/2961/987 -f 632/2962/988 629/2963/988 636/2964/988 -f 637/2965/989 640/2966/989 638/2967/989 -f 640/2968/990 642/2969/990 641/2970/990 -f 642/2971/991 644/2972/991 643/2973/991 -f 644/2974/992 637/2975/992 639/2976/992 -f 641/2977/993 643/2978/993 639/2979/993 -f 640/2980/994 637/2981/994 644/2982/994 -f 645/2983/995 648/2984/995 646/2985/995 -f 648/2986/996 650/2987/996 649/2988/996 -f 650/2989/997 652/2990/997 651/2991/997 -f 652/2992/998 645/2993/998 647/2994/998 -f 649/2995/999 651/2996/999 647/2997/999 -f 648/2998/1000 645/2999/1000 652/3000/1000 -f 653/3001/1001 656/3002/1001 654/3003/1001 -f 656/3004/1002 658/3005/1002 657/3006/1002 -f 658/3007/1003 660/3008/1003 659/3009/1003 -f 660/3010/1004 653/3011/1004 655/3012/1004 -f 657/3013/1005 659/3014/1005 655/3015/1005 -f 656/3016/1006 653/3017/1006 660/3018/1006 -f 661/3019/1007 664/3020/1007 662/3021/1007 -f 664/3022/1008 666/3023/1008 665/3024/1008 -f 666/3025/1009 668/3026/1009 667/3027/1009 -f 668/3028/1010 661/3029/1010 663/3030/1010 -f 665/3031/1011 667/3032/1011 663/3033/1011 -f 664/3034/1012 661/3035/1012 668/3036/1012 \ No newline at end of file +v 0.125000 1.562500 1.500000 +v 0.125000 1.562500 1.375000 +v 0.125000 0.062500 1.500000 +v 0.125000 0.062500 1.375000 +v 0.000000 1.562500 1.500000 +v 0.000000 1.562500 1.375000 +v 0.000000 0.062500 1.500000 +v 0.000000 0.062500 1.375000 +v 0.125000 1.562500 -1.375000 +v 0.125000 1.562500 -1.500000 +v 0.125000 0.062500 -1.375000 +v 0.125000 0.062500 -1.500000 +v 0.000000 1.562500 -1.375000 +v 0.000000 1.562500 -1.500000 +v 0.000000 0.062500 -1.375000 +v 0.000000 0.062500 -1.500000 +v 0.125000 1.562500 1.375000 +v 0.125000 1.562500 -1.375000 +v 0.125000 1.437500 1.375000 +v 0.125000 1.437500 -1.375000 +v 0.000000 1.562500 1.375000 +v 0.000000 1.562500 -1.375000 +v 0.000000 1.437500 1.375000 +v 0.000000 1.437500 -1.375000 +v 0.125000 0.187500 1.375000 +v 0.125000 0.187500 -1.375000 +v 0.125000 0.062500 1.375000 +v 0.125000 0.062500 -1.375000 +v 0.000000 0.187500 1.375000 +v 0.000000 0.187500 -1.375000 +v 0.000000 0.062500 1.375000 +v 0.000000 0.062500 -1.375000 +v 0.062500 0.187500 1.375000 +v 0.062500 0.187500 -1.375000 +v 0.062500 1.437500 1.375000 +v 0.062500 1.437500 -1.375000 +v 0.062500 0.187500 1.375000 +v 0.062500 0.187500 -1.375000 +v 0.062500 1.437500 1.375000 +v 0.062500 1.437500 -1.375000 +vn 1.0000 -0.0000 -0.0000 +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 +vt 0.923077 0.970588 +vt 0.884615 0.970588 +vt 0.884615 0.617647 +vt 0.923077 0.617647 +vt 0.923077 1.000000 +vt 0.884615 1.000000 +vt 0.923077 0.588235 +vt 0.884615 0.588235 +vt 0.038462 0.617647 +vt 0.038462 0.588235 +vt 0.884615 0.941176 +vt 0.038462 0.941176 +vt 0.038462 0.911765 +vt 0.884615 0.911765 +vt 0.038462 0.970588 +s 1 +usemtl m_ff3b3a90-0979-83d1-ee3c-810de9dcd956 +f 2/1/1 1/2/1 3/3/1 +f 2/1/1 3/3/1 4/4/1 +f 7/4/2 5/1/2 6/2/2 +f 7/4/2 6/2/2 8/3/2 +f 5/2/3 1/1/3 2/5/3 +f 5/2/3 2/5/3 6/6/3 +f 4/7/4 3/4/4 7/3/4 +f 4/7/4 7/3/4 8/8/4 +f 3/4/5 1/1/5 5/2/5 +f 3/4/5 5/2/5 7/3/5 +f 6/1/6 2/2/6 4/3/6 +f 6/1/6 4/3/6 8/4/6 +f 10/1/1 9/2/1 11/3/1 +f 10/1/1 11/3/1 12/4/1 +f 15/4/2 13/1/2 14/2/2 +f 15/4/2 14/2/2 16/3/2 +f 13/2/3 9/1/3 10/5/3 +f 13/2/3 10/5/3 14/6/3 +f 12/7/4 11/4/4 15/3/4 +f 12/7/4 15/3/4 16/8/4 +f 11/4/5 9/1/5 13/2/5 +f 11/4/5 13/2/5 15/3/5 +f 14/1/6 10/2/6 12/3/6 +f 14/1/6 12/3/6 16/4/6 +f 18/3/1 17/9/1 19/10/1 +f 18/3/1 19/10/1 20/8/1 +f 23/8/2 21/3/2 22/9/2 +f 23/8/2 22/9/2 24/10/2 +f 21/8/3 17/3/3 18/9/3 +f 21/8/3 18/9/3 22/10/3 +f 20/3/4 19/9/4 23/10/4 +f 20/3/4 23/10/4 24/8/4 +f 26/11/1 25/12/1 27/13/1 +f 26/11/1 27/13/1 28/14/1 +f 31/12/2 29/13/2 30/14/2 +f 31/12/2 30/14/2 32/11/2 +f 29/15/3 25/12/3 26/11/3 +f 29/15/3 26/11/3 30/2/3 +f 28/2/4 27/15/4 31/12/4 +f 28/2/4 31/12/4 32/11/4 +f 36/14/2 34/3/2 33/9/2 +f 36/14/2 33/9/2 35/13/2 +f 37/9/1 38/3/1 40/14/1 +f 37/9/1 40/14/1 39/13/1 +o DoorTop +v 0.000000 2.937500 1.375000 +v 0.000000 2.937500 -1.375000 +v 0.000000 2.812500 1.375000 +v 0.000000 2.812500 -1.375000 +v -0.125000 2.937500 1.375000 +v -0.125000 2.937500 -1.375000 +v -0.125000 2.812500 1.375000 +v -0.125000 2.812500 -1.375000 +v 0.000000 1.562500 1.375000 +v 0.000000 1.562500 -1.375000 +v 0.000000 1.437500 1.375000 +v 0.000000 1.437500 -1.375000 +v -0.125000 1.562500 1.375000 +v -0.125000 1.562500 -1.375000 +v -0.125000 1.437500 1.375000 +v -0.125000 1.437500 -1.375000 +v 0.000000 2.937500 1.500000 +v 0.000000 2.937500 1.375000 +v 0.000000 1.437500 1.500000 +v 0.000000 1.437500 1.375000 +v -0.125000 2.937500 1.500000 +v -0.125000 2.937500 1.375000 +v -0.125000 1.437500 1.500000 +v -0.125000 1.437500 1.375000 +v 0.000000 2.937500 -1.375000 +v 0.000000 2.937500 -1.500000 +v 0.000000 1.437500 -1.375000 +v 0.000000 1.437500 -1.500000 +v -0.125000 2.937500 -1.375000 +v -0.125000 2.937500 -1.500000 +v -0.125000 1.437500 -1.375000 +v -0.125000 1.437500 -1.500000 +v -0.062500 1.562500 1.375000 +v -0.062500 1.562500 -1.375000 +v -0.062500 2.812500 1.375000 +v -0.062500 2.812500 -1.375000 +v -0.062500 1.562500 1.375000 +v -0.062500 1.562500 -1.375000 +v -0.062500 2.812500 1.375000 +v -0.062500 2.812500 -1.375000 +vn 1.0000 -0.0000 -0.0000 +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 +vt 0.884615 0.617647 +vt 0.038462 0.617647 +vt 0.038462 0.588235 +vt 0.884615 0.588235 +vt 0.884615 0.970588 +vt 0.038462 0.970588 +vt 0.038462 0.941176 +vt 0.884615 0.941176 +vt 0.038462 0.911765 +vt 0.884615 0.911765 +vt 0.923077 0.970588 +vt 0.923077 0.617647 +vt 0.923077 1.000000 +vt 0.884615 1.000000 +vt 0.923077 0.588235 +s 1 +usemtl m_ff3b3a90-0979-83d1-ee3c-810de9dcd956 +f 42/16/7 41/17/7 43/18/7 +f 42/16/7 43/18/7 44/19/7 +f 47/19/8 45/16/8 46/17/8 +f 47/19/8 46/17/8 48/18/8 +f 45/19/9 41/16/9 42/17/9 +f 45/19/9 42/17/9 46/18/9 +f 44/16/10 43/17/10 47/18/10 +f 44/16/10 47/18/10 48/19/10 +f 50/20/7 49/21/7 51/22/7 +f 50/20/7 51/22/7 52/23/7 +f 55/21/8 53/22/8 54/23/8 +f 55/21/8 54/23/8 56/20/8 +f 53/22/9 49/24/9 50/25/9 +f 53/22/9 50/25/9 54/23/9 +f 52/23/10 51/22/10 55/24/10 +f 52/23/10 55/24/10 56/25/10 +f 58/26/7 57/20/7 59/16/7 +f 58/26/7 59/16/7 60/27/7 +f 63/27/8 61/26/8 62/20/8 +f 63/27/8 62/20/8 64/16/8 +f 61/20/9 57/26/9 58/28/9 +f 61/20/9 58/28/9 62/29/9 +f 60/30/10 59/27/10 63/16/10 +f 60/30/10 63/16/10 64/19/10 +f 59/27/11 57/26/11 61/20/11 +f 59/27/11 61/20/11 63/16/11 +f 62/26/12 58/20/12 60/16/12 +f 62/26/12 60/16/12 64/27/12 +f 66/26/7 65/20/7 67/16/7 +f 66/26/7 67/16/7 68/27/7 +f 71/27/8 69/26/8 70/20/8 +f 71/27/8 70/20/8 72/16/8 +f 69/20/9 65/26/9 66/28/9 +f 69/20/9 66/28/9 70/29/9 +f 68/30/10 67/27/10 71/16/10 +f 68/30/10 71/16/10 72/19/10 +f 67/27/11 65/26/11 69/20/11 +f 67/27/11 69/20/11 71/16/11 +f 70/26/12 66/20/12 68/16/12 +f 70/26/12 68/16/12 72/27/12 +f 76/25/8 74/16/8 73/17/8 +f 76/25/8 73/17/8 75/24/8 +f 77/17/7 78/16/7 80/25/7 +f 77/17/7 80/25/7 79/24/7 +o Frame +v 0.312500 3.000000 -1.437500 +v 0.312500 3.000000 -1.500000 +v 0.250000 2.937500 -1.437500 +v 0.250000 2.937500 -1.500000 +v 0.125000 3.000000 -1.437500 +v 0.125000 3.000000 -1.500000 +v 0.125000 2.937500 -1.437500 +v 0.125000 2.937500 -1.500000 +v -0.125000 3.000000 -1.437500 +v -0.125000 3.000000 -1.500000 +v -0.125000 2.937500 -1.437500 +v -0.125000 2.937500 -1.500000 +v -0.312500 3.000000 -1.437500 +v -0.312500 3.000000 -1.500000 +v -0.250000 2.937500 -1.437500 +v -0.250000 2.937500 -1.500000 +v 0.312500 3.000000 1.437500 +v 0.312500 3.000000 -1.437500 +v 0.250000 2.937500 1.437500 +v 0.250000 2.937500 -1.437500 +v -0.312500 3.000000 1.437500 +v -0.312500 3.000000 -1.437500 +v -0.250000 2.937500 1.437500 +v -0.250000 2.937500 -1.437500 +v 0.312500 3.000000 1.500000 +v 0.312500 3.000000 1.437500 +v 0.250000 2.937500 1.500000 +v 0.250000 2.937500 1.437500 +v 0.125000 3.000000 1.500000 +v 0.125000 3.000000 1.437500 +v 0.125000 2.937500 1.500000 +v 0.125000 2.937500 1.437500 +v -0.125000 3.000000 1.500000 +v -0.125000 3.000000 1.437500 +v -0.125000 2.937500 1.500000 +v -0.125000 2.937500 1.437500 +v -0.312500 3.000000 1.500000 +v -0.312500 3.000000 1.437500 +v -0.250000 2.937500 1.500000 +v -0.250000 2.937500 1.437500 +v 0.250000 0.062500 1.500000 +v 0.250000 0.062500 -1.500000 +v 0.312500 0.000000 1.500000 +v 0.312500 -0.000000 -1.500000 +v -0.250000 0.062500 1.500000 +v -0.250000 0.062500 -1.500000 +v -0.312500 0.000000 1.500000 +v -0.312500 -0.000000 -1.500000 +vn 0.7071 -0.7071 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.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.7071 -0.7071 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn -0.7071 0.7071 -0.0000 +vt 0.942308 0.279412 +vt 0.923077 0.279412 +vt 0.923077 0.264706 +vt 0.942308 0.264706 +vt 1.000000 0.264706 +vt 1.000000 0.279412 +vt 0.980769 0.279412 +vt 0.980769 0.264706 +vt 0.942308 0.250000 +vt 0.923077 0.235294 +vt 0.980769 0.235294 +vt 0.980769 0.250000 +vt 0.980769 0.294118 +vt 0.923077 0.294118 +vt 0.942308 0.220588 +vt 0.923077 0.220588 +vt 0.923077 0.205882 +vt 0.942308 0.205882 +vt 1.000000 0.205882 +vt 1.000000 0.220588 +vt 0.980769 0.220588 +vt 0.980769 0.205882 +vt 0.942308 0.191176 +vt 0.942308 0.176471 +vt 1.000000 0.176471 +vt 0.980769 0.191176 +vt 1.000000 0.235294 +vt 0.942308 0.235294 +vt 0.903846 0.147059 +vt 0.019231 0.147059 +vt 0.019231 0.132353 +vt 0.903846 0.132353 +vt 0.019231 0.014706 +vt 0.019231 0.000000 +vt 0.903846 0.000000 +vt 0.903846 0.014706 +vt 0.019231 0.294118 +vt 0.903846 0.294118 +vt 0.000000 0.161765 +vt 0.000000 0.279412 +vt 0.923077 0.161765 +vt 0.942308 0.455882 +vt 0.019231 0.455882 +vt 0.019231 0.441176 +vt 0.942308 0.441176 +vt 0.019231 0.588235 +vt 0.019231 0.573529 +vt 0.942308 0.573529 +vt 0.942308 0.588235 +vt 0.942308 0.294118 +vt 0.000000 0.426471 +vt 0.000000 0.308824 +vt 0.961538 0.308824 +vt 0.961538 0.426471 +s 1 +usemtl m_ff3b3a90-0979-83d1-ee3c-810de9dcd956 +f 82/31/13 81/32/13 83/33/13 +f 82/31/13 83/33/13 84/34/13 +f 87/35/14 85/36/14 86/37/14 +f 87/35/14 86/37/14 88/38/14 +f 83/39/15 81/40/15 85/41/15 +f 83/39/15 85/41/15 87/42/15 +f 85/43/16 81/44/16 82/32/16 +f 85/43/16 82/32/16 86/37/16 +f 84/34/17 83/39/17 87/42/17 +f 84/34/17 87/42/17 88/38/17 +f 86/37/18 82/32/18 84/34/18 +f 86/37/18 84/34/18 88/38/18 +f 90/45/19 89/46/19 91/47/19 +f 90/45/19 91/47/19 92/48/19 +f 95/49/20 93/50/20 94/51/20 +f 95/49/20 94/51/20 96/52/20 +f 91/53/15 89/54/15 93/55/15 +f 91/53/15 93/55/15 95/56/15 +f 93/57/16 89/58/16 90/45/16 +f 93/57/16 90/45/16 94/50/16 +f 92/48/17 91/53/17 95/56/17 +f 92/48/17 95/56/17 96/52/17 +f 94/50/18 90/45/18 92/48/18 +f 94/50/18 92/48/18 96/52/18 +f 98/59/13 97/60/13 99/61/13 +f 98/59/13 99/61/13 100/62/13 +f 103/63/20 101/64/20 102/65/20 +f 103/63/20 102/65/20 104/66/20 +f 101/67/16 97/60/16 98/59/16 +f 101/67/16 98/59/16 102/68/16 +f 100/62/17 99/61/17 103/63/17 +f 100/62/17 103/63/17 104/66/17 +f 99/69/15 97/60/15 101/67/15 +f 99/69/15 101/67/15 103/70/15 +f 102/68/18 98/59/18 100/71/18 +f 102/68/18 100/71/18 104/32/18 +f 106/31/13 105/32/13 107/33/13 +f 106/31/13 107/33/13 108/34/13 +f 111/35/14 109/36/14 110/37/14 +f 111/35/14 110/37/14 112/38/14 +f 107/39/15 105/40/15 109/41/15 +f 107/39/15 109/41/15 111/42/15 +f 109/43/16 105/44/16 106/32/16 +f 109/43/16 106/32/16 110/37/16 +f 108/34/17 107/39/17 111/42/17 +f 108/34/17 111/42/17 112/38/17 +f 110/37/18 106/32/18 108/34/18 +f 110/37/18 108/34/18 112/38/18 +f 114/45/19 113/46/19 115/47/19 +f 114/45/19 115/47/19 116/48/19 +f 119/49/20 117/50/20 118/51/20 +f 119/49/20 118/51/20 120/52/20 +f 115/53/15 113/54/15 117/55/15 +f 115/53/15 117/55/15 119/56/15 +f 117/57/16 113/58/16 114/45/16 +f 117/57/16 114/45/16 118/50/16 +f 116/48/17 115/53/17 119/56/17 +f 116/48/17 119/56/17 120/52/17 +f 118/50/18 114/45/18 116/48/18 +f 118/50/18 116/48/18 120/52/18 +f 122/72/21 121/73/21 123/74/21 +f 122/72/21 123/74/21 124/75/21 +f 127/76/22 125/77/22 126/78/22 +f 127/76/22 126/78/22 128/79/22 +f 125/77/16 121/73/16 122/72/16 +f 125/77/16 122/72/16 126/78/16 +f 124/75/17 123/74/17 127/67/17 +f 124/75/17 127/67/17 128/80/17 +f 123/74/15 121/81/15 125/82/15 +f 123/74/15 125/82/15 127/67/15 +f 126/83/18 122/84/18 124/75/18 +f 126/83/18 124/75/18 128/80/18 From 88250e73da67d34e4139842a93cfe407ff79080d Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Mon, 22 Jun 2026 16:21:05 +0300 Subject: [PATCH 029/107] =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/ru_RU.lang | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 62ff26f1e..d4331233f 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -755,6 +755,8 @@ container.paDipole=Диполь container.paQuadrupole=Квадруполь container.paSource=Источник частиц container.plasmaHeater=Нагреватель плазмы +container.pneumoStorageAccess=Терминал доступа PSN +container.pneumoStorageClutter=Хранилище хлама PSN container.pneumoTube=Пневмотруба container.press=Пресс container.puf6_tank=Бочка PuF6 @@ -5794,6 +5796,8 @@ tile.plant_tall.weed.name=Конопля tile.plasma.name=Плазма tile.plasma_heater.name=Нагреватель плазмы tile.plushie.name=Плюшевая игрушка %s +tile.pneumatic_storage_access.name=Пневматическая сеть хранение - Терминал доступа +tile.pneumatic_storage_clutter.name=Пневматическая сеть хранение - Хранилище хлама tile.pneumatic_tube.name=Пневмотруба tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ с отверткой, чтобы переключить вход.$ПКМ с отверткой в присяде, чтобы переключить выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. tile.pneumatic_tube_paintable.name=Окрашиваемая пневмотруба From c6f78d17c9c49c3027132b3edc9ad6266ba255c0 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 22 Jun 2026 15:50:09 +0200 Subject: [PATCH 030/107] gough, --- changelog | 5 +++ src/main/java/com/hbm/blocks/ModBlocks.java | 4 +++ .../pneumatic/PneumoStorageClutter.java | 6 ++++ .../pneumatic/PneumoStorageImporter.java | 32 ++++++++++++++++++ .../java/com/hbm/crafting/MineralRecipes.java | 3 -- .../recipes/AssemblyMachineRecipes.java | 5 ++- .../hbm/inventory/recipes/PUREXRecipes.java | 14 +++++++- .../hbm/textures/items/ingot_dura_steel.png | Bin 279 -> 350 bytes 8 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java diff --git a/changelog b/changelog index a59d61d30..a86d04d2d 100644 --- a/changelog +++ b/changelog @@ -20,6 +20,11 @@ * Base steam production per consumed heat has been increased by 50% on the ZIRNOX * Both radioisotope cell variants have been finally removed after being deprecated for a while * Selfchargers now have a tooltip explaining the hazards of using them in a battery socket +* The alternate recipe for the assembler in the assembler now uses integrated circuits instead of analog ones +* Added an alternate chemical plant recipe that uses a smaller selection of items and ICs instead of ACs +* Flashgold and flashlead are now made in the PUREX instead of the crafting table + * The flashgold recipe now yields two billets instead of one +* Slightly changed the HSS ingot texture to not look identical to steel except slightly greenish ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 47c7cdeb7..704304771 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -14,6 +14,7 @@ import com.hbm.blocks.machine.rbmk.*; import com.hbm.blocks.network.*; import com.hbm.blocks.network.pneumatic.PneumoStorageAccess; import com.hbm.blocks.network.pneumatic.PneumoStorageClutter; +import com.hbm.blocks.network.pneumatic.PneumoStorageImporter; import com.hbm.blocks.network.pneumatic.PneumoStorageMono; import com.hbm.blocks.network.pneumatic.PneumoTube; import com.hbm.blocks.network.pneumatic.PneumoTubePaintableBlock; @@ -807,6 +808,7 @@ public class ModBlocks { public static Block pneumatic_storage_access; public static Block pneumatic_storage_clutter; public static Block pneumatic_storage_mono; + public static Block pneumatic_storage_importer; public static Block fan; public static Block piston_inserter; @@ -1911,6 +1913,7 @@ public class ModBlocks { pneumatic_storage_access = new PneumoStorageAccess().setBlockName("pneumatic_storage_access").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_access"); pneumatic_storage_clutter = new PneumoStorageClutter().setBlockName("pneumatic_storage_clutter").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_clutter"); pneumatic_storage_mono = new PneumoStorageMono().setBlockName("pneumatic_storage_mono").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_mono"); + pneumatic_storage_importer = new PneumoStorageImporter().setBlockName("pneumatic_storage_importer").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_importer"); chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); @@ -3176,6 +3179,7 @@ public class ModBlocks { register(pneumatic_storage_access); register(pneumatic_storage_clutter); register(pneumatic_storage_mono); + register(pneumatic_storage_importer); register(fan); register(piston_inserter); diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java index b07d30c30..17e06647e 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageClutter.java @@ -15,6 +15,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; @@ -44,6 +45,11 @@ public class PneumoStorageClutter extends BlockContainer { return false; } + @Override + public Item getItemDropped(int i, Random rand, int j) { + return null; + } + @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java new file mode 100644 index 000000000..a2e410b84 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java @@ -0,0 +1,32 @@ +package com.hbm.blocks.network.pneumatic; + +import com.hbm.main.MainRegistry; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class PneumoStorageImporter extends BlockContainer { + + public PneumoStorageImporter() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return null; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) return true; + if(!player.isSneaking()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } + return false; + } +} diff --git a/src/main/java/com/hbm/crafting/MineralRecipes.java b/src/main/java/com/hbm/crafting/MineralRecipes.java index 626922cc9..6cad0a65e 100644 --- a/src/main/java/com/hbm/crafting/MineralRecipes.java +++ b/src/main/java/com/hbm/crafting/MineralRecipes.java @@ -230,9 +230,6 @@ public class MineralRecipes { addBilletToIngot(ModItems.ingot_hes, ModItems.billet_hes); addBilletToIngot(ModItems.ingot_australium, ModItems.billet_australium);*/ - GameRegistry.addShapelessRecipe(new ItemStack(ModItems.billet_balefire_gold, 1), new Object[] { ModItems.billet_au198, ModItems.cell_antimatter, ModItems.pellet_charged }); - GameRegistry.addShapelessRecipe(new ItemStack(ModItems.billet_flashlead, 2), new Object[] { ModItems.billet_balefire_gold, ModItems.billet_pb209, ModItems.cell_antimatter }); - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.pellet_rtg), new Object[] { ModItems.billet_pu238, ModItems.billet_pu238, ModItems.billet_pu238, IRON.plate() })); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.pellet_rtg_radium), new Object[] { ModItems.billet_ra226, ModItems.billet_ra226, ModItems.billet_ra226, IRON.plate() })); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.pellet_rtg_weak), new Object[] { ModItems.billet_u238, ModItems.billet_u238, ModItems.billet_pu238, IRON.plate() })); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index f812b42cc..9f32fcfe3 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -238,10 +238,13 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); this.register(new GenericRecipe("ass.assembler").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_assembly_machine, 1)) - .inputItems(new OreDictStack(STEEL.ingot(), 4), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + .inputItems(new OreDictStack(STEEL.ingot(), 4), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.chemplant").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1)) .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.chemplantAlt").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1)) + .inputItems(new OreDictStack(DURA.plate(), 8), new OreDictStack(CU.pipe(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 5, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.purex").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_purex, 1)) .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(RUBBER.pipe(), 8), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.LEAD_PLATING), new OreDictStack(STEEL.shell(), 4), new OreDictStack(RUBBER.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT))); diff --git a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java index 3b2434994..68f03ae6b 100644 --- a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java @@ -43,9 +43,21 @@ public class PUREXRecipes extends GenericRecipes { this.register((PUREXRecipe) new PUREXRecipe("purex.uzh").setup(600, 1_000) .inputItems(new ComparableStack(ModItems.billet_uranium_fuel), new OreDictStack(ZR.billet(), 3)) - .inputFluids(new FluidStack(Fluids.NITRIC_ACID, 1000), new FluidStack(Fluids.HYDROGEN, 4000)) + .inputFluids(new FluidStack(Fluids.NITRIC_ACID, 1_000), new FluidStack(Fluids.HYDROGEN, 4000)) .outputItems(new ItemStack(ModItems.billet_uzh, 4))); + this.register((PUREXRecipe) new PUREXRecipe("purex.flashgold").setup(600, 1_000) + .inputItems(new OreDictStack(AU198.billet()), + new ComparableStack(ModItems.pellet_charged)) + .inputFluids(new FluidStack(Fluids.AMAT, 1_000)) + .outputItems(new ItemStack(ModItems.billet_balefire_gold, 2))); + + this.register((PUREXRecipe) new PUREXRecipe("purex.flashlead").setup(600, 1_000) + .inputItems(new OreDictStack(PB209.billet()), + new ComparableStack(ModItems.billet_balefire_gold)) + .inputFluids(new FluidStack(Fluids.AMAT, 1_000)) + .outputItems(new ItemStack(ModItems.billet_flashlead, 1))); + //CP-1 String autoPile = "autoswitch.pile"; this.register((PUREXRecipe) new PUREXRecipe("purex.pilepu").setup(40, pilePower).setNameWrapper("purex.recycle").setGroup(autoPile, this) diff --git a/src/main/resources/assets/hbm/textures/items/ingot_dura_steel.png b/src/main/resources/assets/hbm/textures/items/ingot_dura_steel.png index 362a60315d8e4b2792c55a6c433206e100084ff0..c47a66393289394c9678c2fb1b068f0e6e0749d2 100644 GIT binary patch delta 308 zcmV-40n7fE0^S0UGk*aUNklb;z7==I6sOk_YbCQ99u1p-Dh!e1J0AHk{ zJwT^!K1*QC(4i{oQZhs+$wCJZN>S9t9a@K!1gR@evSdB~-+Q(U=Of3~IJQ2vJO6?l zTXzS2Mw2neA)*!fRd>*@?A~<`fM^*JKfSeAa-6H^T#@6j_=8;CeoB5MlvjX@XJ;DP^PS{%(rv`ItEa zn|*bIEKP7dA1P&{sSPgjJ*?JTaCLe6!Dn?)qIq2`THzw!vw42w>wOE`9CRrxHak&( z&T2p%j+YUv)-9EfF8_SJ1yBz$O>q#Ogigz`HKOyg&PLya50}58LmAuv0000(o%p1{ei z2XONQ+KwJU&_VokaS=qMgK@Bpp|;x92Z8+F3xWSZD}z=hzg?>&X=PfyE`!mKd_)vV zDXm_YcBlPuWigw>CxlV>Q}X(roo_c=c4fjO3b*vL1@q~y^+pqbFbd0GOeKqX2+8Ft5->5?$S=t~ mmjG_0id2qP22p#Bzu^g#)^6;C Date: Mon, 22 Jun 2026 16:46:28 +0200 Subject: [PATCH 031/107] door door --- .../hbm/models/pheodoors/vehicle_door.obj | 6552 +++++++++-------- .../models/pheodoors/vehicle_door.png | Bin 77484 -> 39878 bytes 2 files changed, 3358 insertions(+), 3194 deletions(-) diff --git a/src/main/resources/assets/hbm/models/pheodoors/vehicle_door.obj b/src/main/resources/assets/hbm/models/pheodoors/vehicle_door.obj index 28c8da02a..9c98375f0 100644 --- a/src/main/resources/assets/hbm/models/pheodoors/vehicle_door.obj +++ b/src/main/resources/assets/hbm/models/pheodoors/vehicle_door.obj @@ -1,3205 +1,3369 @@ -# Blender v2.79 (sub 0) OBJ File: 'vehicle_door.blend' +# Blender 4.0.2 # www.blender.org -o Right -v -0.062500 1.562500 0.187500 -v -0.125000 1.562500 -0.125000 -v 0.187500 1.562500 -0.187500 -v -0.062500 2.062500 -0.187500 -v -0.062500 1.562500 -0.187500 -v -0.125000 2.062500 -0.125000 -v -0.125000 2.062500 0.125000 -v -0.125000 1.562500 0.125000 -v -0.062500 2.062500 0.187500 -v 0.187500 2.062500 0.187500 -v 0.187500 1.562500 0.187500 -v 0.187500 2.062500 -0.187500 -v -0.062500 2.562500 0.187500 -v -0.125000 2.562500 -0.125000 -v 0.187500 2.562500 -0.187500 -v -0.062500 3.062500 -0.187500 -v -0.062500 2.562500 -0.187500 -v -0.125000 3.062500 -0.125000 -v -0.125000 3.062500 0.125000 -v -0.125000 2.562500 0.125000 -v -0.062500 3.062500 0.187500 -v 0.187500 3.062500 0.187500 -v 0.187500 2.562500 0.187500 -v 0.187500 3.062500 -0.187500 -v -0.062500 3.562500 0.187501 -v -0.125000 3.562500 -0.124999 -v 0.187500 3.562500 -0.187499 -v -0.062500 4.062500 -0.187499 -v -0.062500 3.562500 -0.187499 -v -0.125000 4.062500 -0.124999 -v -0.125000 4.062500 0.125001 -v -0.125000 3.562500 0.125001 -v -0.062500 4.062500 0.187501 -v 0.187500 4.062500 0.187501 -v 0.187500 3.562500 0.187501 -v 0.187500 4.062500 -0.187499 -v -0.062500 4.562500 0.187501 -v -0.125000 4.562500 -0.124999 -v 0.187500 4.562500 -0.187499 -v -0.062500 5.062500 -0.187499 -v -0.062500 4.562500 -0.187499 -v -0.125000 5.062500 -0.124999 -v -0.125000 5.062500 0.125001 -v -0.125000 4.562500 0.125001 -v -0.062500 5.062500 0.187501 -v 0.187500 5.062500 0.187501 -v 0.187500 4.562500 0.187501 -v 0.187500 5.062500 -0.187499 -v -0.062500 5.562500 0.187501 -v -0.125000 5.562500 -0.124999 -v 0.187500 5.562500 -0.187499 -v -0.062500 5.937500 -0.187499 -v -0.062500 5.562500 -0.187499 -v -0.125000 5.937500 -0.124999 -v -0.125000 5.937500 0.125001 -v -0.125000 5.562500 0.125001 -v -0.062500 5.937500 0.187501 -v 0.187500 5.937500 0.187501 -v 0.187500 5.562500 0.187501 -v -0.062500 0.562500 0.187500 -v -0.125000 0.562500 -0.125000 -v 0.187500 0.562500 -0.187500 -v -0.062500 1.062500 -0.187500 -v -0.062500 0.562500 -0.187500 -v -0.125000 1.062500 -0.125000 -v -0.125000 1.062500 0.125000 -v -0.125000 0.562500 0.125000 -v -0.062500 1.062500 0.187500 -v 0.187500 1.062500 0.187500 -v 0.187500 0.562500 0.187500 -v 0.187500 1.062500 -0.187500 -v 0.187500 5.937500 -0.187499 -v 3.312500 0.062500 -0.187501 -v 0.187500 0.062500 -0.187500 -v 0.125000 5.937500 -0.124999 -v 0.125000 5.937500 0.125001 -v 0.125000 0.062500 -0.125000 -v 0.125000 0.062500 0.125000 -v 0.187500 5.937500 0.187501 -v 3.312500 5.937500 0.187500 -v 0.187500 0.062500 0.187500 -v 3.312500 0.062500 0.187499 -v 3.312500 5.250000 -0.187500 -v 0.312500 5.250000 -0.249999 -v 3.312500 5.250000 -0.250000 -v 0.312500 5.437500 -0.249999 -v 0.250000 5.437500 -0.187499 -v 3.312500 5.437500 -0.187500 -v 3.312500 5.437500 -0.250000 -v 3.312500 4.250000 -0.187500 -v 0.312500 4.250000 -0.249999 -v 3.312500 4.250000 -0.250000 -v 0.312500 4.437500 -0.249999 -v 0.250000 4.437500 -0.187499 -v 3.312500 4.437500 -0.187500 -v 3.312500 4.437500 -0.250000 -v 3.312500 3.250000 -0.187500 -v 0.312500 3.250000 -0.249999 -v 3.312500 3.250000 -0.250000 -v 0.312500 3.437500 -0.249999 -v 0.250000 3.437500 -0.187499 -v 3.312500 3.437500 -0.187500 -v 3.312500 3.437500 -0.250000 -v 3.312500 2.250000 -0.187501 -v 0.312500 2.250000 -0.250000 -v 3.312500 2.250000 -0.250001 -v 0.312500 2.437500 -0.250000 -v 0.250000 2.437500 -0.187500 -v 3.312500 2.437500 -0.187501 -v 3.312500 2.437500 -0.250001 -v 3.312500 1.250000 -0.187501 -v 0.312500 1.250000 -0.250000 -v 3.312500 1.250000 -0.250001 -v 0.312500 1.437500 -0.250000 -v 0.250000 1.437500 -0.187500 -v 3.312500 1.437500 -0.187501 -v 3.312500 1.437500 -0.250001 -v 3.312500 0.250000 -0.187501 -v 0.312500 0.250000 -0.250000 -v 3.312500 0.250000 -0.250001 -v 0.312500 0.437500 -0.250000 -v 0.250000 0.437500 -0.187500 -v 3.312500 0.437500 -0.187501 -v 3.312500 0.437500 -0.250001 -v 3.312500 5.250000 0.187500 -v 0.312500 5.250000 0.250001 -v 0.250000 5.250000 0.187501 -v 3.312500 5.250000 0.250000 -v 0.312500 5.437500 0.250001 -v 0.250000 5.437500 0.187501 -v 3.312500 5.437500 0.187500 -v 3.312500 5.437500 0.250000 -v 3.312500 4.250000 0.187500 -v 0.312500 4.250000 0.250001 -v 0.250000 4.250000 0.187501 -v 3.312500 4.250000 0.250000 -v 0.312500 4.437500 0.250001 -v 0.250000 4.437500 0.187501 -v 3.312500 4.437500 0.187500 -v 3.312500 4.437500 0.250000 -v 3.312500 3.250000 0.187500 -v 0.312500 3.250000 0.250001 -v 0.250000 3.250000 0.187501 -v 3.312500 3.250000 0.250000 -v 0.312500 3.437500 0.250001 -v 0.250000 3.437500 0.187501 -v 3.312500 3.437500 0.187500 -v 3.312500 3.437500 0.250000 -v 3.312500 2.250000 0.187499 -v 0.312500 2.250000 0.250000 -v 0.250000 2.250000 0.187500 -v 3.312500 2.250000 0.249999 -v 0.312500 2.437500 0.250000 -v 0.250000 2.437500 0.187500 -v 3.312500 2.437500 0.187499 -v 3.312500 2.437500 0.249999 -v 3.312500 1.250000 0.187499 -v 0.312500 1.250000 0.250000 -v 0.250000 1.250000 0.187500 -v 3.312500 1.250000 0.249999 -v 0.312500 1.437500 0.250000 -v 0.250000 1.437500 0.187500 -v 3.312500 1.437500 0.187499 -v 3.312500 1.437500 0.249999 -v 3.312500 0.250000 0.187499 -v 0.312500 0.250000 0.250000 -v 0.250000 0.250000 0.187500 -v 3.312500 0.250000 0.249999 -v 0.312500 0.437500 0.250000 -v 0.250000 0.437500 0.187500 -v 3.312500 0.437500 0.187499 -v 3.312500 0.437500 0.249999 -v 0.437500 1.500000 -0.187500 -v 0.562500 1.562500 -0.250000 -v 0.562500 1.500000 -0.187500 -v 0.562500 2.187500 -0.187500 -v 0.437500 2.125000 -0.250000 -v 0.437500 2.187500 -0.187500 -v 0.437500 1.562500 -0.250000 -v 0.437500 2.187500 -0.187500 -v 0.562500 2.125000 -0.250000 -v 0.562500 1.500000 -0.187500 -v 0.437500 2.500000 -0.187500 -v 0.562500 2.562500 -0.250000 -v 0.562500 2.500000 -0.187500 -v 0.562500 3.187500 -0.187499 -v 0.437500 3.125000 -0.249999 -v 0.437500 3.187500 -0.187499 -v 0.437500 2.562500 -0.250000 -v 0.437500 3.187500 -0.187499 -v 0.562500 3.125000 -0.249999 -v 0.562500 2.500000 -0.187500 -v 0.562500 1.562500 0.250000 -v 0.437500 1.500000 0.187500 -v 0.562500 1.500000 0.187500 -v 0.437500 2.125000 0.250000 -v 0.562500 2.187500 0.187500 -v 0.437500 2.187500 0.187500 -v 0.437500 1.562500 0.250000 -v 0.437500 2.187500 0.187500 -v 0.562500 1.500000 0.187500 -v 0.562500 2.125000 0.250000 -v 0.562500 2.562500 0.250000 -v 0.437500 2.500000 0.187500 -v 0.562500 2.500000 0.187500 -v 0.437500 3.125000 0.250001 -v 0.562500 3.187500 0.187501 -v 0.437500 3.187500 0.187501 -v 0.437500 2.562500 0.250000 -v 0.437500 3.187500 0.187501 -v 0.562500 2.500000 0.187500 -v 0.562500 3.125000 0.250001 -v 1.312500 0.468750 -0.312500 -v 0.437500 0.514515 -0.422985 -v 1.312500 0.514514 -0.422986 -v 0.437500 0.468750 -0.187500 -v 1.312500 0.468750 -0.187500 -v 1.312500 0.735485 -0.422986 -v 1.312500 0.781250 -0.312500 -v 0.437500 0.781250 -0.187500 -v 0.437500 0.468750 -0.312500 -v 1.312500 0.781250 -0.187500 -v 0.437500 0.781250 -0.312500 -v 0.437500 0.735485 -0.422985 -v 0.437500 0.625000 -0.468750 -v 1.312500 0.625000 -0.468750 -v 1.312500 0.625000 -0.187500 -v 3.312500 0.536612 -0.224112 -v 3.312500 0.625000 -0.187501 -v 1.312500 0.713388 -0.224112 -v 3.312500 0.713388 -0.224112 -v 1.312500 0.750000 -0.312500 -v 3.312500 0.750000 -0.312501 -v 1.312500 0.713388 -0.400889 -v 3.312500 0.713388 -0.400889 -v 1.312500 0.625000 -0.437500 -v 3.312500 0.625000 -0.437501 -v 1.312500 0.536612 -0.400889 -v 3.312500 0.536612 -0.400889 -v 1.312500 0.500000 -0.312500 -v 3.312500 0.500000 -0.312501 -v 1.312500 0.536612 -0.224112 -v 1.312500 0.468750 0.312500 -v 0.437500 0.514515 0.422985 -v 0.437500 0.468750 0.312500 -v 0.437500 0.468750 0.187500 -v 1.312500 0.468750 0.187500 -v 1.312500 0.781250 0.312500 -v 1.312500 0.625000 0.468750 -v 1.312500 0.514514 0.422985 -v 0.437500 0.781250 0.187500 -v 0.437500 0.781250 0.312500 -v 1.312500 0.781250 0.187500 -v 0.437500 0.735485 0.422985 -v 1.312500 0.735485 0.422985 -v 0.437500 0.625000 0.468750 -v 3.312500 0.536612 0.224111 -v 1.312500 0.625000 0.187500 -v 3.312500 0.625000 0.187499 -v 1.312500 0.713388 0.224111 -v 3.312500 0.713388 0.224111 -v 1.312500 0.750000 0.312500 -v 3.312500 0.750000 0.312499 -v 1.312500 0.713388 0.400888 -v 3.312500 0.713388 0.400888 -v 1.312500 0.625000 0.437500 -v 3.312500 0.625000 0.437499 -v 1.312500 0.536612 0.400888 -v 3.312500 0.536612 0.400888 -v 1.312500 0.500000 0.312500 -v 3.312500 0.500000 0.312499 -v 1.312500 0.536612 0.224111 -v 2.125000 1.500000 -0.187500 -v 3.187500 1.500000 -0.250000 -v 3.187500 1.500000 -0.187500 -v 3.187500 2.187500 -0.250000 -v 2.125000 2.187500 -0.250000 -v 2.125000 1.500000 -0.250000 -v 2.125000 2.187500 -0.187500 -v 3.187500 2.187500 -0.187500 -v 3.187500 1.500000 0.250000 -v 2.125000 1.500000 0.187500 -v 3.187500 1.500000 0.187500 -v 3.187500 2.187500 0.250000 -v 2.125000 2.187500 0.250000 -v 2.125000 1.500000 0.250000 -v 2.125000 2.187500 0.187500 -v 3.187500 2.187500 0.187500 -v 2.812500 2.125000 0.312499 -v 2.812500 1.562500 0.249999 -v 2.812500 1.562500 0.312499 -v 3.125000 1.562500 0.249999 -v 3.125000 2.125000 0.312499 -v 3.125000 1.562500 0.312499 -v 3.125000 2.125000 0.249999 -v 2.812500 2.125000 0.249999 -v 0.187500 5.937500 -0.187499 -v 3.312500 5.937500 -0.187500 -v 0.250000 5.250000 -0.187499 -v 0.250000 5.250000 -0.187499 -v 0.250000 5.437500 -0.187499 -v 0.250000 4.250000 -0.187499 -v 0.250000 4.250000 -0.187499 -v 0.250000 4.437500 -0.187499 -v 0.250000 3.250000 -0.187499 -v 0.250000 3.250000 -0.187499 -v 0.250000 3.437500 -0.187499 -v 0.250000 2.250000 -0.187500 -v 0.250000 2.250000 -0.187500 -v 0.250000 2.437500 -0.187500 -v 0.250000 1.250000 -0.187500 -v 0.250000 1.250000 -0.187500 -v 0.250000 1.437500 -0.187500 -v 0.250000 0.250000 -0.187500 -v 0.250000 0.250000 -0.187500 -v 0.250000 0.437500 -0.187500 -v 0.250000 5.250000 0.187501 -v 0.250000 5.437500 0.187501 -v 0.250000 4.250000 0.187501 -v 0.250000 4.437500 0.187501 -v 0.250000 3.250000 0.187501 -v 0.250000 3.437500 0.187501 -v 0.250000 2.250000 0.187500 -v 0.250000 2.437500 0.187500 -v 0.250000 1.250000 0.187500 -v 0.250000 1.437500 0.187500 -v 0.250000 0.250000 0.187500 -v 0.250000 0.437500 0.187500 -v 0.437500 1.500000 -0.187500 -v 0.562500 2.187500 -0.187500 -v 0.437500 2.500000 -0.187500 -v 0.562500 3.187500 -0.187499 -v 0.437500 1.500000 0.187500 -v 0.562500 2.187500 0.187500 -v 0.437500 2.500000 0.187500 -v 0.562500 3.187500 0.187501 -vt 0.221649 0.855670 -vt 0.208763 0.858247 -vt 0.206186 0.845361 -vt 0.185567 0.855670 -vt 0.206186 0.855670 -vt 0.185567 0.858247 -vt 0.185567 0.868557 -vt 0.206186 0.858247 -vt 0.206186 0.868557 -vt 0.242268 0.855670 -vt 0.221649 0.858247 -vt 0.221649 0.855670 -vt 0.242268 0.845361 -vt 0.221649 0.845361 -vt 0.170103 0.855670 -vt 0.185567 0.845361 -vt 0.182990 0.858247 -vt 0.296392 0.881443 -vt 0.283505 0.884021 -vt 0.280928 0.871134 -vt 0.260309 0.881443 -vt 0.280928 0.881443 -vt 0.260309 0.884021 -vt 0.260309 0.894330 -vt 0.280928 0.884021 -vt 0.280928 0.894330 -vt 0.317010 0.881443 -vt 0.296392 0.884021 -vt 0.296392 0.881443 -vt 0.317010 0.871134 -vt 0.296392 0.871134 -vt 0.244845 0.881443 -vt 0.260309 0.871134 -vt 0.257732 0.884021 -vt 0.221649 0.881443 -vt 0.208763 0.884021 -vt 0.206186 0.871134 -vt 0.185567 0.881443 -vt 0.206186 0.881443 -vt 0.185567 0.884021 -vt 0.185567 0.894330 -vt 0.206186 0.884021 -vt 0.206186 0.894330 -vt 0.242268 0.881443 -vt 0.221649 0.884021 -vt 0.221649 0.881443 -vt 0.242268 0.871134 -vt 0.221649 0.871134 -vt 0.170103 0.881443 -vt 0.185567 0.871134 -vt 0.182990 0.884021 -vt 0.296392 0.907216 -vt 0.283505 0.909794 -vt 0.280928 0.896907 -vt 0.260309 0.907216 -vt 0.280928 0.907216 -vt 0.260309 0.909794 -vt 0.260309 0.920103 -vt 0.280928 0.909794 -vt 0.280928 0.920103 -vt 0.317010 0.907216 -vt 0.296392 0.909794 -vt 0.296392 0.907216 -vt 0.317010 0.896907 -vt 0.296392 0.896907 -vt 0.244845 0.907216 -vt 0.260309 0.896907 -vt 0.257732 0.909794 -vt 0.201031 0.907216 -vt 0.188144 0.909794 -vt 0.185567 0.896907 -vt 0.170103 0.907216 -vt 0.185567 0.907216 -vt 0.170103 0.909794 -vt 0.170103 0.920103 -vt 0.185567 0.909794 -vt 0.185567 0.920103 -vt 0.216495 0.907216 -vt 0.201031 0.909794 -vt 0.201031 0.907216 -vt 0.216495 0.896907 -vt 0.201031 0.896907 -vt 0.296392 0.855670 -vt 0.283505 0.858247 -vt 0.280928 0.845361 -vt 0.260309 0.855670 -vt 0.280928 0.855670 -vt 0.260309 0.858247 -vt 0.260309 0.868557 -vt 0.280928 0.858247 -vt 0.280928 0.868557 -vt 0.317010 0.855670 -vt 0.296392 0.858247 -vt 0.296392 0.855670 -vt 0.317010 0.845361 -vt 0.296392 0.845361 -vt 0.244845 0.855670 -vt 0.260309 0.845361 -vt 0.257732 0.858247 -vt 0.404639 0.837629 -vt 0.275773 0.595361 -vt 0.404639 0.595361 -vt 0.407216 0.837629 -vt 0.417526 0.837629 -vt 0.407216 0.595361 -vt 0.417526 0.595361 -vt 0.420103 0.837629 -vt 0.548969 0.837629 -vt 0.420103 0.595361 -vt 0.548969 0.595361 -vt 0.291237 0.579897 -vt 0.414948 0.582474 -vt 0.291237 0.582474 -vt 0.414948 0.590206 -vt 0.417526 0.590206 -vt 0.291237 0.590206 -vt 0.414948 0.592784 -vt 0.291237 0.592784 -vt 0.291237 0.564433 -vt 0.414948 0.567010 -vt 0.291237 0.567010 -vt 0.414948 0.574742 -vt 0.417526 0.574742 -vt 0.291237 0.574742 -vt 0.414948 0.577320 -vt 0.291237 0.577320 -vt 0.291237 0.548969 -vt 0.414948 0.551546 -vt 0.291237 0.551546 -vt 0.414948 0.559278 -vt 0.417526 0.559278 -vt 0.291237 0.559278 -vt 0.414948 0.561856 -vt 0.291237 0.561856 -vt 0.291237 0.533505 -vt 0.414948 0.536082 -vt 0.291237 0.536082 -vt 0.414948 0.543814 -vt 0.417526 0.543814 -vt 0.291237 0.543814 -vt 0.414948 0.546392 -vt 0.291237 0.546392 -vt 0.291237 0.518041 -vt 0.414948 0.520619 -vt 0.291237 0.520619 -vt 0.414948 0.528351 -vt 0.417526 0.528351 -vt 0.291237 0.528351 -vt 0.414948 0.530928 -vt 0.291237 0.530928 -vt 0.291237 0.502577 -vt 0.414948 0.505155 -vt 0.291237 0.505155 -vt 0.414948 0.512887 -vt 0.417526 0.512887 -vt 0.291237 0.512887 -vt 0.414948 0.515464 -vt 0.291237 0.515464 -vt 0.420103 0.579897 -vt 0.543814 0.582474 -vt 0.546392 0.579897 -vt 0.420103 0.582474 -vt 0.543814 0.590206 -vt 0.546392 0.590206 -vt 0.420103 0.590206 -vt 0.543814 0.592784 -vt 0.420103 0.592784 -vt 0.420103 0.564433 -vt 0.543814 0.567010 -vt 0.546392 0.564433 -vt 0.420103 0.567010 -vt 0.543814 0.574742 -vt 0.546392 0.574742 -vt 0.420103 0.574742 -vt 0.543814 0.577320 -vt 0.420103 0.577320 -vt 0.420103 0.548969 -vt 0.543814 0.551546 -vt 0.546392 0.548969 -vt 0.420103 0.551546 -vt 0.543814 0.559278 -vt 0.546392 0.559278 -vt 0.420103 0.559278 -vt 0.543814 0.561856 -vt 0.420103 0.561856 -vt 0.420103 0.533505 -vt 0.543814 0.536082 -vt 0.546392 0.533505 -vt 0.420103 0.536082 -vt 0.543814 0.543814 -vt 0.546392 0.543814 -vt 0.420103 0.543814 -vt 0.543814 0.546392 -vt 0.420103 0.546392 -vt 0.420103 0.518041 -vt 0.543814 0.520619 -vt 0.546392 0.518041 -vt 0.420103 0.520619 -vt 0.543814 0.528351 -vt 0.546392 0.528351 -vt 0.420103 0.528351 -vt 0.543814 0.530928 -vt 0.420103 0.530928 -vt 0.420103 0.502577 -vt 0.543814 0.505155 -vt 0.546392 0.502577 -vt 0.420103 0.505155 -vt 0.543814 0.512887 -vt 0.546392 0.512887 -vt 0.420103 0.512887 -vt 0.543814 0.515464 -vt 0.420103 0.515464 -vt 0.110825 0.855670 -vt 0.115979 0.853093 -vt 0.115979 0.855670 -vt 0.115979 0.878866 -vt 0.110825 0.881443 -vt 0.110825 0.878866 -vt 0.115979 0.878866 -vt 0.110825 0.855670 -vt 0.115979 0.855670 -vt 0.115979 0.878866 -vt 0.118557 0.853093 -vt 0.115979 0.855670 -vt 0.110825 0.855670 -vt 0.108247 0.881443 -vt 0.110825 0.878866 -vt 0.110825 0.886598 -vt 0.115979 0.884021 -vt 0.115979 0.886598 -vt 0.115979 0.909794 -vt 0.110825 0.912371 -vt 0.110825 0.909794 -vt 0.115979 0.909794 -vt 0.110825 0.886598 -vt 0.115979 0.886598 -vt 0.115979 0.909794 -vt 0.118557 0.884021 -vt 0.115979 0.886598 -vt 0.110825 0.886598 -vt 0.108247 0.912371 -vt 0.110825 0.909794 -vt 0.128866 0.853093 -vt 0.123711 0.855670 -vt 0.128866 0.855670 -vt 0.123711 0.881443 -vt 0.128866 0.878866 -vt 0.123711 0.878866 -vt 0.123711 0.855670 -vt 0.128866 0.878866 -vt 0.128866 0.855670 -vt 0.131443 0.853093 -vt 0.128866 0.878866 -vt 0.128866 0.855670 -vt 0.121134 0.881443 -vt 0.123711 0.855670 -vt 0.123711 0.878866 -vt 0.128866 0.884021 -vt 0.123711 0.886598 -vt 0.128866 0.886598 -vt 0.123711 0.912371 -vt 0.128866 0.909794 -vt 0.123711 0.909794 -vt 0.123711 0.886598 -vt 0.128866 0.909794 -vt 0.128866 0.886598 -vt 0.131443 0.884021 -vt 0.128866 0.909794 -vt 0.128866 0.886598 -vt 0.121134 0.912371 -vt 0.123711 0.886598 -vt 0.123711 0.909794 -vt 0.000000 0.886598 -vt 0.036082 0.891753 -vt 0.000000 0.891753 -vt 0.036082 0.881443 -vt 0.000000 0.881443 -vt 0.049659 0.891154 -vt 0.040547 0.891154 -vt 0.038660 0.886598 -vt 0.051546 0.881443 -vt 0.051546 0.886598 -vt 0.051546 0.899485 -vt 0.038660 0.904639 -vt 0.038660 0.899485 -vt 0.000000 0.912371 -vt 0.036082 0.907216 -vt 0.036082 0.912371 -vt 0.036082 0.902062 -vt 0.000000 0.907216 -vt 0.000000 0.902062 -vt 0.049659 0.909195 -vt 0.045103 0.911082 -vt 0.036082 0.896907 -vt 0.000000 0.896907 -vt 0.082474 0.969072 -vt 0.000000 0.974227 -vt 0.000000 0.969072 -vt 0.082474 0.963918 -vt 0.000000 0.963918 -vt 0.082474 0.958763 -vt 0.000000 0.958763 -vt 0.082474 0.994845 -vt 0.000000 1.000000 -vt 0.000000 0.994845 -vt 0.082474 0.989691 -vt 0.000000 0.989691 -vt 0.082474 0.984536 -vt 0.000000 0.984536 -vt 0.082474 0.979381 -vt 0.000000 0.979381 -vt 0.082474 0.974227 -vt 0.000000 0.853093 -vt 0.036082 0.858247 -vt 0.036082 0.853093 -vt 0.036082 0.847938 -vt 0.000000 0.847938 -vt 0.038660 0.853093 -vt 0.045103 0.859536 -vt 0.049659 0.857648 -vt 0.051546 0.847938 -vt 0.051546 0.853093 -vt 0.038660 0.871134 -vt 0.051546 0.865979 -vt 0.038660 0.865979 -vt 0.036082 0.873711 -vt 0.000000 0.878866 -vt 0.036082 0.878866 -vt 0.000000 0.873711 -vt 0.036082 0.868557 -vt 0.000000 0.868557 -vt 0.045103 0.877577 -vt 0.051546 0.871134 -vt 0.036082 0.863402 -vt 0.000000 0.863402 -vt 0.000000 0.858247 -vt 0.000000 0.930412 -vt 0.082474 0.925258 -vt 0.000000 0.925258 -vt 0.082474 0.920103 -vt 0.000000 0.920103 -vt 0.082474 0.914948 -vt 0.000000 0.914948 -vt 0.000000 0.956186 -vt 0.082474 0.951031 -vt 0.000000 0.951031 -vt 0.082474 0.945876 -vt 0.000000 0.945876 -vt 0.082474 0.940722 -vt 0.000000 0.940722 -vt 0.082474 0.935567 -vt 0.000000 0.935567 -vt 0.082474 0.930412 -vt 0.105670 0.561856 -vt 0.149485 0.559278 -vt 0.149485 0.561856 -vt 0.105670 0.590206 -vt 0.103093 0.561856 -vt 0.105670 0.561856 -vt 0.149485 0.590206 -vt 0.149485 0.561856 -vt 0.152062 0.590206 -vt 0.152062 0.561856 -vt 0.105670 0.592784 -vt 0.149485 0.592784 -vt 0.201031 0.559278 -vt 0.157216 0.561856 -vt 0.201031 0.561856 -vt 0.154639 0.561856 -vt 0.157216 0.590206 -vt 0.157216 0.561856 -vt 0.201031 0.590206 -vt 0.201031 0.561856 -vt 0.203608 0.590206 -vt 0.203608 0.561856 -vt 0.157216 0.592784 -vt 0.201031 0.592784 -vt 0.229381 0.590206 -vt 0.226804 0.567010 -vt 0.229381 0.567010 -vt 0.229381 0.567010 -vt 0.242268 0.564433 -vt 0.242268 0.567010 -vt 0.242268 0.590206 -vt 0.242268 0.567010 -vt 0.244845 0.590206 -vt 0.244845 0.567010 -vt 0.229381 0.592784 -vt 0.242268 0.592784 -vt 0.219072 0.858247 -vt 0.242268 0.858247 -vt 0.242268 0.855670 -vt 0.172680 0.858247 -vt 0.170103 0.845361 -vt 0.293814 0.884021 -vt 0.317010 0.884021 -vt 0.317010 0.881443 -vt 0.247423 0.884021 -vt 0.244845 0.871134 -vt 0.219072 0.884021 -vt 0.242268 0.884021 -vt 0.242268 0.881443 -vt 0.172680 0.884021 -vt 0.170103 0.871134 -vt 0.293814 0.909794 -vt 0.317010 0.909794 -vt 0.317010 0.907216 -vt 0.247423 0.909794 -vt 0.244845 0.896907 -vt 0.198454 0.909794 -vt 0.170103 0.896907 -vt 0.216495 0.909794 -vt 0.216495 0.907216 -vt 0.293814 0.858247 -vt 0.317010 0.858247 -vt 0.317010 0.855670 -vt 0.247423 0.858247 -vt 0.244845 0.845361 -vt 0.275773 0.837629 -vt 0.417526 0.579897 -vt 0.291237 0.590206 -vt 0.417526 0.582474 -vt 0.417526 0.590206 -vt 0.417526 0.564433 -vt 0.291237 0.574742 -vt 0.417526 0.567010 -vt 0.417526 0.574742 -vt 0.417526 0.548969 -vt 0.291237 0.559278 -vt 0.417526 0.551546 -vt 0.417526 0.559278 -vt 0.417526 0.533505 -vt 0.291237 0.543814 -vt 0.417526 0.536082 -vt 0.417526 0.543814 -vt 0.417526 0.518041 -vt 0.291237 0.528351 -vt 0.417526 0.520619 -vt 0.417526 0.528351 -vt 0.417526 0.502577 -vt 0.291237 0.512887 -vt 0.417526 0.505155 -vt 0.417526 0.512887 -vt 0.420103 0.590206 -vt 0.546392 0.582474 -vt 0.546392 0.590206 -vt 0.420103 0.574742 -vt 0.546392 0.567010 -vt 0.546392 0.574742 -vt 0.420103 0.559278 -vt 0.546392 0.551546 -vt 0.546392 0.559278 -vt 0.420103 0.543814 -vt 0.546392 0.536082 -vt 0.546392 0.543814 -vt 0.420103 0.528351 -vt 0.546392 0.520619 -vt 0.546392 0.528351 -vt 0.420103 0.512887 -vt 0.546392 0.505155 -vt 0.546392 0.512887 -vt 0.110825 0.853093 -vt 0.115979 0.881443 -vt 0.110825 0.878866 -vt 0.118557 0.881443 -vt 0.108247 0.853093 -vt 0.110825 0.884021 -vt 0.115979 0.912371 -vt 0.110825 0.909794 -vt 0.118557 0.912371 -vt 0.108247 0.884021 -vt 0.123711 0.853093 -vt 0.128866 0.881443 -vt 0.123711 0.878866 -vt 0.131443 0.881443 -vt 0.121134 0.853093 -vt 0.123711 0.884021 -vt 0.128866 0.912371 -vt 0.123711 0.909794 -vt 0.131443 0.912371 -vt 0.121134 0.884021 -vt 0.036082 0.886598 -vt 0.045103 0.893041 -vt 0.038660 0.881443 -vt 0.051546 0.904639 -vt 0.040547 0.909195 -vt 0.082474 1.000000 -vt 0.040547 0.857648 -vt 0.038660 0.847938 -vt 0.040547 0.875689 -vt 0.049659 0.875689 -vt 0.082474 0.956186 -vt 0.105670 0.559278 -vt 0.103093 0.590206 -vt 0.157216 0.559278 -vt 0.154639 0.590206 -vt 0.226804 0.590206 -vt 0.229381 0.564433 -vt 0.548969 0.837629 -vt 0.420103 0.822165 -vt 0.548969 0.822165 -vt 0.489691 0.837629 -vt 0.474227 0.595361 -vt 0.489691 0.595361 -vt 0.144330 0.822165 -vt 0.273196 0.837629 -vt 0.144330 0.837629 -vt 0.420103 0.837629 -vt 0.474227 0.837629 -vt 0.273196 0.822165 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn -0.7071 0.0000 -0.7071 -vn -1.0000 0.0000 0.0000 -vn -0.7071 -0.0000 0.7071 -vn 0.0000 -0.0000 1.0000 -vn 0.0000 1.0000 0.0000 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 0.7071 -0.7071 -vn 1.0000 0.0000 0.0000 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 0.7071 0.7071 -vn 0.0000 -0.9808 -0.1951 -vn -0.0000 0.9808 -0.1951 -vn -0.0000 -0.9808 0.1951 -vn 0.0000 0.9808 0.1951 -vn 0.7071 0.7071 0.0000 -vn 0.7071 -0.7071 -0.0000 -s 1 -f 1/1/1 2/2/1 3/3/1 -f 4/4/2 3/3/2 5/5/2 -f 5/5/3 6/6/3 4/4/3 -f 7/7/4 2/8/4 8/9/4 -f 8/10/5 9/11/5 7/12/5 -f 10/13/6 1/1/6 11/14/6 -f 9/15/7 12/16/7 6/17/7 -f 13/18/1 14/19/1 15/20/1 -f 16/21/2 15/20/2 17/22/2 -f 17/22/3 18/23/3 16/21/3 -f 19/24/4 14/25/4 20/26/4 -f 20/27/5 21/28/5 19/29/5 -f 22/30/6 13/18/6 23/31/6 -f 21/32/7 24/33/7 18/34/7 -f 25/35/1 26/36/1 27/37/1 -f 28/38/2 27/37/2 29/39/2 -f 29/39/3 30/40/3 28/38/3 -f 31/41/4 26/42/4 32/43/4 -f 32/44/5 33/45/5 31/46/5 -f 34/47/6 25/35/6 35/48/6 -f 33/49/7 36/50/7 30/51/7 -f 37/52/1 38/53/1 39/54/1 -f 40/55/2 39/54/2 41/56/2 -f 41/56/3 42/57/3 40/55/3 -f 43/58/4 38/59/4 44/60/4 -f 44/61/5 45/62/5 43/63/5 -f 46/64/6 37/52/6 47/65/6 -f 45/66/7 48/67/7 42/68/7 -f 49/69/1 50/70/1 51/71/1 -f 52/72/2 51/71/2 53/73/2 -f 53/73/3 54/74/3 52/72/3 -f 55/75/4 50/76/4 56/77/4 -f 56/78/5 57/79/5 55/80/5 -f 58/81/6 49/69/6 59/82/6 -f 60/83/1 61/84/1 62/85/1 -f 63/86/2 62/85/2 64/87/2 -f 64/87/3 65/88/3 63/86/3 -f 66/89/4 61/90/4 67/91/4 -f 67/92/5 68/93/5 66/94/5 -f 69/95/6 60/83/6 70/96/6 -f 68/97/7 71/98/7 65/99/7 -f 72/100/2 73/101/2 74/102/2 -f 74/102/3 75/103/3 72/100/3 -f 76/104/4 77/105/4 78/106/4 -f 78/106/5 79/107/5 76/104/5 -f 80/108/6 81/109/6 82/110/6 -f 83/111/1 84/112/1 85/113/1 -f 86/114/2 85/113/2 84/112/2 -f 84/112/3 87/115/3 86/114/3 -f 88/116/1 86/117/1 89/118/1 -f 90/119/1 91/120/1 92/121/1 -f 93/122/2 92/121/2 91/120/2 -f 91/120/3 94/123/3 93/122/3 -f 95/124/1 93/125/1 96/126/1 -f 97/127/1 98/128/1 99/129/1 -f 100/130/2 99/129/2 98/128/2 -f 98/128/3 101/131/3 100/130/3 -f 102/132/1 100/133/1 103/134/1 -f 104/135/1 105/136/1 106/137/1 -f 107/138/2 106/137/2 105/136/2 -f 105/136/3 108/139/3 107/138/3 -f 109/140/1 107/141/1 110/142/1 -f 111/143/1 112/144/1 113/145/1 -f 114/146/2 113/145/2 112/144/2 -f 112/144/3 115/147/3 114/146/3 -f 116/148/1 114/149/1 117/150/1 -f 118/151/1 119/152/1 120/153/1 -f 121/154/2 120/153/2 119/152/2 -f 119/152/3 122/155/3 121/154/3 -f 123/156/1 121/157/1 124/158/1 -f 125/159/1 126/160/1 127/161/1 -f 128/162/6 129/163/6 126/160/6 -f 130/164/5 126/160/5 129/163/5 -f 131/165/7 129/166/7 132/167/7 -f 133/168/1 134/169/1 135/170/1 -f 136/171/6 137/172/6 134/169/6 -f 138/173/5 134/169/5 137/172/5 -f 139/174/7 137/175/7 140/176/7 -f 141/177/1 142/178/1 143/179/1 -f 144/180/6 145/181/6 142/178/6 -f 146/182/5 142/178/5 145/181/5 -f 147/183/7 145/184/7 148/185/7 -f 149/186/1 150/187/1 151/188/1 -f 152/189/6 153/190/6 150/187/6 -f 154/191/5 150/187/5 153/190/5 -f 155/192/7 153/193/7 156/194/7 -f 157/195/1 158/196/1 159/197/1 -f 160/198/6 161/199/6 158/196/6 -f 162/200/5 158/196/5 161/199/5 -f 163/201/7 161/202/7 164/203/7 -f 165/204/1 166/205/1 167/206/1 -f 168/207/6 169/208/6 166/205/6 -f 170/209/5 166/205/5 169/208/5 -f 171/210/7 169/211/7 172/212/7 -f 173/213/8 174/214/8 175/215/8 -f 176/216/9 177/217/9 178/218/9 -f 177/219/2 174/220/2 179/221/2 -f 179/222/4 180/223/4 177/224/4 -f 181/225/10 182/226/10 174/227/10 -f 183/228/8 184/229/8 185/230/8 -f 186/231/9 187/232/9 188/233/9 -f 187/234/2 184/235/2 189/236/2 -f 189/237/4 190/238/4 187/239/4 -f 191/240/10 192/241/10 184/242/10 -f 193/243/11 194/244/11 195/245/11 -f 196/246/12 197/247/12 198/248/12 -f 193/249/6 196/250/6 199/251/6 -f 200/252/4 199/253/4 196/254/4 -f 201/255/10 202/256/10 193/257/10 -f 203/258/11 204/259/11 205/260/11 -f 206/261/12 207/262/12 208/263/12 -f 203/264/6 206/265/6 209/266/6 -f 210/267/4 209/268/4 206/269/4 -f 211/270/10 212/271/10 203/272/10 -f 213/273/13 214/274/8 215/275/8 -f 216/276/1 213/273/13 217/277/1 -f 215/278/10 218/279/10 219/280/10 -f 219/280/10 217/281/10 213/282/10 -f 220/283/4 221/284/4 216/285/4 -f 222/286/7 223/287/14 220/288/7 -f 224/289/9 219/290/14 218/291/9 -f 221/284/4 224/292/4 225/293/4 -f 225/294/2 218/291/9 226/295/2 -f 214/274/8 226/295/2 215/275/8 -f 227/296/6 228/297/11 229/298/6 -f 230/299/12 229/298/6 231/300/12 -f 232/301/7 231/300/12 233/302/7 -f 234/303/9 233/304/7 235/305/9 -f 236/306/2 235/305/9 237/307/2 -f 238/308/8 237/307/2 239/309/8 -f 240/310/1 239/309/8 241/311/1 -f 242/312/11 241/311/1 228/297/11 -f 243/313/15 244/314/11 245/315/15 -f 243/313/15 246/316/1 247/317/1 -f 248/318/10 249/319/10 250/320/10 -f 247/321/10 248/318/10 243/322/10 -f 245/323/4 251/324/4 246/325/4 -f 252/326/16 253/327/7 251/328/7 -f 248/329/16 254/330/12 255/331/12 -f 256/332/4 252/333/4 245/323/4 -f 255/331/12 256/334/6 249/335/6 -f 249/335/6 244/314/11 250/336/11 -f 257/337/8 258/338/2 259/339/2 -f 259/339/2 260/340/9 261/341/9 -f 261/341/9 262/342/7 263/343/7 -f 263/344/7 264/345/12 265/346/12 -f 265/346/12 266/347/6 267/348/6 -f 267/348/6 268/349/11 269/350/11 -f 269/350/11 270/351/1 271/352/1 -f 271/352/1 272/353/8 257/337/8 -f 273/354/1 274/355/1 275/356/1 -f 276/357/10 275/358/10 274/359/10 -f 277/360/2 274/359/2 278/361/2 -f 279/362/4 278/361/4 273/363/4 -f 280/364/7 277/360/7 279/365/7 -f 281/366/1 282/367/1 283/368/1 -f 283/369/10 284/370/10 281/371/10 -f 281/371/6 285/372/6 286/373/6 -f 286/373/4 287/374/4 282/375/4 -f 285/372/7 288/376/7 287/377/7 -f 289/378/4 290/379/4 291/380/4 -f 292/381/1 291/382/1 290/383/1 -f 293/384/6 291/380/6 294/385/6 -f 295/386/10 294/385/10 292/387/10 -f 296/388/7 293/384/7 295/389/7 -f 3/3/1 11/14/1 1/1/1 -f 1/1/1 8/390/1 2/2/1 -f 2/2/1 5/5/1 3/3/1 -f 4/4/2 12/16/2 3/3/2 -f 5/5/3 2/8/3 6/6/3 -f 7/7/4 6/6/4 2/8/4 -f 8/10/5 1/391/5 9/11/5 -f 10/13/6 9/392/6 1/1/6 -f 6/17/7 7/393/7 9/15/7 -f 9/15/7 10/394/7 12/16/7 -f 12/16/7 4/4/7 6/17/7 -f 15/20/1 23/31/1 13/18/1 -f 13/18/1 20/395/1 14/19/1 -f 14/19/1 17/22/1 15/20/1 -f 16/21/2 24/33/2 15/20/2 -f 17/22/3 14/25/3 18/23/3 -f 19/24/4 18/23/4 14/25/4 -f 20/27/5 13/396/5 21/28/5 -f 22/30/6 21/397/6 13/18/6 -f 18/34/7 19/398/7 21/32/7 -f 21/32/7 22/399/7 24/33/7 -f 24/33/7 16/21/7 18/34/7 -f 27/37/1 35/48/1 25/35/1 -f 25/35/1 32/400/1 26/36/1 -f 26/36/1 29/39/1 27/37/1 -f 28/38/2 36/50/2 27/37/2 -f 29/39/3 26/42/3 30/40/3 -f 31/41/4 30/40/4 26/42/4 -f 32/44/5 25/401/5 33/45/5 -f 34/47/6 33/402/6 25/35/6 -f 30/51/7 31/403/7 33/49/7 -f 33/49/7 34/404/7 36/50/7 -f 36/50/7 28/38/7 30/51/7 -f 39/54/1 47/65/1 37/52/1 -f 37/52/1 44/405/1 38/53/1 -f 38/53/1 41/56/1 39/54/1 -f 40/55/2 48/67/2 39/54/2 -f 41/56/3 38/59/3 42/57/3 -f 43/58/4 42/57/4 38/59/4 -f 44/61/5 37/406/5 45/62/5 -f 46/64/6 45/407/6 37/52/6 -f 42/68/7 43/408/7 45/66/7 -f 45/66/7 46/409/7 48/67/7 -f 48/67/7 40/55/7 42/68/7 -f 51/71/1 59/82/1 49/69/1 -f 49/69/1 56/410/1 50/70/1 -f 50/70/1 53/73/1 51/71/1 -f 52/72/2 297/411/2 51/71/2 -f 53/73/3 50/76/3 54/74/3 -f 55/75/4 54/74/4 50/76/4 -f 56/78/5 49/412/5 57/79/5 -f 58/81/6 57/413/6 49/69/6 -f 62/85/1 70/96/1 60/83/1 -f 60/83/1 67/414/1 61/84/1 -f 61/84/1 64/87/1 62/85/1 -f 63/86/2 71/98/2 62/85/2 -f 64/87/3 61/90/3 65/88/3 -f 66/89/4 65/88/4 61/90/4 -f 67/92/5 60/415/5 68/93/5 -f 69/95/6 68/416/6 60/83/6 -f 65/99/7 66/417/7 68/97/7 -f 68/97/7 69/418/7 71/98/7 -f 71/98/7 63/86/7 65/99/7 -f 72/100/2 298/419/2 73/101/2 -f 74/102/3 77/105/3 75/103/3 -f 76/104/4 75/103/4 77/105/4 -f 78/106/5 81/109/5 79/107/5 -f 80/108/6 79/107/6 81/109/6 -f 83/111/1 299/420/1 84/112/1 -f 86/114/2 89/421/2 85/113/2 -f 84/112/3 300/422/3 87/115/3 -f 88/116/1 301/423/1 86/117/1 -f 90/119/1 302/424/1 91/120/1 -f 93/122/2 96/425/2 92/121/2 -f 91/120/3 303/426/3 94/123/3 -f 95/124/1 304/427/1 93/125/1 -f 97/127/1 305/428/1 98/128/1 -f 100/130/2 103/429/2 99/129/2 -f 98/128/3 306/430/3 101/131/3 -f 102/132/1 307/431/1 100/133/1 -f 104/135/1 308/432/1 105/136/1 -f 107/138/2 110/433/2 106/137/2 -f 105/136/3 309/434/3 108/139/3 -f 109/140/1 310/435/1 107/141/1 -f 111/143/1 311/436/1 112/144/1 -f 114/146/2 117/437/2 113/145/2 -f 112/144/3 312/438/3 115/147/3 -f 116/148/1 313/439/1 114/149/1 -f 118/151/1 314/440/1 119/152/1 -f 121/154/2 124/441/2 120/153/2 -f 119/152/3 315/442/3 122/155/3 -f 123/156/1 316/443/1 121/157/1 -f 125/159/1 128/162/1 126/160/1 -f 128/162/6 132/444/6 129/163/6 -f 130/164/5 317/445/5 126/160/5 -f 131/165/7 318/446/7 129/166/7 -f 133/168/1 136/171/1 134/169/1 -f 136/171/6 140/447/6 137/172/6 -f 138/173/5 319/448/5 134/169/5 -f 139/174/7 320/449/7 137/175/7 -f 141/177/1 144/180/1 142/178/1 -f 144/180/6 148/450/6 145/181/6 -f 146/182/5 321/451/5 142/178/5 -f 147/183/7 322/452/7 145/184/7 -f 149/186/1 152/189/1 150/187/1 -f 152/189/6 156/453/6 153/190/6 -f 154/191/5 323/454/5 150/187/5 -f 155/192/7 324/455/7 153/193/7 -f 157/195/1 160/198/1 158/196/1 -f 160/198/6 164/456/6 161/199/6 -f 162/200/5 325/457/5 158/196/5 -f 163/201/7 326/458/7 161/202/7 -f 165/204/1 168/207/1 166/205/1 -f 168/207/6 172/459/6 169/208/6 -f 170/209/5 327/460/5 166/205/5 -f 171/210/7 328/461/7 169/211/7 -f 173/213/8 179/462/8 174/214/8 -f 176/216/9 181/463/9 177/217/9 -f 177/219/2 181/464/2 174/220/2 -f 179/222/4 329/465/4 180/223/4 -f 181/225/10 330/466/10 182/226/10 -f 183/228/8 189/467/8 184/229/8 -f 186/231/9 191/468/9 187/232/9 -f 187/234/2 191/469/2 184/235/2 -f 189/237/4 331/470/4 190/238/4 -f 191/240/10 332/471/10 192/241/10 -f 193/243/11 199/472/11 194/244/11 -f 196/246/12 202/473/12 197/247/12 -f 193/249/6 202/474/6 196/250/6 -f 200/252/4 333/475/4 199/253/4 -f 201/255/10 334/476/10 202/256/10 -f 203/258/11 209/477/11 204/259/11 -f 206/261/12 212/478/12 207/262/12 -f 203/264/6 212/479/6 206/265/6 -f 210/267/4 335/480/4 209/268/4 -f 211/270/10 336/481/10 212/271/10 -f 213/273/13 221/482/13 214/274/8 -f 216/276/1 221/482/13 213/273/13 -f 219/280/10 213/282/10 215/278/10 -f 215/278/10 226/483/10 218/279/10 -f 219/280/10 222/484/10 217/281/10 -f 220/283/4 223/485/4 221/284/4 -f 222/286/7 219/290/14 223/287/14 -f 224/289/9 223/287/14 219/290/14 -f 225/293/4 214/486/4 221/284/4 -f 221/284/4 223/485/4 224/292/4 -f 225/294/2 224/289/9 218/291/9 -f 214/274/8 225/294/2 226/295/2 -f 227/296/6 242/312/11 228/297/11 -f 230/299/12 227/296/6 229/298/6 -f 232/301/7 230/299/12 231/300/12 -f 234/303/9 232/487/7 233/304/7 -f 236/306/2 234/303/9 235/305/9 -f 238/308/8 236/306/2 237/307/2 -f 240/310/1 238/308/8 239/309/8 -f 242/312/11 240/310/1 241/311/1 -f 243/313/15 250/336/11 244/314/11 -f 243/313/15 245/315/15 246/316/1 -f 250/320/10 243/322/10 248/318/10 -f 248/318/10 255/488/10 249/319/10 -f 247/321/10 253/489/10 248/318/10 -f 245/323/4 252/333/4 251/324/4 -f 252/326/16 248/329/16 253/327/7 -f 248/329/16 252/326/16 254/330/12 -f 245/323/4 244/490/4 256/332/4 -f 256/332/4 254/491/4 252/333/4 -f 255/331/12 254/330/12 256/334/6 -f 249/335/6 256/334/6 244/314/11 -f 257/337/8 272/353/8 258/338/2 -f 259/339/2 258/338/2 260/340/9 -f 261/341/9 260/340/9 262/342/7 -f 263/344/7 262/492/7 264/345/12 -f 265/346/12 264/345/12 266/347/6 -f 267/348/6 266/347/6 268/349/11 -f 269/350/11 268/349/11 270/351/1 -f 271/352/1 270/351/1 272/353/8 -f 273/354/1 278/493/1 274/355/1 -f 276/357/10 280/494/10 275/358/10 -f 277/360/2 276/357/2 274/359/2 -f 279/362/4 277/360/4 278/361/4 -f 280/364/7 276/357/7 277/360/7 -f 281/366/1 286/495/1 282/367/1 -f 283/369/10 288/496/10 284/370/10 -f 281/371/6 284/370/6 285/372/6 -f 286/373/4 285/372/4 287/374/4 -f 285/372/7 284/370/7 288/376/7 -f 289/378/4 296/497/4 290/379/4 -f 292/381/1 294/498/1 291/382/1 -f 293/384/6 289/378/6 291/380/6 -f 295/386/10 293/384/10 294/385/10 -f 296/388/7 289/378/7 293/384/7 -f 298/499/17 79/500/7 80/501/17 -f 298/502/17 82/503/18 73/504/18 -f 74/505/1 82/506/18 81/507/1 -f 298/499/17 72/508/7 79/500/7 -f 298/502/17 80/509/17 82/503/18 -f 74/505/1 73/510/18 82/506/18 +mtllib vehicle_door.mtl o Frame -v -3.437500 5.937500 0.187501 -v 3.437500 5.937500 0.187501 -v 0.000000 5.812500 0.187501 -v 3.437500 5.937500 -0.187500 -v -3.437500 5.937500 -0.187498 -v 0.000000 5.812500 -0.187499 -v 0.000000 5.812500 0.500001 -v 1.267639 5.560351 0.500001 -v 3.500000 6.000000 0.500001 +v -3.187500 0.000000 0.562501 +v -3.187500 0.125000 0.562501 +v -3.187500 0.000000 -0.562499 +v -3.187500 0.125000 -0.562499 +v 3.187500 0.000000 0.562499 +v 3.187500 0.125000 0.562499 +v 3.187500 0.000000 -0.562501 +v 3.187500 0.125000 -0.562501 +v -3.187500 0.125000 0.437501 +v 3.187500 0.125000 0.437499 +v -3.187500 0.125000 -0.437499 +v 3.187500 0.125000 -0.437501 +v -3.187500 0.187500 0.312501 +v 3.187500 0.187500 0.312499 +v -3.187500 0.187500 -0.312499 +v 3.187500 0.187500 -0.312501 +v -3.187500 0.187500 -0.187499 +v -3.187500 0.187500 0.187501 +v 3.187500 0.187500 -0.187501 +v 3.187500 0.187500 0.187499 +v -3.187500 0.062500 -0.187499 +v -3.187500 0.062500 0.187501 +v 3.187500 0.062500 -0.187501 +v 3.187500 0.062500 0.187499 +v -3.078888 3.324986 0.187501 +v -2.760456 4.093750 0.187501 +v 1.593750 5.260456 0.187500 +v 2.253902 4.753903 0.187499 +v 3.187500 2.500000 0.187499 +v -3.187500 0.000000 0.187501 +v 3.078888 3.324986 0.187499 +v 2.760456 4.093750 0.187499 +v -1.593750 5.260456 0.187500 +v 0.000000 5.687500 0.187500 +v -2.253902 4.753903 0.187501 +v 3.187500 0.000000 0.187499 +v -0.824985 5.578889 0.187500 +v -3.187500 2.500000 0.187501 +v 0.824986 5.578889 0.187500 +v 3.375000 5.812500 0.187499 +v 3.375000 0.000000 0.187499 +v -3.375000 0.000000 0.187501 +v -3.375000 5.812500 0.187501 +v 3.078888 3.324986 -0.187501 +v 2.760456 4.093750 -0.187501 +v -1.593750 5.260456 -0.187500 +v -2.253902 4.753903 -0.187499 +v -3.187500 2.500000 -0.187499 +v 3.187500 0.000000 -0.187501 +v -3.078888 3.324986 -0.187499 +v -2.760456 4.093750 -0.187499 +v 1.593750 5.260456 -0.187500 +v -0.000000 5.687500 -0.187500 +v 2.253902 4.753903 -0.187501 +v -3.187500 0.000000 -0.187499 +v 0.824985 5.578889 -0.187500 +v 3.187500 2.500000 -0.187501 +v -0.824986 5.578889 -0.187500 +v -3.375000 5.812500 -0.187499 +v -3.375000 0.000000 -0.187499 +v 3.375000 0.000000 -0.187501 +v 3.375000 5.812500 -0.187501 +v -3.375000 0.062500 -0.187499 +v -3.375000 0.062500 0.187501 +v 3.375000 0.062500 -0.187501 +v 3.375000 0.062500 0.187499 +v -3.500000 0.000000 0.500001 v -3.500000 6.000000 0.500001 -v -3.500000 0.000000 -0.500000 -v -3.500000 -0.000000 0.500000 -v -3.312500 -0.000000 0.187500 -v -3.312500 2.500000 0.500000 -v -3.312500 -0.000000 0.500000 -v -3.437500 0.000000 -0.187500 -v -3.437500 5.937500 0.187501 -v -3.437500 -0.000000 0.187500 -v -3.312500 0.000000 -0.500000 -v -3.312500 2.500000 -0.187500 -v -3.312500 0.000000 -0.187500 -v -3.060351 3.767639 -0.499999 -v -3.312500 2.500000 -0.500000 -v -2.342291 4.842291 -0.499999 -v -3.060351 3.767639 -0.187499 -v -1.267639 5.560351 -0.499999 -v -2.342291 4.842291 -0.187499 -v 0.000000 5.812500 -0.499999 -v -1.267639 5.560351 -0.187499 -v 1.267639 5.560351 -0.499999 -v 0.000000 5.812500 -0.187499 -v 2.342291 4.842291 -0.499999 -v 1.267639 5.560351 -0.187499 -v 3.060351 3.767639 -0.187499 -v 2.342291 4.842291 -0.187499 -v 3.312500 2.500000 -0.500000 -v 3.312500 2.500000 -0.187500 -v 3.312500 0.000000 -0.187500 -v 3.437500 0.000000 -0.187500 -v 3.437500 5.937500 0.187501 -v 3.437500 5.937500 -0.187499 -v -3.437500 5.937500 -0.187499 -v 3.312500 2.500000 0.187500 -v 3.312500 -0.000000 0.500000 -v 3.312500 2.500000 0.500000 -v 3.060351 3.767639 0.187501 -v 3.060351 3.767639 0.500001 -v 2.342291 4.842291 0.187501 -v 2.342291 4.842291 0.500001 -v 1.267639 5.560351 0.187501 -v 0.000000 5.812500 0.187501 -v -1.267639 5.560351 0.500001 -v -1.267639 5.560351 0.187501 -v -2.342291 4.842291 0.500001 -v -2.342291 4.842291 0.187501 -v -3.060351 3.767639 0.500001 -v -3.060351 3.767639 0.187501 -v -3.312500 2.500000 0.187500 -v 3.500000 0.000000 -0.500000 -v 3.500000 -0.000000 0.500000 -v -3.500000 6.000000 -0.499999 -v 3.500000 6.000000 -0.499999 -v 3.312500 0.187500 -0.312500 -v -3.312500 0.187500 -0.187500 -v 3.312500 0.187500 -0.187500 -v -3.312500 0.000000 -0.500000 -v -3.312500 0.187500 -0.312500 -v -3.312500 0.187500 0.312500 -v 3.312500 -0.000000 0.500000 -v 3.312500 0.187500 0.312500 -v 3.312500 0.187500 0.187500 -v -3.312500 0.062500 0.187500 -v -3.312500 0.187500 0.187500 -v 3.312500 0.062500 -0.187500 -v 3.500000 -0.000000 0.500000 -v -3.500000 0.000000 -0.500000 -v 3.500000 0.000000 -0.500000 -v -3.437500 0.062500 0.187500 -v 3.437500 0.062500 -0.187500 -v -3.437500 0.062500 -0.187500 -v -1.267639 5.560351 0.562501 -v 0.000000 5.812500 0.500001 -v 0.000000 5.812500 0.562501 -v -2.342291 4.842291 0.562501 -v -1.267639 5.560351 0.500001 -v -3.060351 3.767639 0.562501 -v -2.342291 4.842291 0.500001 -v -3.312500 2.500000 0.562500 -v -3.060351 3.767639 0.500001 -v -3.312500 2.500000 0.500000 -v -3.312500 -0.000000 0.562500 -v -3.312500 -0.000000 0.500000 -v -3.437500 -0.000000 0.562500 -v -3.437500 2.500000 0.562500 -v -3.437500 -0.000000 0.500000 -v -3.175836 3.815475 0.500001 -v -3.437500 2.500000 0.500000 -v -3.175836 3.815475 0.562501 -v -2.430680 4.930679 0.500001 -v -2.430680 4.930679 0.562501 -v -1.315474 5.675836 0.500001 -v -1.315474 5.675836 0.562501 -v 0.000000 5.937500 0.500001 -v 1.267639 5.560351 0.562501 -v 0.000000 5.937500 0.562501 -v 1.315474 5.675836 0.500001 -v 1.267639 5.560351 0.500001 -v 2.342291 4.842291 0.500001 -v 2.342291 4.842291 0.562501 -v 1.315474 5.675836 0.562501 -v 3.060351 3.767639 0.500001 -v 3.060351 3.767639 0.562501 -v 3.175836 3.815475 0.562501 -v 2.430680 4.930679 0.562501 -v 2.430680 4.930679 0.500001 -v 3.175836 3.815475 0.500001 -v 3.437500 2.500000 0.500000 -v 3.312500 2.500000 0.562500 -v 3.437500 -0.000000 0.562500 -v 3.437500 -0.000000 0.500000 -v 3.437500 2.500000 0.562500 -v 3.312500 -0.000000 0.562500 -v 3.312500 2.500000 0.500000 -v 3.312500 -0.000000 0.500000 -v 1.267639 5.560351 -0.562499 -v 0.000000 5.812500 -0.499999 -v 0.000000 5.812500 -0.562499 -v 2.342291 4.842291 -0.562499 -v 1.267639 5.560351 -0.499999 -v 3.060351 3.767639 -0.562499 -v 2.342291 4.842291 -0.499999 -v 3.312500 2.500000 -0.562500 -v 3.060351 3.767639 -0.499999 -v 3.312500 2.500000 -0.500000 -v 3.312500 0.000000 -0.562500 -v 3.312500 0.000000 -0.500000 -v 3.437500 0.000000 -0.562501 -v 3.437500 2.500000 -0.562500 -v 3.437500 0.000000 -0.500001 -v 3.175836 3.815475 -0.500000 -v 3.437500 2.500000 -0.500000 -v 3.175836 3.815475 -0.562500 -v 2.430680 4.930679 -0.499999 -v 2.430680 4.930679 -0.562499 -v 1.315474 5.675836 -0.499999 -v 1.315474 5.675836 -0.562499 -v 0.000000 5.937500 -0.499999 -v -1.267639 5.560351 -0.562499 -v 0.000000 5.937500 -0.562499 -v -1.315475 5.675836 -0.499999 -v -1.267639 5.560351 -0.499999 +v 3.500000 0.000000 0.499999 +v 3.500000 6.000000 0.499999 +v -1.593750 5.260456 0.500000 +v -0.824985 5.578888 0.500000 +v 0.000000 5.687500 0.500000 +v 0.824986 5.578888 0.500000 +v 2.253903 4.753902 0.499999 +v 2.760456 4.093750 0.499999 +v 3.187500 2.500000 0.499999 +v 3.078888 3.324986 0.499999 +v 1.593750 5.260456 0.500000 +v -3.187500 0.000000 0.500001 +v -3.187500 2.500000 0.500001 +v -3.078888 3.324986 0.500001 +v -2.760456 4.093750 0.500001 +v 3.187500 0.000000 0.499999 +v -2.253902 4.753902 0.500001 +v -3.078888 3.324986 0.187501 +v -2.760456 4.093750 0.187501 +v 1.593750 5.260456 0.187500 +v 2.253902 4.753903 0.187499 +v 3.187500 2.500000 0.187499 +v -3.187500 0.000000 0.187501 +v 3.078888 3.324986 0.187499 +v 2.760456 4.093750 0.187499 +v -1.593750 5.260456 0.187500 +v 0.000000 5.687500 0.187500 +v -2.253902 4.753903 0.187501 +v 3.187500 0.000000 0.187499 +v -0.824985 5.578889 0.187500 +v -3.187500 2.500000 0.187501 +v 0.824986 5.578889 0.187500 +v 3.500000 0.000000 -0.500002 +v 3.500000 6.000000 -0.500002 +v -3.500000 0.000000 -0.499998 +v -3.500000 6.000000 -0.499998 +v 1.593750 5.260456 -0.500000 +v 0.824985 5.578888 -0.500000 +v -0.000000 5.687500 -0.500000 +v -0.824986 5.578888 -0.500000 +v -2.253903 4.753902 -0.499999 +v -2.760456 4.093750 -0.499999 +v -3.187500 2.500000 -0.499999 +v -3.078888 3.324986 -0.499999 +v -1.593750 5.260456 -0.500000 +v 3.187500 0.000000 -0.500001 +v 3.187500 2.500000 -0.500001 +v 3.078888 3.324986 -0.500001 +v 2.760456 4.093750 -0.500001 +v -3.187500 0.000000 -0.499999 +v 2.253902 4.753902 -0.500001 +v 3.078888 3.324986 -0.187501 +v 2.760456 4.093750 -0.187501 +v -1.593750 5.260456 -0.187500 +v -2.253902 4.753903 -0.187499 +v -3.187500 2.500000 -0.187499 +v 3.187500 0.000000 -0.187501 +v -3.078888 3.324986 -0.187499 +v -2.760456 4.093750 -0.187499 +v 1.593750 5.260456 -0.187500 +v -0.000000 5.687500 -0.187500 +v 2.253902 4.753903 -0.187501 +v -3.187500 0.000000 -0.187499 +v 0.824985 5.578889 -0.187500 +v 3.187500 2.500000 -0.187501 +v -0.824986 5.578889 -0.187500 +v -3.187500 0.000000 0.500001 +v -3.187500 0.000000 -0.499999 +v 3.187500 0.000000 0.499999 +v 3.187500 0.000000 -0.500001 +v -0.000000 5.687500 -0.500000 +v -0.000000 5.687500 -0.562500 +v 3.187500 0.000000 -0.562501 +v 3.187500 0.000000 -0.500001 +v 3.187500 2.500000 -0.500001 +v 3.187500 2.500000 -0.562501 +v 3.078888 3.324986 -0.500001 +v 3.078888 3.324986 -0.562501 +v 2.760456 4.093750 -0.500001 +v 2.760456 4.093750 -0.562501 +v 2.253902 4.753903 -0.500001 +v 2.253902 4.753902 -0.562501 +v 1.593750 5.260456 -0.500000 +v 1.593750 5.260456 -0.562500 +v 0.824985 5.578889 -0.500000 +v 0.824985 5.578888 -0.562500 +v -0.000000 5.812500 -0.500000 +v -0.000000 5.812500 -0.562500 +v 3.312232 2.508175 -0.500001 +v 3.312500 0.000000 -0.500001 +v 3.312500 0.000000 -0.562501 +v 3.312232 2.508175 -0.562501 +v 3.199629 3.357338 -0.500001 +v 3.199629 3.357338 -0.562501 +v 2.868709 4.156250 -0.500001 +v 2.868709 4.156250 -0.562501 +v 2.342291 4.842291 -0.500001 +v 2.342291 4.842291 -0.562501 +v 1.656250 5.368710 -0.500000 +v 1.656250 5.368709 -0.562500 +v 0.857338 5.699630 -0.500000 +v 0.857338 5.699629 -0.562500 +v -0.000000 5.687500 -0.500000 +v -0.000000 5.687500 -0.562500 +v -3.187500 0.000000 -0.562499 +v -3.187500 0.000000 -0.499999 +v -3.187500 2.500000 -0.499999 +v -3.187500 2.500000 -0.562499 +v -3.078888 3.324986 -0.499999 +v -3.078888 3.324986 -0.562499 +v -2.760456 4.093750 -0.499999 +v -2.760456 4.093750 -0.562499 +v -2.253903 4.753903 -0.499999 +v -2.253903 4.753902 -0.562499 +v -1.593750 5.260456 -0.500000 +v -1.593750 5.260456 -0.562500 +v -0.824986 5.578889 -0.500000 +v -0.824986 5.578888 -0.562500 +v -0.000000 5.812500 -0.500000 +v -0.000000 5.812500 -0.562500 +v -3.312232 2.508175 -0.499999 +v -3.312500 0.000000 -0.499999 +v -3.312500 0.000000 -0.562499 +v -3.312232 2.508175 -0.562499 +v -3.199629 3.357338 -0.499999 +v -3.199629 3.357338 -0.562499 +v -2.868710 4.156250 -0.499999 +v -2.868710 4.156250 -0.562499 v -2.342291 4.842291 -0.499999 v -2.342291 4.842291 -0.562499 -v -1.315475 5.675836 -0.562499 -v -3.060351 3.767639 -0.499999 -v -3.060351 3.767639 -0.562499 -v -3.175836 3.815475 -0.562499 -v -2.430680 4.930679 -0.562499 -v -2.430680 4.930679 -0.499999 -v -3.175836 3.815475 -0.499999 -v -3.437500 2.500000 -0.499999 -v -3.312500 2.500000 -0.562499 -v -3.437500 0.000000 -0.562499 -v -3.437500 0.000000 -0.499999 -v -3.437500 2.500000 -0.562499 -v -3.312500 0.000000 -0.562500 -v -3.312500 2.500000 -0.499999 -v -3.312500 0.000000 -0.499999 -v -3.312500 2.500000 0.187500 -v -3.312500 -0.000000 0.187500 -v -3.437500 -0.000000 0.187500 -v 3.437500 -0.000000 0.187500 -v 3.312500 -0.000000 0.187500 -v 3.312500 2.500000 0.187500 -v -3.060351 3.767639 0.187501 -v 3.060351 3.767639 0.187501 -v 2.342291 4.842291 0.187501 -v -2.342291 4.842291 0.187501 -v -1.267639 5.560351 0.187501 -v 1.267639 5.560351 0.187501 -v 3.312500 2.500000 -0.187500 -v 3.312500 0.000000 -0.187501 -v 3.437500 0.000000 -0.187501 -v -3.437500 0.000000 -0.187499 -v -3.312500 0.000000 -0.187499 -v -3.312500 2.500000 -0.187499 -v 3.060351 3.767639 -0.187499 -v -3.060351 3.767639 -0.187499 -v -2.342291 4.842291 -0.187499 -v 2.342291 4.842291 -0.187499 -v 1.267639 5.560351 -0.187499 -v -1.267639 5.560351 -0.187499 -v 3.060351 3.767639 -0.499999 -v 3.312500 0.000000 -0.500000 -v 3.437500 -0.000000 0.187500 -v 3.312500 -0.000000 0.187500 -v 3.312500 0.000000 -0.500000 -v -3.312500 -0.000000 0.500000 -v 3.312500 0.062500 0.187500 -v -3.312500 0.062500 -0.187500 -v -3.500000 -0.000000 0.500000 -v 3.437500 0.062500 0.187500 -vt 0.989691 1.000000 -vt 0.706186 1.000000 -vt 0.847938 0.994845 -vt 0.989691 0.752577 -vt 0.706186 0.752577 -vt 0.847938 0.747423 -vt 0.185567 0.381445 -vt 0.237831 0.371048 -vt 0.329897 0.389175 -vt 0.041237 0.389175 -vt 0.000000 0.141753 -vt 0.041237 0.141753 -vt 0.675258 0.226804 -vt 0.662371 0.329897 -vt 0.662371 0.226804 -vt 0.690722 0.226804 -vt 0.675258 0.471649 -vt 0.675258 0.226804 -vt 0.703608 0.226804 -vt 0.690722 0.329897 -vt 0.690722 0.226804 -vt 0.703608 0.386598 -vt 0.703608 0.329897 -vt 0.703608 0.443299 -vt 0.690722 0.386598 -vt 0.703608 0.500000 -vt 0.690722 0.443299 -vt 0.703608 0.556701 -vt 0.690722 0.500000 -vt 0.703608 0.613402 -vt 0.690722 0.556701 -vt 0.703608 0.670103 -vt 0.690722 0.613402 -vt 0.690722 0.726804 -vt 0.690722 0.670103 -vt 0.703608 0.783505 -vt 0.690722 0.783505 -vt 0.690722 0.886598 -vt 0.690722 1.000000 -vt 0.675258 0.755155 -vt 0.690722 0.755155 -vt 0.690722 0.471649 -vt 0.675258 0.783505 -vt 0.662371 0.886598 -vt 0.662371 0.783505 -vt 0.675258 0.726804 -vt 0.662371 0.726804 -vt 0.675258 0.670103 -vt 0.662371 0.670103 -vt 0.662371 0.613402 -vt 0.675258 0.613402 -vt 0.662371 0.556701 -vt 0.675258 0.556701 -vt 0.662371 0.500000 -vt 0.675258 0.500000 -vt 0.662371 0.443299 -vt 0.675258 0.443299 -vt 0.662371 0.386598 -vt 0.675258 0.386598 -vt 0.675258 0.329897 -vt 0.371134 0.141753 -vt 0.329897 0.141753 -vt 0.515464 0.381445 -vt 0.567728 0.371048 -vt 0.659794 0.389175 -vt 0.041237 0.430412 -vt 0.329897 0.430412 -vt 0.280928 0.505155 -vt 0.007732 0.500000 -vt 0.280928 0.500000 -vt 0.007732 0.515464 -vt 0.007732 0.505155 -vt 0.007732 0.469072 -vt 0.280928 0.458763 -vt 0.280928 0.469072 -vt 0.280928 0.474227 -vt 0.007732 0.479381 -vt 0.007732 0.474227 -vt 0.280928 0.494845 -vt 0.288660 0.556701 -vt 0.000000 0.515464 -vt 0.288660 0.515464 -vt 0.002577 0.479381 -vt 0.286082 0.494845 -vt 0.002577 0.494845 -vt 0.268041 0.448454 -vt 0.322165 0.445876 -vt 0.322165 0.448454 -vt 0.213918 0.448454 -vt 0.268041 0.445876 -vt 0.159794 0.448454 -vt 0.213918 0.445876 -vt 0.105670 0.448454 -vt 0.159794 0.445876 -vt 0.105670 0.445876 -vt 0.002577 0.448454 -vt 0.002577 0.445876 -vt 0.002577 0.453608 -vt 0.158810 0.448454 -vt 0.105670 0.453608 -vt 0.106654 0.448454 -vt 0.002577 0.456186 -vt 0.159794 0.456186 -vt 0.105670 0.456186 -vt 0.159794 0.453608 -vt 0.213918 0.456186 -vt 0.160778 0.448454 -vt 0.213918 0.453608 -vt 0.268041 0.456186 -vt 0.214902 0.448454 -vt 0.268041 0.453608 -vt 0.322165 0.456186 -vt 0.321181 0.448454 -vt 0.269025 0.448454 -vt 0.375305 0.448454 -vt 0.322165 0.453608 -vt 0.323149 0.448454 -vt 0.376289 0.456186 -vt 0.376289 0.445876 -vt 0.376289 0.448454 -vt 0.430412 0.445876 -vt 0.430412 0.448454 -vt 0.429428 0.448454 -vt 0.376289 0.453608 -vt 0.377273 0.448454 -vt 0.484536 0.445876 -vt 0.484536 0.448454 -vt 0.431396 0.448454 -vt 0.484536 0.453608 -vt 0.430412 0.453608 -vt 0.430412 0.456186 -vt 0.484536 0.456186 -vt 0.538660 0.456186 -vt 0.537676 0.448454 -vt 0.485520 0.448454 -vt 0.641753 0.453608 -vt 0.641753 0.456186 -vt 0.538660 0.453608 -vt 0.641753 0.448454 -vt 0.538660 0.445876 -vt 0.538660 0.448454 -vt 0.641753 0.445876 -vt 0.644330 0.453608 -vt 0.644330 0.448454 -vt 0.000000 0.448454 -vt 0.000000 0.453608 -vt 0.268041 0.435567 -vt 0.322165 0.432990 -vt 0.322165 0.435567 -vt 0.213918 0.435567 -vt 0.268041 0.432990 -vt 0.159794 0.435567 -vt 0.213918 0.432990 -vt 0.105670 0.435567 -vt 0.159794 0.432990 -vt 0.105670 0.432990 -vt 0.002577 0.435567 -vt 0.002577 0.432990 -vt 0.002577 0.440722 -vt 0.158810 0.435567 -vt 0.105670 0.440722 -vt 0.106654 0.435567 -vt 0.002577 0.443299 -vt 0.159794 0.443299 -vt 0.105670 0.443299 -vt 0.159794 0.440722 -vt 0.213918 0.443299 -vt 0.160778 0.435567 -vt 0.213918 0.440722 -vt 0.268041 0.443299 -vt 0.267057 0.435567 -vt 0.214902 0.435567 -vt 0.268041 0.440722 -vt 0.322165 0.443299 -vt 0.321181 0.435567 -vt 0.269025 0.435567 -vt 0.375305 0.435567 -vt 0.322165 0.440722 -vt 0.323149 0.435567 -vt 0.376289 0.443299 -vt 0.376289 0.432990 -vt 0.376289 0.435567 -vt 0.430412 0.432990 -vt 0.430412 0.435567 -vt 0.429428 0.435567 -vt 0.376289 0.440722 -vt 0.377273 0.435567 -vt 0.484536 0.432990 -vt 0.484536 0.435567 -vt 0.431396 0.435567 -vt 0.484536 0.440722 -vt 0.430412 0.440722 -vt 0.430412 0.443299 -vt 0.484536 0.443299 -vt 0.538660 0.443299 -vt 0.537676 0.435567 -vt 0.485520 0.435567 -vt 0.641753 0.440722 -vt 0.641753 0.443299 -vt 0.538660 0.440722 -vt 0.641753 0.435567 -vt 0.538660 0.432990 -vt 0.538660 0.435567 -vt 0.641753 0.432990 -vt 0.644330 0.435567 -vt 0.000000 0.440722 -vt 0.984536 0.858248 -vt 0.984536 0.755155 -vt 0.989691 0.755155 -vt 0.706186 0.755155 -vt 0.711340 0.755155 -vt 0.711340 0.858248 -vt 0.974138 0.910521 -vt 0.721738 0.910522 -vt 0.751349 0.954837 -vt 0.944527 0.954837 -vt 0.900212 0.984447 -vt 0.795664 0.984447 -vt 0.984536 0.610825 -vt 0.984536 0.507732 -vt 0.989691 0.507732 -vt 0.706186 0.507732 -vt 0.711340 0.507732 -vt 0.711340 0.610825 -vt 0.974138 0.663099 -vt 0.721738 0.663099 -vt 0.751349 0.707414 -vt 0.944527 0.707414 -vt 0.900212 0.737025 -vt 0.795664 0.737025 -vt 0.048969 0.141753 -vt 0.048969 0.244845 -vt 0.322165 0.141753 -vt 0.322165 0.244845 -vt 0.059390 0.297130 -vt 0.088996 0.341441 -vt 0.311744 0.297130 -vt 0.282138 0.341441 -vt 0.133303 0.371048 -vt -0.000000 0.389175 -vt 0.703608 0.726804 -vt 0.703608 0.886598 -vt 0.675258 1.000000 -vt 0.675258 0.886598 -vt 0.371134 0.389175 -vt 0.378866 0.141780 -vt 0.378866 0.244862 -vt 0.652062 0.141780 -vt 0.659794 0.141780 -vt 0.652062 0.244862 -vt 0.389287 0.297130 -vt 0.418893 0.341440 -vt 0.641641 0.297130 -vt 0.612035 0.341441 -vt 0.463200 0.371048 -vt 0.280928 0.515464 -vt 0.007732 0.458763 -vt 0.280928 0.479381 -vt 0.007732 0.494845 -vt -0.000000 0.556701 -vt 0.286082 0.479381 -vt 0.212933 0.448454 -vt 0.267057 0.448454 -vt 0.483552 0.448454 -vt 0.212933 0.435567 -vt 0.483552 0.435567 -vt 0.644330 0.440722 -vt 0.000000 0.435567 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn -1.0000 -0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -vn 0.9952 -0.0980 0.0000 -vn 0.9239 -0.3827 0.0000 -vn 0.7071 -0.7071 0.0000 -vn 0.3827 -0.9239 0.0000 -vn 0.0000 -1.0000 0.0000 -vn -0.3827 -0.9239 0.0000 -vn -0.7071 -0.7071 0.0000 -vn -0.9239 -0.3827 0.0000 -vn -0.9952 -0.0980 0.0000 -vn 0.0000 1.0000 0.0000 -vn 0.0000 0.7071 -0.7071 -vn 0.0000 0.7071 0.7071 -vn -0.9952 0.0980 -0.0000 -vn -0.9239 0.3827 0.0000 -vn -0.7071 0.7071 0.0000 -vn -0.3827 0.9239 0.0000 -vn 0.3827 0.9239 0.0000 -vn 0.7071 0.7071 0.0000 -vn 0.9239 0.3827 0.0000 -vn 0.9952 0.0980 0.0000 -vn -0.9952 -0.0981 0.0000 -vn 0.9952 0.0981 -0.0000 +v -1.656250 5.368710 -0.499999 +v -1.656250 5.368709 -0.562500 +v -0.857338 5.699630 -0.500000 +v -0.857338 5.699629 -0.562500 +v 0.000000 5.687500 0.500000 +v 0.000000 5.687500 0.562500 +v 3.187500 0.000000 0.562499 +v 3.187500 0.000000 0.499999 +v 3.187500 2.500000 0.499999 +v 3.187500 2.500000 0.562499 +v 3.078888 3.324986 0.499999 +v 3.078888 3.324986 0.562499 +v 2.760456 4.093750 0.499999 +v 2.760456 4.093750 0.562499 +v 2.253903 4.753903 0.499999 +v 2.253903 4.753902 0.562499 +v 1.593750 5.260456 0.500000 +v 1.593750 5.260456 0.562500 +v 0.824986 5.578889 0.500000 +v 0.824986 5.578888 0.562500 +v 0.000000 5.812500 0.500000 +v 0.000000 5.812500 0.562500 +v 3.312232 2.508175 0.499999 +v 3.312500 0.000000 0.499999 +v 3.312500 0.000000 0.562499 +v 3.312232 2.508175 0.562499 +v 3.199629 3.357338 0.499999 +v 3.199629 3.357338 0.562499 +v 2.868710 4.156250 0.499999 +v 2.868710 4.156250 0.562499 +v 2.342291 4.842291 0.499999 +v 2.342291 4.842291 0.562499 +v 1.656250 5.368710 0.499999 +v 1.656250 5.368709 0.562500 +v 0.857338 5.699630 0.500000 +v 0.857338 5.699629 0.562500 +v 0.000000 5.687500 0.500000 +v 0.000000 5.687500 0.562500 +v -3.187500 0.000000 0.562501 +v -3.187500 0.000000 0.500001 +v -3.187500 2.500000 0.500001 +v -3.187500 2.500000 0.562501 +v -3.078888 3.324986 0.500001 +v -3.078888 3.324986 0.562501 +v -2.760456 4.093750 0.500001 +v -2.760456 4.093750 0.562501 +v -2.253902 4.753903 0.500001 +v -2.253902 4.753902 0.562501 +v -1.593750 5.260456 0.500000 +v -1.593750 5.260456 0.562500 +v -0.824985 5.578889 0.500000 +v -0.824985 5.578888 0.562500 +v 0.000000 5.812500 0.500000 +v 0.000000 5.812500 0.562500 +v -3.312232 2.508175 0.500001 +v -3.312500 0.000000 0.500001 +v -3.312500 0.000000 0.562501 +v -3.312232 2.508175 0.562501 +v -3.199629 3.357338 0.500001 +v -3.199629 3.357338 0.562501 +v -2.868709 4.156250 0.500001 +v -2.868709 4.156250 0.562501 +v -2.342291 4.842291 0.500001 +v -2.342291 4.842291 0.562501 +v -1.656250 5.368710 0.500000 +v -1.656250 5.368709 0.562500 +v -0.857338 5.699630 0.500000 +v -0.857338 5.699629 0.562500 +vn -0.0000 0.8944 0.4472 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 0.8944 -0.4472 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.2588 -0.9659 -0.0000 +vn -0.5000 -0.8660 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn 0.9659 -0.2588 -0.0000 +vn 0.9979 -0.0654 -0.0000 +vn 0.8660 -0.5000 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vn 0.5000 -0.8660 -0.0000 +vn 0.2588 -0.9659 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.9979 -0.0654 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.9659 -0.2588 -0.0000 +vn -0.8660 -0.5000 -0.0000 +vn -0.1305 -0.9914 -0.0000 +vn 0.9978 0.0659 -0.0000 +vn 0.9658 0.2593 -0.0000 +vn 0.8660 0.5000 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.5000 0.8660 -0.0000 +vn 0.2588 0.9659 -0.0000 +vn 0.1305 0.9914 -0.0000 +vn 1.0000 0.0001 -0.0000 +vn 0.1305 -0.9914 -0.0000 +vn -0.9978 0.0659 -0.0000 +vn -0.9658 0.2593 -0.0000 +vn -0.8660 0.5000 -0.0000 +vn -0.7071 0.7071 -0.0000 +vn -0.5000 0.8660 -0.0000 +vn -0.2588 0.9659 -0.0000 +vn -0.1305 0.9914 -0.0000 +vn -1.0000 0.0001 -0.0000 +vt 0.156977 0.284884 +vt 0.162791 0.581395 +vt 0.156977 0.581395 +vt 0.226744 0.284884 +vt 0.220930 0.581395 +vt 0.220930 0.284884 +vt 0.209302 0.284884 +vt 0.215116 0.581395 +vt 0.209302 0.581395 +vt 0.151163 0.284884 +vt 0.145349 0.581395 +vt 0.145349 0.284884 +vt 0.093023 0.284884 +vt 0.093023 0.581395 +vt 0.151163 0.581395 +vt 0.215116 0.284884 +vt 0.168605 0.284884 +vt 0.168605 0.581395 +vt 0.203488 0.581395 +vt 0.203488 0.284884 +vt 0.197674 0.284884 +vt 0.197674 0.581395 +vt 0.174419 0.581395 +vt 0.313954 0.610466 +vt 0.000000 0.610465 +vt 0.156977 0.604652 +vt 0.627907 0.610466 +vt 0.313954 0.610465 +vt 0.470930 0.604652 +vt 0.313953 0.610465 +vt 0.000000 0.627907 +vt 0.000000 0.610465 +vt 0.174419 0.590116 +vt 0.191860 0.276163 +vt 0.191860 0.590116 +vt 0.372093 0.953488 +vt 0.046512 0.953488 +vt 0.209302 0.938953 +vt 0.302326 0.863372 +vt 0.287791 0.901163 +vt 0.302326 0.901163 +vt 0.302326 0.825581 +vt 0.287791 0.863372 +vt 0.302326 0.787791 +vt 0.287791 0.825581 +vt 0.130814 0.712209 +vt 0.116279 0.674419 +vt 0.130814 0.674419 +vt 0.130814 0.750000 +vt 0.116279 0.712209 +vt 0.130814 0.787791 +vt 0.116279 0.750000 +vt 0.116279 0.825581 +vt 0.116279 0.787791 +vt 0.130814 0.863372 +vt 0.130814 0.825581 +vt 0.130814 0.901163 +vt 0.116279 0.863372 +vt 0.075581 0.790698 +vt 0.061047 0.674419 +vt 0.075581 0.674419 +vt 0.357558 0.790698 +vt 0.343023 0.674419 +vt 0.343023 0.790698 +vt 0.302326 0.712209 +vt 0.287791 0.674419 +vt 0.287791 0.712209 +vt 0.302326 0.750000 +vt 0.287791 0.750000 +vt 0.287791 0.787791 +vt 0.744186 0.953488 +vt 0.418605 0.953488 +vt 0.581395 0.938953 +vt 0.046512 0.953488 +vt 0.000000 0.674419 +vt 0.046512 0.674419 +vt 0.502907 0.863372 +vt 0.488372 0.901163 +vt 0.502907 0.901163 +vt 0.502907 0.825581 +vt 0.488372 0.863372 +vt 0.502907 0.787791 +vt 0.488372 0.825581 +vt 0.674419 0.712209 +vt 0.659884 0.674419 +vt 0.674419 0.674419 +vt 0.659884 0.750000 +vt 0.659884 0.712209 +vt 0.674419 0.787791 +vt 0.674419 0.750000 +vt 0.659884 0.825581 +vt 0.659884 0.787791 +vt 0.674419 0.863372 +vt 0.674419 0.825581 +vt 0.674419 0.901163 +vt 0.659884 0.863372 +vt 0.729651 0.790698 +vt 0.715116 0.674419 +vt 0.729651 0.674419 +vt 0.447674 0.790698 +vt 0.433140 0.674419 +vt 0.433140 0.790698 +vt 0.502907 0.712209 +vt 0.488372 0.674419 +vt 0.488372 0.712209 +vt 0.502907 0.750000 +vt 0.488372 0.750000 +vt 0.488372 0.787791 +vt 0.372093 1.000000 +vt 0.046512 1.000000 +vt 0.372093 0.953488 +vt 0.418605 0.674419 +vt 0.418605 0.953488 +vt 0.046512 0.627907 +vt 0.372093 0.674419 +vt 0.357558 0.627907 +vt 0.372093 0.627907 +vt 0.802326 0.755814 +vt 0.799419 0.796512 +vt 0.799419 0.755814 +vt 0.802326 0.796512 +vt 0.799419 0.837209 +vt 0.802326 0.837209 +vt 0.799419 0.877907 +vt 0.802326 0.877907 +vt 0.799419 0.918605 +vt 0.802326 0.918605 +vt 0.799419 0.959302 +vt 0.802326 0.959302 +vt 0.799419 1.000000 +vt 0.799419 0.639535 +vt 0.790698 0.755814 +vt 0.793605 0.796512 +vt 0.790698 0.796512 +vt 0.793605 0.837209 +vt 0.790698 0.837209 +vt 0.793605 0.877907 +vt 0.790698 0.877907 +vt 0.793605 0.918605 +vt 0.790698 0.918605 +vt 0.793605 0.959302 +vt 0.790698 0.959302 +vt 0.790698 1.000000 +vt 0.793605 0.639535 +vt 0.793605 0.755814 +vt 0.793605 0.636628 +vt 0.799419 0.636628 +vt 0.787791 0.755814 +vt 0.784884 0.796512 +vt 0.787791 0.796512 +vt 0.784884 0.837209 +vt 0.787791 0.837209 +vt 0.784884 0.877907 +vt 0.787791 0.877907 +vt 0.784884 0.918605 +vt 0.787791 0.918605 +vt 0.784884 0.959302 +vt 0.787791 0.959302 +vt 0.784884 1.000000 +vt 0.787791 1.000000 +vt 0.784884 0.639535 +vt 0.784884 0.755814 +vt 0.776163 0.755814 +vt 0.779070 0.796512 +vt 0.779070 0.755814 +vt 0.776163 0.796512 +vt 0.779070 0.837209 +vt 0.776163 0.837209 +vt 0.779070 0.877907 +vt 0.776163 0.877907 +vt 0.779070 0.918605 +vt 0.776163 0.918605 +vt 0.779070 0.959302 +vt 0.776163 1.000000 +vt 0.776163 0.959302 +vt 0.779070 0.639535 +vt 0.779070 0.636628 +vt 0.784884 0.636628 +vt 0.773256 0.755814 +vt 0.770349 0.796512 +vt 0.773256 0.796512 +vt 0.770349 0.837209 +vt 0.773256 0.837209 +vt 0.770349 0.877907 +vt 0.773256 0.877907 +vt 0.770349 0.918605 +vt 0.773256 0.918605 +vt 0.770349 0.959302 +vt 0.773256 0.959302 +vt 0.770349 1.000000 +vt 0.773256 1.000000 +vt 0.770349 0.639535 +vt 0.770349 0.755814 +vt 0.761628 0.755814 +vt 0.764535 0.796512 +vt 0.764535 0.755814 +vt 0.761628 0.796512 +vt 0.764535 0.837209 +vt 0.761628 0.837209 +vt 0.764535 0.877907 +vt 0.761628 0.877907 +vt 0.764535 0.918605 +vt 0.761628 0.918605 +vt 0.764535 0.959302 +vt 0.761628 1.000000 +vt 0.761628 0.959302 +vt 0.764535 0.639535 +vt 0.764535 0.636628 +vt 0.770349 0.636628 +vt 0.758721 0.755814 +vt 0.755814 0.796512 +vt 0.755814 0.755814 +vt 0.758721 0.796512 +vt 0.755814 0.837209 +vt 0.758721 0.837209 +vt 0.755814 0.877907 +vt 0.758721 0.877907 +vt 0.755814 0.918605 +vt 0.758721 0.918605 +vt 0.755814 0.959302 +vt 0.758721 0.959302 +vt 0.755814 1.000000 +vt 0.755814 0.639535 +vt 0.747093 0.755814 +vt 0.750000 0.796512 +vt 0.747093 0.796512 +vt 0.750000 0.837209 +vt 0.747093 0.837209 +vt 0.750000 0.877907 +vt 0.747093 0.877907 +vt 0.750000 0.918605 +vt 0.747093 0.918605 +vt 0.750000 0.959302 +vt 0.747093 0.959302 +vt 0.747093 1.000000 +vt 0.750000 0.639535 +vt 0.750000 0.755814 +vt 0.750000 0.636628 +vt 0.755814 0.636628 +vt 0.162791 0.284884 +vt 0.226744 0.581395 +vt 0.174419 0.284884 +vt 0.305233 0.456397 +vt 0.305233 0.340118 +vt 0.313954 0.340118 +vt 0.000000 0.340119 +vt 0.008721 0.340119 +vt 0.008721 0.456397 +vt 0.300181 0.494768 +vt 0.013773 0.494769 +vt 0.028584 0.530525 +vt 0.285370 0.530525 +vt 0.261809 0.561229 +vt 0.052144 0.561229 +vt 0.082849 0.584790 +vt 0.231104 0.584790 +vt 0.195348 0.599601 +vt 0.118605 0.599601 +vt 0.619186 0.456397 +vt 0.619186 0.340118 +vt 0.627907 0.340118 +vt 0.313954 0.340119 +vt 0.322674 0.340119 +vt 0.322674 0.456397 +vt 0.614134 0.494768 +vt 0.327726 0.494769 +vt 0.342537 0.530525 +vt 0.599323 0.530525 +vt 0.575763 0.561229 +vt 0.366098 0.561230 +vt 0.396802 0.584790 +vt 0.545058 0.584790 +vt 0.509301 0.599601 +vt 0.432559 0.599601 +vt 0.313953 0.627907 +vt 0.174419 0.276163 +vt 0.357558 0.674418 +vt 0.372093 0.674418 +vt 0.046512 0.674418 +vt 0.061047 0.674418 +vt 0.061047 0.790697 +vt 0.357558 0.790697 +vt 0.352506 0.829068 +vt 0.066098 0.829068 +vt 0.080909 0.864825 +vt 0.337696 0.864825 +vt 0.314135 0.895530 +vt 0.104470 0.895530 +vt 0.135174 0.919090 +vt 0.283430 0.919090 +vt 0.247674 0.933901 +vt 0.170931 0.933901 +vt 0.116279 0.901163 +vt 0.061047 0.790698 +vt 0.357558 0.674419 +vt 0.302326 0.674419 +vt 0.729651 0.674418 +vt 0.744186 0.674418 +vt 0.418605 0.674418 +vt 0.433140 0.674418 +vt 0.433140 0.790697 +vt 0.729651 0.790697 +vt 0.724599 0.829068 +vt 0.438191 0.829068 +vt 0.453002 0.864825 +vt 0.709789 0.864825 +vt 0.686228 0.895530 +vt 0.476563 0.895530 +vt 0.507267 0.919090 +vt 0.655523 0.919090 +vt 0.619767 0.933901 +vt 0.543024 0.933901 +vt 0.000000 0.953488 +vt 0.659884 0.901163 +vt 0.715116 0.790698 +vt 0.447674 0.674419 +vt 0.502907 0.674419 +vt 0.061047 0.627907 +vt 0.802326 1.000000 +vt 0.802326 0.639535 +vt 0.793605 1.000000 +vt 0.790698 0.639535 +vt 0.787791 0.639535 +vt 0.779070 1.000000 +vt 0.776163 0.639535 +vt 0.773256 0.639535 +vt 0.764535 1.000000 +vt 0.761628 0.639535 +vt 0.758721 1.000000 +vt 0.758721 0.639535 +vt 0.750000 1.000000 +vt 0.747093 0.639535 +s 0 +usemtl TEXTURE +f 10/1/1 13/2/1 9/3/1 +f 4/4/2 7/5/2 3/6/2 +f 11/7/3 16/8/3 12/9/3 +f 6/10/4 1/11/4 5/12/4 +f 7/13/5 1/11/5 3/14/5 +f 6/10/6 9/3/6 2/15/6 +f 4/16/6 12/5/6 8/8/6 +f 13/2/6 20/17/6 18/18/6 +f 17/7/6 16/19/6 15/20/6 +f 17/21/4 23/19/4 19/22/4 +f 20/17/2 22/23/2 18/18/2 s 1 -f 337/511/19 338/512/19 339/513/19 -f 340/514/20 341/515/20 342/516/20 -f 343/517/20 344/518/20 345/519/20 -f 346/520/21 347/521/21 348/522/21 -f 349/523/22 350/524/23 351/525/22 -f 352/526/22 353/527/22 354/528/22 -f 355/529/22 356/530/23 357/531/22 -f 358/532/24 356/530/23 359/533/23 -f 360/534/25 361/535/24 358/532/24 -f 362/536/26 363/537/25 360/534/25 -f 364/538/27 365/539/26 362/536/26 -f 366/540/28 367/541/27 364/538/27 -f 368/542/29 369/543/28 366/540/28 -f 368/542/29 370/544/30 371/545/29 -f 370/544/30 372/546/31 373/547/31 -f 372/546/31 374/548/21 373/547/31 -f 375/549/21 376/550/21 377/551/21 -f 377/551/27 353/527/27 378/552/27 -f 379/553/31 380/554/21 381/555/31 -f 382/556/30 381/555/31 383/557/30 -f 384/558/29 383/557/30 385/559/29 -f 384/558/29 344/560/28 386/561/28 -f 386/561/28 343/562/27 387/563/27 -f 387/563/27 388/564/26 389/565/26 -f 389/565/26 390/566/25 391/567/25 -f 391/567/25 392/568/24 393/569/24 -f 393/569/24 350/524/23 394/570/23 -f 395/571/22 345/519/22 396/572/22 -f 364/573/19 362/574/19 397/575/19 -f 397/576/32 345/519/32 398/577/32 -f 399/578/32 400/579/32 401/580/32 -f 399/578/33 402/581/33 403/582/33 -f 404/583/34 405/584/34 406/585/34 -f 407/586/32 404/583/32 406/585/32 -f 407/586/19 408/587/19 409/588/19 -f 400/579/20 410/589/20 401/580/20 -f 411/590/27 412/591/27 413/592/27 -f 414/593/32 415/594/32 416/595/32 -f 417/596/26 418/597/27 419/598/27 -f 420/599/25 421/600/26 417/596/26 -f 422/601/24 423/602/25 420/599/25 -f 424/603/23 425/604/24 422/601/24 -f 426/605/23 427/606/22 428/607/22 -f 424/603/20 429/608/20 427/606/20 -f 422/609/20 430/610/20 424/611/20 -f 430/610/35 431/612/21 429/608/21 -f 430/610/35 432/613/36 433/614/35 -f 434/615/36 435/616/37 432/613/36 -f 422/617/20 436/618/20 434/615/20 -f 436/618/37 437/619/38 435/616/37 -f 420/620/20 438/621/20 436/618/20 -f 438/621/38 439/622/32 437/619/38 -f 419/623/20 438/621/20 417/624/20 -f 440/625/20 441/626/20 419/627/20 -f 441/626/32 442/628/39 439/622/32 -f 419/598/27 443/629/28 440/630/28 -f 440/630/28 444/631/29 445/632/29 -f 445/633/20 446/634/20 440/635/20 -f 445/632/29 447/636/30 448/637/30 -f 445/638/20 449/639/20 450/640/20 -f 446/634/39 451/641/40 442/628/39 -f 450/640/40 452/642/41 451/641/40 -f 449/639/41 453/643/42 452/642/41 -f 454/644/20 449/639/20 448/645/20 -f 453/643/42 455/646/22 456/647/22 -f 457/648/20 458/649/20 455/646/20 -f 448/637/30 459/650/31 454/651/43 -f 454/651/31 460/652/21 458/649/21 -f 456/653/27 458/649/27 460/654/27 -f 428/655/27 429/608/27 431/656/27 -f 461/657/28 462/658/27 463/659/27 -f 464/660/29 465/661/28 461/657/28 -f 466/662/30 467/663/29 464/660/29 -f 468/664/31 469/665/30 466/662/30 -f 470/666/31 471/667/21 472/668/21 -f 468/664/19 473/669/19 471/667/19 -f 466/670/19 474/671/19 468/672/19 -f 474/671/42 475/673/22 473/669/22 -f 474/671/44 476/674/41 477/675/42 -f 478/676/41 479/677/40 476/674/41 -f 466/678/19 480/679/19 478/676/19 -f 480/679/40 481/680/39 479/677/40 -f 461/681/19 480/679/19 464/682/19 -f 482/683/39 483/684/32 481/680/39 -f 463/685/19 482/683/19 461/686/19 -f 484/687/19 485/688/19 463/689/19 -f 485/688/32 486/690/38 483/684/32 -f 463/659/27 487/691/26 484/692/26 -f 484/692/26 488/693/25 489/694/25 -f 489/695/19 490/696/19 484/697/19 -f 489/694/25 491/698/24 492/699/24 -f 489/700/19 493/701/19 494/702/19 -f 490/696/38 495/703/37 486/690/38 -f 494/702/37 496/704/36 495/703/37 -f 493/701/36 497/705/35 496/704/36 -f 498/706/19 493/701/19 492/707/19 -f 497/705/35 499/708/21 500/709/21 -f 501/710/19 502/711/19 499/708/19 -f 492/699/24 503/712/23 498/713/23 -f 498/713/23 504/714/22 502/711/22 -f 504/715/27 499/708/27 502/711/27 -f 475/716/27 471/667/27 473/669/27 -f 505/717/19 506/718/19 507/719/19 -f 338/512/19 508/720/19 509/721/19 -f 338/512/19 509/721/19 510/722/19 -f 505/717/19 507/719/19 337/511/19 -f 511/723/19 505/717/19 337/511/19 -f 338/512/19 510/722/19 512/724/19 -f 338/512/19 512/724/19 513/725/19 -f 514/726/19 511/723/19 337/511/19 -f 515/727/19 514/726/19 337/511/19 -f 338/512/19 513/725/19 516/728/19 -f 339/513/19 515/727/19 337/511/19 -f 338/512/19 516/728/19 339/513/19 -f 517/729/20 518/730/20 519/731/20 -f 341/515/20 520/732/20 521/733/20 -f 341/515/20 521/733/20 522/734/20 -f 517/729/20 519/731/20 340/514/20 -f 523/735/20 517/729/20 340/514/20 -f 341/515/20 522/734/20 524/736/20 -f 341/515/20 524/736/20 525/737/20 -f 526/738/20 523/735/20 340/514/20 -f 527/739/20 526/738/20 340/514/20 -f 341/515/20 525/737/20 528/740/20 -f 342/516/20 527/739/20 340/514/20 -f 341/515/20 528/740/20 342/516/20 -f 346/520/20 348/522/20 351/741/20 -f 346/520/20 351/741/20 350/742/20 -f 380/743/20 396/572/20 345/519/20 -f 381/744/20 380/743/20 345/519/20 -f 346/520/20 350/742/20 392/745/20 -f 346/520/20 392/745/20 390/746/20 -f 383/747/20 381/744/20 345/519/20 -f 385/748/20 383/747/20 345/519/20 -f 346/520/20 390/746/20 388/749/20 -f 346/520/20 388/749/20 343/517/20 -f 344/518/20 385/748/20 345/519/20 -f 345/519/20 346/520/20 343/517/20 -f 346/520/21 397/750/21 347/521/21 -f 349/523/22 394/570/23 350/524/23 -f 352/526/22 378/552/22 353/527/22 -f 355/529/22 359/533/23 356/530/23 -f 358/532/24 361/535/24 356/530/23 -f 360/534/25 363/537/25 361/535/24 -f 362/536/26 365/539/26 363/537/25 -f 364/538/27 367/541/27 365/539/26 -f 366/540/28 369/543/28 367/541/27 -f 368/542/29 371/545/29 369/543/28 -f 368/542/29 529/751/30 370/544/30 -f 370/544/30 529/751/30 372/546/31 -f 372/546/31 530/752/21 374/548/21 -f 375/549/21 531/753/21 376/550/21 -f 377/551/27 376/550/27 353/527/27 -f 379/553/31 532/754/21 380/554/21 -f 382/556/30 379/553/31 381/555/31 -f 384/558/29 382/556/30 383/557/30 -f 384/558/29 385/559/29 344/560/28 -f 386/561/28 344/560/28 343/562/27 -f 387/563/27 343/562/27 388/564/26 -f 389/565/26 388/564/26 390/566/25 -f 391/567/25 390/566/25 392/568/24 -f 393/569/24 392/568/24 350/524/23 -f 395/571/22 398/755/22 345/519/22 -f 398/755/19 395/571/19 530/756/19 -f 398/755/19 530/756/19 372/757/19 -f 355/758/19 347/759/19 397/575/19 -f 359/760/19 355/758/19 397/575/19 -f 398/755/19 372/757/19 529/761/19 -f 398/755/19 529/761/19 368/762/19 -f 358/763/19 359/760/19 397/575/19 -f 360/764/19 358/763/19 397/575/19 -f 398/755/19 368/762/19 366/765/19 -f 398/755/19 366/765/19 364/573/19 -f 362/574/19 360/764/19 397/575/19 -f 397/575/19 398/755/19 364/573/19 -f 397/576/32 346/520/32 345/519/32 -f 399/578/32 403/582/32 400/579/32 -f 399/578/33 533/766/33 402/581/33 -f 404/583/34 534/767/34 405/584/34 -f 407/586/32 409/588/32 404/583/32 -f 407/586/19 535/768/19 408/587/19 -f 400/579/20 536/769/20 410/589/20 -f 411/590/27 537/770/27 412/591/27 -f 414/593/32 538/771/32 415/594/32 -f 417/596/26 421/600/26 418/597/27 -f 420/599/25 423/602/25 421/600/26 -f 422/601/24 425/604/24 423/602/25 -f 424/603/23 426/605/23 425/604/24 -f 426/605/23 424/603/23 427/606/22 -f 424/603/20 430/610/20 429/608/20 -f 422/609/20 434/615/20 430/610/20 -f 430/610/35 433/614/35 431/612/21 -f 430/610/35 434/615/36 432/613/36 -f 434/615/36 436/618/37 435/616/37 -f 422/617/20 420/772/20 436/618/20 -f 436/618/37 438/621/38 437/619/38 -f 420/620/20 417/773/20 438/621/20 -f 438/621/38 441/626/32 439/622/32 -f 419/623/20 441/626/20 438/621/20 -f 440/625/20 446/634/20 441/626/20 -f 441/626/32 446/634/39 442/628/39 -f 419/598/27 418/597/27 443/629/28 -f 440/630/28 443/629/28 444/631/29 -f 445/633/20 450/640/20 446/634/20 -f 445/632/29 444/631/29 447/636/30 -f 445/638/20 448/774/20 449/639/20 -f 446/634/39 450/640/40 451/641/40 -f 450/640/40 449/639/41 452/642/41 -f 449/639/41 457/648/42 453/643/42 -f 454/644/20 457/648/20 449/639/20 -f 453/643/42 457/648/42 455/646/22 -f 457/648/20 454/651/20 458/649/20 -f 448/637/30 447/636/30 459/650/31 -f 454/651/43 459/650/31 460/652/21 -f 456/653/27 455/646/27 458/649/27 -f 428/655/27 427/606/27 429/608/27 -f 461/657/28 465/661/28 462/658/27 -f 464/660/29 467/663/29 465/661/28 -f 466/662/30 469/665/30 467/663/29 -f 468/664/31 470/666/31 469/665/30 -f 470/666/31 468/664/31 471/667/21 -f 468/664/19 474/671/19 473/669/19 -f 466/670/19 478/676/19 474/671/19 -f 474/671/44 477/675/42 475/673/22 -f 474/671/44 478/676/41 476/674/41 -f 478/676/41 480/679/40 479/677/40 -f 466/678/19 464/775/19 480/679/19 -f 480/679/40 482/683/39 481/680/39 -f 461/681/19 482/683/19 480/679/19 -f 482/683/39 485/688/32 483/684/32 -f 463/685/19 485/688/19 482/683/19 -f 484/687/19 490/696/19 485/688/19 -f 485/688/32 490/696/38 486/690/38 -f 463/659/27 462/658/27 487/691/26 -f 484/692/26 487/691/26 488/693/25 -f 489/695/19 494/702/19 490/696/19 -f 489/694/25 488/693/25 491/698/24 -f 489/700/19 492/776/19 493/701/19 -f 490/696/38 494/702/37 495/703/37 -f 494/702/37 493/701/36 496/704/36 -f 493/701/36 501/710/35 497/705/35 -f 498/706/19 501/710/19 493/701/19 -f 497/705/35 501/710/35 499/708/21 -f 501/710/19 498/713/19 502/711/19 -f 492/699/24 491/698/24 503/712/23 -f 498/713/23 503/712/23 504/714/22 -f 504/715/27 500/777/27 499/708/27 -f 475/716/27 472/778/27 471/667/27 +f 43/24/2 40/25/2 34/26/2 +f 62/27/4 59/28/4 53/29/4 +f 43/30/5 62/31/5 40/32/5 +s 0 +f 64/33/6 65/34/6 63/35/6 +s 1 +f 70/36/4 68/37/4 73/38/4 +f 100/39/7 73/40/5 95/41/5 +f 88/42/8 74/43/7 100/39/7 +f 89/44/9 79/45/8 88/42/8 +f 86/46/10 81/47/11 99/48/11 +f 87/49/12 82/50/10 86/46/10 +f 96/51/13 83/52/12 87/49/12 +f 96/51/13 71/53/14 85/54/13 +f 98/55/15 71/53/14 94/56/14 +f 95/57/5 72/58/15 98/55/15 +f 99/59/11 80/60/16 91/61/16 +f 90/62/17 84/63/18 77/64/17 +f 92/65/19 77/66/17 78/67/19 +f 93/68/20 78/67/19 76/69/20 +f 89/44/9 76/69/20 75/70/9 +f 104/71/2 102/72/2 107/73/2 +f 68/74/18 103/75/18 67/76/18 +f 134/77/15 107/78/5 129/79/5 +f 122/80/14 108/81/15 134/77/15 +f 123/82/13 113/83/14 122/80/14 +f 120/84/19 115/85/17 133/86/17 +f 120/84/19 117/87/20 116/88/19 +f 130/89/9 117/87/20 121/90/20 +f 130/89/9 105/91/8 119/92/9 +f 132/93/7 105/91/8 128/94/8 +f 129/95/5 106/96/7 132/93/7 +f 133/97/17 114/98/18 125/99/18 +f 124/100/11 118/101/16 111/102/11 +f 126/103/10 111/104/11 112/105/10 +f 127/106/12 112/105/10 110/107/12 +f 123/82/13 110/107/12 109/108/13 +f 68/74/6 102/109/6 104/110/6 +f 70/111/16 101/112/16 102/113/16 +f 103/114/5 135/60/5 67/76/5 +f 69/115/5 138/116/5 101/117/5 +f 143/118/17 146/119/19 144/120/17 +f 145/121/19 148/122/20 146/119/19 +f 147/123/20 150/124/9 148/122/20 +f 149/125/9 152/126/8 150/124/9 +f 151/127/8 154/128/7 152/126/8 +f 153/129/7 140/130/21 154/128/7 +f 141/131/18 143/118/17 144/120/17 +f 157/132/22 162/133/23 161/134/23 +f 161/134/23 164/135/24 163/136/24 +f 163/136/24 166/137/25 165/138/25 +f 165/138/25 168/139/26 167/140/26 +f 167/140/26 170/141/27 169/142/27 +f 170/141/27 155/143/28 169/142/27 +f 157/132/22 159/144/29 160/145/22 +f 148/122/2 166/137/2 164/135/2 +f 144/120/2 159/144/2 141/131/2 +f 152/126/2 166/137/2 150/124/2 +f 141/131/5 158/146/5 142/147/5 +f 152/126/2 170/141/2 168/139/2 +f 146/119/2 160/145/2 144/120/2 +f 140/130/2 170/141/2 154/128/2 +f 148/122/2 162/133/2 146/119/2 +f 175/148/11 178/149/10 177/150/10 +f 177/150/10 180/151/12 179/152/12 +f 179/152/12 182/153/13 181/154/13 +f 181/154/13 184/155/14 183/156/14 +f 183/156/14 186/157/15 185/158/15 +f 185/158/15 172/159/30 171/160/30 +f 175/148/11 173/161/16 176/162/11 +f 189/163/31 194/164/32 192/165/31 +f 193/166/32 196/167/33 194/164/32 +f 195/168/33 198/169/34 196/167/33 +f 197/170/34 200/171/35 198/169/34 +f 199/172/35 202/173/36 200/171/35 +f 187/174/37 202/173/36 201/175/36 +f 191/176/38 189/163/31 192/165/31 +f 180/151/2 198/169/2 182/153/2 +f 191/176/2 176/162/2 173/161/2 +f 182/153/2 200/171/2 184/155/2 +f 190/177/5 173/161/5 174/178/5 +f 184/155/2 202/173/2 186/157/2 +f 192/165/2 178/149/2 176/162/2 +f 202/173/2 172/159/2 186/157/2 +f 194/164/2 180/151/2 178/149/2 +f 207/179/17 210/180/19 209/181/19 +f 209/181/19 212/182/20 211/183/20 +f 211/183/20 214/184/9 213/185/9 +f 213/185/9 216/186/8 215/187/8 +f 215/187/8 218/188/7 217/189/7 +f 217/189/7 204/190/21 203/191/21 +f 207/179/17 205/192/18 208/193/17 +f 221/194/22 226/195/23 224/196/22 +f 225/197/23 228/198/24 226/195/23 +f 227/199/24 230/200/25 228/198/24 +f 229/201/25 232/202/26 230/200/25 +f 231/203/26 234/204/27 232/202/26 +f 219/205/28 234/204/27 233/206/27 +f 223/207/29 221/194/22 224/196/22 +f 212/182/4 230/200/4 214/184/4 +f 223/207/4 208/193/4 205/192/4 +f 214/184/4 232/202/4 216/186/4 +f 222/208/5 205/192/5 206/209/5 +f 216/186/4 234/204/4 218/188/4 +f 224/196/4 210/180/4 208/193/4 +f 234/204/4 204/190/4 218/188/4 +f 226/195/4 212/182/4 210/180/4 +f 239/210/11 242/211/10 240/212/11 +f 241/213/10 244/214/12 242/211/10 +f 243/215/12 246/216/13 244/214/12 +f 245/217/13 248/218/14 246/216/13 +f 247/219/14 250/220/15 248/218/14 +f 249/221/15 236/222/30 250/220/15 +f 237/223/16 239/210/11 240/212/11 +f 253/224/31 258/225/32 257/226/32 +f 257/226/32 260/227/33 259/228/33 +f 259/228/33 262/229/34 261/230/34 +f 261/230/34 264/231/35 263/232/35 +f 263/232/35 266/233/36 265/234/36 +f 266/233/36 251/235/37 265/234/36 +f 253/224/31 255/236/38 256/237/31 +f 244/214/4 262/229/4 260/227/4 +f 240/212/4 255/236/4 237/223/4 +f 248/218/4 262/229/4 246/216/4 +f 237/223/5 254/238/5 238/239/5 +f 248/218/4 266/233/4 264/231/4 +f 242/211/4 256/237/4 240/212/4 +f 236/222/4 266/233/4 250/220/4 +f 244/214/4 258/225/4 242/211/4 +s 0 +f 10/1/1 14/240/1 13/2/1 +f 4/4/2 8/241/2 7/5/2 +f 11/7/3 15/16/3 16/8/3 +f 6/10/4 2/15/4 1/11/4 +f 7/13/5 5/12/5 1/11/5 +f 6/10/6 10/1/6 9/3/6 +f 4/16/6 11/6/6 12/5/6 +f 13/2/6 14/240/6 20/17/6 +f 17/7/6 19/9/6 16/19/6 +f 17/21/4 21/20/4 23/19/4 +f 20/17/2 24/242/2 22/23/2 +s 1 +f 38/243/2 30/244/2 42/245/2 +f 40/25/2 41/246/2 36/247/2 +f 40/25/2 36/247/2 29/248/2 +f 38/243/2 42/245/2 43/24/2 +f 25/249/2 38/243/2 43/24/2 +f 40/25/2 29/248/2 31/250/2 +f 40/25/2 31/250/2 32/251/2 +f 26/252/2 25/249/2 43/24/2 +f 35/253/2 26/252/2 43/24/2 +f 40/25/2 32/251/2 28/254/2 +f 40/25/2 28/254/2 27/255/2 +f 33/256/2 35/253/2 43/24/2 +f 37/257/2 33/256/2 43/24/2 +f 40/25/2 27/255/2 39/258/2 +f 34/26/2 37/257/2 43/24/2 +f 40/25/2 39/258/2 34/26/2 +f 57/259/4 49/260/4 61/261/4 +f 59/28/4 60/262/4 55/263/4 +f 59/28/4 55/263/4 48/264/4 +f 57/259/4 61/261/4 62/27/4 +f 44/265/4 57/259/4 62/27/4 +f 59/28/4 48/264/4 50/266/4 +f 59/28/4 50/266/4 51/267/4 +f 45/268/4 44/265/4 62/27/4 +f 54/269/4 45/268/4 62/27/4 +f 59/28/4 51/267/4 47/270/4 +f 59/28/4 47/270/4 46/271/4 +f 52/272/4 54/269/4 62/27/4 +f 56/273/4 52/272/4 62/27/4 +f 59/28/4 46/271/4 58/274/4 +f 53/29/4 56/273/4 62/27/4 +f 59/28/4 58/274/4 53/29/4 +f 43/30/5 59/275/5 62/31/5 +s 0 +f 64/33/6 66/276/6 65/34/6 +s 1 +f 84/277/4 69/278/4 70/36/4 +f 68/37/4 67/279/4 80/280/4 +f 68/37/4 80/280/4 81/281/4 +f 77/282/4 84/277/4 70/36/4 +f 78/283/4 77/282/4 70/36/4 +f 68/37/4 81/281/4 82/284/4 +f 68/37/4 82/284/4 83/285/4 +f 76/286/4 78/283/4 70/36/4 +f 75/287/4 76/286/4 70/36/4 +f 68/37/4 83/285/4 85/288/4 +f 68/37/4 85/288/4 71/289/4 +f 79/290/4 75/287/4 70/36/4 +f 74/291/4 79/290/4 70/36/4 +f 68/37/4 71/289/4 72/292/4 +f 73/38/4 74/291/4 70/36/4 +f 68/37/4 72/292/4 73/38/4 +f 100/39/7 74/43/7 73/40/5 +f 88/42/8 79/45/8 74/43/7 +f 89/44/9 75/70/9 79/45/8 +f 86/46/10 82/50/10 81/47/11 +f 87/49/12 83/52/12 82/50/10 +f 96/51/13 85/54/13 83/52/12 +f 96/51/13 94/56/14 71/53/14 +f 98/55/15 72/58/15 71/53/14 +f 95/57/5 73/293/5 72/58/15 +f 99/59/11 81/294/11 80/60/16 +f 90/62/17 97/295/18 84/63/18 +f 92/65/19 90/296/17 77/66/17 +f 93/68/20 92/65/19 78/67/19 +f 89/44/9 93/68/20 76/69/20 +f 118/297/2 103/298/2 104/71/2 +f 102/72/2 101/299/2 114/300/2 +f 102/72/2 114/300/2 115/301/2 +f 111/302/2 118/297/2 104/71/2 +f 112/303/2 111/302/2 104/71/2 +f 102/72/2 115/301/2 116/304/2 +f 102/72/2 116/304/2 117/305/2 +f 110/306/2 112/303/2 104/71/2 +f 109/307/2 110/306/2 104/71/2 +f 102/72/2 117/305/2 119/308/2 +f 102/72/2 119/308/2 105/309/2 +f 113/310/2 109/307/2 104/71/2 +f 108/311/2 113/310/2 104/71/2 +f 102/72/2 105/309/2 106/312/2 +f 107/73/2 108/311/2 104/71/2 +f 102/72/2 106/312/2 107/73/2 +f 68/74/18 104/313/18 103/75/18 +f 134/77/15 108/81/15 107/78/5 +f 122/80/14 113/83/14 108/81/15 +f 123/82/13 109/108/13 113/83/14 +f 120/84/19 116/88/19 115/85/17 +f 120/84/19 121/90/20 117/87/20 +f 130/89/9 119/92/9 117/87/20 +f 130/89/9 128/94/8 105/91/8 +f 132/93/7 106/96/7 105/91/8 +f 129/95/5 107/314/5 106/96/7 +f 133/97/17 115/315/17 114/98/18 +f 124/100/11 131/316/16 118/101/16 +f 126/103/10 124/317/11 111/104/11 +f 127/106/12 126/103/10 112/105/10 +f 123/82/13 127/106/12 110/107/12 +f 68/74/6 70/111/6 102/109/6 +f 70/111/16 69/115/16 101/112/16 +f 103/114/5 136/318/5 135/60/5 +f 69/115/5 137/295/5 138/116/5 +f 143/118/17 145/121/19 146/119/19 +f 145/121/19 147/123/20 148/122/20 +f 147/123/20 149/125/9 150/124/9 +f 149/125/9 151/127/8 152/126/8 +f 151/127/8 153/129/7 154/128/7 +f 153/129/7 139/319/21 140/130/21 +f 141/131/18 142/320/18 143/118/17 +f 157/132/22 160/145/22 162/133/23 +f 161/134/23 162/133/23 164/135/24 +f 163/136/24 164/135/24 166/137/25 +f 165/138/25 166/137/25 168/139/26 +f 167/140/26 168/139/26 170/141/27 +f 170/141/27 156/321/28 155/143/28 +f 157/132/22 158/322/29 159/144/29 +f 148/122/2 150/124/2 166/137/2 +f 144/120/2 160/145/2 159/144/2 +f 152/126/2 168/139/2 166/137/2 +f 141/131/5 159/144/5 158/146/5 +f 152/126/2 154/128/2 170/141/2 +f 146/119/2 162/133/2 160/145/2 +f 140/130/2 156/321/2 170/141/2 +f 148/122/2 164/135/2 162/133/2 +f 175/148/11 176/162/11 178/149/10 +f 177/150/10 178/149/10 180/151/12 +f 179/152/12 180/151/12 182/153/13 +f 181/154/13 182/153/13 184/155/14 +f 183/156/14 184/155/14 186/157/15 +f 185/158/15 186/157/15 172/159/30 +f 175/148/11 174/323/16 173/161/16 +f 189/163/31 193/166/32 194/164/32 +f 193/166/32 195/168/33 196/167/33 +f 195/168/33 197/170/34 198/169/34 +f 197/170/34 199/172/35 200/171/35 +f 199/172/35 201/175/36 202/173/36 +f 187/174/37 188/324/37 202/173/36 +f 191/176/38 190/325/38 189/163/31 +f 180/151/2 196/167/2 198/169/2 +f 191/176/2 192/165/2 176/162/2 +f 182/153/2 198/169/2 200/171/2 +f 190/177/5 191/176/5 173/161/5 +f 184/155/2 200/171/2 202/173/2 +f 192/165/2 194/164/2 178/149/2 +f 202/173/2 188/324/2 172/159/2 +f 194/164/2 196/167/2 180/151/2 +f 207/179/17 208/193/17 210/180/19 +f 209/181/19 210/180/19 212/182/20 +f 211/183/20 212/182/20 214/184/9 +f 213/185/9 214/184/9 216/186/8 +f 215/187/8 216/186/8 218/188/7 +f 217/189/7 218/188/7 204/190/21 +f 207/179/17 206/326/18 205/192/18 +f 221/194/22 225/197/23 226/195/23 +f 225/197/23 227/199/24 228/198/24 +f 227/199/24 229/201/25 230/200/25 +f 229/201/25 231/203/26 232/202/26 +f 231/203/26 233/206/27 234/204/27 +f 219/205/28 220/327/28 234/204/27 +f 223/207/29 222/328/29 221/194/22 +f 212/182/4 228/198/4 230/200/4 +f 223/207/4 224/196/4 208/193/4 +f 214/184/4 230/200/4 232/202/4 +f 222/208/5 223/207/5 205/192/5 +f 216/186/4 232/202/4 234/204/4 +f 224/196/4 226/195/4 210/180/4 +f 234/204/4 220/327/4 204/190/4 +f 226/195/4 228/198/4 212/182/4 +f 239/210/11 241/213/10 242/211/10 +f 241/213/10 243/215/12 244/214/12 +f 243/215/12 245/217/13 246/216/13 +f 245/217/13 247/219/14 248/218/14 +f 247/219/14 249/221/15 250/220/15 +f 249/221/15 235/329/30 236/222/30 +f 237/223/16 238/330/16 239/210/11 +f 253/224/31 256/237/31 258/225/32 +f 257/226/32 258/225/32 260/227/33 +f 259/228/33 260/227/33 262/229/34 +f 261/230/34 262/229/34 264/231/35 +f 263/232/35 264/231/35 266/233/36 +f 266/233/36 252/331/37 251/235/37 +f 253/224/31 254/332/38 255/236/38 +f 244/214/4 246/216/4 262/229/4 +f 240/212/4 256/237/4 255/236/4 +f 248/218/4 264/231/4 262/229/4 +f 237/223/5 255/236/5 254/238/5 +f 248/218/4 250/220/4 266/233/4 +f 242/211/4 258/225/4 256/237/4 +f 236/222/4 252/331/4 266/233/4 +f 244/214/4 260/227/4 258/225/4 o Left -v -0.187500 5.937500 0.187501 -v -3.312500 0.062500 0.187500 +v -0.187500 0.312500 -0.187500 +v -0.187500 5.812500 -0.187500 +v -3.374999 0.312500 -0.187500 +v -3.374999 5.812500 -0.187500 +v -0.312500 0.187500 0.250000 +v -0.312500 0.187500 0.187500 +v -0.193750 0.187500 0.250000 +v -0.187500 5.662815 0.187500 +v -0.193750 0.187500 0.187500 +v -0.187500 5.662815 0.250000 +v -3.062499 2.500000 0.187500 +v -2.958148 3.292633 0.187500 +v -2.652203 4.031250 0.187500 +v -2.165514 4.665514 0.187500 +v -1.531250 5.152203 0.187500 +v -0.792633 5.458148 0.187500 +v -2.760456 4.093750 0.250000 +v -3.078888 3.324986 0.250000 +v -3.187499 2.500000 0.250000 +v -2.253902 4.753902 0.250000 +v -1.593750 5.260456 0.250000 +v -0.824985 5.578888 0.250000 +v -2.652203 4.031250 0.250000 +v -2.958148 3.292633 0.250000 +v -3.062499 2.500000 0.250000 +v -2.165514 4.665514 0.250000 +v -1.531250 5.152203 0.250000 +v -0.792633 5.458148 0.250000 +v -3.062499 0.312500 0.187500 +v -3.062499 0.312500 0.250000 +v -3.187499 0.312500 0.250000 +v -0.312500 5.521358 0.250000 +v -0.193750 5.537815 0.250000 +v -0.193750 5.537815 0.187500 +v -0.312500 5.521358 0.187500 +v -0.312799 5.646319 0.250000 +v -0.187500 0.312500 0.187500 +v -0.187500 5.812500 0.187500 +v -3.374999 0.312500 0.187500 +v -3.374999 5.812500 0.187500 +v -3.187500 0.187500 0.250000 +v -3.187500 0.312500 0.250000 +v -0.312500 0.187500 0.250000 +v -0.312500 0.312500 0.250000 +v -3.187500 0.312500 0.187500 +v -0.312500 0.312500 0.187500 +v -2.437501 0.375000 0.375000 +v -2.437501 0.687500 0.375000 +v -2.437501 0.312500 0.187500 +v -2.437501 0.750000 0.187500 +v -2.562501 0.375000 0.375000 +v -2.562501 0.687500 0.375000 +v -2.562501 0.312500 0.187500 +v -2.562501 0.750000 0.187500 +v -2.437501 0.312500 0.250000 +v -2.437501 0.750000 0.250000 +v -2.562501 0.312500 0.250000 +v -2.562501 0.750000 0.250000 +v -2.437501 0.375000 0.312500 +v -2.562501 0.687500 0.312500 +v -2.437501 0.687500 0.312500 +v -2.562501 0.375000 0.312500 +v -2.187500 1.625000 0.250000 +v -2.187500 2.000000 0.250000 +v -2.187500 1.625000 0.187500 +v -2.187500 2.000000 0.187500 +v -2.812500 1.625000 0.250000 +v -2.812500 2.000000 0.250000 +v -2.812500 1.625000 0.187500 +v -2.812500 2.000000 0.187500 v -0.187500 0.062500 0.187500 -v -0.125000 5.937500 0.125001 -v -0.125000 5.937500 -0.124999 -v -0.125000 0.062500 0.125000 -v -0.125000 0.062500 -0.125000 -v -0.187500 5.937500 -0.187499 -v -3.312500 5.937500 -0.187499 -v -0.187500 0.062500 -0.187500 -v -3.312500 0.062500 -0.187500 -v 0.062500 1.062500 -0.187500 -v 0.125000 1.062500 0.125000 -v -0.187500 1.062500 0.187500 -v 0.062500 1.562500 0.187500 -v 0.062500 1.062500 0.187500 -v 0.125000 1.562500 0.125000 -v 0.125000 1.562500 -0.125000 -v 0.125000 1.062500 -0.125000 -v 0.062500 1.562500 -0.187500 -v -0.187500 1.562500 -0.187500 -v -0.187500 1.062500 -0.187500 -v -0.187500 1.562500 0.187500 -v 0.062500 2.062500 -0.187500 -v 0.125000 2.062500 0.125000 -v -0.187500 2.062500 0.187500 -v 0.062500 2.562500 0.187500 -v 0.062500 2.062500 0.187500 -v 0.125000 2.562500 0.125000 -v 0.125000 2.562500 -0.125000 -v 0.125000 2.062500 -0.125000 -v 0.062500 2.562500 -0.187500 -v -0.187500 2.562500 -0.187500 -v -0.187500 2.062500 -0.187500 -v -0.187500 2.562500 0.187500 -v 0.062500 3.062500 -0.187500 -v 0.125000 3.062500 0.125000 -v -0.187500 3.062500 0.187500 -v 0.062500 3.562500 0.187501 -v 0.062500 3.062500 0.187500 -v 0.125000 3.562500 0.125001 -v 0.125000 3.562500 -0.124999 -v 0.125000 3.062500 -0.125000 -v 0.062500 3.562500 -0.187499 -v -0.187500 3.562500 -0.187499 -v -0.187500 3.062500 -0.187500 -v -0.187500 3.562500 0.187501 -v 0.062500 4.062500 -0.187499 -v 0.125000 4.062500 0.125001 -v -0.187500 4.062500 0.187501 -v 0.062500 4.562500 0.187501 -v 0.062500 4.062500 0.187501 -v 0.125000 4.562500 0.125001 -v 0.125000 4.562500 -0.124999 -v 0.125000 4.062500 -0.124999 -v 0.062500 4.562500 -0.187499 -v -0.187500 4.562500 -0.187499 -v -0.187500 4.062500 -0.187499 -v -0.187500 4.562500 0.187501 -v 0.062500 5.062500 -0.187499 -v 0.125000 5.062500 0.125001 -v -0.187500 5.062500 0.187501 -v 0.062500 5.562500 0.187501 -v 0.062500 5.062500 0.187501 -v 0.125000 5.562500 0.125001 -v 0.125000 5.562500 -0.124999 -v 0.125000 5.062500 -0.124999 -v 0.062500 5.562500 -0.187499 -v -0.187500 5.562500 -0.187499 -v -0.187500 5.062500 -0.187499 -v -0.187500 5.562500 0.187501 -v 0.062500 0.562500 0.187500 -v -0.187500 0.062500 0.187500 -v 0.062500 0.062500 0.187500 -v 0.125000 0.562500 0.125000 -v 0.125000 0.562500 -0.125000 -v 0.125000 0.062500 0.125000 -v 0.125000 0.062500 -0.125000 -v 0.062500 0.562500 -0.187500 -v -0.187500 0.562500 -0.187500 -v 0.062500 0.062500 -0.187500 -v -0.187500 0.062500 -0.187500 v -0.187500 0.562500 0.187500 -v -1.312500 0.468750 0.312500 -v -0.437500 0.514515 0.422985 -v -1.312500 0.514514 0.422985 -v -0.437500 0.468750 0.187500 -v -1.312500 0.468750 0.187500 -v -1.312500 0.735485 0.422985 -v -1.312500 0.781250 0.312500 -v -0.437500 0.781250 0.187500 -v -0.437500 0.468750 0.312500 -v -1.312500 0.781250 0.187500 -v -0.437500 0.781250 0.312500 -v -0.437500 0.735485 0.422985 -v -0.437500 0.625000 0.468750 -v -1.312500 0.625000 0.468750 -v -1.312500 0.625000 0.187500 -v -3.312500 0.536612 0.224112 -v -3.312500 0.625000 0.187500 -v -1.312500 0.713388 0.224112 -v -3.312500 0.713388 0.224112 -v -1.312500 0.750000 0.312500 -v -3.312500 0.750000 0.312500 -v -1.312500 0.713388 0.400888 -v -3.312500 0.713388 0.400888 -v -1.312500 0.625000 0.437500 -v -3.312500 0.625000 0.437500 -v -1.312500 0.536612 0.400888 -v -3.312500 0.536612 0.400888 -v -1.312500 0.500000 0.312500 -v -3.312500 0.500000 0.312500 -v -1.312500 0.536612 0.224112 -v -1.312500 0.468750 -0.312500 -v -0.437500 0.514515 -0.422985 -v -0.437500 0.468750 -0.312500 -v -0.437500 0.468750 -0.187500 -v -1.312500 0.468750 -0.187500 -v -1.312500 0.781250 -0.312500 -v -1.312500 0.625000 -0.468750 -v -1.312500 0.514514 -0.422985 -v -0.437500 0.781250 -0.187500 -v -0.437500 0.781250 -0.312500 -v -1.312500 0.781250 -0.187500 -v -0.437500 0.735485 -0.422985 -v -1.312500 0.735485 -0.422985 -v -0.437500 0.625000 -0.468750 -v -3.312500 0.536612 -0.224112 -v -1.312500 0.625000 -0.187500 -v -3.312500 0.625000 -0.187500 -v -1.312500 0.713388 -0.224112 -v -3.312500 0.713388 -0.224112 -v -1.312500 0.750000 -0.312500 -v -3.312500 0.750000 -0.312500 -v -1.312500 0.713388 -0.400888 -v -3.312500 0.713388 -0.400888 -v -1.312500 0.625000 -0.437500 -v -3.312500 0.625000 -0.437500 -v -1.312500 0.536612 -0.400888 -v -3.312500 0.536612 -0.400888 -v -1.312500 0.500000 -0.312500 -v -3.312500 0.500000 -0.312500 -v -1.312500 0.536612 -0.224112 -v -3.312500 5.250000 0.187501 -v -0.312500 5.250000 0.250001 -v -3.312500 5.250000 0.250001 -v -0.312500 5.437500 0.250001 -v -0.250000 5.437500 0.187501 -v -3.312500 5.437500 0.187501 -v -3.312500 5.437500 0.250001 -v -3.312500 4.250000 0.187501 -v -0.312500 4.250000 0.250001 -v -3.312500 4.250000 0.250001 -v -0.312500 4.437500 0.250001 -v -0.250000 4.437500 0.187501 -v -3.312500 4.437500 0.187501 -v -3.312500 4.437500 0.250001 -v -3.312500 3.250000 0.187501 -v -0.312500 3.250000 0.250001 -v -3.312500 3.250000 0.250001 -v -0.312500 3.437500 0.250001 -v -0.250000 3.437500 0.187501 -v -3.312500 3.437500 0.187501 -v -3.312500 3.437500 0.250001 -v -3.312500 2.250000 0.187500 -v -0.312500 2.250000 0.250000 -v -3.312500 2.250000 0.250000 -v -0.312500 2.437500 0.250000 -v -0.250000 2.437500 0.187500 -v -3.312500 2.437500 0.187500 -v -3.312500 2.437500 0.250000 -v -3.312500 1.250000 0.187500 -v -0.312500 1.250000 0.250000 -v -3.312500 1.250000 0.250000 -v -0.312500 1.437500 0.250000 -v -0.250000 1.437500 0.187500 -v -3.312500 1.437500 0.187500 -v -3.312500 1.437500 0.250000 -v -3.312500 0.250000 0.187500 -v -0.312500 0.250000 0.250000 -v -3.312500 0.250000 0.250000 -v -0.312500 0.437500 0.250000 -v -0.250000 0.437500 0.187500 -v -3.312500 0.437500 0.187500 -v -3.312500 0.437500 0.250000 -v -3.312500 5.250000 -0.187499 -v -0.312500 5.250000 -0.249999 -v -0.250000 5.250000 -0.187499 -v -3.312500 5.250000 -0.249999 -v -0.312500 5.437500 -0.249999 -v -0.250000 5.437500 -0.187499 -v -3.312500 5.437500 -0.187499 -v -3.312500 5.437500 -0.249999 -v -3.312500 4.250000 -0.187499 -v -0.312500 4.250000 -0.249999 -v -0.250000 4.250000 -0.187499 -v -3.312500 4.250000 -0.249999 -v -0.312500 4.437500 -0.249999 -v -0.250000 4.437500 -0.187499 -v -3.312500 4.437500 -0.187499 -v -3.312500 4.437500 -0.249999 -v -3.312500 3.250000 -0.187499 -v -0.312500 3.250000 -0.249999 -v -0.250000 3.250000 -0.187499 -v -3.312500 3.250000 -0.249999 -v -0.312500 3.437500 -0.249999 -v -0.250000 3.437500 -0.187499 -v -3.312500 3.437500 -0.187499 -v -3.312500 3.437500 -0.249999 -v -3.312500 2.250000 -0.187500 -v -0.312500 2.250000 -0.250000 -v -0.250000 2.250000 -0.187500 -v -3.312500 2.250000 -0.250000 -v -0.312500 2.437500 -0.250000 -v -0.250000 2.437500 -0.187500 -v -3.312500 2.437500 -0.187500 -v -3.312500 2.437500 -0.250000 -v -3.312500 1.250000 -0.187500 -v -0.312500 1.250000 -0.250000 -v -0.250000 1.250000 -0.187500 -v -3.312500 1.250000 -0.250000 -v -0.312500 1.437500 -0.250000 -v -0.250000 1.437500 -0.187500 -v -3.312500 1.437500 -0.187500 -v -3.312500 1.437500 -0.250000 -v -3.312500 0.250000 -0.187500 -v -0.312500 0.250000 -0.250000 -v -0.250000 0.250000 -0.187500 -v -3.312500 0.250000 -0.250000 -v -0.312500 0.437500 -0.250000 -v -0.250000 0.437500 -0.187500 -v -3.312500 0.437500 -0.187500 -v -3.312500 0.437500 -0.250000 -v -0.437500 1.500000 0.187500 -v -0.562500 1.562500 0.250000 -v -0.562500 1.500000 0.187500 -v -0.562500 2.187500 0.187500 -v -0.437500 2.125000 0.250000 -v -0.437500 2.187500 0.187500 -v -0.437500 1.562500 0.250000 -v -0.437500 2.187500 0.187500 -v -0.562500 2.125000 0.250000 -v -0.562500 1.500000 0.187500 -v -0.437500 2.500000 0.187500 -v -0.562500 2.562500 0.250000 -v -0.562500 2.500000 0.187500 -v -0.562500 3.187500 0.187501 -v -0.437500 3.125000 0.250001 -v -0.437500 3.187500 0.187501 -v -0.437500 2.562500 0.250000 -v -0.437500 3.187500 0.187501 -v -0.562500 3.125000 0.250001 -v -0.562500 2.500000 0.187500 -v -0.562500 1.562500 -0.250000 -v -0.437500 1.500000 -0.187500 -v -0.562500 1.500000 -0.187500 -v -0.437500 2.125000 -0.250000 -v -0.562500 2.187500 -0.187500 -v -0.437500 2.187500 -0.187500 -v -0.437500 1.562500 -0.250000 -v -0.437500 2.187500 -0.187500 -v -0.562500 1.500000 -0.187500 -v -0.562500 2.125000 -0.250000 -v -0.562500 2.562500 -0.250000 -v -0.437500 2.500000 -0.187500 -v -0.562500 2.500000 -0.187500 -v -0.437500 3.125000 -0.249999 -v -0.562500 3.187500 -0.187499 -v -0.437500 3.187500 -0.187499 -v -0.437500 2.562500 -0.250000 -v -0.437500 3.187500 -0.187499 -v -0.562500 2.500000 -0.187500 -v -0.562500 3.125000 -0.249999 -v -2.125000 1.500000 0.187500 -v -3.187500 1.500000 0.250000 -v -3.187500 1.500000 0.187500 -v -3.187500 2.187500 0.250000 -v -2.125000 2.187500 0.250000 -v -2.125000 1.500000 0.250000 -v -2.125000 2.187500 0.187500 -v -3.187500 2.187500 0.187500 -v -3.187500 1.500000 -0.250000 -v -2.125000 1.500000 -0.187500 -v -3.187500 1.500000 -0.187500 -v -3.187500 2.187500 -0.250000 -v -2.125000 2.187500 -0.250000 -v -2.125000 1.500000 -0.250000 -v -2.125000 2.187500 -0.187500 -v -3.187500 2.187500 -0.187500 -v -2.812500 2.125000 -0.312500 -v -2.812500 1.562500 -0.250000 -v -2.812500 1.562500 -0.312500 -v -3.125000 1.562500 -0.250000 -v -3.125000 2.125000 -0.312500 -v -3.125000 1.562500 -0.312500 -v -3.125000 2.125000 -0.250000 -v -2.812500 2.125000 -0.250000 -v -3.312500 5.937500 0.187501 -v -0.250000 5.250000 0.187501 -v -0.250000 5.250000 0.187501 -v -0.250000 5.437500 0.187501 -v -0.250000 4.250000 0.187501 -v -0.250000 4.250000 0.187501 -v -0.250000 4.437500 0.187501 -v -0.250000 3.250000 0.187501 -v -0.250000 3.250000 0.187501 -v -0.250000 3.437500 0.187501 -v -0.250000 2.250000 0.187500 -v -0.250000 2.250000 0.187500 -v -0.250000 2.437500 0.187500 -v -0.250000 1.250000 0.187500 -v -0.250000 1.250000 0.187500 -v -0.250000 1.437500 0.187500 -v -0.250000 0.250000 0.187500 -v -0.250000 0.250000 0.187500 -v -0.250000 0.437500 0.187500 -v -0.250000 5.250000 -0.187499 -v -0.250000 5.437500 -0.187499 -v -0.250000 4.250000 -0.187499 -v -0.250000 4.437500 -0.187499 -v -0.250000 3.250000 -0.187499 -v -0.250000 3.437500 -0.187499 -v -0.250000 2.250000 -0.187500 -v -0.250000 2.437500 -0.187500 -v -0.250000 1.250000 -0.187500 -v -0.250000 1.437500 -0.187500 -v -0.250000 0.250000 -0.187500 -v -0.250000 0.437500 -0.187500 -v -0.437500 1.500000 0.187500 -v -0.562500 2.187500 0.187500 -v -0.437500 2.500000 0.187500 -v -0.562500 3.187500 0.187501 -v -0.437500 1.500000 -0.187500 -v -0.562500 2.187500 -0.187500 -v -0.437500 2.500000 -0.187500 -v -0.562500 3.187500 -0.187499 -vt 0.144330 0.822165 -vt 0.273196 0.837629 -vt 0.144330 0.837629 -vt 0.201031 0.595361 -vt 0.216495 0.837629 -vt 0.201031 0.837629 -vt 0.000000 0.822165 -vt 0.128866 0.837629 -vt -0.000000 0.837629 -vt 0.273196 0.822165 -vt 0.216495 0.595361 -vt 0.128866 0.822165 -vt 0.128866 0.837629 -vt 0.000000 0.595361 -vt 0.128866 0.595361 -vt 0.131443 0.837629 -vt 0.141753 0.837629 -vt 0.131443 0.595361 -vt 0.141753 0.595361 -vt 0.144330 0.837629 -vt 0.273196 0.837629 -vt 0.144330 0.595361 -vt 0.273196 0.595361 -vt 0.221649 0.932990 -vt 0.208763 0.935567 -vt 0.206186 0.922680 -vt 0.185567 0.932990 -vt 0.206186 0.932990 -vt 0.185567 0.935567 -vt 0.185567 0.945876 -vt 0.206186 0.935567 -vt 0.206186 0.945876 -vt 0.242268 0.932990 -vt 0.221649 0.935567 -vt 0.221649 0.932990 -vt 0.242268 0.922680 -vt 0.221649 0.922680 -vt 0.170103 0.932990 -vt 0.185567 0.922680 -vt 0.182990 0.935567 -vt 0.296392 0.958763 -vt 0.283505 0.961340 -vt 0.280928 0.948454 -vt 0.260309 0.958763 -vt 0.280928 0.958763 -vt 0.260309 0.961340 -vt 0.260309 0.971649 -vt 0.280928 0.961340 -vt 0.280928 0.971649 -vt 0.317010 0.958763 -vt 0.296392 0.961340 -vt 0.296392 0.958763 -vt 0.317010 0.948454 -vt 0.296392 0.948454 -vt 0.244845 0.958763 -vt 0.260309 0.948454 -vt 0.257732 0.961340 -vt 0.221649 0.958763 -vt 0.208763 0.961340 -vt 0.206186 0.948454 -vt 0.185567 0.958763 -vt 0.206186 0.958763 -vt 0.185567 0.961340 -vt 0.185567 0.971649 -vt 0.206186 0.961340 -vt 0.206186 0.971649 -vt 0.242268 0.958763 -vt 0.221649 0.961340 -vt 0.221649 0.958763 -vt 0.242268 0.948454 -vt 0.221649 0.948454 -vt 0.170103 0.958763 -vt 0.185567 0.948454 -vt 0.182990 0.961340 -vt 0.296392 0.984536 -vt 0.283505 0.987113 -vt 0.280928 0.974227 -vt 0.260309 0.984536 -vt 0.280928 0.984536 -vt 0.260309 0.987113 -vt 0.260309 0.997423 -vt 0.280928 0.987113 -vt 0.280928 0.997423 -vt 0.317010 0.984536 -vt 0.296392 0.987113 -vt 0.296392 0.984536 -vt 0.317010 0.974227 -vt 0.296392 0.974227 -vt 0.244845 0.984536 -vt 0.260309 0.974227 -vt 0.257732 0.987113 -vt 0.221649 0.984536 -vt 0.208763 0.987113 -vt 0.206186 0.974227 -vt 0.185567 0.984536 -vt 0.206186 0.984536 -vt 0.185567 0.987113 -vt 0.185567 0.997423 -vt 0.206186 0.987113 -vt 0.206186 0.997423 -vt 0.242268 0.984536 -vt 0.221649 0.987113 -vt 0.221649 0.984536 -vt 0.242268 0.974227 -vt 0.221649 0.974227 -vt 0.170103 0.984536 -vt 0.185567 0.974227 -vt 0.182990 0.987113 -vt 0.260309 0.932990 -vt 0.280928 0.922680 -vt 0.280928 0.932990 -vt 0.260309 0.935567 -vt 0.260309 0.945876 -vt 0.280928 0.935567 -vt 0.280928 0.945876 -vt 0.317010 0.932990 -vt 0.296392 0.935567 -vt 0.296392 0.932990 -vt 0.317010 0.922680 -vt 0.296392 0.932990 -vt 0.296392 0.922680 -vt 0.244845 0.932990 -vt 0.260309 0.922680 -vt 0.257732 0.935567 -vt 0.054124 0.886598 -vt 0.090206 0.891753 -vt 0.054124 0.891753 -vt 0.090206 0.881443 -vt 0.054124 0.881443 -vt 0.103783 0.891154 -vt 0.094671 0.891154 -vt 0.092783 0.886598 -vt 0.105670 0.881443 -vt 0.105670 0.886598 -vt 0.105670 0.899485 -vt 0.092784 0.904639 -vt 0.092784 0.899485 -vt 0.054124 0.912371 -vt 0.090206 0.907216 -vt 0.090206 0.912371 -vt 0.090206 0.902062 -vt 0.054124 0.907216 -vt 0.054124 0.902062 -vt 0.103783 0.909195 -vt 0.099227 0.911082 -vt 0.090206 0.896907 -vt 0.054124 0.896907 -vt 0.167526 0.969072 -vt 0.085052 0.974227 -vt 0.085052 0.969072 -vt 0.167526 0.963918 -vt 0.085052 0.963918 -vt 0.167526 0.958763 -vt 0.085052 0.958763 -vt 0.167526 0.994845 -vt 0.085052 1.000000 -vt 0.085052 0.994845 -vt 0.167526 0.989691 -vt 0.085052 0.989691 -vt 0.167526 0.984536 -vt 0.085052 0.984536 -vt 0.167526 0.979381 -vt 0.085052 0.979381 -vt 0.167526 0.974227 -vt 0.054124 0.853093 -vt 0.090206 0.858247 -vt 0.090206 0.853093 -vt 0.090206 0.847938 -vt 0.054124 0.847938 -vt 0.092783 0.853093 -vt 0.099227 0.859536 -vt 0.103783 0.857648 -vt 0.105670 0.847938 -vt 0.105670 0.853093 -vt 0.092784 0.871134 -vt 0.105670 0.865979 -vt 0.092784 0.865979 -vt 0.090206 0.873711 -vt 0.054124 0.878866 -vt 0.090206 0.878866 -vt 0.054124 0.873711 -vt 0.090206 0.868557 -vt 0.054124 0.868557 -vt 0.099227 0.877577 -vt 0.105670 0.871134 -vt 0.090206 0.863402 -vt 0.054124 0.863402 -vt 0.054124 0.858247 -vt 0.085052 0.930412 -vt 0.167526 0.925258 -vt 0.085052 0.925258 -vt 0.167526 0.920103 -vt 0.085052 0.920103 -vt 0.167526 0.914948 -vt 0.085052 0.914948 -vt 0.085052 0.956186 -vt 0.167526 0.951031 -vt 0.085052 0.951031 -vt 0.167526 0.945876 -vt 0.085052 0.945876 -vt 0.167526 0.940722 -vt 0.085052 0.940722 -vt 0.167526 0.935567 -vt 0.085052 0.935567 -vt 0.167526 0.930412 -vt 0.319588 0.987113 -vt 0.443299 0.989691 -vt 0.319588 0.989691 -vt 0.443299 0.997423 -vt 0.445876 0.997423 -vt 0.319588 0.997423 -vt 0.443299 1.000000 -vt 0.319588 1.000000 -vt 0.319588 0.971649 -vt 0.443299 0.974227 -vt 0.319588 0.974227 -vt 0.443299 0.981959 -vt 0.445876 0.981959 -vt 0.319588 0.981959 -vt 0.443299 0.984536 -vt 0.319588 0.984536 -vt 0.319588 0.956186 -vt 0.443299 0.958763 -vt 0.319588 0.958763 -vt 0.443299 0.966495 -vt 0.445876 0.966495 -vt 0.319588 0.966495 -vt 0.443299 0.969072 -vt 0.319588 0.969072 -vt 0.319588 0.940722 -vt 0.443299 0.943299 -vt 0.319588 0.943299 -vt 0.443299 0.951031 -vt 0.445876 0.951031 -vt 0.319588 0.951031 -vt 0.443299 0.953608 -vt 0.319588 0.953608 -vt 0.319588 0.925258 -vt 0.443299 0.927835 -vt 0.319588 0.927835 -vt 0.443299 0.935567 -vt 0.445876 0.935567 -vt 0.319588 0.935567 -vt 0.443299 0.938144 -vt 0.319588 0.938144 -vt 0.319588 0.909794 -vt 0.443299 0.912371 -vt 0.319588 0.912371 -vt 0.443299 0.920103 -vt 0.445876 0.920103 -vt 0.319588 0.920103 -vt 0.443299 0.922680 -vt 0.319588 0.922680 -vt 0.448454 0.987113 -vt 0.572165 0.989691 -vt 0.574742 0.987113 -vt 0.448454 0.989691 -vt 0.572165 0.997423 -vt 0.574742 0.997423 -vt 0.448454 0.997423 -vt 0.572165 1.000000 -vt 0.448454 1.000000 -vt 0.448454 0.971649 -vt 0.572165 0.974227 -vt 0.574742 0.971649 -vt 0.448454 0.974227 -vt 0.572165 0.981959 -vt 0.574742 0.981959 -vt 0.448454 0.981959 -vt 0.572165 0.984536 -vt 0.448454 0.984536 -vt 0.448454 0.956186 -vt 0.572165 0.958763 -vt 0.574742 0.956186 -vt 0.448454 0.958763 -vt 0.572165 0.966495 -vt 0.574742 0.966495 -vt 0.448454 0.966495 -vt 0.572165 0.969072 -vt 0.448454 0.969072 -vt 0.448454 0.940722 -vt 0.572165 0.943299 -vt 0.574742 0.940722 -vt 0.448454 0.943299 -vt 0.572165 0.951031 -vt 0.574742 0.951031 -vt 0.448454 0.951031 -vt 0.572165 0.953608 -vt 0.448454 0.953608 -vt 0.448454 0.925258 -vt 0.572165 0.927835 -vt 0.574742 0.925258 -vt 0.448454 0.927835 -vt 0.572165 0.935567 -vt 0.574742 0.935567 -vt 0.448454 0.935567 -vt 0.572165 0.938144 -vt 0.448454 0.938144 -vt 0.448454 0.909794 -vt 0.572165 0.912371 -vt 0.574742 0.909794 -vt 0.448454 0.912371 -vt 0.572165 0.920103 -vt 0.574742 0.920103 -vt 0.448454 0.920103 -vt 0.572165 0.922680 -vt 0.448454 0.922680 -vt 0.146907 0.855670 -vt 0.152062 0.853093 -vt 0.152062 0.855670 -vt 0.152062 0.878866 -vt 0.146907 0.881443 -vt 0.146907 0.878866 -vt 0.152062 0.878866 -vt 0.146907 0.855670 -vt 0.152062 0.855670 -vt 0.152062 0.878866 -vt 0.154639 0.853093 -vt 0.152062 0.855670 -vt 0.146907 0.855670 -vt 0.144330 0.881443 -vt 0.146907 0.878866 -vt 0.146907 0.886598 -vt 0.152062 0.884021 -vt 0.152062 0.886598 -vt 0.152062 0.909794 -vt 0.146907 0.912371 -vt 0.146907 0.909794 -vt 0.152062 0.909794 -vt 0.146907 0.886598 -vt 0.152062 0.886598 -vt 0.152062 0.909794 -vt 0.154639 0.884021 -vt 0.152062 0.886598 -vt 0.146907 0.886598 -vt 0.144330 0.912371 -vt 0.146907 0.909794 -vt 0.164948 0.853093 -vt 0.159794 0.855670 -vt 0.164948 0.855670 -vt 0.159794 0.881443 -vt 0.164948 0.878866 -vt 0.159794 0.878866 -vt 0.159794 0.855670 -vt 0.164948 0.878866 -vt 0.164948 0.855670 -vt 0.167526 0.853093 -vt 0.164948 0.878866 -vt 0.164948 0.855670 -vt 0.157216 0.881443 -vt 0.159794 0.855670 -vt 0.159794 0.878866 -vt 0.164948 0.884021 -vt 0.159794 0.886598 -vt 0.164948 0.886598 -vt 0.159794 0.912371 -vt 0.164948 0.909794 -vt 0.159794 0.909794 -vt 0.159794 0.886598 -vt 0.164948 0.909794 -vt 0.164948 0.886598 -vt 0.167526 0.884021 -vt 0.164948 0.909794 -vt 0.164948 0.886598 -vt 0.157216 0.912371 -vt 0.159794 0.886598 -vt 0.159794 0.909794 -vt 0.002577 0.561856 -vt 0.046392 0.559278 -vt 0.046392 0.561856 -vt 0.002577 0.590206 -vt 0.000000 0.561856 -vt 0.002577 0.561856 -vt 0.046392 0.590206 -vt 0.046392 0.561856 -vt 0.048969 0.590206 -vt 0.048969 0.561856 -vt 0.002577 0.592784 -vt 0.046392 0.592784 -vt 0.097938 0.559278 -vt 0.054124 0.561856 -vt 0.097938 0.561856 -vt 0.051546 0.561856 -vt 0.054124 0.590206 -vt 0.054124 0.561856 -vt 0.097938 0.590206 -vt 0.097938 0.561856 -vt 0.100515 0.590206 -vt 0.100515 0.561856 -vt 0.054124 0.592784 -vt 0.097938 0.592784 -vt 0.208763 0.590206 -vt 0.206186 0.567010 -vt 0.208763 0.567010 -vt 0.208763 0.567010 -vt 0.221649 0.564433 -vt 0.221649 0.567010 -vt 0.221649 0.590206 -vt 0.221649 0.567010 -vt 0.224227 0.590206 -vt 0.224227 0.567010 -vt 0.208763 0.592784 -vt 0.221649 0.592784 -vt -0.000000 0.837629 -vt 0.219072 0.935567 -vt 0.242268 0.935567 -vt 0.242268 0.932990 -vt 0.172680 0.935567 -vt 0.170103 0.922680 -vt 0.293814 0.961340 -vt 0.317010 0.961340 -vt 0.317010 0.958763 -vt 0.247423 0.961340 -vt 0.244845 0.948454 -vt 0.219072 0.961340 -vt 0.242268 0.961340 -vt 0.242268 0.958763 -vt 0.172680 0.961340 -vt 0.170103 0.948454 -vt 0.293814 0.987113 -vt 0.317010 0.987113 -vt 0.317010 0.984536 -vt 0.247423 0.987113 -vt 0.244845 0.974227 -vt 0.219072 0.987113 -vt 0.242268 0.987113 -vt 0.242268 0.984536 -vt 0.172680 0.987113 -vt 0.170103 0.974227 -vt 0.317010 0.935567 -vt 0.317010 0.932990 -vt 0.247423 0.935567 -vt 0.244845 0.922680 -vt 0.090206 0.886598 -vt 0.099227 0.893041 -vt 0.092784 0.881443 -vt 0.105670 0.904639 -vt 0.094671 0.909195 -vt 0.167526 1.000000 -vt 0.094671 0.857648 -vt 0.092784 0.847938 -vt 0.094671 0.875689 -vt 0.103783 0.875689 -vt 0.167526 0.956186 -vt 0.445876 0.987113 -vt 0.319588 0.997423 -vt 0.445876 0.989691 -vt 0.445876 0.997423 -vt 0.445876 0.971649 -vt 0.319588 0.981959 -vt 0.445876 0.974227 -vt 0.445876 0.981959 -vt 0.445876 0.956186 -vt 0.319588 0.966495 -vt 0.445876 0.958763 -vt 0.445876 0.966495 -vt 0.445876 0.940722 -vt 0.319588 0.951031 -vt 0.445876 0.943299 -vt 0.445876 0.951031 -vt 0.445876 0.925258 -vt 0.319588 0.935567 -vt 0.445876 0.927835 -vt 0.445876 0.935567 -vt 0.445876 0.909794 -vt 0.319588 0.920103 -vt 0.445876 0.912371 -vt 0.445876 0.920103 -vt 0.448454 0.997423 -vt 0.574742 0.989691 -vt 0.574742 0.997423 -vt 0.448454 0.981959 -vt 0.574742 0.974227 -vt 0.574742 0.981959 -vt 0.448454 0.966495 -vt 0.574742 0.958763 -vt 0.574742 0.966495 -vt 0.448454 0.951031 -vt 0.574742 0.943299 -vt 0.574742 0.951031 -vt 0.448454 0.935567 -vt 0.574742 0.927835 -vt 0.574742 0.935567 -vt 0.448454 0.920103 -vt 0.574742 0.912371 -vt 0.574742 0.920103 -vt 0.146907 0.853093 -vt 0.152062 0.881443 -vt 0.146907 0.878866 -vt 0.154639 0.881443 -vt 0.144330 0.853093 -vt 0.146907 0.884021 -vt 0.152062 0.912371 -vt 0.146907 0.909794 -vt 0.154639 0.912371 -vt 0.144330 0.884021 -vt 0.159794 0.853093 -vt 0.164948 0.881443 -vt 0.159794 0.878866 -vt 0.167526 0.881443 -vt 0.157216 0.853093 -vt 0.159794 0.884021 -vt 0.164948 0.912371 -vt 0.159794 0.909794 -vt 0.167526 0.912371 -vt 0.157216 0.884021 -vt 0.002577 0.559278 -vt -0.000000 0.590206 -vt 0.054124 0.559278 -vt 0.051546 0.590206 -vt 0.206186 0.590206 -vt 0.208763 0.564433 -vn 0.0000 -1.0000 -0.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 1.0000 0.0000 -vn 0.0000 -0.0000 1.0000 +v -0.187500 0.062500 -0.187500 +v -0.187500 0.562500 -0.187500 +v 0.187500 0.062500 0.125000 +v 0.125000 0.062500 0.187500 +v 0.125000 0.562500 0.187500 +v 0.187500 0.562500 0.125000 +v 0.125000 0.062500 -0.187500 +v 0.187500 0.062500 -0.125000 +v 0.187500 0.562500 -0.125000 +v 0.125000 0.562500 -0.187500 +v -0.375000 0.375000 0.312500 +v -0.687500 0.375000 0.375000 +v -0.687500 0.687500 0.375000 +v -0.500000 0.375000 0.312500 +v -0.500000 0.687500 0.312500 +v -0.562500 0.687500 0.375000 +v -0.562500 0.375000 0.375000 +v -0.687500 0.375000 0.187500 +v -0.687500 0.687500 0.187500 +v -0.375000 0.375000 0.187500 +v -0.375000 0.687500 0.187500 +v -0.375000 0.687500 0.312500 +v -0.687500 0.593750 0.356694 +v -0.687500 0.637944 0.312500 +v -0.687500 0.549556 0.312500 +v -0.687500 0.593750 0.268306 +v -3.187499 0.593750 0.356694 +v -3.187499 0.637944 0.312500 +v -3.187499 0.549556 0.312500 +v -3.187499 0.593750 0.268306 +v -0.187500 0.062500 0.187500 +v -0.187500 5.812500 0.187500 +v -0.187500 0.062500 -0.187500 +v -0.187500 5.812500 -0.187500 +v -0.312500 5.521358 0.187500 +v -3.062499 1.125000 0.243750 +v -3.062499 1.500000 0.243750 +v -0.312500 1.062500 0.187500 +v -3.062499 1.062500 0.187499 +v -0.312500 1.125000 0.243750 +v -0.312500 1.500000 0.243750 +v -0.312500 1.562500 0.187500 +v -3.062499 1.562500 0.187499 +v -3.062499 2.125000 0.243750 +v -3.062499 2.500000 0.243750 +v -0.312500 2.062500 0.187500 +v -3.062499 2.062500 0.187499 +v -0.312500 2.125000 0.243750 +v -0.312500 2.500000 0.243750 +v -0.312500 2.562500 0.187500 +v -3.062499 2.562500 0.187499 +v -3.062499 3.125000 0.243750 +v -3.062499 3.500000 0.243750 +v -0.312500 3.062500 0.187500 +v -3.062499 3.062500 0.187499 +v -0.312500 3.125000 0.243750 +v -0.312500 3.500000 0.243750 +v -0.312500 3.562500 0.187500 +v -3.062499 3.562500 0.187499 +v -3.062499 4.125000 0.243750 +v -3.062499 4.500000 0.243750 +v -0.312500 4.062500 0.187500 +v -3.062499 4.062500 0.187499 +v -0.312500 4.125000 0.243750 +v -0.312500 4.500000 0.243750 +v -0.312500 4.562500 0.187500 +v -3.062499 4.562500 0.187499 +v -3.062499 1.125000 -0.243751 +v -3.062499 1.500000 -0.243751 +v -0.312500 1.062500 -0.187501 +v -3.062499 1.062500 -0.187501 +v -0.312500 1.125000 -0.243751 +v -0.312500 1.500000 -0.243751 +v -0.312500 1.562500 -0.187501 +v -3.062499 1.562500 -0.187501 +v -3.062499 2.125000 -0.243751 +v -3.062499 2.500000 -0.243751 +v -0.312500 2.062500 -0.187501 +v -3.062499 2.062500 -0.187501 +v -0.312500 2.125000 -0.243751 +v -0.312500 2.500000 -0.243751 +v -0.312500 2.562500 -0.187501 +v -3.062499 2.562500 -0.187501 +v -3.062499 3.125000 -0.243751 +v -3.062499 3.500000 -0.243751 +v -0.312500 3.062500 -0.187501 +v -3.062499 3.062500 -0.187501 +v -0.312500 3.125000 -0.243751 +v -0.312500 3.500000 -0.243751 +v -0.312500 3.562500 -0.187501 +v -3.062499 3.562500 -0.187501 +v -3.062499 4.125000 -0.243751 +v -3.062499 4.500000 -0.243751 +v -0.312500 4.062500 -0.187501 +v -3.062499 4.062500 -0.187501 +v -0.312500 4.125000 -0.243751 +v -0.312500 4.500000 -0.243751 +v -0.312500 4.562500 -0.187501 +v -3.062499 4.562500 -0.187501 +v -2.812500 1.625000 -0.250000 +v -2.812500 2.000000 -0.250000 +v -2.812500 1.625000 -0.187500 +v -2.812500 2.000000 -0.187500 +v -2.187500 1.625000 -0.250000 +v -2.187500 2.000000 -0.250000 +v -2.187500 1.625000 -0.187500 +v -2.187500 2.000000 -0.187500 +v -0.687500 0.468750 0.356694 +v -0.687500 0.512944 0.312500 +v -0.687500 0.424556 0.312500 +v -0.687500 0.468750 0.268306 +v -3.187499 0.468750 0.356694 +v -3.187499 0.512944 0.312500 +v -3.187499 0.424556 0.312500 +v -3.187499 0.468750 0.268306 +v -0.687500 0.593750 -0.268306 +v -0.687500 0.637944 -0.312500 +v -0.687500 0.549556 -0.312500 +v -0.687500 0.593750 -0.356694 +v -3.187499 0.593750 -0.268306 +v -3.187499 0.637944 -0.312500 +v -3.187499 0.549556 -0.312500 +v -3.187499 0.593750 -0.356694 +v -0.687500 0.468750 -0.268306 +v -0.687500 0.512944 -0.312500 +v -0.687500 0.424556 -0.312500 +v -0.687500 0.468750 -0.356694 +v -3.187499 0.468750 -0.268306 +v -3.187499 0.512944 -0.312500 +v -3.187499 0.424556 -0.312500 +v -3.187499 0.468750 -0.356694 +v -2.437501 0.375000 -0.375001 +v -2.437501 0.687500 -0.375001 +v -2.437501 0.312500 -0.187501 +v -2.437501 0.750000 -0.187501 +v -2.562501 0.375000 -0.375001 +v -2.562501 0.687500 -0.375001 +v -2.562501 0.312500 -0.187501 +v -2.562501 0.750000 -0.187501 +v -2.437501 0.312500 -0.250001 +v -2.437501 0.750000 -0.250001 +v -2.562501 0.312500 -0.250001 +v -2.562501 0.750000 -0.250001 +v -2.437501 0.375000 -0.312501 +v -2.562501 0.687500 -0.312501 +v -2.437501 0.687500 -0.312501 +v -2.562501 0.375000 -0.312501 +v -0.375000 0.375000 -0.312500 +v -0.687500 0.375000 -0.375000 +v -0.687500 0.687500 -0.375000 +v -0.500000 0.375000 -0.312500 +v -0.500000 0.687500 -0.312500 +v -0.562500 0.687500 -0.375000 +v -0.562500 0.375000 -0.375000 +v -0.687500 0.375000 -0.187500 +v -0.687500 0.687500 -0.187500 +v -0.375000 0.375000 -0.187500 +v -0.375000 0.687500 -0.187500 +v -0.375000 0.687500 -0.312500 +v -0.187500 1.062500 0.187500 +v -0.187500 1.562500 0.187500 +v -0.187500 1.062500 -0.187500 +v -0.187500 1.562500 -0.187500 +v 0.187500 1.062500 0.125000 +v 0.125000 1.062500 0.187500 +v 0.125000 1.562500 0.187500 +v 0.187500 1.562500 0.125000 +v 0.125000 1.062500 -0.187500 +v 0.187500 1.062500 -0.125000 +v 0.187500 1.562500 -0.125000 +v 0.125000 1.562500 -0.187500 +v -0.187500 2.062500 0.187500 +v -0.187500 2.562500 0.187500 +v -0.187500 2.062500 -0.187500 +v -0.187500 2.562500 -0.187500 +v 0.187500 2.062500 0.125000 +v 0.125000 2.062500 0.187500 +v 0.125000 2.562500 0.187500 +v 0.187500 2.562500 0.125000 +v 0.125000 2.062500 -0.187500 +v 0.187500 2.062500 -0.125000 +v 0.187500 2.562500 -0.125000 +v 0.125000 2.562500 -0.187500 +v -0.187500 3.062500 0.187500 +v -0.187500 3.562500 0.187500 +v -0.187500 3.062500 -0.187500 +v -0.187500 3.562500 -0.187500 +v 0.187500 3.062500 0.125000 +v 0.125000 3.062500 0.187500 +v 0.125000 3.562500 0.187500 +v 0.187500 3.562500 0.125000 +v 0.125000 3.062500 -0.187500 +v 0.187500 3.062500 -0.125000 +v 0.187500 3.562500 -0.125000 +v 0.125000 3.562500 -0.187500 +v -0.187500 4.062500 0.187500 +v -0.187500 4.562500 0.187500 +v -0.187500 4.062500 -0.187500 +v -0.187500 4.562500 -0.187500 +v 0.187500 4.062500 0.125000 +v 0.125000 4.062500 0.187500 +v 0.125000 4.562500 0.187500 +v 0.187500 4.562500 0.125000 +v 0.125000 4.062500 -0.187500 +v 0.187500 4.062500 -0.125000 +v 0.187500 4.562500 -0.125000 +v 0.125000 4.562500 -0.187500 +v -0.187500 5.062500 0.187500 +v -0.187500 5.562500 0.187500 +v -0.187500 5.062500 -0.187500 +v -0.187500 5.562500 -0.187500 +v 0.187500 5.062500 0.125000 +v 0.125000 5.062500 0.187500 +v 0.125000 5.562500 0.187500 +v 0.187500 5.562500 0.125000 +v 0.125000 5.062500 -0.187500 +v 0.187500 5.062500 -0.125000 +v 0.187500 5.562500 -0.125000 +v 0.125000 5.562500 -0.187500 +v -0.312500 0.187500 -0.250000 +v -0.312500 0.187500 -0.187500 +v -0.193750 0.187500 -0.250000 +v -0.187500 5.662815 -0.187500 +v -0.193750 0.187500 -0.187500 +v -0.187500 5.662815 -0.250000 +v -3.062499 2.500000 -0.187501 +v -2.958148 3.292633 -0.187501 +v -2.652203 4.031250 -0.187501 +v -2.165514 4.665514 -0.187501 +v -1.531250 5.152203 -0.187500 +v -0.792633 5.458148 -0.187500 +v -2.760456 4.093750 -0.250001 +v -3.078888 3.324986 -0.250001 +v -3.187499 2.500000 -0.250001 +v -2.253902 4.753902 -0.250001 +v -1.593750 5.260456 -0.250000 +v -0.824985 5.578888 -0.250000 +v -2.652203 4.031250 -0.250001 +v -2.958148 3.292633 -0.250001 +v -3.062499 2.500000 -0.250001 +v -2.165514 4.665514 -0.250001 +v -1.531250 5.152203 -0.250000 +v -0.792633 5.458148 -0.250000 +v -3.062499 0.312500 -0.187501 +v -3.062499 0.312500 -0.250001 +v -3.187499 0.312500 -0.250001 +v -0.312500 5.521358 -0.250000 +v -0.193750 5.537815 -0.250000 +v -0.193750 5.537815 -0.187500 +v -0.312500 5.521358 -0.187500 +v -0.312799 5.646319 -0.250000 +v -3.187500 0.187500 -0.250001 +v -3.187500 0.312500 -0.250001 +v -0.312500 0.187500 -0.250000 +v -0.312500 0.312500 -0.250000 +v -3.187500 0.312500 -0.187501 +v -0.312500 0.312500 -0.187500 +v -0.312500 5.521358 -0.187500 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn 0.8660 -0.5000 -0.0000 +vn 0.9659 -0.2588 -0.0000 +vn 0.9979 -0.0654 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vn 0.5000 -0.8660 -0.0000 +vn 0.2588 -0.9659 -0.0000 +vn 0.1305 -0.9914 -0.0000 +vn 0.9997 -0.0250 -0.0000 +vn 0.9988 -0.0499 -0.0000 +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.7071 0.7071 +vn -0.0000 -0.7071 0.7071 +vn 0.7071 -0.0000 -0.7071 vn 0.7071 -0.0000 0.7071 -vn 1.0000 0.0000 0.0000 -vn 0.7071 0.0000 -0.7071 -vn 0.0000 0.0000 -1.0000 -vn -0.0000 -0.9808 0.1951 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 0.9808 0.1951 -vn 0.0000 0.7071 0.7071 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 0.7071 -0.7071 -vn 0.0000 -0.9808 -0.1951 -vn 0.0000 0.9808 -0.1951 -s off -f 541/779/45 549/780/45 548/781/45 -f 549/782/46 836/783/46 547/784/46 -f 836/785/47 546/786/47 547/787/47 -f 541/779/45 540/788/45 549/780/45 -f 549/782/46 540/789/46 836/783/46 -f 836/785/47 539/790/47 546/786/47 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 -0.6690 0.7433 +vn -0.0000 0.6690 0.7433 +vn -0.0000 -0.6690 -0.7433 +vn -0.0000 0.6690 -0.7433 +vt 0.313953 0.276163 +vt 0.165698 0.020349 +vt 0.313953 0.020349 +vt 0.636628 0.404070 +vt 0.630814 0.441860 +vt 0.630814 0.404070 +vt 0.636628 0.366279 +vt 0.630814 0.366279 +vt 0.636628 0.479651 +vt 0.630814 0.479651 +vt 0.630814 0.328488 +vt 0.636628 0.517442 +vt 0.630814 0.517442 +vt 0.639535 0.366279 +vt 0.639535 0.404070 +vt 0.639535 0.328488 +vt 0.686047 0.523256 +vt 0.688953 0.421512 +vt 0.688953 0.523256 +vt 0.636628 0.441860 +vt 0.639535 0.441860 +vt 0.639535 0.479651 +vt 0.639535 0.517442 +vt 0.639535 0.540698 +vt 0.575581 0.354651 +vt 0.581395 0.357558 +vt 0.575581 0.357558 +vt 0.680233 0.523256 +vt 0.686047 0.421512 +vt 0.575581 0.366279 +vt 0.325581 0.363372 +vt 0.325581 0.366279 +vt 0.325581 0.354651 +vt 0.325581 0.357558 +vt 0.630814 0.540698 +vt 0.575581 0.363372 +vt 0.581395 0.363372 +vt 0.148256 0.276163 +vt 0.000000 0.020349 +vt 0.148256 0.020349 +vt 0.459302 0.418605 +vt 0.325581 0.412791 +vt 0.459302 0.412791 +vt 0.325581 0.421512 +vt 0.325581 0.418605 +vt 0.473837 0.688953 +vt 0.459302 0.683140 +vt 0.473837 0.683140 +vt 0.456395 0.688953 +vt 0.459302 0.688953 +vt 0.476744 0.683140 +vt 0.482558 0.683140 +vt 0.479651 0.688953 +vt 0.479651 0.683140 +vt 0.450581 0.688953 +vt 0.453488 0.683140 +vt 0.453488 0.688953 +vt 0.473837 0.691860 +vt 0.476744 0.697674 +vt 0.459302 0.691860 +vt 0.476744 0.688953 +vt 0.456395 0.683140 +vt 0.473837 0.680233 +vt 0.459302 0.680233 +vt 0.456395 0.674419 +vt 0.113372 0.808140 +vt 0.110465 0.825581 +vt 0.110465 0.808140 +vt 0.081395 0.808140 +vt 0.078488 0.825581 +vt 0.078488 0.808140 +vt 0.081395 0.825581 +vt 0.081395 0.805233 +vt 0.110465 0.828488 +vt 0.081395 0.828488 +vt 0.360465 0.529070 +vt 0.345930 0.505814 +vt 0.360465 0.505814 +vt 0.377907 0.531977 +vt 0.360465 0.546512 +vt 0.363372 0.529070 +vt 0.375000 0.529070 +vt 0.363372 0.505814 +vt 0.375000 0.505814 +vt 0.392442 0.529070 +vt 0.377907 0.505814 +vt 0.392442 0.505814 +vt 0.377907 0.529070 +vt 0.377907 0.502907 +vt 0.360465 0.488372 +vt 0.383721 0.619186 +vt 0.401163 0.625000 +vt 0.383721 0.625000 +vt 0.401163 0.627907 +vt 0.383721 0.627907 +vt 0.383721 0.633721 +vt 0.401163 0.639535 +vt 0.383721 0.639535 +vt 0.401163 0.633721 +vt 0.383721 0.610465 +vt 0.401163 0.619186 +vt 0.380814 0.627907 +vt 0.375000 0.633721 +vt 0.375000 0.619186 +vt 0.409884 0.633721 +vt 0.404070 0.627907 +vt 0.063953 0.671512 +vt 0.180233 0.668605 +vt 0.180233 0.671512 +vt 0.180233 0.662791 +vt 0.063953 0.665698 +vt 0.063953 0.662791 +vt 0.063953 0.659884 +vt 0.180233 0.659884 +vt 0.063953 0.668605 +vt 0.148256 0.008721 +vt 0.165698 0.276163 +vt 0.273256 0.715116 +vt 0.145349 0.697674 +vt 0.273256 0.697674 +vt 0.273256 0.694767 +vt 0.145349 0.718023 +vt 0.145349 0.715116 +vt 0.273256 0.741279 +vt 0.145349 0.723837 +vt 0.273256 0.723837 +vt 0.273256 0.720930 +vt 0.145349 0.744186 +vt 0.145349 0.741279 +vt 0.273256 0.767442 +vt 0.145349 0.750000 +vt 0.273256 0.750000 +vt 0.273256 0.747093 +vt 0.145349 0.770349 +vt 0.145349 0.767442 +vt 0.273256 0.793605 +vt 0.145349 0.776163 +vt 0.273256 0.776163 +vt 0.273256 0.773256 +vt 0.145349 0.796512 +vt 0.145349 0.793605 +vt 0.145349 0.802326 +vt 0.273256 0.819767 +vt 0.273256 0.802326 +vt 0.273256 0.799419 +vt 0.145349 0.822674 +vt 0.145349 0.819767 +vt 0.145349 0.828488 +vt 0.273256 0.845930 +vt 0.273256 0.828488 +vt 0.273256 0.825581 +vt 0.145349 0.848837 +vt 0.145349 0.845930 +vt 0.145349 0.854651 +vt 0.273256 0.872093 +vt 0.273256 0.854651 +vt 0.273256 0.851744 +vt 0.145349 0.875000 +vt 0.145349 0.872093 +vt 0.145349 0.880814 +vt 0.273256 0.898256 +vt 0.273256 0.880814 +vt 0.273256 0.877907 +vt 0.145349 0.901163 +vt 0.145349 0.898256 +vt 0.113372 0.834302 +vt 0.110465 0.851744 +vt 0.110465 0.834302 +vt 0.081395 0.834302 +vt 0.078488 0.851744 +vt 0.078488 0.834302 +vt 0.081395 0.851744 +vt 0.081395 0.831395 +vt 0.110465 0.854651 +vt 0.081395 0.854651 +vt 0.063953 0.656977 +vt 0.180233 0.654070 +vt 0.180233 0.656977 +vt 0.180233 0.648256 +vt 0.063953 0.651163 +vt 0.063953 0.648256 +vt 0.063953 0.645349 +vt 0.180233 0.645349 +vt 0.063953 0.654070 +vt 0.183140 0.671512 +vt 0.299419 0.668605 +vt 0.299419 0.671512 +vt 0.299419 0.662791 +vt 0.183140 0.665698 +vt 0.183140 0.662791 +vt 0.183140 0.659884 +vt 0.299419 0.659884 +vt 0.183140 0.668605 +vt 0.183140 0.656977 +vt 0.299419 0.654070 +vt 0.299419 0.656977 +vt 0.299419 0.648256 +vt 0.183140 0.651163 +vt 0.183140 0.648256 +vt 0.183140 0.645349 +vt 0.299419 0.645349 +vt 0.183140 0.654070 +vt 0.459302 0.709302 +vt 0.473837 0.715116 +vt 0.473837 0.709302 +vt 0.456395 0.715116 +vt 0.459302 0.715116 +vt 0.476744 0.709302 +vt 0.479651 0.715116 +vt 0.482558 0.709302 +vt 0.479651 0.709302 +vt 0.453488 0.709302 +vt 0.450581 0.715116 +vt 0.453488 0.715116 +vt 0.473837 0.718023 +vt 0.459302 0.718023 +vt 0.476744 0.723837 +vt 0.476744 0.715116 +vt 0.456395 0.709302 +vt 0.476744 0.700581 +vt 0.459302 0.706395 +vt 0.473837 0.706395 +vt 0.401163 0.656977 +vt 0.383721 0.651163 +vt 0.383721 0.656977 +vt 0.401163 0.659884 +vt 0.383721 0.659884 +vt 0.401163 0.671512 +vt 0.383721 0.665698 +vt 0.383721 0.671512 +vt 0.401163 0.665698 +vt 0.401163 0.651163 +vt 0.383721 0.642442 +vt 0.375000 0.651163 +vt 0.380814 0.665698 +vt 0.380814 0.659884 +vt 0.404070 0.659884 +vt 0.409884 0.665698 +vt 0.395349 0.500000 +vt 0.380814 0.476744 +vt 0.395349 0.476744 +vt 0.412791 0.502907 +vt 0.395349 0.517442 +vt 0.398256 0.500000 +vt 0.409884 0.500000 +vt 0.398256 0.476744 +vt 0.409884 0.476744 +vt 0.427326 0.500000 +vt 0.412791 0.476744 +vt 0.427326 0.476744 +vt 0.412791 0.500000 +vt 0.412791 0.473837 +vt 0.395349 0.459302 +vt 0.395349 0.561047 +vt 0.380814 0.537791 +vt 0.395349 0.537791 +vt 0.412791 0.563953 +vt 0.395349 0.578488 +vt 0.398256 0.561047 +vt 0.409884 0.561047 +vt 0.398256 0.537791 +vt 0.409884 0.537791 +vt 0.427326 0.561047 +vt 0.412791 0.537791 +vt 0.427326 0.537791 +vt 0.412791 0.561047 +vt 0.412791 0.534884 +vt 0.395349 0.520349 +vt 0.430233 0.529070 +vt 0.415698 0.505814 +vt 0.430233 0.505814 +vt 0.447674 0.531977 +vt 0.430233 0.546512 +vt 0.433140 0.529070 +vt 0.444767 0.529070 +vt 0.433140 0.505814 +vt 0.444767 0.505814 +vt 0.462209 0.529070 +vt 0.447674 0.505814 +vt 0.462209 0.505814 +vt 0.447674 0.529070 +vt 0.447674 0.502907 +vt 0.430233 0.488372 +vt 0.465116 0.500000 +vt 0.450581 0.476744 +vt 0.465116 0.476744 +vt 0.482558 0.502907 +vt 0.465116 0.517442 +vt 0.468023 0.500000 +vt 0.479651 0.500000 +vt 0.468023 0.476744 +vt 0.479651 0.476744 +vt 0.497093 0.500000 +vt 0.482558 0.476744 +vt 0.497093 0.476744 +vt 0.482558 0.500000 +vt 0.482558 0.473837 +vt 0.465116 0.459302 +vt 0.465116 0.561047 +vt 0.450581 0.537791 +vt 0.465116 0.537791 +vt 0.482558 0.563953 +vt 0.465116 0.578488 +vt 0.468023 0.561047 +vt 0.479651 0.561047 +vt 0.468023 0.537791 +vt 0.479651 0.537791 +vt 0.497093 0.561047 +vt 0.482558 0.537791 +vt 0.497093 0.537791 +vt 0.482558 0.561047 +vt 0.482558 0.534884 +vt 0.465116 0.520349 +vt 0.642442 0.441860 +vt 0.648256 0.404070 +vt 0.642442 0.404070 +vt 0.648256 0.366279 +vt 0.642442 0.366279 +vt 0.648256 0.479651 +vt 0.648256 0.441860 +vt 0.642442 0.328488 +vt 0.648256 0.328488 +vt 0.642442 0.479651 +vt 0.648256 0.517442 +vt 0.651163 0.366279 +vt 0.651163 0.404070 +vt 0.651163 0.328488 +vt 0.700581 0.421512 +vt 0.697674 0.523256 +vt 0.700581 0.523256 +vt 0.651163 0.441860 +vt 0.651163 0.479651 +vt 0.651163 0.517442 +vt 0.651163 0.540698 +vt 0.581395 0.372093 +vt 0.575581 0.369186 +vt 0.575581 0.372093 +vt 0.697674 0.421512 +vt 0.691860 0.523256 +vt 0.325581 0.377907 +vt 0.575581 0.380814 +vt 0.325581 0.380814 +vt 0.325581 0.369186 +vt 0.325581 0.372093 +vt 0.642442 0.540698 +vt 0.642442 0.517442 +vt 0.575581 0.377907 +vt 0.581395 0.377907 +vt 0.325581 0.424419 +vt 0.459302 0.430233 +vt 0.459302 0.424419 +vt 0.325581 0.433140 +vt 0.325581 0.430233 +vt 0.636628 0.328488 +vt 0.636628 0.540698 +vt 0.581395 0.354651 +vt 0.680233 0.421512 +vt 0.000000 0.276163 +vt 0.459302 0.421512 +vt 0.482558 0.688953 +vt 0.450581 0.683140 +vt 0.476744 0.694767 +vt 0.456395 0.697674 +vt 0.456395 0.694767 +vt 0.476744 0.674419 +vt 0.476744 0.677326 +vt 0.456395 0.677326 +vt 0.113372 0.825581 +vt 0.110465 0.805233 +vt 0.345930 0.529070 +vt 0.377907 0.546512 +vt 0.360465 0.531977 +vt 0.377907 0.488372 +vt 0.360465 0.502907 +vt 0.401163 0.610465 +vt 0.380814 0.633721 +vt 0.409884 0.619186 +vt 0.404070 0.633721 +vt 0.180233 0.665698 +vt 0.165698 0.008721 +vt 0.145349 0.694767 +vt 0.273256 0.718023 +vt 0.145349 0.720930 +vt 0.273256 0.744186 +vt 0.145349 0.747093 +vt 0.273256 0.770349 +vt 0.145349 0.773256 +vt 0.273256 0.796512 +vt 0.145349 0.799419 +vt 0.273256 0.822674 +vt 0.145349 0.825581 +vt 0.273256 0.848837 +vt 0.145349 0.851744 +vt 0.273256 0.875000 +vt 0.145349 0.877907 +vt 0.273256 0.901163 +vt 0.113372 0.851744 +vt 0.110465 0.831395 +vt 0.180233 0.651163 +vt 0.299419 0.665698 +vt 0.299419 0.651163 +vt 0.482558 0.715116 +vt 0.450581 0.709302 +vt 0.456395 0.720930 +vt 0.456395 0.723837 +vt 0.476744 0.720930 +vt 0.476744 0.703488 +vt 0.456395 0.700581 +vt 0.456395 0.703488 +vt 0.401163 0.642442 +vt 0.375000 0.665698 +vt 0.404070 0.665698 +vt 0.409884 0.651163 +vt 0.380814 0.500000 +vt 0.412791 0.517442 +vt 0.395349 0.502907 +vt 0.412791 0.459302 +vt 0.395349 0.473837 +vt 0.380814 0.561047 +vt 0.412791 0.578488 +vt 0.395349 0.563953 +vt 0.412791 0.520349 +vt 0.395349 0.534884 +vt 0.415698 0.529070 +vt 0.447674 0.546512 +vt 0.430233 0.531977 +vt 0.447674 0.488372 +vt 0.430233 0.502907 +vt 0.450581 0.500000 +vt 0.482558 0.517442 +vt 0.465116 0.502907 +vt 0.482558 0.459302 +vt 0.465116 0.473837 +vt 0.450581 0.561047 +vt 0.482558 0.578488 +vt 0.465116 0.563953 +vt 0.482558 0.520349 +vt 0.465116 0.534884 +vt 0.648256 0.540698 +vt 0.581395 0.369186 +vt 0.691860 0.421512 +vt 0.459302 0.433140 +s 0 +usemtl TEXTURE +f 270/333/39 267/334/39 269/335/39 s 1 -f 539/791/48 540/792/48 541/793/48 -f 541/793/49 542/794/49 539/791/49 -f 543/795/50 544/796/50 545/797/50 -f 545/797/51 546/798/51 543/795/51 -f 547/799/52 548/800/52 549/801/52 -f 550/802/45 551/803/45 552/804/45 -f 553/805/48 552/804/48 554/806/48 -f 554/806/49 555/807/49 553/805/49 -f 556/808/50 551/809/50 557/810/50 -f 557/811/51 558/812/51 556/813/51 -f 559/814/52 550/802/52 560/815/52 -f 558/816/47 561/817/47 555/818/47 -f 562/819/45 563/820/45 564/821/45 -f 565/822/48 564/821/48 566/823/48 -f 566/823/49 567/824/49 565/822/49 -f 568/825/50 563/826/50 569/827/50 -f 569/828/51 570/829/51 568/830/51 -f 571/831/52 562/819/52 572/832/52 -f 570/833/47 573/834/47 567/835/47 -f 574/836/45 575/837/45 576/838/45 -f 577/839/48 576/838/48 578/840/48 -f 578/840/49 579/841/49 577/839/49 -f 580/842/50 575/843/50 581/844/50 -f 581/845/51 582/846/51 580/847/51 -f 583/848/52 574/836/52 584/849/52 -f 582/850/47 585/851/47 579/852/47 -f 586/853/45 587/854/45 588/855/45 -f 589/856/48 588/855/48 590/857/48 -f 590/857/49 591/858/49 589/856/49 -f 592/859/50 587/860/50 593/861/50 -f 593/862/51 594/863/51 592/864/51 -f 595/865/52 586/853/52 596/866/52 -f 594/867/47 597/868/47 591/869/47 -f 598/870/45 599/871/45 600/872/45 -f 601/873/48 600/872/48 602/874/48 -f 602/874/49 603/875/49 601/873/49 -f 604/876/50 599/877/50 605/878/50 -f 605/879/51 606/880/51 604/881/51 -f 607/882/52 598/870/52 608/883/52 -f 606/884/47 609/885/47 603/886/47 -f 610/887/48 611/888/48 612/889/48 -f 612/889/49 613/890/49 610/887/49 -f 614/891/50 615/892/50 616/893/50 -f 616/894/51 617/895/51 614/896/51 -f 618/897/52 619/898/52 620/899/52 -f 617/900/47 621/901/47 613/902/47 -f 622/903/53 623/904/54 624/905/54 -f 625/906/45 622/903/53 626/907/45 -f 624/908/46 627/909/46 628/910/46 -f 628/910/46 626/911/46 622/912/46 -f 629/913/50 630/914/50 625/915/50 -f 631/916/47 632/917/55 629/918/47 -f 633/919/56 628/920/55 627/921/56 -f 630/914/50 633/922/50 634/923/50 -f 634/924/48 627/921/56 635/925/48 -f 623/904/54 635/925/48 624/905/54 -f 636/926/52 637/927/57 638/928/52 -f 639/929/58 638/928/52 640/930/58 -f 641/931/47 640/930/58 642/932/47 -f 643/933/56 642/934/47 644/935/56 -f 645/936/48 644/935/56 646/937/48 -f 647/938/54 646/937/48 648/939/54 -f 649/940/45 648/939/54 650/941/45 -f 651/942/57 650/941/45 637/927/57 -f 652/943/59 653/944/57 654/945/59 -f 652/943/59 655/946/45 656/947/45 -f 657/948/46 658/949/46 659/950/46 -f 656/951/46 657/948/46 652/952/46 -f 654/953/50 660/954/50 655/955/50 -f 661/956/60 662/957/47 660/958/47 -f 657/959/60 663/960/58 664/961/58 -f 665/962/50 661/963/50 654/953/50 -f 664/961/58 665/964/52 658/965/52 -f 658/965/52 653/944/57 659/966/57 -f 666/967/54 667/968/48 668/969/48 -f 668/969/48 669/970/56 670/971/56 -f 670/971/56 671/972/47 672/973/47 -f 672/974/47 673/975/58 674/976/58 -f 674/976/58 675/977/52 676/978/52 -f 676/978/52 677/979/57 678/980/57 -f 678/980/57 679/981/45 680/982/45 -f 680/982/45 681/983/54 666/967/54 -f 682/984/45 683/985/45 684/986/45 -f 685/987/48 684/986/48 683/985/48 -f 683/985/49 686/988/49 685/987/49 -f 687/989/45 685/990/45 688/991/45 -f 689/992/45 690/993/45 691/994/45 -f 692/995/48 691/994/48 690/993/48 -f 690/993/49 693/996/49 692/995/49 -f 694/997/45 692/998/45 695/999/45 -f 696/1000/45 697/1001/45 698/1002/45 -f 699/1003/48 698/1002/48 697/1001/48 -f 697/1001/49 700/1004/49 699/1003/49 -f 701/1005/45 699/1006/45 702/1007/45 -f 703/1008/45 704/1009/45 705/1010/45 -f 706/1011/48 705/1010/48 704/1009/48 -f 704/1009/49 707/1012/49 706/1011/49 -f 708/1013/45 706/1014/45 709/1015/45 -f 710/1016/45 711/1017/45 712/1018/45 -f 713/1019/48 712/1018/48 711/1017/48 -f 711/1017/49 714/1020/49 713/1019/49 -f 715/1021/45 713/1022/45 716/1023/45 -f 717/1024/45 718/1025/45 719/1026/45 -f 720/1027/48 719/1026/48 718/1025/48 -f 718/1025/49 721/1028/49 720/1027/49 -f 722/1029/45 720/1030/45 723/1031/45 -f 724/1032/45 725/1033/45 726/1034/45 -f 727/1035/52 728/1036/52 725/1033/52 -f 729/1037/51 725/1033/51 728/1036/51 -f 730/1038/47 728/1039/47 731/1040/47 -f 732/1041/45 733/1042/45 734/1043/45 -f 735/1044/52 736/1045/52 733/1042/52 -f 737/1046/51 733/1042/51 736/1045/51 -f 738/1047/47 736/1048/47 739/1049/47 -f 740/1050/45 741/1051/45 742/1052/45 -f 743/1053/52 744/1054/52 741/1051/52 -f 745/1055/51 741/1051/51 744/1054/51 -f 746/1056/47 744/1057/47 747/1058/47 -f 748/1059/45 749/1060/45 750/1061/45 -f 751/1062/52 752/1063/52 749/1060/52 -f 753/1064/51 749/1060/51 752/1063/51 -f 754/1065/47 752/1066/47 755/1067/47 -f 756/1068/45 757/1069/45 758/1070/45 -f 759/1071/52 760/1072/52 757/1069/52 -f 761/1073/51 757/1069/51 760/1072/51 -f 762/1074/47 760/1075/47 763/1076/47 -f 764/1077/45 765/1078/45 766/1079/45 -f 767/1080/52 768/1081/52 765/1078/52 -f 769/1082/51 765/1078/51 768/1081/51 -f 770/1083/47 768/1084/47 771/1085/47 -f 772/1086/54 773/1087/54 774/1088/54 -f 775/1089/56 776/1090/56 777/1091/56 -f 776/1092/48 773/1093/48 778/1094/48 -f 778/1095/50 779/1096/50 776/1097/50 -f 780/1098/46 781/1099/46 773/1100/46 -f 782/1101/54 783/1102/54 784/1103/54 -f 785/1104/56 786/1105/56 787/1106/56 -f 786/1107/48 783/1108/48 788/1109/48 -f 788/1110/50 789/1111/50 786/1112/50 -f 790/1113/46 791/1114/46 783/1115/46 -f 792/1116/57 793/1117/57 794/1118/57 -f 795/1119/58 796/1120/58 797/1121/58 -f 792/1122/52 795/1123/52 798/1124/52 -f 799/1125/50 798/1126/50 795/1127/50 -f 800/1128/46 801/1129/46 792/1130/46 -f 802/1131/57 803/1132/57 804/1133/57 -f 805/1134/58 806/1135/58 807/1136/58 -f 802/1137/52 805/1138/52 808/1139/52 -f 809/1140/50 808/1141/50 805/1142/50 -f 810/1143/46 811/1144/46 802/1145/46 -f 812/1146/45 813/1147/45 814/1148/45 -f 815/1149/46 814/1150/46 813/1151/46 -f 816/1152/48 813/1151/48 817/1153/48 -f 818/1154/50 817/1153/50 812/1155/50 -f 819/1156/47 816/1152/47 818/1157/47 -f 820/1158/45 821/1159/45 822/1160/45 -f 822/1161/46 823/1162/46 820/1163/46 -f 820/1163/52 824/1164/52 825/1165/52 -f 825/1165/50 826/1166/50 821/1167/50 -f 824/1164/47 827/1168/47 826/1169/47 -f 828/1170/50 829/1171/50 830/1172/50 -f 831/1173/45 830/1174/45 829/1175/45 -f 832/1176/52 830/1172/52 833/1177/52 -f 834/1178/46 833/1177/46 831/1179/46 -f 835/1180/47 832/1176/47 834/1181/47 -f 539/791/48 836/1182/48 540/792/48 -f 541/793/49 544/796/49 542/794/49 -f 543/795/50 542/794/50 544/796/50 -f 545/797/51 548/800/51 546/798/51 -f 547/799/52 546/798/52 548/800/52 -f 552/804/45 560/815/45 550/802/45 -f 550/802/45 557/1183/45 551/803/45 -f 551/803/45 554/806/45 552/804/45 -f 553/805/48 561/817/48 552/804/48 -f 554/806/49 551/809/49 555/807/49 -f 556/808/50 555/807/50 551/809/50 -f 557/811/51 550/1184/51 558/812/51 -f 559/814/52 558/1185/52 550/802/52 -f 555/818/47 556/1186/47 558/816/47 -f 558/816/47 559/1187/47 561/817/47 -f 561/817/47 553/805/47 555/818/47 -f 564/821/45 572/832/45 562/819/45 -f 562/819/45 569/1188/45 563/820/45 -f 563/820/45 566/823/45 564/821/45 -f 565/822/48 573/834/48 564/821/48 -f 566/823/49 563/826/49 567/824/49 -f 568/825/50 567/824/50 563/826/50 -f 569/828/51 562/1189/51 570/829/51 -f 571/831/52 570/1190/52 562/819/52 -f 567/835/47 568/1191/47 570/833/47 -f 570/833/47 571/1192/47 573/834/47 -f 573/834/47 565/822/47 567/835/47 -f 576/838/45 584/849/45 574/836/45 -f 574/836/45 581/1193/45 575/837/45 -f 575/837/45 578/840/45 576/838/45 -f 577/839/48 585/851/48 576/838/48 -f 578/840/49 575/843/49 579/841/49 -f 580/842/50 579/841/50 575/843/50 -f 581/845/51 574/1194/51 582/846/51 -f 583/848/52 582/1195/52 574/836/52 -f 579/852/47 580/1196/47 582/850/47 -f 582/850/47 583/1197/47 585/851/47 -f 585/851/47 577/839/47 579/852/47 -f 588/855/45 596/866/45 586/853/45 -f 586/853/45 593/1198/45 587/854/45 -f 587/854/45 590/857/45 588/855/45 -f 589/856/48 597/868/48 588/855/48 -f 590/857/49 587/860/49 591/858/49 -f 592/859/50 591/858/50 587/860/50 -f 593/862/51 586/1199/51 594/863/51 -f 595/865/52 594/1200/52 586/853/52 -f 591/869/47 592/1201/47 594/867/47 -f 594/867/47 595/1202/47 597/868/47 -f 597/868/47 589/856/47 591/869/47 -f 600/872/45 608/883/45 598/870/45 -f 598/870/45 605/1203/45 599/871/45 -f 599/871/45 602/874/45 600/872/45 -f 601/873/48 609/885/48 600/872/48 -f 602/874/49 599/877/49 603/875/49 -f 604/876/50 603/875/50 599/877/50 -f 605/879/51 598/1204/51 606/880/51 -f 607/882/52 606/1205/52 598/870/52 -f 603/886/47 604/1206/47 606/884/47 -f 606/884/47 607/1207/47 609/885/47 -f 609/885/47 601/873/47 603/886/47 -f 610/887/48 621/901/48 611/888/48 -f 612/889/49 615/892/49 613/890/49 -f 614/891/50 613/890/50 615/892/50 -f 616/894/51 619/1208/51 617/895/51 -f 618/897/52 617/1209/52 619/898/52 -f 613/902/47 614/1210/47 617/900/47 -f 617/900/47 618/1211/47 621/901/47 -f 621/901/47 610/887/47 613/902/47 -f 622/903/53 630/1212/53 623/904/54 -f 625/906/45 630/1212/53 622/903/53 -f 628/910/46 622/912/46 624/908/46 -f 624/908/46 635/1213/46 627/909/46 -f 628/910/46 631/1214/46 626/911/46 -f 629/913/50 632/1215/50 630/914/50 -f 631/916/47 628/920/55 632/917/55 -f 633/919/56 632/917/55 628/920/55 -f 634/923/50 623/1216/50 630/914/50 -f 630/914/50 632/1215/50 633/922/50 -f 634/924/48 633/919/56 627/921/56 -f 623/904/54 634/924/48 635/925/48 -f 636/926/52 651/942/57 637/927/57 -f 639/929/58 636/926/52 638/928/52 -f 641/931/47 639/929/58 640/930/58 -f 643/933/56 641/1217/47 642/934/47 -f 645/936/48 643/933/56 644/935/56 -f 647/938/54 645/936/48 646/937/48 -f 649/940/45 647/938/54 648/939/54 -f 651/942/57 649/940/45 650/941/45 -f 652/943/59 659/966/57 653/944/57 -f 652/943/59 654/945/59 655/946/45 -f 659/950/46 652/952/46 657/948/46 -f 657/948/46 664/1218/46 658/949/46 -f 656/951/46 662/1219/46 657/948/46 -f 654/953/50 661/963/50 660/954/50 -f 661/956/60 657/959/60 662/957/47 -f 657/959/60 661/956/60 663/960/58 -f 654/953/50 653/1220/50 665/962/50 -f 665/962/50 663/1221/50 661/963/50 -f 664/961/58 663/960/58 665/964/52 -f 658/965/52 665/964/52 653/944/57 -f 666/967/54 681/983/54 667/968/48 -f 668/969/48 667/968/48 669/970/56 -f 670/971/56 669/970/56 671/972/47 -f 672/974/47 671/1222/47 673/975/58 -f 674/976/58 673/975/58 675/977/52 -f 676/978/52 675/977/52 677/979/57 -f 678/980/57 677/979/57 679/981/45 -f 680/982/45 679/981/45 681/983/54 -f 682/984/45 837/1223/45 683/985/45 -f 685/987/48 688/1224/48 684/986/48 -f 683/985/49 838/1225/49 686/988/49 -f 687/989/45 839/1226/45 685/990/45 -f 689/992/45 840/1227/45 690/993/45 -f 692/995/48 695/1228/48 691/994/48 -f 690/993/49 841/1229/49 693/996/49 -f 694/997/45 842/1230/45 692/998/45 -f 696/1000/45 843/1231/45 697/1001/45 -f 699/1003/48 702/1232/48 698/1002/48 -f 697/1001/49 844/1233/49 700/1004/49 -f 701/1005/45 845/1234/45 699/1006/45 -f 703/1008/45 846/1235/45 704/1009/45 -f 706/1011/48 709/1236/48 705/1010/48 -f 704/1009/49 847/1237/49 707/1012/49 -f 708/1013/45 848/1238/45 706/1014/45 -f 710/1016/45 849/1239/45 711/1017/45 -f 713/1019/48 716/1240/48 712/1018/48 -f 711/1017/49 850/1241/49 714/1020/49 -f 715/1021/45 851/1242/45 713/1022/45 -f 717/1024/45 852/1243/45 718/1025/45 -f 720/1027/48 723/1244/48 719/1026/48 -f 718/1025/49 853/1245/49 721/1028/49 -f 722/1029/45 854/1246/45 720/1030/45 -f 724/1032/45 727/1035/45 725/1033/45 -f 727/1035/52 731/1247/52 728/1036/52 -f 729/1037/51 855/1248/51 725/1033/51 -f 730/1038/47 856/1249/47 728/1039/47 -f 732/1041/45 735/1044/45 733/1042/45 -f 735/1044/52 739/1250/52 736/1045/52 -f 737/1046/51 857/1251/51 733/1042/51 -f 738/1047/47 858/1252/47 736/1048/47 -f 740/1050/45 743/1053/45 741/1051/45 -f 743/1053/52 747/1253/52 744/1054/52 -f 745/1055/51 859/1254/51 741/1051/51 -f 746/1056/47 860/1255/47 744/1057/47 -f 748/1059/45 751/1062/45 749/1060/45 -f 751/1062/52 755/1256/52 752/1063/52 -f 753/1064/51 861/1257/51 749/1060/51 -f 754/1065/47 862/1258/47 752/1066/47 -f 756/1068/45 759/1071/45 757/1069/45 -f 759/1071/52 763/1259/52 760/1072/52 -f 761/1073/51 863/1260/51 757/1069/51 -f 762/1074/47 864/1261/47 760/1075/47 -f 764/1077/45 767/1080/45 765/1078/45 -f 767/1080/52 771/1262/52 768/1081/52 -f 769/1082/51 865/1263/51 765/1078/51 -f 770/1083/47 866/1264/47 768/1084/47 -f 772/1086/54 778/1265/54 773/1087/54 -f 775/1089/56 780/1266/56 776/1090/56 -f 776/1092/48 780/1267/48 773/1093/48 -f 778/1095/50 867/1268/50 779/1096/50 -f 780/1098/46 868/1269/46 781/1099/46 -f 782/1101/54 788/1270/54 783/1102/54 -f 785/1104/56 790/1271/56 786/1105/56 -f 786/1107/48 790/1272/48 783/1108/48 -f 788/1110/50 869/1273/50 789/1111/50 -f 790/1113/46 870/1274/46 791/1114/46 -f 792/1116/57 798/1275/57 793/1117/57 -f 795/1119/58 801/1276/58 796/1120/58 -f 792/1122/52 801/1277/52 795/1123/52 -f 799/1125/50 871/1278/50 798/1126/50 -f 800/1128/46 872/1279/46 801/1129/46 -f 802/1131/57 808/1280/57 803/1132/57 -f 805/1134/58 811/1281/58 806/1135/58 -f 802/1137/52 811/1282/52 805/1138/52 -f 809/1140/50 873/1283/50 808/1141/50 -f 810/1143/46 874/1284/46 811/1144/46 -f 812/1146/45 817/1285/45 813/1147/45 -f 815/1149/46 819/1286/46 814/1150/46 -f 816/1152/48 815/1149/48 813/1151/48 -f 818/1154/50 816/1152/50 817/1153/50 -f 819/1156/47 815/1149/47 816/1152/47 -f 820/1158/45 825/1287/45 821/1159/45 -f 822/1161/46 827/1288/46 823/1162/46 -f 820/1163/52 823/1162/52 824/1164/52 -f 825/1165/50 824/1164/50 826/1166/50 -f 824/1164/47 823/1162/47 827/1168/47 -f 828/1170/50 835/1289/50 829/1171/50 -f 831/1173/45 833/1290/45 830/1174/45 -f 832/1176/52 828/1170/52 830/1172/52 -f 834/1178/46 832/1176/46 833/1177/46 -f 835/1180/47 828/1170/47 832/1176/47 +f 289/336/40 286/337/40 283/338/40 +f 290/339/40 283/338/40 284/340/40 +f 286/337/40 293/341/40 287/342/40 +f 285/343/40 290/339/40 284/340/40 +f 287/342/40 294/344/40 288/345/40 +f 289/336/41 278/346/42 279/347/41 +f 290/339/42 277/348/43 278/346/42 +f 291/349/43 295/350/44 277/351/43 +f 292/352/45 279/347/41 280/353/45 +f 293/341/46 280/353/45 281/354/46 +f 294/344/47 281/354/46 282/355/47 +f 301/356/48 294/344/47 282/355/47 +f 300/357/49 276/358/50 299/359/49 +f 285/360/40 296/361/40 291/349/40 +f 298/362/51 272/363/51 271/364/51 +f 273/365/44 300/359/49 299/357/49 +f 273/363/40 298/359/40 271/366/40 +f 294/344/40 302/367/40 288/345/40 +f 302/358/40 299/368/40 276/369/40 +s 0 +f 304/370/40 305/371/40 303/372/40 +s 1 +f 310/373/40 307/374/40 309/375/40 +f 310/373/52 311/376/52 308/377/52 +f 313/378/40 318/379/40 317/380/40 +f 313/381/53 328/379/53 325/382/53 +f 318/383/52 327/378/52 326/380/52 +f 324/384/52 316/385/52 320/386/52 +f 321/387/53 319/388/53 315/389/53 +f 325/390/44 315/391/44 327/392/44 +f 326/386/54 322/393/54 324/383/54 +f 325/389/55 323/394/55 321/381/55 +f 328/395/51 326/396/51 320/397/51 +f 331/398/44 330/399/44 329/400/44 +f 333/401/51 336/402/51 335/403/51 +f 329/400/40 334/404/40 333/401/40 +f 329/405/53 335/400/53 331/401/53 +f 334/404/52 332/406/52 336/407/52 +f 343/408/40 337/409/40 342/410/40 +f 348/411/52 338/412/52 344/413/52 +f 347/414/44 341/415/44 346/416/44 +f 340/417/39 345/418/39 339/419/39 +f 346/416/56 348/420/56 347/414/56 +f 342/410/57 344/413/57 343/408/57 +f 345/421/53 341/415/53 337/422/53 +f 351/423/40 355/424/40 354/425/40 +f 354/425/57 352/426/57 353/427/57 +f 360/428/44 358/429/44 359/430/44 +f 349/431/40 353/427/40 352/426/40 +f 357/432/51 350/433/51 351/423/51 +f 353/434/52 359/435/52 357/436/52 +f 350/433/53 358/437/53 352/438/53 +f 367/439/58 364/440/58 363/441/58 +f 361/442/54 366/443/54 365/444/54 +f 361/442/55 367/445/55 363/446/55 +f 366/443/59 364/440/59 368/447/59 +f 369/448/44 372/449/44 370/370/44 +f 379/450/40 374/451/40 378/452/40 +f 374/451/60 376/453/60 378/452/60 +f 379/450/61 381/454/61 375/455/61 +f 387/456/40 382/457/40 386/458/40 +f 382/457/60 384/459/60 386/458/60 +f 387/456/61 389/460/61 383/461/61 +f 395/462/40 390/463/40 394/464/40 +f 390/463/60 392/465/60 394/464/60 +f 395/462/61 397/466/61 391/467/61 +f 403/468/40 398/469/40 402/470/40 +f 398/469/60 400/471/60 402/470/60 +f 403/468/61 405/472/61 399/473/61 +f 406/474/39 411/475/39 410/476/39 +f 408/477/62 406/474/62 410/476/62 +f 413/478/63 411/475/63 407/479/63 +f 414/480/39 419/481/39 418/482/39 +f 416/483/62 414/480/62 418/482/62 +f 421/484/63 419/481/63 415/485/63 +f 422/486/39 427/487/39 426/488/39 +f 424/489/62 422/486/62 426/488/62 +f 429/490/63 427/487/63 423/491/63 +f 430/492/39 435/493/39 434/494/39 +f 432/495/62 430/492/62 434/494/62 +f 437/496/63 435/493/63 431/497/63 +f 440/498/51 439/499/51 438/500/51 +f 442/501/44 445/502/44 444/503/44 +f 438/500/39 443/504/39 442/501/39 +f 438/505/53 444/500/53 440/501/53 +f 443/504/52 441/506/52 445/507/52 +f 452/508/58 449/509/58 448/510/58 +f 446/511/54 451/512/54 450/513/54 +f 446/511/55 452/514/55 448/515/55 +f 451/512/59 449/509/59 453/516/59 +f 460/517/58 457/518/58 456/519/58 +f 454/520/54 459/521/54 458/522/54 +f 454/520/55 460/523/55 456/524/55 +f 459/521/59 457/518/59 461/525/59 +f 468/526/58 465/527/58 464/528/58 +f 462/529/54 467/530/54 466/531/54 +f 462/529/55 468/532/55 464/533/55 +f 467/530/59 465/527/59 469/534/59 +f 475/535/39 470/536/39 474/537/39 +f 485/535/53 470/538/53 482/539/53 +f 484/536/52 475/540/52 483/537/52 +f 473/541/52 481/542/52 477/543/52 +f 476/544/53 478/545/53 472/546/53 +f 482/547/44 484/548/44 472/549/44 +f 479/550/59 483/543/59 481/540/59 +f 480/551/58 482/546/58 478/538/58 +f 476/552/51 483/553/51 485/554/51 +f 492/555/39 488/556/39 491/557/39 +f 489/558/56 491/557/56 490/559/56 +f 495/560/44 497/561/44 496/562/44 +f 490/559/39 486/563/39 489/558/39 +f 487/564/51 494/565/51 488/556/51 +f 494/566/52 497/567/52 490/568/52 +f 489/569/53 495/570/53 487/564/53 +f 504/571/40 498/572/40 503/573/40 +f 509/574/52 499/575/52 505/576/52 +f 508/577/44 502/578/44 507/579/44 +f 501/580/39 506/581/39 500/582/39 +f 507/579/56 509/583/56 508/577/56 +f 503/573/57 505/576/57 504/571/57 +f 506/584/53 502/578/53 498/585/53 +f 516/586/40 510/587/40 515/588/40 +f 521/589/52 511/590/52 517/591/52 +f 520/592/44 514/593/44 519/594/44 +f 513/595/39 518/596/39 512/597/39 +f 519/594/56 521/598/56 520/592/56 +f 515/588/57 517/591/57 516/586/57 +f 518/599/53 514/593/53 510/600/53 +f 528/601/40 522/602/40 527/603/40 +f 533/604/52 523/605/52 529/606/52 +f 532/607/44 526/608/44 531/609/44 +f 525/610/39 530/611/39 524/612/39 +f 531/609/56 533/613/56 532/607/56 +f 527/603/57 529/606/57 528/601/57 +f 530/614/53 526/608/53 522/615/53 +f 540/616/40 534/617/40 539/618/40 +f 545/619/52 535/620/52 541/621/52 +f 544/622/44 538/623/44 543/624/44 +f 537/625/39 542/626/39 536/627/39 +f 543/624/56 545/628/56 544/622/56 +f 539/618/57 541/621/57 540/616/57 +f 542/629/53 538/623/53 534/630/53 +f 552/631/40 546/632/40 551/633/40 +f 557/634/52 547/635/52 553/636/52 +f 556/637/44 550/638/44 555/639/44 +f 549/640/39 554/641/39 548/642/39 +f 555/639/56 557/643/56 556/637/56 +f 551/633/57 553/636/57 552/631/57 +f 554/644/53 550/638/53 546/645/53 +f 573/646/39 576/647/39 570/648/39 +f 570/648/39 577/649/39 571/650/39 +f 573/646/39 580/651/39 579/652/39 +f 572/653/39 577/649/39 578/654/39 +f 574/655/39 581/656/39 580/651/39 +f 565/657/42 576/647/41 566/658/41 +f 564/659/43 577/649/42 565/657/42 +f 582/660/44 578/661/43 564/662/43 +f 566/658/41 579/652/45 567/663/45 +f 567/663/45 580/651/46 568/664/46 +f 568/664/46 581/656/47 569/665/47 +f 581/656/47 588/666/48 569/665/47 +f 563/667/50 587/668/49 586/669/49 +f 583/670/39 572/671/39 578/661/39 +f 559/672/51 585/673/51 558/674/51 +f 587/669/49 560/675/44 586/668/49 +f 585/669/39 560/672/39 558/676/39 +f 589/677/39 581/656/39 575/678/39 +f 586/679/39 589/667/39 563/680/39 +f 590/681/39 593/682/39 592/683/39 +f 594/684/52 593/682/52 591/685/52 +s 0 +f 270/333/39 268/449/39 267/334/39 +s 1 +f 289/336/40 292/352/40 286/337/40 +f 290/339/40 289/336/40 283/338/40 +f 286/337/40 292/352/40 293/341/40 +f 285/343/40 291/686/40 290/339/40 +f 287/342/40 293/341/40 294/344/40 +f 289/336/41 290/339/42 278/346/42 +f 290/339/42 291/686/43 277/348/43 +f 291/349/43 296/361/44 295/350/44 +f 292/352/45 289/336/41 279/347/41 +f 293/341/46 292/352/45 280/353/45 +f 294/344/47 293/341/46 281/354/46 +f 301/356/48 298/687/48 294/344/47 +f 300/357/49 274/688/50 276/358/50 +f 285/360/40 297/689/40 296/361/40 +f 298/362/51 373/368/51 272/363/51 +f 273/365/44 275/366/44 300/359/49 +f 273/363/40 299/368/40 298/359/40 +f 294/344/40 298/687/40 302/367/40 +f 302/358/40 298/359/40 299/368/40 +s 0 +f 304/370/40 306/690/40 305/371/40 +s 1 +f 310/373/40 308/377/40 307/374/40 +f 310/373/52 312/691/52 311/376/52 +f 313/378/40 314/382/40 318/379/40 +f 313/381/53 317/394/53 328/379/53 +f 318/383/52 314/393/52 327/378/52 +f 324/384/52 322/692/52 316/385/52 +f 321/387/53 323/693/53 319/388/53 +f 325/390/44 321/694/44 315/391/44 +f 315/391/44 316/695/44 322/696/44 +f 327/392/44 314/382/44 313/378/44 +f 315/391/44 322/696/44 327/392/44 +f 327/392/44 313/378/44 325/390/44 +f 326/386/54 327/385/54 322/393/54 +f 325/389/55 328/388/55 323/394/55 +f 319/697/51 323/698/51 328/395/51 +f 328/395/51 317/380/51 318/379/51 +f 326/396/51 324/699/51 320/397/51 +f 328/395/51 318/379/51 326/396/51 +f 320/397/51 319/697/51 328/395/51 +f 331/398/44 332/700/44 330/399/44 +f 333/401/51 334/404/51 336/402/51 +f 329/400/40 330/399/40 334/404/40 +f 329/405/53 333/701/53 335/400/53 +f 334/404/52 330/399/52 332/406/52 +f 343/408/40 338/702/40 337/409/40 +f 344/413/52 347/414/52 348/411/52 +f 348/411/52 340/703/52 338/412/52 +f 338/412/52 343/704/52 344/413/52 +f 347/414/44 344/413/44 341/415/44 +f 340/417/39 348/420/39 345/418/39 +f 346/416/56 345/418/56 348/420/56 +f 342/410/57 341/415/57 344/413/57 +f 337/422/53 339/705/53 345/421/53 +f 345/421/53 346/416/53 341/415/53 +f 341/415/53 342/706/53 337/422/53 +f 351/423/40 350/433/40 355/424/40 +f 354/425/57 355/424/57 352/426/57 +f 360/428/44 349/431/44 358/429/44 +f 349/431/40 360/428/40 353/427/40 +f 357/432/51 356/707/51 350/433/51 +f 357/436/52 351/423/52 354/425/52 +f 353/434/52 360/708/52 359/435/52 +f 357/436/52 354/425/52 353/434/52 +f 352/438/53 355/424/53 350/433/53 +f 350/433/53 356/709/53 358/437/53 +f 358/437/53 349/710/53 352/438/53 +f 367/439/58 368/447/58 364/440/58 +f 361/442/54 362/711/54 366/443/54 +f 361/442/55 365/444/55 367/445/55 +f 366/443/59 362/711/59 364/440/59 +f 369/448/44 371/712/44 372/449/44 +f 379/450/40 375/455/40 374/451/40 +f 374/451/60 377/713/60 376/453/60 +f 379/450/61 380/714/61 381/454/61 +f 387/456/40 383/461/40 382/457/40 +f 382/457/60 385/715/60 384/459/60 +f 387/456/61 388/716/61 389/460/61 +f 395/462/40 391/467/40 390/463/40 +f 390/463/60 393/717/60 392/465/60 +f 395/462/61 396/718/61 397/466/61 +f 403/468/40 399/473/40 398/469/40 +f 398/469/60 401/719/60 400/471/60 +f 403/468/61 404/720/61 405/472/61 +f 406/474/39 407/479/39 411/475/39 +f 408/477/62 409/721/62 406/474/62 +f 413/478/63 412/722/63 411/475/63 +f 414/480/39 415/485/39 419/481/39 +f 416/483/62 417/723/62 414/480/62 +f 421/484/63 420/724/63 419/481/63 +f 422/486/39 423/491/39 427/487/39 +f 424/489/62 425/725/62 422/486/62 +f 429/490/63 428/726/63 427/487/63 +f 430/492/39 431/497/39 435/493/39 +f 432/495/62 433/727/62 430/492/62 +f 437/496/63 436/728/63 435/493/63 +f 440/498/51 441/729/51 439/499/51 +f 442/501/44 443/504/44 445/502/44 +f 438/500/39 439/499/39 443/504/39 +f 438/505/53 442/730/53 444/500/53 +f 443/504/52 439/499/52 441/506/52 +f 452/508/58 453/516/58 449/509/58 +f 446/511/54 447/731/54 451/512/54 +f 446/511/55 450/513/55 452/514/55 +f 451/512/59 447/731/59 449/509/59 +f 460/517/58 461/525/58 457/518/58 +f 454/520/54 455/732/54 459/521/54 +f 454/520/55 458/522/55 460/523/55 +f 459/521/59 455/732/59 457/518/59 +f 468/526/58 469/534/58 465/527/58 +f 462/529/54 463/733/54 467/530/54 +f 462/529/55 466/531/55 468/532/55 +f 467/530/59 463/733/59 465/527/59 +f 475/535/39 471/539/39 470/536/39 +f 485/535/53 474/551/53 470/538/53 +f 484/536/52 471/550/52 475/540/52 +f 473/541/52 479/734/52 481/542/52 +f 476/544/53 480/735/53 478/545/53 +f 482/547/44 470/536/44 471/539/44 +f 484/548/44 479/736/44 473/737/44 +f 482/547/44 471/539/44 484/548/44 +f 472/549/44 478/738/44 482/547/44 +f 484/548/44 473/737/44 472/549/44 +f 479/550/59 484/541/59 483/543/59 +f 480/551/58 485/544/58 482/546/58 +f 485/554/51 480/739/51 476/552/51 +f 476/552/51 477/740/51 481/741/51 +f 483/553/51 475/535/51 474/537/51 +f 476/552/51 481/741/51 483/553/51 +f 483/553/51 474/537/51 485/554/51 +f 492/555/39 487/564/39 488/556/39 +f 489/558/56 492/555/56 491/557/56 +f 495/560/44 486/563/44 497/561/44 +f 490/559/39 497/561/39 486/563/39 +f 487/564/51 493/742/51 494/565/51 +f 491/557/52 488/556/52 494/566/52 +f 494/566/52 496/743/52 497/567/52 +f 490/568/52 491/557/52 494/566/52 +f 487/564/53 492/555/53 489/569/53 +f 489/569/53 486/744/53 495/570/53 +f 495/570/53 493/745/53 487/564/53 +f 504/571/40 499/746/40 498/572/40 +f 505/576/52 508/577/52 509/574/52 +f 509/574/52 501/747/52 499/575/52 +f 499/575/52 504/748/52 505/576/52 +f 508/577/44 505/576/44 502/578/44 +f 501/580/39 509/583/39 506/581/39 +f 507/579/56 506/581/56 509/583/56 +f 503/573/57 502/578/57 505/576/57 +f 498/585/53 500/749/53 506/584/53 +f 506/584/53 507/579/53 502/578/53 +f 502/578/53 503/750/53 498/585/53 +f 516/586/40 511/751/40 510/587/40 +f 517/591/52 520/592/52 521/589/52 +f 521/589/52 513/752/52 511/590/52 +f 511/590/52 516/753/52 517/591/52 +f 520/592/44 517/591/44 514/593/44 +f 513/595/39 521/598/39 518/596/39 +f 519/594/56 518/596/56 521/598/56 +f 515/588/57 514/593/57 517/591/57 +f 510/600/53 512/754/53 518/599/53 +f 518/599/53 519/594/53 514/593/53 +f 514/593/53 515/755/53 510/600/53 +f 528/601/40 523/756/40 522/602/40 +f 529/606/52 532/607/52 533/604/52 +f 533/604/52 525/757/52 523/605/52 +f 523/605/52 528/758/52 529/606/52 +f 532/607/44 529/606/44 526/608/44 +f 525/610/39 533/613/39 530/611/39 +f 531/609/56 530/611/56 533/613/56 +f 527/603/57 526/608/57 529/606/57 +f 522/615/53 524/759/53 530/614/53 +f 530/614/53 531/609/53 526/608/53 +f 526/608/53 527/760/53 522/615/53 +f 540/616/40 535/761/40 534/617/40 +f 541/621/52 544/622/52 545/619/52 +f 545/619/52 537/762/52 535/620/52 +f 535/620/52 540/763/52 541/621/52 +f 544/622/44 541/621/44 538/623/44 +f 537/625/39 545/628/39 542/626/39 +f 543/624/56 542/626/56 545/628/56 +f 539/618/57 538/623/57 541/621/57 +f 534/630/53 536/764/53 542/629/53 +f 542/629/53 543/624/53 538/623/53 +f 538/623/53 539/765/53 534/630/53 +f 552/631/40 547/766/40 546/632/40 +f 553/636/52 556/637/52 557/634/52 +f 557/634/52 549/767/52 547/635/52 +f 547/635/52 552/768/52 553/636/52 +f 556/637/44 553/636/44 550/638/44 +f 549/640/39 557/643/39 554/641/39 +f 555/639/56 554/641/56 557/643/56 +f 551/633/57 550/638/57 553/636/57 +f 546/645/53 548/769/53 554/644/53 +f 554/644/53 555/639/53 550/638/53 +f 550/638/53 551/770/53 546/645/53 +f 573/646/39 579/652/39 576/647/39 +f 570/648/39 576/647/39 577/649/39 +f 573/646/39 574/655/39 580/651/39 +f 572/653/39 571/650/39 577/649/39 +f 574/655/39 575/678/39 581/656/39 +f 565/657/42 577/649/42 576/647/41 +f 564/659/43 578/654/43 577/649/42 +f 582/660/44 583/670/44 578/661/43 +f 566/658/41 576/647/41 579/652/45 +f 567/663/45 579/652/45 580/651/46 +f 568/664/46 580/651/46 581/656/47 +f 581/656/47 585/771/48 588/666/48 +f 563/667/50 561/772/50 587/668/49 +f 583/670/39 584/773/39 572/671/39 +f 559/672/51 596/679/51 585/673/51 +f 587/669/49 562/676/44 560/675/44 +f 585/669/39 586/679/39 560/672/39 +f 589/677/39 585/771/39 581/656/39 +f 586/679/39 585/669/39 589/667/39 +f 590/681/39 591/685/39 593/682/39 +f 594/684/52 595/774/52 593/682/52 +o Right +v 0.187500 0.312500 0.187500 +v 0.187500 5.812500 0.187500 +v 3.374999 0.312500 0.187501 +v 3.374999 5.812500 0.187501 +v 0.312500 0.187500 -0.250000 +v 0.312500 0.187500 -0.187500 +v 0.193750 0.187500 -0.250000 +v 0.193750 5.662815 -0.187500 +v 0.193750 0.187500 -0.187500 +v 0.193750 5.662815 -0.250000 +v 3.062499 2.500000 -0.187500 +v 2.958148 3.292633 -0.187500 +v 2.652203 4.031250 -0.187500 +v 2.165514 4.665514 -0.187500 +v 1.531250 5.152203 -0.187500 +v 0.792633 5.458148 -0.187500 +v 2.760456 4.093750 -0.250000 +v 3.078888 3.324986 -0.250000 +v 3.187499 2.500000 -0.250000 +v 2.253902 4.753902 -0.250000 +v 1.593750 5.260456 -0.250000 +v 0.824985 5.578888 -0.250000 +v 2.652203 4.031250 -0.250000 +v 2.958148 3.292633 -0.250000 +v 3.062499 2.500000 -0.250000 +v 2.165514 4.665514 -0.250000 +v 1.531250 5.152203 -0.250000 +v 0.792633 5.458148 -0.250000 +v 3.062499 0.312500 -0.187500 +v 3.062499 0.312500 -0.250000 +v 3.187499 0.312500 -0.250000 +v 0.312500 5.521358 -0.250000 +v 0.193750 5.537815 -0.250000 +v 0.193750 5.537815 -0.187500 +v 0.312500 5.521358 -0.187500 +v 0.312799 5.646319 -0.250000 +v 0.187500 0.312500 -0.187500 +v 0.187500 5.812500 -0.187500 +v 3.374999 0.312500 -0.187499 +v 3.374999 5.812500 -0.187499 +v 3.187500 0.187500 -0.250000 +v 3.187500 0.312500 -0.250000 +v 0.312500 0.187500 -0.250000 +v 0.312500 0.312500 -0.250000 +v 3.187500 0.312500 -0.187500 +v 0.312500 0.312500 -0.187500 +v 2.437501 0.375000 -0.375000 +v 2.437501 0.687500 -0.375000 +v 2.437501 0.312500 -0.187500 +v 2.437501 0.750000 -0.187500 +v 2.562501 0.375000 -0.375000 +v 2.562501 0.687500 -0.375000 +v 2.562501 0.312500 -0.187500 +v 2.562501 0.750000 -0.187500 +v 2.437501 0.312500 -0.250000 +v 2.437501 0.750000 -0.250000 +v 2.562501 0.312500 -0.250000 +v 2.562501 0.750000 -0.250000 +v 2.437501 0.375000 -0.312500 +v 2.562501 0.687500 -0.312500 +v 2.437501 0.687500 -0.312500 +v 2.562501 0.375000 -0.312500 +v 2.187500 1.625000 -0.250000 +v 2.187500 2.000000 -0.250000 +v 2.187500 1.625000 -0.187500 +v 2.187500 2.000000 -0.187500 +v 2.812500 1.625000 -0.250000 +v 2.812500 2.000000 -0.250000 +v 2.812500 1.625000 -0.187500 +v 2.812500 2.000000 -0.187500 +v 0.187500 0.562500 -0.187500 +v 0.187500 1.062500 -0.187500 +v 0.187500 0.562500 0.187500 +v 0.187500 1.062500 0.187500 +v -0.187500 0.562500 -0.125000 +v -0.125000 0.562500 -0.187500 +v -0.125000 1.062500 -0.187500 +v -0.187500 1.062500 -0.125000 +v -0.125000 0.562500 0.187500 +v -0.187500 0.562500 0.125000 +v -0.187500 1.062500 0.125000 +v -0.125000 1.062500 0.187500 +v 0.375000 0.375000 -0.312500 +v 0.687500 0.375000 -0.375000 +v 0.687500 0.687500 -0.375000 +v 0.500000 0.375000 -0.312500 +v 0.500000 0.687500 -0.312500 +v 0.562500 0.687500 -0.375000 +v 0.562500 0.375000 -0.375000 +v 0.687500 0.375000 -0.187500 +v 0.687500 0.687500 -0.187500 +v 0.375000 0.375000 -0.187500 +v 0.375000 0.687500 -0.187500 +v 0.375000 0.687500 -0.312500 +v 0.687500 0.593750 -0.356694 +v 0.687500 0.637944 -0.312500 +v 0.687500 0.549556 -0.312500 +v 0.687500 0.593750 -0.268306 +v 3.187499 0.593750 -0.356694 +v 3.187499 0.637944 -0.312499 +v 3.187499 0.549556 -0.312499 +v 3.187499 0.593750 -0.268305 +v 0.187500 0.062500 -0.187500 +v 0.187500 5.812500 -0.187500 +v 0.187500 0.062500 0.187500 +v 0.187500 5.812500 0.187500 +v 0.312500 5.521358 -0.187500 +v 3.062499 1.125000 -0.243749 +v 3.062499 1.500000 -0.243749 +v 0.312500 1.062500 -0.187500 +v 3.062499 1.062500 -0.187499 +v 0.312500 1.125000 -0.243750 +v 0.312500 1.500000 -0.243750 +v 0.312500 1.562500 -0.187500 +v 3.062499 1.562500 -0.187499 +v 3.062499 2.125000 -0.243749 +v 3.062499 2.500000 -0.243749 +v 0.312500 2.062500 -0.187500 +v 3.062499 2.062500 -0.187499 +v 0.312500 2.125000 -0.243750 +v 0.312500 2.500000 -0.243750 +v 0.312500 2.562500 -0.187500 +v 3.062499 2.562500 -0.187499 +v 3.062499 3.125000 -0.243749 +v 3.062499 3.500000 -0.243749 +v 0.312500 3.062500 -0.187500 +v 3.062499 3.062500 -0.187499 +v 0.312500 3.125000 -0.243750 +v 0.312500 3.500000 -0.243750 +v 0.312500 3.562500 -0.187500 +v 3.062499 3.562500 -0.187499 +v 3.062499 4.125000 -0.243749 +v 3.062499 4.500000 -0.243749 +v 0.312500 4.062500 -0.187500 +v 3.062499 4.062500 -0.187499 +v 0.312500 4.125000 -0.243750 +v 0.312500 4.500000 -0.243750 +v 0.312500 4.562500 -0.187500 +v 3.062499 4.562500 -0.187499 +v 3.062499 1.125000 0.243751 +v 3.062499 1.500000 0.243751 +v 0.312499 1.062500 0.187501 +v 3.062499 1.062500 0.187502 +v 0.312499 1.125000 0.243751 +v 0.312499 1.500000 0.243751 +v 0.312499 1.562500 0.187501 +v 3.062499 1.562500 0.187502 +v 3.062499 2.125000 0.243751 +v 3.062499 2.500000 0.243751 +v 0.312499 2.062500 0.187501 +v 3.062499 2.062500 0.187502 +v 0.312499 2.125000 0.243751 +v 0.312499 2.500000 0.243751 +v 0.312499 2.562500 0.187501 +v 3.062499 2.562500 0.187502 +v 3.062499 3.125000 0.243751 +v 3.062499 3.500000 0.243751 +v 0.312499 3.062500 0.187501 +v 3.062499 3.062500 0.187502 +v 0.312499 3.125000 0.243751 +v 0.312499 3.500000 0.243751 +v 0.312499 3.562500 0.187501 +v 3.062499 3.562500 0.187502 +v 3.062499 4.125000 0.243751 +v 3.062499 4.500000 0.243751 +v 0.312499 4.062500 0.187501 +v 3.062499 4.062500 0.187502 +v 0.312499 4.125000 0.243751 +v 0.312499 4.500000 0.243751 +v 0.312499 4.562500 0.187501 +v 3.062499 4.562500 0.187502 +v 2.812500 1.625000 0.250001 +v 2.812500 2.000000 0.250001 +v 2.812500 1.625000 0.187500 +v 2.812500 2.000000 0.187500 +v 2.187500 1.625000 0.250000 +v 2.187500 2.000000 0.250000 +v 2.187500 1.625000 0.187500 +v 2.187500 2.000000 0.187500 +v 0.687500 0.468750 -0.356694 +v 0.687500 0.512944 -0.312500 +v 0.687500 0.424556 -0.312500 +v 0.687500 0.468750 -0.268306 +v 3.187499 0.468750 -0.356694 +v 3.187499 0.512944 -0.312499 +v 3.187499 0.424556 -0.312499 +v 3.187499 0.468750 -0.268305 +v 0.687499 0.593750 0.268306 +v 0.687499 0.637944 0.312500 +v 0.687499 0.549556 0.312500 +v 0.687499 0.593750 0.356694 +v 3.187499 0.593750 0.268306 +v 3.187499 0.637944 0.312501 +v 3.187499 0.549556 0.312501 +v 3.187499 0.593750 0.356695 +v 0.687499 0.468750 0.268306 +v 0.687499 0.512944 0.312500 +v 0.687499 0.424556 0.312500 +v 0.687499 0.468750 0.356694 +v 3.187499 0.468750 0.268306 +v 3.187499 0.512944 0.312501 +v 3.187499 0.424556 0.312501 +v 3.187499 0.468750 0.356695 +v 2.437501 0.375000 0.375001 +v 2.437501 0.687500 0.375001 +v 2.437501 0.312500 0.187501 +v 2.437501 0.750000 0.187501 +v 2.562501 0.375000 0.375001 +v 2.562501 0.687500 0.375001 +v 2.562501 0.312500 0.187501 +v 2.562501 0.750000 0.187501 +v 2.437501 0.312500 0.250001 +v 2.437501 0.750000 0.250001 +v 2.562501 0.312500 0.250001 +v 2.562501 0.750000 0.250001 +v 2.437501 0.375000 0.312501 +v 2.562501 0.687500 0.312501 +v 2.437501 0.687500 0.312501 +v 2.562501 0.375000 0.312501 +v 0.375000 0.375000 0.312500 +v 0.687500 0.375000 0.375000 +v 0.687500 0.687500 0.375000 +v 0.500000 0.375000 0.312500 +v 0.500000 0.687500 0.312500 +v 0.562500 0.687500 0.375000 +v 0.562500 0.375000 0.375000 +v 0.687500 0.375000 0.187500 +v 0.687500 0.687500 0.187500 +v 0.375000 0.375000 0.187500 +v 0.375000 0.687500 0.187500 +v 0.375000 0.687500 0.312500 +v 0.187500 1.562500 -0.187500 +v 0.187500 2.062500 -0.187500 +v 0.187500 1.562500 0.187500 +v 0.187500 2.062500 0.187500 +v -0.187500 1.562500 -0.125000 +v -0.125000 1.562500 -0.187500 +v -0.125000 2.062500 -0.187500 +v -0.187500 2.062500 -0.125000 +v -0.125000 1.562500 0.187500 +v -0.187500 1.562500 0.125000 +v -0.187500 2.062500 0.125000 +v -0.125000 2.062500 0.187500 +v 0.187500 2.562500 -0.187500 +v 0.187500 3.062500 -0.187500 +v 0.187500 2.562500 0.187500 +v 0.187500 3.062500 0.187500 +v -0.187500 2.562500 -0.125000 +v -0.125000 2.562500 -0.187500 +v -0.125000 3.062500 -0.187500 +v -0.187500 3.062500 -0.125000 +v -0.125000 2.562500 0.187500 +v -0.187500 2.562500 0.125000 +v -0.187500 3.062500 0.125000 +v -0.125000 3.062500 0.187500 +v 0.187500 3.562500 -0.187500 +v 0.187500 4.062500 -0.187500 +v 0.187500 3.562500 0.187500 +v 0.187500 4.062500 0.187500 +v -0.187500 3.562500 -0.125000 +v -0.125000 3.562500 -0.187500 +v -0.125000 4.062500 -0.187500 +v -0.187500 4.062500 -0.125000 +v -0.125000 3.562500 0.187500 +v -0.187500 3.562500 0.125000 +v -0.187500 4.062500 0.125000 +v -0.125000 4.062500 0.187500 +v 0.187500 4.562500 -0.187500 +v 0.187500 5.062500 -0.187500 +v 0.187500 4.562500 0.187500 +v 0.187500 5.062500 0.187500 +v -0.187500 4.562500 -0.125000 +v -0.125000 4.562500 -0.187500 +v -0.125000 5.062500 -0.187500 +v -0.187500 5.062500 -0.125000 +v -0.125000 4.562500 0.187500 +v -0.187500 4.562500 0.125000 +v -0.187500 5.062500 0.125000 +v -0.125000 5.062500 0.187500 +v 0.187500 5.562500 -0.187500 +v 0.187500 5.812500 -0.187500 +v 0.187500 5.562500 0.187500 +v 0.187500 5.812500 0.187500 +v -0.187500 5.562500 -0.125000 +v -0.125000 5.562500 -0.187500 +v -0.125000 5.812500 -0.187500 +v -0.187500 5.812500 -0.125000 +v -0.125000 5.562500 0.187500 +v -0.187500 5.562500 0.125000 +v -0.187500 5.812500 0.125000 +v -0.125000 5.812500 0.187500 +v 0.312499 0.187500 0.250000 +v 0.312499 0.187500 0.187500 +v 0.193749 0.187500 0.250000 +v 0.193749 5.662815 0.187500 +v 0.193749 0.187500 0.187500 +v 0.193749 5.662815 0.250000 +v 3.062499 2.500000 0.187501 +v 2.958148 3.292633 0.187501 +v 2.652203 4.031250 0.187501 +v 2.165514 4.665514 0.187501 +v 1.531250 5.152203 0.187500 +v 0.792633 5.458148 0.187500 +v 2.760456 4.093750 0.250001 +v 3.078888 3.324986 0.250001 +v 3.187499 2.500000 0.250002 +v 2.253902 4.753902 0.250001 +v 1.593750 5.260456 0.250000 +v 0.824985 5.578888 0.250000 +v 2.652203 4.031250 0.250001 +v 2.958148 3.292633 0.250001 +v 3.062499 2.500000 0.250001 +v 2.165514 4.665514 0.250001 +v 1.531250 5.152203 0.250000 +v 0.792633 5.458148 0.250000 +v 3.062499 0.312500 0.187501 +v 3.062499 0.312500 0.250001 +v 3.187499 0.312500 0.250002 +v 0.312499 5.521358 0.250000 +v 0.193749 5.537815 0.250000 +v 0.193749 5.537815 0.187500 +v 0.312499 5.521358 0.187500 +v 0.312798 5.646319 0.250000 +v 3.187500 0.187500 0.250002 +v 3.187500 0.312500 0.250002 +v 0.312499 0.187500 0.250000 +v 0.312499 0.312500 0.250000 +v 3.187500 0.312500 0.187502 +v 0.312499 0.312500 0.187500 +v 0.312499 5.521358 0.187500 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.8660 -0.5000 -0.0000 +vn -0.9659 -0.2588 -0.0000 +vn -0.9979 -0.0654 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn -0.5000 -0.8660 -0.0000 +vn -0.2588 -0.9659 -0.0000 +vn -0.1305 -0.9914 -0.0000 +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.7071 -0.7071 +vn -0.0000 -0.7071 -0.7071 +vn -0.7071 -0.0000 0.7071 +vn -0.7071 -0.0000 -0.7071 +vn -0.0000 -0.7071 0.7071 +vn -0.0000 0.7071 0.7071 +vn -0.0000 -0.6690 -0.7433 +vn -0.0000 0.6690 -0.7433 +vn -0.0000 -0.6690 0.7433 +vn -0.0000 0.6690 0.7433 +vt 0.630814 0.276163 +vt 0.482558 0.020349 +vt 0.630814 0.020349 +vt 0.659884 0.404070 +vt 0.654070 0.441860 +vt 0.654070 0.404070 +vt 0.659884 0.366279 +vt 0.654070 0.366279 +vt 0.659884 0.479651 +vt 0.654070 0.479651 +vt 0.654070 0.328488 +vt 0.659884 0.517442 +vt 0.654070 0.517442 +vt 0.662791 0.366279 +vt 0.662791 0.404070 +vt 0.662791 0.328488 +vt 0.709302 0.523256 +vt 0.712209 0.421512 +vt 0.712209 0.523256 +vt 0.659884 0.441860 +vt 0.662791 0.441860 +vt 0.662791 0.479651 +vt 0.662791 0.517442 +vt 0.662791 0.540698 +vt 0.575581 0.383721 +vt 0.581395 0.386628 +vt 0.575581 0.386628 +vt 0.703488 0.523256 +vt 0.709302 0.421512 +vt 0.575581 0.395349 +vt 0.325581 0.392442 +vt 0.325581 0.395349 +vt 0.325581 0.383721 +vt 0.325581 0.386628 +vt 0.654070 0.540698 +vt 0.575581 0.392442 +vt 0.581395 0.392442 +vt 0.465116 0.276163 +vt 0.316860 0.020349 +vt 0.465116 0.020349 +vt 0.459302 0.441860 +vt 0.325581 0.436047 +vt 0.459302 0.436047 +vt 0.325581 0.444767 +vt 0.325581 0.441860 +vt 0.473837 0.636628 +vt 0.459302 0.630814 +vt 0.473837 0.630814 +vt 0.456395 0.636628 +vt 0.459302 0.636628 +vt 0.476744 0.630814 +vt 0.482558 0.630814 +vt 0.479651 0.636628 +vt 0.479651 0.630814 +vt 0.450581 0.636628 +vt 0.453488 0.630814 +vt 0.453488 0.636628 +vt 0.473837 0.639535 +vt 0.476744 0.645349 +vt 0.459302 0.639535 +vt 0.476744 0.636628 +vt 0.456395 0.630814 +vt 0.473837 0.627907 +vt 0.459302 0.627907 +vt 0.456395 0.622093 +vt 0.485465 0.808140 +vt 0.482558 0.825581 +vt 0.482558 0.808140 +vt 0.453488 0.808140 +vt 0.450581 0.825581 +vt 0.450581 0.808140 +vt 0.453488 0.825581 +vt 0.453488 0.805233 +vt 0.482558 0.828488 +vt 0.453488 0.828488 +vt 0.645349 0.595930 +vt 0.630814 0.572674 +vt 0.645349 0.572674 +vt 0.662791 0.598837 +vt 0.645349 0.613372 +vt 0.648256 0.595930 +vt 0.659884 0.595930 +vt 0.648256 0.572674 +vt 0.659884 0.572674 +vt 0.677326 0.595930 +vt 0.662791 0.572674 +vt 0.677326 0.572674 +vt 0.662791 0.595930 +vt 0.662791 0.569767 +vt 0.645349 0.555233 +vt 0.421512 0.619186 +vt 0.438953 0.625000 +vt 0.421512 0.625000 +vt 0.438953 0.627907 +vt 0.421512 0.627907 +vt 0.421512 0.633721 +vt 0.438953 0.639535 +vt 0.421512 0.639535 +vt 0.438953 0.633721 +vt 0.421512 0.610465 +vt 0.438953 0.619186 +vt 0.418605 0.627907 +vt 0.412791 0.633721 +vt 0.412791 0.619186 +vt 0.447674 0.633721 +vt 0.441860 0.627907 +vt 0.488372 0.671512 +vt 0.604651 0.668605 +vt 0.604651 0.671512 +vt 0.604651 0.662791 +vt 0.488372 0.665698 +vt 0.488372 0.662791 +vt 0.488372 0.659884 +vt 0.604651 0.659884 +vt 0.488372 0.668605 +vt 0.465116 0.008721 +vt 0.482558 0.276163 +vt 0.645349 0.715116 +vt 0.517442 0.697674 +vt 0.645349 0.697674 +vt 0.645349 0.694767 +vt 0.517442 0.718023 +vt 0.517442 0.715116 +vt 0.645349 0.741279 +vt 0.517442 0.723837 +vt 0.645349 0.723837 +vt 0.645349 0.720930 +vt 0.517442 0.744186 +vt 0.517442 0.741279 +vt 0.645349 0.767442 +vt 0.517442 0.750000 +vt 0.645349 0.750000 +vt 0.645349 0.747093 +vt 0.517442 0.770349 +vt 0.517442 0.767442 +vt 0.645349 0.793605 +vt 0.517442 0.776163 +vt 0.645349 0.776163 +vt 0.645349 0.773256 +vt 0.517442 0.796512 +vt 0.517442 0.793605 +vt 0.517442 0.802326 +vt 0.645349 0.819767 +vt 0.645349 0.802326 +vt 0.645349 0.799419 +vt 0.517442 0.822674 +vt 0.517442 0.819767 +vt 0.517442 0.828488 +vt 0.645349 0.845930 +vt 0.645349 0.828488 +vt 0.645349 0.825581 +vt 0.517442 0.848837 +vt 0.517442 0.845930 +vt 0.517442 0.854651 +vt 0.645349 0.872093 +vt 0.645349 0.854651 +vt 0.645349 0.851744 +vt 0.517442 0.875000 +vt 0.517442 0.872093 +vt 0.517442 0.880814 +vt 0.645349 0.898256 +vt 0.645349 0.880814 +vt 0.645349 0.877907 +vt 0.517442 0.901163 +vt 0.517442 0.898256 +vt 0.485465 0.834302 +vt 0.482558 0.851744 +vt 0.482558 0.834302 +vt 0.453488 0.834302 +vt 0.450581 0.851744 +vt 0.450581 0.834302 +vt 0.453488 0.851744 +vt 0.453488 0.831395 +vt 0.482558 0.854651 +vt 0.453488 0.854651 +vt 0.488372 0.656977 +vt 0.604651 0.654070 +vt 0.604651 0.656977 +vt 0.604651 0.648256 +vt 0.488372 0.651163 +vt 0.488372 0.648256 +vt 0.488372 0.645349 +vt 0.604651 0.645349 +vt 0.488372 0.654070 +vt 0.607558 0.671512 +vt 0.723837 0.668605 +vt 0.723837 0.671512 +vt 0.723837 0.662791 +vt 0.607558 0.665698 +vt 0.607558 0.662791 +vt 0.607558 0.659884 +vt 0.723837 0.659884 +vt 0.607558 0.668605 +vt 0.607558 0.656977 +vt 0.723837 0.654070 +vt 0.723837 0.656977 +vt 0.723837 0.648256 +vt 0.607558 0.651163 +vt 0.607558 0.648256 +vt 0.607558 0.645349 +vt 0.723837 0.645349 +vt 0.607558 0.654070 +vt 0.459302 0.656977 +vt 0.473837 0.662791 +vt 0.473837 0.656977 +vt 0.456395 0.662791 +vt 0.459302 0.662791 +vt 0.476744 0.656977 +vt 0.479651 0.662791 +vt 0.482558 0.656977 +vt 0.479651 0.656977 +vt 0.453488 0.656977 +vt 0.450581 0.662791 +vt 0.453488 0.662791 +vt 0.473837 0.665698 +vt 0.459302 0.665698 +vt 0.476744 0.671512 +vt 0.476744 0.662791 +vt 0.456395 0.656977 +vt 0.476744 0.648256 +vt 0.459302 0.654070 +vt 0.473837 0.654070 +vt 0.438953 0.656977 +vt 0.421512 0.651163 +vt 0.421512 0.656977 +vt 0.438953 0.659884 +vt 0.421512 0.659884 +vt 0.438953 0.671512 +vt 0.421512 0.665698 +vt 0.421512 0.671512 +vt 0.438953 0.665698 +vt 0.438953 0.651163 +vt 0.421512 0.642442 +vt 0.412791 0.651163 +vt 0.418605 0.665698 +vt 0.418605 0.659884 +vt 0.441860 0.659884 +vt 0.447674 0.665698 +vt 0.680233 0.566860 +vt 0.665698 0.543605 +vt 0.680233 0.543605 +vt 0.697674 0.569767 +vt 0.680233 0.584302 +vt 0.683140 0.566860 +vt 0.694767 0.566860 +vt 0.683140 0.543605 +vt 0.694767 0.543605 +vt 0.712209 0.566860 +vt 0.697674 0.543605 +vt 0.712209 0.543605 +vt 0.697674 0.566860 +vt 0.697674 0.540698 +vt 0.680233 0.526163 +vt 0.680233 0.627907 +vt 0.665698 0.604651 +vt 0.680233 0.604651 +vt 0.697674 0.630814 +vt 0.680233 0.645349 +vt 0.683140 0.627907 +vt 0.694767 0.627907 +vt 0.683140 0.604651 +vt 0.694767 0.604651 +vt 0.712209 0.627907 +vt 0.697674 0.604651 +vt 0.712209 0.604651 +vt 0.697674 0.627907 +vt 0.697674 0.601744 +vt 0.680233 0.587209 +vt 0.715116 0.595930 +vt 0.700581 0.572674 +vt 0.715116 0.572674 +vt 0.732558 0.598837 +vt 0.715116 0.613372 +vt 0.718023 0.595930 +vt 0.729651 0.595930 +vt 0.718023 0.572674 +vt 0.729651 0.572674 +vt 0.747093 0.595930 +vt 0.732558 0.572674 +vt 0.747093 0.572674 +vt 0.732558 0.595930 +vt 0.732558 0.569767 +vt 0.715116 0.555233 +vt 0.750000 0.566860 +vt 0.735465 0.543605 +vt 0.750000 0.543605 +vt 0.767442 0.569767 +vt 0.750000 0.584302 +vt 0.752907 0.566860 +vt 0.764535 0.566860 +vt 0.752907 0.543605 +vt 0.764535 0.543605 +vt 0.781977 0.566860 +vt 0.767442 0.543605 +vt 0.781977 0.543605 +vt 0.767442 0.566860 +vt 0.767442 0.540698 +vt 0.750000 0.526163 +vt 0.750000 0.616279 +vt 0.735465 0.604651 +vt 0.750000 0.604651 +vt 0.767442 0.619186 +vt 0.750000 0.633721 +vt 0.752907 0.616279 +vt 0.764535 0.616279 +vt 0.752907 0.604651 +vt 0.764535 0.604651 +vt 0.781977 0.616279 +vt 0.767442 0.604651 +vt 0.781977 0.604651 +vt 0.767442 0.616279 +vt 0.767442 0.601744 +vt 0.750000 0.587209 +vt 0.665698 0.441860 +vt 0.671512 0.404070 +vt 0.665698 0.404070 +vt 0.671512 0.366279 +vt 0.665698 0.366279 +vt 0.671512 0.479651 +vt 0.671512 0.441860 +vt 0.665698 0.328488 +vt 0.671512 0.328488 +vt 0.665698 0.479651 +vt 0.671512 0.517442 +vt 0.674419 0.366279 +vt 0.674419 0.404070 +vt 0.674419 0.328488 +vt 0.723837 0.421512 +vt 0.720930 0.523256 +vt 0.723837 0.523256 +vt 0.674419 0.441860 +vt 0.674419 0.479651 +vt 0.674419 0.517442 +vt 0.674419 0.540698 +vt 0.581395 0.401163 +vt 0.575581 0.398256 +vt 0.575581 0.401163 +vt 0.720930 0.421512 +vt 0.715116 0.523256 +vt 0.325581 0.406977 +vt 0.575581 0.409884 +vt 0.325581 0.409884 +vt 0.325581 0.398256 +vt 0.325581 0.401163 +vt 0.665698 0.540698 +vt 0.665698 0.517442 +vt 0.575581 0.406977 +vt 0.581395 0.406977 +vt 0.325581 0.447674 +vt 0.459302 0.453488 +vt 0.459302 0.447674 +vt 0.325581 0.456395 +vt 0.325581 0.453488 +vt 0.659884 0.328488 +vt 0.659884 0.540698 +vt 0.581395 0.383721 +vt 0.703488 0.421512 +vt 0.316860 0.276163 +vt 0.459302 0.444767 +vt 0.482558 0.636628 +vt 0.450581 0.630814 +vt 0.476744 0.642442 +vt 0.456395 0.645349 +vt 0.456395 0.642442 +vt 0.476744 0.622093 +vt 0.476744 0.625000 +vt 0.456395 0.625000 +vt 0.485465 0.825581 +vt 0.482558 0.805233 +vt 0.630814 0.595930 +vt 0.662791 0.613372 +vt 0.645349 0.598837 +vt 0.662791 0.555233 +vt 0.645349 0.569767 +vt 0.438953 0.610465 +vt 0.418605 0.633721 +vt 0.447674 0.619186 +vt 0.441860 0.633721 +vt 0.604651 0.665698 +vt 0.482558 0.008721 +vt 0.517442 0.694767 +vt 0.645349 0.718023 +vt 0.517442 0.720930 +vt 0.645349 0.744186 +vt 0.517442 0.747093 +vt 0.645349 0.770349 +vt 0.517442 0.773256 +vt 0.645349 0.796512 +vt 0.517442 0.799419 +vt 0.645349 0.822674 +vt 0.517442 0.825581 +vt 0.645349 0.848837 +vt 0.517442 0.851744 +vt 0.645349 0.875000 +vt 0.517442 0.877907 +vt 0.645349 0.901163 +vt 0.485465 0.851744 +vt 0.482558 0.831395 +vt 0.604651 0.651163 +vt 0.723837 0.665698 +vt 0.723837 0.651163 +vt 0.482558 0.662791 +vt 0.450581 0.656977 +vt 0.456395 0.668605 +vt 0.456395 0.671512 +vt 0.476744 0.668605 +vt 0.476744 0.651163 +vt 0.456395 0.648256 +vt 0.456395 0.651163 +vt 0.438953 0.642442 +vt 0.412791 0.665698 +vt 0.441860 0.665698 +vt 0.447674 0.651163 +vt 0.665698 0.566860 +vt 0.697674 0.584302 +vt 0.680233 0.569767 +vt 0.697674 0.526163 +vt 0.680233 0.540698 +vt 0.665698 0.627907 +vt 0.697674 0.645349 +vt 0.680233 0.630814 +vt 0.697674 0.587209 +vt 0.680233 0.601744 +vt 0.700581 0.595930 +vt 0.732558 0.613372 +vt 0.715116 0.598837 +vt 0.732558 0.555233 +vt 0.715116 0.569767 +vt 0.735465 0.566860 +vt 0.767442 0.584302 +vt 0.750000 0.569767 +vt 0.767442 0.526163 +vt 0.750000 0.540698 +vt 0.735465 0.616279 +vt 0.767442 0.633721 +vt 0.750000 0.619186 +vt 0.767442 0.587209 +vt 0.750000 0.601744 +vt 0.671512 0.540698 +vt 0.581395 0.398256 +vt 0.715116 0.421512 +vt 0.459302 0.456395 +s 0 +usemtl TEXTURE +f 600/775/64 597/776/64 599/777/64 +s 1 +f 619/778/65 616/779/65 613/780/65 +f 620/781/65 613/780/65 614/782/65 +f 616/779/65 623/783/65 617/784/65 +f 615/785/65 620/781/65 614/782/65 +f 617/784/65 624/786/65 618/787/65 +f 619/778/66 608/788/67 609/789/66 +f 620/781/67 607/790/68 608/788/67 +f 621/791/68 625/792/69 607/793/68 +f 622/794/70 609/789/66 610/795/70 +f 623/783/71 610/795/70 611/796/71 +f 624/786/72 611/796/71 612/797/72 +f 631/798/73 624/786/72 612/797/72 +f 630/799/69 606/800/69 629/801/69 +f 615/802/65 626/803/65 621/791/65 +f 628/804/74 602/805/74 601/806/74 +f 603/807/69 630/801/69 629/799/69 +f 603/805/65 628/801/65 601/808/65 +f 624/786/65 632/809/65 618/787/65 +f 632/800/65 629/810/65 606/811/65 +s 0 +f 634/812/65 635/813/65 633/814/65 +s 1 +f 640/815/65 637/816/65 639/817/65 +f 640/815/75 641/818/75 638/819/75 +f 643/820/65 648/821/65 647/822/65 +f 643/823/76 658/821/76 655/824/76 +f 648/825/75 657/820/75 656/822/75 +f 654/826/75 646/827/75 650/828/75 +f 651/829/76 649/830/76 645/831/76 +f 655/832/69 645/833/69 657/834/69 +f 656/828/77 652/835/77 654/825/77 +f 655/831/78 653/836/78 651/823/78 +f 658/837/74 656/838/74 650/839/74 +f 661/840/69 660/841/69 659/842/69 +f 663/843/74 666/844/74 665/845/74 +f 659/842/65 664/846/65 663/843/65 +f 659/847/76 665/842/76 661/843/76 +f 664/846/75 662/848/75 666/849/75 +f 673/850/65 667/851/65 672/852/65 +f 678/853/75 668/854/75 674/855/75 +f 677/856/69 671/857/69 676/858/69 +f 670/859/64 675/860/64 669/861/64 +f 676/858/79 678/862/79 677/856/79 +f 672/852/80 674/855/80 673/850/80 +f 675/863/76 671/857/76 667/864/76 +f 681/865/65 685/866/65 684/867/65 +f 684/867/80 682/868/80 683/869/80 +f 690/870/69 688/871/69 689/872/69 +f 679/873/65 683/869/65 682/868/65 +f 687/874/74 680/875/74 681/865/74 +f 683/876/75 689/877/75 687/878/75 +f 680/875/76 688/879/76 682/880/76 +f 697/881/81 694/882/81 693/883/81 +f 691/884/77 696/885/77 695/886/77 +f 691/884/78 697/887/78 693/888/78 +f 696/885/82 694/882/82 698/889/82 +f 699/890/69 702/891/69 700/812/69 +f 709/892/65 704/893/65 708/894/65 +f 704/893/83 706/895/83 708/894/83 +f 709/892/84 711/896/84 705/897/84 +f 717/898/65 712/899/65 716/900/65 +f 712/899/83 714/901/83 716/900/83 +f 717/898/84 719/902/84 713/903/84 +f 725/904/65 720/905/65 724/906/65 +f 720/905/83 722/907/83 724/906/83 +f 725/904/84 727/908/84 721/909/84 +f 733/910/65 728/911/65 732/912/65 +f 728/911/83 730/913/83 732/912/83 +f 733/910/84 735/914/84 729/915/84 +f 736/916/64 741/917/64 740/918/64 +f 738/919/85 736/916/85 740/918/85 +f 743/920/86 741/917/86 737/921/86 +f 744/922/64 749/923/64 748/924/64 +f 746/925/85 744/922/85 748/924/85 +f 751/926/86 749/923/86 745/927/86 +f 752/928/64 757/929/64 756/930/64 +f 754/931/85 752/928/85 756/930/85 +f 759/932/86 757/929/86 753/933/86 +f 760/934/64 765/935/64 764/936/64 +f 762/937/85 760/934/85 764/936/85 +f 767/938/86 765/935/86 761/939/86 +f 770/940/74 769/941/74 768/942/74 +f 772/943/69 775/944/69 774/945/69 +f 768/942/64 773/946/64 772/943/64 +f 768/947/76 774/942/76 770/943/76 +f 773/946/75 771/948/75 775/949/75 +f 782/950/81 779/951/81 778/952/81 +f 776/953/77 781/954/77 780/955/77 +f 776/953/78 782/956/78 778/957/78 +f 781/954/82 779/951/82 783/958/82 +f 790/959/81 787/960/81 786/961/81 +f 784/962/77 789/963/77 788/964/77 +f 784/962/78 790/965/78 786/966/78 +f 789/963/82 787/960/82 791/967/82 +f 798/968/81 795/969/81 794/970/81 +f 792/971/77 797/972/77 796/973/77 +f 792/971/78 798/974/78 794/975/78 +f 797/972/82 795/969/82 799/976/82 +f 805/977/64 800/978/64 804/979/64 +f 815/977/76 800/980/76 812/981/76 +f 814/978/75 805/982/75 813/979/75 +f 803/983/75 811/984/75 807/985/75 +f 806/986/76 808/987/76 802/988/76 +f 812/989/69 814/990/69 802/991/69 +f 809/992/82 813/985/82 811/982/82 +f 810/993/81 812/988/81 808/980/81 +f 806/994/74 813/995/74 815/996/74 +f 822/997/64 818/998/64 821/999/64 +f 819/1000/79 821/999/79 820/1001/79 +f 825/1002/69 827/1003/69 826/1004/69 +f 820/1001/64 816/1005/64 819/1000/64 +f 817/1006/74 824/1007/74 818/998/74 +f 824/1008/75 827/1009/75 820/1010/75 +f 819/1011/76 825/1012/76 817/1006/76 +f 834/1013/65 828/1014/65 833/1015/65 +f 839/1016/75 829/1017/75 835/1018/75 +f 838/1019/69 832/1020/69 837/1021/69 +f 831/1022/64 836/1023/64 830/1024/64 +f 837/1021/79 839/1025/79 838/1019/79 +f 833/1015/80 835/1018/80 834/1013/80 +f 836/1026/76 832/1020/76 828/1027/76 +f 846/1028/65 840/1029/65 845/1030/65 +f 851/1031/75 841/1032/75 847/1033/75 +f 850/1034/69 844/1035/69 849/1036/69 +f 843/1037/64 848/1038/64 842/1039/64 +f 849/1036/79 851/1040/79 850/1034/79 +f 845/1030/80 847/1033/80 846/1028/80 +f 848/1041/76 844/1035/76 840/1042/76 +f 858/1043/65 852/1044/65 857/1045/65 +f 863/1046/75 853/1047/75 859/1048/75 +f 862/1049/69 856/1050/69 861/1051/69 +f 855/1052/64 860/1053/64 854/1054/64 +f 861/1051/79 863/1055/79 862/1049/79 +f 857/1045/80 859/1048/80 858/1043/80 +f 860/1056/76 856/1050/76 852/1057/76 +f 870/1058/65 864/1059/65 869/1060/65 +f 875/1061/75 865/1062/75 871/1063/75 +f 874/1064/69 868/1065/69 873/1066/69 +f 867/1067/64 872/1068/64 866/1069/64 +f 873/1066/79 875/1070/79 874/1064/79 +f 869/1060/80 871/1063/80 870/1058/80 +f 872/1071/76 868/1065/76 864/1072/76 +f 882/1073/65 876/1074/65 881/1075/65 +f 887/1076/75 877/1077/75 883/1078/75 +f 886/1079/69 880/1080/69 885/1081/69 +f 879/1082/64 884/1083/64 878/1084/64 +f 885/1081/79 887/1085/79 886/1079/79 +f 881/1075/80 883/1078/80 882/1073/80 +f 884/1086/76 880/1080/76 876/1087/76 +f 903/1088/64 906/1089/64 900/1090/64 +f 900/1090/64 907/1091/64 901/1092/64 +f 903/1088/64 910/1093/64 909/1094/64 +f 902/1095/64 907/1091/64 908/1096/64 +f 904/1097/64 911/1098/64 910/1093/64 +f 895/1099/67 906/1089/66 896/1100/66 +f 894/1101/68 907/1091/67 895/1099/67 +f 912/1102/69 908/1103/68 894/1104/68 +f 896/1100/66 909/1094/70 897/1105/70 +f 897/1105/70 910/1093/71 898/1106/71 +f 898/1106/71 911/1098/72 899/1107/72 +f 911/1098/72 918/1108/73 899/1107/72 +f 893/1109/69 917/1110/69 916/1111/69 +f 913/1112/64 902/1113/64 908/1103/64 +f 889/1114/74 915/1115/74 888/1116/74 +f 917/1111/69 890/1117/69 916/1110/69 +f 915/1111/64 890/1114/64 888/1118/64 +f 919/1119/64 911/1098/64 905/1120/64 +f 916/1121/64 919/1109/64 893/1122/64 +f 920/1123/64 923/1124/64 922/1125/64 +f 924/1126/75 923/1124/75 921/1127/75 +s 0 +f 600/775/64 598/891/64 597/776/64 +s 1 +f 619/778/65 622/794/65 616/779/65 +f 620/781/65 619/778/65 613/780/65 +f 616/779/65 622/794/65 623/783/65 +f 615/785/65 621/1128/65 620/781/65 +f 617/784/65 623/783/65 624/786/65 +f 619/778/66 620/781/67 608/788/67 +f 620/781/67 621/1128/68 607/790/68 +f 621/791/68 626/803/69 625/792/69 +f 622/794/70 619/778/66 609/789/66 +f 623/783/71 622/794/70 610/795/70 +f 624/786/72 623/783/71 611/796/71 +f 631/798/73 628/1129/73 624/786/72 +f 630/799/69 604/1130/69 606/800/69 +f 615/802/65 627/1131/65 626/803/65 +f 628/804/74 703/810/74 602/805/74 +f 603/807/69 605/808/69 630/801/69 +f 603/805/65 629/810/65 628/801/65 +f 624/786/65 628/1129/65 632/809/65 +f 632/800/65 628/801/65 629/810/65 +s 0 +f 634/812/65 636/1132/65 635/813/65 +s 1 +f 640/815/65 638/819/65 637/816/65 +f 640/815/75 642/1133/75 641/818/75 +f 643/820/65 644/824/65 648/821/65 +f 643/823/76 647/836/76 658/821/76 +f 648/825/75 644/835/75 657/820/75 +f 654/826/75 652/1134/75 646/827/75 +f 651/829/76 653/1135/76 649/830/76 +f 655/832/69 651/1136/69 645/833/69 +f 645/833/69 646/1137/69 652/1138/69 +f 657/834/69 644/824/69 643/820/69 +f 645/833/69 652/1138/69 657/834/69 +f 657/834/69 643/820/69 655/832/69 +f 656/828/77 657/827/77 652/835/77 +f 655/831/78 658/830/78 653/836/78 +f 649/1139/74 653/1140/74 658/837/74 +f 658/837/74 647/822/74 648/821/74 +f 656/838/74 654/1141/74 650/839/74 +f 658/837/74 648/821/74 656/838/74 +f 650/839/74 649/1139/74 658/837/74 +f 661/840/69 662/1142/69 660/841/69 +f 663/843/74 664/846/74 666/844/74 +f 659/842/65 660/841/65 664/846/65 +f 659/847/76 663/1143/76 665/842/76 +f 664/846/75 660/841/75 662/848/75 +f 673/850/65 668/1144/65 667/851/65 +f 674/855/75 677/856/75 678/853/75 +f 678/853/75 670/1145/75 668/854/75 +f 668/854/75 673/1146/75 674/855/75 +f 677/856/69 674/855/69 671/857/69 +f 670/859/64 678/862/64 675/860/64 +f 676/858/79 675/860/79 678/862/79 +f 672/852/80 671/857/80 674/855/80 +f 667/864/76 669/1147/76 675/863/76 +f 675/863/76 676/858/76 671/857/76 +f 671/857/76 672/1148/76 667/864/76 +f 681/865/65 680/875/65 685/866/65 +f 684/867/80 685/866/80 682/868/80 +f 690/870/69 679/873/69 688/871/69 +f 679/873/65 690/870/65 683/869/65 +f 687/874/74 686/1149/74 680/875/74 +f 687/878/75 681/865/75 684/867/75 +f 683/876/75 690/1150/75 689/877/75 +f 687/878/75 684/867/75 683/876/75 +f 682/880/76 685/866/76 680/875/76 +f 680/875/76 686/1151/76 688/879/76 +f 688/879/76 679/1152/76 682/880/76 +f 697/881/81 698/889/81 694/882/81 +f 691/884/77 692/1153/77 696/885/77 +f 691/884/78 695/886/78 697/887/78 +f 696/885/82 692/1153/82 694/882/82 +f 699/890/69 701/1154/69 702/891/69 +f 709/892/65 705/897/65 704/893/65 +f 704/893/83 707/1155/83 706/895/83 +f 709/892/84 710/1156/84 711/896/84 +f 717/898/65 713/903/65 712/899/65 +f 712/899/83 715/1157/83 714/901/83 +f 717/898/84 718/1158/84 719/902/84 +f 725/904/65 721/909/65 720/905/65 +f 720/905/83 723/1159/83 722/907/83 +f 725/904/84 726/1160/84 727/908/84 +f 733/910/65 729/915/65 728/911/65 +f 728/911/83 731/1161/83 730/913/83 +f 733/910/84 734/1162/84 735/914/84 +f 736/916/64 737/921/64 741/917/64 +f 738/919/85 739/1163/85 736/916/85 +f 743/920/86 742/1164/86 741/917/86 +f 744/922/64 745/927/64 749/923/64 +f 746/925/85 747/1165/85 744/922/85 +f 751/926/86 750/1166/86 749/923/86 +f 752/928/64 753/933/64 757/929/64 +f 754/931/85 755/1167/85 752/928/85 +f 759/932/86 758/1168/86 757/929/86 +f 760/934/64 761/939/64 765/935/64 +f 762/937/85 763/1169/85 760/934/85 +f 767/938/86 766/1170/86 765/935/86 +f 770/940/74 771/1171/74 769/941/74 +f 772/943/69 773/946/69 775/944/69 +f 768/942/64 769/941/64 773/946/64 +f 768/947/76 772/1172/76 774/942/76 +f 773/946/75 769/941/75 771/948/75 +f 782/950/81 783/958/81 779/951/81 +f 776/953/77 777/1173/77 781/954/77 +f 776/953/78 780/955/78 782/956/78 +f 781/954/82 777/1173/82 779/951/82 +f 790/959/81 791/967/81 787/960/81 +f 784/962/77 785/1174/77 789/963/77 +f 784/962/78 788/964/78 790/965/78 +f 789/963/82 785/1174/82 787/960/82 +f 798/968/81 799/976/81 795/969/81 +f 792/971/77 793/1175/77 797/972/77 +f 792/971/78 796/973/78 798/974/78 +f 797/972/82 793/1175/82 795/969/82 +f 805/977/64 801/981/64 800/978/64 +f 815/977/76 804/993/76 800/980/76 +f 814/978/75 801/992/75 805/982/75 +f 803/983/75 809/1176/75 811/984/75 +f 806/986/76 810/1177/76 808/987/76 +f 812/989/69 800/978/69 801/981/69 +f 814/990/69 809/1178/69 803/1179/69 +f 812/989/69 801/981/69 814/990/69 +f 802/991/69 808/1180/69 812/989/69 +f 814/990/69 803/1179/69 802/991/69 +f 809/992/82 814/983/82 813/985/82 +f 810/993/81 815/986/81 812/988/81 +f 815/996/74 810/1181/74 806/994/74 +f 806/994/74 807/1182/74 811/1183/74 +f 813/995/74 805/977/74 804/979/74 +f 806/994/74 811/1183/74 813/995/74 +f 813/995/74 804/979/74 815/996/74 +f 822/997/64 817/1006/64 818/998/64 +f 819/1000/79 822/997/79 821/999/79 +f 825/1002/69 816/1005/69 827/1003/69 +f 820/1001/64 827/1003/64 816/1005/64 +f 817/1006/74 823/1184/74 824/1007/74 +f 821/999/75 818/998/75 824/1008/75 +f 824/1008/75 826/1185/75 827/1009/75 +f 820/1010/75 821/999/75 824/1008/75 +f 817/1006/76 822/997/76 819/1011/76 +f 819/1011/76 816/1186/76 825/1012/76 +f 825/1012/76 823/1187/76 817/1006/76 +f 834/1013/65 829/1188/65 828/1014/65 +f 835/1018/75 838/1019/75 839/1016/75 +f 839/1016/75 831/1189/75 829/1017/75 +f 829/1017/75 834/1190/75 835/1018/75 +f 838/1019/69 835/1018/69 832/1020/69 +f 831/1022/64 839/1025/64 836/1023/64 +f 837/1021/79 836/1023/79 839/1025/79 +f 833/1015/80 832/1020/80 835/1018/80 +f 828/1027/76 830/1191/76 836/1026/76 +f 836/1026/76 837/1021/76 832/1020/76 +f 832/1020/76 833/1192/76 828/1027/76 +f 846/1028/65 841/1193/65 840/1029/65 +f 847/1033/75 850/1034/75 851/1031/75 +f 851/1031/75 843/1194/75 841/1032/75 +f 841/1032/75 846/1195/75 847/1033/75 +f 850/1034/69 847/1033/69 844/1035/69 +f 843/1037/64 851/1040/64 848/1038/64 +f 849/1036/79 848/1038/79 851/1040/79 +f 845/1030/80 844/1035/80 847/1033/80 +f 840/1042/76 842/1196/76 848/1041/76 +f 848/1041/76 849/1036/76 844/1035/76 +f 844/1035/76 845/1197/76 840/1042/76 +f 858/1043/65 853/1198/65 852/1044/65 +f 859/1048/75 862/1049/75 863/1046/75 +f 863/1046/75 855/1199/75 853/1047/75 +f 853/1047/75 858/1200/75 859/1048/75 +f 862/1049/69 859/1048/69 856/1050/69 +f 855/1052/64 863/1055/64 860/1053/64 +f 861/1051/79 860/1053/79 863/1055/79 +f 857/1045/80 856/1050/80 859/1048/80 +f 852/1057/76 854/1201/76 860/1056/76 +f 860/1056/76 861/1051/76 856/1050/76 +f 856/1050/76 857/1202/76 852/1057/76 +f 870/1058/65 865/1203/65 864/1059/65 +f 871/1063/75 874/1064/75 875/1061/75 +f 875/1061/75 867/1204/75 865/1062/75 +f 865/1062/75 870/1205/75 871/1063/75 +f 874/1064/69 871/1063/69 868/1065/69 +f 867/1067/64 875/1070/64 872/1068/64 +f 873/1066/79 872/1068/79 875/1070/79 +f 869/1060/80 868/1065/80 871/1063/80 +f 864/1072/76 866/1206/76 872/1071/76 +f 872/1071/76 873/1066/76 868/1065/76 +f 868/1065/76 869/1207/76 864/1072/76 +f 882/1073/65 877/1208/65 876/1074/65 +f 883/1078/75 886/1079/75 887/1076/75 +f 887/1076/75 879/1209/75 877/1077/75 +f 877/1077/75 882/1210/75 883/1078/75 +f 886/1079/69 883/1078/69 880/1080/69 +f 879/1082/64 887/1085/64 884/1083/64 +f 885/1081/79 884/1083/79 887/1085/79 +f 881/1075/80 880/1080/80 883/1078/80 +f 876/1087/76 878/1211/76 884/1086/76 +f 884/1086/76 885/1081/76 880/1080/76 +f 880/1080/76 881/1212/76 876/1087/76 +f 903/1088/64 909/1094/64 906/1089/64 +f 900/1090/64 906/1089/64 907/1091/64 +f 903/1088/64 904/1097/64 910/1093/64 +f 902/1095/64 901/1092/64 907/1091/64 +f 904/1097/64 905/1120/64 911/1098/64 +f 895/1099/67 907/1091/67 906/1089/66 +f 894/1101/68 908/1096/68 907/1091/67 +f 912/1102/69 913/1112/69 908/1103/68 +f 896/1100/66 906/1089/66 909/1094/70 +f 897/1105/70 909/1094/70 910/1093/71 +f 898/1106/71 910/1093/71 911/1098/72 +f 911/1098/72 915/1213/73 918/1108/73 +f 893/1109/69 891/1214/69 917/1110/69 +f 913/1112/64 914/1215/64 902/1113/64 +f 889/1114/74 926/1121/74 915/1115/74 +f 917/1111/69 892/1118/69 890/1117/69 +f 915/1111/64 916/1121/64 890/1114/64 +f 919/1119/64 915/1213/64 911/1098/64 +f 916/1121/64 915/1111/64 919/1109/64 +f 920/1123/64 921/1127/64 923/1124/64 +f 924/1126/75 925/1216/75 923/1124/75 diff --git a/src/main/resources/assets/hbm/textures/models/pheodoors/vehicle_door.png b/src/main/resources/assets/hbm/textures/models/pheodoors/vehicle_door.png index 5c14f21741785c285f44afc8c2228e032c02154c..edaf232697539fca9aa32f5aeeea833aafc63ff0 100644 GIT binary patch literal 39878 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ⅈoGNq|z+Lba^@lj-DM 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�bL@Jy&>I2DUk!3 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 From 8cf6a7de880fd86495ca71c83d6b6638e98eb0db Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Mon, 22 Jun 2026 19:59:10 +0300 Subject: [PATCH 032/107] =?UTF-8?q?=D0=A1=D0=B8=D0=BB=D0=B0=20=D1=82=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/ru_RU.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index d4331233f..32e039fc7 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1874,6 +1874,7 @@ item.battery_sc.pu238.name=Самозарядная батарейка (Плут item.battery_sc.ra226.name=Самозарядная батарейка (Радий-226) item.battery_sc.tc99.name=Самозарядная батарейка (Технеций-99) item.battery_sc.waste.name=Самозарядная батарейка (Ядерные отходы) +item.battery_sc.desc=Радиовольтаический устройства не подходят для$аккумуляторных разъемов! Выходная мощность может$быть нестабильной, и может возникнуть опасное$искрение! item.battery_spark.name=Спарк-батарея item.battery_su.name=Одноразовая батарейка item.battery_su_l.name=Большая одноразовая батарейка From 0fcb0d05c49b48fa8f8da54182d0f705ee4f05f8 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Mon, 22 Jun 2026 22:29:29 +0200 Subject: [PATCH 033/107] bueff strokinoff --- .../pneumatic/PneumoStorageImporter.java | 3 +- .../ContainerPneumoStorageImporter.java | 15 +++ .../gui/GUIPneumoStorageImporter.java | 42 +++++++ .../TileEntityPneumoStorageAccess.java | 7 -- .../TileEntityPneumoStorageImporter.java | 112 ++++++++++++++++++ .../networkproviders/PneumaticNetwork.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 4 + .../blocks/pneumatic_storage_importer.png | Bin 0 -> 417 bytes .../gui/storage/gui_pneumatic_importer.png | Bin 0 -> 1317 bytes 10 files changed, 180 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerPneumoStorageImporter.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIPneumoStorageImporter.java create mode 100644 src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageImporter.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/pneumatic_storage_importer.png create mode 100644 src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_importer.png diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java index a2e410b84..5df23cec8 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java @@ -1,6 +1,7 @@ package com.hbm.blocks.network.pneumatic; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageImporter; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.BlockContainer; @@ -17,7 +18,7 @@ public class PneumoStorageImporter extends BlockContainer { @Override public TileEntity createNewTileEntity(World world, int meta) { - return null; + return new TileEntityPneumoStorageImporter(); } @Override diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageImporter.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageImporter.java new file mode 100644 index 000000000..4260b87d2 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageImporter.java @@ -0,0 +1,15 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageImporter; + +import net.minecraft.entity.player.InventoryPlayer; + +public class ContainerPneumoStorageImporter extends ContainerBase { + + public ContainerPneumoStorageImporter(InventoryPlayer invPlayer, TileEntityPneumoStorageImporter importer) { + super(invPlayer, importer); + + addSlots(importer, 0, 62, 17, 3, 3); + playerInv(invPlayer, 103); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageImporter.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageImporter.java new file mode 100644 index 000000000..b55b30e4f --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageImporter.java @@ -0,0 +1,42 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerPneumoStorageImporter; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageImporter; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUIPneumoStorageImporter extends GuiContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_pneumatic_importer.png"); + private TileEntityPneumoStorageImporter importer; + + public GUIPneumoStorageImporter(InventoryPlayer invPlayer, TileEntityPneumoStorageImporter importer) { + super(new ContainerPneumoStorageImporter(invPlayer, importer)); + this.importer = importer; + + this.xSize = 176; + this.ySize = 186; + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.importer.hasCustomInventoryName() ? this.importer.getInventoryName() : I18n.format(this.importer.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + } +} diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java index 140b396de..f138d180d 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java @@ -14,7 +14,6 @@ import api.hbm.ntl.StackCache; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; public class TileEntityPneumoStorageAccess extends TileEntityLoadedBase implements IPneumaticConnector, IGUIProvider { @@ -69,12 +68,6 @@ public class TileEntityPneumoStorageAccess extends TileEntityLoadedBase implemen if(this.cache != null) this.cache.dissolveCache(); } - @Override - public boolean canConnectPneumatic(ForgeDirection dir) { - ForgeDirection selfdir = ForgeDirection.getOrientation(getBlockMetadata()); - return dir == selfdir.getOpposite(); - } - @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageAccess(player.inventory, this); } @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageAccess(player.inventory, this); } } diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageImporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageImporter.java new file mode 100644 index 000000000..131486f71 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageImporter.java @@ -0,0 +1,112 @@ +package com.hbm.tileentity.network.pneumatic; + +import com.hbm.inventory.container.ContainerPneumoStorageImporter; +import com.hbm.inventory.gui.GUIPneumoStorageImporter; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube.PneumaticNode; +import com.hbm.uninos.UniNodespace; +import com.hbm.uninos.networkproviders.PneumaticNetworkProvider; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import api.hbm.ntl.IPneumaticConnector; +import api.hbm.ntl.StackCache; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class TileEntityPneumoStorageImporter extends TileEntityMachineBase implements IPneumaticConnector, IGUIProvider { + + protected PneumaticNode node; + public StackCache cache; + + public int[] delay = new int[9]; + public int[] SLOT_ACCESS = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8}; + + public TileEntityPneumoStorageImporter() { + super(9); + } + + @Override + public String getName() { + return "container.pneumoStorageImporter"; + } + + @Override + public void setInventorySlotContents(int i, ItemStack stack) { + super.setInventorySlotContents(i, stack); + + if(stack != null) this.delay[i] = Math.max(this.delay[i], 1); + } + + @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return true; } + @Override public int[] getAccessibleSlotsFromSide(int side) { return SLOT_ACCESS; } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(this.node == null || this.node.expired) { + if(this.cache != null) this.cache.dissolveCache(); + + this.node = (PneumaticNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); + + if(this.node == null || this.node.expired) { + this.node = (PneumaticNode) new PneumaticNode(new BlockPos(xCoord, yCoord, zCoord)).setStandardConnections(xCoord, yCoord, zCoord); + UniNodespace.createNode(worldObj, this.node); + } + } + + if(this.cache == null || this.cache.hasExpired) { + this.cache = new StackCache(xCoord, yCoord, zCoord); + } + + if(this.node != null && this.node.hasValidNet()) { + this.node.net.addStackCache(cache); + } + + if(this.cache != null && !this.cache.hasExpired) for(int i = 0; i < 9; i++) { + if(this.delay[i] > 0) { + this.delay[i]--; + continue; + } + ItemStack stack = slots[i]; + if(stack == null) continue; + + int leftover = (int) this.cache.addItemsAndReturnQuantity(stack, stack.stackSize); + if(leftover == stack.stackSize) { + this.delay[i] = 100; + } else { + this.decrStackSize(i, stack.stackSize - leftover); + } + } + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote && this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); + } + + if(this.cache != null) this.cache.dissolveCache(); + } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + if(!worldObj.isRemote && this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); + } + + if(this.cache != null) this.cache.dissolveCache(); + } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageImporter(player.inventory, this); } + @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageImporter(player.inventory, this); } +} diff --git a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java index bbe0dc575..b2f63b026 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java @@ -134,7 +134,7 @@ public class PneumaticNetwork extends NodeNet { TileEntity tile1 = source instanceof TileEntity ? (TileEntity) source : null; int attempts = 0; - int maxAttempts = receiverList.size(); + int maxAttempts = Math.min(receiverList.size(), 5); // try all receivers for both modes, in an attempts based system. // instead of bailing out of trying after the first failure (which means you have to wait 0.25 seconds), we just try the next one. diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 5fadd08b5..cf50d61fe 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -359,6 +359,8 @@ container.paSource=Teilchenquelle container.plasmaHeater=Plasmaerhitzer container.pneumoStorageAccess=PLS Zugangsterminal container.pneumoStorageClutter=PLS Gerümpelkiste +container.pneumoStorageImporter=PSN Importer +container.pneumoStorageMono=PLS Massenspeicher container.pneumoTube=Rohrpost container.press=Befeuerte Presse container.puf6_tank=PuF6 Tank @@ -4740,6 +4742,8 @@ tile.plasma_heater.name=Plasmaerhitzer tile.plushie.name=%s Plüschfigur tile.pneumatic_storage_access.name=Pneumatisches Lagersystem - Zugangsterminal tile.pneumatic_storage_clutter.name=Pneumatisches Lagersystem - Gerümpelkiste +tile.pneumatic_storage_importer.name=Pneumatisches Lagersystem - Importer +tile.pneumatic_storage_mono.name=Pneumatisches Lagersystem - Massenspeicher tile.pneumatic_tube.name=Rohrpost tile.pneumatic_tube.desc=Sendted Items mit Druckluft.$Rechtsklick mit Schraubenzieher aktiviert den Eingang.$Shift-Rechtskick mit Schrabuenzieher aktiviert den Ausgang.$Eingänge können konfiguriert und mit Druckluft verbunden werden.$Sendet bis zu einem Stack, vier Mal pro Sekunde. tile.pneumatic_tube_paintable.name=Geschirmte Rohrpost (Färbbar) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index be081a936..7c164eab5 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -761,6 +761,8 @@ container.paSource=Particle Source container.plasmaHeater=Plasma Heater container.pneumoStorageAccess=PSN Access Terminal container.pneumoStorageClutter=PSN Clutter Storage +container.pneumoStorageImporter=PSN Importer +container.pneumoStorageMono=PSN Bulk Storage container.pneumoTube=Pneumatic Tube container.press=Burner Press container.puf6_tank=PuF6 Tank @@ -6000,6 +6002,8 @@ tile.plasma_heater.name=Plasma Heater tile.plushie.name=%s Plushie tile.pneumatic_storage_access.name=Pneumatic Storage Network - Access Terminal tile.pneumatic_storage_clutter.name=Pneumatic Storage Network - Clutter Storage +tile.pneumatic_storage_importer.name=Pneumatic Storage Network - Importer +tile.pneumatic_storage_mono.name=Pneumatic Storage Network - Bulk Storage tile.pneumatic_tube.name=Pneumatic Tube tile.pneumatic_tube.desc=Sends items using compressed air.$Right-click with screwdriver to toggle an input.$Shift right-click with screwdriver to toggle an output.$Inputs can be configured, and connected to compressed air.$Sends up to one stack, four times per second. tile.pneumatic_tube_paintable.name=Paintable Pneumatic Tube diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_storage_importer.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_storage_importer.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c89f32363be438fbb5ee1e5ba6ac8b1a31ca3a GIT binary patch literal 417 zcmV;S0bc%zP)>)7Xv~TB>}OAbkihiq2Fm?=KHg=vk!~K;vyo52$64i8o%%tj`4T>NFdaQfRFa5oWRnysKIlwSYSw z{ls1~lRYBRYSdcuR<7?0K=njbY_E=N-ER#P;PFcGpQsabmAlTiCrJx}VgFhH8c%g& zU?Rdi^H8B8@=a~n60nWkft}(l^USMjG-{3=T#^>3u zkcv5P@7m@`r;D^*wEh>_&Rw2)W9NijCRsc?7Ebi57FckoReXXU_rg^nNslKnU7EOo z*L2;^u7n^CuB4+AeJ4K7Kku~-oG7r6;sUY^zFhz zuioa5U&Z%(>$8b`KlvWWcZ%Ep=>WR-z8Zso4}-!C1_uMih6E;tgDeb9oD3|&3>@Fq zd}XX#_EdlWR=YzFrkzfmYqvkMmgk#G2*avX>(;G{l1~g+eRY*z{QeA(Xbi)uJpD>4Id zo;=G(joqBxOjNSrXU)E^V)J(U+9l6op54XcFtyhq;He~o3(&;`j6(QP={sXj?&SVn zhb=;q4I6VmZ4~SXQ(_KCRTc=TWMjAp4+6plZa7iPkbL_|va-Nh7q*1Gaqn{~kKK57 zKy4Azh8VrS9QI< z>i@B$4F4Br*EY;wF#qqbOrHat^5a$@<-~hG!hXP)gSVi=gpm)`W)xLL{P7C)Dfm(RCt z&;R{So_((0^60+}pFe-zwP%mX@j342Kkg4{f2<5nM1(^Sn(XB6up7+vd;RB6&1?Cj zKFglq@X*@(-$TFNx987Oo?w|gqqtuA!qKCyp`mBfHm|z<-Jm}OD7<)nvhsxj8)np$ zOUTk*hi5%?e1|s*o|tp-{6@hH3p1vf#=k7hn0SvHlaPvl$>b(S%DETM4d$?$GaZz; z$+5-SjtQ2J`m7G@a_i(G>cY0 zefMqt-HNc#*z2W#lQw=h-D*%?&T#kQ#lXwW2h?mB?)3iNe_-E9&4gmTI!Lmil$1Dj YpMl-wP8I*;ry!#|UHx3vIVCg!047D*l>h($ literal 0 HcmV?d00001 From 2df6b4f0f7c7d6cbe7602b1f01c4ae461c9e61b6 Mon Sep 17 00:00:00 2001 From: FluffsADev <181914317+FluffsADev@users.noreply.github.com> Date: Tue, 23 Jun 2026 03:17:56 -0400 Subject: [PATCH 034/107] i did an oppsie heres new texture Co-Authored-By: TheVitya2127 --- .../textures/models/pheodoors/cargo_door.png | Bin 7154 -> 1641 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/models/pheodoors/cargo_door.png b/src/main/resources/assets/hbm/textures/models/pheodoors/cargo_door.png index 141bcc969b3b9002987cdce7099214f6286300c4..f9846e51b76249d3f341671217e026ec91a9e029 100644 GIT binary patch literal 1641 zcmV-v2A27WP)Px*BS}O-RA_08hOJG%{;{wKOhZoj*`3jp}XSHCd;`1SL@*ER0)y2|}NF@Sc`yCUp|u2*S@ z>%(me_n)q>B3@qH6=6Sgy^83|FFv=Uqa)C42da7{W2NKcV?2EL@YZ>M_uD-j9Ub8> zufC<_Z@xZ=2wuE+L6_kd>CvM{b{BZB`qoU2=-Pc6-(BFniv058@#DwWCfI5ccY${m zwF5CT?%%(E-Cj68KE4yYSJB3YHa>KNysK#ALmMC3_|V3OF3`q@Ha>KNysK#ALmM9& z+lNk1Put=y_{E3vF3Y`4Z7%n-U;OI2eE@ zLjbqVYn@v;mm>f;_~Z{pM7Vcv2eauE1i*U_gF!^WM2IOhJ6BZ%@4?JaRj3)52x+rW zLI{W{Ar&Ua+41V_q?B(Z_?*6+V=yz42%KYdp&J#?%$GFe0U!hq(;O|kF5um}Ih=DK zB7~5^A`0hSv-_%U?;L#aP*sS^X!v1>5D_?bmk(rWkm{Vw*qY6din`SdD%rNHlZptq z+@7d{%R4ngU^fcBDn?B&A4pW8s&LGZw6I+O7-B^59#XzD5xA&aN-z--h$_5yqv2zW zSVbOK*s3hqu5&I2bs^0A9$nWp5HW#3NFpuj0Dz=?^JCzdu1Ku)K}%q`aC55Yx&ZGz zTyemvcE=1egNPu6#SM;yH{=v!cCk`o0PUt?OpucFs#6X_#AMPzL^2<8=&TrKMvU3P zhZsl0OTk~tLkIg$tR}SSWRh=!sYR3EJ%%9yMENRE=t97}@8O(7*9DjvymL7+5y6;Y0GxAhZhU+;K{QtZ0PmecHN&KW zX{o6~2#7IaHk(3{ASG#al$jw+CT*i?$4R8sWH*g>>{?Z^>_)6+NRo1dD|sjck9psN znc+(jiDDX5RA1{qRmBh^QW_aw@=uljLQo(gq?B?Ql2UfW5++khtvGbf!4=zP$1vop zVP*`&FfP8BYn8tph)bl&r?wJF0E0E>6p@yr=6w(EJz`8v7{}ZS%+c^A`BwQan4Fn` z%FCMMD7Q+8aZwDaDnbb8hao#9XwlEy3LdS8Y6q&02CQ#Cv^=L{5n20wsA{ljXx;lE zS=LYm?Cfk~QYwYuJwov1))epNbIkkxLUn9vt%u5`h_-s{rtxRz=lJo*H!abc89sfs zZvepS?mt!nikjm2v!~{3uc0a!h5@l8IU>NjY`ZZH-c=gTS$RBpVY&$Sz_p{-J5KcJLGd3VtZw_( zhz|CjSS@^#2xxC_Z>=?Scz8(9pFK4u!e76BP5zf3e*{s*y`AmWRJ9(zj9fzqEum2< zSz<~cCIsgpDy?7~3;(Z^6A%#&4-a$s1mLrSee=L#p0G8WA*Ph4KdRX3LaU|Tp9i=y zb(u~l7>3xA;28M6?=Q>~UcUZrG28xsnkN7NfBouPTGx5PvSupfxm+n9)@`1!idvbP zRG{;D&g9M`rU>U8`o2fs_xV;zc{J&|X1}%TtUojszE%de16bR6!YcYVQ9bHe&_6S;00000NkvXXu0mjfC^ivb literal 7154 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 Date: Tue, 23 Jun 2026 12:40:57 +0300 Subject: [PATCH 035/107] =?UTF-8?q?=D0=9E=D0=BF=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/ru_RU.lang | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 32e039fc7..9dfc55b36 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -755,8 +755,10 @@ container.paDipole=Диполь container.paQuadrupole=Квадруполь container.paSource=Источник частиц container.plasmaHeater=Нагреватель плазмы -container.pneumoStorageAccess=Терминал доступа PSN -container.pneumoStorageClutter=Хранилище хлама PSN +container.pneumoStorageAccess=Терминал доступа ПСХ +container.pneumoStorageClutter=Хранилище хлама ПСХ +container.pneumoStorageImporter=Импортёр ПСХ +container.pneumoStorageMono=Единое хранилище ПСХ container.pneumoTube=Пневмотруба container.press=Пресс container.puf6_tank=Бочка PuF6 @@ -5027,6 +5029,7 @@ tile.capacitor_bus.desc=Выходной блок для конденсатор tile.capacitor_copper.name=Старый конденсатор tile.capacitor.desc=Вход: Сверху$Выход: Снизу через шину tile.cargo_elevator.name=Грузовой лифт +tile.cargo_door.name=Грузовая дверь tile.charge_c4.name=Подрывной заряд tile.charge_dynamite.name=Бомба с таймером tile.charge_miner.name=Шахтёрский заряд с таймером @@ -5622,7 +5625,6 @@ tile.machine_transformer.name=Трансформатор 10k-20Гц tile.machine_transformer_20.name=Трансформатор 10k-1Гц tile.machine_transformer_dnt.name=Трансформатор ДНТ-20Гц tile.machine_transformer_dnt_20.name=Трансформатор ДНТ-1Гц -tile.machine_turbine.name=Паровая турбина tile.machine_turbine.desc=Эффективность: 85%% tile.machine_turbinegas.name=Газовая турбина комбинированного цикла tile.machine_turbofan.name=Турбовентилятор @@ -5797,8 +5799,10 @@ tile.plant_tall.weed.name=Конопля tile.plasma.name=Плазма tile.plasma_heater.name=Нагреватель плазмы tile.plushie.name=Плюшевая игрушка %s -tile.pneumatic_storage_access.name=Пневматическая сеть хранение - Терминал доступа -tile.pneumatic_storage_clutter.name=Пневматическая сеть хранение - Хранилище хлама +tile.pneumatic_storage_access.name=Пневматическая сеть хранения - Терминал доступа +tile.pneumatic_storage_clutter.name=Пневматическая сеть хранения - Хранилище хлама +tile.pneumatic_storage_importer.name=Пневматическая сеть хранения - Импортёр +tile.pneumatic_storage_mono.name=Пневматическая сеть хранения - Единое хранилище tile.pneumatic_tube.name=Пневмотруба tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ с отверткой, чтобы переключить вход.$ПКМ с отверткой в присяде, чтобы переключить выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. tile.pneumatic_tube_paintable.name=Окрашиваемая пневмотруба From 183823072407367f3f0187569c940fac09e79246 Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Tue, 23 Jun 2026 14:43:40 +0300 Subject: [PATCH 036/107] =?UTF-8?q?=D0=A5=D0=B0=D0=B9=D0=BB=D0=B0=D0=B9?= =?UTF-8?q?=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/ru_RU.lang | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 9dfc55b36..7f26bf6f8 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -756,9 +756,9 @@ container.paQuadrupole=Квадруполь container.paSource=Источник частиц container.plasmaHeater=Нагреватель плазмы container.pneumoStorageAccess=Терминал доступа ПСХ -container.pneumoStorageClutter=Хранилище хлама ПСХ +container.pneumoStorageClutter=Буферное хранилище ПСХ container.pneumoStorageImporter=Импортёр ПСХ -container.pneumoStorageMono=Единое хранилище ПСХ +container.pneumoStorageMono=Монохранилище ПСХ container.pneumoTube=Пневмотруба container.press=Пресс container.puf6_tank=Бочка PuF6 @@ -5799,10 +5799,10 @@ tile.plant_tall.weed.name=Конопля tile.plasma.name=Плазма tile.plasma_heater.name=Нагреватель плазмы tile.plushie.name=Плюшевая игрушка %s -tile.pneumatic_storage_access.name=Пневматическая сеть хранения - Терминал доступа -tile.pneumatic_storage_clutter.name=Пневматическая сеть хранения - Хранилище хлама -tile.pneumatic_storage_importer.name=Пневматическая сеть хранения - Импортёр -tile.pneumatic_storage_mono.name=Пневматическая сеть хранения - Единое хранилище +tile.pneumatic_storage_access.name=Пневмосистема хранения - Терминал доступа +tile.pneumatic_storage_clutter.name=Пневмосистема хранения — Буферное хранилище +tile.pneumatic_storage_importer.name=Пневмосистема хранения - Импортёр +tile.pneumatic_storage_mono.name=Пневмосистема хранения - Монохранилище tile.pneumatic_tube.name=Пневмотруба tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ с отверткой, чтобы переключить вход.$ПКМ с отверткой в присяде, чтобы переключить выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. tile.pneumatic_tube_paintable.name=Окрашиваемая пневмотруба From 372c51e411bdc2e0a107cedbc779018141e7c6c0 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 23 Jun 2026 16:19:12 +0200 Subject: [PATCH 037/107] rounding over radio --- changelog | 4 ++++ src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java | 4 +++- .../hbm/tileentity/machine/TileEntityMachineBlastFurnace.java | 4 ++-- .../com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java | 3 +++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/changelog b/changelog index a86d04d2d..958841776 100644 --- a/changelog +++ b/changelog @@ -25,6 +25,10 @@ * Flashgold and flashlead are now made in the PUREX instead of the crafting table * The flashgold recipe now yields two billets instead of one * Slightly changed the HSS ingot texture to not look identical to steel except slightly greenish +* The AUTOCAL's buffer is now limited to 256 characters instead of being infinite +* Increased the blast furnace's fuel buffer by 50%, allowing coke blocks to be used +* If an RoR controller tries to parse an integer, but the supplied string represents a decimal, instead of canceling the operation, the system will now interpret decimals and round them to be integers + * This means that the AUTOCAL can now send RoR commands using calculated values directly without the use of `round` or `evalr` ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised diff --git a/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java b/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java index 4e90ac4ad..86e5bb59f 100644 --- a/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java +++ b/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java @@ -34,7 +34,9 @@ public interface IRORInteractive extends IRORInfo { public static int parseInt(String val, int min, int max) { int result = 0; - try { result = Integer.parseInt(val); } catch(Exception x) { throw new RORFunctionException(EX_FORMAT); }; + try { result = Integer.parseInt(val); } catch(Exception x) { + try { result = (int) Math.round(Double.parseDouble(val)); } catch(Exception y) { throw new RORFunctionException(EX_FORMAT); } + } if(result < min || result > max) throw new RORFunctionException(EX_FORMAT); return result; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBlastFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBlastFurnace.java index bd67f3358..08225588b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBlastFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBlastFurnace.java @@ -46,7 +46,7 @@ public class TileEntityMachineBlastFurnace extends TileEntityMachineBase impleme public int fuel; public static final int FUEL_COAL = 200 * 8; public static final int FUEL_RATE = 200 * 4; // half coal per operation - public static final int MAX_FUEL = FUEL_COAL * 16; // 16 pieces of coal + public static final int MAX_FUEL = FUEL_COAL * 24; // 24 pieces of coal, can also fit a bit more than a coal coke block public static final int FLUE_GAS = 100; // per finished operation, not per tick public ModuleBurnTime burnModule = new ModuleBurnTime() @@ -56,7 +56,7 @@ public class TileEntityMachineBlastFurnace extends TileEntityMachineBase impleme super(5); this.tanks = new FluidTank[2]; this.tanks[0] = new FluidTank(Fluids.AIRBLAST, 4_000); - this.tanks[1] = new FluidTank(Fluids.FLUE, 1_000); // TEMP + this.tanks[1] = new FluidTank(Fluids.FLUE, 1_000); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java index 17a835664..b75a4a5b0 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java @@ -27,6 +27,8 @@ public class TileEntityRadioAUTOCAL extends TileEntityTickingBase implements ICo public boolean ignoreError = false; public boolean autoReboot = false; + public static final int MAX_BUFFER_LENGTH = 256; + public String[] script = new String[0]; public IParse msesv1 = new ParseMSES1(); public ParseContext ctx; @@ -68,6 +70,7 @@ public class TileEntityRadioAUTOCAL extends TileEntityTickingBase implements ICo this.ctx.current ++; String line = this.script[index]; EnumStatementReturn ret = msesv1.eval(ctx, line); + if(ctx.buffer.length() > MAX_BUFFER_LENGTH) ctx.buffer = ctx.buffer.substring(0, MAX_BUFFER_LENGTH); if(ret != EnumStatementReturn.SKIP) pushMsg(index + ": " + line); this.history[0] = "Buffer: " + ctx.buffer; if(ret == EnumStatementReturn.END_TICK) break; From 8ee7d235ce130c371bcc8a668e0348f8563ef3ce Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Wed, 24 Jun 2026 12:51:15 +0300 Subject: [PATCH 038/107] Upgrade --- src/main/resources/assets/hbm/lang/ru_RU.lang | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 7f26bf6f8..9b8e2ed8e 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -5762,17 +5762,17 @@ tile.ore_uranium_scorched.name=Обожжённая урановая руда tile.ore_verticium.name=Долларовый Зелёный минерал tile.ore_volcano.name=Геотермальный источник tile.ore_weidanium.name=Вейдитит -tile.pa_beamline.name=Канал пучка +tile.pa_beamline.name=Канал пучка (Ускоритель частиц) tile.pa_beamline.desc=Необязательная часть, соединяет разные части ускорителя частиц.$Также позволяет недорого увеличить размер кольца,$для соответствия требованиям диполя к размеру катушки. -tile.pa_detector.name=Детектор частиц +tile.pa_detector.name=Детектор частиц (Ускоритель частиц) tile.pa_detector.desc=Требует охлаждения!$Принимает частицы и выполняет рецепт.$Рецепты могут требовать контейнеры (капсулы для частиц).$Для приёма частицы её расфокус должен быть равен 0. -tile.pa_dipole.name=Дипольные магниты +tile.pa_dipole.name=Дипольные магниты (Ускоритель частиц) tile.pa_dipole.desc=Требует охлаждения!$Перенаправляет частицы на основе их момента.$Имеет выходы ниже порога,$выше порога и только выше порога при поданном сигнале красного камня.$Требует большую катушку для работы. -tile.pa_quadrupole.name=Квадрупольные магниты +tile.pa_quadrupole.name=Квадрупольные магниты (Ускоритель частиц) tile.pa_quadrupole.desc=Требует охлаждения!$Уменьшает расфокус частицы на 100 единиц.$Требует большую катушку для работы -tile.pa_rfc.name=Радиочастотный резонатор +tile.pa_rfc.name=Радиочастотный резонатор (Ускоритель частиц) tile.pa_rfc.desc=Требует охлаждения!$Ускоряет частицы на 100 единиц,$и увеличивает расфокус на 100 единиц.$Частица столкнется при достижении расфокуса в 1000 единиц. -tile.pa_source.name=Источник частиц +tile.pa_source.name=Источник частиц (Ускоритель частиц) tile.pa_source.desc=Требует охлаждения!$Использует два предмета, чтобы создать частицу. tile.part_emitter.name=Декоративный источник частиц tile.pedestal.name=Пьедестал From 5cee3ed8fa7e6a69674c41fc354412fc5681816a Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 24 Jun 2026 15:02:08 +0200 Subject: [PATCH 039/107] MS-ES v1.1 (first extended instruction set, now with stacks and split) --- changelog | 3 +- src/main/java/com/hbm/blocks/ModBlocks.java | 10 +-- .../com/hbm/blocks/network/RadioAUTOCAL.java | 2 +- .../pneumatic/PneumoStorageExporter.java | 19 +++++ .../pneumatic/PneumoStorageImporter.java | 19 +---- .../network/pneumatic/PneumoStorageMono.java | 46 +++++++++++ .../inventory/gui/GUIScreenRadioAUTOCAL.java | 6 ++ src/main/java/com/hbm/module/IParse.java | 77 ++++++++++++++++- src/main/java/com/hbm/module/ParseMSES1.java | 80 +++++++++--------- .../java/com/hbm/module/ParseMSES1Ext1.java | 82 +++++++++++++++++++ .../network/TileEntityRadioAUTOCAL.java | 32 +++----- 11 files changed, 289 insertions(+), 87 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java create mode 100644 src/main/java/com/hbm/module/ParseMSES1Ext1.java diff --git a/changelog b/changelog index 958841776..b5b39f0d4 100644 --- a/changelog +++ b/changelog @@ -38,4 +38,5 @@ * Fixed AUTOCAL's file opening buttons not working on some systems, it will fall back to opening the folder instead * Fixed some recipes not using ore dict when they should * Fixed `anyBismoid` group not being a proper group, causing other mods' bismuth and arsenic to not be included -* Fixed RoR gauge not using SI suffixes on values below 0 \ No newline at end of file +* Fixed RoR gauge not using SI suffixes on values below 0 +* Fixed AUTOCAL units not closing their GUI when the unit is destroyed \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 15339b386..537d02097 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -12,12 +12,7 @@ import com.hbm.blocks.machine.fusion.*; import com.hbm.blocks.machine.pile.*; import com.hbm.blocks.machine.rbmk.*; import com.hbm.blocks.network.*; -import com.hbm.blocks.network.pneumatic.PneumoStorageAccess; -import com.hbm.blocks.network.pneumatic.PneumoStorageClutter; -import com.hbm.blocks.network.pneumatic.PneumoStorageImporter; -import com.hbm.blocks.network.pneumatic.PneumoStorageMono; -import com.hbm.blocks.network.pneumatic.PneumoTube; -import com.hbm.blocks.network.pneumatic.PneumoTubePaintableBlock; +import com.hbm.blocks.network.pneumatic.*; import com.hbm.blocks.rail.*; import com.hbm.blocks.test.*; import com.hbm.blocks.turret.*; @@ -810,6 +805,7 @@ public class ModBlocks { public static Block pneumatic_storage_clutter; public static Block pneumatic_storage_mono; public static Block pneumatic_storage_importer; + public static Block pneumatic_storage_exporter; public static Block fan; public static Block piston_inserter; @@ -1915,6 +1911,7 @@ public class ModBlocks { pneumatic_storage_clutter = new PneumoStorageClutter().setBlockName("pneumatic_storage_clutter").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_clutter"); pneumatic_storage_mono = new PneumoStorageMono().setBlockName("pneumatic_storage_mono").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_mono"); pneumatic_storage_importer = new PneumoStorageImporter().setBlockName("pneumatic_storage_importer").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_importer"); + pneumatic_storage_exporter = new PneumoStorageExporter().setBlockName("pneumatic_storage_exporter").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_exporter"); chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); @@ -3183,6 +3180,7 @@ public class ModBlocks { register(pneumatic_storage_clutter); register(pneumatic_storage_mono); register(pneumatic_storage_importer); + register(pneumatic_storage_exporter); register(fan); register(piston_inserter); diff --git a/src/main/java/com/hbm/blocks/network/RadioAUTOCAL.java b/src/main/java/com/hbm/blocks/network/RadioAUTOCAL.java index ca989f365..8b7c6f7b2 100644 --- a/src/main/java/com/hbm/blocks/network/RadioAUTOCAL.java +++ b/src/main/java/com/hbm/blocks/network/RadioAUTOCAL.java @@ -22,7 +22,7 @@ public class RadioAUTOCAL extends BlockDummyable { return null; } - @Override public int[] getDimensions() { return new int[] {1, 0, 0, 0, 0 ,0}; } + @Override public int[] getDimensions() { return new int[] {1, 0, 0, 0, 0, 0}; } @Override public int getOffset() { return 0; } @Override diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java new file mode 100644 index 000000000..49d0724e4 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java @@ -0,0 +1,19 @@ +package com.hbm.blocks.network.pneumatic; + +import com.hbm.blocks.machine.BlockMachineBase; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class PneumoStorageExporter extends BlockMachineBase { + + public PneumoStorageExporter() { + super(Material.iron, 0); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return null; + } +} diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java index 5df23cec8..a6a70e5b2 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageImporter.java @@ -1,33 +1,20 @@ package com.hbm.blocks.network.pneumatic; -import com.hbm.main.MainRegistry; +import com.hbm.blocks.machine.BlockMachineBase; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageImporter; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class PneumoStorageImporter extends BlockContainer { +public class PneumoStorageImporter extends BlockMachineBase { public PneumoStorageImporter() { - super(Material.iron); + super(Material.iron, 0); } @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPneumoStorageImporter(); } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) return true; - if(!player.isSneaking()) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - return true; - } - return false; - } } diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageMono.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageMono.java index 898af831e..73d9f4742 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageMono.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageMono.java @@ -6,7 +6,11 @@ import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageMono; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -30,4 +34,46 @@ public class PneumoStorageMono extends BlockContainer { } return false; } + + @Override + public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) { + + if(!player.capabilities.isCreativeMode && !world.isRemote && willHarvest) { + + TileEntityPneumoStorageMono inv = (TileEntityPneumoStorageMono) world.getTileEntity(x, y, z); + ItemStack drop = new ItemStack(this); + NBTTagCompound nbt = new NBTTagCompound(); + + if(inv != null) { + for(int i = 0; i < 3; i++) { + ItemStack stack = inv.getStackInSlot(i); + if(stack == null) continue; + NBTTagCompound slot = new NBTTagCompound(); + stack.writeToNBT(slot); + nbt.setTag("slot" + i, slot); + nbt.setInteger("amount" + i, inv.amounts[i]); + } + } + + if(!nbt.hasNoTags()) drop.stackTagCompound = nbt; + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, drop)); + } + + return world.setBlockToAir(x, y, z); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + + TileEntityPneumoStorageMono inv = (TileEntityPneumoStorageMono) world.getTileEntity(x, y, z); + + if(inv != null && stack.hasTagCompound()) { + for(int i = 0; i < 3; i++) { + inv.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("slot" + i))); + inv.amounts[i] = stack.stackTagCompound.getInteger("amount" + i); + } + } + + super.onBlockPlacedBy(world, x, y, z, player, stack); + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java index b509c167b..3344dec11 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java @@ -64,6 +64,12 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { @Override public void drawScreen(int mouseX, int mouseY, float f) { + + if(this.autocal == null || this.autocal.isInvalid()) { + Minecraft.getMinecraft().thePlayer.closeScreen(); + return; + } + this.drawDefaultBackground(); this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); GL11.glDisable(GL11.GL_LIGHTING); diff --git a/src/main/java/com/hbm/module/IParse.java b/src/main/java/com/hbm/module/IParse.java index df96547ee..bc29bdd7f 100644 --- a/src/main/java/com/hbm/module/IParse.java +++ b/src/main/java/com/hbm/module/IParse.java @@ -15,12 +15,59 @@ public interface IParse { public NBTTagCompound variables = new NBTTagCompound(); public HashMap jmp = new HashMap(); - public String buffer = ""; + public static final int MAX_BUFFER_LENGTH = 256; + public static final int MAX_STACK_SIZE = 256; + + private String buffer = ""; + private String[] stack = new String[MAX_STACK_SIZE]; + private int stackSize = 0; + public String splitString = ";"; public int clockSpeed = 1; public int current = 0; public ParseContext(World world) { this.world = world; + + for(int i = 0; i < MAX_STACK_SIZE; i++) stack[i] = ""; + } + + public String readBuffer() { + return this.buffer; + } + + /** Sets the buffer and imposes length restrictions. Returns true if successful, and false if truncation has taken place. */ + public boolean writeBuffer(String buffer) { + + if(buffer.length() > MAX_BUFFER_LENGTH) { + this.buffer = buffer.substring(0, MAX_BUFFER_LENGTH); + return false; + } + + this.buffer = buffer; + return true; + } + + public boolean push(String line) { + if(stackSize >= MAX_STACK_SIZE) return false; + if(line.length() > MAX_BUFFER_LENGTH) line = line.substring(0, MAX_BUFFER_LENGTH); + stack[stackSize] = line; + stackSize++; + return true; + } + + public String pop() { + if(stackSize <= 0) return null; + if(stackSize > MAX_STACK_SIZE) stackSize = MAX_STACK_SIZE; + String ret = stack[stackSize - 1]; + stack[stackSize - 1] = ""; + stackSize--; + return ret; + } + + public String peek() { + if(stackSize <= 0) return null; + if(stackSize > MAX_STACK_SIZE) stackSize = MAX_STACK_SIZE; + return stack[stackSize - 1]; } public void turnOff() { @@ -29,6 +76,30 @@ public interface IParse { this.buffer = ""; if(!this.variables.hasNoTags()) this.variables = new NBTTagCompound(); } + + // NBT R/W is now in control of the CTX, meaning additions to the AUTOCAL runtime should be a lot easier + public void readFromNBT(NBTTagCompound nbt, String[] script, IParse parser) { + current = nbt.getInteger("current"); + clockSpeed = nbt.getInteger("clockSpeed"); + buffer = nbt.getString("buffer"); + splitString = nbt.getString("splitString"); + variables = nbt.getCompoundTag("variables"); + + stackSize = nbt.getInteger("stackSize"); + for(int i = 0; i < MAX_STACK_SIZE; i++) stack[i] = nbt.getString("st" + i); + for(int i = 0; i < script.length; i++) parser.generateJumpPoints(this, script[i], i); + } + + public void writeToNBT(NBTTagCompound nbt) { + nbt.setInteger("current", current); + nbt.setInteger("clockSpeed", clockSpeed); + nbt.setString("buffer", buffer); + nbt.setString("splitString", splitString); + nbt.setTag("variables", variables); + + nbt.setInteger("stackSize", stackSize); + for(int i = 0; i < MAX_STACK_SIZE; i++) nbt.setString("st" + i, stack[i]); + } } public static enum EnumStatementReturn { @@ -45,6 +116,8 @@ public interface IParse { /** Skips the instruction, doesn't use up a clock cycle */ SKIP, /** General undefined behavior */ - UNDEFINED + UNDEFINED, + /** Stack ran full */ + STACK_EXCEEDED } } diff --git a/src/main/java/com/hbm/module/ParseMSES1.java b/src/main/java/com/hbm/module/ParseMSES1.java index 1f9c8c931..1814d3b7c 100644 --- a/src/main/java/com/hbm/module/ParseMSES1.java +++ b/src/main/java/com/hbm/module/ParseMSES1.java @@ -48,7 +48,7 @@ public class ParseMSES1 implements IParse { // sets the script index to the jump point, if the buffer is the string 'true' if(lower.startsWith("jmpif ")) { if(line.length() <= 6) return EnumStatementReturn.PARAMETER_ERROR; - if(!ctx.buffer.equals("true")) return EnumStatementReturn.OK; + if(!ctx.readBuffer().equals("true")) return EnumStatementReturn.OK; String jmpKey = substitute(ctx, line.substring(6), false); if(ctx.jmp.containsKey(jmpKey)) { ctx.current = ctx.jmp.get(jmpKey); @@ -60,7 +60,7 @@ public class ParseMSES1 implements IParse { // sets the script index to the jump point, if the buffer is the NOT 'true' if(lower.startsWith("jmpnot ")) { if(line.length() <= 7) return EnumStatementReturn.PARAMETER_ERROR; - if(ctx.buffer.equals("true")) return EnumStatementReturn.OK; + if(ctx.readBuffer().equals("true")) return EnumStatementReturn.OK; String jmpKey = substitute(ctx, line.substring(7), false); if(ctx.jmp.containsKey(jmpKey)) { ctx.current = ctx.jmp.get(jmpKey); @@ -82,21 +82,21 @@ public class ParseMSES1 implements IParse { // loads the requested variable into the buffer if(lower.startsWith("load ")) { if(line.length() <= 5) return EnumStatementReturn.PARAMETER_ERROR; - ctx.buffer = ctx.variables.getString(line.substring(5)); + ctx.writeBuffer(ctx.variables.getString(line.substring(5))); return EnumStatementReturn.OK; } // saves the buffer with the specified name if(lower.startsWith("save ")) { - if(line.length() <= 5 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; - ctx.variables.setString(line.substring(5), ctx.buffer); + if(line.length() <= 5 || ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + ctx.variables.setString(line.substring(5), ctx.readBuffer()); return EnumStatementReturn.OK; } // stores the specified value in the buffer if(lower.startsWith("buffer ")) { if(line.length() <= 7) return EnumStatementReturn.PARAMETER_ERROR; - ctx.buffer = line.substring(7); + ctx.writeBuffer(line.substring(7)); return EnumStatementReturn.OK; } @@ -106,7 +106,7 @@ public class ParseMSES1 implements IParse { String statement = substitute(ctx, line.substring(5), true); try { double result = Calculator.evaluateExpression(statement); - ctx.buffer = "" + result; + ctx.writeBuffer("" + result); } catch(Throwable ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } @@ -117,115 +117,115 @@ public class ParseMSES1 implements IParse { String statement = substitute(ctx, line.substring(6), true); try { double result = Calculator.evaluateExpression(statement); - ctx.buffer = "" + (int) Math.round(result); + ctx.writeBuffer("" + (int) Math.round(result)); } catch(Throwable ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // runs the calculation from the buffer, allows string substitution, saves result to buffer if(lower.equals("evalr")) { - if(ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; - String statement = substitute(ctx, ctx.buffer, true); + if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + String statement = substitute(ctx, ctx.readBuffer(), true); try { double result = Calculator.evaluateExpression(statement); - ctx.buffer = "" + (int) Math.round(result); + ctx.writeBuffer("" + (int) Math.round(result)); } catch(Throwable ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // rounds the buffer down to the nearest integer if(lower.equals("rounddown") || lower.equals("floor")) { - if(ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { - double d = Double.parseDouble(ctx.buffer); - ctx.buffer = "" + (int) Math.floor(d); + double d = Double.parseDouble(ctx.readBuffer()); + ctx.writeBuffer("" + (int) Math.floor(d)); } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // rounds the buffer up to the nearest integer if(lower.equals("roundup") || lower.equals("ceil")) { - if(ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { - double d = Double.parseDouble(ctx.buffer); - ctx.buffer = "" + (int) Math.ceil(d); + double d = Double.parseDouble(ctx.readBuffer()); + ctx.writeBuffer("" + (int) Math.ceil(d)); } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // rounds the buffer to the nearest integer (.5 cutoff rule) if(lower.equals("round") || lower.equals("nearest")) { - if(ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { - double d = Double.parseDouble(ctx.buffer); - ctx.buffer = "" + (int) Math.round(d); + double d = Double.parseDouble(ctx.readBuffer()); + ctx.writeBuffer("" + (int) Math.round(d)); } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // concatenate, same as buffer but evaluates $var$ substitutions if(lower.startsWith("concat ")) { - if(line.length() <= 7 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 7 || ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; String concat = substitute(ctx, line.substring(7), false); - ctx.buffer = concat; + ctx.writeBuffer(concat); return EnumStatementReturn.OK; } // compares the buffer with a value, allows substitutions if(lower.startsWith("eq ")) { - if(line.length() <= 3 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; - ctx.buffer = ctx.buffer.equals(substitute(ctx, line.substring(3), false)) ? "true" : "false"; + if(line.length() <= 3 || ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + ctx.writeBuffer(ctx.readBuffer().equals(substitute(ctx, line.substring(3), false)) ? "true" : "false"); return EnumStatementReturn.OK; } // greater than buffer if(lower.startsWith("gtb ")) { - if(line.length() <= 4 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 4 || ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { - double buffer = Double.parseDouble(ctx.buffer); + double buffer = Double.parseDouble(ctx.readBuffer()); double val = Double.parseDouble(substitute(ctx, line.substring(4), false)); - ctx.buffer = val > buffer ? "true" : "false"; + ctx.writeBuffer(val > buffer ? "true" : "false"); } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // lower than buffer if(lower.startsWith("ltb ")) { - if(line.length() <= 4 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 4 || ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { - double buffer = Double.parseDouble(ctx.buffer); + double buffer = Double.parseDouble(ctx.readBuffer()); double val = Double.parseDouble(substitute(ctx, line.substring(4), false)); - ctx.buffer = val < buffer ? "true" : "false"; + ctx.writeBuffer(val < buffer ? "true" : "false"); } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // greater than or equal buffer if(lower.startsWith("geb ")) { - if(line.length() <= 4 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 4 || ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { - double buffer = Double.parseDouble(ctx.buffer); + double buffer = Double.parseDouble(ctx.readBuffer()); double val = Double.parseDouble(substitute(ctx, line.substring(4), false)); - ctx.buffer = val >= buffer ? "true" : "false"; + ctx.writeBuffer(val >= buffer ? "true" : "false"); } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // lower than or equal buffer if(lower.startsWith("leb ")) { - if(line.length() <= 4 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + if(line.length() <= 4 || ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; try { - double buffer = Double.parseDouble(ctx.buffer); + double buffer = Double.parseDouble(ctx.readBuffer()); double val = Double.parseDouble(substitute(ctx, line.substring(4), false)); - ctx.buffer = val <= buffer ? "true" : "false"; + ctx.writeBuffer(val <= buffer ? "true" : "false"); } catch(Exception ex) { return EnumStatementReturn.PARAMETER_ERROR; } return EnumStatementReturn.OK; } // sends an RoR signal using the buffer's contents as the message over the supplied channel if(lower.startsWith("send ")) { - if(line.length() <= 5 || ctx.buffer.isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; - RTTYSystem.broadcast(ctx.world, substitute(ctx, line.substring(5), false), ctx.buffer); + if(line.length() <= 5 || ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + RTTYSystem.broadcast(ctx.world, substitute(ctx, line.substring(5), false), ctx.readBuffer()); return EnumStatementReturn.OK; } @@ -233,7 +233,7 @@ public class ParseMSES1 implements IParse { if(lower.startsWith("listen ")) { if(line.length() <= 7) return EnumStatementReturn.PARAMETER_ERROR; RTTYChannel chan = RTTYSystem.listen(ctx.world, substitute(ctx, line.substring(7), false)); - if(chan != null) ctx.buffer = chan.signal + ""; + if(chan != null) ctx.writeBuffer(chan.signal + ""); return EnumStatementReturn.OK; } @@ -254,7 +254,7 @@ public class ParseMSES1 implements IParse { readingVar = true; } else { if("buffer".equals(var)) { - joined.append(ctx.buffer); + joined.append(ctx.readBuffer()); } else { String variable = ctx.variables.getString(var.toString()); if(forceNumber && variable.isEmpty()) variable = "0"; diff --git a/src/main/java/com/hbm/module/ParseMSES1Ext1.java b/src/main/java/com/hbm/module/ParseMSES1Ext1.java new file mode 100644 index 000000000..072e6ed58 --- /dev/null +++ b/src/main/java/com/hbm/module/ParseMSES1Ext1.java @@ -0,0 +1,82 @@ +package com.hbm.module; + +import java.util.Locale; +import java.util.regex.Pattern; + +/** + * MSES1-FEIS: Machine Script, Equestrian Standard - First Extended Instruction Set (v1.1) + * + * Additions compared to v1 Standard: + * * Support for splitter chars, splitting and split count + * * Support for the stack, a secondary buffer that can push, pop and peek + * + * @author hbm + */ +public class ParseMSES1Ext1 extends ParseMSES1 { + + @Override + public EnumStatementReturn eval(ParseContext ctx, String line) { + String lower = line.toLowerCase(Locale.US); + + // sets the splitter char + if(lower.startsWith("splitter ")) { + if(line.length() <= 9) return EnumStatementReturn.PARAMETER_ERROR; + String splitter = substitute(ctx, line.substring(9), false); + ctx.splitString = splitter; + return EnumStatementReturn.OK; + } + + // grabs a fragment based on index + if(lower.startsWith("split ")) { + if(line.length() <= 6) return EnumStatementReturn.PARAMETER_ERROR; + try { + int index = Integer.parseInt(line.substring(6)); + if(index < 1) return EnumStatementReturn.PARAMETER_ERROR; + String[] frags = ctx.readBuffer().split(Pattern.quote(ctx.splitString)); + if(index > frags.length) return EnumStatementReturn.PARAMETER_ERROR; + ctx.writeBuffer(frags[index - 1]); + return EnumStatementReturn.OK; + } catch(Throwable ex) { return EnumStatementReturn.PARAMETER_ERROR; } + } + + // counts the amount of fragments in this string + if(lower.equals("splitcount")) { + if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + String[] frags = ctx.readBuffer().split(Pattern.quote(ctx.splitString)); + ctx.writeBuffer(frags.length + ""); + return EnumStatementReturn.OK; + } + + // pushes the buffer to stack + if(lower.equals("push")) { + if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + boolean succ = ctx.push(ctx.readBuffer()); + return succ ? EnumStatementReturn.OK : EnumStatementReturn.STACK_EXCEEDED; + } + + // pushes the supplied value (or variable) to stack + if(lower.startsWith("push ")) { + if(line.length() <= 5) return EnumStatementReturn.PARAMETER_ERROR; + boolean succ = ctx.push(substitute(ctx, line.substring(5), false)); + return succ ? EnumStatementReturn.OK : EnumStatementReturn.STACK_EXCEEDED; + } + + // removes the most recent element from stack and writes it to the buffer + if(lower.equals("pop")) { + String val = ctx.pop(); + if(val == null) return EnumStatementReturn.UNDEFINED; + ctx.writeBuffer(val); + return EnumStatementReturn.OK; + } + + // writes the most recent element to the buffer + if(lower.equals("peek")) { + String val = ctx.peek(); + if(val == null) return EnumStatementReturn.UNDEFINED; + ctx.writeBuffer(val); + return EnumStatementReturn.OK; + } + + return super.eval(ctx, line); + } +} diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java index b75a4a5b0..0d1de3d5c 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java @@ -5,7 +5,7 @@ import com.hbm.inventory.gui.GUIScreenRadioAUTOCAL; import com.hbm.module.IParse; import com.hbm.module.IParse.EnumStatementReturn; import com.hbm.module.IParse.ParseContext; -import com.hbm.module.ParseMSES1; +import com.hbm.module.ParseMSES1Ext1; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.util.BufferUtil; @@ -27,10 +27,8 @@ public class TileEntityRadioAUTOCAL extends TileEntityTickingBase implements ICo public boolean ignoreError = false; public boolean autoReboot = false; - public static final int MAX_BUFFER_LENGTH = 256; - public String[] script = new String[0]; - public IParse msesv1 = new ParseMSES1(); + public IParse msesv1ext = new ParseMSES1Ext1(); public ParseContext ctx; public String[] history = new String[] {"", "", "", "", "", ""}; @@ -69,16 +67,16 @@ public class TileEntityRadioAUTOCAL extends TileEntityTickingBase implements ICo int index = this.ctx.current; this.ctx.current ++; String line = this.script[index]; - EnumStatementReturn ret = msesv1.eval(ctx, line); - if(ctx.buffer.length() > MAX_BUFFER_LENGTH) ctx.buffer = ctx.buffer.substring(0, MAX_BUFFER_LENGTH); + EnumStatementReturn ret = msesv1ext.eval(ctx, line); if(ret != EnumStatementReturn.SKIP) pushMsg(index + ": " + line); - this.history[0] = "Buffer: " + ctx.buffer; + this.history[0] = "Buffer: " + ctx.readBuffer(); if(ret == EnumStatementReturn.END_TICK) break; if(ret == EnumStatementReturn.SHUTDOWN) this.stop("Program requested shutdown"); if(!this.ignoreError) { if(ret == EnumStatementReturn.UNRECOGNIZED_COMMAND) this.stop("Unrecognized command"); if(ret == EnumStatementReturn.PARAMETER_ERROR) this.stop("Parameter error"); if(ret == EnumStatementReturn.UNDEFINED) this.stop("Undefined behavior"); + if(ret == EnumStatementReturn.STACK_EXCEEDED) this.stop("Stack exceeded capacity"); } if(ret == EnumStatementReturn.SKIP) i--; } catch(Exception ex) { @@ -132,19 +130,14 @@ public class TileEntityRadioAUTOCAL extends TileEntityTickingBase implements ICo this.ignoreError = nbt.getBoolean("ignoreError"); this.autoReboot = nbt.getBoolean("autoReboot"); - this.ctx = new ParseContext(null); - this.ctx.current = nbt.getInteger("current"); - this.ctx.clockSpeed = nbt.getInteger("clockSpeed"); - this.ctx.buffer = nbt.getString("buffer"); - NBTTagList lineList = nbt.getTagList("script", 8); this.script = new String[lineList.tagList.size()]; for(int i = 0; i < script.length; i++) { this.script[i] = lineList.getStringTagAt(i); - this.msesv1.generateJumpPoints(ctx, script[i], i); } - - this.ctx.variables = nbt.getCompoundTag("variables"); + + this.ctx = new ParseContext(null); + this.ctx.readFromNBT(nbt, script, msesv1ext); } @Override @@ -154,17 +147,14 @@ public class TileEntityRadioAUTOCAL extends TileEntityTickingBase implements ICo nbt.setBoolean("isOn", isOn); nbt.setBoolean("ignoreError", ignoreError); nbt.setBoolean("autoReboot", autoReboot); - - nbt.setInteger("current", ctx.current); - nbt.setInteger("clockSpeed", ctx.clockSpeed); - nbt.setString("buffer", ctx.buffer); NBTTagList lineList = new NBTTagList(); for(String line : this.script) { lineList.appendTag(new NBTTagString(line)); } nbt.setTag("script", lineList); - nbt.setTag("variables", this.ctx.variables); + + this.ctx.writeToNBT(nbt); } @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } @@ -189,7 +179,7 @@ public class TileEntityRadioAUTOCAL extends TileEntityTickingBase implements ICo this.script = data.getString("payload").split("\n"); for(int i = 0; i < script.length; i++) { script[i] = script[i].trim(); - this.msesv1.generateJumpPoints(ctx, script[i], i); + this.msesv1ext.generateJumpPoints(ctx, script[i], i); } if(this.isOn) stop("Script has changed"); } From 85a15f1bbd29ba02109343bfa1acdb25e4f52384 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 25 Jun 2026 13:37:37 +0200 Subject: [PATCH 040/107] MS-ES v1.1 substring and count, pneumo storage exporter --- .../pneumatic/PneumoStorageExporter.java | 3 +- .../java/com/hbm/module/ParseMSES1Ext1.java | 31 ++++++++ .../TileEntityPneumaticMachineBase.java | 69 ++++++++++++++++++ .../TileEntityPneumoStorageExporter.java | 57 +++++++++++++++ .../TileEntityPneumoStorageImporter.java | 55 +------------- .../gui/storage/gui_pneumatic_exporter.png | Bin 0 -> 2154 bytes 6 files changed, 161 insertions(+), 54 deletions(-) create mode 100644 src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticMachineBase.java create mode 100644 src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java create mode 100644 src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_exporter.png diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java index 49d0724e4..033447355 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java @@ -1,6 +1,7 @@ package com.hbm.blocks.network.pneumatic; import com.hbm.blocks.machine.BlockMachineBase; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageExporter; import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; @@ -14,6 +15,6 @@ public class PneumoStorageExporter extends BlockMachineBase { @Override public TileEntity createNewTileEntity(World world, int meta) { - return null; + return new TileEntityPneumoStorageExporter(); } } diff --git a/src/main/java/com/hbm/module/ParseMSES1Ext1.java b/src/main/java/com/hbm/module/ParseMSES1Ext1.java index 072e6ed58..d59ce6ee3 100644 --- a/src/main/java/com/hbm/module/ParseMSES1Ext1.java +++ b/src/main/java/com/hbm/module/ParseMSES1Ext1.java @@ -9,6 +9,7 @@ import java.util.regex.Pattern; * Additions compared to v1 Standard: * * Support for splitter chars, splitting and split count * * Support for the stack, a secondary buffer that can push, pop and peek + * * Support for getting string length and substring using first and last * * @author hbm */ @@ -77,6 +78,36 @@ public class ParseMSES1Ext1 extends ParseMSES1 { return EnumStatementReturn.OK; } + // figures out buffer string's length + if(lower.equals("length")) { + ctx.writeBuffer("" + ctx.readBuffer().length()); + return EnumStatementReturn.OK; + } + + // grabs the first x characters from the buffer and writes them back to the buffer + if(lower.startsWith("first ")) { + if(line.length() <= 6) return EnumStatementReturn.PARAMETER_ERROR; + try { + int length = Integer.parseInt(line.substring(6)); + int max = ctx.readBuffer().length(); + if(length > max) length = max; + ctx.writeBuffer(ctx.readBuffer().substring(0, length)); + return EnumStatementReturn.OK; + } catch(Exception x) { return EnumStatementReturn.PARAMETER_ERROR; } + } + + // grabs the last x characters from the buffer and writes them back to the buffer + if(lower.startsWith("last ")) { + if(line.length() <= 5) return EnumStatementReturn.PARAMETER_ERROR; + try { + int length = Integer.parseInt(line.substring(5)); + int max = ctx.readBuffer().length(); + if(length > max) length = max; + ctx.writeBuffer(ctx.readBuffer().substring(max - length, max)); + return EnumStatementReturn.OK; + } catch(Exception x) { return EnumStatementReturn.PARAMETER_ERROR; } + } + return super.eval(ctx, line); } } diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticMachineBase.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticMachineBase.java new file mode 100644 index 000000000..681739cf4 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticMachineBase.java @@ -0,0 +1,69 @@ +package com.hbm.tileentity.network.pneumatic; + +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube.PneumaticNode; +import com.hbm.uninos.UniNodespace; +import com.hbm.uninos.networkproviders.PneumaticNetworkProvider; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import api.hbm.ntl.IPneumaticConnector; +import api.hbm.ntl.StackCache; + +public abstract class TileEntityPneumaticMachineBase extends TileEntityMachineBase implements IPneumaticConnector, IGUIProvider { + + protected PneumaticNode node; + public StackCache cache; + + public TileEntityPneumaticMachineBase(int slotCount) { + super(slotCount); + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(this.node == null || this.node.expired) { + if(this.cache != null) this.cache.dissolveCache(); + + this.node = (PneumaticNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); + + if(this.node == null || this.node.expired) { + this.node = (PneumaticNode) new PneumaticNode(new BlockPos(xCoord, yCoord, zCoord)).setStandardConnections(xCoord, yCoord, zCoord); + UniNodespace.createNode(worldObj, this.node); + } + } + + if(this.cache == null || this.cache.hasExpired) { + this.cache = new StackCache(xCoord, yCoord, zCoord); + } + + if(this.node != null && this.node.hasValidNet()) { + this.node.net.addStackCache(cache); + } + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote && this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); + } + + if(this.cache != null) this.cache.dissolveCache(); + } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + if(!worldObj.isRemote && this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); + } + + if(this.cache != null) this.cache.dissolveCache(); + } +} diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java new file mode 100644 index 000000000..0bd594d5f --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -0,0 +1,57 @@ +package com.hbm.tileentity.network.pneumatic; + + +import api.hbm.redstoneoverradio.IRORInteractive; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.world.World; + +public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive { + + /** If requests should be pulled repeatedly every tick */ + public boolean continuousRequest = false; + /** If ROR configuration has taken place, ignore manually defined filters entirely */ + public boolean rorConfiguredMode = false; + /** What strategy to use for handling request filters */ + public int requestMode = 0; + + /** Each slot individually tries to pull as much as it can of the configured item */ + public static final int MODE_AS_MUCH_AS_POSSIBLE = 0; + /** Each slot individually tries to pull the exact quantity configured */ + public static final int MODE_FULL_STACK = 1; + /** All request slots try to pull the desired quantities simultaneously */ + public static final int MODE_FULL_REQUEST = 2; + + public TileEntityPneumoStorageExporter() { + super(18); + } + + @Override + public String getName() { + return "container.pneumoStorageExporter"; + } + + @Override + public void updateEntity() { + super.updateEntity(); + } + + @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 null; } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_FUNCTION + "setfilter" + NAME_SEPARATOR + "slot" + PARAM_SEPARATOR + "itemid" + PARAM_SEPARATOR + "itemmeta" + PARAM_SEPARATOR + "amount", + PREFIX_FUNCTION + "setcontinuous" + NAME_SEPARATOR + "slot" + PARAM_SEPARATOR + "itemid" + PARAM_SEPARATOR + "itemmeta" + PARAM_SEPARATOR + "amount", + PREFIX_FUNCTION + "request", + PREFIX_FUNCTION + "requestslot" + NAME_SEPARATOR + "slot", + PREFIX_FUNCTION + "checkavailability" + NAME_SEPARATOR + "itemid" + PARAM_SEPARATOR + "itemmeta" + PARAM_SEPARATOR + "returnchannel", + }; + } + + @Override + public String runRORFunction(String name, String[] params) { + return null; + } +} diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageImporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageImporter.java index 131486f71..60e5544d8 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageImporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageImporter.java @@ -2,24 +2,13 @@ package com.hbm.tileentity.network.pneumatic; import com.hbm.inventory.container.ContainerPneumoStorageImporter; import com.hbm.inventory.gui.GUIPneumoStorageImporter; -import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.TileEntityMachineBase; -import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube.PneumaticNode; -import com.hbm.uninos.UniNodespace; -import com.hbm.uninos.networkproviders.PneumaticNetworkProvider; -import com.hbm.util.fauxpointtwelve.BlockPos; -import api.hbm.ntl.IPneumaticConnector; -import api.hbm.ntl.StackCache; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class TileEntityPneumoStorageImporter extends TileEntityMachineBase implements IPneumaticConnector, IGUIProvider { - - protected PneumaticNode node; - public StackCache cache; +public class TileEntityPneumoStorageImporter extends TileEntityPneumaticMachineBase { public int[] delay = new int[9]; public int[] SLOT_ACCESS = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8}; @@ -45,28 +34,10 @@ public class TileEntityPneumoStorageImporter extends TileEntityMachineBase imple @Override public void updateEntity() { + super.updateEntity(); if(!worldObj.isRemote) { - if(this.node == null || this.node.expired) { - if(this.cache != null) this.cache.dissolveCache(); - - this.node = (PneumaticNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); - - if(this.node == null || this.node.expired) { - this.node = (PneumaticNode) new PneumaticNode(new BlockPos(xCoord, yCoord, zCoord)).setStandardConnections(xCoord, yCoord, zCoord); - UniNodespace.createNode(worldObj, this.node); - } - } - - if(this.cache == null || this.cache.hasExpired) { - this.cache = new StackCache(xCoord, yCoord, zCoord); - } - - if(this.node != null && this.node.hasValidNet()) { - this.node.net.addStackCache(cache); - } - if(this.cache != null && !this.cache.hasExpired) for(int i = 0; i < 9; i++) { if(this.delay[i] > 0) { this.delay[i]--; @@ -85,28 +56,6 @@ public class TileEntityPneumoStorageImporter extends TileEntityMachineBase imple } } - @Override - public void invalidate() { - super.invalidate(); - - if(!worldObj.isRemote && this.node != null) { - UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); - } - - if(this.cache != null) this.cache.dissolveCache(); - } - - @Override - public void onChunkUnload() { - super.onChunkUnload(); - - if(!worldObj.isRemote && this.node != null) { - UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); - } - - if(this.cache != null) this.cache.dissolveCache(); - } - @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageImporter(player.inventory, this); } @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageImporter(player.inventory, this); } } diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_exporter.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_pneumatic_exporter.png new file mode 100644 index 0000000000000000000000000000000000000000..cf6e1177c0b65a22254e7c588b21439848ce1e2a GIT binary patch literal 2154 zcmb_cc~sL$67GbML?lAg5k(@dxZoh_Du)mxL>3Gv1duC$4jAwN29PU3NhF9YFo-bE z5k$pg#m6n8ETCKg*D)f|h~WxXP*xy>a0mt>IrcYuyxsTa_-D7?>#llTT~%NASKZlO zWD-WlPzL~jadUM(4gd@?VE~PU)QR}=Gmt_gIJx35Q&p}PGVUMIWV|Ognd;Y~@5k@F^J;fB z=UK&#y&gez0XM&r*8AHxFTRO9b60@68XckJyY{UX(?>-YX!=z})lVF%BWqv15ZraB zQd!z<%L}tL>f5tne8E;Om;2+@L-J0YA@ZoYX=osg==_{Vr<*>aqObDCgH{g_2-n`9 zr`#v^GkoLh)7iPU8g&)g@^xVW?ATt5gbCzD$Y(?yhkcw3l?3 zzY`@}8IDjUo1*EUIwlg%@~y1a8cy6=8(R&_CwB(S6wd`|vHU9zvBI;r|&{mJys*1J?`MnEHa@e?LIJi;!Zyyi?lrVV~()!LFFQkow{da zc4nqp-d0I?^0*UUSXg+hF-5r&Cu8RF#*eO=S3ImzNX;LkSEkghK^paYgOC^h2=z&# z`7EO%ZH+bs=9>qWO>-<3l*(dzdSvhBJf6$thrY!%aR#j1U08DemUWr+%?fvW_>J<# z>E5a!Ya0(xyWb;&b&V+905*Dm&g53;hdRJngM;xC&9j@tN?zqKlD~936h_?dhx8L_ zMW_{;EcysjzPv0>u}BuVhkKJaZ3{<s zFFgagEQT8PselOrX!F;p8<2V4!@jMVlWpET3?N1vm|gj7EYq*vBh}wXu6S zO&kDcQLhk}pCCB>rHw#Jm=XrmYmIfQQWoZO_C*=H4o&;+H_VN6bQ*kt_e=b!P$VHQ zl@__nKyuud$25bx5oTr%>Br(dT*!-x2BUf^b*y2gzXeT8ig2*J!Y#owV zCX>l9M|&heX6)k#P=EU3rM6fEaPehcYV&mXyxJ}W1Dn&iOg`8}?G8-EPhr%w16mw! zWNLE}%qzIG@!j-ROW+E%^58IXX0Ii%nPxN&d04F;fk@e;HADh$%OzXHW3gs1V#zS_ z+k-i*o(Y>!dJ&9B#lw5wHjoK;_#<;%+NPe0d(p*=LV)8aVdJ66A&esl_Rf6tzsdw-<3wLLR=S z#6Y`4IjMcv9%72J5mEI|&Z+PH$|%?WDsYVc8!`0N zQffkPk@o-AgZB{;2Qj4v17ZSib?}-vq4Z z2(Z%>Y~K$9*=xXmxdw9QFe@W;aqnnHU!T7b4p&j~W-w_RfkA0r*B|_4f)gAZTu-ZQ zZN-sDr0McH8qTxAhWGnlPWGF1RG^`uftr%iEGPGPXVMIvpNAhPa(uo8A%n2Rl2vh1VJ3rIxIYbd+AqXJY7An?To14U!!5 laaU*(((#{d^uNwl;~Je?&D&>Mkyn07<>o?mu5k*z{CBu@uQmVx literal 0 HcmV?d00001 From 24ed4224a8dac19cc4ce1de9d38caa557e82daef Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 26 Jun 2026 12:54:35 +0200 Subject: [PATCH 041/107] more MSES crap --- src/main/java/com/hbm/module/ParseMSES1.java | 13 ++++++++++++- src/main/java/com/hbm/module/ParseMSES1Ext1.java | 12 ++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/module/ParseMSES1.java b/src/main/java/com/hbm/module/ParseMSES1.java index 1814d3b7c..909dc5dd6 100644 --- a/src/main/java/com/hbm/module/ParseMSES1.java +++ b/src/main/java/com/hbm/module/ParseMSES1.java @@ -111,6 +111,17 @@ public class ParseMSES1 implements IParse { return EnumStatementReturn.OK; } + // runs the calculation from the buffer, allows string substitution, saves result to buffer + if(lower.equals("eval")) { + if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; + String statement = substitute(ctx, ctx.readBuffer(), true); + try { + double result = Calculator.evaluateExpression(statement); + ctx.writeBuffer("" + result); + } catch(Throwable ex) { return EnumStatementReturn.PARAMETER_ERROR; } + return EnumStatementReturn.OK; + } + // runs the calculation, allows string substitution, rounds, saves result to buffer, if(lower.startsWith("evalr ")) { if(line.length() <= 6) return EnumStatementReturn.PARAMETER_ERROR; @@ -122,7 +133,7 @@ public class ParseMSES1 implements IParse { return EnumStatementReturn.OK; } - // runs the calculation from the buffer, allows string substitution, saves result to buffer + // runs the calculation from the buffer, allows string substitution, saves rounded result to buffer if(lower.equals("evalr")) { if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; String statement = substitute(ctx, ctx.readBuffer(), true); diff --git a/src/main/java/com/hbm/module/ParseMSES1Ext1.java b/src/main/java/com/hbm/module/ParseMSES1Ext1.java index d59ce6ee3..db4a3bc48 100644 --- a/src/main/java/com/hbm/module/ParseMSES1Ext1.java +++ b/src/main/java/com/hbm/module/ParseMSES1Ext1.java @@ -3,6 +3,9 @@ package com.hbm.module; import java.util.Locale; import java.util.regex.Pattern; +import com.hbm.tileentity.network.RTTYSystem; +import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; + /** * MSES1-FEIS: Machine Script, Equestrian Standard - First Extended Instruction Set (v1.1) * @@ -10,6 +13,7 @@ import java.util.regex.Pattern; * * Support for splitter chars, splitting and split count * * Support for the stack, a secondary buffer that can push, pop and peek * * Support for getting string length and substring using first and last + * * Support for listening only to recent RoR signals using poll * * @author hbm */ @@ -108,6 +112,14 @@ public class ParseMSES1Ext1 extends ParseMSES1 { } catch(Exception x) { return EnumStatementReturn.PARAMETER_ERROR; } } + // listens to an RoR signal using the supplied channel name and saves it to the buffer + if(lower.startsWith("poll ")) { + if(line.length() <= 5) return EnumStatementReturn.PARAMETER_ERROR; + RTTYChannel chan = RTTYSystem.listen(ctx.world, substitute(ctx, line.substring(5), false)); + if(chan != null && chan.timeStamp >= ctx.world.getTotalWorldTime() - 1) ctx.writeBuffer(chan.signal + ""); + return EnumStatementReturn.OK; + } + return super.eval(ctx, line); } } From 217b1ae8a4d5b3bbb38b43b9a795b381fd034c3a Mon Sep 17 00:00:00 2001 From: absolute idiot <174307533+churginator@users.noreply.github.com> Date: Sat, 27 Jun 2026 00:42:44 -0400 Subject: [PATCH 042/107] oh great heavens --- .../machine/TileEntityPWRController.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 2e6f1bc82..4ecf97689 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -216,6 +216,12 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG if(this.rodTarget > this.rodLevel) this.rodLevel++; if(this.rodTarget < this.rodLevel) this.rodLevel--; + double multiplier = 1D; + + if(tanks[0].getTankType().hasTrait(FT_PWRModerator.class)) { + multiplier = tanks[0].getTankType().getTrait(FT_PWRModerator.class).getMultiplier(); + } + int newFlux = this.sourceCount * 20; if(typeLoaded != -1 && amountLoaded > 0) { @@ -227,6 +233,10 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG double totalOutput = outputPerRod * amountLoaded * usedRods; double totalHeatOutput = totalOutput * fuel.heatEmission; + if(tanks[0].getFill() > 0) { + totalHeatOutput *= multiplier; + } + this.coreHeat += totalHeatOutput; newFlux += totalOutput; @@ -266,8 +276,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.flux = newFlux; - if(tanks[0].getTankType().hasTrait(FT_PWRModerator.class) && tanks[0].getFill() > 0) { - this.flux *= tanks[0].getTankType().getTrait(FT_PWRModerator.class).getMultiplier(); + if(tanks[0].getFill() > 0) { + this.flux *= multiplier; } if(this.coreHeat > this.coreHeatCapacity) { From 47d029fe870fcaac502963d61c2e1551470a41e8 Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Sat, 27 Jun 2026 17:37:53 +0300 Subject: [PATCH 043/107] 1 --- src/main/resources/assets/hbm/lang/ru_RU.lang | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 9b8e2ed8e..0ea7a83b9 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2617,9 +2617,9 @@ item.fluid_identifier_multi.info2=Второй тип: item.fluid_pack_empty.name=Большой жидкостный контейнер item.fluid_pack_full.name=%s - упаковано item.fluid_tank_empty.name=Пустой универсальный резервуар для жидкости -item.fluid_tank_full.name=Универсальный резервуар для жидкости: %s +item.fluid_tank_full.name=Универсальный резервуар для жидкости: %s item.fluid_tank_lead_empty.name=Пустой резервуар для опасных материалов -item.fluid_tank_lead_full.name=Резервуар с опасными материалами: %s +item.fluid_tank_lead_full.name=Резервуар с опасными материалами: %s item.fluorite.name=Флюорит item.flywheel_beryllium.name=Бериллиевый маховик item.fmn.name=Таблетка флунитразепама @@ -2714,7 +2714,7 @@ item.grenade_shell.stick.name=Корпус рукояточной гранаты item.grenade_shell.tech.name=Корпус высокотехнологичной гранаты item.grenade_universal.name=Граната item.glyphid_gland.name= Железа глифида -item.glyphid_gland_empty.name= Железа глифида +item.glyphid_gland_empty.name= Пустаяч железа глифида item.gun_aberrator.name=Пистолет "Aberrator" item.gun_aberrator_eott.name=Пистолеты "Eyes Of The Tempest" item.gun_am180.name=Пистолет-пулемёт .22 LR "American-180 " From c645a7cb610d85a869405b4af380d1170bcb967b Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Sat, 27 Jun 2026 17:59:04 +0300 Subject: [PATCH 044/107] =?UTF-8?q?=D0=9E=D0=9F=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/ru_RU.lang | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 0ea7a83b9..b273adfa1 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2053,8 +2053,8 @@ item.boy_target.name=Субкритическая цель U235 item.briquette.coal.name=Брикет угля item.briquette.lignite.name=Брикет бурого угля item.briquette.wood.name=Брикет древесных опилок -item.broken_item.name=Сломанный предмет -item.broken_item.prefix=Сломанный %s +item.broken_item.name=Бракованный предмет +item.broken_item.prefix=%s (Бракованный) item.bucket_acid.name=Ведро кислоты item.bucket_mud.name=Ведро токсичных отходов item.bucket_schrabidic_acid.name=Ведро шрабидиевой кислоты @@ -3652,7 +3652,7 @@ item.pill_herbal.name=Травяная паста item.pill_herbal.desc=Эффективное средство против болезни лёгких $и небольшого радиационного отравления.$Имеет побочные эффекты. item.pill_red.name=Красная таблетка item.pin.name=Отмычка -item.pin.desc="*Немодифицированный* вероятность успешного взлома обычного замка составляет ~10%. +item.pin.desc="*Немодифицированный* вероятность успешного взлома обычного замка составляет ~10%%. item.pipentm.name=Труба (%s) item.pipes_steel.name=Стальные трубы item.pipes_steel.desc=Раскрафт был исключен из-за уклонения от уплаты налогов @@ -3898,7 +3898,7 @@ item.radaway.name=Антирадин item.radaway_flush.name=Супер-антирадин item.radaway_strong.name=Усиленный антирадин item.radx.name=Рад-X -item.radx.desc=Increases radiation resistance by 0.2 (37%) for 3 minutes +item.radx.desc=Даёт повышенное сопративление радиации на 0,2 (37%%) в течение 3-х минут. item.rag.name=Тряпка item.rag.desc=Бросьте в воду, чтобы намочить.$Нажмите ПКМ, чтобы помочиться на тряпку. item.rag_damp.name=Влажная тряпка @@ -4515,7 +4515,7 @@ item.warhead_thermo_exo.name=Экзотермическая боеголовка item.warhead_volcano.name=Тектоническая боеголовка item.waste_mox.name=Обеднённое топливо (МОКС) item.waste_natural_uranium.name=Обеднённое топливо (Природный уран) -tem.waste_plate_mox.name=Обеднённая топливная пластина (МОКС) +item.waste_plate_mox.name=Обеднённая топливная пластина (МОКС) item.waste_plate_pu238be.name=Обеднённая топливная пластина (Плутоний-238-бериллий) item.waste_plate_pu239.name=Обеднённая топливная пластина (Высокообогащённый плутоний-239) item.waste_plate_ra226be.name=Обеднённая топливная пластина (Радий-226-бериллий) From a93144f4c0f087362bab9f639f58450eae62d058 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 29 Jun 2026 13:03:34 +0200 Subject: [PATCH 045/107] propane and propane accessories --- .../redstoneoverradio/IRORInteractive.java | 2 +- .../java/com/hbm/inventory/SlotPattern.java | 4 +- .../ContainerPneumoStorageExporter.java | 44 +++++++++++++ .../gui/GUIPneumoStorageExporter.java | 60 ++++++++++++++++++ .../gui/GUIPneumoStorageImporter.java | 2 +- .../TileEntityPneumoStorageExporter.java | 59 ++++++++++++++++- .../hbm/textures/blocks/hopper_turbo_side.png | Bin 0 -> 359 bytes .../blocks/pneumatic_storage_exporter.png | Bin 0 -> 502 bytes .../blocks/pneumatic_storage_importer.png | Bin 417 -> 500 bytes 9 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIPneumoStorageExporter.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/hopper_turbo_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pneumatic_storage_exporter.png diff --git a/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java b/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java index 86e5bb59f..518b23c87 100644 --- a/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java +++ b/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java @@ -9,7 +9,7 @@ public interface IRORInteractive extends IRORInfo { public static String EX_NAME = "Exception: Multiple Name Separators"; public static String EX_FORMAT = "Exception: Parameter in Invalid Format"; - /** Runs a function on the ROR component, usually causing the component to change or do something. Returns are optional. */ + /** Runs a function on the ROR component, usually causing the component to change or do something. Returns are unused for now. */ public String runRORFunction(String name, String[] params); /** Extracts the command name from a full command string */ diff --git a/src/main/java/com/hbm/inventory/SlotPattern.java b/src/main/java/com/hbm/inventory/SlotPattern.java index a6957c7ac..a1bdc6c67 100644 --- a/src/main/java/com/hbm/inventory/SlotPattern.java +++ b/src/main/java/com/hbm/inventory/SlotPattern.java @@ -29,7 +29,7 @@ public class SlotPattern extends Slot { @Override public int getSlotStackLimit() { - return 1; + return allowStackSize ? 64 : 1; } @Override @@ -37,7 +37,7 @@ public class SlotPattern extends Slot { if (stack != null) { stack = stack.copy(); - if (!allowStackSize) + if(!allowStackSize) stack.stackSize = 1; } super.putStack(stack); diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java new file mode 100644 index 000000000..95776aa6d --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java @@ -0,0 +1,44 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotPattern; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageExporter; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerPneumoStorageExporter extends ContainerBase { + + public ContainerPneumoStorageExporter(InventoryPlayer invPlayer, TileEntityPneumoStorageExporter exporter) { + super(invPlayer, exporter); + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new SlotPattern(exporter, i, 17 + (i % 3) * 18, 17 + (i / 3) * 18, true)); + } + + addSlots(exporter, 9, 80, 17, 3, 3); + playerInv(invPlayer, 103); + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + //L/R: 0 + //M3: 3 + //SHIFT: 1 + //DRAG: 5 + + if(index < 0 || index >= 9) { + return super.slotClick(index, button, mode, player); + } + + Slot slot = this.getSlot(index); + ItemStack ret = null; + ItemStack held = player.inventory.getItemStack(); + + if(slot.getHasStack()) ret = slot.getStack().copy(); + slot.putStack(held); + return ret; + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageExporter.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageExporter.java new file mode 100644 index 000000000..2f7001c41 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageExporter.java @@ -0,0 +1,60 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerPneumoStorageExporter; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageExporter; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUIPneumoStorageExporter extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_pneumatic_exporter.png"); + private TileEntityPneumoStorageExporter importer; + + public GUIPneumoStorageExporter(InventoryPlayer invPlayer, TileEntityPneumoStorageExporter importer) { + super(new ContainerPneumoStorageExporter(invPlayer, importer)); + this.importer = importer; + + this.xSize = 176; + this.ySize = 185; + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + clickSendFlag(importer, x, y, 142, 16, 18, 18, "continuous"); + clickSendFlag(importer, x, y, 142, 34, 18, 18, "request"); + clickSendFlag(importer, x, y, 142, 52, 18, 18, "ror"); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.importer.hasCustomInventoryName() ? this.importer.getInventoryName() : I18n.format(this.importer.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + if(!this.importer.continuousRequest) drawTexturedModalRect(guiLeft + 142, guiTop + 16, xSize, 0, 18, 18); + if(!this.importer.rorConfiguredMode) drawTexturedModalRect(guiLeft + 142, guiTop + 52, xSize, 18, 18, 18); + if(this.importer.requestMode == importer.MODE_FULL_STACK) drawTexturedModalRect(guiLeft + 142, guiTop + 34, xSize + 18, 0, 18, 18); + if(this.importer.requestMode == importer.MODE_FULL_REQUEST) drawTexturedModalRect(guiLeft + 142, guiTop + 34, xSize + 18, 18, 18, 18); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageImporter.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageImporter.java index b55b30e4f..79f7fbcc1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageImporter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageImporter.java @@ -22,7 +22,7 @@ public class GUIPneumoStorageImporter extends GuiContainer { this.importer = importer; this.xSize = 176; - this.ySize = 186; + this.ySize = 185; } @Override diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index 0bd594d5f..2c01aff94 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -1,12 +1,18 @@ package com.hbm.tileentity.network.pneumatic; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.container.ContainerPneumoStorageExporter; +import com.hbm.inventory.gui.GUIPneumoStorageExporter; + import api.hbm.redstoneoverradio.IRORInteractive; +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 TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive { +public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver { /** If requests should be pulled repeatedly every tick */ public boolean continuousRequest = false; @@ -14,6 +20,8 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB public boolean rorConfiguredMode = false; /** What strategy to use for handling request filters */ public int requestMode = 0; + /** Item ID and meta pairs for RoR controlled filters */ + public short[][] rorFilters = new short[9][2]; /** Each slot individually tries to pull as much as it can of the configured item */ public static final int MODE_AS_MUCH_AS_POSSIBLE = 0; @@ -34,10 +42,55 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB @Override public void updateEntity() { super.updateEntity(); + + if(!worldObj.isRemote) { + this.networkPackNT(15); + } } - @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 null; } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(continuousRequest); + buf.writeBoolean(rorConfiguredMode); + buf.writeByte((byte) requestMode); + for(int i = 0; i < 9; i++) { + buf.writeShort(rorFilters[i][0]); + buf.writeShort(rorFilters[i][1]); + } + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.continuousRequest = buf.readBoolean(); + this.rorConfiguredMode = buf.readBoolean(); + this.requestMode = buf.readByte(); + for(int i = 0; i < 9; i++) { + rorFilters[i][0] = buf.readShort(); + rorFilters[i][1] = buf.readShort(); + } + } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageExporter(player.inventory, this); } + @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageExporter(player.inventory, this); } + + @Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("continuous")) { + this.continuousRequest = !this.continuousRequest; + } + if(data.hasKey("request")) { + this.requestMode++; + if(this.requestMode >= 3) this.requestMode = 0; + } + if(data.hasKey("ror")) { + this.rorConfiguredMode = !this.rorConfiguredMode; + } + this.markChanged(); + } @Override public String[] getFunctionInfo() { diff --git a/src/main/resources/assets/hbm/textures/blocks/hopper_turbo_side.png b/src/main/resources/assets/hbm/textures/blocks/hopper_turbo_side.png new file mode 100644 index 0000000000000000000000000000000000000000..0704d875bf9b1af94a11e5548646d39624fea56f GIT binary patch literal 359 zcmV-t0hs=YP)!xeV}9xfB*;w zha|I%vzseAfe*kkofq#aU2qT_u}T*JB(n_Hb5JtJHkD5=k9V$aG_L1h@6~q$Y%|N# z{oBqWqfs))YHOlZ4a8wz4@N^efzL9X7bbqGH2@dMXGtTXURUo^Jr4VNvkT#R4kyv1 zAiRuk|4mTk3V`3~Ly444AL&f|(w~w!uIJRaLdhJSKT5>GXjrRk4yVeknYe8$#`W>{ zPfgQ^IP7crdZ*v7&-JEpRkXjvwh6?xfRcH!QZs)O{s3EVdHZP9fI9#H002ovPDHLk FV1i+7nAQLQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_storage_exporter.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_storage_exporter.png new file mode 100644 index 0000000000000000000000000000000000000000..90013ac567ac2a6d3c7ac1e50dd4daf28a8757fd GIT binary patch literal 502 zcmVCM&Hq zT5CrAg6)?t_@6D4ITwRnTu$T;T5HP1O%OajodR$=-t)dPNzt8k&X$NAyPvnM7CY5H zZu4u7&(3|)`Nu!J`_bVxza}#kzqfYQ6O8%=<>H3Sb~)=jg&ahL@4r5=Oy<7pVcr8k z2EzVgMrJF_>W;{9eohKGXsuC7u}oshBn>DztZR!p9*CL&B7#y1tu+Vw3g|t+Hm&Ur zC({|@56>9dn5MAq6A^|sW@uwCt}oym%VZvm?UI}3@RR8*oZzw6hV`B|MH3N3BRXIwV zn2R@;1<}P|x4zp?H2aGgU0VPItEzQ+4Ys~qe?Ncql-kW*XQrY|QpzOtB00gFKQmQu sKZ4h2R(Ck07*qoM6N<$f~UpZhX4Qo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_storage_importer.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_storage_importer.png index d9c89f32363be438fbb5ee1e5ba6ac8b1a31ca3a..f6ce9b8c21405f02f881420d1e7a52c907ec2f83 100644 GIT binary patch delta 458 zcmV;*0X6=i1M~xsG=Hl}L_t(Ijir;nYTHm0#(z#kz#)ZfA)Zc$+GHt)4uR0&K0rDI z$=U9`;$OCirrdOov7EpjRFz`>;DE0`ef5a9mw%@K6j6+BJ#jWgoXf3eJF%ue32_w5G&qp;61o3YGhBx%X_&7G$T2A!N@{y zNm?RZe^j=mb)UtjcR9gL_qg8e7s}auOuNcmfWzx?eM1QQ3_3Yf^>Y1u_x|sXDXB`g zVUGOgJPL8uG&x>?boJ;+$z>%07*qoM6N<$f(>8f AxBvhE delta 374 zcmV-+0g3+f1EB+uG=Er0L_t(Ijg^znYQjJe#(ynANkPc1n9~Mqe2skod+1wuv$+X< zlHPnHJ$PtP$Xp~B140%h0kMa4(T>NFdaQfRFa5oWRn zysKIlwSYSw{ls1~lRYBRYSdcuR<7?0K=njbY_E=N-ER#P;PFcGpQsabmAlTiCrJx} zVgFhH8c%g&U~eMAJo8YYBJxdb*b=af-GQCrE%VH)Ycy((9bA$YsIcv9UAi^fpY9CK zGMrSqJrJh(3b!;@vj~QLBHut+E!WrU`@O$V)Em}CGfk7z5=bxSo8%_aooNYt1JywS U#S;p04FCWD07*qoM6N<$f+otRv;Y7A From 97b20770384a6082f20af63dde2eeb094314062e Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 30 Jun 2026 15:18:41 +0200 Subject: [PATCH 046/107] =?UTF-8?q?=E3=80=8C=20PETAL=20DANCE=20=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog | 12 ++++ src/main/java/api/hbm/ntl/StackCache.java | 6 +- .../java/com/hbm/inventory/SlotPattern.java | 8 +-- .../container/ContainerAutocrafter.java | 2 +- .../ContainerPneumoStorageExporter.java | 2 +- .../com/hbm/inventory/gui/GUIFusionTorus.java | 6 +- .../gui/GUIMachineAssemblyFactory.java | 10 +-- .../gui/GUIMachineAssemblyMachine.java | 10 +-- .../gui/GUIMachineChemicalFactory.java | 10 +-- .../gui/GUIMachineChemicalPlant.java | 8 +-- .../hbm/inventory/gui/GUIMachinePUREX.java | 8 +-- .../inventory/gui/GUIMachinePlasmaForge.java | 10 +-- .../hbm/inventory/gui/GUIMachinePrecAss.java | 8 +-- .../hbm/inventory/recipes/CrucibleRecipe.java | 2 +- .../inventory/recipes/PlasmaForgeRecipe.java | 2 +- .../recipes/loader/GenericRecipe.java | 9 ++- .../java/com/hbm/module/ParseMSES1Ext1.java | 6 ++ .../hbm/module/machine/ModuleMachineBase.java | 17 ++++- .../tileentity/RenderAssemblyFactory.java | 3 +- .../tileentity/RenderAssemblyMachine.java | 3 +- .../tileentity/RenderChemicalPlant.java | 3 +- .../tileentity/RenderFusionPlasmaForge.java | 3 +- .../hbm/render/tileentity/RenderPrecAss.java | 3 +- .../TileEntityMachineAssemblyFactory.java | 5 +- .../TileEntityMachineAssemblyMachine.java | 39 ++++++++-- .../TileEntityMachineChemicalFactory.java | 5 +- .../TileEntityMachineChemicalPlant.java | 5 +- .../machine/TileEntityMachinePUREX.java | 5 +- .../machine/TileEntityMachinePrecAss.java | 5 +- .../fusion/TileEntityFusionPlasmaForge.java | 5 +- .../machine/fusion/TileEntityFusionTorus.java | 2 +- .../TileEntityPneumoStorageExporter.java | 68 +++++++++++++++++- .../textures/gui/processing/gui_chemplant.png | Bin 3594 -> 3643 bytes 33 files changed, 208 insertions(+), 82 deletions(-) diff --git a/changelog b/changelog index b5b39f0d4..0e1a5cf5a 100644 --- a/changelog +++ b/changelog @@ -29,6 +29,18 @@ * Increased the blast furnace's fuel buffer by 50%, allowing coke blocks to be used * If an RoR controller tries to parse an integer, but the supplied string represents a decimal, instead of canceling the operation, the system will now interpret decimals and round them to be integers * This means that the AUTOCAL can now send RoR commands using calculated values directly without the use of `round` or `evalr` +* Assembly machines now support Redstone-over-Radio + * Active state (0 or 1), progress (0-100) and current recipe (internal name) can now be read + * The recipe can be set using a controller + * Do note that setting a recipe that needs a blueprint without that blueprint will not work + * RoR set recipes cause the assembler to go into low power mode, making it run at only 25% speed (visible through the blue progress bar) + * The speed penalty is removed as soon as a recipe is assigned manually again +* The AUTOCAL's script interpreter now runs MS-ES v1.1 (First Extended Instruction Set) + * Allows the use of a global stack, similar to the buffer which can hold 256 values + * Allows splitting of strings and counting of string fragments + * Adds substring operations + * Polling for receiving only fresh RoR signals + * A command for writing the world time to the buffer, allowing for more precise timers ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index 004ead61a..7d941d73c 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -197,7 +197,11 @@ public class StackCache { public static long getStackIdentity(Item item, int meta, NBTTagCompound nbt) { if(item == null) return getNullIdentity(); - long identity = Item.getIdFromItem(item) * 27644437; + return getStackIdentity(Item.getIdFromItem(item), meta, nbt); + } + + public static long getStackIdentity(int item, int meta, NBTTagCompound nbt) { + long identity = item * 27644437; identity += meta; identity *= 27644437; if(nbt != null) identity += nbt.hashCode(); diff --git a/src/main/java/com/hbm/inventory/SlotPattern.java b/src/main/java/com/hbm/inventory/SlotPattern.java index a1bdc6c67..317424214 100644 --- a/src/main/java/com/hbm/inventory/SlotPattern.java +++ b/src/main/java/com/hbm/inventory/SlotPattern.java @@ -16,10 +16,10 @@ public class SlotPattern extends Slot { public SlotPattern(IInventory inv, int index, int x, int y) { super(inv, index, x, y); } - - public SlotPattern(IInventory inv, int index, int x, int y, boolean allowStackSize) { - super(inv, index, x, y); - this.allowStackSize = allowStackSize; + + public SlotPattern allowStackSize() { + this.allowStackSize = true; + return this; } @Override diff --git a/src/main/java/com/hbm/inventory/container/ContainerAutocrafter.java b/src/main/java/com/hbm/inventory/container/ContainerAutocrafter.java index 2c8b0438b..8dc57f397 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerAutocrafter.java +++ b/src/main/java/com/hbm/inventory/container/ContainerAutocrafter.java @@ -24,7 +24,7 @@ public class ContainerAutocrafter extends ContainerBase { this.addSlotToContainer(new SlotPattern(tedf, j + i * 3, 44 + j * 18, 22 + i * 18)); } } - this.addSlotToContainer(new SlotPattern(tedf, 9, 116, 40, true)); + this.addSlotToContainer(new SlotPattern(tedf, 9, 116, 40).allowStackSize()); /* RECIPE */ addSlots(tedf,10, 44, 86, 3, 3); diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java index 95776aa6d..4928ba349 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java @@ -14,7 +14,7 @@ public class ContainerPneumoStorageExporter extends ContainerBase { super(invPlayer, exporter); for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new SlotPattern(exporter, i, 17 + (i % 3) * 18, 17 + (i / 3) * 18, true)); + this.addSlotToContainer(new SlotPattern(exporter, i, 17 + (i % 3) * 18, 17 + (i / 3) * 18).allowStackSize()); } addSlots(exporter, 9, 80, 17, 3, 3); diff --git a/src/main/java/com/hbm/inventory/gui/GUIFusionTorus.java b/src/main/java/com/hbm/inventory/gui/GUIFusionTorus.java index 98e11de61..9e7160305 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFusionTorus.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFusionTorus.java @@ -41,7 +41,7 @@ public class GUIFusionTorus extends GuiInfoContainer { torus.coolantTanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 188, guiTop + 46, 16, 52); torus.coolantTanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 206, guiTop + 46, 16, 52); - FusionRecipe recipe = (FusionRecipe) FusionRecipes.INSTANCE.recipeNameMap.get(this.torus.fusionModule.recipe); + FusionRecipe recipe = (FusionRecipe) this.torus.fusionModule.getRecipe(); if(recipe != null) { drawCustomInfoStat(mouseX, mouseY, guiLeft + 43, guiTop + 115, 18, 18, mouseX, mouseY, EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + BobMathUtil.getShortNumber(torus.klystronEnergy) + "KyU / " + BobMathUtil.getShortNumber(recipe.ignitionTemp) + "KyU"); @@ -70,7 +70,7 @@ public class GUIFusionTorus extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 43, 80, 18, 18)) GUIScreenRecipeSelector.openSelector(FusionRecipes.INSTANCE, torus, torus.fusionModule.recipe, 0, ItemBlueprints.grabPool(torus.slots[1]), this); + if(this.checkClick(x, y, 43, 80, 18, 18)) GUIScreenRecipeSelector.openSelector(FusionRecipes.INSTANCE, torus, torus.fusionModule.getRecipeName(), 0, ItemBlueprints.grabPool(torus.slots[1]), this); } @Override @@ -103,7 +103,7 @@ public class GUIFusionTorus extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 98, guiTop + 91, 0, 250, j, 6); } - FusionRecipe recipe = FusionRecipes.INSTANCE.recipeNameMap.get(torus.fusionModule.recipe); + FusionRecipe recipe = (FusionRecipe) torus.fusionModule.getRecipe(); // power LED if(recipe != null && torus.power >= recipe.power) drawTexturedModalRect(guiLeft + 160, guiTop + 115, 246, 14, 8, 8); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyFactory.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyFactory.java index 11f7db844..d08490d19 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyFactory.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyFactory.java @@ -47,8 +47,8 @@ public class GUIMachineAssemblyFactory extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 234, guiTop + 18, 16, 92, assembler.power, assembler.maxPower); for(int i = 0; i < 4; i++) if(guiLeft + 6 + (i % 2) * 109 <= mouseX && guiLeft + 6 + (i % 2) * 109 + 18 > mouseX && guiTop + 53 + (i / 2) * 56 < mouseY && guiTop + 53 + (i / 2) * 56 + 18 >= mouseY) { - if(this.assembler.assemblerModule[i].recipe != null && AssemblyMachineRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule[i].recipe)) { - GenericRecipe recipe = (GenericRecipe) AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.assembler.assemblerModule[i].recipe); + if(this.assembler.assemblerModule[i].getRecipeName() != null && AssemblyMachineRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule[i].getRecipeName())) { + GenericRecipe recipe = this.assembler.assemblerModule[i].getRecipe(); GUIElements.drawHoveringTextRecipe(recipe.print(), mouseX, mouseY, this.fontRendererObj, itemRender, this.width, this.height); } else { this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); @@ -60,7 +60,7 @@ public class GUIMachineAssemblyFactory extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 6 + (i % 2) * 109, 53 + (i / 2) * 56, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule[i].recipe, i, ItemBlueprints.grabPool(assembler.slots[4 + i * 14]), this); + for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 6 + (i % 2) * 109, 53 + (i / 2) * 56, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule[i].getRecipeName(), i, ItemBlueprints.grabPool(assembler.slots[4 + i * 14]), this); } @Override @@ -87,7 +87,7 @@ public class GUIMachineAssemblyFactory extends GuiInfoContainer { } for(int g = 0; g < 4; g++) { - GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule[g].recipe); + GenericRecipe recipe = assembler.assemblerModule[g].getRecipe(); /// LEFT LED if(assembler.didProcess[g]) { @@ -105,7 +105,7 @@ public class GUIMachineAssemblyFactory extends GuiInfoContainer { } for(int g = 0; g < 4; g++) { - GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule[g].recipe); + GenericRecipe recipe = assembler.assemblerModule[g].getRecipe(); this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 7 + (g % 2) * 109, 54 + (g / 2) * 56); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java index 0e5f8184c..bcb51491b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java @@ -42,8 +42,8 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, assembler.power, assembler.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { - if(this.assembler.assemblerModule.recipe != null && AssemblyMachineRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule.recipe)) { - GenericRecipe recipe = (GenericRecipe) AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.assembler.assemblerModule.recipe); + if(this.assembler.assemblerModule.getRecipeName() != null && AssemblyMachineRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule.getRecipeName())) { + GenericRecipe recipe = this.assembler.assemblerModule.getRecipe(); GUIElements.drawHoveringTextRecipe(recipe.print(), mouseX, mouseY, this.fontRendererObj, itemRender, this.width, this.height); } else { this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); @@ -55,7 +55,7 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, ItemBlueprints.grabPool(assembler.slots[1]), this); + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.getRecipeName(), 0, ItemBlueprints.grabPool(assembler.slots[1]), this); } @Override @@ -77,10 +77,10 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { if(assembler.assemblerModule.progress > 0) { int j = (int) Math.ceil(70 * assembler.assemblerModule.progress); - drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); + drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61 + (assembler.assemblerModule.restrictedMode ? 16 : 0), j, 16); } - GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); + GenericRecipe recipe = assembler.assemblerModule.getRecipe(); /// LEFT LED if(assembler.didProcess) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java index 885411e82..e20b94d4f 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java @@ -47,8 +47,8 @@ public class GUIMachineChemicalFactory extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 224, guiTop + 18, 16, 68, chemplant.power, chemplant.maxPower); for(int i = 0; i < 4; i++) if(guiLeft + 74 <= mouseX && guiLeft + 74 + 18 > mouseX && guiTop + 19 + i * 22 < mouseY && guiTop + 19 + i * 22 + 18 >= mouseY) { - if(this.chemplant.chemplantModule[i].recipe != null && ChemicalPlantRecipes.INSTANCE.recipeNameMap.containsKey(this.chemplant.chemplantModule[i].recipe)) { - GenericRecipe recipe = (GenericRecipe) ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.chemplant.chemplantModule[i].recipe); + if(this.chemplant.chemplantModule[i].getRecipeName() != null && ChemicalPlantRecipes.INSTANCE.recipeNameMap.containsKey(this.chemplant.chemplantModule[i].getRecipeName())) { + GenericRecipe recipe = this.chemplant.chemplantModule[i].getRecipe(); GUIElements.drawHoveringTextRecipe(recipe.print(), mouseX, mouseY, this.fontRendererObj, itemRender, this.width, this.height); } else { this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); @@ -60,7 +60,7 @@ public class GUIMachineChemicalFactory extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 74, 19 + i * 22, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule[i].recipe, i, ItemBlueprints.grabPool(chemplant.slots[4 + i * 7]), this); + for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 74, 19 + i * 22, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule[i].getRecipeName(), i, ItemBlueprints.grabPool(chemplant.slots[4 + i * 7]), this); } @Override @@ -87,7 +87,7 @@ public class GUIMachineChemicalFactory extends GuiInfoContainer { } for(int g = 0; g < 4; g++) { - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplant.chemplantModule[g].recipe); + GenericRecipe recipe = chemplant.chemplantModule[g].getRecipe(); /// LEFT LED if(chemplant.didProcess[g]) { @@ -105,7 +105,7 @@ public class GUIMachineChemicalFactory extends GuiInfoContainer { } for(int g = 0; g < 4; g++) { // not a great way of doing it but at least we eliminate state leak bullshit - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplant.chemplantModule[g].recipe); + GenericRecipe recipe = chemplant.chemplantModule[g].getRecipe(); this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 75, 20 + g * 22); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java index bc63a81b5..0f42776f1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java @@ -43,8 +43,8 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, chemplant.power, chemplant.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { - if(this.chemplant.chemplantModule.recipe != null && ChemicalPlantRecipes.INSTANCE.recipeNameMap.containsKey(this.chemplant.chemplantModule.recipe)) { - GenericRecipe recipe = (GenericRecipe) ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.chemplant.chemplantModule.recipe); + if(this.chemplant.chemplantModule.getRecipe() != null && ChemicalPlantRecipes.INSTANCE.recipeNameMap.containsKey(this.chemplant.chemplantModule.getRecipeName())) { + GenericRecipe recipe = this.chemplant.chemplantModule.getRecipe(); GUIElements.drawHoveringTextRecipe(recipe.print(), mouseX, mouseY, this.fontRendererObj, itemRender, this.width, this.height); } else { this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); @@ -56,7 +56,7 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.recipe, 0, ItemBlueprints.grabPool(chemplant.slots[1]), this); + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.getRecipeName(), 0, ItemBlueprints.grabPool(chemplant.slots[1]), this); } @Override @@ -81,7 +81,7 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); } - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplant.chemplantModule.recipe); + GenericRecipe recipe = chemplant.chemplantModule.getRecipe(); /// LEFT LED if(chemplant.didProcess) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java index 2ae922c50..b6f48cbeb 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java @@ -44,8 +44,8 @@ public class GUIMachinePUREX extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, purex.power, purex.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { - if(this.purex.purexModule.recipe != null && PUREXRecipes.INSTANCE.recipeNameMap.containsKey(this.purex.purexModule.recipe)) { - GenericRecipe recipe = (GenericRecipe) PUREXRecipes.INSTANCE.recipeNameMap.get(this.purex.purexModule.recipe); + if(this.purex.purexModule.getRecipe() != null && PUREXRecipes.INSTANCE.recipeNameMap.containsKey(this.purex.purexModule.getRecipe())) { + GenericRecipe recipe = this.purex.purexModule.getRecipe(); GUIElements.drawHoveringTextRecipe(recipe.print(), mouseX, mouseY, this.fontRendererObj, itemRender, this.width, this.height); } else { this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); @@ -57,7 +57,7 @@ public class GUIMachinePUREX extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(PUREXRecipes.INSTANCE, purex, purex.purexModule.recipe, 0, ItemBlueprints.grabPool(purex.slots[1]), this); + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(PUREXRecipes.INSTANCE, purex, purex.purexModule.getRecipeName(), 0, ItemBlueprints.grabPool(purex.slots[1]), this); } @Override @@ -82,7 +82,7 @@ public class GUIMachinePUREX extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); } - GenericRecipe recipe = PUREXRecipes.INSTANCE.recipeNameMap.get(purex.purexModule.recipe); + GenericRecipe recipe = purex.purexModule.getRecipe(); /// LEFT LED if(purex.didProcess) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePlasmaForge.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePlasmaForge.java index 2516072f7..98b9f663c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachinePlasmaForge.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePlasmaForge.java @@ -47,15 +47,15 @@ public class GUIMachinePlasmaForge extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 62, forge.power, forge.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 80 < mouseY && guiTop + 80 + 18 >= mouseY) { - if(this.forge.plasmaModule.recipe != null && PlasmaForgeRecipes.INSTANCE.recipeNameMap.containsKey(this.forge.plasmaModule.recipe)) { - GenericRecipe recipe = (GenericRecipe) PlasmaForgeRecipes.INSTANCE.recipeNameMap.get(this.forge.plasmaModule.recipe); + if(this.forge.plasmaModule.getRecipeName() != null && PlasmaForgeRecipes.INSTANCE.recipeNameMap.containsKey(this.forge.plasmaModule.getRecipeName())) { + GenericRecipe recipe = this.forge.plasmaModule.getRecipe(); GUIElements.drawHoveringTextRecipe(recipe.print(), mouseX, mouseY, this.fontRendererObj, itemRender, this.width, this.height); } else { this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); } } - PlasmaForgeRecipe recipe = (PlasmaForgeRecipe) PlasmaForgeRecipes.INSTANCE.recipeNameMap.get(forge.plasmaModule.recipe); + PlasmaForgeRecipe recipe = (PlasmaForgeRecipe) forge.plasmaModule.getRecipe(); if(recipe != null) { drawCustomInfoStat(mouseX, mouseY, guiLeft + 25, guiTop + 115, 18, 18, mouseX, mouseY, EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + BobMathUtil.getShortNumber(forge.plasmaEnergySync) + "TU / " + BobMathUtil.getShortNumber(recipe.ignitionTemp) + "TU"); @@ -102,7 +102,7 @@ public class GUIMachinePlasmaForge extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 80, 18, 18)) GUIScreenRecipeSelector.openSelector(PlasmaForgeRecipes.INSTANCE, forge, forge.plasmaModule.recipe, 0, ItemBlueprints.grabPool(forge.slots[1]), this); + if(this.checkClick(x, y, 7, 80, 18, 18)) GUIScreenRecipeSelector.openSelector(PlasmaForgeRecipes.INSTANCE, forge, forge.plasmaModule.getRecipeName(), 0, ItemBlueprints.grabPool(forge.slots[1]), this); } @Override @@ -127,7 +127,7 @@ public class GUIMachinePlasmaForge extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 62, guiTop + 81, 176, 62, j, 16); } - PlasmaForgeRecipe recipe = (PlasmaForgeRecipe) PlasmaForgeRecipes.INSTANCE.recipeNameMap.get(forge.plasmaModule.recipe); + PlasmaForgeRecipe recipe = (PlasmaForgeRecipe) forge.plasmaModule.getRecipe(); /// LEFT LED if(forge.didProcess) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePrecAss.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePrecAss.java index 53d04d6f7..aa5a400cf 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachinePrecAss.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePrecAss.java @@ -42,8 +42,8 @@ public class GUIMachinePrecAss extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, assembler.power, assembler.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { - if(this.assembler.assemblerModule.recipe != null && PrecAssRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule.recipe)) { - GenericRecipe recipe = (GenericRecipe) PrecAssRecipes.INSTANCE.recipeNameMap.get(this.assembler.assemblerModule.recipe); + if(this.assembler.assemblerModule.getRecipeName() != null && PrecAssRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule.getRecipeName())) { + GenericRecipe recipe = this.assembler.assemblerModule.getRecipe(); GUIElements.drawHoveringTextRecipe(recipe.print(), mouseX, mouseY, this.fontRendererObj, itemRender, this.width, this.height); } else { this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); @@ -55,7 +55,7 @@ public class GUIMachinePrecAss extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(PrecAssRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, ItemBlueprints.grabPool(assembler.slots[1]), this); + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(PrecAssRecipes.INSTANCE, assembler, assembler.assemblerModule.getRecipeName(), 0, ItemBlueprints.grabPool(assembler.slots[1]), this); } @Override @@ -80,7 +80,7 @@ public class GUIMachinePrecAss extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); } - GenericRecipe recipe = PrecAssRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); + GenericRecipe recipe = assembler.assemblerModule.getRecipe(); /// LEFT LED if(assembler.didProcess) { diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipe.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipe.java index 65d4fa4b4..4c73a4289 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipe.java @@ -41,8 +41,8 @@ public class CrucibleRecipe extends GenericRecipe { @Override public List print() { List list = new ArrayList(); - list.add(EnumChatFormatting.YELLOW + this.getLocalizedName()); + header(list); input(list); output(list); diff --git a/src/main/java/com/hbm/inventory/recipes/PlasmaForgeRecipe.java b/src/main/java/com/hbm/inventory/recipes/PlasmaForgeRecipe.java index 4637b8bd0..8183f941c 100644 --- a/src/main/java/com/hbm/inventory/recipes/PlasmaForgeRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/PlasmaForgeRecipe.java @@ -23,8 +23,8 @@ public class PlasmaForgeRecipe extends GenericRecipe { public List print() { List list = new ArrayList(); - list.add(EnumChatFormatting.YELLOW + this.getLocalizedName()); + header(list); autoSwitch(list); duration(list); power(list); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index 40ee9bf27..4f8a49eb5 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import org.lwjgl.input.Keyboard; + import com.hbm.config.GeneralConfig; import com.hbm.inventory.FluidStack; import com.hbm.inventory.RecipesCommon.AStack; @@ -148,8 +150,8 @@ public class GenericRecipe { public List print() { List list = new ArrayList(); - list.add(EnumChatFormatting.YELLOW + this.getLocalizedName()); + header(list); autoSwitch(list); duration(list); power(list); @@ -159,6 +161,11 @@ public class GenericRecipe { return list; } + protected void header(List list) { + list.add(EnumChatFormatting.YELLOW + this.getLocalizedName()); + if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) list.add(EnumChatFormatting.DARK_GRAY + "Internal: " + this.getInternalName()); + } + protected void autoSwitch(List list) { if(this.autoSwitchGroup != null) { String[] lines = I18nUtil.resolveKeyArray("autoswitch", I18nUtil.resolveKey(this.autoSwitchGroup)); diff --git a/src/main/java/com/hbm/module/ParseMSES1Ext1.java b/src/main/java/com/hbm/module/ParseMSES1Ext1.java index db4a3bc48..875c136b0 100644 --- a/src/main/java/com/hbm/module/ParseMSES1Ext1.java +++ b/src/main/java/com/hbm/module/ParseMSES1Ext1.java @@ -120,6 +120,12 @@ public class ParseMSES1Ext1 extends ParseMSES1 { return EnumStatementReturn.OK; } + // writes the total world time to the buffer + if(lower.equals("worldtime")) { + ctx.writeBuffer("" + ctx.world.getTotalWorldTime()); + return EnumStatementReturn.OK; + } + return super.eval(ctx, line); } } diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java index 311a236fa..d75608786 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java @@ -25,11 +25,12 @@ public abstract class ModuleMachineBase { public FluidTank[] inputTanks; public FluidTank[] outputTanks; // running vars - public String recipe = "null"; + protected String recipe = "null"; public double progress; // return signals public boolean didProcess = false; public boolean markDirty = false; + public boolean restrictedMode = false; public ModuleMachineBase(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { this.index = index; @@ -114,6 +115,7 @@ public abstract class ModuleMachineBase { } public void process(GenericRecipe recipe, double speed, double power) { + if(this.restrictedMode) speed *= 0.25; // RoR controlled machines have a speed penalty this.battery.setPower(this.battery.getPower() - (power == 1 ? recipe.power : (long) (recipe.power * power))); double step = Math.min(speed / recipe.duration, 1D); // can't do more than one recipe per tick, might look into that later @@ -167,11 +169,20 @@ public abstract class ModuleMachineBase { this.markDirty = true; } + + public String getRecipeName() { + return this.recipe; + } public GenericRecipe getRecipe() { return (GenericRecipe) getRecipeSet().recipeNameMap.get(this.recipe); } + public void setRecipe(String name, boolean ror) { + this.recipe = name; + this.restrictedMode = ror; + } + public abstract GenericRecipes getRecipeSet(); public void update(double speed, double power, boolean extraCondition, ItemStack blueprint) { @@ -232,21 +243,25 @@ public abstract class ModuleMachineBase { public void serialize(ByteBuf buf) { buf.writeDouble(progress); + buf.writeBoolean(restrictedMode); ByteBufUtils.writeUTF8String(buf, recipe); } public void deserialize(ByteBuf buf) { this.progress = buf.readDouble(); + this.restrictedMode = buf.readBoolean(); this.recipe = ByteBufUtils.readUTF8String(buf); } public void readFromNBT(NBTTagCompound nbt) { this.progress = nbt.getDouble("progress" + index); this.recipe = nbt.getString("recipe" + index); + this.restrictedMode = nbt.getBoolean("restrictedMode"); } public void writeToNBT(NBTTagCompound nbt) { nbt.setDouble("progress" + index, progress); nbt.setString("recipe" + index, recipe); + nbt.setBoolean("restrictedMode", restrictedMode); } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssemblyFactory.java b/src/main/java/com/hbm/render/tileentity/RenderAssemblyFactory.java index 06cdbf265..1bb80d9f0 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssemblyFactory.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssemblyFactory.java @@ -4,7 +4,6 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.main.MainRegistry; import com.hbm.main.ResourceManager; @@ -162,7 +161,7 @@ public class RenderAssemblyFactory extends TileEntitySpecialRenderer implements GL11.glRotated(90, 0, 1, 0); GL11.glTranslated(0, 1.0625, 0); - GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assemfac.assemblerModule[i].recipe); + GenericRecipe recipe = assemfac.assemblerModule[i].getRecipe(); if(recipe != null) { ItemStack stack = recipe.getIcon(); stack.stackSize = 1; diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java index 17eba939c..9b7407644 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java @@ -4,7 +4,6 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.main.MainRegistry; import com.hbm.main.ResourceManager; @@ -99,7 +98,7 @@ public class RenderAssemblyMachine extends TileEntitySpecialRenderer implements GL11.glShadeModel(GL11.GL_FLAT); - GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); + GenericRecipe recipe = assembler.assemblerModule.getRecipe(); if(recipe != null && MainRegistry.proxy.me().getDistanceSq(tileEntity.xCoord + 0.5, tileEntity.yCoord + 1, tileEntity.zCoord + 0.5) < 35 * 35) { GL11.glRotated(90, 0, 1, 0); diff --git a/src/main/java/com/hbm/render/tileentity/RenderChemicalPlant.java b/src/main/java/com/hbm/render/tileentity/RenderChemicalPlant.java index bd7657a69..4581d0475 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderChemicalPlant.java +++ b/src/main/java/com/hbm/render/tileentity/RenderChemicalPlant.java @@ -7,7 +7,6 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; @@ -39,7 +38,7 @@ public class RenderChemicalPlant extends TileEntitySpecialRenderer implements II TileEntityMachineChemicalPlant chemplant = (TileEntityMachineChemicalPlant) tileEntity; float anim = chemplant.prevAnim + (chemplant.anim - chemplant.prevAnim) * interp; - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplant.chemplantModule.recipe); + GenericRecipe recipe = chemplant.chemplantModule.getRecipe(); bindTexture(ResourceManager.chemical_plant_tex); ResourceManager.chemical_plant.renderPart("Base"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderFusionPlasmaForge.java b/src/main/java/com/hbm/render/tileentity/RenderFusionPlasmaForge.java index 53cceadc8..9f50fc801 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFusionPlasmaForge.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFusionPlasmaForge.java @@ -5,7 +5,6 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.recipes.PlasmaForgeRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.main.MainRegistry; import com.hbm.main.ResourceManager; @@ -62,7 +61,7 @@ public class RenderFusionPlasmaForge extends TileEntitySpecialRenderer implement bindTexture(ResourceManager.fusion_plasma_forge_tex); ResourceManager.fusion_plasma_forge.renderPart("Body"); - GenericRecipe recipe = PlasmaForgeRecipes.INSTANCE.recipeNameMap.get(forge.plasmaModule.recipe); + GenericRecipe recipe = forge.plasmaModule.getRecipe(); renderPlasma(forge); renderItem(forge, recipe, interp); diff --git a/src/main/java/com/hbm/render/tileentity/RenderPrecAss.java b/src/main/java/com/hbm/render/tileentity/RenderPrecAss.java index de84b54a4..e7a6cc2b3 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPrecAss.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPrecAss.java @@ -4,7 +4,6 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.recipes.PrecAssRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.main.MainRegistry; import com.hbm.main.ResourceManager; @@ -71,7 +70,7 @@ public class RenderPrecAss extends TileEntitySpecialRenderer implements IItemRen GL11.glShadeModel(GL11.GL_FLAT); - GenericRecipe recipe = PrecAssRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); + GenericRecipe recipe = assembler.assemblerModule.getRecipe(); if(recipe != null && MainRegistry.proxy.me().getDistanceSq(tileEntity.xCoord + 0.5, tileEntity.yCoord + 1, tileEntity.zCoord + 0.5) < 35 * 35) { GL11.glRotated(90, 0, 1, 0); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java index 20b1e4a33..2324ba300 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java @@ -12,7 +12,6 @@ import com.hbm.inventory.container.ContainerMachineAssemblyFactory; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineAssemblyFactory; -import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -158,7 +157,7 @@ public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase impl long nextMaxPower = 0; for(int i = 0; i < 4; i++) { - GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assemblerModule[i].recipe); + GenericRecipe recipe = assemblerModule[i].getRecipe(); if(recipe != null) { nextMaxPower += recipe.power * 100; } @@ -374,7 +373,7 @@ public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase impl int index = data.getInteger("index"); String selection = data.getString("selection"); if(index >= 0 && index < 4) { - this.assemblerModule[index].recipe = selection; + this.assemblerModule[index].setRecipe(selection, false); this.markChanged(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java index 721cd9031..0592ad79e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -11,7 +11,6 @@ import com.hbm.inventory.container.ContainerMachineAssemblyMachine; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineAssemblyMachine; -import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -30,6 +29,8 @@ import com.hbm.util.i18n.I18nUtil; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import api.hbm.redstoneoverradio.IRORInteractive; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -41,7 +42,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider { +public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider, IRORValueProvider, IRORInteractive { public FluidTank inputTank; public FluidTank outputTank; @@ -88,7 +89,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl if(!worldObj.isRemote) { - GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assemblerModule.recipe); + GenericRecipe recipe = assemblerModule.getRecipe(); if(recipe != null) { this.maxPower = recipe.power * 100; } @@ -303,7 +304,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl int index = data.getInteger("index"); String selection = data.getString("selection"); if(index == 0) { - this.assemblerModule.recipe = selection; + this.assemblerModule.setRecipe(selection, false); this.markChanged(); } } @@ -482,4 +483,34 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl }; } } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "progress", + PREFIX_VALUE + "recipe", + PREFIX_VALUE + "active", + PREFIX_FUNCTION + "setrecipe" + NAME_SEPARATOR + "name", + }; + } + + @Override + public String provideRORValue(String name) { + if("progress".equals(name)) return "" + (int) Math.round(this.assemblerModule.progress * 100); + if("recipe".equals(name)) return this.assemblerModule.getRecipeName(); + if("active".equals(name)) return "" + (this.didProcess ? 1 : 0); + return null; + } + + @Override + public String runRORFunction(String name, String[] params) { + + if("setrecipe".equals(name) && params.length == 1) { + this.assemblerModule.setRecipe(params[0], true); + this.markChanged(); + return null; + } + + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index 8f0e8a905..2f1c80eb4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -10,7 +10,6 @@ import com.hbm.inventory.container.ContainerMachineChemicalFactory; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalFactory; -import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -158,7 +157,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl long nextMaxPower = 0; for(int i = 0; i < 4; i++) { - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplantModule[i].recipe); + GenericRecipe recipe = chemplantModule[i].getRecipe(); if(recipe != null) { nextMaxPower += recipe.power * 100; } @@ -400,7 +399,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl int index = data.getInteger("index"); String selection = data.getString("selection"); if(index >= 0 && index < 4) { - this.chemplantModule[index].recipe = selection; + this.chemplantModule[index].setRecipe(selection, false); this.markChanged(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index b4c730928..50e779f1c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -10,7 +10,6 @@ import com.hbm.inventory.container.ContainerMachineChemicalPlant; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalPlant; -import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -86,7 +85,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem if(!worldObj.isRemote) { - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplantModule.recipe); + GenericRecipe recipe = chemplantModule.getRecipe(); if(recipe != null) { this.maxPower = recipe.power * 100; } @@ -278,7 +277,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem int index = data.getInteger("index"); String selection = data.getString("selection"); if(index == 0) { - this.chemplantModule.recipe = selection; + this.chemplantModule.setRecipe(selection, false); this.markChanged(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java index 0aca4f5b6..6f20e2e69 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java @@ -10,7 +10,6 @@ import com.hbm.inventory.container.ContainerMachinePUREX; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachinePUREX; -import com.hbm.inventory.recipes.PUREXRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -80,7 +79,7 @@ public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEn if(!worldObj.isRemote) { - GenericRecipe recipe = PUREXRecipes.INSTANCE.recipeNameMap.get(purexModule.recipe); + GenericRecipe recipe = purexModule.getRecipe(); if(recipe != null) { this.maxPower = recipe.power * 100; } @@ -235,7 +234,7 @@ public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEn int index = data.getInteger("index"); String selection = data.getString("selection"); if(index == 0) { - this.purexModule.recipe = selection; + this.purexModule.setRecipe(selection, false); this.markChanged(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePrecAss.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePrecAss.java index b8429c2e5..c441bff3e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePrecAss.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePrecAss.java @@ -10,7 +10,6 @@ import com.hbm.inventory.container.ContainerMachinePrecAss; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachinePrecAss; -import com.hbm.inventory.recipes.PrecAssRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -93,7 +92,7 @@ public class TileEntityMachinePrecAss extends TileEntityMachineBase implements I if(!worldObj.isRemote) { - GenericRecipe recipe = PrecAssRecipes.INSTANCE.recipeNameMap.get(assemblerModule.recipe); + GenericRecipe recipe = assemblerModule.getRecipe(); if(recipe != null) { this.maxPower = recipe.power * 100; } @@ -352,7 +351,7 @@ public class TileEntityMachinePrecAss extends TileEntityMachineBase implements I int index = data.getInteger("index"); String selection = data.getString("selection"); if(index == 0) { - this.assemblerModule.recipe = selection; + this.assemblerModule.setRecipe(selection, false); this.markChanged(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java index 9d8cf978c..3ac9468d1 100644 --- a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java +++ b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java @@ -16,7 +16,6 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachinePlasmaForge; import com.hbm.inventory.recipes.PlasmaForgeRecipe; -import com.hbm.inventory.recipes.PlasmaForgeRecipes; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; @@ -156,7 +155,7 @@ public class TileEntityFusionPlasmaForge extends TileEntityMachineBase implement if(receiverNode != null && receiverNode.hasValidNet()) receiverNode.net.addReceiver(this); if(providerNode != null && providerNode.hasValidNet()) providerNode.net.addProvider(this); // technically unused, but good to have when we do something else with the plasma nets - PlasmaForgeRecipe recipe = (PlasmaForgeRecipe) PlasmaForgeRecipes.INSTANCE.recipeNameMap.get(plasmaModule.recipe); + PlasmaForgeRecipe recipe = (PlasmaForgeRecipe) plasmaModule.getRecipe(); if(recipe != null) this.maxPower = recipe.power * 100; this.maxPower = BobMathUtil.max(this.power, this.maxPower, 100_000); @@ -364,7 +363,7 @@ public class TileEntityFusionPlasmaForge extends TileEntityMachineBase implement int index = data.getInteger("index"); String selection = data.getString("selection"); if(index == 0) { - this.plasmaModule.recipe = selection; + this.plasmaModule.setRecipe(selection, false); this.markChanged(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java index 9208fab1f..b278623fe 100644 --- a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java +++ b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java @@ -473,7 +473,7 @@ public class TileEntityFusionTorus extends TileEntityCooledBase implements IGUIP int index = data.getInteger("index"); String selection = data.getString("selection"); if(index == 0) { - this.fusionModule.recipe = selection; + this.fusionModule.setRecipe(selection, false); this.markChanged(); } } diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index 2c01aff94..b639fbb56 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -4,7 +4,9 @@ package com.hbm.tileentity.network.pneumatic; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPneumoStorageExporter; import com.hbm.inventory.gui.GUIPneumoStorageExporter; +import com.hbm.tileentity.network.RTTYSystem; +import api.hbm.ntl.StackCache.CacheSlot; import api.hbm.redstoneoverradio.IRORInteractive; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; @@ -20,8 +22,8 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB public boolean rorConfiguredMode = false; /** What strategy to use for handling request filters */ public int requestMode = 0; - /** Item ID and meta pairs for RoR controlled filters */ - public short[][] rorFilters = new short[9][2]; + /** Item ID and meta pairs with amount for RoR controlled filters */ + public short[][] rorFilters = new short[9][3]; /** Each slot individually tries to pull as much as it can of the configured item */ public static final int MODE_AS_MUCH_AS_POSSIBLE = 0; @@ -47,6 +49,23 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB this.networkPackNT(15); } } + + public void doRequest(boolean force) { + + } + + public void requestSlot(int slot, boolean force) { + + } + + public long getAvailability(int item, int meta) { + if(this.cache == null || this.cache.hasExpired) return 0; + long hash = this.cache.getStackIdentity(item, meta, null); + if(hash == this.cache.getNullIdentity()) return 0; + CacheSlot slot = this.cache.cacheSlots.get(hash); + if(slot == null) return 0; + return slot.stacksize; + } @Override public void serialize(ByteBuf buf) { @@ -57,6 +76,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB for(int i = 0; i < 9; i++) { buf.writeShort(rorFilters[i][0]); buf.writeShort(rorFilters[i][1]); + buf.writeShort(rorFilters[i][2]); } } @@ -69,6 +89,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB for(int i = 0; i < 9; i++) { rorFilters[i][0] = buf.readShort(); rorFilters[i][1] = buf.readShort(); + rorFilters[i][2] = buf.readShort(); } } @@ -96,7 +117,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB public String[] getFunctionInfo() { return new String[] { PREFIX_FUNCTION + "setfilter" + NAME_SEPARATOR + "slot" + PARAM_SEPARATOR + "itemid" + PARAM_SEPARATOR + "itemmeta" + PARAM_SEPARATOR + "amount", - PREFIX_FUNCTION + "setcontinuous" + NAME_SEPARATOR + "slot" + PARAM_SEPARATOR + "itemid" + PARAM_SEPARATOR + "itemmeta" + PARAM_SEPARATOR + "amount", + PREFIX_FUNCTION + "setcontinuous" + NAME_SEPARATOR + "on/off", PREFIX_FUNCTION + "request", PREFIX_FUNCTION + "requestslot" + NAME_SEPARATOR + "slot", PREFIX_FUNCTION + "checkavailability" + NAME_SEPARATOR + "itemid" + PARAM_SEPARATOR + "itemmeta" + PARAM_SEPARATOR + "returnchannel", @@ -105,6 +126,47 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB @Override public String runRORFunction(String name, String[] params) { + + if("setfilter".equals(name) && params.length == 4) { + int slot = IRORInteractive.parseInt(params[0], 1, 9) - 1; + int itemId = IRORInteractive.parseInt(params[1], 0, Short.MAX_VALUE); + int meta = IRORInteractive.parseInt(params[2], 0, Short.MAX_VALUE); + int amount = IRORInteractive.parseInt(params[3], 1, 64); + + this.rorFilters[slot][0] = (short) itemId; + this.rorFilters[slot][1] = (short) meta; + this.rorFilters[slot][2] = (short) amount; + this.markChanged(); + return null; + } + + if("setcontinuous".equals(name) && params.length == 1) { + if("on".equals(params[0])) this.continuousRequest = true; + if("off".equals(params[0])) this.continuousRequest = false; + this.markChanged(); + return null; + } + + if("request".equals(name)) { + this.doRequest(true); + return null; + } + + if("requestslot".equals(name) && params.length == 1) { + int slot = IRORInteractive.parseInt(params[0], 1, 9) - 1; + this.requestSlot(slot, true); + return null; + } + + if("checkavailability".equals(name) && params.length == 3) { + int itemId = IRORInteractive.parseInt(params[0], 0, Short.MAX_VALUE); + int meta = IRORInteractive.parseInt(params[1], 0, Short.MAX_VALUE); + String ret = params[2]; + long availability = this.getAvailability(itemId, meta); + RTTYSystem.broadcast(worldObj, ret, availability + ""); + return null; + } + return null; } } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png index 3ce1bc32c7c7bc336caa829c6559d5caf3a9c325..b5435bfee38adf0d566ca4428fd6868d169fc1a0 100644 GIT binary patch literal 3643 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 literal 3594 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 AKmY&$ From 2cef5bf006c1effee74319d295fce1a99cdca137 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 1 Jul 2026 10:16:09 +0200 Subject: [PATCH 047/107] 3 hours of sleep let's fucking go --- changelog | 5 +-- .../gui/GUIMachineChemicalPlant.java | 2 +- .../TileEntityMachineAssemblyFactory.java | 33 +++++++++++++++++- .../TileEntityMachineChemicalFactory.java | 33 +++++++++++++++++- .../TileEntityMachineChemicalPlant.java | 34 ++++++++++++++++++- 5 files changed, 101 insertions(+), 6 deletions(-) diff --git a/changelog b/changelog index 0e1a5cf5a..9ca5b6b0c 100644 --- a/changelog +++ b/changelog @@ -29,13 +29,14 @@ * Increased the blast furnace's fuel buffer by 50%, allowing coke blocks to be used * If an RoR controller tries to parse an integer, but the supplied string represents a decimal, instead of canceling the operation, the system will now interpret decimals and round them to be integers * This means that the AUTOCAL can now send RoR commands using calculated values directly without the use of `round` or `evalr` -* Assembly machines now support Redstone-over-Radio +* Assembly machines and chemical plants now support Redstone-over-Radio * Active state (0 or 1), progress (0-100) and current recipe (internal name) can now be read * The recipe can be set using a controller * Do note that setting a recipe that needs a blueprint without that blueprint will not work * RoR set recipes cause the assembler to go into low power mode, making it run at only 25% speed (visible through the blue progress bar) * The speed penalty is removed as soon as a recipe is assigned manually again -* The AUTOCAL's script interpreter now runs MS-ES v1.1 (First Extended Instruction Set) +* Assembly recipes and chemical factories can now be read (but not configured) using Redstone-over-Radio +* The factories script interpreter now runs MS-ES v1.1 (First Extended Instruction Set) * Allows the use of a global stack, similar to the buffer which can hold 256 values * Allows splitting of strings and counting of string fragments * Adds substring operations diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java index 0f42776f1..018e780f0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java @@ -78,7 +78,7 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { if(chemplant.chemplantModule.progress > 0) { int j = (int) Math.ceil(70 * chemplant.chemplantModule.progress); - drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); + drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61 + (chemplant.chemplantModule.restrictedMode ? 16 : 0), j, 16); } GenericRecipe recipe = chemplant.chemplantModule.getRecipe(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java index 2324ba300..e171deb1a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java @@ -32,6 +32,7 @@ import com.hbm.util.i18n.I18nUtil; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -46,7 +47,7 @@ import net.minecraftforge.common.util.ForgeDirection; // TODO: make a base class because 90% of this is just copy pasted from the chemfac @NotableComments -public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider, IProxyDelegateProvider, IConditionalInvAccess { +public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider, IProxyDelegateProvider, IConditionalInvAccess, IRORValueProvider { public FluidTank[] allTanks; public FluidTank[] inputTanks; @@ -721,4 +722,34 @@ public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase impl RETIRE, // return to null position for carriage transit WAIT // either waiting for or in the middle of carriage transit } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "progress1", + PREFIX_VALUE + "progress2", + PREFIX_VALUE + "progress3", + PREFIX_VALUE + "progress4", + PREFIX_VALUE + "recipe1", + PREFIX_VALUE + "recipe2", + PREFIX_VALUE + "recipe3", + PREFIX_VALUE + "recipe4", + PREFIX_VALUE + "anyactive", + PREFIX_VALUE + "active1", + PREFIX_VALUE + "active2", + PREFIX_VALUE + "active3", + PREFIX_VALUE + "active4", + }; + } + + @Override + public String provideRORValue(String name) { + if("anyactive".equals(name)) return "" + ((this.didProcess[0] || this.didProcess[1] || this.didProcess[2] || this.didProcess[3]) ? 1 : 0); + for(int i = 0; i < 4; i++) { + if(("progress" + i).equals(name)) return "" + (int) Math.round(this.assemblerModule[i].progress * 100); + if(("recipe" + i).equals(name)) return this.assemblerModule[i].getRecipeName(); + if(("active" + i).equals(name)) return "" + (this.didProcess[i] ? 1 : 0); + } + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index 2f1c80eb4..2042d0615 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -30,6 +30,7 @@ import com.hbm.util.i18n.I18nUtil; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -42,7 +43,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineChemicalFactory extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider, IProxyDelegateProvider, IConditionalInvAccess { +public class TileEntityMachineChemicalFactory extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider, IProxyDelegateProvider, IConditionalInvAccess, IRORValueProvider { public FluidTank[] allTanks; public FluidTank[] inputTanks; @@ -479,4 +480,34 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl @Override public FluidTank[] getAllTanks() { return TileEntityMachineChemicalFactory.this.getAllTanks(); } } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "progress1", + PREFIX_VALUE + "progress2", + PREFIX_VALUE + "progress3", + PREFIX_VALUE + "progress4", + PREFIX_VALUE + "recipe1", + PREFIX_VALUE + "recipe2", + PREFIX_VALUE + "recipe3", + PREFIX_VALUE + "recipe4", + PREFIX_VALUE + "anyactive", + PREFIX_VALUE + "active1", + PREFIX_VALUE + "active2", + PREFIX_VALUE + "active3", + PREFIX_VALUE + "active4", + }; + } + + @Override + public String provideRORValue(String name) { + if("anyactive".equals(name)) return "" + ((this.didProcess[0] || this.didProcess[1] || this.didProcess[2] || this.didProcess[3]) ? 1 : 0); + for(int i = 0; i < 4; i++) { + if(("progress" + i).equals(name)) return "" + (int) Math.round(this.chemplantModule[i].progress * 100); + if(("recipe" + i).equals(name)) return this.chemplantModule[i].getRecipeName(); + if(("active" + i).equals(name)) return "" + (this.didProcess[i] ? 1 : 0); + } + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index 50e779f1c..d40881054 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -28,6 +28,8 @@ import com.hbm.util.i18n.I18nUtil; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import api.hbm.redstoneoverradio.IRORInteractive; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -39,7 +41,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider { +public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider, IRORValueProvider, IRORInteractive { public FluidTank[] inputTanks; public FluidTank[] outputTanks; @@ -325,4 +327,34 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem upgrades.put(UpgradeType.OVERDRIVE, 3); return upgrades; } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "progress", + PREFIX_VALUE + "recipe", + PREFIX_VALUE + "active", + PREFIX_FUNCTION + "setrecipe" + NAME_SEPARATOR + "name", + }; + } + + @Override + public String provideRORValue(String name) { + if("progress".equals(name)) return "" + (int) Math.round(this.chemplantModule.progress * 100); + if("recipe".equals(name)) return this.chemplantModule.getRecipeName(); + if("active".equals(name)) return "" + (this.didProcess ? 1 : 0); + return null; + } + + @Override + public String runRORFunction(String name, String[] params) { + + if("setrecipe".equals(name) && params.length == 1) { + this.chemplantModule.setRecipe(params[0], true); + this.markChanged(); + return null; + } + + return null; + } } From 1c46bfed92004190fbbfddcc73baead1f4a5ac4b Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 1 Jul 2026 14:18:06 +0200 Subject: [PATCH 048/107] Redstone 3.0 + 1.0 Thrice Upon A Time --- changelog | 11 +- .../redstoneoverradio/IRORInteractive.java | 4 +- .../recipes/loader/GenericRecipes.java | 6 +- .../com/hbm/items/machine/ItemBlueprints.java | 2 +- .../machine/TileEntityHeaterOilburner.java | 24 +-- .../TileEntityMachineAssemblyFactory.java | 8 +- .../TileEntityMachineAssemblyMachine.java | 10 +- .../TileEntityMachineChemicalFactory.java | 8 +- .../TileEntityMachineChemicalPlant.java | 10 +- .../TileEntityMachineCombustionEngine.java | 8 +- .../machine/TileEntityMachinePUREX.java | 20 ++- .../machine/TileEntityMachineTurbineGas.java | 16 +- .../machine/TileEntityReactorZirnox.java | 8 +- .../fusion/TileEntityFusionPlasmaForge.java | 24 ++- .../machine/fusion/TileEntityFusionTorus.java | 25 ++- .../network/TileEntityFluidCounterValve.java | 4 +- .../network/TileEntityRadioTorchReader.java | 4 +- .../TileEntityPneumoStorageExporter.java | 158 +++++++++++++++++- .../turret/TileEntityTurretBaseArtillery.java | 14 +- .../turret/TileEntityTurretBaseNT.java | 28 ++-- .../textures/gui/machine/gui_rtty_autocal.png | Bin 2420 -> 2430 bytes .../hbm/textures/items/plate_dura_steel.png | Bin 274 -> 312 bytes 22 files changed, 299 insertions(+), 93 deletions(-) diff --git a/changelog b/changelog index 9ca5b6b0c..d1aa96597 100644 --- a/changelog +++ b/changelog @@ -24,7 +24,7 @@ * Added an alternate chemical plant recipe that uses a smaller selection of items and ICs instead of ACs * Flashgold and flashlead are now made in the PUREX instead of the crafting table * The flashgold recipe now yields two billets instead of one -* Slightly changed the HSS ingot texture to not look identical to steel except slightly greenish +* Slightly changed the HSS ingot and plate textures to not look identical to steel except slightly greenish * The AUTOCAL's buffer is now limited to 256 characters instead of being infinite * Increased the blast furnace's fuel buffer by 50%, allowing coke blocks to be used * If an RoR controller tries to parse an integer, but the supplied string represents a decimal, instead of canceling the operation, the system will now interpret decimals and round them to be integers @@ -35,13 +35,16 @@ * Do note that setting a recipe that needs a blueprint without that blueprint will not work * RoR set recipes cause the assembler to go into low power mode, making it run at only 25% speed (visible through the blue progress bar) * The speed penalty is removed as soon as a recipe is assigned manually again -* Assembly recipes and chemical factories can now be read (but not configured) using Redstone-over-Radio -* The factories script interpreter now runs MS-ES v1.1 (First Extended Instruction Set) +* Assembly factories, chemical factories, PUREX and plasma forges can now be read (but not configured) using Redstone-over-Radio +* Fusion reactor vessels can now be read and configured using RoR + * Unlike assemblers and chemplants, remote recipe configuration does not cause a speed penalty +* The AUTOCAL's script interpreter now runs MS-ES v1.1 (First Extended Instruction Set) * Allows the use of a global stack, similar to the buffer which can hold 256 values * Allows splitting of strings and counting of string fragments * Adds substring operations * Polling for receiving only fresh RoR signals * A command for writing the world time to the buffer, allowing for more precise timers +* All RoR values/commands are now case-insensitive ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised @@ -52,4 +55,4 @@ * Fixed some recipes not using ore dict when they should * Fixed `anyBismoid` group not being a proper group, causing other mods' bismuth and arsenic to not be included * Fixed RoR gauge not using SI suffixes on values below 0 -* Fixed AUTOCAL units not closing their GUI when the unit is destroyed \ No newline at end of file +* Fixed AUTOCAL units not closing their GUI when the unit is destroyed diff --git a/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java b/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java index 518b23c87..37819b5df 100644 --- a/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java +++ b/src/main/java/api/hbm/redstoneoverradio/IRORInteractive.java @@ -1,5 +1,7 @@ package api.hbm.redstoneoverradio; +import java.util.Locale; + public interface IRORInteractive extends IRORInfo { public static String NAME_SEPARATOR = "!"; @@ -18,7 +20,7 @@ public interface IRORInteractive extends IRORInfo { String[] parts = input.split(NAME_SEPARATOR); if(parts.length <= 0 || parts.length > 2) throw new RORFunctionException(EX_NAME); if(parts[0].isEmpty()) throw new RORFunctionException(EX_NULL); - return parts[0]; + return parts[0].toLowerCase(Locale.US); } /** Extracts the param list from a full command string */ diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 6bc4d93e1..6fee43971 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -48,7 +48,7 @@ public abstract class GenericRecipes extends Serializab /** Blueprint pool name to list of recipe names that are part of this pool */ public static HashMap> blueprintPools = new HashMap(); /** Name to recipe map for all recipes that are part of pools for lookup */ - public static HashMap pooledBlueprints = new HashMap(); + public static HashMap nameToRecipeGlobal = new HashMap(); /** Groups for auto switch functionality (changes recipe automatically based on first solid input) */ public HashMap> autoSwitchGroups = new HashMap(); @@ -68,7 +68,6 @@ public abstract class GenericRecipes extends Serializab blueprintPools.put(pool, list); } list.add(recipe.name); - pooledBlueprints.put(recipe.name, recipe); } /** Adds a recipe to an auto switch group (recipe can switch based on first solid input) */ @@ -81,7 +80,7 @@ public abstract class GenericRecipes extends Serializab public static void clearPools() { blueprintPools.clear(); - pooledBlueprints.clear(); + nameToRecipeGlobal.clear(); } @Override @@ -100,6 +99,7 @@ public abstract class GenericRecipes extends Serializab this.recipeOrderedList.add(recipe); if(recipeNameMap.containsKey(recipe.name)) throw new IllegalStateException("Recipe " + recipe.name + " has been registered with a duplicate ID!"); this.recipeNameMap.put(recipe.name, recipe); + nameToRecipeGlobal.put(recipe.name, recipe); } @Override diff --git a/src/main/java/com/hbm/items/machine/ItemBlueprints.java b/src/main/java/com/hbm/items/machine/ItemBlueprints.java index fc6c960ac..07be9a219 100644 --- a/src/main/java/com/hbm/items/machine/ItemBlueprints.java +++ b/src/main/java/com/hbm/items/machine/ItemBlueprints.java @@ -121,7 +121,7 @@ public class ItemBlueprints extends Item { } for(String name : pool) { - GenericRecipe recipe = GenericRecipes.pooledBlueprints.get(name); + GenericRecipe recipe = GenericRecipes.nameToRecipeGlobal.get(name); if(recipe != null) { list.add(recipe.getLocalizedName()); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java index bdeb8bedd..4706bae84 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java @@ -244,8 +244,8 @@ public class TileEntityHeaterOilburner extends TileEntityMachinePolluting implem PREFIX_VALUE + "fuel", PREFIX_VALUE + "burnRate", PREFIX_VALUE + "state", - PREFIX_FUNCTION + "setState" + NAME_SEPARATOR + "active", - PREFIX_FUNCTION + "setBurnRate" + NAME_SEPARATOR + "rate" + PREFIX_FUNCTION + "setstate" + NAME_SEPARATOR + "active", + PREFIX_FUNCTION + "setburnrate" + NAME_SEPARATOR + "rate" }; } @@ -253,29 +253,23 @@ public class TileEntityHeaterOilburner extends TileEntityMachinePolluting implem public String provideRORValue(String name) { if((PREFIX_VALUE + "heat").equals(name)) return "" + heatEnergy; if((PREFIX_VALUE + "fuel").equals(name)) return "" + tank.getFill(); - if((PREFIX_VALUE + "burnRate").equals(name)) return "" + setting; + if((PREFIX_VALUE + "burnrate").equals(name)) return "" + setting; if((PREFIX_VALUE + "state").equals(name)) return isOn ? "1" : "0"; return null; } @Override public String runRORFunction(String name, String[] params) { - if((PREFIX_FUNCTION + "setState").equals(name)) { + if((PREFIX_FUNCTION + "setstate").equals(name)) { this.isOn = params[0].equals("1"); this.markChanged(); return null; } - if((PREFIX_FUNCTION + "setBurnRate").equals(name)) { - try { - int rate = Integer.parseInt(params[0]); - if(rate < 1) rate = 1; - if(rate > 10) rate = 10; - this.setting = rate; - this.markChanged(); - return null; - } catch (NumberFormatException e) { - return "Invalid number"; - } + if((PREFIX_FUNCTION + "setburnrate").equals(name)) { + int rate = IRORInteractive.parseInt(params[0], 1, 10); + this.setting = rate; + this.markChanged(); + return null; } return null; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java index e171deb1a..c7010af97 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java @@ -744,11 +744,11 @@ public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase impl @Override public String provideRORValue(String name) { - if("anyactive".equals(name)) return "" + ((this.didProcess[0] || this.didProcess[1] || this.didProcess[2] || this.didProcess[3]) ? 1 : 0); + if((PREFIX_VALUE + "anyactive").equals(name)) return "" + ((this.didProcess[0] || this.didProcess[1] || this.didProcess[2] || this.didProcess[3]) ? 1 : 0); for(int i = 0; i < 4; i++) { - if(("progress" + i).equals(name)) return "" + (int) Math.round(this.assemblerModule[i].progress * 100); - if(("recipe" + i).equals(name)) return this.assemblerModule[i].getRecipeName(); - if(("active" + i).equals(name)) return "" + (this.didProcess[i] ? 1 : 0); + if((PREFIX_VALUE + "progress" + i).equals(name)) return "" + (int) Math.round(this.assemblerModule[i].progress * 100); + if((PREFIX_VALUE + "recipe" + i).equals(name)) return this.assemblerModule[i].getRecipeName(); + if((PREFIX_VALUE + "active" + i).equals(name)) return "" + (this.didProcess[i] ? 1 : 0); } return null; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java index 0592ad79e..486dbe8c4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -496,16 +496,16 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl @Override public String provideRORValue(String name) { - if("progress".equals(name)) return "" + (int) Math.round(this.assemblerModule.progress * 100); - if("recipe".equals(name)) return this.assemblerModule.getRecipeName(); - if("active".equals(name)) return "" + (this.didProcess ? 1 : 0); + if((PREFIX_VALUE + "progress").equals(name)) return "" + (int) Math.round(this.assemblerModule.progress * 100); + if((PREFIX_VALUE + "recipe").equals(name)) return this.assemblerModule.getRecipeName(); + if((PREFIX_VALUE + "active").equals(name)) return "" + (this.didProcess ? 1 : 0); return null; } @Override public String runRORFunction(String name, String[] params) { - - if("setrecipe".equals(name) && params.length == 1) { + + if((PREFIX_FUNCTION + "setrecipe").equals(name) && params.length == 1) { this.assemblerModule.setRecipe(params[0], true); this.markChanged(); return null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index 2042d0615..7e2a170b8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -502,11 +502,11 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl @Override public String provideRORValue(String name) { - if("anyactive".equals(name)) return "" + ((this.didProcess[0] || this.didProcess[1] || this.didProcess[2] || this.didProcess[3]) ? 1 : 0); + if((PREFIX_VALUE + "anyactive").equals(name)) return "" + ((this.didProcess[0] || this.didProcess[1] || this.didProcess[2] || this.didProcess[3]) ? 1 : 0); for(int i = 0; i < 4; i++) { - if(("progress" + i).equals(name)) return "" + (int) Math.round(this.chemplantModule[i].progress * 100); - if(("recipe" + i).equals(name)) return this.chemplantModule[i].getRecipeName(); - if(("active" + i).equals(name)) return "" + (this.didProcess[i] ? 1 : 0); + if((PREFIX_VALUE + "progress" + i).equals(name)) return "" + (int) Math.round(this.chemplantModule[i].progress * 100); + if((PREFIX_VALUE + "recipe" + i).equals(name)) return this.chemplantModule[i].getRecipeName(); + if((PREFIX_VALUE + "active" + i).equals(name)) return "" + (this.didProcess[i] ? 1 : 0); } return null; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index d40881054..8c52695e9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -340,16 +340,16 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem @Override public String provideRORValue(String name) { - if("progress".equals(name)) return "" + (int) Math.round(this.chemplantModule.progress * 100); - if("recipe".equals(name)) return this.chemplantModule.getRecipeName(); - if("active".equals(name)) return "" + (this.didProcess ? 1 : 0); + if((PREFIX_VALUE + "progress").equals(name)) return "" + (int) Math.round(this.chemplantModule.progress * 100); + if((PREFIX_VALUE + "recipe").equals(name)) return this.chemplantModule.getRecipeName(); + if((PREFIX_VALUE + "active").equals(name)) return "" + (this.didProcess ? 1 : 0); return null; } @Override public String runRORFunction(String name, String[] params) { - - if("setrecipe".equals(name) && params.length == 1) { + + if((PREFIX_FUNCTION + "setrecipe").equals(name) && params.length == 1) { this.chemplantModule.setRecipe(params[0], true); this.markChanged(); return null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java index edad59cd9..e6214bb64 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java @@ -484,8 +484,8 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin PREFIX_VALUE + "power", PREFIX_VALUE + "fuel", PREFIX_VALUE + "efficiency", - PREFIX_FUNCTION + "setState" + NAME_SEPARATOR + "state", - PREFIX_FUNCTION + "setThrottle" + NAME_SEPARATOR + "throttle" + PREFIX_FUNCTION + "setstate" + NAME_SEPARATOR + "state", + PREFIX_FUNCTION + "setthrottle" + NAME_SEPARATOR + "throttle" }; } @@ -509,7 +509,7 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin @Override public String runRORFunction(String name, String[] params) { - if ((PREFIX_FUNCTION + "setState").equals(name) && params.length > 0) { + if ((PREFIX_FUNCTION + "setstate").equals(name) && params.length > 0) { try { int val = Integer.parseInt(params[0]); this.isOn = (val == 1); @@ -517,7 +517,7 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin } catch (NumberFormatException e) {} return null; } - if ((PREFIX_FUNCTION + "setThrottle").equals(name) && params.length > 0) { + if ((PREFIX_FUNCTION + "setthrottle").equals(name) && params.length > 0) { try { int val = Integer.parseInt(params[0]); if (val < 0) val = 0; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java index 6f20e2e69..0181ac59a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java @@ -25,6 +25,7 @@ import com.hbm.util.i18n.I18nUtil; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -36,7 +37,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider { +public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider, IRORValueProvider { public FluidTank[] inputTanks; public FluidTank[] outputTanks; @@ -282,4 +283,21 @@ public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEn upgrades.put(UpgradeType.OVERDRIVE, 3); return upgrades; } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "progress", + PREFIX_VALUE + "recipe", + PREFIX_VALUE + "active", + }; + } + + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "progress").equals(name)) return "" + (int) Math.round(this.purexModule.progress * 100); + if((PREFIX_VALUE + "recipe").equals(name)) return this.purexModule.getRecipeName(); + if((PREFIX_VALUE + "active").equals(name)) return "" + (this.didProcess ? 1 : 0); + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index 47040e264..51c726fd5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -737,16 +737,16 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement PREFIX_VALUE + "turbinespeed", PREFIX_VALUE + "output", PREFIX_VALUE + "state", - PREFIX_VALUE + "autoMode", + PREFIX_VALUE + "automode", PREFIX_VALUE + "temp", PREFIX_VALUE + "power", PREFIX_VALUE + "fuel", PREFIX_VALUE + "lubricant", PREFIX_VALUE + "water", PREFIX_VALUE + "steam", - PREFIX_FUNCTION + "setAuto" + NAME_SEPARATOR + "auto", - PREFIX_FUNCTION + "setThrottle" + NAME_SEPARATOR + "percent", - PREFIX_FUNCTION + "setState" + NAME_SEPARATOR + "state" + PREFIX_FUNCTION + "setauto" + NAME_SEPARATOR + "auto", + PREFIX_FUNCTION + "setthrottle" + NAME_SEPARATOR + "percent", + PREFIX_FUNCTION + "setstate" + NAME_SEPARATOR + "state" }; } @@ -756,7 +756,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement if((PREFIX_VALUE + "turbinespeed").equals(name)) return "" + this.rpm; if((PREFIX_VALUE + "output").equals(name)) return "" + (int) (this.instantPowerOutput * 20); if((PREFIX_VALUE + "state").equals(name)) return "" + this.state; - if((PREFIX_VALUE + "autoMode").equals(name)) return "" + (this.autoMode ? 1 : 0); + if((PREFIX_VALUE + "automode").equals(name)) return "" + (this.autoMode ? 1 : 0); if((PREFIX_VALUE + "temp").equals(name)) return "" + this.temp; if((PREFIX_VALUE + "power").equals(name)) return "" + this.power; if((PREFIX_VALUE + "fuel").equals(name)) return "" + tanks[0].getFill(); @@ -768,7 +768,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement @Override public String runRORFunction(String name, String[] params) { - if((PREFIX_FUNCTION + "setAuto").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "setauto").equals(name) && params.length > 0) { try { int val = Integer.parseInt(params[0]); this.autoMode = (val == 1); @@ -776,7 +776,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } catch(NumberFormatException e) {} return null; } - if((PREFIX_FUNCTION + "setThrottle").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "setthrottle").equals(name) && params.length > 0) { try { int percent = Integer.parseInt(params[0]); if(percent < 0) percent = 0; @@ -786,7 +786,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } catch(NumberFormatException e) {} return null; } - if((PREFIX_FUNCTION + "setState").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "setstate").equals(name) && params.length > 0) { try { int newState = Integer.parseInt(params[0]); if(newState == 1) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index 30a686426..93293c4d9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -616,8 +616,8 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC PREFIX_VALUE + "steam", PREFIX_VALUE + "co2", PREFIX_VALUE + "state", - PREFIX_FUNCTION + "setState" + NAME_SEPARATOR + "active (0 or 1)", - PREFIX_FUNCTION + "ventCO2" + PREFIX_FUNCTION + "setstate" + NAME_SEPARATOR + "active (0 or 1)", + PREFIX_FUNCTION + "ventco2" }; } @@ -634,7 +634,7 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC @Override public String runRORFunction(String name, String[] params) { - if((PREFIX_FUNCTION + "setState").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "setstate").equals(name) && params.length > 0) { if(redstonePowered) return null; try { int val = Integer.parseInt(params[0]); @@ -643,7 +643,7 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC } catch(NumberFormatException e) {} return null; } - if ((PREFIX_FUNCTION + "ventCO2").equals(name)) { + if ((PREFIX_FUNCTION + "ventco2").equals(name)) { int fill = this.carbonDioxide.getFill(); this.carbonDioxide.setFill(Math.max(fill - 1000, 0)); this.markDirty(); diff --git a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java index 3ac9468d1..1b49f2dc4 100644 --- a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java +++ b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java @@ -33,6 +33,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluidmk2.IFluidStandardReceiverMK2; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -44,7 +45,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityFusionPlasmaForge extends TileEntityMachineBase implements IFusionPowerReceiver, IEnergyReceiverMK2, IFluidStandardReceiverMK2, IControlReceiver, IGUIProvider { +public class TileEntityFusionPlasmaForge extends TileEntityMachineBase implements IFusionPowerReceiver, IEnergyReceiverMK2, IFluidStandardReceiverMK2, IControlReceiver, IGUIProvider, IRORValueProvider { public FluidTank inputTank; @@ -592,4 +593,25 @@ public class TileEntityFusionPlasmaForge extends TileEntityMachineBase implement double[] newPos = positions[rand.nextInt(positions.length)]; for(int i = 0; i < newPos.length; i++) arm.targetAngles[i] = newPos[i]; } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "progress", + PREFIX_VALUE + "recipe", + PREFIX_VALUE + "active", + PREFIX_VALUE + "booster", + PREFIX_VALUE + "plasma", + }; + } + + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "progress").equals(name)) return "" + (int) Math.round(this.plasmaModule.progress * 100); + if((PREFIX_VALUE + "recipe").equals(name)) return this.plasmaModule.getRecipeName(); + if((PREFIX_VALUE + "active").equals(name)) return "" + (this.didProcess ? 1 : 0); + if((PREFIX_VALUE + "booster").equals(name)) return "" + this.booster; + if((PREFIX_VALUE + "plasma").equals(name)) return "" + this.plasmaEnergy; + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java index b278623fe..08992ef16 100644 --- a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java +++ b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java @@ -27,6 +27,7 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import api.hbm.redstoneoverradio.IRORInteractive; import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; @@ -46,7 +47,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityFusionTorus extends TileEntityCooledBase implements IGUIProvider, IControlReceiver, SimpleComponent, CompatHandler.OCComponent, IRORValueProvider { +public class TileEntityFusionTorus extends TileEntityCooledBase implements IGUIProvider, IControlReceiver, SimpleComponent, CompatHandler.OCComponent, IRORValueProvider, IRORInteractive { public boolean didProcess = false; @@ -589,7 +590,11 @@ public class TileEntityFusionTorus extends TileEntityCooledBase implements IGUIP public String[] getFunctionInfo() { return new String[] { PREFIX_VALUE + "plasma", - PREFIX_VALUE + "consumption" + PREFIX_VALUE + "consumption", + PREFIX_VALUE + "progress", + PREFIX_VALUE + "recipe", + PREFIX_VALUE + "active", + PREFIX_VALUE + "temp", }; } @@ -597,6 +602,22 @@ public class TileEntityFusionTorus extends TileEntityCooledBase implements IGUIP public String provideRORValue(String name) { if((PREFIX_VALUE + "plasma").equals(name)) return "" + this.plasmaEnergy; if((PREFIX_VALUE + "consumption").equals(name)) return "" + (int) (this.fuelConsumption * 100); + if((PREFIX_VALUE + "progress").equals(name)) return "" + (int) Math.round(this.fusionModule.progress * 100); + if((PREFIX_VALUE + "recipe").equals(name)) return this.fusionModule.getRecipeName(); + if((PREFIX_VALUE + "active").equals(name)) return "" + (this.didProcess ? 1 : 0); + if((PREFIX_VALUE + "temp").equals(name)) return "" + (int) this.temperature; + return null; + } + + @Override + public String runRORFunction(String name, String[] params) { + + if((PREFIX_FUNCTION + "setrecipe").equals(name) && params.length == 1) { + this.fusionModule.setRecipe(params[0], false); + this.markChanged(); + return null; + } + return null; } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityFluidCounterValve.java b/src/main/java/com/hbm/tileentity/network/TileEntityFluidCounterValve.java index 285b49ce0..9ccbc2508 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityFluidCounterValve.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityFluidCounterValve.java @@ -140,7 +140,7 @@ public class TileEntityFluidCounterValve extends TileEntityPipeBaseNT implements PREFIX_VALUE + "value", PREFIX_VALUE + "state", PREFIX_FUNCTION + "reset", - PREFIX_FUNCTION + "setState" + NAME_SEPARATOR + "state", + PREFIX_FUNCTION + "setstate" + NAME_SEPARATOR + "state", }; } @@ -149,7 +149,7 @@ public class TileEntityFluidCounterValve extends TileEntityPipeBaseNT implements if(name.equals(PREFIX_FUNCTION + "reset")) { counter = 0; markDirty(); - } else if(name.equals(PREFIX_FUNCTION + "setState")) { + } else if(name.equals(PREFIX_FUNCTION + "setstate")) { setState(IRORInteractive.parseInt(params[0], 0, 1)); } return null; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchReader.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchReader.java index 15e0465e9..2a4f9453b 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchReader.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchReader.java @@ -1,5 +1,7 @@ package com.hbm.tileentity.network; +import java.util.Locale; + import com.hbm.interfaces.IControlReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; @@ -44,7 +46,7 @@ public class TileEntityRadioTorchReader extends TileEntityLoadedBase implements if(channel == null || channel.isEmpty()) continue; if(name == null || name.isEmpty()) continue; - String value = prov.provideRORValue(IRORValueProvider.PREFIX_VALUE + name); + String value = prov.provideRORValue(IRORValueProvider.PREFIX_VALUE + name.toLowerCase(Locale.US)); if(value == null) continue; if(polling || !value.equals(previous)) { diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index b639fbb56..8aa8b0df5 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -5,12 +5,16 @@ import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPneumoStorageExporter; import com.hbm.inventory.gui.GUIPneumoStorageExporter; import com.hbm.tileentity.network.RTTYSystem; +import com.hbm.util.BobMathUtil; +import api.hbm.ntl.StackCache; import api.hbm.ntl.StackCache.CacheSlot; import api.hbm.redstoneoverradio.IRORInteractive; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; @@ -24,6 +28,9 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB public int requestMode = 0; /** Item ID and meta pairs with amount for RoR controlled filters */ public short[][] rorFilters = new short[9][3]; + /** Delay for non-forced (i.e. continuous request) grabs, if not successful */ + public int slotDelay[] = new int[9]; + public static final int SLOT_DELAY = 10; /** Each slot individually tries to pull as much as it can of the configured item */ public static final int MODE_AS_MUCH_AS_POSSIBLE = 0; @@ -46,16 +53,153 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB super.updateEntity(); if(!worldObj.isRemote) { + + for(int i = 0; i < 9; i++) { + if(slotDelay[i] > 0) slotDelay[i]--; + } + + if(continuousRequest) { + this.doRequest(false); + } + this.networkPackNT(15); } } public void doRequest(boolean force) { + if(this.requestMode != MODE_FULL_REQUEST) { + // handle all filters individually + for(int i = 0; i < 9; i++) if(!requestSlot(i, force)) this.slotDelay[i] = SLOT_DELAY; + } else { + + // check filter delay if forced pulls aren't active + if(!force) for(int i = 0; i < 9; i++) { + short[] filter = this.getFilter(i); + if(filter != null && slotDelay[i] > 0) return; + } + + // check if filter demands are met and space is free + for(int i = 0; i < 9; i++) { + short[] filter = this.getFilter(i); + if(filter == null) continue; + + int itemId = filter[0]; + Item item = Item.getItemById(itemId); + int meta = filter[1]; + int requestSize = filter[2]; + + int existingSize = 0; + ItemStack existingStack = slots[i]; + + if(existingStack != null) { + if(existingStack.getItem() == item && existingStack.getItemDamage() == meta && !existingStack.hasTagCompound()) { + existingSize = existingStack.stackSize; + } else { + this.slotDelay[i] = SLOT_DELAY; + return; + } + } + + ItemStack newStack = new ItemStack(item, 1, meta); + int capacityLeft = newStack.getMaxStackSize() - existingSize; + + if(capacityLeft < requestSize || getAvailability(itemId, meta) < requestSize) { + this.slotDelay[i] = SLOT_DELAY; + return; + } + } + + // everything is good, pull items. continues should not happen, but are in place nonetheless + for(int i = 0; i < 9; i++) { + short[] filter = this.getFilter(i); + if(filter == null) continue; + + int itemId = filter[0]; + Item item = Item.getItemById(itemId); + int meta = filter[1]; + int requestSize = filter[2]; + + int existingSize = 0; + ItemStack existingStack = slots[i]; + if(existingStack != null) existingSize = existingStack.stackSize; + + ItemStack newStack = new ItemStack(item, 1, meta); + + long hash = StackCache.getStackIdentity(itemId, meta, null); + if(hash == this.cache.getNullIdentity()) continue; // safeguard + + CacheSlot cacheSlot = this.cache.cacheSlots.get(hash); + if(cacheSlot == null) continue; // safeguard + + slots[i] = newStack; + slots[i].stackSize = existingSize + (int) this.cache.consumeItemsAndReturnQuantity(newStack, requestSize); + } + + this.markChanged(); + } } - public void requestSlot(int slot, boolean force) { + /** Returns false if the slot delay should be reset (unsuccessful) or true of not (successful or delay still active) */ + public boolean requestSlot(int slot, boolean force) { + if(!force && slotDelay[slot] > 0) return true; + if(this.cache == null || this.cache.hasExpired) return false; + + short[] filter = this.getFilter(slot); + if(filter == null) return false; + + int itemId = filter[0]; + Item item = Item.getItemById(itemId); + int meta = filter[1]; + int requestSize = filter[2]; + + int existingSize = 0; + ItemStack existingStack = slots[slot]; + + if(existingStack != null) { + if(existingStack.getItem() == item && existingStack.getItemDamage() == meta && !existingStack.hasTagCompound()) { + existingSize = existingStack.stackSize; + } else { + return false; + } + } + + ItemStack newStack = new ItemStack(item, 1, meta); + int capacityLeft = newStack.getMaxStackSize() - existingSize; + + // any non-AMAP mode will fail if it can't insert that much before we even check availability from the pneumo sys + if(capacityLeft < requestSize && this.requestMode != MODE_AS_MUCH_AS_POSSIBLE) return false; + long hash = StackCache.getStackIdentity(itemId, meta, null); + if(hash == this.cache.getNullIdentity()) return false; + + CacheSlot cacheSlot = this.cache.cacheSlots.get(hash); + if(cacheSlot == null) return false; + + // any non-AMAP mode will fail if the system doesn't have the requested amount + if(cacheSlot.stacksize < requestSize && this.requestMode != MODE_AS_MUCH_AS_POSSIBLE) return false; + if(cacheSlot.stacksize <= 0) return false; + + int toPull = (int) BobMathUtil.min(requestSize, cacheSlot.stacksize, capacityLeft); + slots[slot] = newStack; + slots[slot].stackSize = existingSize + (int) this.cache.consumeItemsAndReturnQuantity(newStack, toPull); + this.markChanged(); + + return true; + } + + /** Returns item id, meta and request size for the given filter. Returns null if no filter is specified */ + public short[] getFilter(int slot) { + if(rorConfiguredMode) { + if(Item.getItemById(rorFilters[slot][0]) == null) return null; + return rorFilters[slot]; + } else { + if(slots[slot] != null) { + ItemStack stack = slots[slot]; + return new short[] {(short) Item.getIdFromItem(stack.getItem()), (short) stack.getItemDamage(), (short) stack.stackSize}; + } + return null; + } } public long getAvailability(int item, int meta) { @@ -127,7 +271,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB @Override public String runRORFunction(String name, String[] params) { - if("setfilter".equals(name) && params.length == 4) { + if((PREFIX_FUNCTION + "setfilter").equals(name) && params.length == 4) { int slot = IRORInteractive.parseInt(params[0], 1, 9) - 1; int itemId = IRORInteractive.parseInt(params[1], 0, Short.MAX_VALUE); int meta = IRORInteractive.parseInt(params[2], 0, Short.MAX_VALUE); @@ -140,25 +284,25 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB return null; } - if("setcontinuous".equals(name) && params.length == 1) { + if((PREFIX_FUNCTION + "setcontinuous").equals(name) && params.length == 1) { if("on".equals(params[0])) this.continuousRequest = true; if("off".equals(params[0])) this.continuousRequest = false; this.markChanged(); return null; } - if("request".equals(name)) { + if((PREFIX_FUNCTION + "request").equals(name)) { this.doRequest(true); return null; } - if("requestslot".equals(name) && params.length == 1) { + if((PREFIX_FUNCTION + "requestslot").equals(name) && params.length == 1) { int slot = IRORInteractive.parseInt(params[0], 1, 9) - 1; - this.requestSlot(slot, true); + if(!this.requestSlot(slot, true)) this.slotDelay[slot] = SLOT_DELAY; return null; } - if("checkavailability".equals(name) && params.length == 3) { + if((PREFIX_FUNCTION + "checkavailability").equals(name) && params.length == 3) { int itemId = IRORInteractive.parseInt(params[0], 0, Short.MAX_VALUE); int meta = IRORInteractive.parseInt(params[1], 0, Short.MAX_VALUE); String ret = params[2]; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java index e971b8e6f..863f298e7 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java @@ -96,13 +96,13 @@ public abstract class TileEntityTurretBaseArtillery extends TileEntityTurretBase @Override public String[] getFunctionInfo() { return new String[] { - PREFIX_FUNCTION + "setActive" + NAME_SEPARATOR + "active (0 or 1)", - PREFIX_FUNCTION + "targetPlayers" + NAME_SEPARATOR + "enabled (0 or 1)", - PREFIX_FUNCTION + "targetAnimals" + NAME_SEPARATOR + "enabled (0 or 1)", - PREFIX_FUNCTION + "targetMobs" + NAME_SEPARATOR + "enabled (0 or 1)", - PREFIX_FUNCTION + "targetMachines" + NAME_SEPARATOR + "enabled (0 or 1)", - PREFIX_FUNCTION + "addWhitelist" + NAME_SEPARATOR + "name", - PREFIX_FUNCTION + "removeWhitelist" + NAME_SEPARATOR + "name", + PREFIX_FUNCTION + "setactive" + NAME_SEPARATOR + "active (0 or 1)", + PREFIX_FUNCTION + "targetplayers" + NAME_SEPARATOR + "enabled (0 or 1)", + PREFIX_FUNCTION + "targetanimals" + NAME_SEPARATOR + "enabled (0 or 1)", + PREFIX_FUNCTION + "targetmobs" + NAME_SEPARATOR + "enabled (0 or 1)", + PREFIX_FUNCTION + "targetmachines" + NAME_SEPARATOR + "enabled (0 or 1)", + PREFIX_FUNCTION + "addwhitelist" + NAME_SEPARATOR + "name", + PREFIX_FUNCTION + "removewhitelist" + NAME_SEPARATOR + "name", PREFIX_FUNCTION + "enqueue" + NAME_SEPARATOR + "x" + PARAM_SEPARATOR + "y" + PARAM_SEPARATOR + "z", }; } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 1d75b1679..c9e5e2c8c 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -1062,40 +1062,40 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple @Override public String[] getFunctionInfo() { return new String[] { - PREFIX_FUNCTION + "setActive" + NAME_SEPARATOR + "active (0 or 1)", - PREFIX_FUNCTION + "targetPlayers" + NAME_SEPARATOR + "enabled (0 or 1)", - PREFIX_FUNCTION + "targetAnimals" + NAME_SEPARATOR + "enabled (0 or 1)", - PREFIX_FUNCTION + "targetMobs" + NAME_SEPARATOR + "enabled (0 or 1)", - PREFIX_FUNCTION + "targetMachines" + NAME_SEPARATOR + "enabled (0 or 1)", - PREFIX_FUNCTION + "addWhitelist" + NAME_SEPARATOR + "name", - PREFIX_FUNCTION + "removeWhitelist" + NAME_SEPARATOR + "name", + PREFIX_FUNCTION + "setactive" + NAME_SEPARATOR + "active (0 or 1)", + PREFIX_FUNCTION + "targetplayers" + NAME_SEPARATOR + "enabled (0 or 1)", + PREFIX_FUNCTION + "targetanimals" + NAME_SEPARATOR + "enabled (0 or 1)", + PREFIX_FUNCTION + "targetmobs" + NAME_SEPARATOR + "enabled (0 or 1)", + PREFIX_FUNCTION + "targetmachines" + NAME_SEPARATOR + "enabled (0 or 1)", + PREFIX_FUNCTION + "addwhitelist" + NAME_SEPARATOR + "name", + PREFIX_FUNCTION + "removewhitelist" + NAME_SEPARATOR + "name", }; } @Override public String runRORFunction(String name, String[] params) { - if((PREFIX_FUNCTION + "setActive").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "setactive").equals(name) && params.length > 0) { try { this.isOn = (Integer.parseInt(params[0]) == 1); this.markChanged(); } catch(NumberFormatException e) {} } - if((PREFIX_FUNCTION + "targetPlayers").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "targetplayers").equals(name) && params.length > 0) { try { this.targetPlayers = (Integer.parseInt(params[0]) == 1); this.markChanged(); } catch(NumberFormatException e) {} } - if((PREFIX_FUNCTION + "targetAnimals").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "targetanimals").equals(name) && params.length > 0) { try { this.targetAnimals = (Integer.parseInt(params[0]) == 1); this.markChanged(); } catch(NumberFormatException e) {} } - if((PREFIX_FUNCTION + "targetMobs").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "targetmobs").equals(name) && params.length > 0) { try { this.targetMobs = (Integer.parseInt(params[0]) == 1); this.markChanged(); } catch(NumberFormatException e) {} } - if((PREFIX_FUNCTION + "targetMachines").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "targetmachines").equals(name) && params.length > 0) { try { this.targetMachines = (Integer.parseInt(params[0]) == 1); this.markChanged(); } catch(NumberFormatException e) {} } - if((PREFIX_FUNCTION + "addWhitelist").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "addwhitelist").equals(name) && params.length > 0) { String playerName = params[0]; List whitelist = this.getWhitelist(); if(!whitelist.contains(playerName)) this.addName(playerName); this.markChanged(); } - if((PREFIX_FUNCTION + "removeWhitelist").equals(name) && params.length > 0) { + if((PREFIX_FUNCTION + "removewhitelist").equals(name) && params.length > 0) { String playerName = params[0]; List whitelist = this.getWhitelist(); if(whitelist.contains(playerName)) this.removeName(whitelist.indexOf(playerName)); diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_autocal.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_autocal.png index 9f4121524c1b40b011ce38dcfdaf906b9e06105f..cb5fa04e3b41a87e4d64302e002e37e55572324e 100644 GIT binary patch delta 1875 zcmb`Hc{JOJ7RQr_)>4|+Qd`GTb1?xEI{(iL++u0JV}>f2nCnf%^tTotBKPu!5=0C@mFX- zqQL?&E7}ZnEdOfy-XRhtfy{iZV$ydvY7zRT6XZSQ(&qFE7alm*+)~{bp`kS7FBtNU zq8h$wqbqE>e1y7c7+>0V$>1Nl)?FhN8CO*-B*Q9XUAQ>80~EYO7jex zq`7~)0x&JtIgU69jtNSB1~QHc-O{+Re3Le{&9k0(U=7W*VOrcz;+n&TXpa>ixG=o@ zS5i*KQICN1lfU-9aAQPHw3m_ZsSPX!T$(0Ju51}Z{v}K4pI+*PRDfK%=dPpPeWtGF zsN$$D&*}#dYtEm#@d#bl$3A<)s<9%R4T>lKbdBrc;)a&Sn)|Db9pjeHYzH4Xdck7Pw0IRu~LZxnQaTX{I zFN>KxWYlA}MOawaulNh0*E^)80lTa_1ulb=K*R@0yl&FZoe*OyX}Y-SsvpNbRAf6& z-+VbsuujHe&k%-JHfQO#-7ckmjz(2Wbae3j??pl(ufU~1FLyNqtOazF3c;)gz)b3b ze~NvPdOxo_GVra~)jEXn03p&GGvvOLovxl^9wd0|V4uQ*LI?lVFBS#wpiq274iMYh zYp3AB;T#x;-&fp)WNh9XRj@C!?{Re83eec4#RLGl6bx(n;`07h?C z@A#3&>k?>_H?Q5(FFx~OQN6P;wQ2~NNI+1$5l$M#)rYqwbRU&y!QNQ3F?%HM>FQ;@ zSKrr`LIS?vbkC#V{ge_8Fb_Nzuhh8#>&*n0(`nx%cu7Mlv~k#p;nYp%6HjpvO4{XQ zu)Z*K+~)1Ea)(?&bxU2d))m=gFv!x;bK}WE7JAzMRmE5EXU!JSQ8i`)Y;0c`>v{cn zWtYEsq`aoTkp=`CUHvSzO77++=xhHfxFc5CiQ*k|-Ey@7Z+a6@*er9=(-+_4B3jt$ zxeNXqH^+3CkAV)l=BPJmiqtY?eSWJRLL_UK>IOKVq{^S=&&wbdUAs1sB-1Q13L2=l z)vRwZe>{KJ2nG+q&R&3TBM;%L6)t9)_v`u4Kzg))*#RD09@?y2rk%cQt*jX(>;q;h zuGO9gb0=efktp_aDPn@0sH!DvWjtJ^W>Md$1bDPrLGQ47XfRBe>Rc?6upPMQBTT-v zvTt=*Whc5~9Yi*GeL|`A6l8d%z0(Z8T&Sp8U9=S z+}`KURmf!WUEdV;r_RHlF>U2~xgj0e%NhslHNad%&tNTH{QZYjEMBNQR;i_R%IxUM zlW`ynHU})TJq^kqH15lgH8tbFm*QKM-}(%eY2rX-?VBG`c&!6vjolqH2R%6jU2z1$ z$B!R%MS`5~KsPEuIrmjTH|97iQ~AVj0o2mA)@PWE#y#<^Q|6lJN@&YJ`ge{1Uw}T3 zf9L7q;f2=4Fa6lI|@59zr~G4~|2K0EYbGxojD%@Y z4O2R;2MCxE^@gc99SJyP;J3YGA!-SHKEG9@^k_#V{-LU>Ze4>yDMt6}v^%m}hM=SH MaPzs=>Kd8%Z~3N_4gdfE delta 1862 zcmcJPYc$&l8pacsO0lY)nAqwRtJ8KE6UVJnt^8AEwxd&}hO{K17G>NoY1#;Xx5_C~ zOx;FNLEC8&Az9**qS6*y5k}M{sSMf)f<}erZq1(kuwVA$ykDO4zVA7|^FHr~M|(ha zpx7B|*XHs73f{SeR$~>l1u*#3VkJJsI(oPf1l`BDbz}AZ!i{k6tp@W_Nr*ztLS!4 zL_musL{uZuJ+3_aB*pK-UQ#Elj}cR@h(fU{N%f;#H%uOT((o zyO{*J?6-ex*A+-466w-L$=iFZF9Tm2w63aw;1hj5WvHz2D0m^By#E7O0icv2Hnrj% zRl&|Z(<6U}jGgj=N~b17uSHS{r*+E;mRa3}%A8MJnz$^Rpm2ir0qKIV455t^)WIAy z9;lk4ch4do|9%EGk28`SjcU;kJ+Ozgc4l3|7{Euo@!a~s+_ap8h%{8mqB6=flr92e z&^Id0t>&IlanI)n9Tm^W1HFOi(7eNh@MQTf8+4k!8-+<`XJ#sww*b}ef=*V(w${uK zmPv9fNJ;{lL{BYk ze9QuXZScWz-;e%~^+$}lUg5_i5oA+nQH&4zTFs8F2D&c~wL{*4yOX&qHxl|A5eitA z_kTKhG{3pE2`;mh9QC$@5P7!xG&v&K+LXwloW*Rlhekuxt3B_30EShIi&7pB*k_$9 zmE`Pk6mzc1IU=8+nK`$TIxH3|%n&_Slf_~&Ya-%d$J0xI!hd=vf_tp-WZh8u_fJT3 zmX=c>>23uEGyjW1|H8=X2hMf}@%r^ZMH^?{0gK0v%BuKJk!Y;xlQ??mU$YL1;Z)Db z!m;tF?{C1dtm7a2e`H0Ms1O$$@Kw88e>(^skK?MlA1}YJJ7@}eTJWYufx-B-<$A6Bv{b`lfPpYmGvB-s5OzJf%pUWNxI_ua z4x1?PglpR96Yv(26Ms1T*X8JQLOxPZLGZ9jtG#wq_crR&YO}s!^rwL% zi^BDB52eeLQJv5kKevR*IaPhRN5_a?9nQ@qj#rda0Xu6d<| ztvsHPA#F+GTioG%ce|zGa7U-G{U^38qLmcIoVLF3%==9+><%8rFLz4_>y>||DJUcO zMmAQrgx6$TNkW+2U^hoSr#5yiAeYQX))DBgG77Zm&`b~eZ>|4I44Fg^qs&WpGJVGx zJ@I~7^j|UiS$d91R&d<0*1MmVWIz9CL=^_vXEyh%GQLQJF~ypujw37Bz0-NFr%Vc7 zzMHz)OFj=$mx%3U@ExHl_8Y1v~zwQ`+NYhgquj!#v0eZ2Xs zTX-(gJh9Bw+=N1N*-)X>Q+#c^(hUJmjfVL~MMKyCD!zkBU#`R*oSS>`!mE?b#-`O5 zJfcrtj7xhs0^{e?pNZt!~HZiIom8P>KM|IE4n0kzlx3fWsF(T!s28ZT8; zLd=c#%yT6e+?rAA)f9UO(J(J{NjEb$?&2^0MEyKZ?j738Dg7_m7o42KuU#AL1P!Wn z&;xpqBi}*L105!{hsmp?W1&ASrylH8uf(M5*iV~0n+7zIrH$@BP^+s>7#;5*B{(46 zj2yuklDD}m+^WII*JRRf{8ZilA^jKlCkgn+v40Z#|DroK0pmS6iE*eFw;t`ttZ!zMC Ax&QzG diff --git a/src/main/resources/assets/hbm/textures/items/plate_dura_steel.png b/src/main/resources/assets/hbm/textures/items/plate_dura_steel.png index a33109cafc6ddba07e8882e93894748f0ea1ecbe..68b0b8330aadf398a3f01d9af437f84c3e772014 100644 GIT binary patch delta 269 zcmV+o0rLKm0=NQ@G=J|&L_t(Ijn&dIP69y`#_|6QW{+THb_-0T-ezMZyT>4OFL(+y zW{+W*4$c9V+yMxLfC(`nHpW=^tag=kAV_0;)nwlMzPy|kF~L|38lmR>u149V=KXHD4jQ2np6b5;P=*xvcd!zYUAK>bm5}4$U(_d{8HGR$ T3aW$v0000q(`t4v#5j{G+k-u7-H9O3M_gI zbcbV5OLx$P2sYLt7JXJUYFgEenC;8&pEr{M{^O8fkYL?N6oJyUpn4tXB9sXMNY{ed zFkeQ?$pYZ`>8L2oiqJPu7pZ^*`?E2^byx^GZ3h4lZ6oYf8($`nV53>XU^vQ+JYWz6 zI2{kTU9Q0XoLoV=7Cg^;i)29n0LPR(Vrr95P`@V$mda*-K4qzFHd=K?y~=qXNgGl9 gZV8x*l!L!GcYtkaDLmJl>h($ From df82ed049c68ac4f561adca6393249eae0af7473 Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Thu, 2 Jul 2026 18:58:05 +0300 Subject: [PATCH 049/107] 1 --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index b273adfa1..3b6dae6e4 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -5618,7 +5618,7 @@ tile.machine_telelinker.name=Стол телелинка tile.machine_teleporter.name=Телепорт tile.machine_thresher.name=Автоматическая молотилка tile.machine_thresher.desc=Сбор урожая и повторная посадка культур.$Принимает:$-Древесное масло$-Этанол$-Рыбное масло$-Тяжёлую нефть$-Креозот из угольной смолы -tile.machine_thresher.suspended=Suspended +tile.machine_thresher.suspended=Приостановлена tile.machine_tower_large.name=Градирня tile.machine_tower_small.name=Вспомогательная градирня tile.machine_transformer.name=Трансформатор 10k-20Гц From 44dc35f9cdd8c21ff76def5bbe13f1bc3d50188d Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Thu, 2 Jul 2026 20:28:30 +0300 Subject: [PATCH 050/107] Ag --- .../resources/assets/hbm/manual/machine/heatsource.json | 2 +- src/main/resources/assets/hbm/manual/machine/oilburner.json | 2 +- .../resources/assets/hbm/manual/machine/solarboiler.json | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/machine/heatsource.json b/src/main/resources/assets/hbm/manual/machine/heatsource.json index e6f4acf4e..2c695f1f3 100644 --- a/src/main/resources/assets/hbm/manual/machine/heatsource.json +++ b/src/main/resources/assets/hbm/manual/machine/heatsource.json @@ -10,6 +10,6 @@ "content": { "en_US": "Many machines require TU - thermal units - to function. TU is transfered via copper contacts on the undersides of machines, they cannot be connected with pipes or cables.

Machines that can provide heat are:
[[Firebox]]
[[Heating Oven]]
[[Fluid Burner]]
[[Electric Heater]]
[[Heat Exchanging Heater]]

Machines that use TU include, but are not limited to:
[[Stirling Engine]]
[[Combination Oven]]
[[Boiler]]
[[Steel Furnace]]
[[Crucible]]", "zh_CN": "很多机器需要TU——“热量单位”才能工作。TU通过机器底部的铜触点进行传输, 而不能用线缆或管道等传输。

可提供热量的机器包括但不限于:
[[燃烧室|Firebox]]
[[加热炉|Heating Oven]]
[[流体燃烧器|Fluid Burner]]
[[电加热器|Electric Heater]]
[[换热加热器|Heat Exchanging Heater]]

使用TU的机器包括但不限于:
[[斯特林发电机|Stirling Engine]]
[[复式炼焦炉|Combination Oven]]
[[锅炉|Boiler]]
[[钢炉|Steel Furnace]]
[[坩埚|Crucible]]", - "ru_RU": "Для работы многих машин требуются TU — тепловые единицы. Машины передают TU через медные контакты, они не могут быть соединены трубами или проводами.

К устройствам, которые могут подавать тепло, относятся:
[[Топка|Firebox]]
[[Нагревательная печь|Heating Oven]]
[[Жидкостный котёл|Fluid Burner]]
[[Электрический нагреватель|Electric Heater]]
[[Теплообменный нагреватель|Heat Exchanging Heater]]

Вот некоторые примеры машин, использующих TU:
[[Генератор Стирлинга|[Stirling Engine]]
[[Коксовая печь|Combination Oven]]
[[Бойлер|Boiler]]
[[Стальная печь|[Steel Furnace]]
[[Плавильня|Crucible]]" + "ru_RU": "Для работы многих машин требуются TU — тепловые единицы. Машины передают TU через медные контакты, они не могут быть соединены трубами или проводами.

К устройствам, которые могут подавать тепло, относятся:
[[Топка|Firebox]]
[[Нагревательная печь|Heating Oven]]
[[Жидкостная горелка|Fluid Burner]]
[[Электрический нагреватель|Electric Heater]]
[[Теплообменный нагреватель|Heat Exchanging Heater]]

Вот некоторые примеры машин, использующих TU:
[[Генератор Стирлинга|[Stirling Engine]]
[[Коксовая печь|Combination Oven]]
[[Бойлер|Boiler]]
[[Стальная печь|[Steel Furnace]]
[[Литейный тигель|Crucible]]" } } diff --git a/src/main/resources/assets/hbm/manual/machine/oilburner.json b/src/main/resources/assets/hbm/manual/machine/oilburner.json index 7f20c49a4..a8829bd07 100644 --- a/src/main/resources/assets/hbm/manual/machine/oilburner.json +++ b/src/main/resources/assets/hbm/manual/machine/oilburner.json @@ -5,7 +5,7 @@ "title": { "en_US": "Fluid Burner", "zh_CN": "流体燃烧器", - "ru_RU": "Жидкостный котёл" + "ru_RU": "Жидкостная горелка" }, "content": { "en_US": "An [[external heat source|External Heat Source]] powered by flammable fluids, usually derivatives of [[oil|Crude Oil]]. Needs to be turned on in the GUI to function. The flow rate can be increased using a screwdriver, from 1mB/t to 10mB/t.", diff --git a/src/main/resources/assets/hbm/manual/machine/solarboiler.json b/src/main/resources/assets/hbm/manual/machine/solarboiler.json index 784b12884..8f3c7f55f 100644 --- a/src/main/resources/assets/hbm/manual/machine/solarboiler.json +++ b/src/main/resources/assets/hbm/manual/machine/solarboiler.json @@ -3,9 +3,11 @@ "icon": ["hbm:tile.machine_solar_boiler", 1, 0], "trigger": [["hbm:tile.machine_solar_boiler"], ["hbm:tile.solar_mirror"]], "title": { - "en_US": "Solar Tower Boiler" + "en_US": "Solar Tower Boiler", + "ru_RU": "Бойлер солнечной башни" }, "content": { - "en_US": "The solar tower boiler is a simple machine that can turn water into steam. It requires focused sunlight to do so, coming from heliostat mirrors. Right-click the boiler to save its position, then click on the mirrors that should be pointed at this boiler. Mirrors cannot be tilted past 45°, so it is important to put the boiler at an elevated position (hence solar TOWER boiler). In other words: The horizontal distance between the mirrors and the boiler cannot exceed the vertical distance. Consequently, the higher up the boiler is, the more mirrors can be connected to it.

Due to the boiler running off of sunlight, it will not work during the night. But you already knew that. Sunlight is also not very powerful, so in order to bring water to a boil, about a dozen mirrors are required at minimum.

The boiler has no GUI, nor can water be inserted directly, it needs to be supplied via pipes. The resulting steam can then be used in a [[steam engine|Steam Engine]], yielding power and low-pressure steam, which can then be [[condensed|Condenser]] back into usable water." + "en_US": "The solar tower boiler is a simple machine that can turn water into steam. It requires focused sunlight to do so, coming from heliostat mirrors. Right-click the boiler to save its position, then click on the mirrors that should be pointed at this boiler. Mirrors cannot be tilted past 45°, so it is important to put the boiler at an elevated position (hence solar TOWER boiler). In other words: The horizontal distance between the mirrors and the boiler cannot exceed the vertical distance. Consequently, the higher up the boiler is, the more mirrors can be connected to it.

Due to the boiler running off of sunlight, it will not work during the night. But you already knew that. Sunlight is also not very powerful, so in order to bring water to a boil, about a dozen mirrors are required at minimum.

The boiler has no GUI, nor can water be inserted directly, it needs to be supplied via pipes. The resulting steam can then be used in a [[steam engine|Steam Engine]], yielding power and low-pressure steam, which can then be [[condensed|Condenser]] back into usable water.", + "ru_RU": "Бойлер солнечной башни это простое устройство, способное превращать воду в пар. Для работы ему необходим сфокусированный солнечный свет, отражаемый зеркалами-гелиостатами. Щелкните правой кнопкой мыши по бойлеру, чтобы сохранить его положение, а затем нажмите по зеркалам, которые должны быть направлены на этот бойлер. Зеркала невозможно наклонить более чем на 45°, поэтому важно размещать бойлер на возвышении (отсюда и название: бойлер солнечной БАШНИ). Иными словами: горизонтальное расстояние между зеркалами и бойлером не должно превышать вертикальное. Следовательно, чем выше расположен бойлер, тем больше зеркал к нему можно подключить. Поскольку бойлер работает от солнечного света, ночью он функционировать не будет. Но вы это и так знали. Солнечный свет сам по себе не очень мощный, поэтому, чтобы довести воду до кипения, требуется как минимум около десятка зеркал. У бойлера нет графического интерфейса (GUI), и воду в него нельзя залить напрямую — её необходимо подавать по трубам. Полученный пар затем можно использовать в [[паровой двигатель|Steam Engine]], что даст энергию и пар низкого давления, который впоследствии можно [[конденсировать|Condenser]] обратно в пригодную для использования воду." } } From 07fbc9913356af4b0d6621a21031fa5f699b0dcc Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 3 Jul 2026 14:24:21 +0200 Subject: [PATCH 051/107] =?UTF-8?q?=E3=80=8C=20FLOWER=20MAN=20=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog | 25 +++++++ src/main/java/com/hbm/config/MobConfig.java | 6 +- .../entity/mob/ai/EntityAIMaskmanMinigun.java | 52 +++++++------- .../java/com/hbm/extprop/HbmPlayerProps.java | 26 ++++--- .../com/hbm/handler/BossSpawnHandler.java | 67 ++++++++++++------- .../inventory/recipes/SolderingRecipes.java | 6 +- .../TileEntityPneumoStorageExporter.java | 13 +++- 7 files changed, 126 insertions(+), 69 deletions(-) diff --git a/changelog b/changelog index d1aa96597..0aa6c7939 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,17 @@ +## Added +* Pneumatic Storage System + * Mass storage logistics system that can perform various automation tasks + * Items can be stored in clutter storages (steel crate equivalent) or mono type storages (ironically supports three types set using filters holding several thousand items) + * In order to be accessible, all storages need a supply of compressed air with the compression level dictating range + * Access points allow items to be retrieved and inserted manually + * Access points have a search function as well as several sorting options + * Importers allow hopper IO to add items to the network + * Exporters allow items to be retrieved and then taken using hopper IO, things like filters and request rules can be defined in several ways + * Allows continuous request and request on demand (redstone or RoR command) + * Filters can be set using items or RoR commands + * Requests can be configured to take as much as possible, to only take full stacks, or to only take full requests + * In combination with assembler recipe switching, using RoR logic, this means that on-demand recipe automation is now possible + ## Changed * Updated chinese localization * Watz powerplant now has OC and RoR integration @@ -45,6 +59,17 @@ * Polling for receiving only fresh RoR signals * A command for writing the world time to the buffer, allowing for more precise timers * All RoR values/commands are now case-insensitive +* Changed mask man spawning rules + * Instead of random checks and chances, if a player meets the requirements, a timer starts (timer exists per player) + * Once this timer runs out, mask man spawns + * Should the timer run out but the spawn be unsuccessful (spawn restrictions) then a different message appears + * If the requirements are no longer met, the timer immediately resets, making it easier to avoid him deliberately + * The default spawn timer is now 20 minutes, making it easier to spawn him deliberately + * One minute before the timer ends, a warning message appears +* Changed normal mode control unit recipes + * Standard control units now use rubber instead of speed I upgrades + * Advanced control units now use hardplastics instead of speed III upgrades + * Quantum computers now use speed III upgrades instead of overdrive I ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised diff --git a/src/main/java/com/hbm/config/MobConfig.java b/src/main/java/com/hbm/config/MobConfig.java index f5b583df0..337a32754 100644 --- a/src/main/java/com/hbm/config/MobConfig.java +++ b/src/main/java/com/hbm/config/MobConfig.java @@ -5,8 +5,7 @@ import net.minecraftforge.common.config.Configuration; public class MobConfig { public static boolean enableMaskman = true; - public static int maskmanDelay = 60 * 60 * 60; - public static int maskmanChance = 3; + public static int maskmanDelay = 20 * 60; // 20 minutes public static int maskmanMinRad = 50; public static boolean maskmanUnderground = true; @@ -78,8 +77,7 @@ public class MobConfig { final String CATEGORY = CommonConfig.CATEGORY_MOBS; enableMaskman = CommonConfig.createConfigBool(config, CATEGORY, "12.M00_enableMaskman", "Whether mask man should spawn", true); - maskmanDelay = CommonConfig.createConfigInt(config, CATEGORY, "12.M01_maskmanDelay", "How many world ticks need to pass for a check to be performed", 60 * 60 * 60); - maskmanChance = CommonConfig.createConfigInt(config, CATEGORY, "12.M02_maskmanChance", "1:x chance to spawn mask man, must be at least 1", 3); + maskmanDelay = CommonConfig.createConfigInt(config, CATEGORY, "12.M01_maskmanTimer", "How many world seconds need to pass for mask man to spawn, if the requirements are met", 20 * 60); maskmanMinRad = CommonConfig.createConfigInt(config, CATEGORY, "12.M03_maskmanMinRad", "The amount of radiation needed for mask man to spawn", 50); maskmanUnderground = CommonConfig.createConfigBool(config, CATEGORY, "12.M04_maskmanUnderound", "Whether players need to be underground for mask man to spawn", true); diff --git a/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java b/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java index c794a1d3b..3d451b9d5 100644 --- a/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java +++ b/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java @@ -9,43 +9,45 @@ import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.util.Vec3; public class EntityAIMaskmanMinigun extends EntityAIBase { - + private EntityCreature owner; - private EntityLivingBase target; - int delay; - int timer; + private EntityLivingBase target; + int delay; + int timer; public EntityAIMaskmanMinigun(EntityCreature owner, boolean checkSight, boolean nearbyOnly, int delay) { this.owner = owner; this.delay = delay; - timer = delay; + this.timer = delay; } @Override public boolean shouldExecute() { - - EntityLivingBase entity = this.owner.getAttackTarget(); - if(entity == null) { - return false; - - } else { - this.target = entity; - double dist = Vec3.createVectorHelper(target.posX - owner.posX, target.posY - owner.posY, target.posZ - owner.posZ).lengthVector(); - return dist > 5 && dist < 10; - } + EntityLivingBase entity = this.owner.getAttackTarget(); + + if(entity == null || !entity.isEntityAlive()) { + return false; + } else { + this.target = entity; + double dist = Vec3.createVectorHelper(target.posX - owner.posX, target.posY - owner.posY, target.posZ - owner.posZ).lengthVector(); + return dist > 5 && dist < 10; + } } - - @Override - public boolean continueExecuting() { - return this.shouldExecute() || !this.owner.getNavigator().noPath(); - } @Override - public void updateTask() { - + public boolean continueExecuting() { + return this.shouldExecute() || !this.owner.getNavigator().noPath(); + } + + @Override + public void updateTask() { + timer--; - + + // TEST + if(target != null) this.owner.getLookHelper().setLookPositionWithEntity(this.target, 15F, 15F); + if(timer <= 0) { timer = delay; @@ -53,7 +55,7 @@ public class EntityAIMaskmanMinigun extends EntityAIBase { owner.worldObj.spawnEntityInWorld(bullet); owner.playSound("hbm:weapon.calShoot", 1.0F, 1.0F); } - + this.owner.rotationYaw = this.owner.rotationYawHead; - } + } } diff --git a/src/main/java/com/hbm/extprop/HbmPlayerProps.java b/src/main/java/com/hbm/extprop/HbmPlayerProps.java index 292c04412..29983c7df 100644 --- a/src/main/java/com/hbm/extprop/HbmPlayerProps.java +++ b/src/main/java/com/hbm/extprop/HbmPlayerProps.java @@ -25,35 +25,43 @@ public class HbmPlayerProps implements IExtendedEntityProperties { public static final String key = "NTM_EXT_PLAYER"; public EntityPlayer player; - public boolean hasReceivedBook = false; - + /* Toggles for keybind */ public boolean enableHUD = true; public boolean enableBackpack = true; public boolean enableMagnet = true; + /** Keybind tracking */ private boolean[] keysPressed = new boolean[EnumKeybind.values().length]; + + /* Dashes for bismuth armor/cloud in a bottle */ public boolean dashActivated = true; - - public static final int dashCooldownLength = 5; public int dashCooldown = 0; - public int totalDashCount = 0; public int stamina = 0; + public static final int dashCooldownLength = 5; - public static final int plinkCooldownLength = 10; + /** Cooldown for armor plinking noise when canceling damage */ public int plinkCooldown = 0; + public static final int plinkCooldownLength = 10; + /** Shield infusion */ public float shield = 0; public float maxShield = 0; public int lastDamage = 0; public static final float shieldCap = 100; + /** Latnern repair/destroy count */ public int reputation; + /** Hack for allowing ladders on multiblocks */ public boolean isOnLadder = false; + /** Pulling the pin on a grenade - it's a player prop instead of an NBT trait */ public int grenadeDeployment; + + /** Maskman timer */ + public int maskManTimer = 0; public HbmPlayerProps(EntityPlayer player) { this.player = player; @@ -187,7 +195,6 @@ public class HbmPlayerProps implements IExtendedEntityProperties { public void init(Entity entity, World world) { } public void serialize(ByteBuf buf) { - buf.writeBoolean(this.hasReceivedBook); buf.writeFloat(this.shield); buf.writeFloat(this.maxShield); buf.writeBoolean(this.enableBackpack); @@ -199,7 +206,6 @@ public class HbmPlayerProps implements IExtendedEntityProperties { public void deserialize(ByteBuf buf) { if(buf.readableBytes() > 0) { - this.hasReceivedBook = buf.readBoolean(); this.shield = buf.readFloat(); this.maxShield = buf.readFloat(); this.enableBackpack = buf.readBoolean(); @@ -216,7 +222,6 @@ public class HbmPlayerProps implements IExtendedEntityProperties { NBTTagCompound props = new NBTTagCompound(); - props.setBoolean("hasReceivedBook", hasReceivedBook); props.setFloat("shield", shield); props.setFloat("maxShield", maxShield); props.setBoolean("enableBackpack", enableBackpack); @@ -224,6 +229,7 @@ public class HbmPlayerProps implements IExtendedEntityProperties { props.setBoolean("enableHUD", enableHUD); props.setInteger("reputation", reputation); props.setBoolean("isOnLadder", isOnLadder); + props.setInteger("maskManTimer", maskManTimer); nbt.setTag("HbmPlayerProps", props); } @@ -235,7 +241,6 @@ public class HbmPlayerProps implements IExtendedEntityProperties { NBTTagCompound props = (NBTTagCompound) nbt.getTag("HbmPlayerProps"); if(props != null) { - this.hasReceivedBook = props.getBoolean("hasReceivedBook"); this.shield = props.getFloat("shield"); this.maxShield = props.getFloat("maxShield"); this.enableBackpack = props.getBoolean("enableBackpack"); @@ -243,6 +248,7 @@ public class HbmPlayerProps implements IExtendedEntityProperties { this.enableHUD = props.getBoolean("enableHUD"); this.reputation = props.getInteger("reputation"); this.isOnLadder = props.getBoolean("isOnLadder"); + this.maskManTimer = props.getInteger("maskManTimer"); } } } diff --git a/src/main/java/com/hbm/handler/BossSpawnHandler.java b/src/main/java/com/hbm/handler/BossSpawnHandler.java index 756d1f1d8..a73a36bbe 100644 --- a/src/main/java/com/hbm/handler/BossSpawnHandler.java +++ b/src/main/java/com/hbm/handler/BossSpawnHandler.java @@ -13,6 +13,7 @@ import com.hbm.entity.mob.EntityMaskMan; import com.hbm.entity.mob.EntityRADBeast; import com.hbm.entity.projectile.EntityMeteor; import com.hbm.extprop.HbmLivingProps; +import com.hbm.extprop.HbmPlayerProps; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.util.ContaminationUtil; @@ -29,6 +30,7 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.Vec3; +import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.event.ForgeEventFactory; @@ -45,33 +47,44 @@ public class BossSpawnHandler { * - the player has at least 50 RAD * - the player has either crafted or placed an ore acidizer before */ - if(MobConfig.enableMaskman) { - - if(world.getTotalWorldTime() % MobConfig.maskmanDelay == 0) { - - if(world.rand.nextInt(MobConfig.maskmanChance) == 0 && !world.playerEntities.isEmpty() && world.provider.isSurfaceWorld()) { //33% chance only if there is a player online - - EntityPlayer player = (EntityPlayer) world.playerEntities.get(world.rand.nextInt(world.playerEntities.size())); //choose a random player - int id = Item.getIdFromItem(Item.getItemFromBlock(ModBlocks.machine_crystallizer)); - - StatBase statCraft = StatList.objectCraftStats[id]; - StatBase statPlace = StatList.objectUseStats[id]; - - if(!(player instanceof EntityPlayerMP)) return; - EntityPlayerMP playerMP = (EntityPlayerMP) player; - - boolean acidizerStat = !GeneralConfig.enableStatReRegistering || (statCraft != null && playerMP.func_147099_x().writeStat(statCraft) > 0)|| (statPlace != null && playerMP.func_147099_x().writeStat(statPlace) > 0); - - if(acidizerStat && ContaminationUtil.getRads(player) >= MobConfig.maskmanMinRad && (world.getHeightValue((int)player.posX, (int)player.posZ) > player.posY + 3 || !MobConfig.maskmanUnderground)) { //if the player has more than 50 RAD and is underground - - player.addChatComponentMessage(new ChatComponentText("The mask man is about to claim another victim.").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); - + if(MobConfig.enableMaskman && world.getTotalWorldTime() % 20 == 0 && world.provider.isSurfaceWorld() && world.difficultySetting != EnumDifficulty.PEACEFUL) { + + for(Object o : world.playerEntities) { + if(!(o instanceof EntityPlayerMP)) return; + EntityPlayerMP player = (EntityPlayerMP) o; + + int id = Item.getIdFromItem(Item.getItemFromBlock(ModBlocks.machine_crystallizer)); + StatBase statCraft = StatList.objectCraftStats[id]; + StatBase statPlace = StatList.objectUseStats[id]; + + boolean acidizerStat = !GeneralConfig.enableStatReRegistering || (statCraft != null && player.func_147099_x().writeStat(statCraft) > 0)|| (statPlace != null && player.func_147099_x().writeStat(statPlace) > 0); + boolean hasRads = ContaminationUtil.getRads(player) >= MobConfig.maskmanMinRad; + boolean underground = world.getHeightValue((int) Math.floor(player.posX), (int) Math.floor(player.posZ)) > player.posY + 3 || !MobConfig.maskmanUnderground; + + if(acidizerStat && hasRads && underground) { + HbmPlayerProps data = HbmPlayerProps.getData(player); + + data.maskManTimer++; + + if(data.maskManTimer == MobConfig.maskmanDelay - 20 * 60) { + player.addChatComponentMessage(new ChatComponentText("The mask man draws near.").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + } + + if(data.maskManTimer >= MobConfig.maskmanDelay) { + data.maskManTimer = 0; + double spawnX = player.posX + world.rand.nextGaussian() * 20; double spawnZ = player.posZ + world.rand.nextGaussian() * 20; - double spawnY = world.getHeightValue((int)spawnX, (int)spawnZ); - - trySpawn(world, (float)spawnX, (float)spawnY, (float)spawnZ, new EntityMaskMan(world)); + double spawnY = world.getHeightValue((int) Math.floor(spawnX), (int) Math.floor(spawnZ)); + if(trySpawn(world, (float) spawnX, (float) spawnY, (float) spawnZ, new EntityMaskMan(world))) { + player.addChatComponentMessage(new ChatComponentText("The mask man is about to claim another victim.").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + } else { + player.addChatComponentMessage(new ChatComponentText("Seems like mask man couldn't come today.").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.BLUE))); + } } + + } else { + HbmPlayerProps.getData(player).maskManTimer = 0; } } } @@ -169,8 +182,7 @@ public class BossSpawnHandler { } } - private static void trySpawn(World world, float x, float y, float z, EntityLiving e) { - + private static boolean trySpawn(World world, float x, float y, float z, EntityLiving e) { e.setLocationAndAngles(x, y, z, world.rand.nextFloat() * 360.0F, 0.0F); Result canSpawn = ForgeEventFactory.canEntitySpawn(e, world, x, y, z); @@ -179,7 +191,10 @@ public class BossSpawnHandler { world.spawnEntityInWorld(e); ForgeEventFactory.doSpecialSpawn(e, world, x, y, z); e.onSpawnWithEgg(null); + return true; } + + return false; } public static void markFBI(EntityPlayer player) { diff --git a/src/main/java/com/hbm/inventory/recipes/SolderingRecipes.java b/src/main/java/com/hbm/inventory/recipes/SolderingRecipes.java index 5f03dcd54..dd88e66f6 100644 --- a/src/main/java/com/hbm/inventory/recipes/SolderingRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/SolderingRecipes.java @@ -118,7 +118,7 @@ public class SolderingRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, lbsm ? 8 : 16, EnumCircuitType.CAPACITOR_TANTALIUM)}, new AStack[] { new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_CHASSIS), - new ComparableStack(ModItems.upgrade_speed_1)}, + new OreDictStack(RUBBER.ingot(), 4)}, new AStack[] { new OreDictStack(PB.wireFine(), 16)} )); @@ -130,7 +130,7 @@ public class SolderingRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ATOMIC_CLOCK)}, new AStack[] { new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_CHASSIS), - new ComparableStack(ModItems.upgrade_speed_3)}, + new OreDictStack(ANY_HARDPLASTIC.ingot(), 4)}, new AStack[] { new OreDictStack(PB.wireFine(), 24)} )); @@ -142,7 +142,7 @@ public class SolderingRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, lbsm ? 1 : 8, EnumCircuitType.ATOMIC_CLOCK)}, new AStack[] { new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER_ADVANCED), - new ComparableStack(ModItems.upgrade_overdrive_1)}, + new ComparableStack(ModItems.upgrade_speed_3)}, new AStack[] { new OreDictStack(PB.wireFine(), 32)} )); diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index 8aa8b0df5..4ff0410be 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -18,7 +18,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver { +public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver { // TODO: NBT serialization + // TODO: also maybe test all of this first + // TODO: more energy drincc + // TODO: the lion does not concern himself with chest pains, it's just the feeling of the heart screaming for more redbull /** If requests should be pulled repeatedly every tick */ public boolean continuousRequest = false; @@ -38,6 +41,8 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB public static final int MODE_FULL_STACK = 1; /** All request slots try to pull the desired quantities simultaneously */ public static final int MODE_FULL_REQUEST = 2; + + public boolean lastRedstone = false; public TileEntityPneumoStorageExporter() { super(18); @@ -57,11 +62,17 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB for(int i = 0; i < 9; i++) { if(slotDelay[i] > 0) slotDelay[i]--; } + + boolean redstone = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); if(continuousRequest) { this.doRequest(false); + } else { + if(redstone && !lastRedstone) this.doRequest(true); } + this.lastRedstone = redstone; + this.networkPackNT(15); } } From f916c6294b1cf733cba5d344d894eadf5a34b1cf Mon Sep 17 00:00:00 2001 From: HbmMods Date: Fri, 3 Jul 2026 21:40:09 +0200 Subject: [PATCH 052/107] "he's a flower, what the fuck is happening" "jarona :)" --- changelog | 2 + .../gui/GUIPneumoStorageExporter.java | 25 ++++++++- src/main/java/com/hbm/module/ParseMSES1.java | 5 +- .../java/com/hbm/tileentity/TileMappings.java | 7 +-- .../TileEntityPneumoStorageExporter.java | 55 +++++++++++++++---- 5 files changed, 76 insertions(+), 18 deletions(-) diff --git a/changelog b/changelog index 0aa6c7939..7ac809e1b 100644 --- a/changelog +++ b/changelog @@ -11,6 +11,7 @@ * Filters can be set using items or RoR commands * Requests can be configured to take as much as possible, to only take full stacks, or to only take full requests * In combination with assembler recipe switching, using RoR logic, this means that on-demand recipe automation is now possible + * The budget didn't cover actually testing this so uh, you go figure it out ## Changed * Updated chinese localization @@ -81,3 +82,4 @@ * Fixed `anyBismoid` group not being a proper group, causing other mods' bismuth and arsenic to not be included * Fixed RoR gauge not using SI suffixes on values below 0 * Fixed AUTOCAL units not closing their GUI when the unit is destroyed +* Fixed AUTOCAL's $buffer$ substitution not working diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageExporter.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageExporter.java index 2f7001c41..3a0164a54 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageExporter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoStorageExporter.java @@ -9,6 +9,7 @@ import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageExporter; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; public class GUIPneumoStorageExporter extends GuiInfoContainer { @@ -27,6 +28,25 @@ public class GUIPneumoStorageExporter extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { super.drawScreen(x, y, interp); + + this.drawCustomInfoStat(x, y, guiLeft + 142, guiTop + 16, 18, 18, x, y, "Request mode: " + EnumChatFormatting.YELLOW + (this.importer.continuousRequest ? "Continuous" : "By request")); + + this.drawCustomInfoStat(x, y, guiLeft + 142, guiTop + 34, 18, 18, x, y, "Request type: " + EnumChatFormatting.YELLOW + ( + this.importer.requestMode == this.importer.MODE_AS_MUCH_AS_POSSIBLE ? "As much as possible" : + this.importer.requestMode == this.importer.MODE_FULL_STACK ? "Only full stacks" : "Only full requests" + )); + + if(this.importer.rorConfiguredMode) { + String[] label = new String[10]; + label[0] = "Filter type: " + EnumChatFormatting.YELLOW + "RoR configured"; + for(int i = 0; i < 9; i++) { + boolean hasFilter = this.importer.rorFilters[i][0] != 0 && this.importer.rorFilters[i][2] > 0; + label[i + 1] = "Slot " + (i + 1) + ": " + (!hasFilter ? "None" : ("Item #" + this.importer.rorFilters[i][0] + " with Meta " + this.importer.rorFilters[i][1] + " x" + this.importer.rorFilters[i][2])); + } + this.drawCustomInfoStat(x, y, guiLeft + 142, guiTop + 52, 18, 18, x, y, label); + } else { + this.drawCustomInfoStat(x, y, guiLeft + 142, guiTop + 52, 18, 18, x, y, "Filter type: " + EnumChatFormatting.YELLOW + "Manually configured"); + } } @Override @@ -52,8 +72,11 @@ public class GUIPneumoStorageExporter extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + if(this.importer.rorConfiguredMode) { + drawTexturedModalRect(guiLeft + 142, guiTop + 52, xSize, 18, 18, 18); + drawTexturedModalRect(guiLeft + 14, guiTop + 14, 77, 14, 58, 58); + } if(!this.importer.continuousRequest) drawTexturedModalRect(guiLeft + 142, guiTop + 16, xSize, 0, 18, 18); - if(!this.importer.rorConfiguredMode) drawTexturedModalRect(guiLeft + 142, guiTop + 52, xSize, 18, 18, 18); if(this.importer.requestMode == importer.MODE_FULL_STACK) drawTexturedModalRect(guiLeft + 142, guiTop + 34, xSize + 18, 0, 18, 18); if(this.importer.requestMode == importer.MODE_FULL_REQUEST) drawTexturedModalRect(guiLeft + 142, guiTop + 34, xSize + 18, 18, 18, 18); } diff --git a/src/main/java/com/hbm/module/ParseMSES1.java b/src/main/java/com/hbm/module/ParseMSES1.java index 909dc5dd6..c6ad1baed 100644 --- a/src/main/java/com/hbm/module/ParseMSES1.java +++ b/src/main/java/com/hbm/module/ParseMSES1.java @@ -264,10 +264,11 @@ public class ParseMSES1 implements IParse { if(!readingVar) { readingVar = true; } else { - if("buffer".equals(var)) { + String varName = var.toString(); + if("buffer".equals(varName)) { joined.append(ctx.readBuffer()); } else { - String variable = ctx.variables.getString(var.toString()); + String variable = ctx.variables.getString(varName); if(forceNumber && variable.isEmpty()) variable = "0"; joined.append(variable); var.delete(0, var.length()); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 0efef5c6c..07e01bbca 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -57,10 +57,7 @@ import com.hbm.tileentity.machine.pile.*; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.network.*; -import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageAccess; -import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageClutter; -import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageMono; -import com.hbm.tileentity.network.pneumatic.TileEntityPneumoTube; +import com.hbm.tileentity.network.pneumatic.*; import com.hbm.tileentity.turret.*; import com.hbm.util.Compat; @@ -476,6 +473,8 @@ public class TileMappings { put(TileEntityPneumoStorageAccess.class, "tileentity_pneumatic_storage_access"); put(TileEntityPneumoStorageClutter.class, "tileentity_pneumatic_storage_clutter"); put(TileEntityPneumoStorageMono.class, "tileentity_pneumatic_storage_mono"); + put(TileEntityPneumoStorageImporter.class, "tileentity_pneumatic_storage_importer"); + put(TileEntityPneumoStorageExporter.class, "tileentity_pneumatic_storage_exporter"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); put(TileEntityRadioTorchReceiver.class, "tileentity_rtty_rec"); diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index 4ff0410be..f0913de23 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -18,10 +18,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver { // TODO: NBT serialization - // TODO: also maybe test all of this first - // TODO: more energy drincc - // TODO: the lion does not concern himself with chest pains, it's just the feeling of the heart screaming for more redbull +public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver { /** If requests should be pulled repeatedly every tick */ public boolean continuousRequest = false; @@ -101,7 +98,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB int requestSize = filter[2]; int existingSize = 0; - ItemStack existingStack = slots[i]; + ItemStack existingStack = slots[i + 9]; if(existingStack != null) { if(existingStack.getItem() == item && existingStack.getItemDamage() == meta && !existingStack.hasTagCompound()) { @@ -132,7 +129,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB int requestSize = filter[2]; int existingSize = 0; - ItemStack existingStack = slots[i]; + ItemStack existingStack = slots[i + 9]; if(existingStack != null) existingSize = existingStack.stackSize; ItemStack newStack = new ItemStack(item, 1, meta); @@ -143,8 +140,8 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB CacheSlot cacheSlot = this.cache.cacheSlots.get(hash); if(cacheSlot == null) continue; // safeguard - slots[i] = newStack; - slots[i].stackSize = existingSize + (int) this.cache.consumeItemsAndReturnQuantity(newStack, requestSize); + slots[i + 9] = newStack; + slots[i + 9].stackSize = existingSize + (int) this.cache.consumeItemsAndReturnQuantity(newStack, requestSize); } this.markChanged(); @@ -166,7 +163,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB int requestSize = filter[2]; int existingSize = 0; - ItemStack existingStack = slots[slot]; + ItemStack existingStack = slots[slot + 9]; if(existingStack != null) { if(existingStack.getItem() == item && existingStack.getItemDamage() == meta && !existingStack.hasTagCompound()) { @@ -192,8 +189,9 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB if(cacheSlot.stacksize <= 0) return false; int toPull = (int) BobMathUtil.min(requestSize, cacheSlot.stacksize, capacityLeft); - slots[slot] = newStack; - slots[slot].stackSize = existingSize + (int) this.cache.consumeItemsAndReturnQuantity(newStack, toPull); + + slots[slot + 9] = newStack; + slots[slot + 9].stackSize = existingSize + (int) this.cache.consumeItemsAndReturnQuantity(newStack, toPull); this.markChanged(); return true; @@ -248,6 +246,41 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB } } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + this.continuousRequest = nbt.getBoolean("continuousRequest"); + this.rorConfiguredMode = nbt.getBoolean("rorConfiguredMode"); + this.requestMode = nbt.getByte("requestMode"); + for(int i = 0; i < 9; i++) { + rorFilters[i][0] = nbt.getShort("filter_" + i + "_0"); + rorFilters[i][1] = nbt.getShort("filter_" + i + "_1"); + rorFilters[i][2] = nbt.getShort("filter_" + i + "_2"); + } + + this.lastRedstone = nbt.getBoolean("lastRedstone"); + this.slotDelay = nbt.getIntArray("slotDelay"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setBoolean("continuousRequest", continuousRequest); + nbt.setBoolean("rorConfiguredMode", rorConfiguredMode); + nbt.setByte("requestMode", (byte) requestMode); + + for(int i = 0; i < 9; i++) { + nbt.setShort("filter_" + i + "_0", (short) rorFilters[i][0]); + nbt.setShort("filter_" + i + "_1", (short) rorFilters[i][1]); + nbt.setShort("filter_" + i + "_2", (short) rorFilters[i][2]); + } + + nbt.setBoolean("lastRedstone", lastRedstone); + nbt.setIntArray("slotDelay", slotDelay); + } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPneumoStorageExporter(player.inventory, this); } @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageExporter(player.inventory, this); } From 1247ced8420ec3416a5e8a676d5ce90645fa2c47 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Fri, 3 Jul 2026 23:06:03 +0200 Subject: [PATCH 053/107] shit straight out of an ass --- src/main/java/com/hbm/module/ParseMSES1.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/module/ParseMSES1.java b/src/main/java/com/hbm/module/ParseMSES1.java index c6ad1baed..c79e367f7 100644 --- a/src/main/java/com/hbm/module/ParseMSES1.java +++ b/src/main/java/com/hbm/module/ParseMSES1.java @@ -266,7 +266,11 @@ public class ParseMSES1 implements IParse { } else { String varName = var.toString(); if("buffer".equals(varName)) { - joined.append(ctx.readBuffer()); + String variable = ctx.readBuffer(); + if(forceNumber && variable.isEmpty()) variable = "0"; + joined.append(variable); + var.delete(0, var.length()); + readingVar = false; } else { String variable = ctx.variables.getString(varName); if(forceNumber && variable.isEmpty()) variable = "0"; From aa0878e7c9856109b4248938863ebcabc59e78ed Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Sun, 5 Jul 2026 01:36:53 +0300 Subject: [PATCH 054/107] Okay --- src/main/resources/assets/hbm/lang/ru_RU.lang | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 3b6dae6e4..a70617bbd 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -681,7 +681,7 @@ container.generator=Ядерный реактор container.hadron=Ускоритель частиц container.heaterFirebox=Топка container.heaterHeatex=Теплообменник -container.heaterOilburner=Жидкостный котёл +container.heaterOilburner=Жидкостная горелка container.heaterOven=Нагревательная печь container.hydrotreater=Гидроочиститель container.iGenerator=Промышленный генератор @@ -2714,7 +2714,7 @@ item.grenade_shell.stick.name=Корпус рукояточной гранаты item.grenade_shell.tech.name=Корпус высокотехнологичной гранаты item.grenade_universal.name=Граната item.glyphid_gland.name= Железа глифида -item.glyphid_gland_empty.name= Пустаяч железа глифида +item.glyphid_gland_empty.name= Пустая железа глифида item.gun_aberrator.name=Пистолет "Aberrator" item.gun_aberrator_eott.name=Пистолеты "Eyes Of The Tempest" item.gun_am180.name=Пистолет-пулемёт .22 LR "American-180 " @@ -5230,7 +5230,7 @@ tile.dirt_dead.name=Мёртвая земля tile.dirt_oily.name=Пропитанная нефтью земля tile.drill_pipe.name=Бур tile.drone_crate.name=Пассивный ящик для дронов -tile.drone_crate.desc=Погрузочно-разгрузочная точка для транспортных дронов.$Действует как путевая точка, должна быть связана с линкером дронов.$Дроны должны приближаться под большим углом, иначе они застрянут. +tile.drone_crate.desc=Погрузочно-разгрузочная точка для транспортных дронов.$Действует как путевая точка, должна быть связана с соединителем дронов.$Дроны должны приближаться под большим углом, иначе они застрянут. tile.drone_crate_provider.name=Ящик снабжения для дронов tile.drone_crate_provider.desc=Предлагает предметы логистической сети.$Логистические дроны будут пытаться переместить предметы от поставщиков в ящики покупателей. tile.drone_crate_requester.name=Ящик запроса для дронов @@ -5238,7 +5238,7 @@ tile.drone_crate_requester.desc=Запрашивает предметы из л tile.drone_dock.name=Дрон-станция tile.drone_dock.desc=Точка спауна для логистических дронов.$Может обнаруживать поставщиков и заказчиков только в радиусе 5 чанков.$Дроны будут следовать только до 10 путевых точек за соединение. tile.drone_waypoint.name=Путевая точка для дронов -tile.drone_waypoint.desc=Путевая точка для дронов$Используйте линкер транспортного дрона, чтобы задать путь$Нажимайте на каждую путевую точку и крейт последовательно, чтобы создать путь,$ затем нажмите Shift, чтобы очистить сохраненную позицию$ Щелкните ПКМ или Shift, чтобы изменить смещение путевой точки +tile.drone_waypoint.desc=Путевая точка для дронов$Используйте линкер транспортного дрона, чтобы задать путь$Щелкните по каждой путевой точке и контейнеру по очереди, чтобы создать маршрут,$ затем нажмите Shift, чтобы очистить сохраненную позицию$ Щелкните ПКМ или Shift, чтобы изменить смещение путевой точки tile.drone_waypoint_request.name=Логистическая путевая точка для дронов tile.door_bunker.name=Бункерная дверь tile.door_metal.name=Металлическая дверь @@ -5416,7 +5416,7 @@ tile.heater_firebox.name=Топка tile.heater_firebox.desc=Производит тепло, сжигая твёрдое топливо. tile.heater_heatex.name=Теплообменный нагреватель tile.heater_heatex.desc=Выделяет тепло из горячих жидкостей. -tile.heater_oilburner.name=Жидкостный котёл +tile.heater_oilburner.name=Жидкостная горелка tile.heater_oilburner.desc=Производит тепло, сжигая жидкое топливо.$Может быть настроено с помощью отвертки. tile.heater_oven.name=Нагревательная печь tile.heater_oven.desc=Производит тепло, сжигая твёрдое топливо.$Принимает тепло снизу с 50%% эффективностью. From 4b9d7f59e42d3f15d9b497396276fc1980f5c3ed Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Sun, 5 Jul 2026 02:59:56 +0300 Subject: [PATCH 055/107] =?UTF-8?q?=D0=9E=D1=85=20=D0=B5=D0=B1=D0=B0=D1=82?= =?UTF-8?q?=D1=8C,=20=D0=BE=D0=B1=D0=BE=D0=B3=D0=B0=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D1=83=D1=80=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/ru_RU.lang | 129 +++++++++--------- .../assets/hbm/manual/weapon/ap.json | 6 +- .../assets/hbm/manual/weapon/buckshot.json | 6 +- .../hbm/manual/weapon/buckshotmagnum.json | 6 +- .../hbm/manual/weapon/buckshotsharpnel.json | 6 +- .../assets/hbm/manual/weapon/demo.json | 6 +- .../assets/hbm/manual/weapon/du.json | 6 +- .../assets/hbm/manual/weapon/express.json | 6 +- .../assets/hbm/manual/weapon/flechettes.json | 6 +- .../assets/hbm/manual/weapon/fmj.json | 6 +- .../assets/hbm/manual/weapon/grenade.json | 6 +- .../assets/hbm/manual/weapon/he.json | 6 +- .../assets/hbm/manual/weapon/heat.json | 6 +- .../assets/hbm/manual/weapon/incendiary.json | 6 +- .../assets/hbm/manual/weapon/jhp.json | 6 +- .../assets/hbm/manual/weapon/muke.json | 5 +- .../assets/hbm/manual/weapon/powder.json | 6 +- .../assets/hbm/manual/weapon/slug.json | 6 +- .../assets/hbm/manual/weapon/softpoint.json | 7 +- .../assets/hbm/manual/weapon/star.json | 6 +- .../assets/hbm/manual/weapon/wp.json | 6 +- 21 files changed, 143 insertions(+), 106 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index a70617bbd..3ded89483 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -676,12 +676,12 @@ container.fusionBreeder=Размножитель container.fusionKlystron=Клистрон container.fusionTorus=Термоядерный реактор container.gasCentrifuge=Газовая центрифуга -container.gasFlare=Газовая башня +container.gasFlare=Газовый факел container.generator=Ядерный реактор container.hadron=Ускоритель частиц container.heaterFirebox=Топка container.heaterHeatex=Теплообменник -container.heaterOilburner=Жидкостная горелка +container.heaterOilburner=Жидкостный нагреватель container.heaterOven=Нагревательная печь container.hydrotreater=Гидроочиститель container.iGenerator=Промышленный генератор @@ -717,7 +717,7 @@ container.machineMixer=Промышленный миксер container.machinePUREX=Пьюрекс container.machineOreSlopper=П.Б.Р. container.machinePlasmaForge=Плазменная кузница -container.machinePrecAss=Высокоточный сборщик +container.machinePrecAss=Прецизионный сборщик container.machinePyroOven=Пиролизная печь container.machineRefinery=Нефтеперерабатывающий завод container.machineRotaryFurnace=Роторная печь @@ -1662,9 +1662,9 @@ item.ammo_standard.b75_inc.name=.75 болт (Зажигательный) item.ammo_standard.bmg50_ap.name=Патрон .50 BMG (Бронебойный) item.ammo_standard.bmg50_he.name=Патрон .50 BMG (Разрывной) item.ammo_standard.bmg50_du.name=Патрон .50 BMG (Обеднённый уран) -item.ammo_standard.bmg50_fmj.name=Патрон .50 BMG (Цельнометаллическая оболочка) -item.ammo_standard.bmg50_sm.name=Патрон .50 BMG (Звёздный Металл) -item.ammo_standard.bmg50_jhp.name=Патрон .50 BMG (Экспансивный+) +item.ammo_standard.bmg50_fmj.name=Патрон .50 BMG (Оболочечный) +item.ammo_standard.bmg50_sm.name=Патрон .50 BMG (Звёздный металл) +item.ammo_standard.bmg50_jhp.name=Патрон .50 BMG (Полуоболочечный экспансивный) item.ammo_standard.bmg50_sp.name=Патрон .50 BMG (Экспансивный) item.ammo_standard.capacitor.name=Оружейный конденсатор (Стандартный) item.ammo_standard.capacitor_ir.name=Оружейный конденсатор (Коротковолновой) @@ -1678,72 +1678,72 @@ item.ammo_standard.flame_balefire.name=Топливо огнемёта (Жар- item.ammo_standard.flame_diesel.name=Топливо огнемёта (Дизель) item.ammo_standard.flame_gas.name=Топливо огнемёта (Газ) item.ammo_standard.flame_napalm.name=Топливо огнемёта (Напалм) -item.ammo_standard.g10.name=Картечь 10-го калибра -item.ammo_standard.g10_du.name=Урановая картечь 10-го калибра -item.ammo_standard.g10_shrapnel.name=Шрапнельная картечь 10-го калибра -item.ammo_standard.g10_slug.name=Пуля 10-го калибра -item.ammo_standard.g10_explosive.name=Взрывная картечь 10-го калибра -item.ammo_standard.g12.name=Картечь 12-го калибра -item.ammo_standard.g12_anthrax.name=Инъекция сибирской язвы 12-го калибра -item.ammo_standard.g12_bp.name=Картечь 12-го калибра с чёрным порохом -item.ammo_standard.g12_bp_magnum.name=Тяжёлая картечь 12-го калибра с чёрным порохом -item.ammo_standard.g12_bp_slug.name=Пуля 12-го калибра с чёрным порохом -item.ammo_standard.g12_explosive.name=Взрывной снаряд 12-го калибра -item.ammo_standard.g12_flechette.name=Игольчатая картечь 12-го калибра -item.ammo_standard.g12_magnum.name=Тяжёлая картечь 12-го калибра -item.ammo_standard.g12_phosphorus.name=Зажигательная картечь 12-го калибра -item.ammo_standard.g12_slug.name=Пуля 12-го калибра +item.ammo_standard.g10.name=Патрон 10 калибра (Картечь) +item.ammo_standard.g10_du.name=Патрон 10 калибра (Обеднённый уран) +item.ammo_standard.g10_shrapnel.name=Патрон 10 калибра (Шрапнель) +item.ammo_standard.g10_slug.name=Патрон 10 калибра (Пуля) +item.ammo_standard.g10_explosive.name=Патрон 10 калибра (Разрывной) +item.ammo_standard.g12.name=Патрон 12 калибра (Картечь) +item.ammo_standard.g12_anthrax.name=Патрон 12 калибра (Сибирская язва) +item.ammo_standard.g12_bp.name=Патрон 12 калибра (Картечь на дымном порохе) +item.ammo_standard.g12_bp_magnum.name=Патрон 12 калибра (Магнум-картечь на дымном порохе) +item.ammo_standard.g12_bp_slug.name=Патрон 12 калибра (Пуля на дымном порохе) +item.ammo_standard.g12_explosive.name=Патрон 12 калибра (Разрывной) +item.ammo_standard.g12_flechette.name=Патрон 12 калибра (С флешеттами) +item.ammo_standard.g12_magnum.name=Патрон 12 калибра (Магнум-картечь) +item.ammo_standard.g12_phosphorus.name=Патрон 12 калибра (Зажигательный) +item.ammo_standard.g12_slug.name=Патрон 12 калибра (Пуля) item.ammo_standard.g26_flare.name=26мм сигнальная ракета item.ammo_standard.g26_flare_supply.name=26мм сигнальная ракета (Запрос припасов) item.ammo_standard.g26_flare_weapon.name=26мм сигнальная ракета (Запрос оружия) -item.ammo_standard.g40_demo.name=40мм граната (Разрушающая) -item.ammo_standard.g40_he.name=40мм граната (Фугасная) -item.ammo_standard.g40_heat.name=40мм граната (Кумулятивная) -item.ammo_standard.g40_inc.name=40мм граната (Зажигательная) -item.ammo_standard.g40_phosphorus.name=40мм граната (Белый фосфор) -item.ammo_standard.m357_ap.name=Патрон .357 магнум (Бронебойный) -item.ammo_standard.m357_bp.name=Патрон .357 магнум (Чёрный порох) -item.ammo_standard.m357_express.name=Патрон .357 магнум (Высокомощная цельнометаллическая оболочка) -item.ammo_standard.m357_fmj.name=Патрон .357 магнум (Цельнометаллическая оболочка) -item.ammo_standard.m357_jhp.name=Патрон .357 магнум (Экспансивный+) -item.ammo_standard.m357_sp.name=Патрон .357 магнум (Экспансивный) -item.ammo_standard.m44_ap.name=Патрон .44 магнум (Бронебойный) -item.ammo_standard.m44_bp.name=Патрон .44 магнум (Чёрный порох) -item.ammo_standard.m44_express.name=Патрон .44 магнум (Высокомощная цельнометаллическая оболочка) -item.ammo_standard.m44_fmj.name=Патрон .44 магнум (Цельнометаллическая оболочка) -item.ammo_standard.m44_jhp.name=Патрон .44 магнум (Экспансивный+) -item.ammo_standard.m44_sp.name=Патрон .44 магнум (Экспансивный) +item.ammo_standard.g40_demo.name=40-мм граната (Штурмовая) +item.ammo_standard.g40_he.name=40-мм граната (Разрывной) +item.ammo_standard.g40_heat.name=40-мм граната (Кумулятивная) +item.ammo_standard.g40_inc.name=40-мм граната (Зажигательная) +item.ammo_standard.g40_phosphorus.name=40-мм граната (Белый фосфор) +item.ammo_standard.m357_ap.name=Патрон .357 Магнум (Бронебойный) +item.ammo_standard.m357_bp.name=Патрон .357 Магнум (На дымном порохе) +item.ammo_standard.m357_express.name=Патрон .357 Магнум (Высокоскоростной оболочечный) +item.ammo_standard.m357_fmj.name=Патрон .357 Магнум (Оболочечный) +item.ammo_standard.m357_jhp.name=Патрон .357 Магнум (Полуоболочечный экспансивный) +item.ammo_standard.m357_sp.name=Патрон .357 Магнум (Экспансивный) +item.ammo_standard.m44_ap.name=Патрон .44 Магнум (Бронебойный) +item.ammo_standard.m44_bp.name=Патрон .44 Магнум (На дымном порохе) +item.ammo_standard.m44_express.name=Патрон .44 Магнум (Высокоскоростной оболочечный) +item.ammo_standard.m44_fmj.name=Патрон .44 Магнум (Оболочечный) +item.ammo_standard.m44_jhp.name=Патрон .44 Магнум (Полуоболочечный экспансивный) +item.ammo_standard.m44_sp.name=Патрон .44 Магнум (Экспансивный) item.ammo_standard.nuke_balefire.name=Ядерный минизаряд (Жар-яйцо) -item.ammo_standard.nuke_demo.name=Ядерный минизаряд (Разрушающий) -item.ammo_standard.nuke_high.name=Ядерный минизаряд (Высокомощный) -item.ammo_standard.nuke_hive.name=Ракетный рой -item.ammo_standard.nuke_standard.name=Ядерный минизаряд +item.ammo_standard.nuke_demo.name=Ядерный минизаряд (Штурмовой) +item.ammo_standard.nuke_high.name=Ядерный минизаряд (Повышенной мощности) +item.ammo_standard.nuke_hive.name=Ядерный минизаряд (Ракетный рой) +item.ammo_standard.nuke_standard.name=Ядерный минизаряд (Стандартный) item.ammo_standard.nuke_tots.name=Ядерный минизаряд (Карапузы) item.ammo_standard.p22_ap.name=Патрон .22 LR (Бронебойный) -item.ammo_standard.p22_fmj.name=Патрон .22 LR (Цельнометаллическая оболочка) -item.ammo_standard.p22_jhp.name=Патрон .22 LR (Экспансивный+) +item.ammo_standard.p22_fmj.name=Патрон .22 LR (Оболочечный) +item.ammo_standard.p22_jhp.name=Патрон .22 LR (Полуоболочечный экспансивный) item.ammo_standard.p22_sp.name=Патрон .22 LR (Экспансивный) item.ammo_standard.p45_ap.name=Патрон .45 (Бронебойный) item.ammo_standard.p45_du.name=Патрон .45 (Обеднённый уран) -item.ammo_standard.p45_fmj.name=Патрон .45 (Цельнометаллическая оболочка) -item.ammo_standard.p45_jhp.name=Патрон .45 (Экспансивный+) +item.ammo_standard.p45_fmj.name=Патрон .45 (Оболочечный) +item.ammo_standard.p45_jhp.name=Патрон .45 (Полуоболочечный экспансивный) item.ammo_standard.p45_sp.name=Патрон .45 (Экспансивный) item.ammo_standard.p9_ap.name=Патрон 9мм (Бронебойный) -item.ammo_standard.p9_fmj.name=Патрон 9мм (Цельнометаллическая оболочка) -item.ammo_standard.p9_jhp.name=Патрон 9мм (Экспансивный+) +item.ammo_standard.p9_fmj.name=Патрон 9мм (Оболочечный) +item.ammo_standard.p9_jhp.name=Патрон 9мм (Полуоболочечный экспансивный) item.ammo_standard.p9_sp.name=Патрон 9мм (Экспансивный) item.ammo_standard.r556_ap.name=Патрон 5.56мм (Бронебойный) -item.ammo_standard.r556_fmj.name=Патрон 5.56мм (Цельнометаллическая оболочка) -item.ammo_standard.r556_jhp.name=Патрон 5.56мм (Экспансивный+) +item.ammo_standard.r556_fmj.name=Патрон 5.56мм (Оболочечный) +item.ammo_standard.r556_jhp.name=Патрон 5.56мм (Полуоболочечный экспансивный) item.ammo_standard.r556_sp.name=Патрон 5.56мм (Экспансивный) item.ammo_standard.r762_ap.name=Патрон 7.62мм (Бронебойный) item.ammo_standard.r762_du.name=Патрон 7.62мм (Обеднённый уран) -item.ammo_standard.r762_fmj.name=Патрон 7.62мм (Цельнометаллическая оболочка) +item.ammo_standard.r762_fmj.name=Патрон 7.62мм (Оболочечный) item.ammo_standard.r762_he.name=Патрон 7.62мм (Разрывной) -item.ammo_standard.r762_jhp.name=Патрон 7.62мм (Экспансивный+) +item.ammo_standard.r762_jhp.name=Патрон 7.62мм (Полуоболочечный экспансивный) item.ammo_standard.r762_sp.name=Патрон 7.62мм (Экспансивный) -item.ammo_standard.rocket_demo.name=Ракета (Разрушающая) -item.ammo_standard.rocket_he.name=Ракета (Фугасная) +item.ammo_standard.rocket_demo.name=Ракета (Штурмовая) +item.ammo_standard.rocket_he.name=Ракета (Осколочно-фугасная) item.ammo_standard.rocket_heat.name=Ракета (Кумулятивная) item.ammo_standard.rocket_inc.name=Ракета (Зажигательная) item.ammo_standard.rocket_phosphorus.name=Ракета (Белый фосфор) @@ -1752,11 +1752,6 @@ item.ammo_standard.stone_ap.name=Кремень и порох item.ammo_standard.stone_iron.name=Железный шарик и порох item.ammo_standard.stone_shot.name=Дробь и порох item.ammo_standard.tau_uranium.name=Ящик обеднённого урана-235 -item.ammo_stinger_rocket.name=Ракета-Стингер -item.ammo_stinger_rocket_he.name=Ракета-Стингер (Фугасная) -item.ammo_stinger_rocket_incendiary.name=Ракета-Стингер (Зажигательная) -item.ammo_stinger_rocket_nuclear.name=Ракета-Стингер (Привет) -item.ammo_stinger_rocket_bones.name=Ракета-Стингер (Поиск мобов) item.ams_catalyst_aluminium.name=Алюминиевый реакционный катализатор item.ams_catalyst_beryllium.name=Бериллиевый реакционный катализатор item.ams_catalyst_blank.name=Пустой реакционный катализатор @@ -5416,8 +5411,8 @@ tile.heater_firebox.name=Топка tile.heater_firebox.desc=Производит тепло, сжигая твёрдое топливо. tile.heater_heatex.name=Теплообменный нагреватель tile.heater_heatex.desc=Выделяет тепло из горячих жидкостей. -tile.heater_oilburner.name=Жидкостная горелка -tile.heater_oilburner.desc=Производит тепло, сжигая жидкое топливо.$Может быть настроено с помощью отвертки. +tile.heater_oilburner.name=Жидкостный нагреватель +tile.heater_oilburner.desc=Сжигает жидкое топливо для выработки тепла.$Можно настроить с помощью отвёртки. tile.heater_oven.name=Нагревательная печь tile.heater_oven.desc=Производит тепло, сжигая твёрдое топливо.$Принимает тепло снизу с 50%% эффективностью. tile.hev_battery.name=Батарея костюма @@ -5525,7 +5520,7 @@ tile.machine_crystallizer.name=Рудный окислитель tile.machine_cyclotron.name=Циклотрон tile.machine_detector.name=Детектор мощности tile.machine_deuterium_extractor.name=Экстрактор дейтерия -tile.machine_deuterium_tower.name=Колонна экстракции дейтерия +tile.machine_deuterium_tower.name=Башня экстракции дейтерия Гирдлера tile.machine_diesel.name=Дизельный генератор tile.machine_drain.name=Сливная труба tile.machine_drill.name=Автоматический горный бур @@ -5536,7 +5531,7 @@ tile.machine_epress.name=Электрический пресс tile.machine_excavator.name=Большой горный бур tile.machine_exposure_chamber.name=Камера облучения частицами tile.machine_fel.name=Лазер на свободных электронах (FEL) -tile.machine_flare.name=Газовая башня +tile.machine_flare.name=Газовый факел tile.machine_fluidtank.name=Цистерна tile.machine_forcefield.name=Излучатель силового поля tile.machine_fraction_tower.name=Ректификационная колонна @@ -5567,7 +5562,7 @@ tile.machine_mixer.name=Промышленный миксер tile.machine_orbus.name=Тяжёлый магнитный контейнер для антиматерии tile.machine_ore_slopper.name=Переработчик бедроковой руды tile.machine_powerrtg.name=ПТ-изотопная ячейка -tile.machine_precass.name=Высокоточный сборщик +tile.machine_precass.name=Прецизионны сборщик tile.machine_press.name=Пресс tile.machine_puf6_tank.name=Бочка гексафторида плутония tile.machine_pumpjack.name=Станок-качалка @@ -5806,6 +5801,7 @@ tile.pneumatic_storage_mono.name=Пневмосистема хранения - tile.pneumatic_tube.name=Пневмотруба tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ с отверткой, чтобы переключить вход.$ПКМ с отверткой в присяде, чтобы переключить выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. tile.pneumatic_tube_paintable.name=Окрашиваемая пневмотруба +tile.pneumatic_tube_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отверткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования tile.pole_satellite_receiver.name=Спутниковая тарелка tile.pole_top.name=Антенна tile.press_preheater.name=Внешний нагреватель пресса @@ -5908,7 +5904,7 @@ tile.rbmk_rod_mod.name=Замедляющий топливный канал РБ tile.rbmk_rod_reasim.name=Топливный канал РБМК (РеаСим) tile.rbmk_rod_reasim_mod.name=Замедляющий топливный канал РБМК (РеаСим) tile.rbmk_steam_inlet.name=Порт ввода воды РБМК РеаСим -tile.rbmk_steam_inlet.desc=Подает воду в колонны РБМК, если включены ReaSim бойлеры$Подключается к колоннам РБМК сбоку +tile.rbmk_steam_inlet.desc=Подаёт воду в колонны РБМК, если включены ReaSim бойлеры$Подключается к колоннам РБМК сбоку tile.rbmk_steam_outlet.name=Порт вывода пара РБМК РеаСим tile.rbmk_steam_outlet.desc=Извлекает перегретый пар из колонн РБМК, если включены ReaSim бойлеры$Подключается к колоннам РБМК сбоку tile.rbmk_storage.name=Колонна-хранилище РБМК @@ -5984,6 +5980,7 @@ tile.red_cable_classic.name=Провод из красной меди (Стар tile.red_cable_gauge.name=Датчик мощности tile.red_cable_gauge.desc=Кабель, который показывает, сколько энергии$ перемещается по сети за тик.$Разделенные сети, соединенные блоками хранения энергии$рассматриваются как одна общая сеть. tile.red_cable_paintable.name=Окрашиваемый провод из красной меди +tile.red_cable_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отверткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования tile.red_connector.name=Электрический коннектор tile.red_connector_super.name=Мощный электрический коннектор tile.red_pylon.name=Малый электрический столб @@ -6258,7 +6255,7 @@ turret.on=ВКЛ turret.players=Целиться по игрокам: %s upgrade.acid=Требуется кислота %s -upgrade.burn=Burn %sмб/тик за %sHE +upgrade.burn=Сжигает %sмб/тик за %sHE upgrade.consumption=Потребление %s upgrade.coolantConsumption=Потребление охладителя %s upgrade.delay=Время %s diff --git a/src/main/resources/assets/hbm/manual/weapon/ap.json b/src/main/resources/assets/hbm/manual/weapon/ap.json index dc4b01078..b489dbc16 100644 --- a/src/main/resources/assets/hbm/manual/weapon/ap.json +++ b/src/main/resources/assets/hbm/manual/weapon/ap.json @@ -13,10 +13,12 @@ ], "title": { "en_US": "Armor Piercing Bullet", - "zh_CN": "穿甲弹" + "zh_CN": "穿甲弹", + "ru_RU": "Бронебойные патроны" }, "content": { "en_US": "AP rounds are similar to FMJ rounds, but using hardened steel jackets and significantly higher powder load. Not only do APs deal more damage and pierce through armor more effectively, but they can also penetrate their target.", - "zh_CN": "穿甲弹(AP)类似全金属被甲弹,但使用硬化钢弹壳且装药略多。穿甲弹不 仅能造成更多伤害,而且能更高效地穿透护甲,还可以穿透目标。" + "zh_CN": "穿甲弹(AP)类似全金属被甲弹,但使用硬化钢弹壳且装药略多。穿甲弹不 仅能造成更多伤害,而且能更高效地穿透护甲,还可以穿透目标。", + "ru_RU": "Бронебойные патроны схожи с оболочечными патронами, но в них используется рубашка из закалённой стали и значительно больший пороховой заряд. Бронебойные пули не только наносят больше урона и эффективнее пробивают броню, но также способны прошивать цель насквозь." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/buckshot.json b/src/main/resources/assets/hbm/manual/weapon/buckshot.json index b8a35f97d..caabef2ff 100644 --- a/src/main/resources/assets/hbm/manual/weapon/buckshot.json +++ b/src/main/resources/assets/hbm/manual/weapon/buckshot.json @@ -7,10 +7,12 @@ ], "title": { "en_US": "Buckshot", - "zh_CN": "鹿弹" + "zh_CN": "鹿弹", + "ru_RU": "Картечь" }, "content": { "en_US": "Standard shot, creates many low-damage pellets with considerable spread. Sometimes it's hard to beat the classics.", - "zh_CN": "标准霰弹,能够射出多个大范围散布的低伤害弹丸。有时鹿弹打不过经典弹药。" + "zh_CN": "标准霰弹,能够射出多个大范围散布的低伤害弹丸。有时鹿弹打不过经典弹药。", + "ru_RU": "Стандартный боеприпас. Создаёт множество наносящих малый урон дробин с внушительным рассеиванием. Классику ничем не заменить." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/buckshotmagnum.json b/src/main/resources/assets/hbm/manual/weapon/buckshotmagnum.json index daf01843b..ea0ecffb5 100644 --- a/src/main/resources/assets/hbm/manual/weapon/buckshotmagnum.json +++ b/src/main/resources/assets/hbm/manual/weapon/buckshotmagnum.json @@ -7,10 +7,12 @@ ], "title": { "en_US": "Magnum Buckshot", - "zh_CN": "马格南鹿弹" + "zh_CN": "马格南鹿弹", + "ru_RU": "Магнум-картечь" }, "content": { "en_US": "Buckshot, but with fewer larger pellets which deal more damage. While black powder magnum shells don't perform that much better compared to buckshot, smokeless powder ones are noticably more powerful. Additionally, magnum buckshot shells have roughly half as much spread as standard buckshot.", - "zh_CN": "弹丸更少且更大,伤害更高的鹿弹。尽管黑火药马格南鹿弹的性能不比普通鹿 弹好很多,但是使用无烟火药的版本性能显著更好。另外,马格南鹿弹的散布 大约是普通鹿弹的一半。" + "zh_CN": "弹丸更少且更大,伤害更高的鹿弹。尽管黑火药马格南鹿弹的性能不比普通鹿 弹好很多,但是使用无烟火药的版本性能显著更好。另外,马格南鹿弹的散布 大约是普通鹿弹的一半。", + "ru_RU": "Картечь, но с меньшим количеством более крупных дробин, которые наносят больше урона. Если магнум-патроны на дымном порохе не сильно превосходят стандартную картечь, то варианты на бездымном порохе ощутимо мощнее. Кроме того, магнум-картечь имеет примерно вдвое меньшее рассеивание по сравнению со стандартной." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json b/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json index cd77f1e1a..eea8734a3 100644 --- a/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json +++ b/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json @@ -6,10 +6,12 @@ ], "title": { "en_US": "Shrapnel Buckshot", - "zh_CN": "易跳弹" + "zh_CN": "易跳弹", + "ru_RU": "Шрапнель" }, "content": { "en_US": "A more devious version of standard buckshot, identical in most ways except that the pellets are incredibly bouncy, ricocheting off of most surfaces multiple times. May be hazardous to the user when used in enclosed spaces.", - "zh_CN": "一种更加有弹性的鹿弹,大多数方面与普通鹿弹完全相同,但是弹性极强,能 在绝大多数表面反弹多次。在狭窄区域使用时可能会误伤使用者。" + "zh_CN": "一种更加有弹性的鹿弹,大多数方面与普通鹿弹完全相同,但是弹性极强,能 在绝大多数表面反弹多次。在狭窄区域使用时可能会误伤使用者。", + "ru_RU": "Более коварный вариант стандартной картечи. Практически идентичен ей во всём, кроме того, что дробины невероятно прыгучие и многократно рикошетят от большинства поверхностей. Может быть опасен для самого стрелка при использовании в замкнутых пространствах" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/demo.json b/src/main/resources/assets/hbm/manual/weapon/demo.json index f8e796352..f00b7f8b6 100644 --- a/src/main/resources/assets/hbm/manual/weapon/demo.json +++ b/src/main/resources/assets/hbm/manual/weapon/demo.json @@ -8,10 +8,12 @@ ], "title": { "en_US": "Demolition Explosives", - "zh_CN": "破坏者弹药" + "zh_CN": "破坏者弹药", + "ru_RU": "Штурмовой заряд" }, "content": { "en_US": "Demolition explosives are similar to regular high-explosives, however they have a larger splash radius, slightly lower damage, and they break blocks. Not recommended for home defense.", - "zh_CN": "破坏者弹药与普通的高爆弹药相似,但爆炸半径更大且伤害略低,并且会破坏 方块。不建议用于守卫基地。" + "zh_CN": "破坏者弹药与普通的高爆弹药相似,但爆炸半径更大且伤害略低,并且会破坏 方块。不建议用于守卫基地。", + "ru_RU": "Штурмовые заряды похожи на обычные осколочно-фугасные боеприпасы, однако имеют больший радиус поражения, немного меньший урон и разрушают блоки. Не рекомендуется для самообороны дома" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/du.json b/src/main/resources/assets/hbm/manual/weapon/du.json index 58345133f..acbe13dfc 100644 --- a/src/main/resources/assets/hbm/manual/weapon/du.json +++ b/src/main/resources/assets/hbm/manual/weapon/du.json @@ -9,10 +9,12 @@ ], "title": { "en_US": "Depleted Uranium Bullet", - "zh_CN": "贫铀弹" + "zh_CN": "贫铀弹", + "ru_RU": "Пуля с обеднённым ураном" }, "content": { "en_US": "Ammunition with depleted uranium in its core. The increased density and higher powder load causes this ammo type to have even better armor-piercing properties than AP ammo. The added punch causes the projectiles to penetrate.

Due to their intended effect being kinetic energy, rather than being poisonous, depleted uranium ammunition is not subject to the Hague Conventions of 1899 regarding use of poisonous projectiles in warfare.", - "zh_CN": "核心部分含有贫化铀的弹药,其更高的密度和装药量使得其具有较穿甲弹更强 的穿甲能力,加强的冲击力也使得其能够穿透目标。

由于贫铀弹被设计为利用其动能而非毒性,其不受1899年海牙公约关于在 战争中使用毒性弹药的条款的约束。" + "zh_CN": "核心部分含有贫化铀的弹药,其更高的密度和装药量使得其具有较穿甲弹更强 的穿甲能力,加强的冲击力也使得其能够穿透目标。

由于贫铀弹被设计为利用其动能而非毒性,其不受1899年海牙公约关于在 战争中使用毒性弹药的条款的约束。", + "ru_RU": "Боеприпас с сердечником из обеднённого урана. Увеличенная плотность и больший пороховой заряд обеспечивают этому типу патронов ещё более высокие бронебойные свойства, чем у стандартных бронебойных. Повышенная пробивная способность позволяет снарядам проходить цели насквозь.

Поскольку их основным поражающим фактором является кинетическая энергия, а не химическое отравление, боеприпасы с обеднённым ураном не подпадают под действие Гаагской конвенции 1899 года о неприменении снарядов, имеющих единственной целью распространять удушающие или вредоносные газы" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/express.json b/src/main/resources/assets/hbm/manual/weapon/express.json index 37bb8e446..feb425c3f 100644 --- a/src/main/resources/assets/hbm/manual/weapon/express.json +++ b/src/main/resources/assets/hbm/manual/weapon/express.json @@ -7,10 +7,12 @@ ], "title": { "en_US": "FMJ Express Bullet", - "zh_CN": "额外装药FMJ" + "zh_CN": "额外装药FMJ", + "ru_RU": "Высокоскоростная оболочечная пуля" }, "content": { "en_US": "FMJ Express is a special type of full metal jacket ammo for revolver calibers. Express ammo has the same armor-piercing effects in addition to increased damage. Express projectiles can penetrate their targets, but unlike AP rounds, Express projectiles become weaker on every penetration. Due to the higher powder load in combination with the basic gunmetal casing, Express ammo causes the gun to wear faster.", - "zh_CN": "额外装药FMJ是一种用于转轮手枪弹匣的特殊全金属被甲弹。这种子弹伤害 较高,且具有与全金属被甲弹相同的穿甲效果。这种子弹还可以穿透敌人,但 与穿甲弹不同的是,每穿透一个敌人,子弹的伤害就会降低一些。由于这种子 弹装药量较高,且仍然使用普通炮铜弹壳,其会导致枪械磨损速度加快。" + "zh_CN": "额外装药FMJ是一种用于转轮手枪弹匣的特殊全金属被甲弹。这种子弹伤害 较高,且具有与全金属被甲弹相同的穿甲效果。这种子弹还可以穿透敌人,但 与穿甲弹不同的是,每穿透一个敌人,子弹的伤害就会降低一些。由于这种子 弹装药量较高,且仍然使用普通炮铜弹壳,其会导致枪械磨损速度加快。", + "ru_RU": "Высокоскоростной оболочечный патрон — это особый тип боеприпасов с цельнометаллической оболочкой для револьверных калибров. Данный тип сочетает в себе бронебойные свойства и повышенный урон. Такие снаряды способны проходить цели насквозь, но, в отличие от стандартных бронебойных патронов, их урон падает с каждым новым пробитием. Из-за увеличенного порохового заряда в сочетании с базовой томпаковой гильзой использование патронов класса «Экспресс» ускоряет износ оружия" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/flechettes.json b/src/main/resources/assets/hbm/manual/weapon/flechettes.json index 343ed459e..dcffefd69 100644 --- a/src/main/resources/assets/hbm/manual/weapon/flechettes.json +++ b/src/main/resources/assets/hbm/manual/weapon/flechettes.json @@ -6,10 +6,12 @@ ], "title": { "en_US": "Flechettes", - "zh_CN": "箭形弹" + "zh_CN": "箭形弹", + "ru_RU": "Флешетты" }, "content": { "en_US": "Flechettes are small fin-stabilized projectiles, contrary to buckshot's round pellets. Flechette shells have less spread and better armor-piercing compared to standard buckshot.", - "zh_CN": "箭形弹是小型的鳍形弹药,而非普通鹿弹的圆形弹丸。箭形弹散布更小,且具 有比普通鹿弹更好的穿甲效果。" + "zh_CN": "箭形弹是小型的鳍形弹药,而非普通鹿弹的圆形弹丸。箭形弹散布更小,且具 有比普通鹿弹更好的穿甲效果。", + "ru_RU": "Флешетты представляют собой небольшие стреловидные снаряды с хвостовым оперением, в отличие от круглых дробин стандартной картечи. Патроны с флешеттами имеют меньшее рассеивание и повышенную бронепробиваемость по сравнению с обычной картечью" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/fmj.json b/src/main/resources/assets/hbm/manual/weapon/fmj.json index ef5ad59e8..4fa3d0461 100644 --- a/src/main/resources/assets/hbm/manual/weapon/fmj.json +++ b/src/main/resources/assets/hbm/manual/weapon/fmj.json @@ -13,10 +13,12 @@ ], "title": { "en_US": "Full Metal Jacket Bullet", - "zh_CN": "全金属被甲弹" + "zh_CN": "全金属被甲弹", + "ru_RU": "Оболочечная пуля" }, "content": { "en_US": "FMJs do not deform when hitting a soft target, meaning they deliver less damage. However, it allows them to pierce armor more effectively. All FMJs have some armor-piercing properties, as well as added damage threshold negation based on the caliber size.", - "zh_CN": "全金属被甲弹(FMJ)在击中较软目标时不会解体,因此造成的伤害较低; 然而其特性使得其能够更高效地穿透护甲。所有种类的全金属被甲弹都有一定 的穿甲能力,以及因口径而异的无视伤害阈值的能力。" + "zh_CN": "全金属被甲弹(FMJ)在击中较软目标时不会解体,因此造成的伤害较低; 然而其特性使得其能够更高效地穿透护甲。所有种类的全金属被甲弹都有一定 的穿甲能力,以及因口径而异的无视伤害阈值的能力。", + "ru_RU": "Оболочечные пули не деформируются при попадании в мягкую цель, из-за чего наносят меньше урона. Однако это позволяет им эффективнее пробивать броню. Все оболочечные патроны обладают базовыми бронебойными свойствами, а также снижают порог защиты цели в зависимости от калибра" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/grenade.json b/src/main/resources/assets/hbm/manual/weapon/grenade.json index 27650e3ee..54a4ee59f 100644 --- a/src/main/resources/assets/hbm/manual/weapon/grenade.json +++ b/src/main/resources/assets/hbm/manual/weapon/grenade.json @@ -7,10 +7,12 @@ ], "title": { "en_US": "High-Explosives", - "zh_CN": "高爆" + "zh_CN": "高爆", + "ru_RU": "Осколочно-фугасные" }, "content": { "en_US": "Standard ammunition for grenade and rocket launchers. Deals splash damage in a moderate area.", - "zh_CN": "榴弹和火箭弹的标准类型,在中等范围内造成爆炸伤害。" + "zh_CN": "榴弹和火箭弹的标准类型,在中等范围内造成爆炸伤害。", + "ru_RU": "Стандартные боеприпасы для гранатомётов и ракетных установок. Наносят урон по площади в умеренном радиусе" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/he.json b/src/main/resources/assets/hbm/manual/weapon/he.json index 22e04eef7..ffdd32506 100644 --- a/src/main/resources/assets/hbm/manual/weapon/he.json +++ b/src/main/resources/assets/hbm/manual/weapon/he.json @@ -10,10 +10,12 @@ ], "title": { "en_US": "High-Explosive Ammunition", - "zh_CN": "高爆弹药" + "zh_CN": "高爆弹药", + "ru_RU": "Разрывные боеприпасы" }, "content": { "en_US": "As one would expect, explosive ammunition deals explosive damage to its target, and the surroundings in a small radius. The resulting damage is noticably higher than the gun's base damage, at the cost of causing the gun to wear down significantly faster.

Use of explosive projectiles with a weight of less than 400 grams is prohibited by the Saint Petersburg Declaration of 1868.", - "zh_CN": "正如其名,高爆弹药会对目标及其周围小范围的实体造成爆炸伤害。其最终造 成的伤害显著高于枪械的基础伤害,但代价是枪械会加快磨损。

1868年的圣彼得堡宣言禁止了在战争中使用重量低于400克的爆炸弹药。" + "zh_CN": "正如其名,高爆弹药会对目标及其周围小范围的实体造成爆炸伤害。其最终造 成的伤害显著高于枪械的基础伤害,但代价是枪械会加快磨损。

1868年的圣彼得堡宣言禁止了在战争中使用重量低于400克的爆炸弹药。", + "ru_RU": "Как и следовало ожидать, разрывные боеприпасы наносят взрывной урон цели и окружению в небольшом радиусе. Получаемый урон заметно выше базового урона оружия, но ценой значительно более быстрого износа ствола..

Использование разрывных снарядов весом менее 400 граммов запрещено Санкт-Петербургской декларацией 1868 года" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/heat.json b/src/main/resources/assets/hbm/manual/weapon/heat.json index 8ca6b235a..c4e60d6ea 100644 --- a/src/main/resources/assets/hbm/manual/weapon/heat.json +++ b/src/main/resources/assets/hbm/manual/weapon/heat.json @@ -7,10 +7,12 @@ ], "title": { "en_US": "Shaped Charges", - "zh_CN": "聚能装药" + "zh_CN": "聚能装药", + "ru_RU": "Кумулятивные" }, "content": { "en_US": "Special type of explosive munition with weaker splash damage compared to high-explosives, which deals massive extra damage on direct hit.", - "zh_CN": "特殊的爆炸性弹药,爆炸伤害低于高爆弹药,但直接击中目标时会造成高额 额外伤害。" + "zh_CN": "特殊的爆炸性弹药,爆炸伤害低于高爆弹药,但直接击中目标时会造成高额 额外伤害。", + "ru_RU": "Особый тип разрывных боеприпасов с меньшим уроном по площади по сравнению со стандартными, который наносит огромный дополнительный урон при прямом попадании" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/incendiary.json b/src/main/resources/assets/hbm/manual/weapon/incendiary.json index 4aca16a65..1b437592f 100644 --- a/src/main/resources/assets/hbm/manual/weapon/incendiary.json +++ b/src/main/resources/assets/hbm/manual/weapon/incendiary.json @@ -7,10 +7,12 @@ ], "title": { "en_US": "Incendiary Munitions", - "zh_CN": "燃烧弹" + "zh_CN": "燃烧弹", + "ru_RU": "Зажигательные боеприпасы" }, "content": { "en_US": "Incendiary explosives leave behind lingering fire, which can ignite targets. The afterburn does not last very long, and can be extinguished with water.

Use of incendiary weapons against or near civilians is forbidden by the Geneva Conventions.", - "zh_CN": "燃烧弹会残留下能够点燃目标的持续火焰。燃烧效果持续时间并不长,而且可 以用水扑灭。

日内瓦公约禁止对普通民众或在普通民众附近使用燃烧性武器。" + "zh_CN": "燃烧弹会残留下能够点燃目标的持续火焰。燃烧效果持续时间并不长,而且可 以用水扑灭。

日内瓦公约禁止对普通民众或在普通民众附近使用燃烧性武器。", + "ru_RU": "Зажигательные взрывные боеприпасы оставляют после себя остаточный огонь, который может поджечь цели. Горение длится недолго и может быть потушено водой.

Использование зажигательного оружия против гражданского населения или вблизи него запрещено Женевскими конвенциями." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/jhp.json b/src/main/resources/assets/hbm/manual/weapon/jhp.json index 07a06984c..741091c89 100644 --- a/src/main/resources/assets/hbm/manual/weapon/jhp.json +++ b/src/main/resources/assets/hbm/manual/weapon/jhp.json @@ -13,10 +13,12 @@ ], "title": { "en_US": "Jacketed Hollow Point Bullet", - "zh_CN": "被甲空尖弹" + "zh_CN": "被甲空尖弹", + "ru_RU": "Полуоболочечная экспансивная пуля" }, "content": { "en_US": "JHPs are deforming bullets that cause more damage to soft targets compared to soft point bullets, at the cost of faring worse against armored targets. JHPs also have a higher bonus on headshots.

Due to being expanding projectiles, jacketed hollow points are prohibited for use in warfare under the Hague Conventions of 1899.", - "zh_CN": "被甲空尖弹(JHP)是一种扩张型弹药,相较于软尖弹,其能对较软目标造 成更多伤害,代价是对装甲目标效果极差。被甲空尖弹也具有较高的爆头 伤害加成。

由于属于扩张型弹药,1889年的海牙公约禁止在战争中使用被甲空尖弹。" + "zh_CN": "被甲空尖弹(JHP)是一种扩张型弹药,相较于软尖弹,其能对较软目标造 成更多伤害,代价是对装甲目标效果极差。被甲空尖弹也具有较高的爆头 伤害加成。

由于属于扩张型弹药,1889年的海牙公约禁止在战争中使用被甲空尖弹。", + "ru_RU": "Экспансивные пули с цельнометаллической оболочкой — это деформирующиеся пули, которые наносят больше урона мягким целям по сравнению с пулями с мягким наконечником, но ценой худшей эффективности против бронированных целей. Они также имеют повышенный бонус при попадании в голову.

Поскольку эти пули являются экспансивными, использование экспансивных пуль с цельнометаллической оболочкой в военных действиях запрещено Гаагскими конвенциями 1899 года." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/muke.json b/src/main/resources/assets/hbm/manual/weapon/muke.json index 78be88efa..d991a8fd2 100644 --- a/src/main/resources/assets/hbm/manual/weapon/muke.json +++ b/src/main/resources/assets/hbm/manual/weapon/muke.json @@ -5,11 +5,12 @@ ["hbm:item.ammo_standard", 1, 75] ], "title": { - "en_US": "High Yield Mini Nuke", + "en_US": "Мини-ядерный заряд", "zh_CN": "高当量迷你核弹" }, "content": { "en_US": "nuclear bobm
", - "zh_CN": "熊孩子福利(误)
" + "zh_CN": "熊孩子福利(误)
", + "ru_RU": "Ядерный бумб
" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/powder.json b/src/main/resources/assets/hbm/manual/weapon/powder.json index 2e2eca9ad..60a08c553 100644 --- a/src/main/resources/assets/hbm/manual/weapon/powder.json +++ b/src/main/resources/assets/hbm/manual/weapon/powder.json @@ -8,10 +8,12 @@ ], "title": { "en_US": "Black Powder Ammunition", - "zh_CN": "黑火药弹" + "zh_CN": "黑火药弹", + "ru_RU": "Патроны с дымным порохом" }, "content": { "en_US": "The earliest available type of cartridge, black powder ammo is available for revolver calibers and 12 gauge shells. For revolver calibers, black powder bullets are a variant of soft point bullets. Black powder shells however are available in buckshot, magnum shot and slug variants. Black powder ammo is very cheap, but deals significantly less damage and causes a large cloud of smoke on every shot.", - "zh_CN": "黑火药弹是最早可获取的弹药类型,可用于手枪口径的子弹和12号鹿弹。 对于手枪弹,黑火药弹属于软尖弹的一种;除此之外,鹿弹、马格南子弹和独 头弹也有黑火药变种。黑火药弹成本极低,但造成的伤害也有所降低,并且每 次发射时都会产生大量黑烟。" + "zh_CN": "黑火药弹是最早可获取的弹药类型,可用于手枪口径的子弹和12号鹿弹。 对于手枪弹,黑火药弹属于软尖弹的一种;除此之外,鹿弹、马格南子弹和独 头弹也有黑火药变种。黑火药弹成本极低,但造成的伤害也有所降低,并且每 次发射时都会产生大量黑烟。", + "ru_RU": "Самый ранний из доступных типов патронов. Боеприпасы с дымным порохом доступны для револьверных калибров и ружейных гильз 12-го калибра. В револьверных калибрах пули с дымным порохом представляют собой вариант пуль с мягким наконечником. Однако ружейные патроны с дымным порохом доступны в вариантах с картечью, магнум-картечью и пулевыми снарядами. Боеприпасы с дымным порохом очень дешевы, но наносят значительно меньше урона и создают большое облако дыма при каждом выстреле." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/slug.json b/src/main/resources/assets/hbm/manual/weapon/slug.json index 7e7cf81fd..9ce63a109 100644 --- a/src/main/resources/assets/hbm/manual/weapon/slug.json +++ b/src/main/resources/assets/hbm/manual/weapon/slug.json @@ -8,10 +8,12 @@ ], "title": { "en_US": "Slug", - "zh_CN": "独头弹" + "zh_CN": "独头弹", + "ru_RU": "Пулевой снаряд" }, "content": { "en_US": "A shell type that only holds a single large projectile. Unlike shot, slugs do not have inherent spread, deal the gun's full damage on hit, and have some armor-piercing properties.", - "zh_CN": "一种仅含有一颗大弹丸的弹药。不像霰弹,独头弹不自带散布,击中目标时会 造成枪械的全部伤害,还具有一定的穿甲效果。" + "zh_CN": "一种仅含有一颗大弹丸的弹药。不像霰弹,独头弹不自带散布,击中目标时会 造成枪械的全部伤害,还具有一定的穿甲效果。", + "ru_RU": "Тип ружейного патрона, содержащий всего один крупный поражающий элемент. В отличие от дроби, пули не имеют врождённого разлёта, наносят полный урон оружия при попадании и обладают некоторыми бронебойными свойствами." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/softpoint.json b/src/main/resources/assets/hbm/manual/weapon/softpoint.json index 6f6a24b75..39a00e972 100644 --- a/src/main/resources/assets/hbm/manual/weapon/softpoint.json +++ b/src/main/resources/assets/hbm/manual/weapon/softpoint.json @@ -13,10 +13,13 @@ ], "title": { "en_US": "Soft Point Bullet", - "zh_CN": "软尖弹" + "zh_CN": "软尖弹", + "ru_RU": "Полуоболочечная пуля" }, "content": { "en_US": "The \"default\" ammunition type for most guns. Soft point bullets do not change the gun's base damage, and don't have any armor-piercing properties.

Due to being expanding projectiles, soft points are prohibited for use in warfare under the Hague Conventions of 1899.", - "zh_CN": "“默认”的弹药类型。软尖弹不影响枪械的基础伤害,也不具有穿甲特性。

由于属于扩张型弹药,1889年的海牙公约禁止在战争中使用软尖弹。" + "zh_CN": "“默认”的弹药类型。软尖弹不影响枪械的基础伤害,也不具有穿甲特性。

由于属于扩张型弹药,1889年的海牙公约禁止在战争中使用软尖弹。", + "ru_RU": "Тип боеприпасов \"по умолчанию\" для большинства видов оружия. Полуоболочечные пули не изменяют базовый урон оружия и не обладают какими-либо бронебойными свойствами.

Поскольку эти пули являются деформирующимися, использование полуоболочечных пуль в военных действиях запрещено Гаагскими конвенциями 1899 года." + } } diff --git a/src/main/resources/assets/hbm/manual/weapon/star.json b/src/main/resources/assets/hbm/manual/weapon/star.json index 6127e293b..250f0e3a9 100644 --- a/src/main/resources/assets/hbm/manual/weapon/star.json +++ b/src/main/resources/assets/hbm/manual/weapon/star.json @@ -6,10 +6,12 @@ ], "title": { "en_US": "Starmetal Bullet", - "zh_CN": "星辉弹" + "zh_CN": "星辉弹", + "ru_RU": "Пуля из звёздного металла" }, "content": { "en_US": "Cartridge with extra high powder load using a starmetal projectile. The density and stability of starmetal ensures that this projectile can punch through most armors, at the cost of the gun wearing ten times faster. Can only be used in anti-materiel rifles, as the chamber pressure is so high, it would blow automatic weapons apart.", - "zh_CN": "星辉制成的弹药,同时具有非常高的装药量。星辉金属的密度和稳定性确保了 星辉弹药能够击穿大多数装甲,然而这种弹药会使枪械的磨损速度达到原来的 十倍。由于弹仓压力过大,其会直接损毁掉自动武器,因此只能用于反器材步枪。" + "zh_CN": "星辉制成的弹药,同时具有非常高的装药量。星辉金属的密度和稳定性确保了 星辉弹药能够击穿大多数装甲,然而这种弹药会使枪械的磨损速度达到原来的 十倍。由于弹仓压力过大,其会直接损毁掉自动武器,因此只能用于反器材步枪。", + "ru_RU": "Патрон с увеличенным пороховым зарядом и снарядом из звёздного металла. Плотность и прочность звёздного металла позволяют этой пуле пробивать практически любую броню ценой десятикратного износа оружия. Может использоваться только в крупнокалиберных снайперских винтовках, так как давление в патроннике настолько высокое, что автоматическое оружие просто разорвёт на части." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/wp.json b/src/main/resources/assets/hbm/manual/weapon/wp.json index e626e6dce..76e598b41 100644 --- a/src/main/resources/assets/hbm/manual/weapon/wp.json +++ b/src/main/resources/assets/hbm/manual/weapon/wp.json @@ -8,10 +8,12 @@ ], "title": { "en_US": "White Phosphorus Munitions", - "zh_CN": "白磷弹" + "zh_CN": "白磷弹", + "ru_RU": "Боеприпасы с белым фосфором" }, "content": { "en_US": "White phosphorus ignites easily and is very hard to extinguish, causing significant afterburn damage which cannot be permanently extinguished by water. Lingering fire caused by WP explosions lasts longer than by conventinal incendiary explosives.

Use of incendiary weapons against or near civilians is forbidden by the Geneva Conventions.", - "zh_CN": "白磷极易燃烧且极难熄灭,能够造成显著的灼烧效果,并且不能被水永久扑灭。 白磷弹造成的持续火焰比一般燃烧弹造成的持续时间更长。

日内瓦公约禁止对普通民众或在普通民众附近使用燃烧性武器。" + "zh_CN": "白磷极易燃烧且极难熄灭,能够造成显著的灼烧效果,并且不能被水永久扑灭。 白磷弹造成的持续火焰比一般燃烧弹造成的持续时间更长。

日内瓦公约禁止对普通民众或在普通民众附近使用燃烧性武器。", + "ru_RU": "Белый фосфор легко воспламеняется, и его очень трудно потушить. Он наносит значительный урон от горения, который невозможно окончательно ликвидировать водой. Остаточный огонь, вызванный взрывами белого фосфора, горит дольше, чем от обычных зажигательных взрывчатых веществ.

Использование зажигательного оружия против гражданского населения или вблизи него запрещено Женевскими конвенциями." } } From 6aac0fb4544626f4f2ee6ee5e4efa9825cdd808d Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Sun, 5 Jul 2026 18:53:26 +0300 Subject: [PATCH 056/107] =?UTF-8?q?=D0=90=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/ru_RU.lang | 54 +++++++++---------- .../hbm/manual/weapon/buckshotsharpnel.json | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 3ded89483..11f3a7f88 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -572,7 +572,7 @@ cannery.hadron.math.3=1,000 x 8 x 10KHE = 8,000 x 10KHE = 80MHE cannery.schottky=Диод с частицами Шоттки cannery.schottky.0=Это диод Шоттки для частиц. Он позволяет создавать более сложные конструкции ускорителей частиц и экономить электроэнергию -cannery.schottky.1=По умолчанию он блокирует все частицы и должен быть настроен с помощью отвертки +cannery.schottky.1=По умолчанию он блокирует все частицы и должен быть настроен с помощью отвёртки cannery.schottky.2=Эта сторона теперь будет принимать входящие частицы cannery.schottky.3=А эта будет выбрасывать входящие частицы cannery.schottky.4=Диод теперь имеет два выхода и будет вести себя квантовым образом, создавая виртуальные частицы для каждого выхода @@ -1697,7 +1697,7 @@ item.ammo_standard.g26_flare.name=26мм сигнальная ракета item.ammo_standard.g26_flare_supply.name=26мм сигнальная ракета (Запрос припасов) item.ammo_standard.g26_flare_weapon.name=26мм сигнальная ракета (Запрос оружия) item.ammo_standard.g40_demo.name=40-мм граната (Штурмовая) -item.ammo_standard.g40_he.name=40-мм граната (Разрывной) +item.ammo_standard.g40_he.name=40-мм граната (Разрывная) item.ammo_standard.g40_heat.name=40-мм граната (Кумулятивная) item.ammo_standard.g40_inc.name=40-мм граната (Зажигательная) item.ammo_standard.g40_phosphorus.name=40-мм граната (Белый фосфор) @@ -5120,34 +5120,34 @@ tile.concrete_stairs.name=Ступеньки из бетонной плитки tile.concrete_super.name=Убер-бетон tile.concrete_super_broken.name=Замшелые бетонные обломки tile.conveyor.name=Конвейер -tile.conveyor.desc=Перемещает предметы, упавшие на него$Может вращаться по часовой стрелке с помощью отвертки$Нажмите на отвертку для сгибания +tile.conveyor.desc=Перемещает предметы, упавшие на него$Может вращаться по часовой стрелке с помощью отвёртки$Нажмите на отвёртку для сгибания tile.conveyor_chute.name=Конвейерный желоб tile.conveyor_chute.desc=Перемещает предметы вниз$Самый нижний желоб будет действовать как обычный конвейер tile.conveyor_double.name=Двухполосный конвейер -tile.conveyor_double.desc=Перемещает предметы, опущенные на него$Может поворачиваться по часовой стрелке с помощью отвертки$Нажмите на отвертку для сгибания +tile.conveyor_double.desc=Перемещает предметы, опущенные на него$Может поворачиваться по часовой стрелке с помощью отвёртки$Нажмите на отвёртку для сгибания tile.conveyor_express.name=Быстрый конвейер -tile.conveyor_express.desc=Перемещает предметы, упавшие на него, очень быстро$Может вращаться по часовой стрелке с помощью отвертки$Нажмите на отвертку, чтобы согнуть +tile.conveyor_express.desc=Перемещает предметы, упавшие на него, очень быстро$Может вращаться по часовой стрелке с помощью отвёртки$Нажмите на отвёртку, чтобы согнуть tile.conveyor_lift.name=Конвейерный цепной лифт tile.conveyor_lift.desc=Перемещает предметы вверх$Для правильной работы требуется не менее двух блоков друг на друге tile.conveyor_triple.name=Трёхполосный конвейер -tile.conveyor_triple.desc=Перемещает предметы, упавшие на него$Может вращаться по часовой стрелке с помощью отвертки$Нажмите на отвертку для сгибания +tile.conveyor_triple.desc=Перемещает предметы, упавшие на него$Может вращаться по часовой стрелке с помощью отвёртки$Нажмите на отвёртку для сгибания tile.corium_block.name=Кориум tile.crane_boxer.name=Конвейерный упаковщик -tile.crane_boxer.desc=Загружает настраиваемое количество стопок в ящики, которые перемещаются по конвейерным лентам$Правый клик отверткой для установки входной стороны$Шифтовый клик отверткой для установки выходной стороны$Кликните дважды для установки противоположной стороны +tile.crane_boxer.desc=Загружает настраиваемое количество стопок в ящики, которые перемещаются по конвейерным лентам$Правый клик отвёрткой для установки входной стороны$Шифтовый клик отвёрткой для установки выходной стороны$Кликните дважды для установки противоположной стороны tile.crane_extractor.name=Конвейерный извлекатель -tile.crane_extractor.desc=Забирает предметы из инвентаря и помещает их на конвейерные ленты$Имеет до 9 слотов фильтрации с чёрным и белым списком$Правый клик отверткой для установки выходной стороны$Shift-клик отверткой для установки входной стороны$Кликните дважды для установки противоположной стороны +tile.crane_extractor.desc=Забирает предметы из инвентаря и помещает их на конвейерные ленты$Имеет до 9 слотов фильтрации с чёрным и белым списком$Правый клик отвёрткой для установки выходной стороны$Shift-клик отвёрткой для установки входной стороны$Кликните дважды для установки противоположной стороны tile.crane_grabber.name=Конвейерный сборщик -tile.crane_grabber.desc=Принимает предметы с проходящих конвейеров и помещает их в контейнеры$Принимает предметы только с ближайшей дорожки$Имеет до 9 слотов фильтрации с чёрным и белым списком$Правый клик отверткой для установки стороны входа$Сменный клик отверткой для установки стороны выхода$Кликните дважды для установки противоположной стороны +tile.crane_grabber.desc=Принимает предметы с проходящих конвейеров и помещает их в контейнеры$Принимает предметы только с ближайшей дорожки$Имеет до 9 слотов фильтрации с чёрным и белым списком$Правый клик отвёрткой для установки стороны входа$Сменный клик отвёрткой для установки стороны выхода$Кликните дважды для установки противоположной стороны tile.crane_inserter.name=Конвейерный вставщик -tile.crane_inserter.desc=Принимает предметы с конвейеров и помещает их в контейнеры$Правый щелчок отверткой для установки входной стороны$Shift-щелчок отверткой для установки выходной стороны$Кликните дважды для установки противоположной стороны +tile.crane_inserter.desc=Принимает предметы с конвейеров и помещает их в контейнеры$Правый щелчок отвёрткой для установки входной стороны$Shift-щелчок отвёрткой для установки выходной стороны$Кликните дважды для установки противоположной стороны tile.crane_partitioner.name=Вставщик окислителя tile.crane_partitioner.desc=Принимает и сохраняет до девяти входов рудного окислителя$и освобождает их, если они соответствуют требуемому размеру входа.$Неправильные предметы также сохраняются и должны быть извлечены из стороны. tile.crane_router.name=Конвейерный сортировщик tile.crane_router.desc=Сортирует элемент на основе заданных критериев$Стороны могут быть определены как чёрный список, белый список или подстановочный знак$Стороны подстановочного знака выбираются только в том случае, если ни один другой фильтр не подходит tile.crane_splitter.name=Конвейерный разделитель -tile.crane_splitter.desc=Разделяет предметы и равномерно укладывает их на две конвейерные ленты$Сама является конвейерной лентой, поэтому может напрямую входить в вставщик или сортировщик$Соотношение можно настроить с помощью отвертки +tile.crane_splitter.desc=Разделяет предметы и равномерно укладывает их на две конвейерные ленты$Сама является конвейерной лентой, поэтому может напрямую входить в вставщик или сортировщик$Соотношение можно настроить с помощью отвёртки tile.crane_unboxer.name=Конвейерный распаковщик -tile.crane_unboxer.desc=Приём коробок и извлечение их содержимого$Правый щелчок отверткой для установки выходной стороны$Shift-щелчок отверткой для установки входной стороны$Дважды щелкните для установки противоположной стороны +tile.crane_unboxer.desc=Приём коробок и извлечение их содержимого$Правый щелчок отвёрткой для установки выходной стороны$Shift-щелчок отвёрткой для установки входной стороны$Дважды щелкните для установки противоположной стороны tile.crashed_bomb.name=Неразорвавшаяся бомба tile.crate.name=Ящик снабжения tile.crate_ammo.name=Ящик из звёздного металла @@ -5283,12 +5283,12 @@ tile.fluid_duct.name=Универсальная жидкостная труба tile.fluid_duct_box.name=Универсальная жидкостная труба (Boxduct) tile.fluid_duct_exhaust.name=Выхлопная труба tile.fluid_duct_paintable_block_exhaust.name=Окрашиваемая покрытая выхлопная труба -tile.fluid_duct_paintable_block_exhaust.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отверткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования +tile.fluid_duct_paintable_block_exhaust.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отвёрткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования tile.fluid_duct_gauge.name=Труба с измерителем потока tile.fluid_duct_gauge.desc=Труба которая показывает сколько жидкости$перемещается внутри сети за тик.$Разделенные сети, соединенные бочками$или резервуары рассматриваются как одна общая сеть. tile.fluid_duct_neo.name=Универсальная жидкостная труба tile.fluid_duct_paintable.name=Окрашиваемая универсальная жидкостная труба -tile.fluid_duct_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отверткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования +tile.fluid_duct_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отвёрткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования tile.fluid_duct_solid.name=Покрытая универсальная жидкостная труба (Устаревшее) tile.fluid_pump.name=Помпа контроля потока tile.fluid_counter_valve.name=Жидкостный клапан со счётчиком @@ -5406,7 +5406,7 @@ tile.hadron_power_1g.name=Порт питания ускорителя част tile.hadron_power_10g.name=Порт питания ускорителя частиц (10GHE) tile.hazmat.name=Блок защитной ткани tile.heater_electric.name=Электрический нагреватель -tile.heater_electric.desc=Производит тепло, используя энергию.$Принимает тепло снизу, эффективность 85%%.$Можно настроить отверткой +tile.heater_electric.desc=Производит тепло, используя энергию.$Принимает тепло снизу, эффективность 85%%.$Можно настроить отвёрткой tile.heater_firebox.name=Топка tile.heater_firebox.desc=Производит тепло, сжигая твёрдое топливо. tile.heater_heatex.name=Теплообменный нагреватель @@ -5562,7 +5562,7 @@ tile.machine_mixer.name=Промышленный миксер tile.machine_orbus.name=Тяжёлый магнитный контейнер для антиматерии tile.machine_ore_slopper.name=Переработчик бедроковой руды tile.machine_powerrtg.name=ПТ-изотопная ячейка -tile.machine_precass.name=Прецизионны сборщик +tile.machine_precass.name=Прецизионный сборщик tile.machine_press.name=Пресс tile.machine_puf6_tank.name=Бочка гексафторида плутония tile.machine_pumpjack.name=Станок-качалка @@ -5665,7 +5665,7 @@ tile.nuke_prototype.name=Прототип tile.nuke_solinium.name=Синий Ополаскиватель tile.nuke_tsar.name=Царь-бомба tile.oc_cable_paintable.name=Окрашиваемый сетевой кабель -tile.oc_cable_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отверткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования +tile.oc_cable_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отвёрткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования tile.oil_duct.name=Труба для нефти tile.oil_duct_solid.name=Покрытая труба для нефти tile.oil_pipe.name=Труба для извлечения неочищенной нефти @@ -5799,9 +5799,9 @@ tile.pneumatic_storage_clutter.name=Пневмосистема хранения tile.pneumatic_storage_importer.name=Пневмосистема хранения - Импортёр tile.pneumatic_storage_mono.name=Пневмосистема хранения - Монохранилище tile.pneumatic_tube.name=Пневмотруба -tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ с отверткой, чтобы переключить вход.$ПКМ с отверткой в присяде, чтобы переключить выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. +tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ с отвёрткой, чтобы переключить вход.$ПКМ с отвёрткой в присяде, чтобы переключить выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. tile.pneumatic_tube_paintable.name=Окрашиваемая пневмотруба -tile.pneumatic_tube_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отверткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования +tile.pneumatic_tube_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отвёрткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования tile.pole_satellite_receiver.name=Спутниковая тарелка tile.pole_top.name=Антенна tile.press_preheater.name=Внешний нагреватель пресса @@ -5878,25 +5878,25 @@ tile.rbmk_control_reasim.name=Регулирующие стержни РБМК ( tile.rbmk_control_reasim_auto.name=Автоматические регулирующие стержни РБМК (РеаСим) tile.rbmk_crane_console.name=Консоль крана РБМК tile.rbmk_display.name=Дисплей-панель РБМК -tile.rbmk_display.desc=Может быть подключен с помощью РБМК соединителем.$Отображает сегмент РБМК размером 7x7.$Вид можно поворачивать с помощью отвертки. +tile.rbmk_display.desc=Может быть подключен с помощью РБМК соединителем.$Отображает сегмент РБМК размером 7x7.$Вид можно поворачивать с помощью отвёртки. tile.rbmk_display_blank.name=Редстоун-по-радио пустая панель tile.rbmk_display_blank.desc=Простые панель для расширения консоли управления РпР. tile.rbmk_heater.name=Жидкостный нагреватель РБМК tile.rbmk_indicator.name=Редстоун-по-радио индикаторные лампы -tile.rbmk_indicator.desc=Можно настроить с помощью отвертки.$Устройство может иметь до шести индикаторов$которые загораются, когда значение РпР$попадает в установленный диапазон пороговых значений. +tile.rbmk_indicator.desc=Можно настроить с помощью отвёртки.$Устройство может иметь до шести индикаторов$которые загораются, когда значение РпР$попадает в установленный диапазон пороговых значений. tile.rbmk_key_pad.name=Редстоун-по-радио клавиатура -tile.rbmk_key_pad.desc=Можно настроить с помощью отвертки.$Позволяет установить до четырех различных кнопок, которые$отправляют сигналы РпР при нажатии. +tile.rbmk_key_pad.desc=Можно настроить с помощью отвёртки.$Позволяет установить до четырех различных кнопок, которые$отправляют сигналы РпР при нажатии. tile.rbmk_lever.name=Редстоун-по-радио рычаг -tile.rbmk_lever.desc=Можно настроить с помощью отвертки.$Позволяет установить до двух рычагов,которые отправляют$РпР сигналы в любом положение. +tile.rbmk_lever.desc=Можно настроить с помощью отвёртки.$Позволяет установить до двух рычагов,которые отправляют$РпР сигналы в любом положение. tile.rbmk_gauge.name=Редстоун-по-радио измеритель -tile.rbmk_gauge.desc=Можно настроить с помощью отвертки.$Отображает до четырех измерителей значений из различных$источников сигналов РпР. +tile.rbmk_gauge.desc=Можно настроить с помощью отвёртки.$Отображает до четырех измерителей значений из различных$источников сигналов РпР. tile.rbmk_graph.name=Редстоун-по-радио график -tile.rbmk_graph.desc=Можно настроить с помощью отвертки.$Регистрирует и отображает до двух графиков значений$из разных источников сигналов РпР. +tile.rbmk_graph.desc=Можно настроить с помощью отвёртки.$Регистрирует и отображает до двух графиков значений$из разных источников сигналов РпР. tile.rbmk_loader.name=Паровой проводник РБМК tile.rbmk_loader.desc=Позволяет РБМК иметь внизу соединения для воды и пара$Поместите одну водную трубу под колонной РБМК, затем проводник,$потом подключите паропровод к проводнику. tile.rbmk_moderator.name=Графитовый замедлитель РБМК tile.rbmk_numitron.name=Редстоун-по-радио цифровой дисплей -tile.rbmk_numitron.desc=Можно настроить с помощью отвертки.$Отображает до двух цифровых дисплейных значений$из разных источников сигналов РпР. +tile.rbmk_numitron.desc=Можно настроить с помощью отвёртки$Отображает до двух цифровых дисплейных значений$из разных источников сигналов РпР. tile.rbmk_outgasser.name=Колонна облучения РБМК tile.rbmk_reflector.name=Карбид-вольфрамовый отражатель нейтронов РБМК tile.rbmk_rod.name=Топливный канал РБМК @@ -5980,7 +5980,7 @@ tile.red_cable_classic.name=Провод из красной меди (Стар tile.red_cable_gauge.name=Датчик мощности tile.red_cable_gauge.desc=Кабель, который показывает, сколько энергии$ перемещается по сети за тик.$Разделенные сети, соединенные блоками хранения энергии$рассматриваются как одна общая сеть. tile.red_cable_paintable.name=Окрашиваемый провод из красной меди -tile.red_cable_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отверткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования +tile.red_cable_paintable.desc=Нажмите ПКМ с твердым блоком, чтобы установить краску$Краску можно убрать отвёрткой$Текстуру порта можно отключить устройством разминированием$Краску можно скопировать инструментом копирования tile.red_connector.name=Электрический коннектор tile.red_connector_super.name=Мощный электрический коннектор tile.red_pylon.name=Малый электрический столб diff --git a/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json b/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json index eea8734a3..6167f0fdd 100644 --- a/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json +++ b/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json @@ -12,6 +12,6 @@ "content": { "en_US": "A more devious version of standard buckshot, identical in most ways except that the pellets are incredibly bouncy, ricocheting off of most surfaces multiple times. May be hazardous to the user when used in enclosed spaces.", "zh_CN": "一种更加有弹性的鹿弹,大多数方面与普通鹿弹完全相同,但是弹性极强,能 在绝大多数表面反弹多次。在狭窄区域使用时可能会误伤使用者。", - "ru_RU": "Более коварный вариант стандартной картечи. Практически идентичен ей во всём, кроме того, что дробины невероятно прыгучие и многократно рикошетят от большинства поверхностей. Может быть опасен для самого стрелка при использовании в замкнутых пространствах" + "ru_RU": "Более коварный вариант стандартной картечи. Практически идентична ей во всём, кроме того, что дробины невероятно прыгучие и многократно рикошетят от большинства поверхностей. Может быть опасной для самого стрелка при использовании в замкнутых пространствах" } } From 9a7ee2199a9d1a87667c03b2c3875a4c8ac870e5 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sun, 5 Jul 2026 22:48:08 +0200 Subject: [PATCH 057/107] iced creams --- changelog | 1 + .../TileEntityPneumoStorageExporter.java | 5 ++++ src/main/resources/assets/hbm/lang/en_US.lang | 22 +++++++++--------- .../models/machines/supercomputer.png | Bin 2652 -> 7778 bytes 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/changelog b/changelog index 7ac809e1b..1a05839a3 100644 --- a/changelog +++ b/changelog @@ -83,3 +83,4 @@ * Fixed RoR gauge not using SI suffixes on values below 0 * Fixed AUTOCAL units not closing their GUI when the unit is destroyed * Fixed AUTOCAL's $buffer$ substitution not working +* Fixed meteorite sword localization still being broken diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index f0913de23..e2e0165ce 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -40,6 +40,8 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB public static final int MODE_FULL_REQUEST = 2; public boolean lastRedstone = false; + + public int[] SLOT_ACCESS = new int[] {9, 10, 11, 12, 13, 14, 15, 16, 17}; public TileEntityPneumoStorageExporter() { super(18); @@ -50,6 +52,9 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB return "container.pneumoStorageExporter"; } + @Override public boolean canExtractItem(int slot, ItemStack itemStack, int side) { return slot >= 9; } + @Override public int[] getAccessibleSlotsFromSide(int side) { return SLOT_ACCESS; } + @Override public void updateEntity() { super.updateEntity(); diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 1a30570d7..dc5e332c1 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3287,27 +3287,27 @@ item.meteor_remote.name=Meteorite Remote item.meteorite_sword.name=Meteorite Sword item.meteorite_sword.desc=Forged from a fallen star$Sharper than most terrestrial blades item.meteorite_sword_seared.name=Meteorite Sword (Seared) -item.meteorite_sword.seared.desc=Fire strengthens the blade$Making it even more powerful +item.meteorite_sword_seared.desc=Fire strengthens the blade$Making it even more powerful item.meteorite_sword_reforged.name=Meteorite Sword (Reforged) -item.meteorite_sword.reforged.desc=The sword has been reforged$To rectify past imperfections +item.meteorite_sword_reforged.desc=The sword has been reforged$To rectify past imperfections item.meteorite_sword_hardened.name=Meteorite Sword (Hardened) -item.meteorite_sword.hardened.desc=Extremely high pressure has been used$To harden the blade further +item.meteorite_sword_hardened.desc=Extremely high pressure has been used$To harden the blade further item.meteorite_sword_alloyed.name=Meteorite Sword (Alloyed) -item.meteorite_sword.alloyed.desc=Cobalt fills the fissures$Strengthening the sword +item.meteorite_sword_alloyed.desc=Cobalt fills the fissures$Strengthening the sword item.meteorite_sword_machined.name=Meteorite Sword (Machined) -item.meteorite_sword.machined.desc=Advanced machinery was used$To refine the blade even more +item.meteorite_sword_machined.desc=Advanced machinery was used$To refine the blade even more item.meteorite_sword_treated.name=Meteorite Sword (Treated) -item.meteorite_sword.treated.desc=Chemicals have been applied$Making the sword more powerful +item.meteorite_sword_treated.desc=Chemicals have been applied$Making the sword more powerful item.meteorite_sword_etched.name=Meteorite Sword (Etched) -item.meteorite_sword.etched.desc=Acids clean the material$To make this the perfect sword +item.meteorite_sword_etched.desc=Acids clean the material$To make this the perfect sword item.meteorite_sword_bred.name=Meteorite Sword (Bred) -item.meteorite_sword.bred.desc=Immense heat and radiation$Compress the material +item.meteorite_sword_bred.desc=Immense heat and radiation$Compress the material item.meteorite_sword_irradiated.name=Meteorite Sword (Irradiated) -item.meteorite_sword.irradiated.desc=The power of the Atom$Gives the sword might +item.meteorite_sword_irradiated.desc=The power of the Atom$Gives the sword might item.meteorite_sword_fused.name=Meteorite Sword (Fused) -item.meteorite_sword.fused.desc=This blade has met$With the forces of the stars +item.meteorite_sword_fused.desc=This blade has met$With the forces of the stars item.meteorite_sword_baleful.name=Meteorite Sword (Baleful) -item.meteorite_sword.baleful.desc=This sword has met temperatures$Far beyond what normal material can endure +item.meteorite_sword_baleful.desc=This sword has met temperatures$Far beyond what normal material can endure item.mike_cooling_unit.name=Deuterium Cooling Unit item.mike_core.name=Uranium Coated Deuterium Tank item.mike_deut.name=Deuterium Tank diff --git a/src/main/resources/assets/hbm/textures/models/machines/supercomputer.png b/src/main/resources/assets/hbm/textures/models/machines/supercomputer.png index 0095b0695979a82db0bf4c0af56ad1311edff535..23f523d4ac00c8e1dfcece1b528a048ebe95c3ec 100644 GIT binary patch literal 7778 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 From b9606d3a4867d89f4bbbb5d0fc73b9e53282dcd7 Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Mon, 6 Jul 2026 00:48:41 +0300 Subject: [PATCH 058/107] 1 --- src/main/resources/assets/hbm/lang/ru_RU.lang | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 11f3a7f88..9ba0b1fc2 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -759,6 +759,7 @@ container.pneumoStorageAccess=Терминал доступа ПСХ container.pneumoStorageClutter=Буферное хранилище ПСХ container.pneumoStorageImporter=Импортёр ПСХ container.pneumoStorageMono=Монохранилище ПСХ +container.pneumoStorageExporter=Экспортёр ПСХ container.pneumoTube=Пневмотруба container.press=Пресс container.puf6_tank=Бочка PuF6 @@ -3100,27 +3101,27 @@ item.meteor_remote.name=Устройство для вызова метеори item.meteorite_sword.name=Метеоритовый меч item.meteorite_sword.desc=Выкован из павшей звезды$Острее, чем большинство земных лезвий item.meteorite_sword_seared.name=Метеоритовый меч (Опалённый) -item.meteorite_sword.seared.desc=Огонь укрепляет клинок,$Делая его даже ещё мощнее +item.meteorite_sword_seared.desc=Огонь укрепляет клинок,$Делая его даже ещё мощнее item.meteorite_sword_reforged.name=Метеоритовый меч (Перекованный) -item.meteorite_sword.reforged.desc=Меч был перекован,$Чтобы искоренить прошлые недостатки +item.meteorite_sword_reforged.desc=Меч был перекован,$Чтобы искоренить прошлые недостатки item.meteorite_sword_hardened.name=Метеоритовый меч (Закалённый) -item.meteorite_sword.hardened.desc=Экстремально высокое давление использовано,$Чтобы закаливать этот меч дальше +item.meteorite_sword_hardened.desc=Экстремально высокое давление использовано,$Чтобы закаливать этот меч дальше item.meteorite_sword_alloyed.name=Метеоритовый меч (Легированный) -item.meteorite_sword.alloyed.desc=Кобальт заполняет трещины,$Упрочняя меч +item.meteorite_sword_alloyed.desc=Кобальт заполняет трещины,$Упрочняя меч item.meteorite_sword_machined.name=Метеоритовый меч (Механически обработанный) -item.meteorite_sword.machined.desc=Было использовано передовое оборудование,$Чтобы ещё больше усовершенствовать лезвие +item.meteorite_sword_machined.desc=Было использовано передовое оборудование,$Чтобы ещё больше усовершенствовать лезвие item.meteorite_sword_treated.name=Метеоритовый меч (Обработанный) -item.meteorite_sword.treated.desc=Были применены химикаты,$Делающие меч мощнее +item.meteorite_sword_treated.desc=Были применены химикаты,$Делающие меч мощнее item.meteorite_sword_etched.name=Метеоритовый меч (Гравированный) -item.meteorite_sword.etched.desc=Кислоты очищают материал,$Чтобы получить этот идеальный меч +item.meteorite_sword_etched.desc=Кислоты очищают материал,$Чтобы получить этот идеальный меч item.meteorite_sword_bred.name=Метеоритовый меч (Разведённый) -item.meteorite_sword.bred.desc=Огромные количества тепла и радиации$Сжимают материал +item.meteorite_sword_bred.desc=Огромные количества тепла и радиации$Сжимают материал item.meteorite_sword_irradiated.name=Метеоритовый меч (Облучённый) -item.meteorite_sword.irradiated.desc=Сила Атома$Придает мечу мощи +item.meteorite_sword_irradiated.desc=Сила Атома$Придает мечу мощи item.meteorite_sword_fused.name=Метеоритовый меч (Сплавленный) -item.meteorite_sword.fused.desc=Этот клинок встретился$С силами звёзд +item.meteorite_sword_fused.desc=Этот клинок встретился$С силами звёзд item.meteorite_sword_baleful.name=Метеоритовый меч (Зловещий) -item.meteorite_sword.baleful.desc=Этот меч встретил температуры$Гораздо большие, чем обычный материал может выдержать +item.meteorite_sword_baleful.desc=Этот меч встретил температуры$Гораздо большие, чем обычный материал может выдержать item.mike_cooling_unit.name=Блок охлаждения дейтерия item.mike_core.name=Дейтериевый бак с урановым покрытием item.mike_deut.name=Дейтериевый бак @@ -5798,6 +5799,7 @@ tile.pneumatic_storage_access.name=Пневмосистема хранения - tile.pneumatic_storage_clutter.name=Пневмосистема хранения — Буферное хранилище tile.pneumatic_storage_importer.name=Пневмосистема хранения - Импортёр tile.pneumatic_storage_mono.name=Пневмосистема хранения - Монохранилище +tile.pneumatic_storage_exporter.name=Пневмосистема хранения - Экспортёр tile.pneumatic_tube.name=Пневмотруба tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ с отвёрткой, чтобы переключить вход.$ПКМ с отвёрткой в присяде, чтобы переключить выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. tile.pneumatic_tube_paintable.name=Окрашиваемая пневмотруба From c3936f9ebe353f3590fd4a3d8846fe18a9eeb117 Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Mon, 6 Jul 2026 00:53:48 +0300 Subject: [PATCH 059/107] =?UTF-8?q?=D0=A4=D0=B8=D1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/assets/hbm/manual/weapon/buckshotsharpnel.json | 2 +- src/main/resources/assets/hbm/manual/weapon/demo.json | 2 +- src/main/resources/assets/hbm/manual/weapon/du.json | 2 +- src/main/resources/assets/hbm/manual/weapon/express.json | 2 +- src/main/resources/assets/hbm/manual/weapon/flechettes.json | 2 +- src/main/resources/assets/hbm/manual/weapon/fmj.json | 2 +- src/main/resources/assets/hbm/manual/weapon/grenade.json | 2 +- src/main/resources/assets/hbm/manual/weapon/he.json | 2 +- src/main/resources/assets/hbm/manual/weapon/heat.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json b/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json index 6167f0fdd..9965bf11e 100644 --- a/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json +++ b/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json @@ -12,6 +12,6 @@ "content": { "en_US": "A more devious version of standard buckshot, identical in most ways except that the pellets are incredibly bouncy, ricocheting off of most surfaces multiple times. May be hazardous to the user when used in enclosed spaces.", "zh_CN": "一种更加有弹性的鹿弹,大多数方面与普通鹿弹完全相同,但是弹性极强,能 在绝大多数表面反弹多次。在狭窄区域使用时可能会误伤使用者。", - "ru_RU": "Более коварный вариант стандартной картечи. Практически идентична ей во всём, кроме того, что дробины невероятно прыгучие и многократно рикошетят от большинства поверхностей. Может быть опасной для самого стрелка при использовании в замкнутых пространствах" + "ru_RU": "Более коварный вариант стандартной картечи. Практически идентична ей во всём, кроме того, что дробины невероятно прыгучие и многократно рикошетят от большинства поверхностей. Может быть опасной для самого стрелка при использовании в замкнутых пространствах." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/demo.json b/src/main/resources/assets/hbm/manual/weapon/demo.json index f00b7f8b6..932f863c4 100644 --- a/src/main/resources/assets/hbm/manual/weapon/demo.json +++ b/src/main/resources/assets/hbm/manual/weapon/demo.json @@ -14,6 +14,6 @@ "content": { "en_US": "Demolition explosives are similar to regular high-explosives, however they have a larger splash radius, slightly lower damage, and they break blocks. Not recommended for home defense.", "zh_CN": "破坏者弹药与普通的高爆弹药相似,但爆炸半径更大且伤害略低,并且会破坏 方块。不建议用于守卫基地。", - "ru_RU": "Штурмовые заряды похожи на обычные осколочно-фугасные боеприпасы, однако имеют больший радиус поражения, немного меньший урон и разрушают блоки. Не рекомендуется для самообороны дома" + "ru_RU": "Штурмовые заряды похожи на обычные осколочно-фугасные боеприпасы, однако имеют больший радиус поражения, немного меньший урон и разрушают блоки. Не рекомендуется для самообороны дома." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/du.json b/src/main/resources/assets/hbm/manual/weapon/du.json index acbe13dfc..8f9d0ddc3 100644 --- a/src/main/resources/assets/hbm/manual/weapon/du.json +++ b/src/main/resources/assets/hbm/manual/weapon/du.json @@ -15,6 +15,6 @@ "content": { "en_US": "Ammunition with depleted uranium in its core. The increased density and higher powder load causes this ammo type to have even better armor-piercing properties than AP ammo. The added punch causes the projectiles to penetrate.

Due to their intended effect being kinetic energy, rather than being poisonous, depleted uranium ammunition is not subject to the Hague Conventions of 1899 regarding use of poisonous projectiles in warfare.", "zh_CN": "核心部分含有贫化铀的弹药,其更高的密度和装药量使得其具有较穿甲弹更强 的穿甲能力,加强的冲击力也使得其能够穿透目标。

由于贫铀弹被设计为利用其动能而非毒性,其不受1899年海牙公约关于在 战争中使用毒性弹药的条款的约束。", - "ru_RU": "Боеприпас с сердечником из обеднённого урана. Увеличенная плотность и больший пороховой заряд обеспечивают этому типу патронов ещё более высокие бронебойные свойства, чем у стандартных бронебойных. Повышенная пробивная способность позволяет снарядам проходить цели насквозь.

Поскольку их основным поражающим фактором является кинетическая энергия, а не химическое отравление, боеприпасы с обеднённым ураном не подпадают под действие Гаагской конвенции 1899 года о неприменении снарядов, имеющих единственной целью распространять удушающие или вредоносные газы" + "ru_RU": "Боеприпас с сердечником из обеднённого урана. Увеличенная плотность и больший пороховой заряд обеспечивают этому типу патронов ещё более высокие бронебойные свойства, чем у стандартных бронебойных. Повышенная пробивная способность позволяет снарядам проходить цели насквозь.

Поскольку их основным поражающим фактором является кинетическая энергия, а не химическое отравление, боеприпасы с обеднённым ураном не подпадают под действие Гаагской конвенции 1899 года о неприменении снарядов, имеющих единственной целью распространять удушающие или вредоносные газы." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/express.json b/src/main/resources/assets/hbm/manual/weapon/express.json index feb425c3f..1d3fd60a6 100644 --- a/src/main/resources/assets/hbm/manual/weapon/express.json +++ b/src/main/resources/assets/hbm/manual/weapon/express.json @@ -13,6 +13,6 @@ "content": { "en_US": "FMJ Express is a special type of full metal jacket ammo for revolver calibers. Express ammo has the same armor-piercing effects in addition to increased damage. Express projectiles can penetrate their targets, but unlike AP rounds, Express projectiles become weaker on every penetration. Due to the higher powder load in combination with the basic gunmetal casing, Express ammo causes the gun to wear faster.", "zh_CN": "额外装药FMJ是一种用于转轮手枪弹匣的特殊全金属被甲弹。这种子弹伤害 较高,且具有与全金属被甲弹相同的穿甲效果。这种子弹还可以穿透敌人,但 与穿甲弹不同的是,每穿透一个敌人,子弹的伤害就会降低一些。由于这种子 弹装药量较高,且仍然使用普通炮铜弹壳,其会导致枪械磨损速度加快。", - "ru_RU": "Высокоскоростной оболочечный патрон — это особый тип боеприпасов с цельнометаллической оболочкой для револьверных калибров. Данный тип сочетает в себе бронебойные свойства и повышенный урон. Такие снаряды способны проходить цели насквозь, но, в отличие от стандартных бронебойных патронов, их урон падает с каждым новым пробитием. Из-за увеличенного порохового заряда в сочетании с базовой томпаковой гильзой использование патронов класса «Экспресс» ускоряет износ оружия" + "ru_RU": "Высокоскоростной оболочечный патрон — это особый тип боеприпасов с цельнометаллической оболочкой для револьверных калибров. Данный тип сочетает в себе бронебойные свойства и повышенный урон. Такие снаряды способны проходить цели насквозь, но, в отличие от стандартных бронебойных патронов, их урон падает с каждым новым пробитием. Из-за увеличенного порохового заряда в сочетании с базовой томпаковой гильзой использование патронов класса «Экспресс» ускоряет износ оружия." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/flechettes.json b/src/main/resources/assets/hbm/manual/weapon/flechettes.json index dcffefd69..5b013bd16 100644 --- a/src/main/resources/assets/hbm/manual/weapon/flechettes.json +++ b/src/main/resources/assets/hbm/manual/weapon/flechettes.json @@ -12,6 +12,6 @@ "content": { "en_US": "Flechettes are small fin-stabilized projectiles, contrary to buckshot's round pellets. Flechette shells have less spread and better armor-piercing compared to standard buckshot.", "zh_CN": "箭形弹是小型的鳍形弹药,而非普通鹿弹的圆形弹丸。箭形弹散布更小,且具 有比普通鹿弹更好的穿甲效果。", - "ru_RU": "Флешетты представляют собой небольшие стреловидные снаряды с хвостовым оперением, в отличие от круглых дробин стандартной картечи. Патроны с флешеттами имеют меньшее рассеивание и повышенную бронепробиваемость по сравнению с обычной картечью" + "ru_RU": "Флешетты представляют собой небольшие стреловидные снаряды с хвостовым оперением, в отличие от круглых дробин стандартной картечи. Патроны с флешеттами имеют меньшее рассеивание и повышенную бронепробиваемость по сравнению с обычной картечью." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/fmj.json b/src/main/resources/assets/hbm/manual/weapon/fmj.json index 4fa3d0461..383bb4956 100644 --- a/src/main/resources/assets/hbm/manual/weapon/fmj.json +++ b/src/main/resources/assets/hbm/manual/weapon/fmj.json @@ -19,6 +19,6 @@ "content": { "en_US": "FMJs do not deform when hitting a soft target, meaning they deliver less damage. However, it allows them to pierce armor more effectively. All FMJs have some armor-piercing properties, as well as added damage threshold negation based on the caliber size.", "zh_CN": "全金属被甲弹(FMJ)在击中较软目标时不会解体,因此造成的伤害较低; 然而其特性使得其能够更高效地穿透护甲。所有种类的全金属被甲弹都有一定 的穿甲能力,以及因口径而异的无视伤害阈值的能力。", - "ru_RU": "Оболочечные пули не деформируются при попадании в мягкую цель, из-за чего наносят меньше урона. Однако это позволяет им эффективнее пробивать броню. Все оболочечные патроны обладают базовыми бронебойными свойствами, а также снижают порог защиты цели в зависимости от калибра" + "ru_RU": "Оболочечные пули не деформируются при попадании в мягкую цель, из-за чего наносят меньше урона. Однако это позволяет им эффективнее пробивать броню. Все оболочечные патроны обладают базовыми бронебойными свойствами, а также снижают порог защиты цели в зависимости от калибра." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/grenade.json b/src/main/resources/assets/hbm/manual/weapon/grenade.json index 54a4ee59f..f1d0a8cef 100644 --- a/src/main/resources/assets/hbm/manual/weapon/grenade.json +++ b/src/main/resources/assets/hbm/manual/weapon/grenade.json @@ -13,6 +13,6 @@ "content": { "en_US": "Standard ammunition for grenade and rocket launchers. Deals splash damage in a moderate area.", "zh_CN": "榴弹和火箭弹的标准类型,在中等范围内造成爆炸伤害。", - "ru_RU": "Стандартные боеприпасы для гранатомётов и ракетных установок. Наносят урон по площади в умеренном радиусе" + "ru_RU": "Стандартные боеприпасы для гранатомётов и ракетных установок. Наносят урон по площади в умеренном радиусе." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/he.json b/src/main/resources/assets/hbm/manual/weapon/he.json index ffdd32506..ac3657f84 100644 --- a/src/main/resources/assets/hbm/manual/weapon/he.json +++ b/src/main/resources/assets/hbm/manual/weapon/he.json @@ -16,6 +16,6 @@ "content": { "en_US": "As one would expect, explosive ammunition deals explosive damage to its target, and the surroundings in a small radius. The resulting damage is noticably higher than the gun's base damage, at the cost of causing the gun to wear down significantly faster.

Use of explosive projectiles with a weight of less than 400 grams is prohibited by the Saint Petersburg Declaration of 1868.", "zh_CN": "正如其名,高爆弹药会对目标及其周围小范围的实体造成爆炸伤害。其最终造 成的伤害显著高于枪械的基础伤害,但代价是枪械会加快磨损。

1868年的圣彼得堡宣言禁止了在战争中使用重量低于400克的爆炸弹药。", - "ru_RU": "Как и следовало ожидать, разрывные боеприпасы наносят взрывной урон цели и окружению в небольшом радиусе. Получаемый урон заметно выше базового урона оружия, но ценой значительно более быстрого износа ствола..

Использование разрывных снарядов весом менее 400 граммов запрещено Санкт-Петербургской декларацией 1868 года" + "ru_RU": "Как и следовало ожидать, разрывные боеприпасы наносят взрывной урон цели и окружению в небольшом радиусе. Получаемый урон заметно выше базового урона оружия, но ценой значительно более быстрого износа ствола.

Использование разрывных снарядов весом менее 400 граммов запрещено Санкт-Петербургской декларацией 1868 года" } } diff --git a/src/main/resources/assets/hbm/manual/weapon/heat.json b/src/main/resources/assets/hbm/manual/weapon/heat.json index c4e60d6ea..6131ed21a 100644 --- a/src/main/resources/assets/hbm/manual/weapon/heat.json +++ b/src/main/resources/assets/hbm/manual/weapon/heat.json @@ -13,6 +13,6 @@ "content": { "en_US": "Special type of explosive munition with weaker splash damage compared to high-explosives, which deals massive extra damage on direct hit.", "zh_CN": "特殊的爆炸性弹药,爆炸伤害低于高爆弹药,但直接击中目标时会造成高额 额外伤害。", - "ru_RU": "Особый тип разрывных боеприпасов с меньшим уроном по площади по сравнению со стандартными, который наносит огромный дополнительный урон при прямом попадании" + "ru_RU": "Особый тип разрывных боеприпасов с меньшим уроном по площади по сравнению со стандартными, который наносит огромный дополнительный урон при прямом попадании." } } From c31ec9e08b374cfd7b00cfc1aeaedfaa1c2a028c Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 6 Jul 2026 16:48:43 +0200 Subject: [PATCH 060/107] ough --- changelog | 3 ++- .../java/com/hbm/entity/mob/EntityMaskMan.java | 17 +++++------------ .../entity/mob/ai/EntityAIMaskmanMinigun.java | 8 +++----- .../hbm/handler/BulletConfigSyncingUtil.java | 2 -- .../com/hbm/handler/guncfg/GunNPCFactory.java | 15 --------------- .../java/com/hbm/inventory/gui/GUIRadioRec.java | 2 +- .../TileEntityPneumaticStorageBase.java | 2 +- 7 files changed, 12 insertions(+), 37 deletions(-) diff --git a/changelog b/changelog index 1a05839a3..e80502e33 100644 --- a/changelog +++ b/changelog @@ -11,7 +11,7 @@ * Filters can be set using items or RoR commands * Requests can be configured to take as much as possible, to only take full stacks, or to only take full requests * In combination with assembler recipe switching, using RoR logic, this means that on-demand recipe automation is now possible - * The budget didn't cover actually testing this so uh, you go figure it out + * Still in testing, there's no recpes for any of the parts yet ## Changed * Updated chinese localization @@ -84,3 +84,4 @@ * Fixed AUTOCAL units not closing their GUI when the unit is destroyed * Fixed AUTOCAL's $buffer$ substitution not working * Fixed meteorite sword localization still being broken +* Fixed missing localization on the FM radio diff --git a/src/main/java/com/hbm/entity/mob/EntityMaskMan.java b/src/main/java/com/hbm/entity/mob/EntityMaskMan.java index 64e1658c0..c29a6ce1d 100644 --- a/src/main/java/com/hbm/entity/mob/EntityMaskMan.java +++ b/src/main/java/com/hbm/entity/mob/EntityMaskMan.java @@ -92,25 +92,18 @@ public class EntityMaskMan extends EntityMob implements IBossDisplayData, IRadia } @Override - public void onDeath(DamageSource p_70645_1_) { - super.onDeath(p_70645_1_); + public void onDeath(DamageSource source) { + super.onDeath(source); - List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(50, 50, 50)); + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(100, 100, 100)); for(EntityPlayer player : players) { player.triggerAchievement(MainRegistry.bossMaskman); } } - @Override - public boolean isAIEnabled() { - return true; - } - - @Override - protected boolean canDespawn() { - return false; - } + @Override public boolean isAIEnabled() { return true; } + @Override protected boolean canDespawn() { return false; } @Override protected void dropFewItems(boolean bool, int i) { diff --git a/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java b/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java index 3d451b9d5..94f38d363 100644 --- a/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java +++ b/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java @@ -1,7 +1,7 @@ package com.hbm.entity.mob.ai; -import com.hbm.entity.projectile.EntityBulletBaseNT; -import com.hbm.handler.BulletConfigSyncingUtil; +import com.hbm.entity.projectile.EntityBulletBaseMK4; +import com.hbm.items.weapon.sedna.factory.XFactory762mm; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityLivingBase; @@ -51,11 +51,9 @@ public class EntityAIMaskmanMinigun extends EntityAIBase { if(timer <= 0) { timer = delay; - EntityBulletBaseNT bullet = new EntityBulletBaseNT(owner.worldObj, BulletConfigSyncingUtil.MASKMAN_BULLET, owner, target, 1.0F, 0); + EntityBulletBaseMK4 bullet = new EntityBulletBaseMK4(this.owner, XFactory762mm.r762_fmj, 5F, 0.05F, 0, 0, 0); // TODO: test the offsets owner.worldObj.spawnEntityInWorld(bullet); owner.playSound("hbm:weapon.calShoot", 1.0F, 1.0F); } - - this.owner.rotationYaw = this.owner.rotationYawHead; } } diff --git a/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java b/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java index bf9cddaa0..893eaa866 100644 --- a/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java +++ b/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java @@ -16,7 +16,6 @@ public class BulletConfigSyncingUtil { public static int TURBINE = i++; - public static int MASKMAN_BULLET = i++; public static int MASKMAN_ORB = i++; public static int MASKMAN_BOLT = i++; public static int MASKMAN_ROCKET = i++; @@ -32,7 +31,6 @@ public class BulletConfigSyncingUtil { configSet.put(TURBINE, GunEnergyFactory.getTurbineConfig()); - configSet.put(MASKMAN_BULLET, GunNPCFactory.getMaskmanBullet()); configSet.put(MASKMAN_ORB, GunNPCFactory.getMaskmanOrb()); configSet.put(MASKMAN_BOLT, GunNPCFactory.getMaskmanBolt()); configSet.put(MASKMAN_ROCKET, GunNPCFactory.getMaskmanRocket()); diff --git a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java index d6ffd12f6..995625114 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java @@ -93,21 +93,6 @@ public class GunNPCFactory { return bullet; } - public static BulletConfiguration getMaskmanBullet() { - - BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig(); - - bullet.ammo = new ComparableStack(ModItems.coin_maskman); - bullet.spread = 0.0F; - bullet.dmgMin = 5; - bullet.dmgMax = 10; - bullet.leadChance = 15; - bullet.style = BulletConfiguration.STYLE_FLECHETTE; - bullet.vPFX = "bluedust"; - - return bullet; - } - public static BulletConfiguration getMaskmanTracer() { BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig(); diff --git a/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java b/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java index 7c3184bc4..299785a2a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java @@ -65,7 +65,7 @@ public class GUIRadioRec extends GuiScreen { private void drawGuiContainerForegroundLayer(int x, int y) { - String name = I18nUtil.resolveKey("container.radio"); + String name = I18nUtil.resolveKey("container.radiorec"); this.fontRendererObj.drawString(name, this.guiLeft + this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, this.guiTop + 6, 4210752); if(guiLeft + 137 <= x && guiLeft + 137 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java index c9dca5229..3e4ab8c74 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java @@ -86,7 +86,7 @@ public abstract class TileEntityPneumaticStorageBase extends TileEntityMachineBa } if(this.compair.getFill() > 0) { - int consumption = (int) Math.ceil(this.compair.getFill() * 17 / this.compair.getMaxFill()) + 3; + int consumption = (int) Math.ceil(this.compair.getFill() * 9 / this.compair.getMaxFill()) + 1; this.compair.setFill(Math.max(this.compair.getFill() - consumption, 0)); } From daf1275fc246bc371cab3fe77fee63657f24eafd Mon Sep 17 00:00:00 2001 From: HbmMods Date: Mon, 6 Jul 2026 22:46:45 +0200 Subject: [PATCH 061/107] =?UTF-8?q?=C3=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/mob/ai/EntityAIMaskmanMinigun.java | 2 +- .../gui/processing/gui_supercomputer.png | Bin 0 -> 4136 bytes .../gui/reactors/gui_fusion_breeder.png | Bin 2752 -> 3183 bytes .../gui/reactors/gui_fusion_klystron.png | Bin 3391 -> 3638 bytes .../gui/reactors/gui_fusion_torus.png | Bin 4931 -> 5379 bytes 5 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_supercomputer.png diff --git a/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java b/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java index 94f38d363..f0dca734a 100644 --- a/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java +++ b/src/main/java/com/hbm/entity/mob/ai/EntityAIMaskmanMinigun.java @@ -51,7 +51,7 @@ public class EntityAIMaskmanMinigun extends EntityAIBase { if(timer <= 0) { timer = delay; - EntityBulletBaseMK4 bullet = new EntityBulletBaseMK4(this.owner, XFactory762mm.r762_fmj, 5F, 0.05F, 0, 0, 0); // TODO: test the offsets + EntityBulletBaseMK4 bullet = new EntityBulletBaseMK4(this.owner, XFactory762mm.r762_fmj, 5F, 0.075F, -1.5, -1.5, 0); owner.worldObj.spawnEntityInWorld(bullet); owner.playSound("hbm:weapon.calShoot", 1.0F, 1.0F); } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_supercomputer.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_supercomputer.png new file mode 100644 index 0000000000000000000000000000000000000000..a68dda7ab3cc93e4605826eb7d08c1afac99cdf5 GIT binary patch literal 4136 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 D1_ggS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_breeder.png b/src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_breeder.png index 4510d8219f1fec86530bd32e34a690bb3bcfce9c..eb981107dcd07ded6a3c4e510e071eff24bc497b 100644 GIT binary patch literal 3183 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 Gp7}enTBd#g diff --git a/src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_klystron.png b/src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_klystron.png index d26b84bdb451d9e37e7d8b9cfc7866109771e9a4..b1da9e7743de676befbd8b0a0a92b7976f1d7d06 100644 GIT binary patch delta 3316 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 WIo%uAJf`)_BIHFo%gPJhfBqK)Gi>Yt delta 3076 zcmYjTc|26>A3ifpA-h47J;qW=lrm!%cQm$;MuaRCTF9DgXQX@eE9(rQEG=}>9Q7 zE5x{QZIdl#Fh~r>HU`b`n|}A7-}~QrKJW9q&wHNpdA{epLbF`@X;5SnYh~dQmA6E@ z5Fqa_M_Dc0@xLG}RT?~4Jklp?#X41YD;8^0Uu5z@08X_PKX_YQ*oXL?kXNlEEpn&j z_r>c@N43AT5gZ8~$xQ8mzsZOC7j;fGA(U-JX&0Y&E6p5cHh(AG!1QwVX;kaS^P<-N z>iyYcMDmge@9AHZjs+D?cSU&L$R4Q;~x?ato z$8kn%p>7*_H^#Tr=htSt2DX$6I?{5tLg(P~MTfjmNB-1vPvb(Nl*%UiMP^nY{DJ|)qbx4YG4a4dq424D?{`qZc%BQHB zsILzdeB}(5o+rE=T(HB4nL9HOkeLcjwyFjmm5xf^@9-IRmqj4p#2Dn9XXH{!j%cX5Km+Q>Hg}!+h3XTV(y)zDQ=QTBx@Z5Y-t)085ubs26<#G zFxeQ-Yb=_I0NiBI5aXy7a|(q*=QwG=5^9aX7`djC<%2if>1KtW;{)w?j!iQG=-yyc z8;CuYWfLcA`a|8~bwA>xXy-xm?!5J`U{zjh@H7}$F}I!F6}=w*o_YI$U>@*gwwj;Y zL|9OwzbSBEX4nuLDCzg`{uDqfYD|L~L03zuV}XVzMrEF_3S5TK^j5dY{0F9Y=F z+sCkX-LiK)0m6Z5mDC6zn15sC;oyxk+>@qTW88{;2p65~z|PLP4?~cT+wHLmwCHxOWU4sxH(HczV+E$1O(jeO02as2bANsHb;gTjl$^$7p(yw ze~u?rLtyf#8n6caC%Z}im)ZD0Kc-y%b#?{-dl*Ng?7(%3A&ScXtz3>@O@SBHV zrYjPUkdA*I343&`k^`L)6;e6S(;H}wFUi?w9*_*Iom?=)e^iBh#!H&->OubprJ;d` z9fB%*2#AV42H2)30O$N*>0mM-A*Y7t`iTKA^`M<*7(g%u{6!ML_wl1wR{NL4m(>y$ z7LL9%#j9;Ix8jp*_$GI77q2OY0eBz&^Fbr%^+J+jLVVq*^zGe2y|Iaj3q~+I$Fji@ z$p8^4K;=6CP;>SHB7Ta1H$n~gq{|1|5D?%GJplmGAqeOuqxm3)uLgGiLZSSvd{f%m z+9kNMV#Nchst^_FNZ2#@-U;aeu_K~LyrAjM%2KT*pn6|t2>^ez3iqZvs4m;C@~AEUUQvLk7aI|%{00U^Fu{#j3F(SSAK;B
*1n!Np~x1nSiknBZD z4}Vnl!>@SO`)xnIkv>Al?-PaYZL6( zL|f-}%~m_q*EjW_AE&%Lz5yEIBgr&QR#6N6pNjE8;jXt{mp6|^lG3te*%u?+%r0e< zDVyEbU5?4bZI1fWIZY|xK$sKbesyh$(cpF3s^o=W5hCM})P?kQxPF0dkhp0GbI2~W zM(2O^6la1dcFrB;MUz6oIIk)uyV2e3Y?Gf&#hc-uaj`=yI9Je>;t=4~7+y-ED0Atq z#)mp6VKtfsnx>4y(nVA1A@Sn~j7jRk%*?gLTS-Yt|4~e;{3PW4Zk0^1flh0@N0x@I zmXPk14Kw40$;u~BM7OalrlT9quf`go3p9^R=Vqqgh>L&VCAS?Cvmz9|mn&ofO>fNl zY=58z0oh;&rGc`8jROisE$R`+x&Po!yO89y3To)hY`@smjULN~3p_Z=EXX)SBO!*f zJWpL(S~jQ;x}U;MWHk@(>_q$WU*T8eWC`7LQScM3s{PCq?Mj^Cp)~ywmZE~fc>>PW z^=ENCpD`k+U5bcwOVO z^!fxT$q0p7`J?q7i_R`!(H9Jj;$!_0CzOJ7@-w2OjLoq2(8ii|s@%y~ZB4JvbXe75}c2a@OZ zo7Yb+T!|ZQNo*aT6O->{=Bv?epV91qV+i1!CN^=-w6ie@OWEJ_#Mfy-=tX~kbaXR! z*Q0E7aWm9s{M26d>@ZKakm?PL2~I%UC^r zYt>3`iL=E6<+5P9+HA!Ht{B+$q@B@sy`#2Ju^!#=;nvuT6rK5~2c7Q5K3gVxAjBHGw=lbGiRd z#cX|sg^~;sJ?78Kd)9upnX}yD#8F~T);4qgHjmX3BvjYe&zS`2%YlS`@dF`y0dxHS zqtn56{iN_nG`~ON_&x4?9`Nj8FjnXx*xbG?&z_Esj^tMfm!8Tu>-%oyGgwOP8v+Kt z8r^5(fnUqpx=%<#V>bPe-SW1?4D!BkIKKRfn_I?t=*4ZC#KVp>k5L*e3sL1TYhbyl z4m|y#${fE`Bsp|w#}2+w1A%lWeKpv>KV6AfDXdDoDk_MQ-6kfO?s3;UEy^n@0zt4a zR7*1)9sF?>GZU))c=mP6(9n=7kNf@mn@tYqXj168>^8DX+msa1M^u%_5|K53*ZC9j ziy9VoI#eao5}jkxT=;yMKQb;4tWXkb)FfuFz07M-OxWDqL}F7gmTOmg|M9U_`I7r2 zbVO21;XBbu^b}u6K-uqKP(sWI>eS*?XQpYBMw;qcS<6)s8)rm7i9UJQI%k>wNJEHB``n5LHBu z5O+o34wzq)*wy=&1qm@S)K91C_`ClT$uU}9QKoL^!?erG%TfHC@;tm#VfhLnXV0FM z5`sOFhvTWgqtOnFPQc$UR`(J6MeT``qWcl)K6?T|#SRu*7My`!Sz&*3u&O-g{oudk CsqL-+ diff --git a/src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_torus.png b/src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_torus.png index 48b84ef87f121b9caadb58081697690414b47a0e..edd94f252e17b9aa37971aed054e1eafd0fd79e2 100644 GIT binary patch literal 5379 zcma)Ac{tQv-#;^BiOP}|NsS^~vZd?{iAa`gDQmVHMP?WZGozBF8rg|K$Q~lum!hoA zNMv6^W0{PdF=Kh>e(v|ZuIIU~-s^hKKj)m^`JC_Pe3x_1_xvJEjPwq23UC4d4(eak zxd8x#*@S?7Y|P3Andi!^SWw#f=KGi>XrFU90EcVzb+pU_QWr+;!)^M5*_Rf@=Px&v zP6bFnuHXG6)xv4kib?%k+vd@9W7K7eXG<%9gN5asmR)52QDNsR`^uqaA+Vty*30~S z;-2%mDP__u)4FY!Lw8}3T_UGKj*UOh9$P~8mD6jD%C z4J3CFP?*isadlMA)5~0uX4jUI&QLD9=6f)XHx_I9m-S&+za+L+9xL7^(Kbk)V^03t z6IeGtzl)u#Z_3KbCWYwNeKFe~T}}H=H*YTm?tizC+qO~ktkyngIc!QU3cuXfoPrIl z{8EXd&hh1M1#cK{=Fl@^eLr71q&+hN5h?9TX$ zbothfrrL{kQ`WohUXtTKFnLB9t@$7+Ft|;sHtN*mn^3FeWpWskF#KPHO4fQ{kG@4C z@9pZ*n$<`#WQX;K^~(#oSs@SW(=yRvg00IsE4LPwcARH&l}r~}vx$o{YD9i;sAEm) zt>u2u?N#|gV?d|J`4mLNysKQtVIo7SUinM8J!3Vh5lm$-JpXz|c9!YF0pPZwW z*an4v&oy>(a)RN$hzOB(b?CEg5X0-&f0Dbuqx3GaV43V6K7jst-sIKR2+@>9)je28K zt_{ZggD*e^#dK^t3O$!*C5{z3ZrB|hXRLEbrT@jW-N#k6Tb~RQIx#-|KIs7~5~&K? zMM*jqc5Zeh!bLX4uzfiynn2C3!*4Hw&Calft7#`BU4PEzSSdrC5%#!YW9|DbqKHbT zT<`!~x1aHbLJOkL<=*P}_AA*fjbq35$D5|e+ErMS{iOH1$K%hj_=6W>T{q*arX7YT zRjVm*U5)WY8N0RZ?N(3EwDerfftE$gN?IPWU^~CHF3NalL)bBTXl+e_zJr-|YAJ?^ zr!;=d4&Hv>jVv&jT;7`58~ggYce-Kqci}Pwaruz!?C(W48<5mX>srahTIM4QBuP_d zf!cx5LoO#FBh@H&8EVO7x^zi^%5IcBLnz%3JQxgK;}L6I*Cr!-lh0C)U%91x1=R@G z_cE58rOkTmC(bNKNu=O;n|gZ>+tpP^p4`@@s^FBycXqkuzeew%I`m26JslFy7&}*y zs&DhAVk^#zi#`X;L*hpI=BAk&=1LG~qd%p*GBY@rD@ENDZeMtxiH|CF&Oa^;)U6o-Y7pZkRV;M_-U2(?Lgs zA!Ppf;t_Uo zG{t{bQjs*(%-i(3gB>tsNhsqo{i*tq$~a!z6OUT*gTTv6{)tJj@Y^0K&c6u7guo;i z|Ifq!Cly1w)bMIXq&!X8qG0y`K@^ffPzBv`l3(1>k^3dq+IB2DqFUsvn7&&e~{cKnmr z?`PuMCNajB6?yH4PM`lAwo#*t};))#00b zOg}zA8~9_iCcEw1RoR#54m?{7vSw72iSVbtsIisa0QcwZej zs0`W(@U}e~P1SX%wen&j-%~U2HQTmP#tDC}ezjJ=6Y`uiu~1c9m@9|}3bE*&hFL+J zJ^?PSsW+KRoEWUZt{|15N-x)u@%qXj#y@BqwW+TM+&di)Eg^oq&0xk!ClPX0Y=M?d zsHI4Tnc-kH8cx#psM79uMn!J=7e#wIda!TlrEd`K5Rz%eSzCc~|BNyZs8F_{Q9bU8 z;L~~nF?enhZ7v)$!0kCDm;e|2iHbn)o4Lk^4wO+jrGC-G-~0kf&~C=T3kHMCXh4nR zjRqQHD4|VGa5T0D8T%3$6xV|U2Y_&m#``n(s8kuTg+wn`b?F=atd>P2$hN(l6$F1| zMe4XAeRK`e*cjk5={I*JZVE$i_ojSc%$_#Vz$#Qd8BJ%mZM9Bh8rH02xAO-6UpJtB zI~+1gPq4o77ncxIDmgi>Q=YZ$?^q-Q1*ZGCCB-OxT;DCXt~hczJh6f(#HPa9W>F_Kz#{oC72BpF0nY=MlcLGV4opkU=NpaP|tMDNYb4;$j5JJ_#oSN$rPRxVnEe4~Q{sd=F0%bv*s@{Zz9c z4%DEFqb>0YH95dSNuvw0?@$HmMf)%F_!h#`o;zF_&er}(a-rG%$^CeQ3soUoP??YM zB-p%P)4$)sXt0GHSESmNq}@a5^3=amNAcx2MadB*O@m&FQrW$ zDo&xvvLmu1o}B&SF2^p^v~a?zv-p#aVE@9cmSF4Px~HC~S z=zEP#*4yGb_f};%%N*ttWLkPD+$Bud2X*VXH5i)*5}BtKU7ypxjxe1b42ER z-K~MuTLjo&3Ic!ak1!wgvbtvb;ll@$lKzXmSJUmHvL4C4(7oKkaB<;sP!hZo9IXDG zZx#b9Pm>F4e*J-7rRr7K7a8DOr<)aBp%U-A@!Og=OT-fetWTh8M~^PE&1b7L)PCQ1 zs7`w4QE@9^@zc-Ykp(ntQFt&3mhmnFU!oxJLRd>E?{WF}l+W{mh{Jnz7b#b@~Wif0a*&N->oU7c8XY#u>~eYt+bTnJ$DWgKKX%pucH-p9K*{mo8n} zcE2sQ6mm9lKlGTi4ZkKnGTxuz$kilv_oH#&u?7}aNZN8?6jKXF3J`VdQ2|F-Ml{W; ztGI+tWc`5Ly?4*0VLHL$6d~;#oyGaWk;jUs{Z+GmS>T@p}4*v5V1f5q?Ifd%i zh9u4vwgD4#bDi%m6-!IY(yFSq&+>7}#Tz#0#_s&JLcmOAWNfSP!-~b3gLjXb3&(iK z@=x@{QwD;4X=l&G^hYOUtbvzLIHAs!WsQQ_k(}IM_jOPYr7CEZ12^-VJLw%>B%&;* zYRbDv(kV@y|G91b(SP*n>!sR1o0ne3-zpIR0@}usN zN4u@z^3gsJA@^p>-l-Lj*&^=bt~^lM*a#meZO-AO+CCdOXlo_x7QAL{XU7J9FD!iY z5xnc=b#z5(_&6VUBv9!wKrj+p@=i!d0D|{s>+QI`>z2Pnw_?}6=>gmYH)5#-d^IXEh*^|SYvxzei|KVeI*grJda5$&3+l_}o{ewtwlCYG`uh6rarJ;D zp~}{8;WWULFaXuP9K1Q$_+gjJ> zdl|!A(qp&1PyF$)rSu(D0@tJOw}lBt?6Y`smG`FGvZ$_`maS?{4e3Meg)F*`Mc((h zjAy37^dwe0#ast>X+-$^x%>AQKvySt2-A$5LNnbWqxDkWl=Nb~GIF^+gb z6eX_)?xwoT%=&1tUgmg__Rk9XZE7Vp<{{C-z>hFa*h)`NZ>7^!z~ZN47sXEPX!%yh zqPP38L+qe#o3_M}IiL08e9PDEH+^E>vA(@|K`kO?%ESD}0q&bZhNdco1FCgy%v@Va znj1KK$}Xm-Loh>|zBL*2JeC~JJEDDJ#<2}Qs))wlp1*>=zja>f{Q1|lCpfuS~OvYRKnZbM&J)b)8BrCuP4N|7x|Z!(v=VmLKK$?WdYP<5)KpL1$<1B8KAQ zF7d%ZPEHP9%FMz|dXE#)s938SV!fnBnL34JR9lI^vVzat-oiag)5guQM=-xwMukaEan{ ziVY;osF(tiNe%7WzRj+|T_1ta>Xlqhpc89CfS0O*tA@}YWHLFmqT(VcMMsCOkAFz4 zM$L2-!z@z2x?vH!`zz_sPUQ3SFaYmA#njd1EFx({*vwo-|K^uxCuG)6$9Q>papm3T z5r3!&&=~oSp&iwLCpoNQ;b2_9=TQNYIs0F|=~*&);VVOrro zfd9V>|IGcjzJ^^G(1Q+hVQS-ag34)lIHVTJXX^65rVxK3uxn-gO}}YqWF)ox!w1*T zAJ4`V7iB+1QAes{(q4%Z3PeE&(mu{?62UcpZR9b%>M1!`}fV>-*@k_kq*}Zp#uN_ zE?PS(SE5D8NA;#mfeV&jq+~y z#M2ZwUi$Z^h)jx{eR$y|ZTz0U+k!*@UQnosH_$OEM(^!J+si`z-h2|Zd!v{{AyMc= zxzeli8}lSe0f9ITa23nrR*-a1IyTc#p7yqa$?Wrs6yLq0Vf>6$*#+Jm(my ze)Z<=62cYbMY8M?DQUDH8@YL2=+%$;lO93MzL`b3wy(45a0@$!q>JhOJ=-yvI!B>s zjc3{Uy&e!SNPgD~%g}w^ehwRZKO~i%QzTi-eCV5E!*0SQ4CCqOPbl#6_WlJ2nVFeH zUlEZ-QDv|^=vm&2Re}=j<;G@>lTYv)U`tES>w4Tq&pxb7*0qtE=8w7&bTe#KRWHrJ2+F)sH{lYQD_(eRLZF z(tc)B8F*i)tf{rSO}^ zw|6XTX{@hbzn%>w08S~05|#g%<8fF;MFp0C%8=L@c4v@Cq#j3o6bJEzx}{kaJ$;Zp zV7~7RsE+{krdaGt@ZIga3{9IirLhNz&8O`-!5R|zqy>pRT}Uqu6-&Es(!1&C0LKn( zH~2RNF-*BsaRG2F1BzNZ`yMgo3SU2)=DWS>zqK`CteMgsyn1g7cD=QS=1kfO-`$?k zZj+yyE5v1Q6H2V2Y<4?%04BOYi>F~ZGLh@tnhV9o_j6cqHcbkF<0{EIe@ayuq{-g6D58zjUO-~s?h|gWO-j3JWUi-* zWKc(OQ@bK2ky~_l6AVE0h!vfv)(=1qamy)0eyBGtFU8b6L<~20>nNhDrsNzpCI+gC z`4EHoP^H$p!XTwId~t75xdOi73+a$_B@W)gRR~eio7^FS zKEI&^&ZM!Px?g!P^IVi0$sZ_KAL?Q2>RW7wXgYG+|Jk!oecTKQbcNq2t?DoZ(FWjS zUg^j)XneB>c#7556K+)Ek1tSz5hbz5{@%u1^^f16@-VqZJc!e?BAkQqCMW?mkein< zmbqWEI~zL2N#u3+44MWx%vCo?(c-?pZROL6)U#N;@i$oh6p*!xl zLC5%rr`=D~e0qkJVA`AsNk8`cIMYC?=3pzY`-woy6O63~<)t-LIe)-Ee84NcvMTJT z60nK}L=lk2wCFFxQ-7?y518Yt$IR)xPxj_}ijC8?BIu-?+Z~^O-*(BskGE9?CMUw} zi1>U4;t%4OZpe3HlAuIPT0By!GZ$73zI{-`NPW=4EvtNpG4_UN?ev1p8R zX=aYV1*(BEvY>w6PgP9#q%_I1twx}qH^UEv1nOfV)yI2AQ-Zk1dOQDEr7+&sBRAHT zc6Me=Q7B)!@+O6nkj%f4^~{<@@VGa*%y|-L@v}v`U%nez?_HB=S;H!KX>gl%wy&m3 zr2$tdf>n&Jp7>Dq%aLa>@|W4QObk}I+$`}Cq;2%gAqTE zq6hubS#!85FV*a&IZD6alWlWzSOyUR}B>NM`f|LHm<;foboW zQVMDQ;3oQYX?wY!$T;7X$U}jc#a31kDle4% z9$hnHTHu|xXYa{K_#Ok90W+|g&_6-mN=|_i8-95BtC{Gh@PNN{7+We~bC?{iVe&S= z)HnZeVEFwG$RRC5@JJ!rKzJ_ipMv~V2>M@-fmZ)b$1ZIJ_dHSfG?3Bwd-|>t_`+mR zenPGEKRfIu7Dos(iz-N@Y;I`ZdtZM-k2o;`NLEy>g(bp1FXmpG zpP#SsT{HTnj#UEcRC?rqxvrO-;25fNH4=$La@Tz;_+eJiXpeQl-`hiQbj+=oG0%d! zofmTBxMxO>9M!c+OiW~^46dHm%tkCe+EOSXE}mlG%x$kK=7_n~iIx6q z5j&#Qy&hVsXKiykTd!y7U$?U2mp8bQ0c{9?>mPZ9S6U|CP*5>gF%N&Bju#5*jb`T1^nu2stn2pN;;}rw@)+9KER5PQT>``^yt$OI9va-zN_Qf!Ei%lc+H1K;z zAXo(oxR5BcYgSeUqO8NQ*<`%1@S#18mt_oj?OV!anajG!fidn@((6%@_c>U8l-p6n zbeh@-bU7HWoaaa5Ud8&@eUQYh-WCybyd@1x-{?jHMfNRBfuAoNt#FkLWx}?Fx1D*d zs;m~o(pGpDcKMS)R9C>O&^p<1l3anWw0-5P2tN13jH1ocbNZH+T5Q<2!qZGTjWvJu zE-5ef$8$Qn6sx6;ATG(!PosxJhV^)BVqEZ+mlJf0JKbWLB^6Pp?qv{eGD1S(4>ch1 ziw)9Mx`2Qc<@^an`^ezdRb@xRS>!HIp@9o0^m0lh%P0xv&Lw!A+{X>vkw!knI){45 zfl)`vEz`9onhkOt3<;yh^9!tqu9K@A;;pg=vqsI`!W8mbJK&p|T1L1hwYsMY{mtTw z-{CZZ{`@==NJ%Gje^DckyF`ps*$pr0N!6F1wf=*^qG=}fxwEHvPIy4ekA{ftfsUyL zFTYq&zT9*Mfq?qa(8nZXA^qD$ykTKs*wtqRpJo*WfR|dD!RiPhhzFfxdOt-n^pww& z4oqmM&^GPPoqeXgda)bFGUB;`$#9$~rRX%pF(X7Vpzp4ilMT=vtgu;}SoN4K;TdQz z20qM9gB7l41a>UWtSSbWCS-2NyLx(Z03Sa;mKI;1;NWYm6P0)=5PRWf^^G9qtnUp2 z!^5mT^)GqYptZZy`57_Bue)#-P-a`#Mvd)}Mp#){)sP9Pquv0K)H0)7I@j`83nK0& zCm75{sH{F-yv6&%Vs+#1(_vBnv#QfsnC>#`)+ zCoOTcTPpM3qjcj7LKjB{R$NXLz;*cfD3DBkk&)r%5!>q;VeX&jw;~^WEuheh3eVl< zs=oUAPSDSgmf(nbFT}4en@@gp7LeAi@RM&LUed{1)GZZEPlQ%)i{0H`xRJ8}2U8yOg{2wf$M`_FDG{wyQd ztZ`q>EuOSxDXH8SMW;Scb%wqjmfpBme7Ue&9sZQc`G&RD!#HACHCBb1ap14|b!4Ei zluRy4q_!2}9B$vfP~FlQYYrjax+rw4|58#?5(Jz&b;^|T?fJf%=D&1K~4>XgZ!702afI3lCbA-Id7052GmePl+n3+78)C62SfrTg(*-O zcT~e-s`Ce5JaTi~Jj%I#wiS%&4}O2((O;4jAqbr6XEh;20m{L_9ASldM;`k`ccj5GT1>#|NuCYcLGtmm5m{X}M(6Vrv%Olg!#DPY?e5Tq2tOwKfuDZ(&7AWx1KW@nn}^4&i4sSBAWtnqk4=u2&rF XDAf)98p!-927sQHk!G2Oee{0;xq>!C From 5db16ec23143ffb148df94c38eb532202266ff43 Mon Sep 17 00:00:00 2001 From: TheVitya2127 Date: Tue, 7 Jul 2026 04:13:11 +0400 Subject: [PATCH 062/107] Terrariarist --- .../java/com/hbm/main/ResourceManager.java | 4 +- .../assets/hbm/models/bombs/mine_fat.obj | 1447 +++++++++++++++++ .../resources/assets/hbm/models/mine_fat.obj | 1208 -------------- .../hbm/textures/models/bombs/mine_fat.png | Bin 0 -> 1763 bytes .../assets/hbm/textures/models/mine_fat.png | Bin 2235 -> 0 bytes 5 files changed, 1449 insertions(+), 1210 deletions(-) create mode 100644 src/main/resources/assets/hbm/models/bombs/mine_fat.obj delete mode 100644 src/main/resources/assets/hbm/models/mine_fat.obj create mode 100644 src/main/resources/assets/hbm/textures/models/bombs/mine_fat.png delete mode 100644 src/main/resources/assets/hbm/textures/models/mine_fat.png diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 6f6726082..280da2c97 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -61,7 +61,7 @@ public class ResourceManager { //Landmines public static final IModelCustom mine_ap = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/ap_mine.obj")).asVBO(); public static final IModelCustom mine_marelet = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/marelet.obj")).asVBO(); - public static final IModelCustom mine_fat = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mine_fat.obj")); + public static final IModelCustom mine_fat = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/bombs/mine_fat.obj")); public static final IModelCustom mine_naval = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/naval_mine.obj")).asVBO(); //Oil Pumps @@ -469,7 +469,7 @@ public class ResourceManager { //public static final ResourceLocation mine_he_tex = new ResourceLocation(RefStrings.MODID, "textures/models/mine_he.png"); public static final ResourceLocation mine_marelet_tex = new ResourceLocation(RefStrings.MODID, "textures/models/bombs/mine_marelet.png"); public static final ResourceLocation mine_shrap_tex = new ResourceLocation(RefStrings.MODID, "textures/models/bombs/mine_shrapnel.png"); - public static final ResourceLocation mine_fat_tex = new ResourceLocation(RefStrings.MODID, "textures/models/mine_fat.png"); + public static final ResourceLocation mine_fat_tex = new ResourceLocation(RefStrings.MODID, "textures/models/bombs/mine_fat.png"); public static final ResourceLocation mine_naval_tex = new ResourceLocation(RefStrings.MODID, "textures/models/NMine.png"); diff --git a/src/main/resources/assets/hbm/models/bombs/mine_fat.obj b/src/main/resources/assets/hbm/models/bombs/mine_fat.obj new file mode 100644 index 000000000..e9993c675 --- /dev/null +++ b/src/main/resources/assets/hbm/models/bombs/mine_fat.obj @@ -0,0 +1,1447 @@ +# Blender 5.1.2 +# www.blender.org +# Made By TheVitya2127 + +o Sphere +v 0.132583 0.367417 -0.656250 +v -0.132583 0.367417 -0.656250 +v -0.132583 0.632582 -0.656250 +v 0.000000 0.062500 -1.093750 +v 0.191342 0.038060 -1.093750 +v 0.000000 -0.000000 -1.093750 +v -0.191342 0.038060 -1.093750 +v -0.167424 0.095803 -0.843750 +v -0.167424 0.095803 -1.093750 +v -0.353554 0.146446 -0.843750 +v -0.191342 0.038060 -0.843750 +v -0.461940 0.308658 -0.843750 +v -0.309359 0.190641 -0.843750 +v -0.461940 0.308658 -1.093750 +v -0.404197 0.332576 -0.843750 +v -0.437500 0.500000 -1.093750 +v -0.500000 0.500000 -1.093750 +v -0.461940 0.691341 -1.093750 +v -0.461940 0.691341 -0.843750 +v -0.404197 0.667424 -1.093750 +v -0.309359 0.809359 -0.843750 +v -0.353554 0.853553 -0.843750 +v -0.167424 0.904197 -0.843750 +v -0.191342 0.961940 -0.843750 +v -0.191342 0.961940 -1.093750 +v 0.000000 0.937500 -1.093750 +v 0.000000 1.000000 -1.093750 +v 0.167424 0.904197 -1.093750 +v 0.191342 0.961940 -1.093750 +v 0.167424 0.904197 -0.843750 +v 0.191342 0.961940 -0.843750 +v 0.309359 0.809359 -0.843750 +v 0.353554 0.853553 -0.843750 +v 0.191342 0.038060 -0.843750 +v 0.167424 0.095802 -1.093750 +v 0.167424 0.095802 -0.843750 +v 0.309359 0.190640 -0.843750 +v 0.404197 0.332576 -0.843750 +v 0.353554 0.146446 -0.843750 +v 0.461940 0.308658 -1.093750 +v 0.404197 0.332576 -1.093750 +v 0.437500 0.500000 -1.093750 +v 0.461940 0.691342 -1.093750 +v 0.404197 0.667424 -1.093750 +v 0.461940 0.691342 -0.843750 +v 0.404197 0.667424 -0.843750 +v 0.191342 0.961940 -0.718750 +v 0.309359 0.809359 -0.718750 +v 0.353554 0.853553 -0.718750 +v 0.000000 1.000000 -0.718750 +v 0.167424 0.904197 -0.718750 +v -0.191342 0.961940 -0.718750 +v 0.000000 0.937500 -0.718750 +v -0.353554 0.853553 -0.718750 +v -0.167424 0.904197 -0.718750 +v -0.461940 0.691341 -0.718750 +v -0.309359 0.809359 -0.718750 +v -0.437500 0.500000 -0.718750 +v -0.404197 0.667424 -0.718750 +v -0.461940 0.308658 -0.718750 +v -0.500000 0.500000 -0.718750 +v -0.309359 0.190641 -0.718750 +v -0.404197 0.332576 -0.718750 +v -0.353554 0.146446 -0.718750 +v -0.167424 0.095803 -0.718750 +v -0.191342 0.038060 -0.718750 +v 0.000000 0.062500 -0.718750 +v 0.000000 -0.000000 -0.718750 +v 0.167424 0.095802 -0.718750 +v 0.353554 0.146446 -0.718750 +v 0.191342 0.038060 -0.718750 +v 0.404197 0.332576 -0.718750 +v 0.309359 0.190640 -0.718750 +v 0.461940 0.308658 -0.718750 +v 0.437500 0.500000 -0.718750 +v 0.461940 0.691342 -0.718750 +v 0.500000 0.500000 -0.718750 +v 0.404197 0.667424 -0.718750 +v 0.031250 0.937500 -0.593750 +v -0.031250 0.937500 -0.843750 +v -0.031250 0.937500 -0.593750 +v -0.031250 0.625000 -0.843750 +v 0.031250 0.625000 -0.593750 +v -0.031250 0.625000 -0.593750 +v -0.031250 0.062500 -0.593750 +v 0.031250 0.062500 -0.843750 +v 0.031250 0.062500 -0.593750 +v 0.031250 0.625000 -0.843750 +v 0.031250 0.937500 -0.843750 +v 0.031250 0.781250 -0.437500 +v 0.031250 0.375000 -0.843750 +v -0.031250 0.375000 -0.593750 +v 0.031250 0.375000 -0.593750 +v -0.031250 0.375000 -0.843750 +v -0.031250 0.062500 -0.843750 +v -0.031250 0.218750 -0.437500 +v 0.437500 0.468750 -0.593750 +v 0.437500 0.531250 -0.843750 +v 0.437500 0.531250 -0.593750 +v 0.125000 0.531250 -0.843750 +v 0.125000 0.468750 -0.593750 +v 0.125000 0.531250 -0.593750 +v -0.437500 0.531250 -0.593750 +v -0.437500 0.468750 -0.843750 +v -0.437500 0.468750 -0.593750 +v 0.125000 0.468750 -0.843750 +v 0.437500 0.468750 -0.843750 +v 0.281250 0.468750 -0.437500 +v -0.125000 0.468750 -0.843750 +v -0.125000 0.531250 -0.593750 +v -0.125000 0.468750 -0.593750 +v -0.125000 0.531250 -0.843750 +v -0.281250 0.531250 -0.437500 +v -0.071754 0.673227 -0.656250 +v 0.000000 0.687500 -0.656250 +v 0.071753 0.673227 -0.656250 +v 0.132583 0.632582 -0.656250 +v 0.173228 0.571753 -0.656250 +v 0.187500 0.500000 -0.656250 +v 0.173228 0.428247 -0.656250 +v 0.071753 0.326772 -0.656250 +v 0.000000 0.312500 -0.656250 +v -0.071754 0.326772 -0.656250 +v -0.173228 0.428247 -0.656250 +v -0.187500 0.500000 -0.656250 +v -0.173228 0.571753 -0.656250 +v -0.404197 0.332576 -1.093750 +v -0.404197 0.667424 -0.843750 +v -0.167424 0.904197 -1.093750 +v 0.461940 0.308658 -0.843750 +v 0.500000 0.500000 -1.093750 +v -0.031250 0.781250 -0.437500 +v 0.031250 0.218750 -0.437500 +v -0.437500 0.531250 -0.843750 +v 0.281250 0.531250 -0.437500 +v -0.281250 0.468750 -0.437500 +v -0.309359 0.809359 -0.343750 +v -0.461940 0.691342 0.031250 +v -0.353554 0.853553 0.031250 +v -0.309359 0.809359 0.406250 +v -0.132583 0.632583 0.718750 +v -0.404197 0.667424 0.406250 +v -0.173228 0.571753 0.718750 +v -0.167424 0.904197 -0.343750 +v -0.191342 0.961940 0.031250 +v 0.000000 0.937500 -0.343750 +v 0.000000 1.000000 0.031250 +v 0.167424 0.904198 -0.343750 +v 0.191342 0.961940 0.031250 +v 0.309359 0.809359 -0.343750 +v 0.353554 0.853553 0.031250 +v 0.404197 0.667424 -0.343750 +v 0.461940 0.691342 0.031250 +v 0.437500 0.500000 -0.343750 +v 0.500000 0.500000 0.031250 +v 0.404197 0.332576 -0.343750 +v 0.461940 0.308658 0.031250 +v 0.309359 0.190640 -0.343750 +v 0.353554 0.146446 0.031250 +v 0.167424 0.095802 -0.343750 +v 0.191342 0.038060 0.031250 +v 0.000000 0.062500 -0.343750 +v 0.000000 0.000000 0.031250 +v -0.191342 0.038060 0.031250 +v -0.353554 0.146446 0.031250 +v -0.167424 0.095803 -0.343750 +v -0.461940 0.308658 0.031250 +v -0.309359 0.190641 -0.343750 +v -0.437500 0.500000 -0.343750 +v -0.500000 0.500000 0.031250 +v -0.404197 0.667424 -0.343750 +v -0.404197 0.332576 -0.343750 +v -0.167424 0.904197 0.406250 +v 0.000000 0.937500 0.406250 +v 0.167424 0.904198 0.406250 +v 0.309359 0.809360 0.406250 +v 0.404197 0.667424 0.406250 +v 0.437500 0.500000 0.406250 +v 0.404197 0.332576 0.406250 +v 0.309359 0.190641 0.406250 +v 0.167424 0.095803 0.406250 +v 0.000000 0.062500 0.406250 +v -0.167424 0.095803 0.406250 +v -0.309359 0.190641 0.406250 +v -0.404197 0.332576 0.406250 +v -0.437500 0.500000 0.406250 +v -0.071754 0.673228 0.718750 +v 0.000000 0.687500 0.718750 +v 0.071753 0.673228 0.718750 +v 0.132583 0.632583 0.718750 +v 0.173228 0.571753 0.718750 +v 0.187500 0.500000 0.718750 +v 0.173228 0.428247 0.718750 +v 0.132583 0.367418 0.718750 +v 0.071753 0.326773 0.718750 +v 0.000000 0.312500 0.718750 +v -0.071754 0.326773 0.718750 +v -0.132583 0.367418 0.718750 +v -0.173228 0.428247 0.718750 +v -0.187500 0.500000 0.718750 +v 0.000000 0.500000 0.843750 +v -0.500000 0.500000 -0.843750 +v 0.500000 0.500000 -0.843750 +v 0.000000 1.000000 -0.843750 +v 0.000000 -0.000000 -0.843750 +v -0.437500 0.500000 -0.843750 +v 0.437500 0.500000 -0.843750 +v 0.000000 0.937500 -0.843750 +v 0.000000 0.062500 -0.843750 +v 0.031250 1.164062 -0.437500 +v 0.250000 0.812500 0.875000 +v 0.375000 0.687500 0.375000 +v 0.250000 0.437500 0.875000 +v 0.375000 0.312500 0.375000 +v -0.250000 0.812500 0.875000 +v -0.375000 0.687500 0.375000 +v -0.250000 0.437500 0.875000 +v -0.375000 0.312500 0.375000 +v 0.156250 0.875000 0.937500 +v 0.156250 0.906250 0.937500 +v 0.187500 0.875000 0.906250 +v 0.187500 0.906250 0.906250 +v 0.187500 0.875000 0.843750 +v 0.187500 0.906250 0.843750 +v 0.156250 0.875000 0.812500 +v 0.156250 0.906250 0.812500 +v 0.093750 0.875000 0.812500 +v 0.093750 0.906250 0.812500 +v 0.062500 0.875000 0.843750 +v 0.062500 0.906250 0.843750 +v 0.062500 0.875000 0.906250 +v 0.062500 0.906250 0.906250 +v 0.093750 0.875000 0.937500 +v 0.093750 0.906250 0.937500 +v 0.141180 0.937500 0.835937 +v 0.108820 0.937500 0.835937 +v 0.125000 0.937500 0.875000 +v 0.085938 0.937500 0.858820 +v 0.085938 0.937500 0.891180 +v 0.141180 0.937500 0.914062 +v 0.164062 0.937500 0.891180 +v 0.108820 0.937500 0.914062 +v 0.164062 0.937500 0.858820 +v -0.109375 0.906250 0.921875 +v -0.109375 1.156250 0.921875 +v -0.078125 0.906250 0.890625 +v -0.078125 1.156250 0.890625 +v -0.078125 0.906250 0.859375 +v -0.078125 1.156250 0.859375 +v -0.109375 0.906250 0.828125 +v -0.109375 1.156250 0.828125 +v -0.140625 0.906250 0.828125 +v -0.140625 1.156250 0.828125 +v -0.171875 0.906250 0.859375 +v -0.171875 1.156250 0.859375 +v -0.171875 0.906250 0.890625 +v -0.171875 1.156250 0.890625 +v -0.140625 0.906250 0.921875 +v -0.140625 1.156250 0.921875 +v 0.031250 0.406250 1.125000 +v 0.031250 0.406250 1.062500 +v 0.031250 0.218750 1.125000 +v 0.031250 0.218750 1.062500 +v -0.093750 0.406250 1.125000 +v -0.093750 0.406250 1.062500 +v -0.093750 0.218750 1.125000 +v -0.093750 0.218750 1.062500 +v 0.250000 0.875000 1.062500 +v 0.250000 0.875000 0.687500 +v 0.250000 0.125000 1.062500 +v 0.250000 0.125000 0.687500 +v -0.250000 0.875000 1.062500 +v -0.250000 0.875000 0.687500 +v -0.250000 0.125000 1.062500 +v -0.250000 0.125000 0.687500 +v 0.000000 0.287995 1.235870 +v 0.000000 0.340822 1.122582 +v 0.000000 0.231351 1.209457 +v 0.000000 0.284178 1.096168 +v -0.062500 0.287995 1.235870 +v -0.062500 0.340822 1.122582 +v -0.062500 0.231351 1.209457 +v -0.062500 0.284178 1.096168 +v -0.078125 1.468750 0.859375 +v -0.078125 1.468750 0.890625 +v -0.078125 1.156250 0.859375 +v -0.078125 1.156250 0.890625 +v 0.031250 1.164062 0.375000 +v 0.031250 1.164062 0.312500 +v 0.031250 0.914062 0.375000 +v 0.031250 0.914062 0.312500 +v -0.031250 1.164062 0.375000 +v -0.031250 1.164062 0.312500 +v -0.031250 0.914062 0.375000 +v -0.031250 0.914062 0.312500 +v 0.031250 1.226562 0.312500 +v -0.031250 1.226562 0.312500 +v -0.031250 1.226562 -0.375000 +v 0.031250 1.226562 -0.375000 +v 0.031250 1.164062 -0.375000 +v -0.031250 1.164062 -0.375000 +v -0.031250 1.164062 -0.437500 +v -0.031250 0.851562 -0.437500 +v 0.031250 0.851562 -0.437500 +v 0.031250 0.851562 -0.375000 +v -0.031250 0.851562 -0.375000 +v -0.125000 0.906250 0.875000 +v -0.093750 0.875000 0.937500 +v -0.093750 0.906250 0.937500 +v -0.062500 0.875000 0.906250 +v -0.062500 0.906250 0.906250 +v -0.062500 0.875000 0.843750 +v -0.062500 0.906250 0.843750 +v -0.093750 0.875000 0.812500 +v -0.093750 0.906250 0.812500 +v -0.156250 0.875000 0.812500 +v -0.156250 0.906250 0.812500 +v -0.187500 0.875000 0.843750 +v -0.187500 0.906250 0.843750 +v -0.187500 0.875000 0.906250 +v -0.187500 0.906250 0.906250 +v -0.156250 0.875000 0.937500 +v -0.156250 0.906250 0.937500 +vn -0.0000 -0.0000 -1.0000 +vn -0.9239 0.3827 -0.0000 +vn 0.3827 -0.9239 -0.0000 +vn 0.3827 0.9239 -0.0000 +vn -0.9239 -0.3827 -0.0000 +vn 0.9239 -0.3827 -0.0000 +vn 0.9239 0.3827 -0.0000 +vn -0.3827 -0.9239 -0.0000 +vn -0.3827 0.9239 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 0.7071 0.7071 +vn -0.0000 -0.7071 0.7071 +vn 0.7071 -0.0000 0.7071 +vn -0.7071 -0.0000 0.7071 +vn -0.6541 0.4371 -0.6173 +vn -0.8206 0.5483 -0.1613 +vn -0.8206 0.5483 0.1613 +vn -0.6541 0.4371 0.6173 +vn -0.5483 0.8206 -0.1613 +vn -0.1925 0.9679 -0.1613 +vn 0.1925 0.9679 -0.1613 +vn 0.5483 0.8206 -0.1613 +vn 0.8206 0.5483 -0.1613 +vn 0.9679 0.1925 -0.1613 +vn 0.9679 -0.1925 -0.1613 +vn 0.8206 -0.5483 -0.1613 +vn 0.5483 -0.8206 -0.1613 +vn 0.1925 -0.9679 -0.1613 +vn -0.1925 -0.9679 -0.1613 +vn -0.5483 -0.8206 -0.1613 +vn -0.8206 -0.5483 -0.1613 +vn -0.9679 -0.1925 -0.1613 +vn -0.9679 0.1925 -0.1613 +vn -0.4371 0.6541 -0.6173 +vn -0.1535 0.7716 -0.6173 +vn 0.1535 0.7716 -0.6173 +vn 0.4371 0.6541 -0.6173 +vn 0.6541 0.4371 -0.6173 +vn 0.7716 0.1535 -0.6173 +vn 0.7716 -0.1535 -0.6173 +vn 0.6541 -0.4371 -0.6173 +vn 0.4371 -0.6541 -0.6173 +vn 0.1535 -0.7716 -0.6173 +vn -0.1535 -0.7716 -0.6173 +vn -0.4371 -0.6541 -0.6173 +vn -0.6541 -0.4371 -0.6173 +vn -0.7716 -0.1535 -0.6173 +vn -0.7716 0.1535 -0.6173 +vn -0.5483 0.8206 0.1613 +vn -0.1925 0.9679 0.1613 +vn 0.1925 0.9679 0.1613 +vn 0.5483 0.8206 0.1613 +vn 0.8206 0.5483 0.1613 +vn 0.9679 0.1925 0.1613 +vn 0.9679 -0.1925 0.1613 +vn 0.8206 -0.5483 0.1613 +vn 0.5483 -0.8206 0.1613 +vn 0.1925 -0.9679 0.1613 +vn -0.1925 -0.9679 0.1613 +vn -0.5483 -0.8206 0.1613 +vn -0.8206 -0.5483 0.1613 +vn -0.9679 -0.1925 0.1613 +vn -0.9679 0.1925 0.1613 +vn -0.4371 0.6541 0.6173 +vn 0.1535 0.7716 0.6173 +vn 0.4371 0.6541 0.6173 +vn 0.6541 0.4371 0.6173 +vn 0.7716 0.1535 0.6173 +vn 0.7716 -0.1535 0.6173 +vn 0.6541 -0.4371 0.6173 +vn 0.4371 -0.6541 0.6173 +vn 0.1535 -0.7716 0.6173 +vn -0.1535 -0.7716 0.6173 +vn -0.4371 -0.6541 0.6173 +vn -0.6541 -0.4371 0.6173 +vn -0.7716 -0.1535 0.6173 +vn -0.7716 0.1535 0.6173 +vn -0.1097 0.5514 0.8270 +vn 0.1097 0.5514 0.8270 +vn 0.3123 0.4674 0.8270 +vn 0.4674 0.3123 0.8270 +vn 0.5514 0.1097 0.8270 +vn 0.5514 -0.1097 0.8270 +vn 0.4674 -0.3123 0.8270 +vn 0.3123 -0.4674 0.8270 +vn 0.1097 -0.5514 0.8270 +vn -0.1097 -0.5514 0.8270 +vn -0.3123 -0.4674 0.8270 +vn -0.4674 -0.3123 0.8270 +vn -0.5514 -0.1097 0.8270 +vn -0.5514 0.1097 0.8270 +vn -0.4674 0.3123 0.8270 +vn -0.3123 0.4674 0.8270 +vn -0.9808 0.1951 -0.0000 +vn 0.9808 -0.1951 -0.0000 +vn -0.9808 -0.1951 -0.0000 +vn 0.9808 0.1951 -0.0000 +vn -0.1951 -0.9808 -0.0000 +vn -0.1951 0.9808 -0.0000 +vn 0.1951 0.9808 -0.0000 +vn 0.1951 -0.9808 -0.0000 +vn -0.5556 0.8315 -0.0000 +vn 0.5556 -0.8315 -0.0000 +vn -0.8315 0.5556 -0.0000 +vn 0.8315 -0.5556 -0.0000 +vn -0.8315 -0.5556 -0.0000 +vn 0.8315 0.5556 -0.0000 +vn -0.5556 -0.8315 -0.0000 +vn 0.5556 0.8315 -0.0000 +vn -0.1535 0.7716 0.6173 +vn 0.9701 -0.0000 0.2425 +vn -0.9701 -0.0000 0.2425 +vn 0.7071 -0.0000 -0.7071 +vn -0.7071 -0.0000 -0.7071 +vn -0.0000 0.6000 -0.8000 +vn -0.5331 0.6569 -0.5331 +vn -0.8000 0.6000 -0.0000 +vn 0.5331 0.6569 0.5331 +vn -0.5331 0.6569 0.5331 +vn -0.0000 0.6000 0.8000 +vn 0.5331 0.6569 -0.5331 +vn 0.8000 0.6000 -0.0000 +vn -0.0000 0.9063 0.4226 +vn -0.0000 -0.9063 -0.4226 +vn -0.0000 -0.4226 0.9063 +vn -0.0000 0.7071 -0.7071 +vt 0.814815 0.374108 +vt 0.885186 0.374108 +vt 0.885186 0.451580 +vt 0.000000 0.220183 +vt 0.050000 0.238532 +vt 0.000000 0.238532 +vt 0.750000 0.238532 +vt 0.800000 0.220183 +vt 0.800000 0.238532 +vt 0.733333 0.477064 +vt 0.750000 0.403670 +vt 0.750000 0.477064 +vt 0.700000 0.311927 +vt 0.750000 0.293578 +vt 0.750000 0.311927 +vt 0.650000 0.311927 +vt 0.700000 0.293578 +vt 0.666667 0.477064 +vt 0.650000 0.403670 +vt 0.666667 0.403670 +vt 0.600000 0.220183 +vt 0.650000 0.238532 +vt 0.600000 0.238532 +vt 0.550000 0.238532 +vt 0.533333 0.403670 +vt 0.550000 0.477064 +vt 0.533333 0.477064 +vt 0.500000 0.293578 +vt 0.550000 0.311927 +vt 0.500000 0.311927 +vt 0.450000 0.293578 +vt 0.450000 0.311927 +vt 0.466667 0.477064 +vt 0.450000 0.403670 +vt 0.466667 0.403670 +vt 0.400000 0.220183 +vt 0.450000 0.238532 +vt 0.400000 0.238532 +vt 0.350000 0.220183 +vt 0.350000 0.238532 +vt 0.350000 0.403670 +vt 0.333333 0.477064 +vt 0.333333 0.403670 +vt 0.300000 0.293578 +vt 0.350000 0.311927 +vt 0.300000 0.311927 +vt 0.066667 0.403670 +vt 0.050000 0.477064 +vt 0.050000 0.403670 +vt 0.100000 0.293578 +vt 0.050000 0.311927 +vt 0.050000 0.293578 +vt 0.150000 0.293578 +vt 0.100000 0.311927 +vt 0.133333 0.477064 +vt 0.150000 0.403670 +vt 0.150000 0.477064 +vt 0.200000 0.220183 +vt 0.150000 0.238532 +vt 0.150000 0.220183 +vt 0.250000 0.238532 +vt 0.250000 0.220183 +vt 0.266667 0.403670 +vt 0.250000 0.477064 +vt 0.250000 0.403670 +vt 0.250000 0.293578 +vt 0.250000 0.311927 +vt 0.350000 0.348624 +vt 0.300000 0.366972 +vt 0.300000 0.348624 +vt 0.400000 0.348624 +vt 0.350000 0.366972 +vt 0.450000 0.348624 +vt 0.400000 0.366972 +vt 0.500000 0.348624 +vt 0.450000 0.366972 +vt 0.550000 0.348624 +vt 0.500000 0.366972 +vt 0.600000 0.366972 +vt 0.550000 0.366972 +vt 0.650000 0.348624 +vt 0.600000 0.348624 +vt 0.700000 0.366972 +vt 0.650000 0.366972 +vt 0.700000 0.348624 +vt 0.750000 0.366972 +vt 0.750000 0.348624 +vt 0.800000 0.366972 +vt 0.000000 0.348624 +vt 0.050000 0.366972 +vt 0.000000 0.366972 +vt 0.100000 0.348624 +vt 0.050000 0.348624 +vt 0.150000 0.366972 +vt 0.100000 0.366972 +vt 0.150000 0.348624 +vt 0.200000 0.366972 +vt 0.250000 0.348624 +vt 0.200000 0.348624 +vt 0.250000 0.366972 +vt 0.900000 0.311927 +vt 0.916667 0.238532 +vt 0.916667 0.311927 +vt 0.816667 0.311927 +vt 0.800000 0.311927 +vt 0.816667 0.238532 +vt 0.900000 0.238532 +vt 0.816667 0.220183 +vt 0.900000 0.220183 +vt 1.000000 0.238532 +vt 1.000000 0.311927 +vt 0.900000 0.357798 +vt 0.869042 0.463455 +vt 0.850000 0.467625 +vt 0.830958 0.463455 +vt 0.814815 0.451580 +vt 0.804028 0.433808 +vt 0.800241 0.412844 +vt 0.804028 0.391880 +vt 0.830958 0.362233 +vt 0.850000 0.358063 +vt 0.869042 0.362233 +vt 0.895972 0.391880 +vt 0.899760 0.412844 +vt 0.895972 0.433808 +vt 0.050000 0.220183 +vt 0.750000 0.220183 +vt 0.733333 0.403670 +vt 0.650000 0.293578 +vt 0.650000 0.477064 +vt 0.650000 0.220183 +vt 0.550000 0.220183 +vt 0.550000 0.403670 +vt 0.550000 0.293578 +vt 0.450000 0.477064 +vt 0.450000 0.220183 +vt 0.350000 0.477064 +vt 0.350000 0.293578 +vt 0.066667 0.477064 +vt 0.150000 0.311927 +vt 0.133333 0.403670 +vt 0.200000 0.238532 +vt 0.266667 0.477064 +vt 0.800000 0.348624 +vt 0.858333 0.357798 +vt 0.958333 0.357798 +vt 0.916667 0.357798 +vt 0.500000 0.596330 +vt 0.516667 0.477064 +vt 0.550000 0.706422 +vt 0.500000 0.706422 +vt 0.500000 0.816514 +vt 0.516667 0.935780 +vt 0.550000 0.816514 +vt 0.533333 0.935780 +vt 0.450000 0.596330 +vt 0.450000 0.706422 +vt 0.400000 0.596330 +vt 0.400000 0.706422 +vt 0.350000 0.596330 +vt 0.350000 0.706422 +vt 0.300000 0.596330 +vt 0.300000 0.706422 +vt 0.250000 0.596330 +vt 0.250000 0.706422 +vt 0.200000 0.596330 +vt 0.200000 0.706422 +vt 0.150000 0.596330 +vt 0.150000 0.706422 +vt 0.100000 0.596330 +vt 0.100000 0.706422 +vt 0.050000 0.596330 +vt 0.050000 0.706422 +vt 0.000000 0.596330 +vt 0.000000 0.706422 +vt 0.750000 0.706422 +vt 0.800000 0.596330 +vt 0.800000 0.706422 +vt 0.700000 0.706422 +vt 0.750000 0.596330 +vt 0.650000 0.706422 +vt 0.700000 0.596330 +vt 0.600000 0.596330 +vt 0.600000 0.706422 +vt 0.550000 0.596330 +vt 0.483333 0.477064 +vt 0.433333 0.477064 +vt 0.416667 0.477064 +vt 0.383333 0.477064 +vt 0.366667 0.477064 +vt 0.316667 0.477064 +vt 0.283333 0.477064 +vt 0.216667 0.477064 +vt 0.183333 0.477064 +vt 0.166667 0.477064 +vt 0.116667 0.477064 +vt 0.083333 0.477064 +vt 0.033333 0.477064 +vt 0.016667 0.477064 +vt 0.766667 0.477064 +vt 0.716667 0.477064 +vt 0.683333 0.477064 +vt 0.650000 0.596330 +vt 0.633333 0.477064 +vt 0.616667 0.477064 +vt 0.583333 0.477064 +vt 0.566667 0.477064 +vt 0.450000 0.816514 +vt 0.400000 0.816514 +vt 0.350000 0.816514 +vt 0.300000 0.816514 +vt 0.250000 0.816514 +vt 0.200000 0.816514 +vt 0.150000 0.816514 +vt 0.100000 0.816514 +vt 0.050000 0.816514 +vt 0.000000 0.816514 +vt 0.750000 0.816514 +vt 0.700000 0.816514 +vt 0.650000 0.816514 +vt 0.600000 0.816514 +vt 0.466667 0.935780 +vt 0.483333 0.935780 +vt 0.383333 0.935780 +vt 0.366667 0.935780 +vt 0.333333 0.935780 +vt 0.316667 0.935780 +vt 0.283333 0.935780 +vt 0.266667 0.935780 +vt 0.233333 0.935780 +vt 0.216667 0.935780 +vt 0.183333 0.935780 +vt 0.166667 0.935780 +vt 0.116667 0.935780 +vt 0.133333 0.935780 +vt 0.083333 0.935780 +vt 0.066667 0.935780 +vt 0.033333 0.935780 +vt 0.016667 0.935780 +vt 0.783333 0.935780 +vt 0.766667 0.935780 +vt 0.733333 0.935780 +vt 0.716667 0.935780 +vt 0.683333 0.935780 +vt 0.666667 0.935780 +vt 0.616667 0.935780 +vt 0.633333 0.935780 +vt 0.583333 0.935780 +vt 0.566667 0.935780 +vt 0.433333 0.935780 +vt 0.425000 1.000000 +vt 0.416667 0.935780 +vt 0.375000 1.000000 +vt 0.325000 1.000000 +vt 0.275000 1.000000 +vt 0.225000 1.000000 +vt 0.175000 1.000000 +vt 0.125000 1.000000 +vt 0.075000 1.000000 +vt 0.025000 1.000000 +vt 0.775000 1.000000 +vt 0.725000 1.000000 +vt 0.675000 1.000000 +vt 0.625000 1.000000 +vt 0.575000 1.000000 +vt 0.525000 1.000000 +vt 0.475000 1.000000 +vt 0.600000 0.311927 +vt 0.200000 0.311927 +vt 0.400000 0.311927 +vt 0.000000 0.311927 +vt 0.600000 0.477064 +vt 0.200000 0.477064 +vt 0.600000 0.403670 +vt 0.200000 0.403670 +vt 0.800000 0.477064 +vt 0.400000 0.403670 +vt 0.400000 0.477064 +vt 0.000000 0.403670 +vt 0.000000 0.477064 +vt 0.500000 0.403670 +vt 0.100000 0.403670 +vt 0.700000 0.403670 +vt 0.300000 0.403670 +vt 0.800000 0.403670 +vt 0.233333 0.477064 +vt 0.783333 0.477064 +vt 0.800000 0.816514 +vt 0.183333 0.055046 +vt 0.116667 0.055046 +vt 0.116667 0.000000 +vt 0.183333 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.055046 +vt 0.008333 0.000000 +vt 0.012500 0.000000 +vt 0.012500 0.004587 +vt 0.008333 0.004587 +vt 0.010922 0.011468 +vt 0.014583 0.015499 +vt 0.008333 0.018349 +vt 0.020833 0.000000 +vt 0.020833 0.004587 +vt 0.014583 0.021199 +vt 0.025000 0.000000 +vt 0.025000 0.004587 +vt 0.010922 0.025229 +vt 0.033333 0.000000 +vt 0.033333 0.004587 +vt 0.005744 0.025229 +vt 0.037500 0.000000 +vt 0.037500 0.004587 +vt 0.002083 0.021199 +vt 0.045833 0.000000 +vt 0.045833 0.004587 +vt 0.002083 0.015499 +vt 0.050000 0.000000 +vt 0.050000 0.004587 +vt 0.005744 0.011468 +vt 0.000000 0.000000 +vt 0.000000 0.004587 +vt 0.031250 0.009174 +vt 0.027083 0.009174 +vt 0.037500 0.009174 +vt 0.033333 0.009174 +vt 0.043750 0.009174 +vt 0.039583 0.009174 +vt 0.012500 0.009174 +vt 0.008333 0.009174 +vt 0.050000 0.009174 +vt 0.045833 0.009174 +vt 0.006250 0.009174 +vt 0.002083 0.009174 +vt 0.025000 0.009174 +vt 0.020833 0.009174 +vt 0.018750 0.009174 +vt 0.014583 0.009174 +vt 0.237500 0.057339 +vt 0.241667 0.059633 +vt 0.241667 0.096330 +vt 0.237500 0.094037 +vt 0.245833 0.061927 +vt 0.245833 0.098624 +vt 0.250000 0.064220 +vt 0.250000 0.100917 +vt 0.254167 0.066514 +vt 0.254167 0.103211 +vt 0.258333 0.068807 +vt 0.258333 0.105505 +vt 0.262500 0.071101 +vt 0.262500 0.107798 +vt 0.266667 0.073394 +vt 0.266667 0.110092 +vt 0.233333 0.055046 +vt 0.233333 0.091743 +vt 0.150000 0.201835 +vt 0.141667 0.201835 +vt 0.141667 0.174312 +vt 0.150000 0.174312 +vt 0.125000 0.174312 +vt 0.125000 0.201835 +vt 0.116667 0.201835 +vt 0.116667 0.174312 +vt 0.141667 0.211009 +vt 0.125000 0.211009 +vt 0.141667 0.165138 +vt 0.125000 0.165138 +vt 0.166667 0.165138 +vt 0.116667 0.165138 +vt 0.166667 0.055046 +vt 0.050000 0.055046 +vt 0.050000 0.165138 +vt 0.000000 0.165138 +vt 0.000000 0.055046 +vt 0.116667 0.220183 +vt 0.233333 0.165138 +vt 0.191667 0.192661 +vt 0.175000 0.192661 +vt 0.175000 0.183486 +vt 0.191667 0.183486 +vt 0.166667 0.183486 +vt 0.166667 0.192661 +vt 0.150000 0.192661 +vt 0.150000 0.183486 +vt 0.175000 0.211009 +vt 0.166667 0.211009 +vt 0.175000 0.165138 +vt 0.237500 0.155963 +vt 0.233333 0.155963 +vt 0.233333 0.110092 +vt 0.237500 0.110092 +vt 0.291667 0.055046 +vt 0.283333 0.055046 +vt 0.283333 0.018349 +vt 0.291667 0.018349 +vt 0.275000 0.018349 +vt 0.275000 0.055046 +vt 0.266667 0.055046 +vt 0.266667 0.018349 +vt 0.300000 0.055046 +vt 0.300000 0.018349 +vt 0.283333 0.064220 +vt 0.275000 0.064220 +vt 0.291667 0.064220 +vt 0.266667 0.064220 +vt 0.283333 0.165138 +vt 0.275000 0.165138 +vt 0.291667 0.165138 +vt 0.300000 0.165138 +vt 0.300000 0.064220 +vt 0.266667 0.165138 +vt 0.283333 0.174312 +vt 0.275000 0.174312 +vt 0.291667 0.174312 +vt 0.266667 0.174312 +vt 0.283333 0.220183 +vt 0.275000 0.220183 +vt 0.291667 0.220183 +vt 0.300000 0.220183 +vt 0.300000 0.174312 +vt 0.266667 0.220183 +vt 0.008333 0.032110 +vt 0.012500 0.032110 +vt 0.012500 0.036697 +vt 0.008333 0.036697 +vt 0.016667 0.041284 +vt 0.008333 0.045872 +vt 0.020833 0.032110 +vt 0.020833 0.036697 +vt 0.016667 0.050459 +vt 0.025000 0.032110 +vt 0.025000 0.036697 +vt 0.012500 0.055046 +vt 0.033333 0.032110 +vt 0.033333 0.036697 +vt 0.004167 0.055046 +vt 0.037500 0.032110 +vt 0.037500 0.036697 +vt 0.000000 0.050459 +vt 0.045833 0.032110 +vt 0.045833 0.036697 +vt 0.000000 0.041284 +vt 0.050000 0.032110 +vt 0.050000 0.036697 +vt 0.004167 0.036697 +vt 0.000000 0.032110 +vt 0.000000 0.036697 +s 1 +usemtl m_f86c0c72-2b12-0e19-6f50-7a0521a3a0a7 +f 1/1/1 2/2/1 3/3/1 +f 4/4/1 5/5/1 6/6/1 +f 7/7/1 4/8/1 6/9/1 +f 7/10/2 8/11/2 9/12/2 +f 10/13/1 8/14/1 11/15/1 +f 12/16/1 13/17/1 10/13/1 +f 14/18/3 15/19/3 12/20/3 +f 16/21/1 14/22/1 17/23/1 +f 18/24/1 16/21/1 17/23/1 +f 19/25/4 20/26/4 18/27/4 +f 21/28/1 19/29/1 22/30/1 +f 23/31/1 22/30/1 24/32/1 +f 25/33/5 23/34/5 24/35/5 +f 26/36/1 25/37/1 27/38/1 +f 28/39/1 27/38/1 29/40/1 +f 30/41/6 29/42/6 31/43/6 +f 32/44/1 31/45/1 33/46/1 +f 34/47/7 35/48/7 36/49/7 +f 37/50/1 34/51/1 36/52/1 +f 38/53/1 39/54/1 37/50/1 +f 40/55/8 38/56/8 41/57/8 +f 42/58/1 40/59/1 41/60/1 +f 43/61/1 42/58/1 44/62/1 +f 45/63/9 44/64/9 46/65/9 +f 46/66/1 33/46/1 45/67/1 +f 47/68/10 48/69/10 49/70/10 +f 50/71/10 51/72/10 47/68/10 +f 52/73/10 53/74/10 50/71/10 +f 54/75/10 55/76/10 52/73/10 +f 56/77/10 57/78/10 54/75/10 +f 56/77/10 58/79/10 59/80/10 +f 60/81/10 58/79/10 61/82/10 +f 60/81/10 62/83/10 63/84/10 +f 64/85/10 65/86/10 62/83/10 +f 66/87/10 67/88/10 65/86/10 +f 68/89/10 69/90/10 67/91/10 +f 70/92/10 69/90/10 71/93/10 +f 70/92/10 72/94/10 73/95/10 +f 74/96/10 75/97/10 72/94/10 +f 76/98/10 75/97/10 77/99/10 +f 49/70/10 78/100/10 76/98/10 +f 79/101/11 80/102/11 81/103/11 +f 82/9/12 83/104/12 84/105/12 +f 85/101/12 86/102/12 87/103/12 +f 79/101/13 83/104/13 88/106/13 +f 89/107/1 82/108/1 80/109/1 +f 80/102/14 82/110/14 84/111/14 +f 81/103/15 90/112/15 79/101/15 +f 91/9/11 92/104/11 93/105/11 +f 85/101/14 92/104/14 94/106/14 +f 95/107/1 91/108/1 86/109/1 +f 86/102/13 91/110/13 93/111/13 +f 87/103/16 96/112/16 85/101/16 +f 97/101/13 98/102/13 99/103/13 +f 100/9/14 101/104/14 102/105/14 +f 103/101/14 104/102/14 105/103/14 +f 97/101/12 101/104/12 106/106/12 +f 107/107/1 100/108/1 98/109/1 +f 98/102/11 100/110/11 102/111/11 +f 99/103/17 108/112/17 97/101/17 +f 109/9/13 110/104/13 111/105/13 +f 103/101/11 110/104/11 112/106/11 +f 104/109/1 112/106/1 109/108/1 +f 104/102/12 109/110/12 111/111/12 +f 105/103/18 113/112/18 103/101/18 +f 3/3/1 114/113/1 115/114/1 +f 115/114/1 116/115/1 3/3/1 +f 116/115/1 117/116/1 3/3/1 +f 117/116/1 118/117/1 119/118/1 +f 119/118/1 120/119/1 117/116/1 +f 120/119/1 1/1/1 117/116/1 +f 1/1/1 121/120/1 2/2/1 +f 121/120/1 122/121/1 2/2/1 +f 122/121/1 123/122/1 2/2/1 +f 2/2/1 124/123/1 3/3/1 +f 124/123/1 125/124/1 3/3/1 +f 125/124/1 126/125/1 3/3/1 +f 3/3/1 117/116/1 1/1/1 +f 4/4/1 35/126/1 5/5/1 +f 7/7/1 9/127/1 4/8/1 +f 7/10/2 11/128/2 8/11/2 +f 10/13/1 13/17/1 8/14/1 +f 12/16/1 15/129/1 13/17/1 +f 14/18/3 127/130/3 15/19/3 +f 16/21/1 127/131/1 14/22/1 +f 18/24/1 20/132/1 16/21/1 +f 19/25/4 128/133/4 20/26/4 +f 21/28/1 128/134/1 19/29/1 +f 23/31/1 21/28/1 22/30/1 +f 25/33/5 129/135/5 23/34/5 +f 26/36/1 129/136/1 25/37/1 +f 28/39/1 26/36/1 27/38/1 +f 30/41/6 28/137/6 29/42/6 +f 32/44/1 30/138/1 31/45/1 +f 34/47/7 5/139/7 35/48/7 +f 37/50/1 39/54/1 34/51/1 +f 38/53/1 130/140/1 39/54/1 +f 40/55/8 130/141/8 38/56/8 +f 42/58/1 131/142/1 40/59/1 +f 43/61/1 131/142/1 42/58/1 +f 45/63/9 43/143/9 44/64/9 +f 46/66/1 32/44/1 33/46/1 +f 47/68/10 51/72/10 48/69/10 +f 50/71/10 53/74/10 51/72/10 +f 52/73/10 55/76/10 53/74/10 +f 54/75/10 57/78/10 55/76/10 +f 56/77/10 59/80/10 57/78/10 +f 56/77/10 61/82/10 58/79/10 +f 60/81/10 63/84/10 58/79/10 +f 60/81/10 64/85/10 62/83/10 +f 64/85/10 66/87/10 65/86/10 +f 66/87/10 68/144/10 67/88/10 +f 68/89/10 71/93/10 69/90/10 +f 70/92/10 73/95/10 69/90/10 +f 70/92/10 74/96/10 72/94/10 +f 74/96/10 77/99/10 75/97/10 +f 76/98/10 78/100/10 75/97/10 +f 49/70/10 48/69/10 78/100/10 +f 79/101/11 89/107/11 80/102/11 +f 82/9/12 88/106/12 83/104/12 +f 85/101/12 95/107/12 86/102/12 +f 88/106/13 89/107/13 79/101/13 +f 79/101/13 90/145/13 83/104/13 +f 89/107/1 88/106/1 82/108/1 +f 132/146/14 81/103/14 84/111/14 +f 81/103/14 80/102/14 84/111/14 +f 81/103/15 132/147/15 90/112/15 +f 91/9/11 94/106/11 92/104/11 +f 94/106/14 95/107/14 85/101/14 +f 85/101/14 96/145/14 92/104/14 +f 95/107/1 94/106/1 91/108/1 +f 133/146/13 87/103/13 93/111/13 +f 87/103/13 86/102/13 93/111/13 +f 87/103/16 133/147/16 96/112/16 +f 97/101/13 107/107/13 98/102/13 +f 100/9/14 106/106/14 101/104/14 +f 103/101/14 134/107/14 104/102/14 +f 106/106/12 107/107/12 97/101/12 +f 97/101/12 108/145/12 101/104/12 +f 107/107/1 106/106/1 100/108/1 +f 135/146/11 99/103/11 102/111/11 +f 99/103/11 98/102/11 102/111/11 +f 99/103/17 135/147/17 108/112/17 +f 109/9/13 112/106/13 110/104/13 +f 112/106/11 134/107/11 103/101/11 +f 103/101/11 113/145/11 110/104/11 +f 104/109/1 134/107/1 112/106/1 +f 136/146/12 105/103/12 111/111/12 +f 105/103/12 104/102/12 111/111/12 +f 105/103/18 136/147/18 113/112/18 +f 126/27/19 137/148/19 3/149/19 +f 137/148/20 138/150/20 139/151/20 +f 138/150/21 140/152/21 139/151/21 +f 141/153/22 142/154/22 143/155/22 +f 144/156/23 139/151/23 145/157/23 +f 146/158/24 145/157/24 147/159/24 +f 148/160/25 147/159/25 149/161/25 +f 150/162/26 149/161/26 151/163/26 +f 152/164/27 151/163/27 153/165/27 +f 154/166/28 153/165/28 155/167/28 +f 156/168/29 155/167/29 157/169/29 +f 158/170/30 157/169/30 159/171/30 +f 160/172/31 159/171/31 161/173/31 +f 162/174/32 161/173/32 163/175/32 +f 164/176/33 162/177/33 163/178/33 +f 165/179/34 166/180/34 164/176/34 +f 167/181/35 168/182/35 165/179/35 +f 169/183/36 167/181/36 170/184/36 +f 171/185/37 170/184/37 138/150/37 +f 3/186/38 144/156/38 114/33/38 +f 114/187/39 146/158/39 115/188/39 +f 115/189/40 148/160/40 116/190/40 +f 116/42/41 150/162/41 117/191/41 +f 117/192/42 152/164/42 118/143/42 +f 119/193/43 152/164/43 154/166/43 +f 119/194/44 156/168/44 120/195/44 +f 1/196/45 156/168/45 158/170/45 +f 1/197/46 160/172/46 121/139/46 +f 121/198/47 162/174/47 122/199/47 +f 123/200/48 162/177/48 166/180/48 +f 123/10/49 168/182/49 2/201/49 +f 2/202/50 172/203/50 124/18/50 +f 124/204/51 169/183/51 125/205/51 +f 125/206/52 171/185/52 126/207/52 +f 139/151/53 173/208/53 145/157/53 +f 145/157/54 174/209/54 147/159/54 +f 147/159/55 175/210/55 149/161/55 +f 149/161/56 176/211/56 151/163/56 +f 153/165/57 176/211/57 177/212/57 +f 153/165/58 178/213/58 155/167/58 +f 155/167/59 179/214/59 157/169/59 +f 157/169/60 180/215/60 159/171/60 +f 159/171/61 181/216/61 161/173/61 +f 161/173/62 182/217/62 163/175/62 +f 163/178/63 183/218/63 164/176/63 +f 165/179/64 183/218/64 184/219/64 +f 165/179/65 185/220/65 167/181/65 +f 167/181/66 186/221/66 170/184/66 +f 138/150/67 186/221/67 142/154/67 +f 187/222/68 140/152/68 141/223/68 +f 175/210/69 188/224/69 189/225/69 +f 176/211/70 189/226/70 190/227/70 +f 177/212/71 190/228/71 191/229/71 +f 178/213/72 191/230/72 192/231/72 +f 179/214/73 192/232/73 193/233/73 +f 194/234/74 179/214/74 193/235/74 +f 181/216/75 194/236/75 195/237/75 +f 182/217/76 195/238/76 196/239/76 +f 183/218/77 196/240/77 197/241/77 +f 184/219/78 197/242/78 198/243/78 +f 185/220/79 198/244/79 199/245/79 +f 200/246/80 185/220/80 199/247/80 +f 142/154/81 200/248/81 143/249/81 +f 187/250/82 201/251/82 188/252/82 +f 188/224/83 201/253/83 189/225/83 +f 189/226/84 201/254/84 190/227/84 +f 190/228/85 201/255/85 191/229/85 +f 191/230/86 201/256/86 192/231/86 +f 192/232/87 201/257/87 193/233/87 +f 193/235/88 201/258/88 194/234/88 +f 194/236/89 201/259/89 195/237/89 +f 195/238/90 201/260/90 196/239/90 +f 196/240/91 201/261/91 197/241/91 +f 197/242/92 201/262/92 198/243/92 +f 198/244/93 201/263/93 199/245/93 +f 199/247/94 201/264/94 200/246/94 +f 200/248/95 201/265/95 143/249/95 +f 143/155/96 201/266/96 141/153/96 +f 141/223/97 201/267/97 187/222/97 +f 17/23/98 19/29/98 18/24/98 +f 131/142/99 130/140/99 40/59/99 +f 14/22/100 202/268/100 17/23/100 +f 43/61/101 203/269/101 131/142/101 +f 6/9/102 11/15/102 7/7/102 +f 25/37/103 204/270/103 27/38/103 +f 27/38/104 31/45/104 29/40/104 +f 5/5/105 205/271/105 6/6/105 +f 34/51/105 68/89/105 205/271/105 +f 22/30/106 52/73/106 24/32/106 +f 39/54/107 71/93/107 34/51/107 +f 19/29/108 54/75/108 22/30/108 +f 130/140/109 70/92/109 39/54/109 +f 202/268/98 56/77/98 19/29/98 +f 203/269/99 74/96/99 130/140/99 +f 12/16/100 61/82/100 202/268/100 +f 45/67/101 77/99/101 203/269/101 +f 10/13/110 60/81/110 12/16/110 +f 33/46/111 76/98/111 45/67/111 +f 11/15/112 64/85/112 10/13/112 +f 31/45/113 49/70/113 33/46/113 +f 205/105/102 66/87/102 11/15/102 +f 24/32/103 50/71/103 204/270/103 +f 204/270/104 47/68/104 31/45/104 +f 128/133/99 16/272/99 20/26/99 +f 38/56/98 42/273/98 41/57/98 +f 206/274/101 127/130/101 16/272/101 +f 207/275/100 44/64/100 42/273/100 +f 8/11/104 4/276/104 9/12/104 +f 208/277/105 129/135/105 26/278/105 +f 30/41/102 26/278/102 28/137/102 +f 209/279/103 35/48/103 4/280/103 +f 57/78/109 128/133/109 21/281/109 +f 73/95/108 38/56/108 37/282/108 +f 59/80/99 206/274/99 128/133/99 +f 72/94/98 207/275/98 38/56/98 +f 58/79/101 15/19/101 206/274/101 +f 75/97/100 46/65/100 207/275/100 +f 63/84/111 13/283/111 15/19/111 +f 78/100/110 32/284/110 46/65/110 +f 62/83/113 8/11/113 13/283/113 +f 48/69/112 30/41/112 32/284/112 +f 65/86/104 209/285/104 8/11/104 +f 53/74/105 23/34/105 208/277/105 +f 51/72/102 208/277/102 30/41/102 +f 67/91/103 36/49/103 209/279/103 +f 55/76/107 21/281/107 23/34/107 +f 69/90/106 37/282/106 36/49/106 +f 126/27/19 171/185/19 137/148/19 +f 137/148/20 171/185/20 138/150/20 +f 138/150/21 142/154/21 140/152/21 +f 141/153/22 140/152/22 142/154/22 +f 144/156/23 137/148/23 139/151/23 +f 146/158/24 144/156/24 145/157/24 +f 148/160/25 146/158/25 147/159/25 +f 150/162/26 148/160/26 149/161/26 +f 152/164/27 150/162/27 151/163/27 +f 154/166/28 152/164/28 153/165/28 +f 156/168/29 154/166/29 155/167/29 +f 158/170/30 156/168/30 157/169/30 +f 160/172/31 158/170/31 159/171/31 +f 162/174/32 160/172/32 161/173/32 +f 164/176/33 166/180/33 162/177/33 +f 165/179/34 168/182/34 166/180/34 +f 167/181/35 172/203/35 168/182/35 +f 169/183/36 172/203/36 167/181/36 +f 171/185/37 169/183/37 170/184/37 +f 3/186/38 137/148/38 144/156/38 +f 114/187/39 144/156/39 146/158/39 +f 115/189/40 146/158/40 148/160/40 +f 116/42/41 148/160/41 150/162/41 +f 117/192/42 150/162/42 152/164/42 +f 119/193/43 118/286/43 152/164/43 +f 119/194/44 154/166/44 156/168/44 +f 1/196/45 120/55/45 156/168/45 +f 1/197/46 158/170/46 160/172/46 +f 121/198/47 160/172/47 162/174/47 +f 123/200/48 122/287/48 162/177/48 +f 123/10/49 166/180/49 168/182/49 +f 2/202/50 168/182/50 172/203/50 +f 124/204/51 172/203/51 169/183/51 +f 125/206/52 169/183/52 171/185/52 +f 139/151/53 140/152/53 173/208/53 +f 145/157/54 173/208/54 174/209/54 +f 147/159/55 174/209/55 175/210/55 +f 149/161/56 175/210/56 176/211/56 +f 153/165/57 151/163/57 176/211/57 +f 153/165/58 177/212/58 178/213/58 +f 155/167/59 178/213/59 179/214/59 +f 157/169/60 179/214/60 180/215/60 +f 159/171/61 180/215/61 181/216/61 +f 161/173/62 181/216/62 182/217/62 +f 163/178/63 182/288/63 183/218/63 +f 165/179/64 164/176/64 183/218/64 +f 165/179/65 184/219/65 185/220/65 +f 167/181/66 185/220/66 186/221/66 +f 138/150/67 170/184/67 186/221/67 +f 187/222/68 173/208/68 140/152/68 +f 174/209/114 173/208/114 187/250/114 +f 175/210/69 174/209/69 188/224/69 +f 176/211/70 175/210/70 189/226/70 +f 177/212/71 176/211/71 190/228/71 +f 178/213/72 177/212/72 191/230/72 +f 179/214/73 178/213/73 192/232/73 +f 194/234/74 180/215/74 179/214/74 +f 181/216/75 180/215/75 194/236/75 +f 182/217/76 181/216/76 195/238/76 +f 183/218/77 182/288/77 196/240/77 +f 184/219/78 183/218/78 197/242/78 +f 185/220/79 184/219/79 198/244/79 +f 200/246/80 186/221/80 185/220/80 +f 142/154/81 186/221/81 200/248/81 +f 17/23/98 202/268/98 19/29/98 +f 131/142/99 203/269/99 130/140/99 +f 14/22/100 12/16/100 202/268/100 +f 43/61/101 45/67/101 203/269/101 +f 6/9/102 205/105/102 11/15/102 +f 25/37/103 24/32/103 204/270/103 +f 27/38/104 204/270/104 31/45/104 +f 5/5/105 34/51/105 205/271/105 +f 34/51/105 71/93/105 68/89/105 +f 22/30/106 54/75/106 52/73/106 +f 39/54/107 70/92/107 71/93/107 +f 19/29/108 56/77/108 54/75/108 +f 130/140/109 74/96/109 70/92/109 +f 202/268/98 61/82/98 56/77/98 +f 203/269/99 77/99/99 74/96/99 +f 12/16/100 60/81/100 61/82/100 +f 45/67/101 76/98/101 77/99/101 +f 10/13/110 64/85/110 60/81/110 +f 33/46/111 49/70/111 76/98/111 +f 11/15/112 66/87/112 64/85/112 +f 31/45/113 47/68/113 49/70/113 +f 205/105/102 68/144/102 66/87/102 +f 24/32/103 52/73/103 50/71/103 +f 204/270/104 50/71/104 47/68/104 +f 128/133/99 206/274/99 16/272/99 +f 38/56/98 207/275/98 42/273/98 +f 206/274/101 15/19/101 127/130/101 +f 207/275/100 46/65/100 44/64/100 +f 8/11/104 209/285/104 4/276/104 +f 208/277/105 23/34/105 129/135/105 +f 30/41/102 208/277/102 26/278/102 +f 209/279/103 36/49/103 35/48/103 +f 57/78/109 59/80/109 128/133/109 +f 73/95/108 72/94/108 38/56/108 +f 59/80/99 58/79/99 206/274/99 +f 72/94/98 75/97/98 207/275/98 +f 58/79/101 63/84/101 15/19/101 +f 75/97/100 78/100/100 46/65/100 +f 63/84/111 62/83/111 13/283/111 +f 78/100/110 48/69/110 32/284/110 +f 62/83/113 65/86/113 8/11/113 +f 48/69/112 51/72/112 30/41/112 +f 65/86/104 67/88/104 209/285/104 +f 53/74/105 55/76/105 23/34/105 +f 51/72/102 53/74/102 208/277/102 +f 67/91/103 69/90/103 36/49/103 +f 55/76/107 57/78/107 21/281/107 +f 69/90/106 73/95/106 37/282/106 +f 174/209/114 187/250/114 188/252/114 +f 212/289/115 211/290/115 213/291/115 +f 212/289/115 213/291/115 214/292/115 +f 217/293/116 215/294/116 216/289/116 +f 217/293/116 216/289/116 218/292/116 +f 219/295/17 221/296/17 222/297/17 +f 219/295/17 222/297/17 220/298/17 +f 240/299/11 241/300/11 237/301/11 +f 221/296/13 223/302/13 224/303/13 +f 221/296/13 224/303/13 222/297/13 +f 241/300/11 243/304/11 237/301/11 +f 223/302/117 225/305/117 226/306/117 +f 223/302/117 226/306/117 224/303/117 +f 243/304/11 235/307/11 237/301/11 +f 225/305/1 227/308/1 228/309/1 +f 225/305/1 228/309/1 226/306/1 +f 235/307/11 236/310/11 237/301/11 +f 227/308/118 229/311/118 230/312/118 +f 227/308/118 230/312/118 228/309/118 +f 236/310/11 238/313/11 237/301/11 +f 229/311/14 231/314/14 232/315/14 +f 229/311/14 232/315/14 230/312/14 +f 238/313/11 239/316/11 237/301/11 +f 231/314/18 233/317/18 234/318/18 +f 231/314/18 234/318/18 232/315/18 +f 239/316/11 242/319/11 237/301/11 +f 233/320/10 219/295/10 220/298/10 +f 233/320/10 220/298/10 234/321/10 +f 242/319/11 240/299/11 237/301/11 +f 236/322/119 235/323/119 226/306/119 +f 236/322/119 226/306/119 228/309/119 +f 238/324/120 236/325/120 228/309/120 +f 238/324/120 228/309/120 230/312/120 +f 239/326/121 238/327/121 230/312/121 +f 239/326/121 230/312/121 232/315/121 +f 241/328/122 240/329/122 220/298/122 +f 241/328/122 220/298/122 222/297/122 +f 242/330/123 239/331/123 232/315/123 +f 242/330/123 232/315/123 234/318/123 +f 240/332/124 242/333/124 234/321/124 +f 240/332/124 234/321/124 220/298/124 +f 235/334/125 243/335/125 224/303/125 +f 235/334/125 224/303/125 226/306/125 +f 243/336/126 241/337/126 222/297/126 +f 243/336/126 222/297/126 224/303/126 +f 244/338/17 246/339/17 247/340/17 +f 244/338/17 247/340/17 245/341/17 +f 246/339/13 248/342/13 249/343/13 +f 246/339/13 249/343/13 247/340/13 +f 248/342/117 250/344/117 251/345/117 +f 248/342/117 251/345/117 249/343/117 +f 250/344/1 252/346/1 253/347/1 +f 250/344/1 253/347/1 251/345/1 +f 252/346/118 254/348/118 255/349/118 +f 252/346/118 255/349/118 253/347/118 +f 254/348/14 256/350/14 257/351/14 +f 254/348/14 257/351/14 255/349/14 +f 256/350/18 258/352/18 259/353/18 +f 256/350/18 259/353/18 257/351/18 +f 258/354/10 244/338/10 245/341/10 +f 258/354/10 245/341/10 259/355/10 +f 261/356/13 260/357/13 262/358/13 +f 261/356/13 262/358/13 263/359/13 +f 266/360/14 264/361/14 265/362/14 +f 266/360/14 265/362/14 267/363/14 +f 264/361/11 260/357/11 261/364/11 +f 264/361/11 261/364/11 265/365/11 +f 263/366/12 262/358/12 266/360/12 +f 263/366/12 266/360/12 267/367/12 +f 262/358/10 260/357/10 264/361/10 +f 262/358/10 264/361/10 266/360/10 +f 269/368/13 268/369/13 270/290/13 +f 269/368/13 270/290/13 271/370/13 +f 274/371/14 272/372/14 273/373/14 +f 274/371/14 273/373/14 275/374/14 +f 272/372/11 268/369/11 269/375/11 +f 272/372/11 269/375/11 273/126/11 +f 271/291/12 270/290/12 274/371/12 +f 271/291/12 274/371/12 275/317/12 +f 270/290/10 268/369/10 272/372/10 +f 270/290/10 272/372/10 274/371/10 +f 273/376/1 269/368/1 271/370/1 +f 273/376/1 271/370/1 275/354/1 +f 277/377/13 276/378/13 278/379/13 +f 277/377/13 278/379/13 279/380/13 +f 282/381/14 280/382/14 281/383/14 +f 282/381/14 281/383/14 283/384/14 +f 280/382/127 276/378/127 277/385/127 +f 280/382/127 277/385/127 281/386/127 +f 279/387/128 278/379/128 282/381/128 +f 279/387/128 282/381/128 283/368/128 +f 278/379/129 276/378/129 280/382/129 +f 278/379/129 280/382/129 282/381/129 +f 284/388/13 285/389/13 287/390/13 +f 284/388/13 287/390/13 286/391/13 +f 289/392/13 288/393/13 290/394/13 +f 289/392/13 290/394/13 291/395/13 +f 294/396/14 292/397/14 293/398/14 +f 294/396/14 293/398/14 295/399/14 +f 290/394/10 288/393/10 292/397/10 +f 290/394/10 292/397/10 294/396/10 +f 293/400/1 289/392/1 291/395/1 +f 293/400/1 291/395/1 295/401/1 +f 292/397/15 288/393/15 296/402/15 +f 292/397/15 296/402/15 297/403/15 +f 296/404/13 288/393/13 289/392/13 +f 297/405/14 293/398/14 292/397/14 +f 299/406/11 298/407/11 297/403/11 +f 299/406/11 297/403/11 296/402/11 +f 300/408/13 299/406/13 296/402/13 +f 300/408/13 296/402/13 289/404/13 +f 301/409/12 300/408/12 289/404/12 +f 301/409/12 289/404/12 293/410/12 +f 298/407/14 301/411/14 293/405/14 +f 298/407/14 293/405/14 297/403/14 +f 298/407/130 299/406/130 210/412/130 +f 298/407/130 210/412/130 302/413/130 +f 210/412/13 299/408/13 300/414/13 +f 302/413/14 301/415/14 298/411/14 +f 304/416/1 303/417/1 302/413/1 +f 304/416/1 302/413/1 210/412/1 +f 305/418/13 304/416/13 210/412/13 +f 305/418/13 210/412/13 300/414/13 +f 306/419/10 305/418/10 300/414/10 +f 306/419/10 300/414/10 301/420/10 +f 303/417/14 306/421/14 301/415/14 +f 303/417/14 301/415/14 302/413/14 +f 308/422/17 310/423/17 311/424/17 +f 308/422/17 311/424/17 309/425/17 +f 309/424/11 311/426/11 307/427/11 +f 310/423/13 312/428/13 313/429/13 +f 310/423/13 313/429/13 311/424/13 +f 311/426/11 313/430/11 307/427/11 +f 312/428/117 314/431/117 315/432/117 +f 312/428/117 315/432/117 313/429/117 +f 313/430/11 315/433/11 307/427/11 +f 314/431/1 316/434/1 317/435/1 +f 314/431/1 317/435/1 315/432/1 +f 315/433/11 317/436/11 307/427/11 +f 316/434/118 318/437/118 319/438/118 +f 316/434/118 319/438/118 317/435/118 +f 317/436/11 319/439/11 307/427/11 +f 318/437/14 320/440/14 321/441/14 +f 318/437/14 321/441/14 319/438/14 +f 319/439/11 321/442/11 307/427/11 +f 320/440/18 322/443/18 323/444/18 +f 320/440/18 323/444/18 321/441/18 +f 321/442/11 323/445/11 307/427/11 +f 322/446/10 308/422/10 309/425/10 +f 322/446/10 309/425/10 323/447/10 +f 323/445/11 309/424/11 307/427/11 diff --git a/src/main/resources/assets/hbm/models/mine_fat.obj b/src/main/resources/assets/hbm/models/mine_fat.obj deleted file mode 100644 index 0dddca7db..000000000 --- a/src/main/resources/assets/hbm/models/mine_fat.obj +++ /dev/null @@ -1,1208 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'mine_fat.blend' -# www.blender.org -o Sphere -v -0.191342 0.500000 0.692910 -v -0.353553 0.500000 0.530330 -v -0.461940 0.500000 0.287013 -v -0.500000 0.500000 -0.000000 -v -0.461940 0.500000 -0.287013 -v -0.353553 0.500000 -0.530330 -v -0.191342 0.500000 -0.692910 -v -0.000000 0.500000 -0.750000 -v -0.135299 0.635299 0.692910 -v -0.250000 0.750000 0.530330 -v -0.326641 0.826641 0.287013 -v -0.353553 0.853553 -0.000000 -v -0.326641 0.826641 -0.287013 -v -0.250000 0.750000 -0.530330 -v -0.135299 0.635299 -0.692910 -v -0.000000 0.691342 0.692910 -v -0.000000 0.853553 0.530330 -v -0.000000 0.961940 0.287013 -v -0.000000 1.000000 -0.000000 -v -0.000000 0.961940 -0.287013 -v -0.000000 0.853553 -0.530330 -v -0.000000 0.691342 -0.692910 -v -0.000000 0.500000 0.750000 -v 0.135299 0.635299 0.692910 -v 0.250000 0.750000 0.530330 -v 0.326641 0.826641 0.287013 -v 0.353553 0.853553 -0.000000 -v 0.326641 0.826641 -0.287013 -v 0.250000 0.750000 -0.530330 -v 0.135299 0.635299 -0.692910 -v 0.191342 0.500000 0.692910 -v 0.353553 0.500000 0.530330 -v 0.461940 0.500000 0.287013 -v 0.500000 0.500000 -0.000000 -v 0.461940 0.500000 -0.287013 -v 0.353553 0.500000 -0.530330 -v 0.191342 0.500000 -0.692910 -v 0.135299 0.364701 0.692910 -v 0.250000 0.250000 0.530330 -v 0.326641 0.173359 0.287013 -v 0.353553 0.146447 0.000000 -v 0.326641 0.173359 -0.287013 -v 0.250000 0.250000 -0.530330 -v 0.135299 0.364701 -0.692910 -v -0.000000 0.308658 0.692910 -v -0.000000 0.146447 0.530330 -v -0.000000 0.038060 0.287013 -v -0.000000 0.000000 0.000000 -v -0.000000 0.038060 -0.287013 -v -0.000000 0.146447 -0.530330 -v -0.000000 0.308658 -0.692910 -v -0.135299 0.364701 0.692910 -v -0.250000 0.250000 0.530330 -v -0.326641 0.173359 0.287013 -v -0.353553 0.146447 0.000000 -v -0.326641 0.173359 -0.287013 -v -0.250000 0.250000 -0.530330 -v -0.135299 0.364701 -0.692910 -v 0.000000 1.000000 -0.750000 -v 0.353553 0.853553 -0.750000 -v 0.500000 0.500000 -0.750000 -v 0.353553 0.146447 -0.750000 -v -0.000000 0.000000 -0.750000 -v -0.353553 0.146447 -0.750000 -v -0.500000 0.500000 -0.750000 -v -0.353553 0.853553 -0.750000 -v 0.176777 0.926777 -1.100000 -v 0.426777 0.676777 -1.100000 -v 0.426777 0.323223 -1.100000 -v 0.176777 0.073223 -1.100000 -v -0.176777 0.073223 -1.100000 -v -0.426777 0.323223 -1.100000 -v -0.426777 0.676777 -1.100000 -v -0.176777 0.926777 -1.100000 -v 0.176777 0.926777 -0.875000 -v 0.426777 0.676777 -0.875000 -v 0.426777 0.323223 -0.875000 -v 0.176777 0.073223 -0.875000 -v -0.176777 0.073223 -0.875000 -v -0.426777 0.323223 -0.875000 -v -0.426777 0.676777 -0.875000 -v -0.176777 0.926777 -0.875000 -v 0.353553 0.853553 -0.875000 -v 0.353553 0.146447 -0.875000 -v -0.353553 0.146447 -0.875000 -v -0.353553 0.853553 -0.875000 -v 0.000000 1.000000 -1.100000 -v 0.500000 0.500000 -1.100000 -v -0.000000 -0.000000 -1.100000 -v -0.500000 0.500000 -1.100000 -v 0.200000 0.500000 -0.600000 -v -0.200000 0.500000 -0.600000 -v -0.000000 0.300000 -0.600000 -v 0.000000 0.700000 -0.600000 -v 0.000000 0.700000 -1.100000 -v -0.000000 0.300000 -1.100000 -v -0.200000 0.500000 -1.100000 -v 0.200000 0.500000 -1.100000 -v 0.000000 1.000000 -0.600000 -v 0.500000 0.500000 -0.600000 -v -0.000000 0.000000 -0.600000 -v -0.500000 0.500000 -0.600000 -v 0.350000 0.500000 -0.450000 -v -0.350000 0.500000 -0.450000 -v -0.000000 0.150000 -0.450000 -v 0.000000 0.850000 -0.450000 -v -0.225000 0.150000 1.000000 -v -0.225000 0.850000 1.000000 -v -0.225000 0.150000 0.700000 -v -0.225000 0.850000 0.700000 -v 0.225000 0.150000 1.000000 -v 0.225000 0.850000 1.000000 -v 0.225000 0.150000 0.700000 -v 0.225000 0.850000 0.700000 -v -0.100000 0.850000 0.775000 -v -0.100000 0.900000 0.775000 -v -0.046967 0.850000 0.796967 -v -0.046967 0.900000 0.796967 -v -0.025000 0.850000 0.850000 -v -0.025000 0.900000 0.850000 -v -0.046967 0.850000 0.903033 -v -0.046967 0.900000 0.903033 -v -0.100000 0.850000 0.925000 -v -0.100000 0.900000 0.925000 -v -0.153033 0.850000 0.903033 -v -0.153033 0.900000 0.903033 -v -0.175000 0.850000 0.850000 -v -0.175000 0.900000 0.850000 -v -0.153033 0.850000 0.796967 -v -0.153033 0.900000 0.796967 -v -0.100000 0.900000 0.895000 -v -0.068180 0.905000 0.881820 -v -0.100000 0.910000 0.895000 -v -0.055000 0.910000 0.850000 -v -0.068180 0.915000 0.881820 -v -0.068180 0.915000 0.818180 -v -0.055000 0.920000 0.850000 -v -0.068180 0.925000 0.818180 -v -0.100000 0.920000 0.805000 -v -0.100000 0.930000 0.805000 -v -0.131820 0.925000 0.818180 -v -0.131820 0.900000 0.881820 -v -0.131820 0.890000 0.881820 -v -0.131820 0.985000 0.881820 -v -0.145000 0.980000 0.850000 -v -0.131820 0.975000 0.881820 -v -0.145000 0.930000 0.850000 -v -0.131820 0.935000 0.818180 -v -0.131820 0.975000 0.818180 -v -0.145000 0.970000 0.850000 -v -0.131820 0.965000 0.818180 -v -0.100000 0.970000 0.805000 -v -0.100000 0.960000 0.805000 -v -0.131820 0.935000 0.881820 -v -0.145000 0.940000 0.850000 -v -0.068180 0.965000 0.818180 -v -0.055000 0.960000 0.850000 -v -0.068180 0.955000 0.818180 -v -0.068180 0.955000 0.881820 -v -0.055000 0.950000 0.850000 -v -0.100000 0.950000 0.895000 -v -0.131820 0.945000 0.881820 -v -0.068180 0.945000 0.881820 -v -0.100000 0.940000 0.895000 -v -0.131820 1.025000 0.881820 -v -0.145000 1.020000 0.850000 -v -0.131820 1.015000 0.881820 -v -0.131820 1.015000 0.818180 -v -0.145000 1.010000 0.850000 -v -0.131820 1.005000 0.818180 -v -0.100000 1.010000 0.805000 -v -0.100000 1.000000 0.805000 -v -0.068180 1.005000 0.818180 -v -0.055000 1.000000 0.850000 -v -0.068180 0.995000 0.818180 -v -0.068180 0.995000 0.881820 -v -0.055000 0.990000 0.850000 -v -0.100000 0.990000 0.895000 -v -0.068180 0.985000 0.881820 -v -0.100000 0.980000 0.895000 -v -0.131820 1.065000 0.881820 -v -0.145000 1.060000 0.850000 -v -0.131820 1.055000 0.881820 -v -0.131820 1.055000 0.818180 -v -0.145000 1.050000 0.850000 -v -0.131820 1.045000 0.818180 -v -0.100000 1.050000 0.805000 -v -0.100000 1.040000 0.805000 -v -0.068180 1.045000 0.818180 -v -0.055000 1.040000 0.850000 -v -0.068180 1.035000 0.818180 -v -0.068180 1.035000 0.881820 -v -0.055000 1.030000 0.850000 -v -0.100000 1.030000 0.895000 -v -0.068180 1.025000 0.881820 -v -0.100000 1.020000 0.895000 -v -0.100000 1.070000 0.895000 -v -0.100000 1.060000 0.895000 -v -0.090000 1.070000 0.895000 -v -0.090000 1.060000 0.895000 -v -0.100000 1.570000 0.895000 -v -0.090000 1.570000 0.895000 -v 0.100000 0.875000 0.810000 -v 0.128284 0.875000 0.821716 -v 0.100000 0.850000 0.800000 -v 0.100000 0.875000 0.800000 -v 0.135355 0.850000 0.814645 -v 0.135355 0.875000 0.814645 -v 0.150000 0.850000 0.850000 -v 0.150000 0.875000 0.850000 -v 0.135355 0.850000 0.885355 -v 0.135355 0.875000 0.885355 -v 0.100000 0.850000 0.900000 -v 0.100000 0.875000 0.900000 -v 0.064645 0.850000 0.885355 -v 0.064645 0.875000 0.885355 -v 0.050000 0.850000 0.850000 -v 0.050000 0.875000 0.850000 -v 0.064645 0.850000 0.814645 -v 0.064645 0.875000 0.814645 -v 0.140000 0.875000 0.850000 -v 0.128284 0.875000 0.878284 -v 0.100000 0.875000 0.890000 -v 0.071716 0.875000 0.878284 -v 0.060000 0.875000 0.850000 -v 0.071716 0.875000 0.821716 -v 0.100000 0.890000 0.810000 -v 0.071716 0.890000 0.821716 -v 0.060000 0.890000 0.850000 -v 0.071716 0.890000 0.878284 -v 0.100000 0.890000 0.890000 -v 0.128284 0.890000 0.878284 -v 0.140000 0.890000 0.850000 -v 0.128284 0.890000 0.821716 -v 0.100000 0.905000 0.820000 -v 0.078787 0.905000 0.828787 -v 0.070000 0.905000 0.850000 -v 0.078787 0.905000 0.871213 -v 0.100000 0.905000 0.880000 -v 0.121213 0.905000 0.871213 -v 0.130000 0.905000 0.850000 -v 0.121213 0.905000 0.828787 -v -0.235000 0.425000 1.010000 -v -0.235000 0.775000 1.010000 -v 0.235000 0.425000 1.010000 -v 0.235000 0.775000 1.010000 -v -0.270250 0.425000 0.410000 -v -0.270250 0.775000 0.410000 -v 0.270250 0.425000 0.410000 -v 0.270250 0.775000 0.410000 -v -0.075000 1.150000 0.500000 -v 0.075000 1.150000 0.500000 -v -0.075000 1.150000 -0.500000 -v 0.075000 1.150000 -0.500000 -v -0.075000 1.200000 0.000000 -v 0.075000 1.200000 0.000000 -v -0.075000 0.800000 0.550000 -v 0.075000 0.800000 0.550000 -v -0.075000 0.800000 -0.550000 -v 0.075000 0.800000 -0.550000 -v -0.050000 0.400000 1.000000 -v -0.050000 0.400000 1.050000 -v 0.020711 0.370711 1.000000 -v 0.020711 0.370711 1.050000 -v 0.050000 0.300000 1.000000 -v 0.050000 0.300000 1.050000 -v 0.020711 0.229289 1.000000 -v 0.020711 0.229289 1.050000 -v -0.050000 0.200000 1.000000 -v -0.050000 0.200000 1.050000 -v -0.120711 0.229289 1.000000 -v -0.120711 0.229289 1.050000 -v -0.150000 0.300000 1.000000 -v -0.150000 0.300000 1.050000 -v -0.120711 0.370711 1.000000 -v -0.120711 0.370711 1.050000 -v -0.065274 0.239884 1.230059 -v -0.071600 0.226042 1.223604 -v -0.065274 0.212199 1.217149 -v -0.050000 0.206465 1.214475 -v -0.034727 0.212199 1.217149 -v -0.028400 0.226042 1.223604 -v -0.050000 0.245618 1.232732 -v -0.034727 0.239884 1.230059 -v -0.024544 0.259678 1.211704 -v -0.014000 0.236607 1.200946 -v -0.024544 0.213536 1.190188 -v -0.050000 0.203980 1.185732 -v -0.075456 0.213536 1.190188 -v -0.086000 0.236607 1.200946 -v -0.075456 0.259678 1.211704 -v -0.050000 0.269234 1.216160 -v -0.075456 0.331523 1.057632 -v -0.086000 0.308452 1.046874 -v -0.075456 0.285381 1.036116 -v -0.050000 0.275825 1.031659 -v -0.024544 0.285381 1.036116 -v -0.014000 0.308452 1.046874 -v -0.050000 0.341079 1.062088 -v -0.024544 0.331523 1.057632 -v 0.006569 0.356569 1.050000 -v -0.050000 0.380000 1.050000 -v 0.030000 0.300000 1.050000 -v 0.006569 0.243431 1.050000 -v -0.050000 0.220000 1.050000 -v -0.106569 0.243431 1.050000 -v -0.130000 0.300000 1.050000 -v -0.106569 0.356569 1.050000 -v 0.006569 0.356569 1.065000 -v -0.050000 0.380000 1.065000 -v 0.030000 0.300000 1.065000 -v 0.006569 0.243431 1.065000 -v -0.050000 0.220000 1.065000 -v -0.106569 0.243431 1.065000 -v -0.130000 0.300000 1.065000 -v -0.106569 0.356569 1.065000 -vt 0.628826 0.653838 -vt 0.561052 0.672886 -vt 0.561028 0.589937 -vt 0.391763 0.690114 -vt 0.391730 0.572807 -vt 0.480369 0.577246 -vt 0.222465 0.672983 -vt 0.222441 0.590034 -vt 0.303093 0.577297 -vt 0.480400 0.685623 -vt 0.303124 0.685674 -vt 0.154680 0.653974 -vt 0.154667 0.609082 -vt 0.628813 0.608946 -vt 0.097729 0.631544 -vt 0.685764 0.631376 -vt 0.479227 0.978483 -vt 0.371939 0.978483 -vt 0.410256 0.919830 -vt 0.371939 0.861177 -vt 0.410256 0.861177 -vt 0.410256 0.802523 -vt 0.371939 0.743870 -vt 0.479227 0.743870 -vt 0.159539 0.832193 -vt 0.312808 0.832193 -vt 0.205520 0.740231 -vt 0.159539 0.740231 -vt 0.205520 0.832193 -vt 0.264229 0.442193 -vt 0.264229 0.227617 -vt 0.356190 0.227617 -vt 0.126287 0.442193 -vt 0.126287 0.227617 -vt 0.494132 0.442193 -vt 0.494132 0.227617 -vt 0.586094 0.227617 -vt 0.356190 0.442193 -vt 0.126287 0.135655 -vt 0.264229 0.534154 -vt 0.146421 0.942265 -vt 0.162677 0.935531 -vt 0.168543 0.949692 -vt 0.169411 0.919275 -vt 0.183571 0.925140 -vt 0.162677 0.903018 -vt 0.176838 0.897153 -vt 0.146421 0.896284 -vt 0.152286 0.882124 -vt 0.130164 0.903018 -vt 0.124299 0.888858 -vt 0.123430 0.919275 -vt 0.109270 0.913409 -vt 0.130164 0.935531 -vt 0.140555 0.956425 -vt 0.116004 0.941397 -vt 0.877669 0.046860 -vt 0.874655 0.047419 -vt 0.874234 0.036760 -vt 0.877248 0.036200 -vt 0.873813 0.026100 -vt 0.878090 0.057519 -vt 0.875077 0.058079 -vt 0.878512 0.068178 -vt 0.878933 0.078838 -vt 0.875919 0.079397 -vt 0.875498 0.068738 -vt 0.879354 0.089497 -vt 0.876340 0.090057 -vt 0.879775 0.100156 -vt 0.881039 0.132135 -vt 0.878025 0.132694 -vt 0.877604 0.122035 -vt 0.880617 0.121475 -vt 0.877183 0.111376 -vt 0.881460 0.142794 -vt 0.878446 0.143354 -vt 0.881881 0.153453 -vt 0.882303 0.164113 -vt 0.879289 0.164673 -vt 0.878868 0.154013 -vt 0.882724 0.174772 -vt 0.879710 0.175332 -vt 0.883145 0.185432 -vt 0.876762 0.100716 -vt 0.880196 0.110816 -vt 0.874899 0.015161 -vt 0.877913 0.014602 -vt 0.876827 0.025541 -vt 0.884409 0.217410 -vt 0.881395 0.217970 -vt 0.880974 0.207310 -vt 0.883987 0.206751 -vt 0.880552 0.196651 -vt 0.884830 0.228069 -vt 0.881816 0.228629 -vt 0.885251 0.238729 -vt 0.885672 0.249388 -vt 0.882659 0.249948 -vt 0.882238 0.239289 -vt 0.886094 0.260048 -vt 0.883080 0.260608 -vt 0.886515 0.270707 -vt 0.887779 0.302686 -vt 0.884765 0.303245 -vt 0.884344 0.292586 -vt 0.887357 0.292026 -vt 0.883923 0.281927 -vt 0.888200 0.313345 -vt 0.885186 0.313905 -vt 0.888622 0.324005 -vt 0.889043 0.334664 -vt 0.886029 0.335224 -vt 0.885608 0.324564 -vt 0.889464 0.345323 -vt 0.886450 0.345883 -vt 0.889885 0.355983 -vt 0.886936 0.281367 -vt 0.883501 0.271267 -vt 0.883566 0.196091 -vt 0.880131 0.185991 -vt 0.890307 0.366642 -vt 0.887293 0.367202 -vt 0.886872 0.356543 -vt 0.890866 0.369656 -vt 0.887853 0.370216 -vt 0.737137 0.398213 -vt 0.736577 0.395198 -vt 0.541724 0.779480 -vt 0.543484 0.775231 -vt 0.552154 0.778823 -vt 0.533838 0.836312 -vt 0.538327 0.825474 -vt 0.540495 0.827641 -vt 0.560003 0.847149 -vt 0.564492 0.836311 -vt 0.571572 0.839244 -vt 0.537846 0.752776 -vt 0.542094 0.754536 -vt 0.538502 0.763206 -vt 0.549165 0.851638 -vt 0.549165 0.848573 -vt 0.557835 0.844982 -vt 0.560003 0.825474 -vt 0.567083 0.822541 -vt 0.534254 0.766931 -vt 0.538502 0.765171 -vt 0.542094 0.773842 -vt 0.549165 0.820985 -vt 0.549165 0.824050 -vt 0.552097 0.813905 -vt 0.555879 0.783071 -vt 0.554119 0.778823 -vt 0.562790 0.775232 -vt 0.538327 0.847149 -vt 0.540495 0.844982 -vt 0.535394 0.818394 -vt 0.553137 0.773385 -vt 0.559639 0.770691 -vt 0.557835 0.827641 -vt 0.526758 0.833379 -vt 0.536903 0.836312 -vt 0.564549 0.748898 -vt 0.562790 0.753146 -vt 0.554119 0.749554 -vt 0.531247 0.850082 -vt 0.562935 0.854229 -vt 0.546232 0.858719 -vt 0.572019 0.761446 -vt 0.567771 0.763206 -vt 0.564179 0.754536 -vt 0.561426 0.836311 -vt 0.568428 0.775601 -vt 0.564180 0.773842 -vt 0.567771 0.765171 -vt 0.550394 0.745306 -vt 0.552154 0.749554 -vt 0.543484 0.753146 -vt 0.546634 0.770691 -vt 0.553137 0.754992 -vt 0.559639 0.757686 -vt 0.562333 0.764189 -vt 0.546634 0.757686 -vt 0.543940 0.764189 -vt 0.867378 0.633716 -vt 0.867378 0.777789 -vt 0.760090 0.777789 -vt 0.867378 0.962029 -vt 0.760090 0.962029 -vt 0.760090 0.449477 -vt 0.867378 0.449477 -vt 0.402749 0.048192 -vt 0.556782 0.048192 -vt 0.556782 0.094173 -vt 0.248716 0.048192 -vt 0.402749 0.094173 -vt 0.248716 0.094173 -vt 0.140338 0.094173 -vt 0.140338 0.048192 -vt 0.665160 0.048192 -vt 0.665160 0.094173 -vt 0.278815 0.947502 -vt 0.295405 0.930913 -vt 0.306243 0.941750 -vt 0.295405 0.907451 -vt 0.310732 0.907451 -vt 0.306243 0.896613 -vt 0.278815 0.890862 -vt 0.278815 0.875535 -vt 0.255354 0.890862 -vt 0.238764 0.907451 -vt 0.227926 0.896613 -vt 0.238764 0.930913 -vt 0.223437 0.930913 -vt 0.276469 0.896526 -vt 0.257700 0.896526 -vt 0.255354 0.962829 -vt 0.255354 0.947502 -vt 0.244516 0.958340 -vt 0.621935 0.742318 -vt 0.621935 0.750764 -vt 0.613254 0.749075 -vt 0.621935 0.725426 -vt 0.621935 0.733872 -vt 0.613254 0.732182 -vt 0.621935 0.776102 -vt 0.621935 0.784548 -vt 0.613254 0.782859 -vt 0.621935 0.759210 -vt 0.621935 0.767656 -vt 0.613254 0.765967 -vt 0.613254 0.740628 -vt 0.613254 0.723736 -vt 0.613254 0.718669 -vt 0.613254 0.774413 -vt 0.613254 0.769345 -vt 0.674046 0.742318 -vt 0.674046 0.750764 -vt 0.674046 0.725426 -vt 0.674046 0.733872 -vt 0.674046 0.776102 -vt 0.674046 0.759210 -vt 0.621935 0.716979 -vt 0.674046 0.716980 -vt 0.674046 0.767656 -vt 0.613254 0.757521 -vt 0.613254 0.752453 -vt 0.638688 0.827862 -vt 0.643756 0.827862 -vt 0.647340 0.836513 -vt 0.574922 0.909916 -vt 0.571671 0.913167 -vt 0.558399 0.899895 -vt 0.244428 0.928566 -vt 0.257700 0.941838 -vt 0.289741 0.928567 -vt 0.289741 0.909797 -vt 0.244428 0.909797 -vt 0.276469 0.941838 -vt 0.526358 0.931936 -vt 0.539630 0.899895 -vt 0.561650 0.948459 -vt 0.558399 0.945208 -vt 0.571671 0.931936 -vt 0.539630 0.949806 -vt 0.539630 0.945208 -vt 0.521760 0.913167 -vt 0.526358 0.913167 -vt 0.558399 0.895297 -vt 0.576269 0.931936 -vt 0.523107 0.935187 -vt 0.536379 0.896644 -vt 0.479227 0.919830 -vt 0.479227 0.802523 -vt 0.113558 0.786212 -vt 0.312808 0.740231 -vt 0.586094 0.442193 -vt 0.264229 0.135655 -vt 0.126287 0.534154 -vt 0.152286 0.956425 -vt 0.176838 0.941397 -vt 0.183571 0.913409 -vt 0.168543 0.888858 -vt 0.140555 0.882124 -vt 0.116004 0.897153 -vt 0.124299 0.949692 -vt 0.109270 0.925140 -vt 0.550394 0.783071 -vt 0.567083 0.850082 -vt 0.534254 0.761446 -vt 0.571572 0.833379 -vt 0.537846 0.775601 -vt 0.562935 0.818394 -vt 0.564549 0.779480 -vt 0.546232 0.813905 -vt 0.531247 0.822541 -vt 0.555879 0.745306 -vt 0.526758 0.839244 -vt 0.552097 0.858718 -vt 0.535394 0.854229 -vt 0.568428 0.752776 -vt 0.572019 0.766931 -vt 0.541724 0.748898 -vt 0.760090 0.633716 -vt 0.289653 0.958340 -vt 0.310732 0.930913 -vt 0.289653 0.880024 -vt 0.255354 0.875535 -vt 0.244516 0.880024 -vt 0.223437 0.907451 -vt 0.278815 0.962829 -vt 0.227926 0.941750 -vt 0.613254 0.744007 -vt 0.613254 0.727115 -vt 0.613254 0.777791 -vt 0.613254 0.760899 -vt 0.613254 0.735561 -vt 0.674046 0.784548 -vt 0.643756 0.840096 -vt 0.638688 0.840096 -vt 0.635105 0.836513 -vt 0.635105 0.831445 -vt 0.647340 0.831445 -vt 0.561650 0.896644 -vt 0.574922 0.935188 -vt 0.558399 0.949806 -vt 0.521760 0.931936 -vt 0.539630 0.895297 -vt 0.576269 0.913167 -vt 0.536379 0.948459 -vt 0.523107 0.909916 -vn -0.679300 0.281400 -0.677800 -vn -0.917000 0.379800 -0.121600 -vn -0.854400 0.353900 0.380600 -vn -0.854400 0.353900 -0.380600 -vn -0.917000 0.379800 0.121600 -vn -0.679300 0.281400 0.677800 -vn -0.353900 0.854400 0.380600 -vn -0.353900 0.854400 -0.380600 -vn -0.379800 0.917000 0.121600 -vn -0.281400 0.679300 0.677800 -vn -0.281400 0.679300 -0.677800 -vn -0.379800 0.917000 -0.121600 -vn 0.353900 0.854400 -0.380600 -vn 0.379800 0.917000 0.121600 -vn 0.281400 0.679300 0.677800 -vn 0.281400 0.679300 -0.677800 -vn 0.379800 0.917000 -0.121600 -vn 0.353900 0.854400 0.380600 -vn 0.679300 0.281400 0.677800 -vn 0.679300 0.281400 -0.677800 -vn 0.917000 0.379800 -0.121600 -vn 0.854400 0.353900 0.380600 -vn 0.854400 0.353900 -0.380600 -vn 0.917000 0.379800 0.121600 -vn 0.679300 -0.281400 -0.677800 -vn 0.917000 -0.379800 -0.121600 -vn 0.854400 -0.353900 0.380600 -vn 0.854400 -0.353900 -0.380600 -vn 0.917000 -0.379800 0.121600 -vn 0.679300 -0.281400 0.677800 -vn 0.353900 -0.854400 -0.380600 -vn 0.379800 -0.917000 0.121600 -vn 0.281400 -0.679300 0.677800 -vn 0.281400 -0.679300 -0.677800 -vn 0.379800 -0.917000 -0.121600 -vn 0.353900 -0.854400 0.380600 -vn -0.353900 -0.854400 -0.380600 -vn -0.379800 -0.917000 0.121600 -vn -0.281400 -0.679300 0.677800 -vn -0.281400 -0.679300 -0.677800 -vn -0.379800 -0.917000 -0.121600 -vn -0.353900 -0.854400 0.380600 -vn -0.283900 0.117600 0.951600 -vn -0.283900 0.117600 -0.951600 -vn -0.117600 0.283900 0.951600 -vn -0.117600 0.283900 -0.951600 -vn 0.117600 0.283900 -0.951600 -vn 0.117600 0.283900 0.951600 -vn 0.283900 0.117600 0.951600 -vn 0.283900 0.117600 -0.951600 -vn 0.283900 -0.117600 0.951600 -vn 0.283900 -0.117600 -0.951600 -vn 0.117600 -0.283900 0.951600 -vn 0.117600 -0.283900 -0.951600 -vn -0.117600 -0.283900 0.951600 -vn -0.117600 -0.283900 -0.951600 -vn -0.679300 -0.281400 -0.677800 -vn -0.917000 -0.379800 -0.121600 -vn -0.854400 -0.353900 0.380600 -vn -0.283900 -0.117600 0.951600 -vn -0.283900 -0.117600 -0.951600 -vn -0.854400 -0.353900 -0.380600 -vn -0.917000 -0.379800 0.121600 -vn -0.679300 -0.281400 0.677800 -vn 0.382700 0.923900 0.000000 -vn 0.923900 0.382700 0.000000 -vn 0.923900 -0.382700 0.000000 -vn 0.382700 -0.923900 0.000000 -vn -0.382700 -0.923900 0.000000 -vn -0.923900 -0.382700 0.000000 -vn -0.923900 0.382700 0.000000 -vn -0.382700 0.923900 -0.000000 -vn 0.000000 1.000000 0.000000 -vn 1.000000 0.000000 0.000000 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 -1.000000 -vn 0.000000 0.000000 1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.382700 0.000000 -0.923900 -vn 0.923900 0.000000 -0.382700 -vn 0.923900 0.000000 0.382700 -vn 0.382700 0.000000 0.923900 -vn -0.382700 0.000000 0.923900 -vn -0.923900 0.000000 0.382700 -vn -0.382700 0.000000 -0.923900 -vn -0.923900 0.000000 -0.382700 -vn -0.325800 0.524400 -0.786600 -vn 0.325800 0.524400 -0.786600 -vn 0.786600 0.524400 0.325800 -vn -0.325800 0.524400 0.786600 -vn -0.786600 0.524400 -0.325800 -vn 0.786600 0.524400 -0.325800 -vn 0.325800 0.524400 0.786600 -vn -0.786600 0.524400 0.325800 -vn 0.998300 0.000000 0.058600 -vn -0.998300 0.000000 0.058600 -vn 0.000000 0.995000 -0.099500 -vn 0.000000 0.995000 0.099500 -vn 0.000000 0.141400 0.989900 -vn 0.000000 0.141400 -0.989900 -vn 0.337800 0.540600 0.770400 -vn 0.815600 -0.504700 0.283000 -vn -0.337800 -0.937700 0.081100 -vn -0.815600 0.107600 0.568500 -vn 0.815600 0.107600 0.568500 -vn 0.337800 -0.937700 0.081100 -vn -0.815600 -0.504700 0.283000 -vn 0.382700 0.837300 0.390400 -vn 0.923900 -0.346800 -0.161700 -vn -0.382700 -0.837300 -0.390400 -vn -0.923900 0.346800 0.161700 -vn 0.923900 0.346800 0.161700 -vn 0.382700 -0.837300 -0.390400 -vn -0.923900 -0.346800 -0.161700 -vn -0.382700 0.837300 0.390400 -vn -0.337800 0.540600 0.770400 -vn 0.000000 -0.422600 0.906300 -s off -f 7/1/1 6/2/1 14/3/1 -f 4/4/2 12/5/2 13/6/2 -f 2/7/3 10/8/3 11/9/3 -f 5/10/4 13/6/4 14/3/4 -f 3/11/5 11/9/5 12/5/5 -f 1/12/6 9/13/6 10/8/6 -f 10/7/7 17/8/7 18/9/7 -f 13/10/8 20/6/8 21/3/8 -f 12/4/9 11/11/9 18/9/9 -f 9/12/10 16/13/10 17/8/10 -f 15/1/11 14/2/11 21/3/11 -f 12/4/12 19/5/12 20/6/12 -f 21/2/13 20/10/13 28/6/13 -f 18/11/14 26/9/14 27/5/14 -f 16/12/15 24/13/15 25/8/15 -f 21/2/16 29/3/16 30/14/16 -f 19/4/17 27/5/17 28/6/17 -f 17/7/18 25/8/18 26/9/18 -f 25/7/19 24/12/19 31/13/19 -f 30/1/20 29/2/20 36/3/20 -f 27/4/21 34/5/21 35/6/21 -f 25/7/22 32/8/22 33/9/22 -f 29/2/23 28/10/23 35/6/23 -f 26/11/24 33/9/24 34/5/24 -f 36/2/25 43/3/25 44/14/25 -f 34/4/26 41/5/26 42/6/26 -f 32/7/27 39/8/27 40/9/27 -f 36/2/28 35/10/28 42/6/28 -f 34/4/29 33/11/29 40/9/29 -f 32/7/30 31/12/30 38/13/30 -f 42/10/31 49/6/31 50/3/31 -f 41/4/32 40/11/32 47/9/32 -f 38/12/33 45/13/33 46/8/33 -f 44/1/34 43/2/34 50/3/34 -f 41/4/35 48/5/35 49/6/35 -f 39/7/36 46/8/36 47/9/36 -f 50/2/37 49/10/37 56/6/37 -f 47/11/38 54/9/38 55/5/38 -f 45/12/39 52/13/39 53/8/39 -f 51/1/40 50/2/40 57/3/40 -f 48/4/41 55/5/41 56/6/41 -f 46/7/42 53/8/42 54/9/42 -f 1/12/43 23/15/43 9/13/43 -f 8/16/44 7/1/44 15/14/44 -f 9/12/45 23/15/45 16/13/45 -f 8/16/46 15/1/46 22/14/46 -f 8/16/47 22/1/47 30/14/47 -f 16/12/48 23/15/48 24/13/48 -f 24/12/49 23/15/49 31/13/49 -f 8/16/50 30/1/50 37/14/50 -f 31/12/51 23/15/51 38/13/51 -f 8/16/52 37/1/52 44/14/52 -f 38/12/53 23/15/53 45/13/53 -f 8/16/54 44/1/54 51/14/54 -f 45/12/55 23/15/55 52/13/55 -f 8/16/56 51/1/56 58/14/56 -f 57/2/57 6/3/57 7/14/57 -f 55/4/58 4/5/58 5/6/58 -f 54/11/59 53/7/59 2/8/59 -f 52/12/60 23/15/60 1/13/60 -f 8/16/61 58/1/61 7/14/61 -f 56/10/62 5/6/62 6/3/62 -f 54/11/63 3/9/63 4/5/63 -f 53/7/64 52/12/64 1/13/64 -f 87/17/65 59/18/65 75/19/65 -f 60/20/65 83/21/65 75/19/65 -f 76/22/66 61/23/66 88/24/66 -f 60/20/66 61/23/66 76/22/66 -f 88/17/67 61/18/67 77/19/67 -f 62/20/67 84/21/67 77/19/67 -f 62/20/68 63/23/68 78/22/68 -f 78/22/68 63/23/68 89/24/68 -f 89/17/69 63/18/69 79/19/69 -f 64/20/69 85/21/69 79/19/69 -f 64/20/70 65/23/70 80/22/70 -f 80/22/70 65/23/70 90/24/70 -f 90/17/71 65/18/71 81/19/71 -f 66/20/71 86/21/71 81/19/71 -f 66/20/72 59/23/72 82/22/72 -f 82/22/72 59/23/72 87/24/72 -f 92/25/73 97/26/73 65/27/73 -f 99/25/74 94/28/74 59/29/74 -f 61/27/73 91/25/73 100/28/73 -f 63/27/74 93/25/74 101/28/74 -f 110/30/75 109/31/75 107/32/75 -f 114/33/76 113/34/76 109/31/76 -f 112/35/74 111/36/74 113/37/74 -f 108/38/77 107/32/77 111/36/77 -f 109/31/78 113/34/78 111/39/78 -f 114/33/73 110/30/73 108/40/73 -f 116/41/79 118/42/79 117/43/79 -f 118/42/80 120/44/80 119/45/80 -f 120/44/81 122/46/81 121/47/81 -f 122/46/82 124/48/82 123/49/82 -f 124/48/83 126/50/83 125/51/83 -f 126/50/84 128/52/84 127/53/84 -f 130/54/85 116/41/85 115/55/85 -f 128/52/86 130/54/86 129/56/86 -f 128/52/73 124/48/73 120/44/73 -f 134/57/81 137/58/81 135/59/81 -f 132/60/82 135/59/82 133/61/82 -f 137/58/80 134/57/80 136/62/80 -f 138/63/79 136/62/79 139/64/79 -f 141/65/85 148/66/85 140/67/85 -f 148/66/86 141/65/86 147/68/86 -f 155/69/84 147/68/84 154/70/84 -f 160/71/81 157/72/81 159/73/81 -f 163/74/82 159/73/82 161/75/82 -f 157/72/80 160/71/80 158/76/80 -f 156/77/79 158/76/79 153/78/79 -f 151/79/85 149/80/85 152/81/85 -f 149/80/86 151/79/86 150/82/86 -f 145/83/84 150/82/84 146/84/84 -f 162/85/83 154/70/83 164/86/83 -f 142/87/83 143/88/83 131/89/83 -f 177/90/81 174/91/81 176/92/81 -f 179/93/82 176/92/82 178/94/82 -f 174/91/80 177/90/80 175/95/80 -f 173/96/79 175/95/79 172/97/79 -f 170/98/85 168/99/85 171/100/85 -f 168/99/86 170/98/86 169/101/86 -f 166/102/84 169/101/84 167/103/84 -f 193/104/81 190/105/81 192/106/81 -f 195/107/82 192/106/82 194/108/82 -f 190/105/80 193/104/80 191/109/80 -f 189/110/79 191/109/79 188/111/79 -f 186/112/85 184/113/85 187/114/85 -f 184/113/86 186/112/86 185/115/86 -f 182/116/84 185/115/84 183/117/84 -f 196/118/83 194/108/83 165/119/83 -f 180/120/83 178/94/83 144/121/83 -f 198/122/83 197/123/83 181/124/83 -f 200/125/77 199/126/77 197/123/77 -f 202/127/77 201/128/77 197/123/77 -f 225/129/86 229/130/86 228/131/86 -f 216/132/73 214/133/73 223/134/73 -f 206/135/79 208/136/79 207/137/79 -f 223/138/83 231/139/83 230/140/83 -f 220/141/73 226/142/73 203/143/73 -f 208/136/80 210/144/80 209/145/80 -f 224/146/84 230/147/84 229/148/84 -f 212/149/73 222/150/73 223/134/73 -f 210/144/81 212/149/81 211/151/81 -f 226/152/85 228/153/85 227/154/85 -f 218/155/73 225/156/73 226/142/73 -f 212/149/82 214/133/82 213/157/82 -f 228/153/87 236/158/87 235/159/87 -f 212/149/73 210/144/73 221/160/73 -f 214/133/83 216/132/83 215/161/83 -f 218/155/73 216/132/73 224/162/73 -f 221/163/81 233/164/81 232/165/81 -f 216/132/84 218/155/84 217/166/84 -f 208/136/73 206/135/73 203/143/73 -f 220/141/85 206/135/85 205/167/85 -f 218/155/86 220/141/86 219/168/86 -f 204/169/80 234/170/80 233/171/80 -f 208/136/73 204/172/73 221/160/73 -f 203/173/79 227/174/79 234/175/79 -f 222/176/82 232/177/82 231/178/82 -f 237/179/73 240/180/73 241/181/73 -f 227/174/88 235/159/88 242/182/88 -f 233/164/89 241/181/89 240/180/89 -f 230/140/90 231/139/90 239/183/90 -f 229/130/91 237/179/91 236/158/91 -f 233/171/92 234/170/92 242/182/92 -f 232/177/93 240/180/93 239/183/93 -f 230/147/94 238/184/94 237/179/94 -f 243/185/77 245/186/77 246/187/77 -f 249/188/95 250/189/95 246/187/95 -f 248/190/96 247/191/96 243/185/96 -f 256/192/97 254/193/97 253/194/97 -f 252/195/98 256/192/98 255/196/98 -f 251/197/99 257/198/99 258/199/99 -f 254/193/100 260/200/100 259/201/100 -f 262/202/65 264/203/65 263/204/65 -f 264/203/66 266/205/66 265/206/66 -f 265/207/67 266/205/67 268/208/67 -f 267/209/68 268/208/68 270/210/68 -f 270/210/69 272/211/69 271/212/69 -f 272/211/70 274/213/70 273/214/70 -f 268/208/77 304/215/77 305/216/77 -f 275/217/72 276/218/72 262/202/72 -f 274/213/71 276/218/71 275/219/71 -f 285/220/101 292/221/101 283/222/101 -f 287/223/102 286/224/102 282/225/102 -f 289/226/103 288/227/103 280/228/103 -f 291/229/104 290/230/104 278/231/104 -f 286/224/105 285/220/105 284/232/105 -f 287/223/106 281/233/106 280/234/106 -f 289/226/107 279/235/107 278/236/107 -f 285/220/108 300/237/108 299/238/108 -f 287/223/109 297/239/109 298/240/109 -f 288/227/110 289/226/110 295/241/110 -f 290/230/111 291/229/111 293/242/111 -f 286/224/112 298/240/112 300/237/112 -f 288/243/113 296/244/113 297/239/113 -f 290/230/114 294/245/114 295/241/114 -f 291/229/115 292/221/115 299/238/115 -f 291/229/116 277/246/116 283/247/116 -f 279/248/117 280/249/117 282/250/117 -f 303/251/67 311/252/67 312/253/67 -f 274/213/77 307/254/77 308/255/77 -f 264/203/77 301/256/77 303/257/77 -f 270/210/77 305/216/77 306/258/77 -f 276/218/77 308/255/77 302/259/77 -f 264/203/77 262/202/77 302/259/77 -f 266/205/77 303/257/77 304/215/77 -f 272/211/77 306/258/77 307/254/77 -f 315/260/77 313/261/77 311/252/77 -f 302/262/65 310/263/65 309/264/65 -f 308/265/72 316/266/72 310/263/72 -f 306/267/70 314/268/70 315/260/70 -f 304/269/68 312/253/68 313/261/68 -f 301/270/66 309/264/66 311/252/66 -f 307/271/71 315/260/71 316/266/71 -f 305/272/69 313/261/69 314/268/69 -f 15/14/1 7/1/1 14/3/1 -f 5/10/2 4/4/2 13/6/2 -f 3/11/3 2/7/3 11/9/3 -f 6/2/4 5/10/4 14/3/4 -f 4/4/5 3/11/5 12/5/5 -f 2/7/6 1/12/6 10/8/6 -f 11/11/7 10/7/7 18/9/7 -f 14/2/8 13/10/8 21/3/8 -f 19/5/9 12/4/9 18/9/9 -f 10/7/10 9/12/10 17/8/10 -f 22/14/11 15/1/11 21/3/11 -f 13/10/12 12/4/12 20/6/12 -f 29/3/13 21/2/13 28/6/13 -f 19/4/14 18/11/14 27/5/14 -f 17/7/15 16/12/15 25/8/15 -f 22/1/16 21/2/16 30/14/16 -f 20/10/17 19/4/17 28/6/17 -f 18/11/18 17/7/18 26/9/18 -f 32/8/19 25/7/19 31/13/19 -f 37/14/20 30/1/20 36/3/20 -f 28/10/21 27/4/21 35/6/21 -f 26/11/22 25/7/22 33/9/22 -f 36/3/23 29/2/23 35/6/23 -f 27/4/24 26/11/24 34/5/24 -f 37/1/25 36/2/25 44/14/25 -f 35/10/26 34/4/26 42/6/26 -f 33/11/27 32/7/27 40/9/27 -f 43/3/28 36/2/28 42/6/28 -f 41/5/29 34/4/29 40/9/29 -f 39/8/30 32/7/30 38/13/30 -f 43/2/31 42/10/31 50/3/31 -f 48/5/32 41/4/32 47/9/32 -f 39/7/33 38/12/33 46/8/33 -f 51/14/34 44/1/34 50/3/34 -f 42/10/35 41/4/35 49/6/35 -f 40/11/36 39/7/36 47/9/36 -f 57/3/37 50/2/37 56/6/37 -f 48/4/38 47/11/38 55/5/38 -f 46/7/39 45/12/39 53/8/39 -f 58/14/40 51/1/40 57/3/40 -f 49/10/41 48/4/41 56/6/41 -f 47/11/42 46/7/42 54/9/42 -f 58/1/57 57/2/57 7/14/57 -f 56/10/58 55/4/58 5/6/58 -f 3/9/59 54/11/59 2/8/59 -f 57/2/62 56/10/62 6/3/62 -f 55/4/63 54/11/63 4/5/63 -f 2/8/64 53/7/64 1/13/64 -f 67/273/65 87/17/65 75/19/65 -f 59/18/65 60/20/65 75/19/65 -f 68/274/66 76/22/66 88/24/66 -f 83/21/66 60/20/66 76/22/66 -f 69/273/67 88/17/67 77/19/67 -f 61/18/67 62/20/67 77/19/67 -f 84/21/68 62/20/68 78/22/68 -f 70/274/68 78/22/68 89/24/68 -f 71/273/69 89/17/69 79/19/69 -f 63/18/69 64/20/69 79/19/69 -f 85/21/70 64/20/70 80/22/70 -f 72/274/70 80/22/70 90/24/70 -f 73/273/71 90/17/71 81/19/71 -f 65/18/71 66/20/71 81/19/71 -f 86/21/72 66/20/72 82/22/72 -f 74/274/72 82/22/72 87/24/72 -f 65/27/73 102/28/73 92/25/73 -f 104/275/73 92/25/73 102/28/73 -f 97/26/73 90/276/73 65/27/73 -f 87/26/74 59/29/74 95/276/74 -f 99/25/74 106/275/74 94/28/74 -f 94/28/74 95/276/74 59/29/74 -f 103/275/73 100/28/73 91/25/73 -f 61/27/73 88/276/73 98/26/73 -f 98/26/73 91/25/73 61/27/73 -f 105/275/74 101/28/74 93/25/74 -f 63/27/74 89/276/74 96/26/74 -f 96/26/74 93/25/74 63/27/74 -f 108/38/75 110/30/75 107/32/75 -f 110/30/76 114/33/76 109/31/76 -f 114/277/74 112/35/74 113/37/74 -f 112/35/77 108/38/77 111/36/77 -f 107/278/78 109/31/78 111/39/78 -f 112/279/73 114/33/73 108/40/73 -f 115/280/79 116/41/79 117/43/79 -f 117/281/80 118/42/80 119/45/80 -f 119/282/81 120/44/81 121/47/81 -f 121/283/82 122/46/82 123/49/82 -f 123/284/83 124/48/83 125/51/83 -f 125/285/84 126/50/84 127/53/84 -f 129/286/85 130/54/85 115/55/85 -f 127/287/86 128/52/86 129/56/86 -f 120/44/73 118/42/73 128/52/73 -f 116/41/73 130/54/73 128/52/73 -f 128/52/73 126/50/73 124/48/73 -f 124/48/73 122/46/73 120/44/73 -f 118/42/73 116/41/73 128/52/73 -f 132/60/81 134/57/81 135/59/81 -f 131/89/82 132/60/82 133/61/82 -f 138/63/80 137/58/80 136/62/80 -f 140/67/79 138/63/79 139/64/79 -f 139/64/85 141/65/85 140/67/85 -f 155/69/86 148/66/86 147/68/86 -f 162/85/84 155/69/84 154/70/84 -f 163/74/81 160/71/81 159/73/81 -f 164/86/82 163/74/82 161/75/82 -f 156/77/80 157/72/80 158/76/80 -f 152/81/79 156/77/79 153/78/79 -f 153/78/85 151/79/85 152/81/85 -f 145/83/86 149/80/86 150/82/86 -f 144/121/84 145/83/84 146/84/84 -f 161/75/83 162/85/83 164/86/83 -f 133/61/83 142/87/83 131/89/83 -f 179/93/81 177/90/81 176/92/81 -f 180/120/82 179/93/82 178/94/82 -f 173/96/80 174/91/80 175/95/80 -f 171/100/79 173/96/79 172/97/79 -f 172/97/85 170/98/85 171/100/85 -f 166/102/86 168/99/86 169/101/86 -f 165/119/84 166/102/84 167/103/84 -f 195/107/81 193/104/81 192/106/81 -f 196/118/82 195/107/82 194/108/82 -f 189/110/80 190/105/80 191/109/80 -f 187/114/79 189/110/79 188/111/79 -f 188/111/85 186/112/85 187/114/85 -f 182/116/86 184/113/86 185/115/86 -f 181/124/84 182/116/84 183/117/84 -f 167/103/83 196/118/83 165/119/83 -f 146/84/83 180/120/83 144/121/83 -f 183/117/83 198/122/83 181/124/83 -f 198/122/77 200/125/77 197/123/77 -f 199/126/77 202/127/77 197/123/77 -f 226/288/86 225/129/86 228/131/86 -f 224/162/73 216/132/73 223/134/73 -f 205/289/79 206/135/79 207/137/79 -f 224/290/83 223/138/83 230/140/83 -f 206/135/73 220/141/73 203/143/73 -f 207/291/80 208/136/80 209/145/80 -f 225/292/84 224/146/84 229/148/84 -f 214/133/73 212/149/73 223/134/73 -f 209/293/81 210/144/81 211/151/81 -f 203/294/85 226/152/85 227/154/85 -f 220/141/73 218/155/73 226/142/73 -f 211/295/82 212/149/82 213/157/82 -f 227/154/87 228/153/87 235/159/87 -f 222/150/73 212/149/73 221/160/73 -f 213/296/83 214/133/83 215/161/83 -f 225/156/73 218/155/73 224/162/73 -f 222/297/81 221/163/81 232/165/81 -f 215/298/84 216/132/84 217/166/84 -f 204/172/73 208/136/73 203/143/73 -f 219/299/85 220/141/85 205/167/85 -f 217/300/86 218/155/86 219/168/86 -f 221/301/80 204/169/80 233/171/80 -f 210/144/73 208/136/73 221/160/73 -f 204/302/79 203/173/79 234/175/79 -f 223/303/82 222/176/82 231/178/82 -f 241/181/73 242/182/73 237/179/73 -f 235/159/73 236/158/73 237/179/73 -f 237/179/73 238/184/73 239/183/73 -f 239/183/73 240/180/73 237/179/73 -f 242/182/73 235/159/73 237/179/73 -f 234/175/88 227/174/88 242/182/88 -f 232/165/89 233/164/89 240/180/89 -f 238/184/90 230/140/90 239/183/90 -f 228/131/91 229/130/91 236/158/91 -f 241/181/92 233/171/92 242/182/92 -f 231/178/93 232/177/93 239/183/93 -f 229/148/94 230/147/94 237/179/94 -f 244/304/77 243/185/77 246/187/77 -f 245/186/95 249/188/95 246/187/95 -f 244/304/96 248/190/96 243/185/96 -f 255/196/97 256/192/97 253/194/97 -f 251/197/98 252/195/98 255/196/98 -f 252/195/99 251/197/99 258/199/99 -f 253/194/100 254/193/100 259/201/100 -f 261/305/65 262/202/65 263/204/65 -f 263/306/66 264/203/66 265/206/66 -f 267/307/67 265/207/67 268/208/67 -f 269/308/68 267/209/68 270/210/68 -f 269/309/69 270/210/69 271/212/69 -f 271/310/70 272/211/70 273/214/70 -f 270/210/77 268/208/77 305/216/77 -f 261/311/72 275/217/72 262/202/72 -f 273/312/71 274/213/71 275/219/71 -f 284/313/101 285/220/101 283/222/101 -f 281/314/102 287/223/102 282/225/102 -f 279/315/103 289/226/103 280/228/103 -f 277/316/104 291/229/104 278/231/104 -f 282/317/105 286/224/105 284/232/105 -f 288/243/106 287/223/106 280/234/106 -f 290/230/107 289/226/107 278/236/107 -f 292/221/108 285/220/108 299/238/108 -f 286/224/109 287/223/109 298/240/109 -f 296/318/110 288/227/110 295/241/110 -f 294/245/111 290/230/111 293/242/111 -f 285/220/112 286/224/112 300/237/112 -f 287/223/113 288/243/113 297/239/113 -f 289/226/114 290/230/114 295/241/114 -f 293/242/115 291/229/115 299/238/115 -f 292/221/116 291/229/116 283/247/116 -f 282/250/117 284/319/117 283/320/117 -f 283/320/117 277/321/117 282/250/117 -f 278/322/117 279/248/117 282/250/117 -f 280/249/117 281/323/117 282/250/117 -f 282/250/117 277/321/117 278/322/117 -f 304/324/67 303/251/67 312/253/67 -f 276/218/77 274/213/77 308/255/77 -f 266/205/77 264/203/77 303/257/77 -f 272/211/77 270/210/77 306/258/77 -f 262/202/77 276/218/77 302/259/77 -f 301/256/77 264/203/77 302/259/77 -f 268/208/77 266/205/77 304/215/77 -f 274/213/77 272/211/77 307/254/77 -f 311/252/77 309/264/77 310/263/77 -f 310/263/77 316/266/77 311/252/77 -f 315/260/77 314/268/77 313/261/77 -f 313/261/77 312/253/77 311/252/77 -f 311/252/77 316/266/77 315/260/77 -f 301/325/65 302/262/65 309/264/65 -f 302/326/72 308/265/72 310/263/72 -f 307/327/70 306/267/70 315/260/70 -f 305/328/68 304/269/68 313/261/68 -f 303/329/66 301/270/66 311/252/66 -f 308/330/71 307/271/71 316/266/71 -f 306/331/69 305/272/69 314/268/69 diff --git a/src/main/resources/assets/hbm/textures/models/bombs/mine_fat.png b/src/main/resources/assets/hbm/textures/models/bombs/mine_fat.png new file mode 100644 index 0000000000000000000000000000000000000000..32004aaef5aef427789a91b2ed23377a04e3d4af GIT binary patch literal 1763 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 Date: Tue, 7 Jul 2026 13:21:23 +0200 Subject: [PATCH 063/107] MS-ES v1.1 documentation --- .../inventory/gui/GUIScreenRadioAUTOCAL.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java index 3344dec11..b27f2e7bb 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java @@ -234,9 +234,17 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { "", "Example: `/ntmserver set AUTOCAL_MAX_CLOCK 10` -> Sets the max clock speed to 10.", "", + "## About MS-ES v1.1", + "MS-ES v1.1 (or MS-ES1 FEID, \"First Extended Instruction Set\") is the second released version of the AUTOCAL's script interpreter. It features various useful additions such as text splitting, substrings, a stack-based buffer and world time grabbing. The stack for example allows for a call stack, which means that functions that were jumped to can now be nested without having to save the most recent jumping points in dedicated variables. The string split and substring operations now allow for reversing concat operations and potentially grabbing individual coordinates out of combined coordinate strings. A single RoR send operation can now send serialized data (i.e. multiple values in a single text string) which can now finally be de-serialized again.", + "", + "Programs witten in MS-ES1 are largely compatible with MS-ES1.1 interpreters, however, MS-ES1.1 now imposes a character limit of 256 on buffered values.", + "", "## About the Buffer", "The buffer is a single \"slot\" of information that can be used for many commands. Some commands produce an output which is saved to the buffer, some commands modify the contents of the buffer, and some commands use the buffer's contents. The buffer's contents can also be saved permanently as a named variable, and named variables can be written back into the buffer again if needed. The buffer persists as long as the AUTOCAL unit is running, should it restart or shut down, the buffer's contents are lost.", "", + "## About the Stack (v1.1)", + "The stack functions similar to the buffer, as in there is only one single stack that can be accessed per AUTOCAL unit, and it can save arbitrary text data. The difference being, while the buffer can only store one value, the stack can store a list of up to 256 values. Values on a stack follow the last-in-first-out principle, i.e. the most recently added values are read first. The stack supports `push` (adding new elements), `pop` (reading and removing elements) and `peek` (reading but not removing elements).", + "", "## About Variables", "MS-ES1 allows named variables to be saved for later use. There is no limit to how many variables can be saved. All variables are text (\"Strings\"), however depending on the command and context, that text may be interpreted as a number (both full and decimal). Variables, much like the buffer, are also stored as long as the program is running, if the AUTOCAL unit shuts down, all stored variables are lost.", "", @@ -325,6 +333,15 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { "", "-> Will buffer the value `Horseshoe` and then save it to the variable called \"item\".", "", + "### push (v1.1)", + "`push [value]` will add the supplied value to the stack. If no value is supplied, it will write the buffer's contents to the stack instead. Do note that the stack can only hold up to 256 values! Supports variable substitution!", + "", + "### pop (v1.1)", + "`pop` will remove the most recently added value from the stack and write it to the buffer.", + "", + "### peek (v1.1)", + "`peek` will write the most recently added value from the stack to the buffer, but without removing it from the stack like `pop` would.", + "", "### eval", "`eval [statement]` will evaluate the supplied statement as a mathematical expression. In short, anything NTM's calculator can make sense of (the one you open with N by default), this function can do the same. The statement is optional, if no statement is supplied, then it will try to use the buffer's contents as the statement. `eval` produces **decimal** values and not whole number **integers**, so for use in RoR signals, the output needs to be rounded! The result of the calculation is then saved to the buffer. Supports variable substitution!", "", @@ -387,6 +404,54 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { "### leb", "`leb ` - less than or equal buffer.", "", + "### splitter (v1.1)", + "`splitter ` sets the splitter character (or text) which is used for splitting operations. This value exists once per AUTOCAL, similar to the clockspeed. By default, the splitter is set to `;`. Supports variable substitution!", + "", + "### split (v1.1)", + "`split ` will split the buffer's contents, grab the fragment with the desired index, and write its contents to the buffer.", + "", + "Example:", + "`buffer cats;and;dogs`", + "`split 3`", + "", + "-> Will buffer the value of the third fragment, being `dogs`.", + "", + "### splitcount (v1.1)", + "`splitcount` will split the buffer's contents, count the number of fragments created, and write that value to the buffer.", + "", + "Example:", + "`buffer cats;and;dogs;and;birds`", + "`splitcount`", + "", + "-> Will buffer the number of fragments, being `5`.", + "", + "### length (v1.1)", + "`length` will count the number of characters in the buffer's stored text, and write that value to the buffer.", + "", + "Example:", + "`buffer cats and dogs`", + "`lenght`", + "", + "-> Will buffer the number of characters in `cats and dogs`, being `13`.", + "", + "### first (v1.1)", + "`first ` will grab the first x characters from the buffer and write them to the buffer. This is a substring operation that always starts at the first letter.", + "", + "Example:", + "`buffer cats and dogs`", + "`first 4`", + "", + "-> Will buffer the first four characters of the buffer, `cats`.", + "", + "### last (v1.1)", + "`last ` will grab the last x characters from the buffer and write them to the buffer. This is a substring operation that always ends at the last letter.", + "", + "Example:", + "`buffer cats and dogs`", + "`last 4`", + "", + "-> Will buffer the last four characters of the buffer, `dogs`.", + "", "### send", "`send ` will send a Redstone-over-Radio signal over the supplied channel, with the signal's value being the current buffer's value. Sending repeatedly over the same channel requires waiting for a full game tick, so using `endtick` after sending is advised. Supports variable substitution!", "", @@ -412,6 +477,12 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { "", "-> Will take the signal from the RoR channel \"input\", multiply it by 100, and send that value on the channel \"output\".", "", + "### poll (v1.1)", + "`poll ` will listen to the supplied RoR channel and write the signal to the buffer. Unlike `listen`, it will only detect signals from the last tick. Supports variable substitution!", + "", + "### worldtime (v1.1)", + "`worldtime` will save the amount of ticks since world creation to the buffer. If the result is saved to a variable, it can be compared later, allowing for precise and clockspeed-agnostic timers.", + "", "## Advanced", "", "### Conditional Branches", From f8d85eca16994ba8c1fb7ff2aded4064f50a3f0d Mon Sep 17 00:00:00 2001 From: LegendaryDoge30 Date: Tue, 7 Jul 2026 17:48:18 +0200 Subject: [PATCH 064/107] cyclotron cyclotron --- .../assets/hbm/models/machines/cyclotron.obj | 8041 +++++++++++------ .../textures/models/machines/cyclotron.png | Bin 4610 -> 9213 bytes .../models/machines/cyclotron_ashes.png | Bin 1409 -> 595 bytes .../machines/cyclotron_ashes_filled.png | Bin 1352 -> 623 bytes .../models/machines/cyclotron_book.png | Bin 1262 -> 538 bytes .../models/machines/cyclotron_book_filled.png | Bin 1227 -> 557 bytes .../models/machines/cyclotron_coin.png | Bin 1235 -> 582 bytes .../models/machines/cyclotron_coin_filled.png | Bin 1332 -> 620 bytes .../models/machines/cyclotron_gavel.png | Bin 1390 -> 605 bytes .../machines/cyclotron_gavel_filled.png | Bin 1363 -> 635 bytes 10 files changed, 5209 insertions(+), 2832 deletions(-) diff --git a/src/main/resources/assets/hbm/models/machines/cyclotron.obj b/src/main/resources/assets/hbm/models/machines/cyclotron.obj index 9f42c3bd2..d98618ed9 100644 --- a/src/main/resources/assets/hbm/models/machines/cyclotron.obj +++ b/src/main/resources/assets/hbm/models/machines/cyclotron.obj @@ -1,2842 +1,5219 @@ -# Blender v2.79 (sub 0) OBJ File: 'cyclotron.blend' +# Blender 4.0.2 # www.blender.org -o B4 -v -2.375000 2.000000 -0.375000 -v -2.375000 1.000000 -0.375000 -v -2.375000 2.000000 0.375000 -v -2.375000 1.000000 0.375000 -v -2.125000 2.000000 -0.375000 -v -2.125000 1.000000 -0.375000 -v -2.125000 2.000000 0.375000 -v -2.125000 1.000000 0.375000 -vt 0.800000 0.833333 -vt 0.200000 0.166667 -vt 0.800000 0.166667 -vt 1.000000 0.833333 -vt 0.200000 0.833333 -vt 0.000000 0.166667 -vt 0.800000 0.000000 -vt 0.200000 1.000000 -vt 1.000000 0.166667 -vt 0.000000 0.833333 -vt 0.200000 0.000000 -vt 0.800000 1.000000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -s off -f 3/1/1 2/2/1 4/3/1 -f 4/3/2 7/4/2 3/1/2 -f 1/5/3 6/6/3 2/2/3 -f 2/2/4 8/7/4 4/3/4 -f 3/1/5 5/8/5 1/5/5 -f 3/1/1 1/5/1 2/2/1 -f 4/3/2 8/9/2 7/4/2 -f 1/5/3 5/10/3 6/6/3 -f 2/2/4 6/11/4 8/7/4 -f 3/1/5 7/12/5 5/8/5 -o B2 -v 0.375000 2.000000 -2.375000 -v 0.375000 1.000000 -2.375000 -v -0.375000 2.000000 -2.375000 -v -0.375000 1.000000 -2.375000 -v 0.375000 2.000000 -2.125000 -v 0.375000 1.000000 -2.125000 -v -0.375000 2.000000 -2.125000 -v -0.375000 1.000000 -2.125000 -vt 0.800000 0.833333 -vt 0.200000 0.166667 -vt 0.800000 0.166667 -vt 1.000000 0.833333 -vt 0.200000 0.833333 -vt 0.000000 0.166667 -vt 0.800000 0.000000 -vt 0.200000 1.000000 -vt 1.000000 0.166667 -vt 0.000000 0.833333 -vt 0.200000 0.000000 -vt 0.800000 1.000000 -vn 0.0000 0.0000 -1.0000 -vn -1.0000 0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -s off -f 11/13/6 10/14/6 12/15/6 -f 12/15/7 15/16/7 11/13/7 -f 9/17/8 14/18/8 10/14/8 -f 10/14/9 16/19/9 12/15/9 -f 11/13/10 13/20/10 9/17/10 -f 11/13/6 9/17/6 10/14/6 -f 12/15/7 16/21/7 15/16/7 -f 9/17/8 13/22/8 14/18/8 -f 10/14/9 14/23/9 16/19/9 -f 11/13/10 15/24/10 13/20/10 -o B3 -v 2.375000 2.000000 0.375000 -v 2.375000 1.000000 0.375000 -v 2.375000 2.000000 -0.375000 -v 2.375000 1.000000 -0.375000 -v 2.125000 2.000000 0.375000 -v 2.125000 1.000000 0.375000 -v 2.125000 2.000000 -0.375000 -v 2.125000 1.000000 -0.375000 -vt 0.799940 0.833266 -vt 0.200060 0.166733 -vt 0.799940 0.166733 -vt 0.999900 0.833266 -vt 0.200060 0.833267 -vt 0.000100 0.166733 -vt 0.799940 0.000100 -vt 0.799940 0.999900 -vt 0.200060 0.999900 -vt 0.999900 0.166733 -vt 0.000100 0.833267 -vt 0.200060 0.000100 -vn 1.0000 0.0000 0.0000 -vn -0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -s off -f 19/25/11 18/26/11 20/27/11 -f 20/27/12 23/28/12 19/25/12 -f 17/29/13 22/30/13 18/26/13 -f 18/26/14 24/31/14 20/27/14 -f 17/29/15 23/32/15 21/33/15 -f 19/25/11 17/29/11 18/26/11 -f 20/27/12 24/34/12 23/28/12 -f 17/29/13 21/35/13 22/30/13 -f 18/26/14 22/36/14 24/31/14 -f 17/29/15 19/25/15 23/32/15 -o B1 -v -0.375000 2.000000 2.375000 -v -0.375000 1.000000 2.375000 -v 0.375000 2.000000 2.375000 -v 0.375000 1.000000 2.375000 -v -0.375000 2.000000 2.125000 -v -0.375000 1.000000 2.125000 -v 0.375000 2.000000 2.125000 -v 0.375000 1.000000 2.125000 -vt 0.800000 0.833333 -vt 0.200000 0.166667 -vt 0.800000 0.166667 -vt 1.000000 0.833333 -vt 0.200000 0.833333 -vt 0.000000 0.166667 -vt 0.200000 0.000000 -vt 0.800000 0.000000 -vt 0.200000 1.000000 -vt 1.000000 0.166667 -vt 0.000000 0.833333 -vt 0.800000 1.000000 -vn 0.0000 0.0000 1.0000 -vn 1.0000 0.0000 0.0000 -vn -1.0000 0.0000 -0.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 -0.0000 -s off -f 27/37/16 26/38/16 28/39/16 -f 28/39/17 31/40/17 27/37/17 -f 25/41/18 30/42/18 26/38/18 -f 28/39/19 30/43/19 32/44/19 -f 27/37/20 29/45/20 25/41/20 -f 27/37/16 25/41/16 26/38/16 -f 28/39/17 32/46/17 31/40/17 -f 25/41/18 29/47/18 30/42/18 -f 28/39/19 26/38/19 30/43/19 -f 27/37/20 31/48/20 29/45/20 +mtllib cyclotron.mtl o Body -v -2.500000 0.000000 2.500000 -v -2.500000 0.500000 2.500000 -v -2.500000 0.000000 -2.500000 -v -2.500000 0.500000 -2.500000 -v 2.500000 0.000000 2.500000 -v 2.500000 0.500000 2.500000 -v 2.500000 0.000000 -2.500000 -v 2.500000 0.500000 -2.500000 -v -0.000000 2.500000 -2.500000 -v -0.000000 3.000000 -2.500000 -v 0.956708 2.500000 -2.309699 -v 0.956708 3.000000 -2.309699 -v 1.767767 2.500000 -1.767767 -v 1.767767 3.000000 -1.767767 -v 2.309699 2.500000 -0.956709 -v 2.309699 3.000000 -0.956709 -v 2.500000 2.500000 0.000000 -v 2.500000 3.000000 0.000000 -v 2.309699 2.500000 0.956709 -v 2.309699 3.000000 0.956709 -v 1.767767 2.500000 1.767767 -v 1.767767 3.000000 1.767767 -v 0.956708 2.500000 2.309699 -v 0.956708 3.000000 2.309699 -v 0.000000 2.500000 2.500000 -v 0.000000 3.000000 2.500000 -v -0.956708 2.500000 2.309699 -v -0.956708 3.000000 2.309699 -v -1.767767 2.500000 1.767768 -v -1.767767 3.000000 1.767768 -v -2.309699 2.500000 0.956709 -v -2.309699 3.000000 0.956709 -v -2.500000 2.500000 -0.000000 -v -2.500000 3.000000 -0.000000 -v -2.309699 2.500000 -0.956709 -v -2.309699 3.000000 -0.956709 -v -1.767766 2.500000 -1.767768 -v -1.767766 3.000000 -1.767768 -v -0.956708 2.500000 -2.309699 -v -0.956708 3.000000 -2.309699 -v -0.000000 2.500000 -2.250000 -v 0.861038 2.500000 -2.078729 -v 1.590990 2.500000 -1.590990 -v 2.078729 2.500000 -0.861038 -v 2.250000 2.500000 0.000000 -v 2.078729 2.500000 0.861038 -v 1.590990 2.500000 1.590990 -v 0.861038 2.500000 2.078729 -v 0.000000 2.500000 2.250000 -v -0.861037 2.500000 2.078729 -v -1.590990 2.500000 1.590991 -v -2.078729 2.500000 0.861038 -v -2.250000 2.500000 -0.000000 -v -2.078729 2.500000 -0.861038 -v -1.590990 2.500000 -1.590991 -v -0.861037 2.500000 -2.078729 -v 0.765367 3.000000 -1.847759 -v -0.000000 3.000000 -2.000000 -v 1.414213 3.000000 -1.414214 -v 1.847759 3.000000 -0.765367 -v 2.000000 3.000000 0.000000 -v 1.847759 3.000000 0.765367 -v 1.414213 3.000000 1.414213 -v 0.765367 3.000000 1.847759 -v 0.000000 3.000000 2.000000 -v -0.765367 3.000000 1.847759 -v -1.414213 3.000000 1.414214 -v -1.847759 3.000000 0.765367 -v -2.000000 3.000000 -0.000000 -v -1.847759 3.000000 -0.765367 -v -1.414213 3.000000 -1.414214 -v -0.765366 3.000000 -1.847759 -v 0.765367 2.750000 -1.847759 -v -0.000000 2.750000 -2.000000 -v 1.414213 2.750000 -1.414214 -v 1.847759 2.750000 -0.765367 -v 2.000000 2.750000 0.000000 -v 1.847759 2.750000 0.765367 -v 1.414213 2.750000 1.414213 -v 0.765367 2.750000 1.847759 -v 0.000000 2.750000 2.000000 -v -0.765367 2.750000 1.847759 -v -1.414213 2.750000 1.414214 -v -1.847759 2.750000 0.765367 -v -2.000000 2.750000 -0.000000 -v -1.847759 2.750000 -0.765367 -v -1.414213 2.750000 -1.414214 -v -0.765366 2.750000 -1.847759 -v -0.000000 3.750000 -0.250000 -v 0.176777 3.750000 -0.176777 -v 0.000000 2.750000 -0.500000 -v 0.000000 3.500000 -0.500000 -v 0.353553 2.750000 -0.353553 -v 0.353553 3.500000 -0.353553 -v 0.500000 2.750000 0.000000 -v 0.500000 3.500000 0.000000 -v 0.353553 2.750000 0.353553 -v 0.353553 3.500000 0.353553 -v -0.000000 2.750000 0.500000 -v -0.000000 3.500000 0.500000 -v -0.353553 2.750000 0.353553 -v -0.353553 3.500000 0.353553 -v -0.500000 2.750000 -0.000000 -v -0.500000 3.500000 -0.000000 -v -0.353553 2.750000 -0.353553 -v -0.353553 3.500000 -0.353553 -v 0.250000 3.750000 0.000000 -v 0.176777 3.750000 0.176777 -v -0.000000 3.750000 0.250000 -v -0.176777 3.750000 0.176777 -v -0.250000 3.750000 -0.000000 -v -0.176777 3.750000 -0.176777 -v 1.545028 1.625000 1.721805 -v 1.589740 1.625000 1.704017 -v 1.499066 0.500000 1.675843 -v 1.499066 1.500000 1.675843 -v 1.588490 0.500000 1.640267 -v 1.588490 1.500000 1.640267 -v 1.679379 0.500000 1.679379 -v 1.679379 1.500000 1.679379 -v 1.718490 0.500000 1.770267 -v 1.718490 1.500000 1.770267 -v 1.682914 0.500000 1.859691 -v 1.682914 1.500000 1.859691 -v 1.593490 0.500000 1.895267 -v 1.593490 1.500000 1.895267 -v 1.502602 0.500000 1.856155 -v 1.502602 1.500000 1.856155 -v 1.463490 0.500000 1.765267 -v 1.463490 1.500000 1.765267 -v 1.635185 1.625000 1.723573 -v 1.654740 1.625000 1.769017 -v 1.636952 1.625000 1.813729 -v 1.592240 1.625000 1.831517 -v 1.546796 1.625000 1.811961 -v 1.527241 1.625000 1.766517 -v 1.721805 1.625000 1.545028 -v 1.766517 1.625000 1.527240 -v 1.675843 0.500000 1.499066 -v 1.675843 1.500000 1.499066 -v 1.765267 0.500000 1.463490 -v 1.765267 1.500000 1.463490 -v 1.856155 0.500000 1.502602 -v 1.856155 1.500000 1.502602 -v 1.895267 0.500000 1.593490 -v 1.895267 1.500000 1.593490 -v 1.859691 0.500000 1.682914 -v 1.859691 1.500000 1.682914 -v 1.770267 0.500000 1.718490 -v 1.770267 1.500000 1.718490 -v 1.679379 0.500000 1.679379 -v 1.679379 1.500000 1.679379 -v 1.640267 0.500000 1.588490 -v 1.640267 1.500000 1.588490 -v 1.811961 1.625000 1.546796 -v 1.831517 1.625000 1.592240 -v 1.813729 1.625000 1.636952 -v 1.769017 1.625000 1.654740 -v 1.723573 1.625000 1.635184 -v 1.704017 1.625000 1.589740 -v 1.477544 1.734375 1.616048 -v 1.477544 1.765625 1.616048 -v 1.616047 1.765625 1.477545 -v 1.458407 1.718750 1.635185 -v 1.458407 1.781250 1.635185 -v 1.439270 1.765625 1.654321 -v 1.439270 1.734375 1.654321 -v 1.616047 1.734375 1.477545 -v 1.635184 1.718750 1.458408 -v 1.654321 1.734375 1.439271 -v 1.654321 1.765625 1.439271 -v 1.635184 1.781250 1.458408 -v 1.582902 1.625000 1.797952 -v 1.560805 1.625000 1.775855 -v 1.568893 1.625000 1.745670 -v 1.599078 1.625000 1.737582 -v 1.621175 1.625000 1.759679 -v 1.613087 1.625000 1.789864 -v 1.569580 1.695312 1.784631 -v 1.550443 1.679688 1.765494 -v 1.560011 1.671875 1.736789 -v 1.588717 1.679688 1.727221 -v 1.607853 1.695312 1.746357 -v 1.598285 1.703125 1.775062 -v 1.679378 1.781250 1.502602 -v 1.698515 1.765625 1.483466 -v 1.698515 1.734375 1.483466 -v 1.679378 1.718750 1.502602 -v 1.660242 1.734375 1.521739 -v 1.660242 1.765625 1.521739 -v 1.734621 1.760317 1.557845 -v 1.748233 1.746785 1.533184 -v 1.737185 1.719722 1.522135 -v 1.712524 1.706190 1.535748 -v 1.698911 1.719722 1.560409 -v 1.709960 1.746785 1.571457 -v 1.775061 1.703125 1.598285 -v 1.784630 1.695312 1.569581 -v 1.765493 1.679688 1.550444 -v 1.736788 1.671875 1.560012 -v 1.727220 1.679688 1.588717 -v 1.746356 1.695312 1.607854 -v 1.789864 1.625000 1.613088 -v 1.797952 1.625000 1.582902 -v 1.775855 1.625000 1.560805 -v 1.745669 1.625000 1.568894 -v 1.737581 1.625000 1.599079 -v 1.759678 1.625000 1.621176 -v 1.533183 1.746785 1.748234 -v 1.522135 1.719722 1.737185 -v 1.535747 1.706190 1.712525 -v 1.560408 1.719722 1.698912 -v 1.571457 1.746785 1.709961 -v 1.557844 1.760317 1.734622 -v 1.483465 1.765625 1.698516 -v 1.483465 1.734375 1.698516 -v 1.502602 1.718750 1.679379 -v 1.521738 1.734375 1.660242 -v 1.521738 1.765625 1.660242 -v 1.502602 1.781250 1.679379 -v -1.944544 1.500000 1.414214 -v -1.944544 0.500000 1.414214 -v -1.414214 1.500000 1.944544 -v -1.414214 0.500000 1.944544 -v -1.767767 1.750000 1.237437 -v -1.767767 0.500000 1.237437 -v -1.237437 1.750000 1.767767 -v -1.237437 0.500000 1.767767 -v -0.861037 2.500000 -2.078729 -v -1.590990 2.500000 -1.590991 -v -2.078729 2.500000 -0.861038 -v -2.250000 2.500000 -0.000000 -v -2.078729 2.500000 0.861038 -v -1.590990 2.500000 1.590991 -v -0.861037 2.500000 2.078729 -v 0.000000 2.500000 2.250000 -v 0.861038 2.500000 2.078729 -v 1.590990 2.500000 1.590990 -v 2.078729 2.500000 0.861038 -v 2.250000 2.500000 0.000000 -v 2.078729 2.500000 -0.861038 -v 1.590990 2.500000 -1.590990 -v 0.861038 2.500000 -2.078729 -v -0.000000 2.500000 -2.250000 -v -0.176777 3.750000 -0.176777 -v -0.250000 3.750000 -0.000000 -v -0.176777 3.750000 0.176777 -v -0.000000 3.750000 0.250000 -v 0.176777 3.750000 0.176777 -v 0.250000 3.750000 0.000000 -v -0.353553 3.500000 -0.353553 -v -0.500000 3.500000 -0.000000 -v -0.353553 3.500000 0.353553 -v -0.000000 3.500000 0.500000 -v 0.353553 3.500000 0.353553 -v 0.500000 3.500000 0.000000 -v 0.353553 3.500000 -0.353553 -v 0.000000 3.500000 -0.500000 -v 0.176777 3.750000 -0.176777 -v -0.000000 3.750000 -0.250000 -v 0.499999 3.750000 -0.625000 -v 0.588388 3.750000 -0.588388 -v 0.624999 3.750000 -0.500000 -v 0.588388 3.750000 -0.411612 -v 0.499999 3.750000 -0.375000 -v 0.411611 3.750000 -0.411612 -v 0.374999 3.750000 -0.500000 -v 0.411611 3.750000 -0.588388 -v -0.500001 3.750000 -0.625000 -v -0.411612 3.750000 -0.588388 -v -0.375001 3.750000 -0.500000 -v -0.411612 3.750000 -0.411612 -v -0.500001 3.750000 -0.375000 -v -0.588389 3.750000 -0.411612 -v -0.625001 3.750000 -0.500000 -v -0.588389 3.750000 -0.588388 -v 0.499999 3.750000 0.375000 -v 0.588388 3.750000 0.411612 -v 0.624999 3.750000 0.500000 -v 0.588388 3.750000 0.588388 -v 0.499999 3.750000 0.625000 -v 0.411611 3.750000 0.588388 -v 0.374999 3.750000 0.500000 -v 0.411611 3.750000 0.411612 -v -0.500001 3.750000 0.375000 -v -0.411612 3.750000 0.411612 -v -0.375001 3.750000 0.500000 -v -0.411612 3.750000 0.588388 -v -0.500001 3.750000 0.625000 -v -0.588389 3.750000 0.588388 -v -0.625001 3.750000 0.500000 -v -0.588389 3.750000 0.411612 -v 0.499999 3.250000 -0.375000 -v 0.374999 3.250000 -0.500000 -v -0.375001 3.250000 -0.500000 -v -0.500001 3.250000 -0.375000 -v 0.499999 3.250000 0.375000 -v 0.374999 3.250000 0.500000 -v -0.500001 3.250000 0.375000 -v -0.375001 3.250000 0.500000 -v 0.499999 3.500000 -0.375000 -v 0.374999 3.500000 -0.500000 -v -0.375001 3.500000 -0.500000 -v -0.500001 3.500000 -0.375000 -v 0.499999 3.500000 0.375000 -v 0.374999 3.500000 0.500000 -v -0.500001 3.500000 0.375000 -v -0.375001 3.500000 0.500000 -v 2.500000 0.500000 -1.500000 -v 2.500000 0.500000 -0.500000 -v 2.500000 0.500000 0.500000 -v 2.500000 0.500000 1.500000 -v -2.500000 0.500000 1.500000 -v -2.500000 0.500000 0.500000 -v -2.500000 0.500000 -0.500000 -v -2.500000 0.500000 -1.500000 -v -1.500000 0.500000 -2.500000 -v -0.500000 0.500000 -2.500000 -v 0.500000 0.500000 -2.500000 -v 1.500000 0.500000 -2.500000 -v 1.500000 0.500000 2.500000 -v 0.500000 0.500000 2.500000 -v -0.500000 0.500000 2.500000 -v -1.500000 0.500000 2.500000 -v 2.500000 0.750000 -1.500000 -v 2.500000 0.750000 -0.500000 -v 2.500000 0.750000 0.500000 -v 2.500000 0.750000 1.500000 -v -2.500000 0.750000 1.500000 -v -2.500000 0.750000 0.500000 -v -2.500000 0.750000 -0.500000 -v -2.500000 0.750000 -1.500000 -v -1.500000 0.750000 -2.500000 -v -0.500000 0.750000 -2.500000 -v 0.500000 0.750000 -2.500000 -v 1.500000 0.750000 -2.500000 -v 1.500000 0.750000 2.500000 -v 0.500000 0.750000 2.500000 -v -0.500000 0.750000 2.500000 -v -1.500000 0.750000 2.500000 -v 2.500000 1.000000 -1.250000 -v 2.500000 1.000000 -0.750000 -v 2.500000 1.000000 0.750000 -v 2.500000 1.000000 1.250000 -v -2.500000 1.000000 1.250000 -v -2.500000 1.000000 0.750000 -v -2.500000 1.000000 -0.750000 -v -2.500000 1.000000 -1.250000 -v -1.250000 1.000000 -2.500000 -v -0.750000 1.000000 -2.500000 -v 0.750000 1.000000 -2.500000 -v 1.250000 1.000000 -2.500000 -v 1.250000 1.000000 2.500000 -v 0.750000 1.000000 2.500000 -v -0.750000 1.000000 2.500000 -v -1.250000 1.000000 2.500000 -v -1.500000 0.500000 -2.250000 -v -0.500000 0.500000 -2.250000 -v 0.500000 0.500000 -2.250000 -v 1.500000 0.500000 -2.250000 -v -1.250000 0.750000 -2.250000 -v -0.750000 0.750000 -2.250000 -v 0.750000 0.750000 -2.250000 -v 1.250000 0.750000 -2.250000 -v -1.500000 0.500000 2.250000 -v -0.500000 0.500000 2.250000 -v 0.500000 0.500000 2.250000 -v 1.500000 0.500000 2.250000 -v -1.250000 0.750000 2.250000 -v -0.750000 0.750000 2.250000 -v 0.750000 0.750000 2.250000 -v 1.250000 0.750000 2.250000 -v -2.250000 0.500000 1.500000 -v -2.250000 0.500000 0.500000 -v -2.250000 0.500000 -0.500000 -v -2.250000 0.500000 -1.500000 -v -2.250000 0.750000 1.250000 -v -2.250000 0.750000 0.750000 -v -2.250000 0.750000 -0.750000 -v -2.250000 0.750000 -1.250000 -v 2.250000 0.500000 1.500000 -v 2.250000 0.500000 0.500000 -v 2.250000 0.500000 -0.500000 -v 2.250000 0.500000 -1.500000 +v -1.590990 1.000000 -1.590990 +v -1.590990 2.250000 -1.590990 +v -2.078729 1.000000 -0.861038 +v -2.078729 2.250000 -0.861038 +v -2.250000 1.000000 0.000000 +v -2.250000 2.250000 0.000000 +v -2.078729 1.000000 0.861038 +v -2.078729 2.250000 0.861038 +v -1.590990 1.000000 1.590990 +v -1.590990 2.250000 1.590990 +v -0.861038 1.000000 2.078729 +v -0.861038 2.250000 2.078729 +v 0.000000 1.000000 2.250000 +v 0.000000 2.250000 2.250000 +v 0.861038 1.000000 2.078729 +v 0.861038 2.250000 2.078729 +v 1.590990 1.000000 1.590990 +v 1.590990 2.250000 1.590990 +v 2.078729 1.000000 0.861038 +v 2.078729 2.250000 0.861038 +v 2.250000 1.000000 0.000000 +v 2.250000 2.250000 0.000000 +v 2.078729 1.000000 -0.861038 +v 2.078729 2.250000 -0.861038 +v 1.590990 1.000000 -1.590990 +v 1.590990 2.250000 -1.590990 +v -0.861038 2.250000 -2.078729 +v -0.861038 1.000000 -2.078729 +v 0.861038 1.000000 -2.078729 +v 0.861038 2.250000 -2.078729 +v 0.000000 2.250000 -2.250000 +v 0.000000 1.000000 -2.250000 +v 0.000000 0.250000 -1.931378 +v 0.000000 0.562500 -2.250000 +v 0.000000 3.000000 -1.556378 +v 0.000000 2.687500 -2.250000 +v 0.739106 0.250000 -1.784360 +v 0.861038 0.562500 -2.078729 +v 0.595600 3.000000 -1.437906 +v 0.861038 2.687500 -2.078729 +v 1.365690 0.250000 -1.365690 +v 1.590990 0.562500 -1.590990 +v 1.100525 3.000000 -1.100525 +v 1.590990 2.687500 -1.590990 +v 1.784360 0.250000 -0.739106 +v 2.078729 0.562500 -0.861038 +v 1.437906 3.000000 -0.595600 +v 2.078729 2.687500 -0.861038 +v 1.931378 0.250000 0.000000 +v 2.250000 0.562500 0.000000 +v 1.556378 3.000000 0.000000 +v 2.250000 2.687500 0.000000 +v 1.784360 0.250000 0.739106 +v 2.078729 0.562500 0.861038 +v 1.437906 3.000000 0.595600 +v 2.078729 2.687500 0.861038 +v 1.365690 0.250000 1.365690 +v 1.590990 0.562500 1.590990 +v 1.100525 3.000000 1.100525 +v 1.590990 2.687500 1.590990 +v 0.739106 0.250000 1.784360 +v 0.861038 0.562500 2.078729 +v 0.595600 3.000000 1.437906 +v 0.861038 2.687500 2.078729 +v 0.000000 0.250000 1.931378 +v 0.000000 0.562500 2.250000 +v -0.000000 3.000000 1.556378 +v 0.000000 2.687500 2.250000 +v -0.739106 0.250000 1.784360 +v -0.861038 0.562500 2.078729 +v -0.595600 3.000000 1.437906 +v -0.861038 2.687500 2.078729 +v -1.365690 0.250000 1.365690 +v -1.590990 0.562500 1.590990 +v -1.100525 3.000000 1.100525 +v -1.590990 2.687500 1.590990 +v -1.784360 0.250000 0.739106 +v -2.078729 0.562500 0.861038 +v -1.437906 3.000000 0.595600 +v -2.078729 2.687500 0.861038 +v -1.931378 0.250000 0.000000 +v -2.250000 0.562500 0.000000 +v -1.556378 3.000000 -0.000000 +v -2.250000 2.687500 0.000000 +v -1.784360 0.250000 -0.739106 +v -2.078729 0.562500 -0.861038 +v -1.437906 3.000000 -0.595600 +v -2.078729 2.687500 -0.861038 +v -1.365690 0.250000 -1.365690 +v -1.590990 0.562500 -1.590990 +v -1.100525 3.000000 -1.100525 +v -1.590990 2.687500 -1.590990 +v -0.739106 0.250000 -1.784360 +v -0.861038 0.562500 -2.078729 +v -0.595600 3.000000 -1.437906 +v -0.861038 2.687500 -2.078729 +v -1.458408 2.062500 -1.458408 +v -1.458408 1.187500 -1.458408 +v -1.905502 2.062500 -0.789285 +v -1.905502 1.187500 -0.789285 +v -2.062500 2.062500 0.000000 +v -2.062500 1.187500 0.000000 +v -1.905502 2.062500 0.789285 +v -1.905502 1.187500 0.789285 +v -1.458408 2.062500 1.458408 +v -1.458408 1.187500 1.458408 +v -0.789285 2.062500 1.905502 +v -0.789285 1.187500 1.905502 +v 0.000000 2.062500 2.062500 +v 0.000000 1.187500 2.062500 +v 0.789285 2.062500 1.905502 +v 0.789285 1.187500 1.905502 +v 1.458408 2.062500 1.458408 +v 1.458408 1.187500 1.458408 +v 1.905502 2.062500 0.789285 +v 1.905502 1.187500 0.789285 +v 2.062500 2.062500 0.000000 +v 2.062500 1.187500 0.000000 +v 1.905502 2.062500 -0.789285 +v 1.905502 1.187500 -0.789285 +v 1.458408 2.062500 -1.458408 +v 1.458408 1.187500 -1.458408 +v -0.789285 1.187500 -1.905502 +v -0.789285 2.062500 -1.905502 +v 0.789285 2.062500 -1.905502 +v 0.789285 1.187500 -1.905502 +v 0.000000 1.187500 -2.062500 +v 0.000000 2.062500 -2.062500 +v 0.000000 3.000000 -1.931378 +v 0.739106 3.000000 -1.784360 +v 1.365690 3.000000 -1.365690 +v 1.784360 3.000000 -0.739106 +v 1.931378 3.000000 0.000000 +v 1.784360 3.000000 0.739106 +v 1.365690 3.000000 1.365690 +v 0.739106 3.000000 1.784360 +v 0.000000 3.000000 1.931378 +v -0.739106 3.000000 1.784360 +v -1.365690 3.000000 1.365690 +v -1.784360 3.000000 0.739106 +v -1.931378 3.000000 0.000000 +v -1.784360 3.000000 -0.739106 +v -1.365690 3.000000 -1.365690 +v -0.739106 3.000000 -1.784360 +v 0.000000 2.750000 -1.556378 +v 0.595600 2.750000 -1.437906 +v 1.100525 2.750000 -1.100525 +v 1.437906 2.750000 -0.595600 +v 1.556378 2.750000 0.000000 +v 1.437906 2.750000 0.595600 +v 1.100525 2.750000 1.100525 +v 0.595600 2.750000 1.437906 +v -0.000000 2.750000 1.556378 +v -0.595600 2.750000 1.437906 +v -1.100525 2.750000 1.100525 +v -1.437906 2.750000 0.595600 +v -1.556378 2.750000 -0.000000 +v -1.437906 2.750000 -0.595600 +v -1.100525 2.750000 -1.100525 +v -0.595600 2.750000 -1.437906 +v -0.000000 2.750000 0.000000 +v 0.015239 2.750000 -0.749845 +v 0.015239 3.000000 -0.749845 +v 0.388120 2.750000 -0.641765 +v 0.388120 3.000000 -0.641765 +v 0.657005 2.750000 -0.361725 +v 0.657005 3.000000 -0.361725 +v 0.749845 2.750000 0.015239 +v 0.749845 3.000000 0.015239 +v 0.641765 2.750000 0.388120 +v 0.641765 3.000000 0.388120 +v 0.361725 2.750000 0.657005 +v 0.361725 3.000000 0.657005 +v -0.015239 2.750000 0.749845 +v -0.015239 3.000000 0.749845 +v -0.388120 2.750000 0.641765 +v -0.388120 3.000000 0.641765 +v -0.657005 2.750000 0.361725 +v -0.657005 3.000000 0.361725 +v -0.749845 2.750000 -0.015239 +v -0.749845 3.000000 -0.015239 +v -0.641765 2.750000 -0.388120 +v -0.641765 3.000000 -0.388120 +v -0.361725 2.750000 -0.657005 +v -0.361725 3.000000 -0.657005 +v -0.789284 1.312500 1.905502 +v -0.394642 1.312500 1.984001 +v -1.458407 1.312500 1.458408 +v -0.861037 1.312500 2.078729 +v -0.430518 1.312500 2.164364 +v -0.861037 1.937500 2.078729 +v -1.590990 1.312500 1.590991 +v -1.590990 1.937500 1.590991 +v -2.078729 1.312500 0.861038 +v -2.078729 1.937500 0.861038 +v -1.905501 1.312500 0.789285 +v -2.164364 1.312500 0.430519 +v -1.984001 1.312500 0.394643 +v -2.164364 1.937500 0.430519 +v -1.984001 1.937500 0.394643 +v -1.905501 1.937500 0.789285 +v -1.458407 1.937500 1.458408 +v -0.789284 1.937500 1.905502 +v -0.394642 1.937500 1.984001 +v -0.430518 1.937500 2.164364 +v 1.905502 1.312500 0.789284 +v 1.984001 1.312500 0.394642 +v 1.458408 1.312500 1.458407 +v 2.078729 1.312500 0.861037 +v 2.164364 1.312500 0.430518 +v 2.078729 1.937500 0.861037 +v 1.590991 1.312500 1.590990 +v 1.590991 1.937500 1.590990 +v 0.861038 1.312500 2.078729 +v 0.861038 1.937500 2.078729 +v 0.789285 1.312500 1.905501 +v 0.430519 1.312500 2.164364 +v 0.394643 1.312500 1.984001 +v 0.430519 1.937500 2.164364 +v 0.394643 1.937500 1.984001 +v 0.789285 1.937500 1.905501 +v 1.458408 1.937500 1.458407 +v 1.905502 1.937500 0.789284 +v 1.984001 1.937500 0.394642 +v 2.164364 1.937500 0.430518 +v 0.789284 1.312500 -1.905502 +v 0.394642 1.312500 -1.984001 +v 1.458407 1.312500 -1.458408 +v 0.861037 1.312500 -2.078729 +v 0.430518 1.312500 -2.164365 +v 0.861037 1.937500 -2.078729 +v 1.590990 1.312500 -1.590991 +v 1.590990 1.937500 -1.590991 +v 2.078729 1.312500 -0.861039 +v 2.078729 1.937500 -0.861039 +v 1.905501 1.312500 -0.789285 +v 2.164364 1.312500 -0.430520 +v 1.984001 1.312500 -0.394643 +v 2.164364 1.937500 -0.430520 +v 1.984001 1.937500 -0.394643 +v 1.905501 1.937500 -0.789285 +v 1.458407 1.937500 -1.458408 +v 0.789284 1.937500 -1.905502 +v 0.394642 1.937500 -1.984001 +v 0.430518 1.937500 -2.164365 +v -1.905502 1.312500 -0.789284 +v -1.984001 1.312500 -0.394642 +v -1.458408 1.312500 -1.458407 +v -2.078729 1.312500 -0.861037 +v -2.164365 1.312500 -0.430518 +v -2.078729 1.937500 -0.861037 +v -1.590991 1.312500 -1.590989 +v -1.590991 1.937500 -1.590989 +v -0.861039 1.312500 -2.078729 +v -0.861039 1.937500 -2.078729 +v -0.789285 1.312500 -1.905501 +v -0.430520 1.312500 -2.164364 +v -0.394643 1.312500 -1.984001 +v -0.430520 1.937500 -2.164364 +v -0.394643 1.937500 -1.984001 +v -0.789285 1.937500 -1.905501 +v -1.458408 1.937500 -1.458407 +v -1.905502 1.937500 -0.789284 +v -1.984001 1.937500 -0.394642 +v -2.164365 1.937500 -0.430518 +v -1.500000 0.000000 2.500000 +v -2.500000 0.000000 1.500000 +v -2.095803 0.250000 1.332576 +v -1.332576 0.250000 2.095803 +v -2.500000 0.000000 -1.500000 +v -1.500000 0.000000 -2.500000 +v -1.332576 0.250000 -2.095803 +v -2.095803 0.250000 -1.332576 +v 2.500000 0.000000 1.500000 +v 1.500000 0.000000 2.500000 +v 1.332576 0.250000 2.095803 +v 2.095803 0.250000 1.332576 +v 1.500000 0.000000 -2.500000 +v 2.500000 0.000000 -1.500000 +v 2.095803 0.250000 -1.332576 +v 1.332576 0.250000 -2.095803 +v -1.500000 0.250000 2.500000 +v -2.500000 0.250000 1.500000 +v -2.500000 0.250000 -1.500000 +v -1.500000 0.250000 -2.500000 +v 1.500000 0.250000 -2.500000 +v 2.500000 0.250000 -1.500000 +v 2.500000 0.250000 1.500000 +v 1.500000 0.250000 2.500000 +v -1.332576 0.375000 1.970803 +v -1.970803 0.375000 1.332576 +v -1.970803 0.375000 -1.332576 +v -1.332576 0.375000 -1.970803 +v 1.332576 0.375000 -1.970803 +v 1.970803 0.375000 -1.332576 +v 1.970803 0.375000 1.332576 +v 1.332576 0.375000 1.970803 +v 0.516204 2.739277 -2.274769 +v 0.822699 2.739277 -2.213804 +v 0.440953 3.125000 -1.896458 +v 0.747449 3.125000 -1.835492 +v 0.335645 2.875000 -1.367036 +v 0.642140 2.875000 -1.306071 +v 0.798313 1.375000 -2.091206 +v 0.491818 1.375000 -2.152171 +v 0.491818 2.687500 -2.152171 +v 0.798313 2.687500 -2.091206 +v 0.430852 3.000000 -1.845676 +v 0.737347 3.000000 -1.784710 +v 0.360031 3.000000 -1.489634 +v 0.666526 3.000000 -1.428669 +v 0.360031 2.750000 -1.489634 +v 0.666526 2.750000 -1.428669 +v 0.335645 3.000000 -1.367036 +v 0.360031 3.125000 -1.489634 +v 0.666526 3.125000 -1.428669 +v 0.642140 3.000000 -1.306071 +v 0.822699 1.500000 -2.213804 +v 0.516204 1.500000 -2.274769 +v 0.188284 2.875000 -0.626201 +v 0.506906 2.875000 -0.626201 +v 0.188284 2.750000 -0.626201 +v 0.506906 2.750000 -0.626201 +v 0.188284 2.875000 -0.313701 +v 0.188284 2.750000 -0.313701 +v 0.506906 2.750000 -0.313701 +v 0.506906 2.875000 -0.313701 +v -0.516204 2.739277 2.274769 +v -0.822700 2.739277 2.213804 +v -0.440953 3.125000 1.896457 +v -0.747449 3.125000 1.835492 +v -0.335645 2.875000 1.367036 +v -0.642140 2.875000 1.306071 +v -0.798313 1.375000 2.091206 +v -0.491818 1.375000 2.152171 +v -0.491818 2.687500 2.152171 +v -0.798313 2.687500 2.091206 +v -0.430852 3.000000 1.845676 +v -0.737348 3.000000 1.784710 +v -0.360031 3.000000 1.489634 +v -0.666527 3.000000 1.428669 +v -0.360031 2.750000 1.489634 +v -0.666527 2.750000 1.428669 +v -0.335645 3.000000 1.367036 +v -0.360031 3.125000 1.489634 +v -0.666527 3.125000 1.428669 +v -0.642140 3.000000 1.306071 +v -0.822700 1.500000 2.213804 +v -0.516204 1.500000 2.274769 +v -0.188284 2.875000 0.626201 +v -0.506906 2.875000 0.626201 +v -0.188284 2.750000 0.626201 +v -0.506906 2.750000 0.626201 +v -0.188284 2.875000 0.313701 +v -0.188284 2.750000 0.313701 +v -0.506906 2.750000 0.313701 +v -0.506906 2.875000 0.313701 +v 2.274769 2.739277 0.516204 +v 2.213804 2.739277 0.822700 +v 1.896457 3.125000 0.440953 +v 1.835492 3.125000 0.747449 +v 1.367036 2.875000 0.335645 +v 1.306071 2.875000 0.642141 +v 2.091206 1.375000 0.798313 +v 2.152171 1.375000 0.491818 +v 2.152171 2.687500 0.491818 +v 2.091206 2.687500 0.798313 +v 1.845676 3.000000 0.430852 +v 1.784710 3.000000 0.737348 +v 1.489634 3.000000 0.360031 +v 1.428669 3.000000 0.666527 +v 1.489634 2.750000 0.360031 +v 1.428669 2.750000 0.666527 +v 1.367036 3.000000 0.335645 +v 1.489634 3.125000 0.360031 +v 1.428669 3.125000 0.666527 +v 1.306071 3.000000 0.642141 +v 2.213804 1.500000 0.822700 +v 2.274769 1.500000 0.516204 +v 0.626201 2.875000 0.188284 +v 0.626201 2.875000 0.506906 +v 0.626201 2.750000 0.188284 +v 0.626201 2.750000 0.506906 +v 0.313701 2.875000 0.188284 +v 0.313701 2.750000 0.188284 +v 0.313701 2.750000 0.506906 +v 0.313701 2.875000 0.506906 +v -2.274769 2.739277 -0.516205 +v -2.213804 2.739277 -0.822700 +v -1.896457 3.125000 -0.440954 +v -1.835492 3.125000 -0.747449 +v -1.367036 2.875000 -0.335645 +v -1.306070 2.875000 -0.642141 +v -2.091205 1.375000 -0.798314 +v -2.152171 1.375000 -0.491819 +v -2.152171 2.687500 -0.491819 +v -2.091205 2.687500 -0.798314 +v -1.845675 3.000000 -0.430853 +v -1.784710 3.000000 -0.737348 +v -1.489634 3.000000 -0.360032 +v -1.428668 3.000000 -0.666527 +v -1.489634 2.750000 -0.360032 +v -1.428668 2.750000 -0.666527 +v -1.367036 3.000000 -0.335645 +v -1.489634 3.125000 -0.360032 +v -1.428668 3.125000 -0.666527 +v -1.306070 3.000000 -0.642141 +v -2.213804 1.500000 -0.822700 +v -2.274769 1.500000 -0.516205 +v -0.626201 2.875000 -0.188284 +v -0.626201 2.875000 -0.506906 +v -0.626201 2.750000 -0.188284 +v -0.626201 2.750000 -0.506906 +v -0.313701 2.875000 -0.188284 +v -0.313701 2.750000 -0.188284 +v -0.313701 2.750000 -0.506906 +v -0.313701 2.875000 -0.506906 +v 2.500000 0.250000 1.250000 +v 2.500000 0.750000 1.250000 v 2.250000 0.750000 1.250000 +v 2.500000 0.250000 0.750000 +v 2.500000 0.750000 0.750000 v 2.250000 0.750000 0.750000 +v 1.500000 0.250000 1.250000 +v 1.500000 0.250000 0.750000 +v 2.500000 0.250000 0.250000 +v 2.500000 0.750000 0.250000 +v 2.250000 0.750000 0.250000 +v 2.500000 0.250000 -0.250000 +v 2.500000 0.750000 -0.250000 +v 2.250000 0.750000 -0.250000 +v 1.500000 0.250000 0.250000 +v 1.500000 0.250000 -0.250000 +v 2.500000 0.250000 -0.750000 +v 2.500000 0.750000 -0.750000 v 2.250000 0.750000 -0.750000 +v 2.500000 0.250000 -1.250000 +v 2.500000 0.750000 -1.250000 v 2.250000 0.750000 -1.250000 -v 1.944544 1.500000 -1.414214 -v 1.944544 0.500000 -1.414214 -v 1.414214 1.500000 -1.944544 -v 1.414214 0.500000 -1.944544 -v 1.767767 1.750000 -1.237437 -v 1.767767 0.500000 -1.237437 -v 1.237437 1.750000 -1.767767 -v 1.237437 0.500000 -1.767767 -v -1.545028 1.625000 -1.721805 -v -1.589740 1.625000 -1.704017 -v -1.499066 0.500000 -1.675843 -v -1.499066 1.500000 -1.675843 -v -1.588490 0.500000 -1.640267 -v -1.588490 1.500000 -1.640267 -v -1.679379 0.500000 -1.679378 -v -1.679379 1.500000 -1.679378 -v -1.718490 0.500000 -1.770267 -v -1.718490 1.500000 -1.770267 -v -1.682914 0.500000 -1.859691 -v -1.682914 1.500000 -1.859691 -v -1.593490 0.500000 -1.895267 -v -1.593490 1.500000 -1.895267 -v -1.502602 0.500000 -1.856155 -v -1.502602 1.500000 -1.856155 -v -1.463490 0.500000 -1.765267 -v -1.463490 1.500000 -1.765267 -v -1.635185 1.625000 -1.723573 -v -1.654740 1.625000 -1.769017 -v -1.636952 1.625000 -1.813729 -v -1.592240 1.625000 -1.831517 -v -1.546796 1.625000 -1.811961 -v -1.527241 1.625000 -1.766517 -v -1.721805 1.625000 -1.545028 -v -1.766517 1.625000 -1.527240 -v -1.675843 0.500000 -1.499066 -v -1.675843 1.500000 -1.499066 -v -1.765267 0.500000 -1.463490 -v -1.765267 1.500000 -1.463490 -v -1.856155 0.500000 -1.502602 -v -1.856155 1.500000 -1.502602 -v -1.895267 0.500000 -1.593490 -v -1.895267 1.500000 -1.593490 -v -1.859691 0.500000 -1.682914 -v -1.859691 1.500000 -1.682914 -v -1.770267 0.500000 -1.718490 -v -1.770267 1.500000 -1.718490 -v -1.679379 0.500000 -1.679378 -v -1.679379 1.500000 -1.679378 -v -1.640267 0.500000 -1.588490 -v -1.640267 1.500000 -1.588490 -v -1.811961 1.625000 -1.546796 -v -1.831517 1.625000 -1.592240 -v -1.813729 1.625000 -1.636952 -v -1.769017 1.625000 -1.654740 -v -1.723573 1.625000 -1.635184 -v -1.704017 1.625000 -1.589740 -v -1.477544 1.734375 -1.616048 -v -1.477544 1.765625 -1.616048 -v -1.616047 1.765625 -1.477545 -v -1.458407 1.718750 -1.635185 -v -1.458407 1.781250 -1.635185 -v -1.439270 1.765625 -1.654321 -v -1.439270 1.734375 -1.654321 -v -1.616047 1.734375 -1.477545 -v -1.635184 1.718750 -1.458408 -v -1.654321 1.734375 -1.439271 -v -1.654321 1.765625 -1.439271 -v -1.635184 1.781250 -1.458408 -v -1.582902 1.625000 -1.797952 -v -1.560805 1.625000 -1.775855 -v -1.568893 1.625000 -1.745670 -v -1.599078 1.625000 -1.737582 -v -1.621175 1.625000 -1.759679 -v -1.613087 1.625000 -1.789864 -v -1.569580 1.695312 -1.784631 -v -1.550443 1.679688 -1.765494 -v -1.560011 1.671875 -1.736789 -v -1.588717 1.679688 -1.727221 -v -1.607853 1.695312 -1.746357 -v -1.598285 1.703125 -1.775062 -v -1.679378 1.781250 -1.502602 -v -1.698515 1.765625 -1.483465 -v -1.698515 1.734375 -1.483465 -v -1.679378 1.718750 -1.502602 -v -1.660242 1.734375 -1.521739 -v -1.660242 1.765625 -1.521739 -v -1.734621 1.760317 -1.557845 -v -1.748233 1.746785 -1.533184 -v -1.737185 1.719722 -1.522135 -v -1.712524 1.706190 -1.535748 -v -1.698911 1.719722 -1.560409 -v -1.709960 1.746785 -1.571457 -v -1.775061 1.703125 -1.598285 -v -1.784630 1.695312 -1.569581 -v -1.765493 1.679688 -1.550444 -v -1.736788 1.671875 -1.560012 -v -1.727220 1.679688 -1.588717 -v -1.746356 1.695312 -1.607854 -v -1.789864 1.625000 -1.613088 -v -1.797952 1.625000 -1.582902 -v -1.775855 1.625000 -1.560805 -v -1.745669 1.625000 -1.568893 -v -1.737581 1.625000 -1.599079 -v -1.759678 1.625000 -1.621176 -v -1.533183 1.746785 -1.748234 -v -1.522135 1.719722 -1.737185 -v -1.535747 1.706190 -1.712524 -v -1.560408 1.719722 -1.698912 -v -1.571457 1.746785 -1.709961 -v -1.557844 1.760317 -1.734621 -v -1.483465 1.765625 -1.698515 -v -1.483465 1.734375 -1.698515 -v -1.502602 1.718750 -1.679379 -v -1.521738 1.734375 -1.660242 -v -1.521738 1.765625 -1.660242 -v -1.502602 1.781250 -1.679379 -v -0.000000 2.500000 -2.500000 -v -0.000000 3.000000 -2.500000 -v 0.956708 2.500000 -2.309699 -v 0.956708 3.000000 -2.309699 -v 1.767767 2.500000 -1.767767 -v 1.767767 3.000000 -1.767767 -v 2.309699 2.500000 -0.956709 -v 2.309699 3.000000 -0.956709 -v 2.500000 2.500000 0.000000 -v 2.500000 3.000000 0.000000 -v 2.309699 2.500000 0.956709 -v 2.309699 3.000000 0.956709 -v 1.767767 2.500000 1.767767 -v 1.767767 3.000000 1.767767 -v 0.956708 2.500000 2.309699 -v 0.956708 3.000000 2.309699 -v 0.000000 2.500000 2.500000 -v 0.000000 3.000000 2.500000 -v -0.956708 2.500000 2.309699 -v -0.956708 3.000000 2.309699 -v -1.767767 2.500000 1.767768 -v -1.767767 3.000000 1.767768 -v -2.309699 2.500000 0.956709 -v -2.309699 3.000000 0.956709 -v -2.500000 2.500000 -0.000000 -v -2.500000 3.000000 -0.000000 -v -2.309699 2.500000 -0.956709 -v -2.309699 3.000000 -0.956709 -v -1.767766 2.500000 -1.767768 -v -1.767766 3.000000 -1.767768 -v -0.956708 2.500000 -2.309699 -v -0.956708 3.000000 -2.309699 -v 0.765367 3.000000 -1.847759 -v -0.000000 3.000000 -2.000000 -v 1.414213 3.000000 -1.414214 -v 1.847759 3.000000 -0.765367 -v 2.000000 3.000000 0.000000 -v 1.847759 3.000000 0.765367 -v 1.414213 3.000000 1.414213 -v 0.765367 3.000000 1.847759 -v 0.000000 3.000000 2.000000 -v -0.765367 3.000000 1.847759 -v -1.414213 3.000000 1.414214 -v -1.847759 3.000000 0.765367 -v -2.000000 3.000000 -0.000000 -v -1.847759 3.000000 -0.765367 -v -1.414213 3.000000 -1.414214 -v -0.765366 3.000000 -1.847759 -v 0.765367 2.750000 -1.847759 -v -0.000000 2.750000 -2.000000 -v 1.414213 2.750000 -1.414214 -v 1.847759 2.750000 -0.765367 -v 2.000000 2.750000 0.000000 -v 1.847759 2.750000 0.765367 -v 1.414213 2.750000 1.414213 -v 0.765367 2.750000 1.847759 -v 0.000000 2.750000 2.000000 -v -0.765367 2.750000 1.847759 -v -1.414213 2.750000 1.414214 -v -1.847759 2.750000 0.765367 -v -2.000000 2.750000 -0.000000 -v -1.847759 2.750000 -0.765367 -v -1.414213 2.750000 -1.414214 -v -0.765366 2.750000 -1.847759 -v 0.500000 2.750000 -0.625000 -v 0.588388 2.750000 -0.588388 -v 0.625000 2.750000 -0.500000 -v 0.588388 2.750000 -0.411612 -v 0.500000 2.750000 -0.375000 -v 0.411612 2.750000 -0.411612 -v 0.375000 2.750000 -0.500000 -v 0.411612 2.750000 -0.588388 -v -0.500000 2.750000 -0.625000 -v -0.411612 2.750000 -0.588388 -v -0.375000 2.750000 -0.500000 -v -0.411612 2.750000 -0.411612 -v -0.500000 2.750000 -0.375000 -v -0.588388 2.750000 -0.411612 -v -0.625000 2.750000 -0.500000 -v -0.588388 2.750000 -0.588388 -v 0.500000 2.750000 0.375000 -v 0.588388 2.750000 0.411612 -v 0.625000 2.750000 0.500000 -v 0.588388 2.750000 0.588388 -v 0.500000 2.750000 0.625000 -v 0.411612 2.750000 0.588388 -v 0.375000 2.750000 0.500000 -v 0.411612 2.750000 0.411612 -v -0.500000 2.750000 0.375000 -v -0.411612 2.750000 0.411612 -v -0.375000 2.750000 0.500000 -v -0.411612 2.750000 0.588388 -v -0.500000 2.750000 0.625000 -v -0.588388 2.750000 0.588388 -v -0.625000 2.750000 0.500000 -v -0.588388 2.750000 0.411612 -v 0.499999 3.750000 -0.625000 -v 0.588388 3.750000 -0.588388 -v 0.624999 3.750000 -0.500000 -v 0.588388 3.750000 -0.411612 -v 0.499999 3.750000 -0.375000 -v 0.411611 3.750000 -0.411612 -v 0.374999 3.750000 -0.500000 -v 0.411611 3.750000 -0.588388 -v -0.500001 3.750000 -0.625000 -v -0.411612 3.750000 -0.588388 -v -0.375001 3.750000 -0.500000 -v -0.411612 3.750000 -0.411612 -v -0.500001 3.750000 -0.375000 -v -0.588389 3.750000 -0.411612 -v -0.625001 3.750000 -0.500000 -v -0.588389 3.750000 -0.588388 -v 0.499999 3.750000 0.375000 -v 0.588388 3.750000 0.411612 -v 0.624999 3.750000 0.500000 -v 0.588388 3.750000 0.588388 -v 0.499999 3.750000 0.625000 -v 0.411611 3.750000 0.588388 -v 0.374999 3.750000 0.500000 -v 0.411611 3.750000 0.411612 -v -0.500001 3.750000 0.375000 -v -0.411612 3.750000 0.411612 -v -0.375001 3.750000 0.500000 -v -0.411612 3.750000 0.588388 -v -0.500001 3.750000 0.625000 -v -0.588389 3.750000 0.588388 -v -0.625001 3.750000 0.500000 -v -0.588389 3.750000 0.411612 -v -0.000000 0.500000 -2.250000 -v 0.861038 0.500000 -2.078729 -v 1.590990 0.500000 -1.590990 -v 2.078729 0.500000 -0.861038 -v 2.250000 0.500000 0.000000 -v 2.078729 0.500000 0.861038 -v 1.590990 0.500000 1.590990 -v 0.861038 0.500000 2.078729 -v 0.000000 0.500000 2.250000 -v -0.861037 0.500000 2.078729 -v -1.590990 0.500000 1.590991 -v -2.078729 0.500000 0.861038 -v -2.250000 0.500000 -0.000000 -v -2.078729 0.500000 -0.861038 -v -1.590990 0.500000 -1.590991 -v -0.861037 0.500000 -2.078729 -v -1.545028 1.625000 -1.721805 -v -1.589740 1.625000 -1.704017 -v -1.499066 1.500000 -1.675843 -v -1.588490 1.500000 -1.640267 -v -1.679379 1.500000 -1.679378 -v -1.718490 1.500000 -1.770267 -v -1.682914 1.500000 -1.859691 -v -1.593490 1.500000 -1.895267 -v -1.502602 1.500000 -1.856155 -v -1.463490 1.500000 -1.765267 -v -1.635185 1.625000 -1.723573 -v -1.654740 1.625000 -1.769017 -v -1.636952 1.625000 -1.813729 -v -1.592240 1.625000 -1.831517 -v -1.546796 1.625000 -1.811961 -v -1.527241 1.625000 -1.766517 -v -1.721805 1.625000 -1.545028 -v -1.766517 1.625000 -1.527240 -v -1.675843 1.500000 -1.499066 -v -1.765267 1.500000 -1.463490 -v -1.856155 1.500000 -1.502602 -v -1.895267 1.500000 -1.593490 -v -1.859691 1.500000 -1.682914 -v -1.770267 1.500000 -1.718490 -v -1.679379 1.500000 -1.679378 -v -1.640267 1.500000 -1.588490 -v -1.811961 1.625000 -1.546796 -v -1.831517 1.625000 -1.592240 -v -1.813729 1.625000 -1.636952 -v -1.769017 1.625000 -1.654740 -v -1.723573 1.625000 -1.635184 -v -1.704017 1.625000 -1.589740 -v 1.545028 1.625000 1.721805 -v 1.589740 1.625000 1.704017 -v 1.499066 1.500000 1.675843 -v 1.588490 1.500000 1.640267 -v 1.679379 1.500000 1.679379 -v 1.718490 1.500000 1.770267 -v 1.682914 1.500000 1.859691 -v 1.593490 1.500000 1.895267 -v 1.502602 1.500000 1.856155 -v 1.463490 1.500000 1.765267 -v 1.635185 1.625000 1.723573 -v 1.654740 1.625000 1.769017 -v 1.636952 1.625000 1.813729 -v 1.592240 1.625000 1.831517 -v 1.546796 1.625000 1.811961 -v 1.527241 1.625000 1.766517 -v 1.721805 1.625000 1.545028 -v 1.766517 1.625000 1.527240 -v 1.675843 1.500000 1.499066 -v 1.765267 1.500000 1.463490 -v 1.856155 1.500000 1.502602 -v 1.895267 1.500000 1.593490 -v 1.859691 1.500000 1.682914 -v 1.770267 1.500000 1.718490 -v 1.679379 1.500000 1.679379 -v 1.640267 1.500000 1.588490 -v 1.811961 1.625000 1.546796 -v 1.831517 1.625000 1.592240 -v 1.813729 1.625000 1.636952 -v 1.769017 1.625000 1.654740 -v 1.723573 1.625000 1.635184 -v 1.704017 1.625000 1.589740 -vt 0.222222 0.523810 -vt 0.111111 0.523810 -vt 0.000000 0.476190 -vt 0.222222 0.523810 -vt 0.111111 0.523810 -vt 0.000000 0.476190 -vt 0.222222 0.523810 -vt 0.111111 0.523810 -vt -0.000000 0.476190 -vt 0.222222 0.523810 -vt 0.111111 0.523810 -vt 0.000000 0.476190 -vt 0.555556 -0.000000 -vt 0.000000 0.000000 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.666667 0.500000 -vt 0.562500 0.476190 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.562500 0.476190 -vt 0.659722 0.476190 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.666667 0.500000 -vt 0.562500 0.476190 -vt 0.659722 0.476190 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.666667 0.500000 -vt 0.562500 0.476190 -vt 0.659722 0.476190 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.666667 0.500000 -vt 0.562500 0.476190 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.562500 0.476190 -vt 0.659722 0.476190 -vt 0.555556 0.500000 -vt 0.659722 0.476190 -vt 0.666667 0.500000 -vt 0.666667 0.500000 -vt 0.562500 0.476190 -vt 0.659722 0.476190 -vt 0.555556 0.547619 -vt 0.652778 0.595238 -vt 0.569444 0.595238 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.652778 0.595238 -vt 0.569444 0.595238 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.652778 0.595238 -vt 0.569444 0.595238 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.652778 0.595238 -vt 0.569444 0.595238 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.666667 0.547619 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.652778 0.595238 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.652778 0.595238 -vt 0.569444 0.595238 -vt 0.555556 0.547619 -vt 0.652778 0.595238 -vt 0.569444 0.595238 -vt 0.777778 0.999975 -vt 0.555585 0.809523 -vt 0.777778 0.619073 -vt 0.958333 0.523810 -vt 0.944444 0.488095 -vt 0.986111 0.476190 -vt 0.708333 0.303571 -vt 0.694444 0.297619 -vt 0.708333 0.297619 -vt 0.750000 0.333333 -vt 0.666667 0.357143 -vt 0.666667 0.333333 -vt 0.819444 0.303571 -vt 0.805556 0.297619 -vt 0.819444 0.297619 -vt 0.750000 0.333333 -vt 0.666667 0.357143 -vt 0.666667 0.333333 -vt 0.750000 0.357143 -vt 0.666667 0.333333 -vt 0.750000 0.333333 -vt 0.750000 0.357143 -vt 0.666667 0.333333 -vt 0.750000 0.333333 -vt 0.666667 0.285714 -vt 0.583333 0.190476 -vt 0.666667 0.190476 -vt 0.694444 0.190476 -vt 0.694444 0.309524 -vt 0.583333 0.285714 -vt 0.555556 0.190476 -vt 0.583333 0.309524 -vt 0.576389 0.428571 -vt 0.583333 0.434524 -vt 0.583333 0.446429 -vt 0.555556 0.446429 -vt 0.562500 0.428571 -vt 0.583333 0.434524 -vt 0.576389 0.428571 -vt 0.583333 0.434524 -vt 0.583333 0.446429 -vt 0.555556 0.446429 -vt 0.562500 0.428571 -vt 0.583333 0.434524 -vt 0.777778 0.333333 -vt 0.888889 0.333333 -vt 0.861111 0.380952 -vt 0.777778 0.333333 -vt 0.888889 0.333333 -vt 0.861111 0.380952 -vt 0.777778 0.333333 -vt 0.888889 0.333333 -vt 0.861111 0.380952 -vt 0.777778 0.333333 -vt 0.888889 0.333333 -vt 0.861111 0.380952 -vt 0.777778 0.333333 -vt 0.888889 0.333333 -vt 0.861111 0.380952 -vt 0.777778 0.333333 -vt 0.888889 0.333333 -vt 0.861111 0.380952 -vt 0.777778 0.333333 -vt 0.888889 0.333333 -vt 0.861111 0.380952 -vt 0.777778 0.333333 -vt 0.888889 0.333333 -vt 0.861111 0.380952 -vt 0.805556 0.404762 -vt 0.777778 0.380952 -vt 0.805556 0.380952 -vt 0.861111 0.404762 -vt 0.888889 0.380952 -vt 0.888889 0.404762 -vt 0.805556 0.404762 -vt 0.777778 0.380952 -vt 0.805556 0.380952 -vt 0.861111 0.404762 -vt 0.888889 0.380952 -vt 0.888889 0.404762 -vt 0.805556 0.404762 -vt 0.777778 0.380952 -vt 0.805556 0.380952 -vt 0.861111 0.404762 -vt 0.888889 0.380952 -vt 0.888889 0.404762 -vt 0.805556 0.404762 -vt 0.777778 0.380952 -vt 0.805556 0.380952 -vt 0.861111 0.404762 -vt 0.888889 0.380952 -vt 0.888889 0.404762 -vt 0.861111 0.404762 -vt 0.888889 0.380952 -vt 0.888889 0.404762 -vt 0.805556 0.404762 -vt 0.805556 0.380952 -vt 0.777778 0.380952 -vt 0.805556 0.404762 -vt 0.777778 0.380952 -vt 0.805556 0.380952 -vt 0.861111 0.404762 -vt 0.888889 0.380952 -vt 0.888889 0.404762 -vt 0.805556 0.404762 -vt 0.777778 0.380952 -vt 0.805556 0.380952 -vt 0.861111 0.404762 -vt 0.888889 0.380952 -vt 0.888889 0.404762 -vt 0.805556 0.404762 -vt 0.777778 0.380952 -vt 0.805556 0.380952 -vt 0.861111 0.404762 -vt 0.888889 0.380952 -vt 0.888889 0.404762 -vt 0.888889 0.357143 -vt 0.916667 0.333333 -vt 0.777778 0.357143 -vt 0.750000 0.333333 -vt 0.777778 0.357143 -vt 0.750000 0.333333 -vt 0.888889 0.357143 -vt 0.916667 0.333333 -vt 0.777778 0.357143 -vt 0.750000 0.333333 -vt 0.888889 0.357143 -vt 0.916667 0.333333 -vt 0.777778 0.357143 -vt 0.750000 0.333333 -vt 0.777778 0.357143 -vt 0.750000 0.333333 -vt 0.888889 0.357143 -vt 0.916667 0.333333 -vt 0.888889 0.357143 -vt 0.916667 0.333333 -vt 0.777778 0.357143 -vt 0.750000 0.333333 -vt 0.777778 0.357143 -vt 0.750000 0.333333 -vt 0.888889 0.357143 -vt 0.916667 0.333333 -vt 0.888889 0.357143 -vt 0.916667 0.333333 -vt 0.777778 0.357143 -vt 0.750000 0.333333 -vt 0.888889 0.357143 -vt 0.916667 0.333333 -vt 0.222222 0.976190 -vt 0.333333 1.000000 -vt 0.222222 1.000000 -vt 0.000000 0.714286 -vt 0.027778 0.809524 -vt 0.000000 0.809524 -vt 0.333333 0.547619 -vt 0.333333 0.523810 -vt 0.555556 0.809524 -vt 0.527778 0.714286 -vt 0.555556 0.714286 -vt 0.527778 0.904762 -vt 0.555556 0.904762 -vt 0.555556 1.000000 -vt 0.111111 0.976190 -vt 0.111111 1.000000 -vt 0.000000 1.000000 -vt 0.027778 0.619048 -vt 0.000000 0.619048 -vt 0.000000 0.523810 -vt 0.444444 0.547619 -vt 0.444444 0.523810 -vt 0.555556 0.523810 -vt 0.888889 0.428571 -vt 0.777778 0.428571 -vt 0.777778 0.428571 -vt 0.888889 0.428571 -vt 0.888889 0.428571 -vt 0.777778 0.428571 -vt 0.888889 0.428571 -vt 0.777778 0.428571 -vt 0.527778 0.809524 -vt 0.027778 0.714286 -vt 0.666667 0.285714 -vt 0.583333 0.190476 -vt 0.666667 0.190476 -vt 0.694444 0.190476 -vt 0.694444 0.309524 -vt 0.583333 0.285714 -vt 0.555556 0.190476 -vt 0.583333 0.309524 -vt 0.708333 0.297619 -vt 0.708333 0.303571 -vt 0.694444 0.303571 -vt 0.819444 0.303571 -vt 0.805556 0.297619 -vt 0.819444 0.297619 -vt 0.555556 0.476190 -vt 0.333333 0.523810 -vt 0.555556 0.523810 -vt 0.444444 0.523810 -vt 0.000000 0.523810 -vt 0.555556 0.476190 -vt 0.333333 0.523810 -vt 0.555556 0.523810 -vt 0.444444 0.523810 -vt 0.000000 0.523810 -vt 0.555556 0.476190 -vt 0.333333 0.523810 -vt 0.555556 0.523810 -vt 0.444444 0.523810 -vt -0.000000 0.523810 -vt 0.555556 0.476190 -vt 0.652778 0.595238 -vt 0.562500 0.476190 -vt 0.555556 0.500000 -vt 0.555556 0.500000 -vt 0.562500 0.476190 -vt 0.555556 0.500000 -vt 0.562500 0.476190 -vt 0.562500 0.476190 -vt 0.562500 0.476190 -vt 0.555556 0.500000 -vt 0.562500 0.476190 -vt 0.562500 0.476190 -vt 0.562500 0.476190 -vt 0.555556 0.500000 -vt 0.555556 0.500000 -vt 0.562500 0.476190 -vt 0.555556 0.500000 -vt 0.666667 0.547619 -vt 0.652778 0.595238 -vt 0.652778 0.595238 -vt 0.652778 0.595238 -vt 0.652778 0.595238 -vt 0.666667 0.547619 -vt 0.652778 0.595238 -vt 0.666667 0.547619 -vt 0.652778 0.595238 -vt 0.666667 0.547619 -vt 0.652778 0.595238 -vt 0.652778 0.595238 -vt 0.666667 0.547619 -vt 0.666667 0.547619 -vt 0.666667 0.547619 -vt 0.862808 0.633570 -vt 0.934892 0.674855 -vt 0.983057 0.736641 -vt 0.999971 0.809524 -vt 0.983057 0.882406 -vt 0.934892 0.944193 -vt 0.862807 0.985478 -vt 0.692748 0.985477 -vt 0.620664 0.944193 -vt 0.572498 0.882406 -vt 0.572498 0.736641 -vt 0.620664 0.674855 -vt 0.692748 0.633570 -vt 1.000000 0.488095 -vt 1.000000 0.511905 -vt 0.986111 0.523810 -vt 0.944444 0.511905 -vt 0.958333 0.476190 -vt 0.708333 0.309524 -vt 0.694444 0.309524 -vt 0.701389 0.309524 -vt 0.694444 0.303571 -vt 0.701389 0.297619 -vt 0.750000 0.357143 -vt 0.819444 0.309524 -vt 0.805556 0.309524 -vt 0.812500 0.309524 -vt 0.805556 0.303571 -vt 0.812500 0.297619 -vt 0.750000 0.357143 -vt 0.666667 0.357143 -vt 0.666667 0.357143 -vt 0.555556 0.309524 -vt 0.666667 0.309524 -vt 0.576389 0.452381 -vt 0.555556 0.434524 -vt 0.562500 0.452381 -vt 0.555556 0.446429 -vt 0.562500 0.428571 -vt 0.583333 0.446429 -vt 0.576389 0.452381 -vt 0.562500 0.452381 -vt 0.555556 0.434524 -vt 0.576389 0.428571 -vt 0.576389 0.452381 -vt 0.555556 0.434524 -vt 0.562500 0.452381 -vt 0.555556 0.446429 -vt 0.562500 0.428571 -vt 0.583333 0.446429 -vt 0.576389 0.452381 -vt 0.562500 0.452381 -vt 0.555556 0.434524 -vt 0.576389 0.428571 -vt 0.777778 0.404762 -vt 0.777778 0.404762 -vt 0.777778 0.404762 -vt 0.777778 0.404762 -vt 0.777778 0.404762 -vt 0.777778 0.404762 -vt 0.777778 0.404762 -vt 0.777778 0.404762 -vt 0.333333 0.976190 -vt 0.222222 0.547619 -vt 0.444444 1.000000 -vt 0.444444 0.976190 -vt 0.000000 0.904762 -vt 0.027778 0.904762 -vt 0.111111 0.547619 -vt 0.555556 0.619048 -vt 0.527778 0.619048 -vt 0.777778 0.428571 -vt 0.888889 0.428571 -vt 0.888889 0.428571 -vt 0.777778 0.428571 -vt 0.777778 0.428571 -vt 0.888889 0.428571 -vt 0.777778 0.428571 -vt 0.888889 0.428571 -vt 0.555556 0.309524 -vt 0.666667 0.309524 -vt 0.708333 0.309524 -vt 0.694444 0.309524 -vt 0.701389 0.309524 -vt 0.694444 0.297619 -vt 0.701389 0.297619 -vt 0.819444 0.309524 -vt 0.805556 0.309524 -vt 0.812500 0.309524 -vt 0.805556 0.303571 -vt 0.812500 0.297619 -vt 0.611111 0.333333 -vt 0.597222 0.428571 -vt 0.597222 0.333333 -vt 0.569444 0.333333 -vt 0.555556 0.428571 -vt 0.555556 0.333333 -vt 0.666667 0.333333 -vt 0.652778 0.428571 -vt 0.652778 0.333333 -vt 0.583333 0.333333 -vt 0.569444 0.428571 -vt 0.569444 0.333333 -vt 0.555556 0.428571 -vt 0.555556 0.333333 -vt 0.597222 0.333333 -vt 0.583333 0.428571 -vt 0.583333 0.333333 -vt 0.569444 0.428571 -vt 0.638889 0.333333 -vt 0.625000 0.428571 -vt 0.625000 0.333333 -vt 0.597222 0.333333 -vt 0.583333 0.428571 -vt 0.652778 0.333333 -vt 0.638889 0.428571 -vt 0.611111 0.333333 -vt 0.597222 0.428571 -vt 0.666667 0.333333 -vt 0.652778 0.428571 -vt 0.625000 0.333333 -vt 0.611111 0.428571 -vt 0.583333 0.333333 -vt 0.569444 0.428571 -vt 0.569444 0.333333 -vt 0.569444 0.333333 -vt 0.555556 0.428571 -vt 0.555556 0.333333 -vt 0.638889 0.333333 -vt 0.625000 0.428571 -vt 0.750000 0.190476 -vt 0.847222 0.000000 -vt 0.847222 0.190476 -vt 0.875000 0.547619 -vt 0.840278 0.476190 -vt 0.875000 0.476190 -vt 0.847222 0.190476 -vt 0.944444 0.000000 -vt 0.944444 0.190476 -vt 0.840278 0.547619 -vt 0.805556 0.476190 -vt 0.555556 0.190476 -vt 0.652778 0.000000 -vt 0.652778 0.190476 -vt 0.805556 0.547619 -vt 0.770833 0.476190 -vt 0.944444 0.000000 -vt 0.944444 0.190476 -vt 0.770833 0.547619 -vt 0.736111 0.476190 -vt 0.555556 0.190476 -vt 0.652778 0.000000 -vt 0.652778 0.190476 -vt 0.736111 0.547619 -vt 0.701389 0.476190 -vt 0.750000 0.000000 -vt 0.750000 0.190476 -vt 0.701389 0.547619 -vt 0.666667 0.476190 -vt 0.750000 0.000000 -vt 0.750000 0.190476 -vt 0.944444 0.547619 -vt 0.909722 0.476190 -vt 0.944444 0.476190 -vt 0.847222 -0.000000 -vt 0.847222 0.190476 -vt 0.909722 0.547619 -vt 0.888889 0.285714 -vt 0.875000 0.190476 -vt 0.888889 0.190476 -vt 0.875000 0.285714 -vt 0.868056 0.297619 -vt 0.861111 0.285714 -vt 0.805556 0.285714 -vt 0.791667 0.190476 -vt 0.805556 0.190476 -vt 0.819444 0.285714 -vt 0.812500 0.297619 -vt 0.805556 0.285714 -vt 0.791667 0.285714 -vt 0.777778 0.190476 -vt 0.902778 0.285714 -vt 0.902778 0.190476 -vt 0.847222 0.285714 -vt 0.861111 0.297619 -vt 0.854167 0.297619 -vt 0.777778 0.285714 -vt 0.763889 0.190476 -vt 0.888889 0.285714 -vt 0.902778 0.297619 -vt 0.895833 0.297619 -vt 0.763889 0.285714 -vt 0.750000 0.190476 -vt 0.916667 0.285714 -vt 0.916667 0.190476 -vt 0.902778 0.285714 -vt 0.916667 0.297619 -vt 0.909722 0.297619 -vt 0.750000 0.285714 -vt 0.736111 0.190476 -vt 0.833333 0.285714 -vt 0.826389 0.297619 -vt 0.736111 0.285714 -vt 0.722222 0.190476 -vt 0.881944 0.297619 -vt 0.722222 0.285714 -vt 0.708333 0.190476 -vt 0.847222 0.297619 -vt 0.840278 0.297619 -vt 0.708333 0.285714 -vt 0.694444 0.190476 -vt 0.875000 0.285714 -vt 0.861111 0.190476 -vt 0.861111 0.285714 -vt 0.847222 0.190476 -vt 0.847222 0.285714 -vt 0.833333 0.190476 -vt 0.833333 0.285714 -vt 0.819444 0.190476 -vt 0.819444 0.285714 -vt 0.805556 0.190476 -vt 0.826389 0.327381 -vt 0.833333 0.333333 -vt 0.826389 0.333333 -vt 0.722222 0.327381 -vt 0.715278 0.333333 -vt 0.715278 0.327381 -vt 0.840278 0.327381 -vt 0.833333 0.327381 -vt 0.701389 0.327381 -vt 0.694444 0.333333 -vt 0.694444 0.327381 -vt 0.812500 0.327381 -vt 0.805556 0.333333 -vt 0.805556 0.327381 -vt 0.819444 0.327381 -vt 0.812500 0.333333 -vt 0.708333 0.327381 -vt 0.708333 0.333333 -vt 0.729167 0.327381 -vt 0.722222 0.333333 -vt 0.847222 0.327381 -vt 0.840278 0.333333 -vt 0.701389 0.333333 -vt 0.819444 0.333333 -vt 0.736111 0.327381 -vt 0.729167 0.333333 -vt 0.833333 0.321429 -vt 0.840278 0.321429 -vt 0.847222 0.321429 -vt 0.812500 0.321429 -vt 0.819444 0.321429 -vt 0.826389 0.315476 -vt 0.826389 0.321429 -vt 0.833333 0.315476 -vt 0.840278 0.315476 -vt 0.805556 0.321429 -vt 0.812500 0.315476 -vt 0.826389 0.309524 -vt 0.833333 0.309524 -vt 0.840278 0.309524 -vt 0.847222 0.315476 -vt 0.805556 0.309524 -vt 0.805556 0.315476 -vt 0.819444 0.309524 -vt 0.819444 0.315476 -vt 0.708333 0.309524 -vt 0.715278 0.315476 -vt 0.708333 0.315476 -vt 0.701389 0.315476 -vt 0.694444 0.315476 -vt 0.701389 0.309524 -vt 0.729167 0.315476 -vt 0.736111 0.309524 -vt 0.736111 0.315476 -vt 0.722222 0.315476 -vt 0.729167 0.309524 -vt 0.715278 0.309524 -vt 0.708333 0.321429 -vt 0.715278 0.321429 -vt 0.701389 0.321429 -vt 0.694444 0.321429 -vt 0.729167 0.321429 -vt 0.736111 0.321429 -vt 0.722222 0.321429 -vt 0.847222 0.000000 -vt 0.847222 0.190476 -vt 0.944444 -0.000000 -vt 0.944444 0.190476 -vt 0.944444 0.000000 -vt 0.944444 0.190476 -vt 0.555556 0.190476 -vt 0.652778 0.000000 -vt 0.652778 0.190476 -vt 0.555556 0.190476 -vt 0.652778 0.000000 -vt 0.652778 0.190476 -vt 0.750000 0.000000 -vt 0.750000 0.190476 -vt 0.750000 0.000000 -vt 0.847222 0.000000 -vt 0.701389 0.547619 -vt 0.729167 0.577381 -vt 0.708333 0.577381 -vt 0.840278 0.547619 -vt 0.812500 0.577381 -vt 0.805556 0.547619 -vt 0.673611 0.577381 -vt 0.666667 0.547619 -vt 0.875000 0.547619 -vt 0.847222 0.577381 -vt 0.770833 0.547619 -vt 0.798611 0.577381 -vt 0.777778 0.577381 -vt 0.944444 0.547619 -vt 0.916667 0.577381 -vt 0.909722 0.547619 -vt 0.736111 0.547619 -vt 0.763889 0.577381 -vt 0.743056 0.577381 -vt 0.881944 0.577381 -vt 0.888889 0.285714 -vt 0.875000 0.190476 -vt 0.888889 0.190476 -vt 0.875000 0.285714 -vt 0.868056 0.297619 -vt 0.861111 0.285714 -vt 0.805556 0.285714 -vt 0.791667 0.190476 -vt 0.805556 0.190476 -vt 0.763889 0.285714 -vt 0.756944 0.297619 -vt 0.750000 0.285714 -vt 0.819444 0.285714 -vt 0.812500 0.297619 -vt 0.805556 0.285714 -vt 0.791667 0.285714 -vt 0.777778 0.190476 -vt 0.902778 0.285714 -vt 0.902778 0.190476 -vt 0.847222 0.285714 -vt 0.861111 0.297619 -vt 0.854167 0.297619 -vt 0.777778 0.285714 -vt 0.763889 0.190476 -vt 0.708333 0.285714 -vt 0.701389 0.297619 -vt 0.694444 0.285714 -vt 0.888889 0.285714 -vt 0.902778 0.297619 -vt 0.895833 0.297619 -vt 0.763889 0.285714 -vt 0.750000 0.190476 -vt 0.916667 0.285714 -vt 0.916667 0.190476 -vt 0.902778 0.285714 -vt 0.916667 0.297619 -vt 0.909722 0.297619 -vt 0.750000 0.285714 -vt 0.736111 0.190476 -vt 0.736111 0.285714 -vt 0.750000 0.297619 -vt 0.743056 0.297619 -vt 0.833333 0.285714 -vt 0.826389 0.297619 -vt 0.736111 0.285714 -vt 0.722222 0.190476 -vt 0.881944 0.297619 -vt 0.722222 0.285714 -vt 0.708333 0.190476 -vt 0.777778 0.285714 -vt 0.791667 0.297619 -vt 0.784722 0.297619 -vt 0.847222 0.297619 -vt 0.840278 0.297619 -vt 0.708333 0.285714 -vt 0.694444 0.190476 -vt 0.875000 0.285714 -vt 0.861111 0.190476 -vt 0.722222 0.285714 -vt 0.736111 0.297619 -vt 0.729167 0.297619 -vt 0.861111 0.285714 -vt 0.847222 0.190476 -vt 0.791667 0.285714 -vt 0.805556 0.297619 -vt 0.798611 0.297619 -vt 0.847222 0.285714 -vt 0.833333 0.190476 -vt 0.770833 0.297619 -vt 0.833333 0.285714 -vt 0.819444 0.190476 -vt 0.715278 0.297619 -vt 0.819444 0.285714 -vt 0.805556 0.190476 -vt 0.826389 0.327381 -vt 0.833333 0.333333 -vt 0.826389 0.333333 -vt 0.715278 0.327381 -vt 0.722222 0.333333 -vt 0.715278 0.333333 -vt 0.840278 0.327381 -vt 0.833333 0.327381 -vt 0.701389 0.327381 -vt 0.694444 0.333333 -vt 0.694444 0.327381 -vt 0.812500 0.327381 -vt 0.805556 0.333333 -vt 0.805556 0.327381 -vt 0.819444 0.327381 -vt 0.812500 0.333333 -vt 0.708333 0.327381 -vt 0.708333 0.333333 -vt 0.729167 0.327381 -vt 0.722222 0.327381 -vt 0.847222 0.327381 -vt 0.840278 0.333333 -vt 0.701389 0.333333 -vt 0.819444 0.333333 -vt 0.736111 0.327381 -vt 0.729167 0.333333 -vt 0.826389 0.321429 -vt 0.840278 0.321429 -vt 0.847222 0.321429 -vt 0.805556 0.321429 -vt 0.812500 0.321429 -vt 0.826389 0.315476 -vt 0.833333 0.321429 -vt 0.833333 0.315476 -vt 0.840278 0.315476 -vt 0.805556 0.315476 -vt 0.812500 0.315476 -vt 0.819444 0.321429 -vt 0.826389 0.309524 -vt 0.833333 0.309524 -vt 0.847222 0.309524 -vt 0.847222 0.315476 -vt 0.812500 0.309524 -vt 0.819444 0.309524 -vt 0.819444 0.315476 -vt 0.708333 0.309524 -vt 0.715278 0.315476 -vt 0.708333 0.315476 -vt 0.701389 0.315476 -vt 0.694444 0.309524 -vt 0.694444 0.315476 -vt 0.729167 0.315476 -vt 0.736111 0.309524 -vt 0.736111 0.315476 -vt 0.722222 0.309524 -vt 0.722222 0.315476 -vt 0.715278 0.309524 -vt 0.708333 0.321429 -vt 0.715278 0.321429 -vt 0.701389 0.321429 -vt 0.694444 0.321429 -vt 0.729167 0.321429 -vt 0.736111 0.321429 -vt 0.722222 0.321429 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.666667 0.547619 -vt 0.555556 0.500000 -vt 0.666667 0.500000 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.652778 0.595238 -vt 0.569444 0.619048 -vt 0.569444 0.595238 -vt 0.555556 0.428571 -vt 0.555556 0.333333 -vt 0.666667 0.333333 -vt 0.652778 0.428571 -vt 0.652778 0.333333 -vt 0.666667 0.333333 -vt 0.652778 0.428571 -vt 0.652778 0.333333 -vt 0.611111 0.428571 -vt 0.638889 0.428571 -vt 0.638889 0.333333 -vt 0.638889 0.428571 -vt 0.638889 0.333333 -vt 0.625000 0.428571 -vt 0.625000 0.333333 -vt 0.625000 0.428571 -vt 0.625000 0.333333 -vt 0.611111 0.428571 -vt 0.611111 0.333333 -vt 0.611111 0.428571 -vt 0.611111 0.333333 -vt 0.597222 0.428571 -vt 0.583333 0.428571 -vt 0.583333 0.333333 -vt 0.597222 0.428571 -vt 0.597222 0.333333 -vt 0.638889 0.428571 -vt 0.569444 0.428571 -vt 0.583333 0.428571 -vt 0.722222 0.285714 -vt 0.715278 0.297619 -vt 0.708333 0.285714 -vt 0.777778 0.285714 -vt 0.770833 0.297619 -vt 0.763889 0.285714 -vt 0.791667 0.285714 -vt 0.805556 0.297619 -vt 0.798611 0.297619 -vt 0.736111 0.297619 -vt 0.729167 0.297619 -vt 0.791667 0.297619 -vt 0.784722 0.297619 -vt 0.736111 0.285714 -vt 0.750000 0.297619 -vt 0.743056 0.297619 -vt 0.701389 0.297619 -vt 0.694444 0.285714 -vt 0.756944 0.297619 -vt 0.750000 0.285714 -vt 0.666667 0.428571 -vt 0.666667 0.428571 -vt 0.555556 0.000000 -vt 0.555556 0.000000 -vt 0.666667 0.547619 -vt 0.875000 0.297619 -vt 0.819444 0.297619 -vt 0.916667 0.285714 -vt 0.833333 0.297619 -vt 0.888889 0.297619 -vt 0.694444 0.285714 -vt 0.805556 0.285714 -vt 0.847222 0.333333 -vt 0.736111 0.333333 -vt 0.847222 0.309524 -vt 0.812500 0.309524 -vt 0.694444 0.309524 -vt 0.722222 0.309524 -vt 0.555556 0.000000 -vt 0.555556 0.000000 -vt 0.833333 0.577381 -vt 0.694444 0.577381 -vt 0.868056 0.577381 -vt 0.937500 0.577381 -vt 0.902778 0.577381 -vt 0.875000 0.297619 -vt 0.763889 0.297619 -vt 0.819444 0.297619 -vt 0.708333 0.297619 -vt 0.916667 0.285714 -vt 0.833333 0.297619 -vt 0.888889 0.297619 -vt 0.694444 0.285714 -vt 0.805556 0.285714 -vt 0.777778 0.297619 -vt 0.722222 0.297619 -vt 0.805556 0.285714 -vt 0.847222 0.333333 -vt 0.736111 0.333333 -vt 0.840278 0.309524 -vt 0.805556 0.309524 -vt 0.701389 0.309524 -vt 0.729167 0.309524 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.555556 0.547619 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.652778 0.619048 -vt 0.666667 0.428571 -vt 0.666667 0.428571 -vt 0.722222 0.297619 -vt 0.777778 0.297619 -vt 0.805556 0.285714 -vt 0.708333 0.297619 -vt 0.763889 0.297619 -vn -1.0000 0.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 -vn 0.0000 1.0000 0.0000 -vn -0.7071 0.0000 0.7071 -vn 0.7071 0.0000 0.7071 -vn -0.7071 0.0000 -0.7071 -vn -0.5000 0.7071 0.5000 -vn 0.5774 0.5774 -0.5774 -vn 0.7071 0.7071 0.0000 -vn 0.5774 0.5774 0.5774 -vn -0.5774 0.5774 -0.5774 -vn 0.0000 0.7071 -0.7071 -vn -0.7071 0.7071 0.0000 -vn -0.5774 0.5774 0.5774 -vn 0.0000 0.7071 0.7071 -vn 0.7071 0.0000 -0.7071 +v 1.500000 0.250000 -0.750000 +v 1.500000 0.250000 -1.250000 +v -1.250000 0.250000 2.500000 +v -1.250000 0.750000 2.500000 +v -1.250000 0.750000 2.250000 +v -0.750000 0.250000 2.500000 +v -0.750000 0.750000 2.500000 +v -0.750000 0.750000 2.250000 +v -1.250000 0.250000 1.500000 +v -0.750000 0.250000 1.500000 +v -0.250000 0.250000 2.500000 +v -0.250000 0.750000 2.500000 +v -0.250000 0.750000 2.250000 +v 0.250000 0.250000 2.500000 +v 0.250000 0.750000 2.500000 +v 0.250000 0.750000 2.250000 +v -0.250000 0.250000 1.500000 +v 0.250000 0.250000 1.500000 +v 0.750000 0.250000 2.500000 +v 0.750000 0.750000 2.500000 +v 0.750000 0.750000 2.250000 +v 1.250000 0.250000 2.500000 +v 1.250000 0.750000 2.500000 +v 1.250000 0.750000 2.250000 +v 0.750000 0.250000 1.500000 +v 1.250000 0.250000 1.500000 +v -2.500000 0.250000 -1.249999 +v -2.500000 0.750000 -1.249999 +v -2.250000 0.750000 -1.249999 +v -2.500000 0.250000 -0.749999 +v -2.500000 0.750000 -0.749999 +v -2.250000 0.750000 -0.749999 +v -1.500000 0.250000 -1.250000 +v -1.500000 0.250000 -0.750000 +v -2.500000 0.250000 -0.249999 +v -2.500000 0.750000 -0.249999 +v -2.250000 0.750000 -0.249999 +v -2.500000 0.250000 0.250001 +v -2.500000 0.750000 0.250001 +v -2.250000 0.750000 0.250001 +v -1.500000 0.250000 -0.250000 +v -1.500000 0.250000 0.250000 +v -2.500000 0.250000 0.750001 +v -2.500000 0.750000 0.750001 +v -2.250000 0.750000 0.750001 +v -2.499999 0.250000 1.250001 +v -2.499999 0.750000 1.250001 +v -2.249999 0.750000 1.250001 +v -1.500000 0.250000 0.750000 +v -1.500000 0.250000 1.250000 +v 1.250000 0.250000 -2.500000 +v 1.250000 0.750000 -2.500000 +v 1.250000 0.750000 -2.250000 +v 0.750000 0.250000 -2.500000 +v 0.750000 0.750000 -2.500000 +v 0.750000 0.750000 -2.250000 +v 1.250000 0.250000 -1.500000 +v 0.750000 0.250000 -1.500000 +v 0.249999 0.250000 -2.500000 +v 0.249999 0.750000 -2.500000 +v 0.250000 0.750000 -2.250000 +v -0.250001 0.250000 -2.500000 +v -0.250001 0.750000 -2.500000 +v -0.250000 0.750000 -2.250000 +v 0.250000 0.250000 -1.500000 +v -0.250000 0.250000 -1.500000 +v -0.750000 0.250000 -2.500000 +v -0.750000 0.750000 -2.500000 +v -0.750000 0.750000 -2.250000 +v -1.250000 0.250000 -2.499999 +v -1.250000 0.750000 -2.499999 +v -1.250000 0.750000 -2.249999 +v -0.750000 0.250000 -1.500000 +v -1.250000 0.250000 -1.500000 +v 0.675716 1.687500 2.115592 +v 0.762406 1.650888 2.098348 +v 0.589026 1.650888 2.132836 +v 0.675716 1.687500 2.115592 +v 0.767456 1.661612 2.123739 +v 0.594077 1.661612 2.158226 +v 0.675716 1.687500 2.115592 +v 0.769549 1.687500 2.134256 +v 0.596168 1.687500 2.168744 +v 0.675717 2.375000 2.115592 +v 0.769549 2.375000 2.134256 +v 0.596169 2.375000 2.168743 +v 0.711625 2.463388 2.108449 +v 0.780067 2.400888 2.132164 +v 0.657469 2.525889 2.156550 +v 0.798316 2.500000 2.091206 +v 0.805458 2.411612 2.127114 +v 0.805459 2.588389 2.127114 +v 0.859615 2.500000 2.079012 +v 0.866757 2.411612 2.114920 +v 0.866758 2.588389 2.114920 +v 0.859614 2.500000 2.079013 +v 0.879955 2.411612 2.109454 +v 0.879955 2.588389 2.109454 +v 1.589567 2.499999 1.591275 +v 1.609907 2.411611 1.621716 +v 1.609907 2.588387 1.621715 +v 1.589567 2.499999 1.591275 +v 1.620008 2.411611 1.611615 +v 1.620008 2.588387 1.611614 +v 1.832630 2.499998 1.227507 +v 1.863071 2.411610 1.247847 +v 1.863071 2.588387 1.247847 +v 1.832630 2.499998 1.227507 +v 1.868538 2.411610 1.220364 +v 1.868538 2.588387 1.220364 +v 1.832630 2.499998 1.227507 +v 1.852970 2.411610 1.197065 +v 1.852970 2.588387 1.197065 +v 1.902076 2.624998 1.123573 +v 1.951182 2.588387 1.050081 +v 1.955228 2.624998 1.203120 +v 2.041918 2.588387 1.185877 +v 1.936563 2.624998 1.296953 +v 2.010056 2.588387 1.346059 +v 1.693501 2.624999 1.660721 +v 1.766993 2.588387 1.709826 +v 1.659013 2.624999 1.695208 +v 1.708119 2.588387 1.768701 +v 0.929061 2.625000 2.182946 +v 0.978167 2.588388 2.256439 +v 0.884001 2.625000 2.201610 +v 0.901245 2.588388 2.288301 +v 0.822702 2.625000 2.213804 +v 0.839946 2.588388 2.300494 +v 0.649322 2.551777 2.248291 +v 0.691956 2.525889 2.329930 +v 0.577505 2.375000 2.262576 +v 0.630657 2.375000 2.342123 +v 0.577504 1.687500 2.262576 +v 0.630656 1.687500 2.342124 +v 0.570361 1.599112 2.226668 +v 0.618463 1.536612 2.280825 +v 0.553118 1.562500 2.139978 +v 0.589026 1.474112 2.132836 +v 0.675716 1.437500 2.115592 +v 0.762406 1.474112 2.098348 +v 0.710203 1.510723 2.288972 +v 0.791843 1.536612 2.246337 +v 0.724488 1.687500 2.360788 +v 0.804036 1.687500 2.307636 +v 0.724489 2.375000 2.360788 +v 0.804037 2.375000 2.307636 +v 0.760398 2.463389 2.353645 +v 0.814554 2.400888 2.305544 +v 0.847088 2.500000 2.336402 +v 0.839945 2.411612 2.300494 +v 0.908387 2.500000 2.324208 +v 0.901244 2.411612 2.288301 +v 0.998507 2.500000 2.286880 +v 0.978166 2.411612 2.256439 +v 1.728460 2.499999 1.799142 +v 1.708119 2.411611 1.768701 +v 1.797434 2.499999 1.730167 +v 1.766993 2.411611 1.709827 +v 2.040497 2.499998 1.366399 +v 2.010055 2.411610 1.346059 +v 2.077826 2.499998 1.178734 +v 2.041918 2.411610 1.185877 +v 1.971522 2.499998 1.019639 +v 1.951182 2.411610 1.050081 +v 1.902076 2.374998 1.123573 +v 1.955228 2.374998 1.203120 +v 1.936563 2.374998 1.296953 +v 1.693501 2.374999 1.660721 +v 1.659013 2.374999 1.695208 +v 0.929061 2.375000 2.182946 +v 0.884001 2.375000 2.201610 +v 0.822702 2.375000 2.213804 +v 0.822702 2.375000 2.213803 +v 0.822701 2.375000 2.213803 +v 0.822701 1.687500 2.213804 +v 0.815558 1.599112 2.177896 +v 0.798314 1.562500 2.091206 +v 1.904307 1.562500 1.122080 +v 1.855201 1.599112 1.195572 +v 1.953413 1.599112 1.048588 +v 1.904307 1.562500 1.122080 +v 1.876726 1.588388 1.209955 +v 1.974938 1.588388 1.062970 +v 1.904307 1.562500 1.122080 +v 1.885642 1.562500 1.215913 +v 1.983854 1.562500 1.068928 +v 1.904306 0.875000 1.122081 +v 1.885641 0.875000 1.215913 +v 1.983854 0.875000 1.068929 +v 1.883965 0.786612 1.152522 +v 1.879684 0.849112 1.224830 +v 1.949130 0.724111 1.120896 +v 1.834860 0.750000 1.226015 +v 1.865301 0.838388 1.246355 +v 1.865301 0.661612 1.246356 +v 1.765413 0.750000 1.329949 +v 1.795855 0.838388 1.350289 +v 1.795855 0.661612 1.350290 +v 1.765414 0.750000 1.329948 +v 1.772556 0.838388 1.365856 +v 1.772556 0.661612 1.365857 +v 1.765414 0.750000 1.329948 +v 1.745073 0.838389 1.360390 +v 1.745073 0.661612 1.360390 +v 1.695967 0.625000 1.433882 +v 1.646861 0.661612 1.507374 +v 1.789799 0.625000 1.452547 +v 1.807043 0.661612 1.539237 +v 1.869347 0.625000 1.399395 +v 1.942839 0.661612 1.448501 +v 1.938793 0.625000 1.295462 +v 2.012286 0.661611 1.344568 +v 2.037005 0.698223 1.148477 +v 2.096115 0.724111 1.219108 +v 2.077686 0.875000 1.087593 +v 2.130838 0.875000 1.167141 +v 2.077687 1.562500 1.087593 +v 2.130839 1.562500 1.167140 +v 2.047245 1.650888 1.067252 +v 2.078871 1.713388 1.132417 +v 1.973753 1.687500 1.018146 +v 1.953413 1.775888 1.048588 +v 1.904307 1.812500 1.122080 +v 1.855201 1.775888 1.195572 +v 2.051291 1.739277 1.220292 +v 1.980660 1.713388 1.279401 +v 2.112174 1.562500 1.260973 +v 2.032627 1.562500 1.314125 +v 2.112173 0.875000 1.260974 +v 2.032626 0.875000 1.314125 +v 2.091833 0.786611 1.291415 +v 2.026669 0.849112 1.323042 +v 2.042727 0.750000 1.364908 +v 2.012286 0.838389 1.344567 +v 1.973281 0.750000 1.468842 +v 1.942840 0.838389 1.448501 +v 1.814186 0.750000 1.575145 +v 1.807044 0.838389 1.539237 +v 1.626521 0.750000 1.537816 +v 1.646862 0.838389 1.507374 +v 1.695967 0.875000 1.433882 +v 1.789800 0.875000 1.452547 +v 1.869347 0.875000 1.399395 +v 1.938793 0.875000 1.295461 +v 1.938793 0.875000 1.295461 +v 1.938793 0.875000 1.295461 +v 1.938794 1.562500 1.295460 +v 1.908353 1.650888 1.275120 +v 1.834861 1.687500 1.226014 +v 2.115592 1.687500 -0.675716 +v 2.098348 1.650888 -0.762406 +v 2.132836 1.650888 -0.589026 +v 2.115592 1.687500 -0.675716 +v 2.123739 1.661612 -0.767457 +v 2.158226 1.661612 -0.594077 +v 2.115592 1.687500 -0.675716 +v 2.134256 1.687500 -0.769549 +v 2.168744 1.687500 -0.596169 +v 2.115592 2.375000 -0.675717 +v 2.134256 2.375000 -0.769550 +v 2.168743 2.375000 -0.596170 +v 2.108449 2.463388 -0.711625 +v 2.132164 2.400888 -0.780067 +v 2.156550 2.525889 -0.657469 +v 2.091206 2.500000 -0.798316 +v 2.127114 2.411612 -0.805458 +v 2.127114 2.588389 -0.805459 +v 2.079012 2.500000 -0.859615 +v 2.114920 2.411612 -0.866757 +v 2.114920 2.588389 -0.866758 +v 2.079013 2.500000 -0.859615 +v 2.109454 2.411612 -0.879955 +v 2.109454 2.588389 -0.879955 +v 1.591274 2.499999 -1.589567 +v 1.621716 2.411611 -1.609907 +v 1.621715 2.588387 -1.609908 +v 1.591274 2.499999 -1.589567 +v 1.611615 2.411611 -1.620009 +v 1.611614 2.588387 -1.620009 +v 1.227507 2.499998 -1.832630 +v 1.247847 2.411610 -1.863071 +v 1.247847 2.588387 -1.863071 +v 1.227507 2.499998 -1.832630 +v 1.220364 2.411610 -1.868538 +v 1.220364 2.588387 -1.868538 +v 1.227507 2.499998 -1.832630 +v 1.197065 2.411610 -1.852970 +v 1.197065 2.588387 -1.852970 +v 1.123573 2.624998 -1.902076 +v 1.050080 2.588387 -1.951182 +v 1.203120 2.624998 -1.955228 +v 1.185876 2.588387 -2.041918 +v 1.296953 2.624998 -1.936563 +v 1.346059 2.588387 -2.010056 +v 1.660721 2.624999 -1.693501 +v 1.709826 2.588387 -1.766993 +v 1.695208 2.624999 -1.659014 +v 1.768700 2.588387 -1.708120 +v 2.182946 2.625000 -0.929061 +v 2.256439 2.588388 -0.978167 +v 2.201610 2.625000 -0.884001 +v 2.288301 2.588388 -0.901245 +v 2.213804 2.625000 -0.822702 +v 2.300494 2.588388 -0.839946 +v 2.248291 2.551777 -0.649322 +v 2.329930 2.525889 -0.691957 +v 2.262576 2.375000 -0.577505 +v 2.342123 2.375000 -0.630657 +v 2.262576 1.687500 -0.577504 +v 2.342124 1.687500 -0.630656 +v 2.226668 1.599112 -0.570362 +v 2.280825 1.536612 -0.618463 +v 2.139978 1.562500 -0.553118 +v 2.132836 1.474112 -0.589026 +v 2.115592 1.437500 -0.675716 +v 2.098348 1.474112 -0.762406 +v 2.288972 1.510723 -0.710204 +v 2.246337 1.536612 -0.791843 +v 2.360788 1.687500 -0.724489 +v 2.307636 1.687500 -0.804036 +v 2.360788 2.375000 -0.724490 +v 2.307636 2.375000 -0.804037 +v 2.353645 2.463389 -0.760398 +v 2.305544 2.400888 -0.814554 +v 2.336402 2.500000 -0.847088 +v 2.300494 2.411612 -0.839945 +v 2.324208 2.500000 -0.908387 +v 2.288301 2.411612 -0.901244 +v 2.286880 2.500000 -0.998507 +v 2.256439 2.411612 -0.978166 +v 1.799142 2.499999 -1.728460 +v 1.768700 2.411611 -1.708119 +v 1.730167 2.499999 -1.797435 +v 1.709827 2.411611 -1.766993 +v 1.366399 2.499998 -2.040497 +v 1.346059 2.411610 -2.010055 +v 1.178734 2.499998 -2.077826 +v 1.185877 2.411610 -2.041918 +v 1.019639 2.499998 -1.971522 +v 1.050081 2.411610 -1.951182 +v 1.123573 2.374998 -1.902076 +v 1.203120 2.374998 -1.955228 +v 1.296953 2.374998 -1.936563 +v 1.660721 2.374999 -1.693501 +v 1.695208 2.374999 -1.659013 +v 2.182946 2.375000 -0.929061 +v 2.201610 2.375000 -0.884001 +v 2.213804 2.375000 -0.822702 +v 2.213803 2.375000 -0.822702 +v 2.213803 2.375000 -0.822702 +v 2.213804 1.687500 -0.822701 +v 2.177896 1.599112 -0.815558 +v 2.091206 1.562500 -0.798314 +v 1.122080 1.562500 -1.904307 +v 1.195572 1.599112 -1.855201 +v 1.048588 1.599112 -1.953413 +v 1.122080 1.562500 -1.904307 +v 1.209955 1.588388 -1.876726 +v 1.062970 1.588388 -1.974938 +v 1.122080 1.562500 -1.904307 +v 1.215913 1.562500 -1.885642 +v 1.068928 1.562500 -1.983854 +v 1.122081 0.875000 -1.904306 +v 1.215913 0.875000 -1.885641 +v 1.068929 0.875000 -1.983854 +v 1.152522 0.786612 -1.883965 +v 1.224829 0.849112 -1.879684 +v 1.120896 0.724111 -1.949130 +v 1.226015 0.750000 -1.834860 +v 1.246355 0.838388 -1.865301 +v 1.246356 0.661612 -1.865301 +v 1.329949 0.750000 -1.765413 +v 1.350289 0.838388 -1.795855 +v 1.350289 0.661612 -1.795855 +v 1.329948 0.750000 -1.765414 +v 1.365856 0.838388 -1.772556 +v 1.365857 0.661612 -1.772556 +v 1.329948 0.750000 -1.765414 +v 1.360390 0.838389 -1.745073 +v 1.360390 0.661612 -1.745073 +v 1.433882 0.625000 -1.695967 +v 1.507374 0.661612 -1.646861 +v 1.452547 0.625000 -1.789799 +v 1.539237 0.661612 -1.807043 +v 1.399395 0.625000 -1.869347 +v 1.448501 0.661612 -1.942839 +v 1.295462 0.625000 -1.938793 +v 1.344568 0.661611 -2.012286 +v 1.148477 0.698223 -2.037005 +v 1.219108 0.724111 -2.096115 +v 1.087593 0.875000 -2.077686 +v 1.167141 0.875000 -2.130838 +v 1.087593 1.562500 -2.077687 +v 1.167140 1.562500 -2.130839 +v 1.067252 1.650888 -2.047245 +v 1.132417 1.713388 -2.078871 +v 1.018146 1.687500 -1.973753 +v 1.048588 1.775888 -1.953413 +v 1.122080 1.812500 -1.904307 +v 1.195572 1.775888 -1.855201 +v 1.220292 1.739277 -2.051291 +v 1.279401 1.713388 -1.980660 +v 1.260973 1.562500 -2.112174 +v 1.314125 1.562500 -2.032627 +v 1.260973 0.875000 -2.112173 +v 1.314125 0.875000 -2.032626 +v 1.291415 0.786611 -2.091833 +v 1.323042 0.849112 -2.026669 +v 1.364908 0.750000 -2.042727 +v 1.344567 0.838389 -2.012286 +v 1.468842 0.750000 -1.973281 +v 1.448501 0.838389 -1.942840 +v 1.575145 0.750000 -1.814186 +v 1.539237 0.838389 -1.807044 +v 1.537816 0.750000 -1.626521 +v 1.507374 0.838389 -1.646862 +v 1.433882 0.875000 -1.695968 +v 1.452546 0.875000 -1.789800 +v 1.399395 0.875000 -1.869347 +v 1.295461 0.875000 -1.938793 +v 1.295461 0.875000 -1.938793 +v 1.295461 0.875000 -1.938793 +v 1.295460 1.562500 -1.938794 +v 1.275120 1.650888 -1.908353 +v 1.226014 1.687500 -1.834861 +v -0.675716 1.687500 -2.115592 +v -0.762406 1.650888 -2.098348 +v -0.589026 1.650888 -2.132836 +v -0.675716 1.687500 -2.115592 +v -0.767457 1.661612 -2.123739 +v -0.594077 1.661612 -2.158226 +v -0.675716 1.687500 -2.115592 +v -0.769549 1.687500 -2.134256 +v -0.596169 1.687500 -2.168744 +v -0.675717 2.375000 -2.115592 +v -0.769550 2.375000 -2.134256 +v -0.596170 2.375000 -2.168743 +v -0.711626 2.463388 -2.108449 +v -0.780067 2.400888 -2.132164 +v -0.657469 2.525889 -2.156550 +v -0.798316 2.500000 -2.091205 +v -0.805458 2.411612 -2.127113 +v -0.805459 2.588389 -2.127113 +v -0.859615 2.500000 -2.079012 +v -0.866757 2.411612 -2.114920 +v -0.866758 2.588389 -2.114920 +v -0.859615 2.500000 -2.079013 +v -0.879955 2.411612 -2.109454 +v -0.879955 2.588389 -2.109453 +v -1.589567 2.499999 -1.591274 +v -1.609908 2.411611 -1.621716 +v -1.609908 2.588387 -1.621715 +v -1.589567 2.499999 -1.591274 +v -1.620009 2.411611 -1.611614 +v -1.620009 2.588387 -1.611614 +v -1.832630 2.499998 -1.227507 +v -1.863071 2.411610 -1.247847 +v -1.863071 2.588387 -1.247847 +v -1.832630 2.499998 -1.227507 +v -1.868538 2.411610 -1.220364 +v -1.868538 2.588387 -1.220364 +v -1.832630 2.499998 -1.227506 +v -1.852970 2.411610 -1.197065 +v -1.852970 2.588387 -1.197065 +v -1.902076 2.624998 -1.123573 +v -1.951182 2.588387 -1.050080 +v -1.955228 2.624998 -1.203120 +v -2.041918 2.588387 -1.185876 +v -1.936564 2.624998 -1.296953 +v -2.010056 2.588387 -1.346058 +v -1.693501 2.624999 -1.660720 +v -1.766993 2.588387 -1.709826 +v -1.659014 2.624999 -1.695208 +v -1.708120 2.588387 -1.768700 +v -0.929061 2.625000 -2.182946 +v -0.978167 2.588388 -2.256438 +v -0.884001 2.625000 -2.201610 +v -0.901245 2.588388 -2.288300 +v -0.822702 2.625000 -2.213803 +v -0.839946 2.588388 -2.300493 +v -0.649322 2.551777 -2.248291 +v -0.691957 2.525889 -2.329930 +v -0.577505 2.375000 -2.262576 +v -0.630657 2.375000 -2.342123 +v -0.577504 1.687500 -2.262576 +v -0.630656 1.687500 -2.342124 +v -0.570362 1.599112 -2.226668 +v -0.618463 1.536612 -2.280825 +v -0.553118 1.562500 -2.139978 +v -0.589026 1.474112 -2.132836 +v -0.675716 1.437500 -2.115592 +v -0.762406 1.474112 -2.098348 +v -0.710204 1.510723 -2.288972 +v -0.791843 1.536612 -2.246337 +v -0.724489 1.687500 -2.360788 +v -0.804036 1.687500 -2.307636 +v -0.724490 2.375000 -2.360788 +v -0.804037 2.375000 -2.307636 +v -0.760398 2.463389 -2.353645 +v -0.814555 2.400888 -2.305544 +v -0.847089 2.500000 -2.336401 +v -0.839946 2.411612 -2.300493 +v -0.908388 2.500000 -2.324208 +v -0.901245 2.411612 -2.288301 +v -0.998507 2.500000 -2.286880 +v -0.978167 2.411612 -2.256438 +v -1.728460 2.499999 -1.799142 +v -1.708119 2.411611 -1.768700 +v -1.797435 2.499999 -1.730167 +v -1.766993 2.411611 -1.709827 +v -2.040497 2.499998 -1.366399 +v -2.010056 2.411610 -1.346059 +v -2.077826 2.499998 -1.178734 +v -2.041918 2.411610 -1.185877 +v -1.971522 2.499998 -1.019639 +v -1.951182 2.411610 -1.050081 +v -1.902076 2.374998 -1.123573 +v -1.955228 2.374998 -1.203120 +v -1.936563 2.374998 -1.296953 +v -1.693501 2.374999 -1.660720 +v -1.659013 2.374999 -1.695208 +v -0.929061 2.375000 -2.182946 +v -0.884001 2.375000 -2.201610 +v -0.822702 2.375000 -2.213803 +v -0.822702 2.375000 -2.213803 +v -0.822702 2.375000 -2.213803 +v -0.822701 1.687500 -2.213803 +v -0.815558 1.599112 -2.177895 +v -0.798314 1.562500 -2.091205 +v -1.904307 1.562500 -1.122080 +v -1.855201 1.599112 -1.195572 +v -1.953413 1.599112 -1.048588 +v -1.904307 1.562500 -1.122080 +v -1.876726 1.588388 -1.209955 +v -1.974938 1.588388 -1.062970 +v -1.904307 1.562500 -1.122080 +v -1.885643 1.562500 -1.215912 +v -1.983854 1.562500 -1.068928 +v -1.904306 0.875000 -1.122081 +v -1.885642 0.875000 -1.215913 +v -1.983854 0.875000 -1.068929 +v -1.883966 0.786612 -1.152522 +v -1.879684 0.849112 -1.224829 +v -1.949130 0.724111 -1.120896 +v -1.834860 0.750000 -1.226015 +v -1.865301 0.838388 -1.246355 +v -1.865302 0.661612 -1.246356 +v -1.765414 0.750000 -1.329948 +v -1.795855 0.838388 -1.350289 +v -1.795855 0.661612 -1.350289 +v -1.765414 0.750000 -1.329948 +v -1.772556 0.838388 -1.365856 +v -1.772556 0.661612 -1.365857 +v -1.765414 0.750000 -1.329948 +v -1.745074 0.838389 -1.360390 +v -1.745073 0.661612 -1.360390 +v -1.695967 0.625000 -1.433882 +v -1.646861 0.661612 -1.507374 +v -1.789799 0.625000 -1.452546 +v -1.807043 0.661612 -1.539237 +v -1.869347 0.625000 -1.399395 +v -1.942840 0.661612 -1.448501 +v -1.938793 0.625000 -1.295461 +v -2.012286 0.661611 -1.344567 +v -2.037005 0.698223 -1.148476 +v -2.096115 0.724111 -1.219108 +v -2.077686 0.875000 -1.087593 +v -2.130838 0.875000 -1.167141 +v -2.077687 1.562500 -1.087592 +v -2.130839 1.562500 -1.167140 +v -2.047245 1.650888 -1.067252 +v -2.078872 1.713388 -1.132416 +v -1.973753 1.687500 -1.018146 +v -1.953413 1.775888 -1.048588 +v -1.904307 1.812500 -1.122080 +v -1.855201 1.775888 -1.195572 +v -2.051291 1.739277 -1.220292 +v -1.980660 1.713388 -1.279401 +v -2.112175 1.562500 -1.260972 +v -2.032627 1.562500 -1.314124 +v -2.112174 0.875000 -1.260973 +v -2.032626 0.875000 -1.314125 +v -2.091833 0.786611 -1.291415 +v -2.026669 0.849112 -1.323041 +v -2.042727 0.750000 -1.364908 +v -2.012286 0.838389 -1.344567 +v -1.973281 0.750000 -1.468842 +v -1.942840 0.838389 -1.448501 +v -1.814186 0.750000 -1.575145 +v -1.807044 0.838389 -1.539236 +v -1.626521 0.750000 -1.537816 +v -1.646862 0.838389 -1.507374 +v -1.695968 0.875000 -1.433882 +v -1.789800 0.875000 -1.452546 +v -1.869347 0.875000 -1.399395 +v -1.938794 0.875000 -1.295461 +v -1.938794 0.875000 -1.295461 +v -1.938793 0.875000 -1.295461 +v -1.938794 1.562500 -1.295460 +v -1.908353 1.650888 -1.275120 +v -1.834861 1.687500 -1.226014 +v -2.115592 1.687500 0.675716 +v -2.098348 1.650888 0.762406 +v -2.132836 1.650888 0.589026 +v -2.115592 1.687500 0.675716 +v -2.123739 1.661612 0.767457 +v -2.158226 1.661612 0.594077 +v -2.115592 1.687500 0.675716 +v -2.134256 1.687500 0.769549 +v -2.168744 1.687500 0.596169 +v -2.115592 2.375000 0.675717 +v -2.134256 2.375000 0.769550 +v -2.168743 2.375000 0.596170 +v -2.108449 2.463388 0.711626 +v -2.132164 2.400888 0.780067 +v -2.156550 2.525889 0.657469 +v -2.091205 2.500000 0.798316 +v -2.127113 2.411612 0.805458 +v -2.127113 2.588389 0.805459 +v -2.079012 2.500000 0.859615 +v -2.114920 2.411612 0.866758 +v -2.114920 2.588389 0.866758 +v -2.079013 2.500000 0.859615 +v -2.109454 2.411612 0.879955 +v -2.109453 2.588389 0.879956 +v -1.591274 2.499999 1.589567 +v -1.621715 2.411611 1.609908 +v -1.621715 2.588387 1.609908 +v -1.591274 2.499999 1.589567 +v -1.611614 2.411611 1.620009 +v -1.611614 2.588387 1.620009 +v -1.227507 2.499998 1.832630 +v -1.247847 2.411610 1.863071 +v -1.247846 2.588387 1.863071 +v -1.227507 2.499998 1.832630 +v -1.220364 2.411610 1.868538 +v -1.220363 2.588387 1.868538 +v -1.227506 2.499998 1.832630 +v -1.197065 2.411610 1.852970 +v -1.197065 2.588387 1.852970 +v -1.123572 2.624998 1.902076 +v -1.050080 2.588387 1.951182 +v -1.203120 2.624998 1.955228 +v -1.185876 2.588387 2.041918 +v -1.296953 2.624998 1.936564 +v -1.346058 2.588387 2.010056 +v -1.660720 2.624999 1.693501 +v -1.709826 2.588387 1.766993 +v -1.695208 2.624999 1.659014 +v -1.768700 2.588387 1.708120 +v -2.182946 2.625000 0.929061 +v -2.256438 2.588388 0.978167 +v -2.201610 2.625000 0.884002 +v -2.288300 2.588388 0.901245 +v -2.213803 2.625000 0.822703 +v -2.300493 2.588388 0.839946 +v -2.248291 2.551777 0.649322 +v -2.329930 2.525889 0.691957 +v -2.262576 2.375000 0.577505 +v -2.342123 2.375000 0.630657 +v -2.262576 1.687500 0.577505 +v -2.342124 1.687500 0.630656 +v -2.226668 1.599112 0.570362 +v -2.280825 1.536612 0.618463 +v -2.139978 1.562500 0.553118 +v -2.132836 1.474112 0.589026 +v -2.115592 1.437500 0.675716 +v -2.098348 1.474112 0.762406 +v -2.288972 1.510723 0.710204 +v -2.246337 1.536612 0.791843 +v -2.360788 1.687500 0.724489 +v -2.307636 1.687500 0.804036 +v -2.360788 2.375000 0.724490 +v -2.307636 2.375000 0.804037 +v -2.353645 2.463389 0.760399 +v -2.305544 2.400888 0.814555 +v -2.336401 2.500000 0.847089 +v -2.300493 2.411612 0.839946 +v -2.324208 2.500000 0.908388 +v -2.288301 2.411612 0.901245 +v -2.286880 2.500000 0.998507 +v -2.256438 2.411612 0.978167 +v -1.799141 2.499999 1.728460 +v -1.768700 2.411611 1.708119 +v -1.730167 2.499999 1.797435 +v -1.709826 2.411611 1.766993 +v -1.366399 2.499998 2.040497 +v -1.346059 2.411610 2.010056 +v -1.178734 2.499998 2.077826 +v -1.185877 2.411610 2.041918 +v -1.019639 2.499998 1.971522 +v -1.050081 2.411610 1.951182 +v -1.123572 2.374998 1.902076 +v -1.203120 2.374998 1.955228 +v -1.296953 2.374998 1.936563 +v -1.660720 2.374999 1.693501 +v -1.695208 2.374999 1.659014 +v -2.182946 2.375000 0.929061 +v -2.201610 2.375000 0.884001 +v -2.213803 2.375000 0.822702 +v -2.213803 2.375000 0.822702 +v -2.213803 2.375000 0.822702 +v -2.213803 1.687500 0.822701 +v -2.177895 1.599112 0.815558 +v -2.091205 1.562500 0.798315 +v -1.122080 1.562500 1.904307 +v -1.195572 1.599112 1.855201 +v -1.048588 1.599112 1.953413 +v -1.122080 1.562500 1.904307 +v -1.209955 1.588388 1.876726 +v -1.062970 1.588388 1.974938 +v -1.122080 1.562500 1.904307 +v -1.215912 1.562500 1.885643 +v -1.068928 1.562500 1.983854 +v -1.122080 0.875000 1.904306 +v -1.215913 0.875000 1.885642 +v -1.068928 0.875000 1.983854 +v -1.152522 0.786612 1.883966 +v -1.224829 0.849112 1.879684 +v -1.120896 0.724111 1.949130 +v -1.226015 0.750000 1.834860 +v -1.246355 0.838388 1.865301 +v -1.246355 0.661612 1.865302 +v -1.329948 0.750000 1.765414 +v -1.350289 0.838388 1.795855 +v -1.350289 0.661612 1.795855 +v -1.329948 0.750000 1.765414 +v -1.365856 0.838388 1.772556 +v -1.365857 0.661612 1.772556 +v -1.329948 0.750000 1.765414 +v -1.360390 0.838389 1.745074 +v -1.360390 0.661612 1.745073 +v -1.433881 0.625000 1.695967 +v -1.507374 0.661612 1.646861 +v -1.452546 0.625000 1.789800 +v -1.539236 0.661612 1.807043 +v -1.399395 0.625000 1.869347 +v -1.448501 0.661612 1.942840 +v -1.295461 0.625000 1.938793 +v -1.344567 0.661611 2.012286 +v -1.148476 0.698223 2.037005 +v -1.219108 0.724111 2.096115 +v -1.087593 0.875000 2.077686 +v -1.167140 0.875000 2.130838 +v -1.087592 1.562500 2.077687 +v -1.167140 1.562500 2.130839 +v -1.067252 1.650888 2.047245 +v -1.132416 1.713388 2.078872 +v -1.018146 1.687500 1.973753 +v -1.048588 1.775888 1.953413 +v -1.122080 1.812500 1.904307 +v -1.195572 1.775888 1.855201 +v -1.220292 1.739277 2.051291 +v -1.279401 1.713388 1.980660 +v -1.260972 1.562500 2.112175 +v -1.314124 1.562500 2.032627 +v -1.260973 0.875000 2.112174 +v -1.314125 0.875000 2.032626 +v -1.291415 0.786611 2.091833 +v -1.323041 0.849112 2.026669 +v -1.364908 0.750000 2.042727 +v -1.344567 0.838389 2.012286 +v -1.468841 0.750000 1.973281 +v -1.448501 0.838389 1.942840 +v -1.575145 0.750000 1.814186 +v -1.539236 0.838389 1.807044 +v -1.537816 0.750000 1.626521 +v -1.507374 0.838389 1.646862 +v -1.433882 0.875000 1.695968 +v -1.452546 0.875000 1.789800 +v -1.399395 0.875000 1.869347 +v -1.295461 0.875000 1.938794 +v -1.295461 0.875000 1.938794 +v -1.295461 0.875000 1.938793 +v -1.295460 1.562500 1.938794 +v -1.275120 1.650888 1.908353 +v -1.226014 1.687500 1.834861 +vn -0.3827 -0.0000 -0.9239 +vn -0.0000 -0.0000 -1.0000 +vn 0.7071 -0.0000 -0.7071 +vn 0.9239 -0.0000 -0.3827 +vn 1.0000 -0.0000 -0.0000 +vn 0.9239 -0.0000 0.3827 +vn 0.7071 -0.0000 0.7071 +vn 0.3827 -0.0000 0.9239 +vn -0.0000 -0.0000 1.0000 +vn -0.3827 -0.0000 0.9239 +vn -0.7071 -0.0000 0.7071 +vn -0.9239 -0.0000 0.3827 +vn -1.0000 -0.0000 -0.0000 +vn -0.9239 -0.0000 -0.3827 +vn -0.7071 -0.0000 -0.7071 +vn 0.3827 -0.0000 -0.9239 +vn 0.2680 -0.7139 -0.6469 +vn -0.0000 -0.7139 -0.7002 +vn -0.0000 0.7139 -0.7002 +vn 0.2680 0.7139 -0.6469 +vn 0.4951 -0.7139 -0.4951 +vn 0.4951 0.7139 -0.4951 +vn 0.6469 -0.7139 -0.2680 +vn 0.6469 0.7139 -0.2680 +vn 0.7002 -0.7139 -0.0000 +vn 0.7002 0.7139 -0.0000 +vn 0.6469 -0.7139 0.2680 +vn 0.6469 0.7139 0.2680 +vn 0.4951 -0.7139 0.4951 +vn 0.4951 0.7139 0.4951 +vn 0.2680 -0.7139 0.6469 +vn 0.2680 0.7139 0.6469 +vn -0.0000 -0.7139 0.7002 +vn -0.0000 0.7139 0.7002 +vn -0.2680 -0.7139 0.6469 +vn -0.2680 0.7139 0.6469 +vn -0.4951 -0.7139 0.4951 +vn -0.4951 0.7139 0.4951 +vn -0.6469 -0.7139 0.2680 +vn -0.6469 0.7139 0.2680 +vn -0.7002 -0.7139 -0.0000 +vn -0.7002 0.7139 -0.0000 +vn -0.6469 -0.7139 -0.2680 +vn -0.6469 0.7139 -0.2680 +vn -0.4951 -0.7139 -0.4951 +vn -0.4951 0.7139 -0.4951 +vn -0.2680 -0.7139 -0.6469 +vn -0.2680 0.7139 -0.6469 +vn -0.0000 -0.7071 -0.7071 +vn 0.2706 -0.7071 -0.6533 +vn 0.5000 -0.7071 -0.5000 +vn -0.5000 -0.7071 -0.5000 +vn -0.2706 -0.7071 -0.6533 +vn -0.6533 -0.7071 -0.2706 +vn -0.7071 -0.7071 -0.0000 +vn -0.6533 -0.7071 0.2706 +vn -0.5000 -0.7071 0.5000 +vn -0.2706 -0.7071 0.6533 +vn -0.0000 -0.7071 0.7071 +vn 0.2706 -0.7071 0.6533 +vn 0.5000 -0.7071 0.5000 +vn 0.6533 -0.7071 0.2706 +vn 0.7071 -0.7071 -0.0000 +vn 0.6533 -0.7071 -0.2706 +vn -0.2706 0.7071 -0.6533 +vn -0.0000 0.7071 -0.7071 vn 0.5000 0.7071 -0.5000 -vn 0.3827 0.0000 -0.9239 -vn -0.3827 0.0000 0.9239 -vn -0.3827 0.0000 -0.9239 -vn 0.3827 0.0000 0.9239 -vn -0.9239 0.0000 -0.3827 -vn 0.9999 0.0000 -0.0139 -vn 0.8908 0.4542 -0.0095 -vn 0.6273 0.4613 0.6273 -vn 0.0139 0.0000 -0.9999 -vn -0.8908 0.4542 0.0095 -vn -0.6273 0.4613 -0.6273 -vn -0.0095 0.4542 0.8908 -vn -0.0163 0.4541 0.8908 -vn 0.6324 0.4472 -0.6324 -vn 0.0163 0.4541 -0.8908 -vn 0.0095 0.4542 -0.8908 -vn -0.0139 0.0000 0.9999 -vn -0.6324 0.4472 0.6324 -vn -0.8908 0.4541 0.0163 -vn 0.8908 0.4541 -0.0163 -vn -0.9999 0.0000 0.0139 -vn 0.0887 0.9921 0.0887 -vn 0.6124 0.5000 -0.6124 -vn 0.6501 0.5268 -0.5476 -vn 0.5829 -0.4652 -0.6661 -vn -0.6661 -0.4652 0.5829 -vn -0.0963 -0.9907 -0.0963 -vn -0.5476 0.5268 0.6501 -vn -0.6124 -0.5000 0.6124 -vn -0.6124 0.5000 0.6124 -vn 0.6124 -0.5000 -0.6124 -vn 0.7841 0.4827 -0.3901 -vn 0.4846 -0.3745 -0.7905 -vn -0.3535 -0.8660 -0.3535 -vn -0.7905 -0.3745 0.4846 -vn -0.3901 0.4827 0.7841 -vn 0.6124 0.5000 0.6124 -vn 0.3535 0.8660 0.3535 -vn 0.9284 0.2786 -0.2458 -vn 0.3727 -0.2162 -0.9024 -vn -0.9024 -0.2162 0.3727 -vn 0.6830 0.2588 0.6830 -vn 0.9704 0.1477 -0.1909 -vn 0.3295 -0.1151 -0.9371 -vn -0.6124 -0.5000 -0.6124 -vn -0.6830 -0.2588 -0.6830 -vn -0.1909 0.1477 0.9704 -vn -0.2458 0.2786 0.9284 -vn -0.9371 -0.1151 0.3295 -vn 0.9239 0.0000 0.3827 -vn -0.9239 0.0000 0.3827 -vn 0.9239 0.0000 -0.3827 +vn 0.6533 0.7071 -0.2706 +vn 0.7071 0.7071 -0.0000 +vn 0.6533 0.7071 0.2706 vn 0.5000 0.7071 0.5000 +vn 0.2706 0.7071 0.6533 +vn -0.0000 0.7071 0.7071 +vn -0.2706 0.7071 0.6533 +vn -0.5000 0.7071 0.5000 +vn -0.6533 0.7071 0.2706 +vn -0.7071 0.7071 -0.0000 +vn -0.6533 0.7071 -0.2706 vn -0.5000 0.7071 -0.5000 -vn -0.0887 0.9921 -0.0887 -vn -0.5829 -0.4652 0.6661 -vn -0.6501 0.5268 0.5476 -vn 0.6661 -0.4652 -0.5829 -vn 0.0963 -0.9907 0.0963 -vn 0.5476 0.5268 -0.6501 -vn -0.3535 0.8660 -0.3535 -vn -0.4846 -0.3745 0.7905 -vn 0.3535 -0.8660 0.3535 -vn 0.7905 -0.3745 -0.4846 -vn -0.6124 0.5000 -0.6124 -vn -0.7841 0.4827 0.3901 -vn -0.9284 0.2786 0.2458 -vn -0.3727 -0.2162 0.9024 -vn 0.6124 -0.5000 0.6124 -vn 0.9024 -0.2162 -0.3727 -vn 0.3901 0.4827 -0.7841 -vn -0.6830 0.2588 -0.6830 -vn -0.9704 0.1477 0.1909 -vn 0.6830 -0.2588 0.6830 -vn 0.9371 -0.1151 -0.3295 -vn 0.1909 0.1477 -0.9704 -vn 0.2458 0.2786 -0.9284 -vn -0.3295 -0.1151 0.9371 -s off -f 347/49/21 348/50/21 35/51/21 -f 351/52/22 352/53/22 39/54/22 -f 343/55/23 344/56/23 37/57/23 -f 355/58/24 356/59/24 33/60/24 -f 39/61/25 33/60/25 35/62/25 -f 52/63/26 95/64/26 54/65/26 -f 49/66/25 76/67/25 47/68/25 -f 57/69/25 82/70/25 81/71/25 -f 67/72/25 87/73/25 86/74/25 -f 45/75/25 74/76/25 43/77/25 -f 53/78/25 80/79/25 79/80/25 -f 65/81/25 84/82/25 63/83/25 -f 51/84/25 77/85/25 49/86/25 -f 61/87/25 82/88/25 59/89/25 -f 69/90/25 88/91/25 87/92/25 -f 47/93/25 75/94/25 45/95/25 -f 57/96/25 80/97/25 55/98/25 -f 43/99/25 73/100/25 41/101/25 -f 65/102/25 86/103/25 85/104/25 -f 51/105/25 79/106/25 78/107/25 -f 63/108/25 83/109/25 61/110/25 -f 71/111/25 73/112/25 88/113/25 -f 64/114/26 99/115/26 100/116/26 -f 72/117/26 90/118/26 42/119/26 -f 48/120/26 93/121/26 50/122/26 -f 58/123/26 98/124/26 60/125/26 -f 68/126/26 103/127/26 70/128/26 -f 46/129/26 89/130/26 91/131/26 -f 54/132/26 96/133/26 56/134/26 -f 66/135/26 100/136/26 101/137/26 -f 50/138/26 94/139/26 52/140/26 -f 62/141/26 98/142/26 99/143/26 -f 70/144/26 104/145/26 72/146/26 -f 46/147/26 92/148/26 48/149/26 -f 58/150/26 96/151/26 97/152/26 -f 44/153/26 90/154/26 89/155/26 -f 68/156/26 101/157/26 102/158/26 -f 115/159/26 111/160/26 107/161/26 -f 143/162/26 141/163/26 139/164/26 -f 163/165/26 166/166/26 164/167/26 -f 330/168/24 340/169/24 332/170/24 -f 187/171/26 190/172/26 188/173/26 -f 325/174/23 337/175/23 329/176/23 -f 339/177/21 328/178/21 331/179/21 -f 335/180/22 326/181/22 327/182/22 -f 255/183/27 254/184/27 256/185/27 -f 255/183/28 260/186/28 259/187/28 -f 253/188/29 258/189/29 254/184/29 -f 255/183/30 257/190/30 253/188/30 -f 296/191/26 295/192/26 294/193/26 -f 306/194/26 304/195/26 302/196/26 -f 312/197/26 311/198/26 310/199/26 -f 322/200/26 320/201/26 318/202/26 -f 348/203/21 347/204/21 379/205/21 -f 346/206/21 345/207/21 377/208/21 -f 356/209/24 355/210/24 387/211/24 -f 354/212/24 353/213/24 385/214/24 -f 344/215/23 343/216/23 375/217/23 -f 342/218/23 341/219/23 373/220/23 -f 352/221/22 351/222/22 383/223/22 -f 350/224/22 349/225/22 381/226/22 -f 412/227/31 364/228/31 380/229/31 -f 379/205/32 412/227/32 380/229/32 -f 411/230/33 363/231/33 407/232/33 -f 410/233/31 362/234/31 378/235/31 -f 377/208/32 410/233/32 378/235/32 -f 409/236/33 361/237/33 405/238/33 -f 401/239/34 372/240/34 388/241/34 -f 402/242/35 388/241/35 387/211/35 -f 402/242/31 371/243/31 398/244/31 -f 403/245/34 370/246/34 386/247/34 -f 404/248/35 386/247/35 385/214/35 -f 404/248/31 369/249/31 400/250/31 -f 418/251/34 359/252/34 414/253/34 -f 375/217/36 417/254/36 376/255/36 -f 417/254/37 360/256/37 376/255/37 -f 419/257/37 358/258/37 374/259/37 -f 420/260/36 374/259/36 373/220/36 -f 420/260/34 357/261/34 416/262/34 -f 396/263/33 368/264/33 384/265/33 -f 383/223/38 396/263/38 384/265/38 -f 395/266/37 367/267/37 391/268/37 -f 394/269/33 366/270/33 382/271/33 -f 381/226/38 394/269/38 382/271/38 -f 393/272/37 365/273/37 389/274/37 -f 367/275/21 351/222/21 391/276/21 -f 366/277/23 390/278/23 350/224/23 -f 364/279/22 408/280/22 348/203/22 -f 357/281/22 341/219/22 416/282/22 -f 368/283/23 392/284/23 352/221/23 -f 359/285/22 343/216/22 414/286/22 -f 358/287/24 415/288/24 342/218/24 -f 360/289/24 413/290/24 344/215/24 -f 369/291/23 353/213/23 400/292/23 -f 371/293/23 355/210/23 398/294/23 -f 370/295/21 399/296/21 354/212/21 -f 372/297/21 397/298/21 356/209/21 -f 361/299/24 345/207/24 405/300/24 -f 363/301/24 347/204/24 407/302/24 -f 362/303/22 406/304/22 346/206/22 -f 365/305/21 349/225/21 389/306/21 -f 390/307/26 351/308/26 350/309/26 -f 346/310/26 407/311/26 347/312/26 -f 399/313/26 355/58/26 354/314/26 -f 342/315/26 414/316/26 343/317/26 -f 416/318/26 341/319/26 40/320/26 -f 389/321/26 349/322/26 36/323/26 -f 405/324/26 345/325/26 34/326/26 -f 400/327/26 353/328/26 38/329/26 -f 400/330/22 403/245/22 404/248/22 -f 395/266/24 392/331/24 396/263/24 -f 418/251/21 413/332/21 417/254/21 -f 416/333/21 419/257/21 420/260/21 -f 389/334/24 394/269/24 393/272/24 -f 411/230/23 408/335/23 412/227/23 -f 405/336/23 410/233/23 409/236/23 -f 402/242/22 397/337/22 401/239/22 -f 414/316/26 415/338/26 406/339/26 -f 423/340/39 422/341/39 424/342/39 -f 423/340/29 428/343/29 427/344/29 -f 421/345/28 426/346/28 422/341/28 -f 423/340/40 425/347/40 421/345/40 -f 448/348/26 447/349/26 451/350/26 -f 471/351/26 474/352/26 472/353/26 -f 35/51/21 33/354/21 346/355/21 -f 33/354/21 34/356/21 345/357/21 -f 345/357/21 346/355/21 33/354/21 -f 346/355/21 347/49/21 35/51/21 -f 348/50/21 36/358/21 35/51/21 -f 39/54/22 35/359/22 350/360/22 -f 35/359/22 36/361/22 349/362/22 -f 349/362/22 350/360/22 35/359/22 -f 350/360/22 351/52/22 39/54/22 -f 352/53/22 40/363/22 39/54/22 -f 37/57/23 39/364/23 342/365/23 -f 39/364/23 40/366/23 341/367/23 -f 341/367/23 342/365/23 39/364/23 -f 342/365/23 343/55/23 37/57/23 -f 344/56/23 38/368/23 37/57/23 -f 33/60/24 37/369/24 354/314/24 -f 37/369/24 38/329/24 353/328/24 -f 353/328/24 354/314/24 37/369/24 -f 354/314/24 355/58/24 33/60/24 -f 356/59/24 34/326/24 33/60/24 -f 39/61/25 37/369/25 33/60/25 -f 52/63/26 94/370/26 95/64/26 -f 49/66/25 77/371/25 76/67/25 -f 57/69/25 59/372/25 82/70/25 -f 67/72/25 69/373/25 87/73/25 -f 45/75/25 75/374/25 74/76/25 -f 53/78/25 55/375/25 80/79/25 -f 65/81/25 85/376/25 84/82/25 -f 51/84/25 78/377/25 77/85/25 -f 61/87/25 83/378/25 82/88/25 -f 69/90/25 71/379/25 88/91/25 -f 47/93/25 76/380/25 75/94/25 -f 57/96/25 81/381/25 80/97/25 -f 43/99/25 74/382/25 73/100/25 -f 65/102/25 67/383/25 86/103/25 -f 51/105/25 53/384/25 79/106/25 -f 63/108/25 84/385/25 83/109/25 -f 71/111/25 41/386/25 73/112/25 -f 64/114/26 62/387/26 99/115/26 -f 72/117/26 104/388/26 90/118/26 -f 48/120/26 92/389/26 93/121/26 -f 58/123/26 97/390/26 98/124/26 -f 68/126/26 102/391/26 103/127/26 -f 46/129/26 44/392/26 89/130/26 -f 54/132/26 95/393/26 96/133/26 -f 66/135/26 64/394/26 100/136/26 -f 50/138/26 93/395/26 94/139/26 -f 62/141/26 60/396/26 98/142/26 -f 70/144/26 103/397/26 104/145/26 -f 46/147/26 91/398/26 92/148/26 -f 58/150/26 56/399/26 96/151/26 -f 44/153/26 42/400/26 90/154/26 -f 68/156/26 66/401/26 101/157/26 -f 107/161/26 105/402/26 106/403/26 -f 106/403/26 120/404/26 107/161/26 -f 120/404/26 119/405/26 107/161/26 -f 119/405/26 118/406/26 115/159/26 -f 118/406/26 117/407/26 115/159/26 -f 117/407/26 116/408/26 115/159/26 -f 115/159/26 114/409/26 113/410/26 -f 113/410/26 112/411/26 111/160/26 -f 111/160/26 110/412/26 109/413/26 -f 109/413/26 108/414/26 107/161/26 -f 115/159/26 113/410/26 111/160/26 -f 111/160/26 109/413/26 107/161/26 -f 107/161/26 119/405/26 115/159/26 -f 139/164/26 122/415/26 121/416/26 -f 121/416/26 144/417/26 143/162/26 -f 143/162/26 142/418/26 141/163/26 -f 141/163/26 140/419/26 139/164/26 -f 139/164/26 121/416/26 143/162/26 -f 163/165/26 146/420/26 168/421/26 -f 146/420/26 145/422/26 168/421/26 -f 168/421/26 167/423/26 163/165/26 -f 167/423/26 166/166/26 163/165/26 -f 166/166/26 165/424/26 164/167/26 -f 330/168/24 338/425/24 340/169/24 -f 187/171/26 170/426/26 192/427/26 -f 170/426/26 169/428/26 192/427/26 -f 192/427/26 191/429/26 187/171/26 -f 191/429/26 190/172/26 187/171/26 -f 190/172/26 189/430/26 188/173/26 -f 325/174/23 333/431/23 337/175/23 -f 339/177/21 336/432/21 328/178/21 -f 335/180/22 334/433/22 326/181/22 -f 255/183/27 253/188/27 254/184/27 -f 255/183/28 256/185/28 260/186/28 -f 253/188/29 257/434/29 258/189/29 -f 255/183/30 259/435/30 257/190/30 -f 294/193/26 293/436/26 298/437/26 -f 293/436/26 300/438/26 298/437/26 -f 300/438/26 299/439/26 298/437/26 -f 298/437/26 297/440/26 294/193/26 -f 297/440/26 296/191/26 294/193/26 -f 302/196/26 301/441/26 308/442/26 -f 308/442/26 307/443/26 302/196/26 -f 307/443/26 306/194/26 302/196/26 -f 306/194/26 305/444/26 304/195/26 -f 304/195/26 303/445/26 302/196/26 -f 310/199/26 309/446/26 314/447/26 -f 309/446/26 316/448/26 314/447/26 -f 316/448/26 315/449/26 314/447/26 -f 314/447/26 313/450/26 310/199/26 -f 313/450/26 312/197/26 310/199/26 -f 318/202/26 317/451/26 324/452/26 -f 324/452/26 323/453/26 318/202/26 -f 323/453/26 322/200/26 318/202/26 -f 322/200/26 321/454/26 320/201/26 -f 320/201/26 319/455/26 318/202/26 -f 347/204/21 363/301/21 379/205/21 -f 379/205/21 380/229/21 348/203/21 -f 380/229/21 364/279/21 348/203/21 -f 345/207/21 361/299/21 377/208/21 -f 377/208/21 378/235/21 346/206/21 -f 378/235/21 362/303/21 346/206/21 -f 355/210/24 371/293/24 387/211/24 -f 387/211/24 388/241/24 356/209/24 -f 388/241/24 372/297/24 356/209/24 -f 353/213/24 369/291/24 385/214/24 -f 385/214/24 386/247/24 354/212/24 -f 386/247/24 370/295/24 354/212/24 -f 343/216/23 359/285/23 375/217/23 -f 375/217/23 376/255/23 344/215/23 -f 376/255/23 360/289/23 344/215/23 -f 341/219/23 357/281/23 373/220/23 -f 373/220/23 374/259/23 342/218/23 -f 374/259/23 358/287/23 342/218/23 -f 351/222/22 367/275/22 383/223/22 -f 383/223/22 384/265/22 352/221/22 -f 384/265/22 368/283/22 352/221/22 -f 349/225/22 365/305/22 381/226/22 -f 381/226/22 382/271/22 350/224/22 -f 382/271/22 366/277/22 350/224/22 -f 412/227/31 408/456/31 364/228/31 -f 379/205/32 411/230/32 412/227/32 -f 411/230/33 379/205/33 363/231/33 -f 410/233/31 406/457/31 362/234/31 -f 377/208/32 409/236/32 410/233/32 -f 409/236/33 377/208/33 361/237/33 -f 401/239/34 397/458/34 372/240/34 -f 402/242/35 401/239/35 388/241/35 -f 402/242/31 387/211/31 371/243/31 -f 403/245/34 399/459/34 370/246/34 -f 404/248/35 403/245/35 386/247/35 -f 404/248/31 385/214/31 369/249/31 -f 418/251/34 375/217/34 359/252/34 -f 375/217/36 418/251/36 417/254/36 -f 417/254/37 413/460/37 360/256/37 -f 419/257/37 415/461/37 358/258/37 -f 420/260/36 419/257/36 374/259/36 -f 420/260/34 373/220/34 357/261/34 -f 396/263/33 392/462/33 368/264/33 -f 383/223/38 395/266/38 396/263/38 -f 395/266/37 383/223/37 367/267/37 -f 394/269/33 390/463/33 366/270/33 -f 381/226/38 393/272/38 394/269/38 -f 393/272/37 381/226/37 365/273/37 -f 390/307/26 391/464/26 351/308/26 -f 346/310/26 406/339/26 407/311/26 -f 399/313/26 398/465/26 355/58/26 -f 342/315/26 415/338/26 414/316/26 -f 40/320/26 352/466/26 392/467/26 -f 392/467/26 416/318/26 40/320/26 -f 36/323/26 348/468/26 408/469/26 -f 408/469/26 389/321/26 36/323/26 -f 34/326/26 356/59/26 397/470/26 -f 397/470/26 405/324/26 34/326/26 -f 38/329/26 344/471/26 413/472/26 -f 413/472/26 400/327/26 38/329/26 -f 400/330/22 399/473/22 403/245/22 -f 395/266/24 391/474/24 392/331/24 -f 418/251/21 414/475/21 413/332/21 -f 416/333/21 415/476/21 419/257/21 -f 389/334/24 390/477/24 394/269/24 -f 411/230/23 407/478/23 408/335/23 -f 405/336/23 406/479/23 410/233/23 -f 402/242/22 398/480/22 397/337/22 -f 392/467/26 391/464/26 416/318/26 -f 391/464/26 390/307/26 415/338/26 -f 416/318/26 391/464/26 415/338/26 -f 390/307/26 389/321/26 408/469/26 -f 390/307/26 408/469/26 407/311/26 -f 390/307/26 407/311/26 415/338/26 -f 407/311/26 406/339/26 415/338/26 -f 406/339/26 405/324/26 397/470/26 -f 398/465/26 399/313/26 406/339/26 -f 399/313/26 400/327/26 414/316/26 -f 406/339/26 399/313/26 414/316/26 -f 406/339/26 397/470/26 398/465/26 -f 400/327/26 413/472/26 414/316/26 -f 423/340/39 421/345/39 422/341/39 -f 423/340/29 424/342/29 428/343/29 -f 421/345/28 425/481/28 426/346/28 -f 423/340/40 427/482/40 425/347/40 -f 447/349/26 430/483/26 452/484/26 -f 430/483/26 429/485/26 452/484/26 -f 452/484/26 451/350/26 447/349/26 -f 451/350/26 450/486/26 448/348/26 -f 450/486/26 449/487/26 448/348/26 -f 471/351/26 454/488/26 476/489/26 -f 454/488/26 453/490/26 476/489/26 -f 476/489/26 475/491/26 471/351/26 -f 475/491/26 474/352/26 471/351/26 -f 474/352/26 473/492/26 472/353/26 +vn 0.2706 0.7071 -0.6533 +vn -0.0000 1.0000 -0.0000 +vn 0.0203 -0.0000 -0.9998 +vn 0.5175 -0.0000 -0.8557 +vn 0.8760 -0.0000 -0.4823 +vn 0.9998 -0.0000 0.0203 +vn 0.8557 -0.0000 0.5175 +vn 0.4823 -0.0000 0.8760 +vn -0.0203 -0.0000 0.9998 +vn -0.5175 -0.0000 0.8557 +vn -0.8760 -0.0000 0.4823 +vn -0.9998 -0.0000 -0.0203 +vn -0.8557 -0.0000 -0.5175 +vn -0.4823 -0.0000 -0.8760 +vn -0.0000 -1.0000 -0.0000 +vn -0.1951 -0.0000 0.9808 +vn -0.9808 -0.0000 0.1951 +vn -0.1951 -0.0000 -0.9808 +vn 0.9808 -0.0000 0.1951 +vn 0.1951 -0.0000 0.9808 +vn 0.1951 -0.0000 -0.9808 +vn 0.9808 -0.0000 -0.1951 +vn -0.9808 -0.0000 -0.1951 +vn 0.5774 0.5774 -0.5774 +vn 0.5774 0.5773 -0.5774 +vn -0.5774 0.5774 0.5774 +vn -0.5774 0.5773 0.5774 +vn 0.5774 0.5774 0.5774 +vn 0.5774 0.5773 0.5774 +vn -0.5774 0.5774 -0.5774 +vn -0.5774 0.5773 -0.5774 +vn 0.1379 0.7071 -0.6935 +vn -0.1379 0.7071 0.6935 +vn -0.1380 0.7071 0.6935 +vn 0.1379 -0.7071 -0.6935 +vn 0.1380 0.7071 -0.6935 +vn -0.1379 -0.7071 0.6935 +vn 0.6935 0.7071 0.1379 +vn -0.6935 0.7071 -0.1379 +vn 0.6935 -0.7071 0.1379 +vn -0.6935 -0.7071 -0.1379 +vn -0.5547 0.8321 -0.0000 +vn -0.0000 0.8321 -0.5547 +vn 0.5547 0.8321 -0.0000 +vn -0.0000 0.8321 0.5547 +vn 0.6661 0.6303 -0.3987 +vn -0.0104 0.9876 -0.1568 +vn 0.6527 0.4617 -0.6006 +vn -0.0377 0.9975 -0.0600 +vn -0.8329 0.4617 -0.3051 +vn -0.1132 0.7168 -0.6880 +vn 0.5809 0.1363 -0.8025 +vn -0.8438 0.1363 -0.5191 +vn -0.2412 0.0196 -0.9703 +vn 0.5191 -0.1363 -0.8438 +vn -0.2600 0.0671 -0.9633 +vn 0.3051 -0.4617 -0.8329 +vn -0.8381 0.1448 -0.5260 +vn -0.0080 -0.6737 -0.7389 +vn -0.6485 0.5294 -0.5470 +vn -0.2140 0.0473 -0.9757 +vn -0.2022 -0.7180 -0.6660 +vn -0.2745 0.7194 -0.6381 +vn 0.5197 0.0747 -0.8511 +vn 0.6052 0.0955 -0.7903 +vn -0.3279 -0.7180 -0.6140 +vn -0.3279 0.7180 -0.6140 +vn -0.3878 0.7249 -0.5693 +vn -0.4418 -0.7180 -0.5379 +vn -0.5799 0.7125 -0.3950 +vn -0.5379 -0.7180 -0.4418 +vn -0.5379 0.7180 -0.4418 +vn -0.6192 -0.2850 -0.7317 +vn -0.6359 -0.7263 -0.2610 +vn -0.8686 -0.4712 -0.1532 +vn -0.6404 -0.7574 0.1274 +vn -0.6359 0.7263 -0.2610 +vn -0.5673 -0.7311 0.3790 +vn -0.5673 0.7311 0.3791 +vn -0.8535 0.0462 0.5191 +vn -0.6404 0.7574 0.1274 +vn 0.0853 0.9947 -0.0570 +vn 0.0930 0.9955 -0.0185 +vn 0.6435 0.6333 -0.4300 +vn 0.0502 0.9987 0.0100 +vn 0.7342 0.6630 -0.1460 +vn 0.5563 0.6942 0.4568 +vn 0.0172 0.9997 0.0172 +vn -0.4418 0.7180 -0.5379 +vn 0.0093 0.9997 0.0225 +vn 0.4568 0.6942 0.5563 +vn 0.2092 0.6942 0.6887 +vn -0.2023 0.7180 -0.6660 +vn -0.1830 0.9824 0.0364 +vn -0.3898 0.5294 0.7535 +vn -0.6935 0.7071 0.1380 +vn -0.5730 0.1448 0.8067 +vn -0.9636 0.1866 0.1917 +vn -0.5260 -0.1448 0.8381 +vn -0.9703 -0.0196 0.2412 +vn -0.9633 -0.0671 0.2600 +vn -0.9679 -0.0948 0.2326 +vn -0.5470 -0.5294 0.6485 +vn -0.7680 0.6303 -0.1134 +vn 0.0747 -0.9239 0.3753 +vn -0.5633 -0.7150 0.4140 +vn 0.7535 -0.5294 0.3898 +vn 0.1379 -0.7071 0.6935 +vn 0.8067 -0.1448 0.5730 +vn 0.1917 -0.1866 0.9636 +vn 0.8025 -0.1363 0.5809 +vn 0.1485 0.0196 0.9887 +vn 0.6006 -0.4617 0.6527 +vn 0.1284 0.0671 0.9894 +vn 0.2754 -0.6737 0.6858 +vn 0.1756 0.0473 0.9833 +vn -0.0094 0.7194 0.6946 +vn 0.2092 -0.6942 0.6887 +vn 0.2881 -0.0000 0.9576 +vn 0.3391 -0.6942 0.6349 +vn 0.4734 -0.0000 0.8809 +vn 0.3391 0.6942 0.6349 +vn 0.4568 -0.6942 0.5563 +vn 0.6326 -0.0000 0.7744 +vn 0.5563 -0.6942 0.4568 +vn 0.7744 -0.0000 0.6326 +vn 0.6785 -0.6794 0.2793 +vn 0.9205 -0.0000 0.3907 +vn 0.6785 0.6794 0.2793 +vn 0.7342 -0.6630 -0.1460 +vn 0.6435 -0.6333 -0.4300 +vn 0.8315 -0.0000 -0.5556 +vn 0.0853 -0.9947 -0.0570 +vn 0.0930 -0.9955 -0.0185 +vn 0.0502 -0.9987 0.0100 +vn 0.0172 -0.9997 0.0172 +vn 0.0093 -0.9997 0.0225 +vn -0.2894 -0.9565 0.0359 +vn -0.0101 -0.9846 -0.1748 +vn 0.9848 -0.1268 -0.1191 +vn 0.9887 -0.0196 -0.1485 +vn 0.9894 -0.0671 -0.1284 +vn 0.9833 -0.0948 -0.1556 +vn 0.6789 -0.7150 0.1669 +vn -0.6233 -0.6303 0.4628 +vn -0.0502 0.9982 -0.0336 +vn -0.8047 -0.4617 0.3732 +vn -0.0100 0.9987 -0.0504 +vn 0.0369 -0.4617 -0.8863 +vn -0.6123 0.6931 -0.3803 +vn -0.9637 -0.1363 0.2296 +vn -0.1567 -0.1363 -0.9782 +vn -0.9782 0.1363 0.1567 +vn -0.8041 -0.0196 -0.5942 +vn -0.7905 -0.0671 -0.6088 +vn -0.8862 0.4618 -0.0368 +vn -0.1652 -0.1448 -0.9756 +vn -0.8195 -0.0473 -0.5711 +vn -0.6796 0.6737 -0.2902 +vn -0.2572 -0.5294 -0.8085 +vn -0.9262 -0.3535 -0.1312 +vn -0.4844 0.7263 -0.4876 +vn -0.4845 -0.7194 -0.4978 +vn 0.5559 -0.2962 0.7767 +vn -0.1274 0.7573 -0.6405 +vn -0.1274 -0.7574 -0.6404 +vn 0.0301 -0.7465 0.6647 +vn 0.1331 0.7311 -0.6692 +vn 0.1331 -0.7311 -0.6691 +vn -0.0200 -0.9947 0.1006 +vn 0.0185 -0.9955 0.0930 +vn -0.1510 -0.6333 0.7591 +vn 0.0284 -0.9987 0.0426 +vn 0.1460 -0.6630 0.7342 +vn -0.4845 -0.7263 -0.4876 +vn 0.6453 -0.7194 0.2571 +vn 0.1036 -0.9824 -0.1551 +vn 0.8454 -0.5294 -0.0718 +vn 0.3928 -0.7071 -0.5879 +vn 0.9645 -0.1448 -0.2207 +vn 0.5458 -0.1866 -0.8169 +vn 0.9756 0.1448 -0.1652 +vn 0.5942 0.0196 -0.8041 +vn 0.8085 0.5294 -0.2572 +vn 0.6088 0.0671 -0.7905 +vn 0.5853 0.0948 -0.8053 +vn 0.1891 -0.6303 -0.7529 +vn 0.5981 0.7150 -0.3620 +vn 0.5879 0.7071 0.3928 +vn -0.1056 0.7150 0.6911 +vn 0.3182 0.9239 0.2126 +vn 0.2207 0.1448 0.9645 +vn 0.8169 0.1866 0.5458 +vn 0.2296 0.1363 0.9637 +vn 0.8567 -0.0196 0.5155 +vn 0.3732 0.4617 0.8047 +vn 0.8650 -0.0671 0.4973 +vn 0.8413 -0.0473 0.5386 +vn 0.5177 0.6794 0.5200 +vn 0.7132 -0.0000 0.7009 +vn 0.5177 -0.6794 0.5200 +vn 0.1460 0.6630 0.7342 +vn -0.1510 0.6333 0.7591 +vn 0.0185 0.9955 0.0930 +vn -0.0200 0.9947 0.1006 +vn 0.0284 0.9987 0.0426 +vn -0.1958 0.9802 0.0285 +vn 0.5282 0.6737 0.5168 +vn -0.4576 0.8872 0.0591 +vn -0.3875 0.7470 0.5402 +vn -0.5155 0.0196 0.8567 +vn -0.4973 0.0671 0.8650 +vn 0.0718 0.5294 0.8454 +vn -0.5200 0.0948 0.8489 +vn -0.3987 0.6303 -0.6661 +vn 0.4349 0.9004 0.0134 +vn -0.6006 0.4617 -0.6527 +vn 0.1147 0.9925 0.0415 +vn -0.3051 0.4617 0.8329 +vn -0.6880 0.7168 0.1132 +vn -0.8025 0.1363 -0.5809 +vn -0.5191 0.1363 0.8438 +vn -0.8438 -0.1363 -0.5191 +vn -0.9703 0.0196 0.2412 +vn -0.9633 0.0671 0.2600 +vn -0.8329 -0.4617 -0.3051 +vn -0.5260 0.1448 0.8381 +vn -0.7389 -0.6737 0.0080 +vn -0.5470 0.5294 0.6485 +vn -0.9757 0.0473 0.2140 +vn -0.7859 -0.0309 -0.6176 +vn -0.6660 -0.7180 0.2022 +vn -0.6381 0.7194 0.2745 +vn -0.6060 -0.0995 -0.7892 +vn -0.6140 -0.7180 0.3279 +vn -0.6140 0.7180 0.3279 +vn -0.5693 0.7250 0.3878 +vn -0.5379 -0.7180 0.4418 +vn -0.3950 0.7125 0.5799 +vn -0.4418 -0.7180 0.5379 +vn -0.4418 0.7180 0.5379 +vn -0.8487 -0.1191 0.5153 +vn -0.2610 -0.7263 0.6359 +vn -0.5972 -0.0586 0.8000 +vn 0.1274 -0.7574 0.6404 +vn -0.2610 0.7263 0.6359 +vn 0.3790 -0.7311 0.5673 +vn 0.3791 0.7311 0.5673 +vn 0.4328 0.2521 0.8655 +vn 0.1274 0.7574 0.6404 +vn -0.0570 0.9947 -0.0853 +vn -0.0185 0.9955 -0.0930 +vn -0.4300 0.6333 -0.6435 +vn 0.2793 0.6794 -0.6785 +vn 0.0100 0.9987 -0.0502 +vn 0.4568 0.6942 -0.5563 +vn 0.0172 0.9997 -0.0172 +vn -0.5379 0.7180 0.4418 +vn 0.0225 0.9997 -0.0093 +vn 0.5563 0.6942 -0.4568 +vn 0.6887 0.6942 -0.2092 +vn -0.6660 0.7180 0.2023 +vn 0.0364 0.9824 0.1830 +vn 0.7535 0.5294 0.3898 +vn 0.1380 0.7071 0.6935 +vn 0.8067 0.1448 0.5730 +vn 0.1917 0.1866 0.9636 +vn 0.8381 -0.1448 0.5260 +vn 0.2412 -0.0196 0.9703 +vn 0.6485 -0.5294 0.5470 +vn 0.2600 -0.0671 0.9633 +vn 0.2326 -0.0948 0.9679 +vn -0.1134 0.6303 0.7680 +vn 0.4140 -0.7150 0.5633 +vn 0.6935 -0.7071 -0.1380 +vn 0.3753 -0.9239 -0.0747 +vn 0.3898 -0.5294 -0.7535 +vn 0.5730 -0.1448 -0.8067 +vn 0.9636 -0.1866 -0.1917 +vn 0.5809 -0.1363 -0.8025 +vn 0.9887 0.0196 -0.1485 +vn 0.6527 -0.4617 -0.6006 +vn 0.9894 0.0671 -0.1284 +vn 0.6858 -0.6737 -0.2754 +vn 0.9833 0.0473 -0.1756 +vn 0.6946 0.7194 0.0094 +vn 0.6887 -0.6942 -0.2092 +vn 0.9576 -0.0000 -0.2881 +vn 0.6349 -0.6942 -0.3391 +vn 0.8809 -0.0000 -0.4734 +vn 0.6349 0.6942 -0.3391 +vn 0.5563 -0.6942 -0.4568 +vn 0.7744 -0.0000 -0.6326 +vn 0.4568 -0.6942 -0.5563 +vn 0.6326 -0.0000 -0.7744 +vn 0.2793 -0.6794 -0.6785 +vn 0.3907 -0.0000 -0.9205 +vn -0.1460 -0.6630 -0.7342 +vn -0.1460 0.6630 -0.7342 +vn -0.4300 -0.6333 -0.6435 +vn -0.5556 -0.0000 -0.8315 +vn -0.0185 -0.9955 -0.0930 +vn -0.0570 -0.9947 -0.0853 +vn 0.0100 -0.9987 -0.0502 +vn 0.0172 -0.9997 -0.0172 +vn 0.0225 -0.9997 -0.0093 +vn 0.1117 -0.9858 0.1257 +vn -0.0452 -0.9544 -0.2951 +vn -0.1895 0.5541 -0.8106 +vn -0.1485 -0.0196 -0.9887 +vn -0.1284 -0.0671 -0.9894 +vn -0.1556 -0.0948 -0.9833 +vn 0.1669 -0.7150 -0.6789 +vn 0.4628 -0.6303 0.6233 +vn -0.0336 0.9982 0.0502 +vn 0.3732 -0.4617 0.8047 +vn -0.0504 0.9987 0.0100 +vn -0.8863 -0.4617 -0.0368 +vn -0.3803 0.6931 0.6123 +vn 0.2296 -0.1363 0.9637 +vn -0.9782 -0.1363 0.1567 +vn 0.1567 0.1363 0.9782 +vn -0.5942 -0.0196 0.8041 +vn -0.6088 -0.0671 0.7905 +vn -0.0369 0.4618 0.8862 +vn -0.9756 -0.1448 0.1652 +vn -0.2902 0.6737 0.6796 +vn -0.8085 -0.5294 0.2572 +vn -0.5711 -0.0473 0.8195 +vn -0.4876 0.7263 0.4844 +vn -0.4978 -0.7194 0.4845 +vn -0.3708 0.9065 0.2017 +vn 0.7230 0.0900 -0.6849 +vn 0.8841 -0.1624 -0.4383 +vn -0.6692 0.7311 -0.1331 +vn -0.6691 -0.7311 -0.1332 +vn 0.1006 -0.9947 0.0200 +vn 0.7591 -0.6333 0.1510 +vn 0.0426 -0.9987 -0.0284 +vn -0.4876 -0.7263 0.4845 +vn 0.2571 -0.7194 -0.6453 +vn -0.1551 -0.9824 -0.1036 +vn -0.0718 -0.5294 -0.8454 +vn -0.5879 -0.7071 -0.3928 +vn -0.2207 -0.1448 -0.9645 +vn -0.8169 -0.1866 -0.5458 +vn -0.1652 0.1448 -0.9756 +vn -0.8041 0.0196 -0.5942 +vn -0.2572 0.5294 -0.8085 +vn -0.7905 0.0671 -0.6088 +vn -0.8053 0.0948 -0.5853 +vn -0.7529 -0.6303 -0.1891 +vn -0.3620 0.7150 -0.5981 +vn 0.3928 0.7071 -0.5879 +vn 0.6911 0.7150 0.1056 +vn 0.2126 0.9239 -0.3182 +vn 0.9645 0.1448 -0.2207 +vn 0.5458 0.1866 -0.8169 +vn 0.9637 0.1363 -0.2296 +vn 0.5155 -0.0196 -0.8567 +vn 0.8047 0.4617 -0.3732 +vn 0.4973 -0.0671 -0.8650 +vn 0.5168 0.6737 -0.5282 +vn 0.5386 -0.0473 -0.8413 +vn 0.5200 0.6794 -0.5177 +vn 0.7009 -0.0000 -0.7132 +vn 0.5200 -0.6794 -0.5177 +vn 0.7591 0.6333 0.1510 +vn 0.1006 0.9947 0.0200 +vn 0.0426 0.9987 -0.0284 +vn -0.0000 0.9348 -0.3552 +vn 0.0887 0.9881 0.1260 +vn 0.5402 0.7470 0.3875 +vn 0.8567 0.0196 0.5155 +vn 0.8650 0.0671 0.4973 +vn 0.8454 0.5294 -0.0718 +vn 0.8489 0.0948 0.5200 +vn -0.6661 0.6303 0.3987 +vn 0.0104 0.9991 0.0420 +vn -0.6527 0.4617 0.6006 +vn 0.0377 0.9966 -0.0730 +vn 0.8329 0.4617 0.3051 +vn 0.1132 0.7168 0.6880 +vn -0.5809 0.1363 0.8025 +vn 0.8438 0.1363 0.5191 +vn 0.2412 0.0196 0.9703 +vn -0.5191 -0.1363 0.8438 +vn 0.2600 0.0671 0.9633 +vn -0.3051 -0.4617 0.8329 +vn 0.8381 0.1448 0.5260 +vn 0.0080 -0.6737 0.7389 +vn 0.6485 0.5294 0.5470 +vn 0.2140 0.0473 0.9757 +vn 0.2022 -0.7180 0.6660 +vn 0.2745 0.7194 0.6381 +vn -0.6388 0.0173 0.7692 +vn -0.8420 -0.0172 0.5391 +vn 0.3279 -0.7180 0.6140 +vn 0.3279 0.7180 0.6140 +vn 0.3878 0.7249 0.5693 +vn 0.4418 -0.7180 0.5379 +vn 0.5799 0.7125 0.3950 +vn 0.5379 -0.7180 0.4418 +vn 0.5379 0.7180 0.4418 +vn 0.5483 -0.0064 0.8363 +vn 0.6359 -0.7263 0.2610 +vn 0.6639 -0.0490 0.7462 +vn 0.6404 -0.7574 -0.1274 +vn 0.6404 0.7574 -0.1274 +vn 0.5673 -0.7311 -0.3790 +vn 0.9987 0.0196 -0.0472 +vn -0.0853 0.9947 0.0570 +vn 0.5673 0.7311 -0.3791 +vn -0.0930 0.9955 0.0185 +vn -0.6435 0.6333 0.4300 +vn -0.6785 0.6794 -0.2793 +vn -0.0502 0.9987 -0.0100 +vn 0.6359 0.7263 0.2610 +vn -0.5563 0.6942 -0.4568 +vn -0.0172 0.9997 -0.0172 +vn 0.4418 0.7180 0.5379 +vn -0.0093 0.9997 -0.0225 +vn -0.4568 0.6942 -0.5563 +vn -0.2092 0.6942 -0.6887 +vn 0.2023 0.7180 0.6660 +vn 0.1830 0.9824 -0.0364 +vn 0.3898 0.5294 -0.7535 +vn 0.6935 0.7071 -0.1380 +vn 0.5730 0.1448 -0.8067 +vn 0.9636 0.1866 -0.1917 +vn 0.5260 -0.1448 -0.8381 +vn 0.9703 -0.0196 -0.2412 +vn 0.9633 -0.0671 -0.2600 +vn 0.9679 -0.0948 -0.2326 +vn 0.5470 -0.5294 -0.6485 +vn 0.7680 0.6303 0.1135 +vn -0.0747 -0.9239 -0.3753 +vn 0.5633 -0.7150 -0.4140 +vn -0.7535 -0.5294 -0.3898 +vn -0.1380 -0.7071 -0.6935 +vn -0.8067 -0.1448 -0.5730 +vn -0.1917 -0.1866 -0.9636 +vn -0.8025 -0.1363 -0.5809 +vn -0.1485 0.0196 -0.9887 +vn -0.6006 -0.4617 -0.6527 +vn -0.1284 0.0671 -0.9894 +vn -0.2754 -0.6737 -0.6858 +vn -0.1756 0.0473 -0.9833 +vn 0.0094 0.7194 -0.6946 +vn -0.2092 -0.6942 -0.6887 +vn -0.2881 -0.0000 -0.9576 +vn -0.3391 -0.6942 -0.6349 +vn -0.4734 -0.0000 -0.8809 +vn -0.3391 0.6942 -0.6349 +vn -0.4568 -0.6942 -0.5563 +vn -0.6326 -0.0000 -0.7744 +vn -0.5563 -0.6942 -0.4568 +vn -0.7744 -0.0000 -0.6326 +vn -0.6785 -0.6794 -0.2793 +vn -0.9205 -0.0000 -0.3907 +vn -0.7342 -0.6630 0.1460 +vn -0.7342 0.6630 0.1460 +vn -0.6435 -0.6333 0.4300 +vn -0.8315 -0.0000 0.5556 +vn -0.0930 -0.9955 0.0185 +vn -0.0853 -0.9947 0.0570 +vn -0.0502 -0.9987 -0.0100 +vn -0.0172 -0.9997 -0.0172 +vn -0.0093 -0.9997 -0.0225 +vn 0.3117 -0.9484 -0.0581 +vn 0.0647 -0.9846 0.1627 +vn -0.6426 -0.1599 0.7493 +vn -0.9887 -0.0196 0.1485 +vn -0.9894 -0.0671 0.1284 +vn -0.9833 -0.0948 0.1556 +vn -0.6789 -0.7150 -0.1669 +vn 0.6233 -0.6303 -0.4628 +vn 0.0502 0.9982 0.0336 +vn 0.8047 -0.4617 -0.3732 +vn 0.0100 0.9987 0.0504 +vn -0.0368 -0.4617 0.8863 +vn 0.6123 0.6931 0.3803 +vn 0.9637 -0.1363 -0.2296 +vn 0.1567 -0.1363 0.9782 +vn 0.9782 0.1363 -0.1567 +vn 0.8041 -0.0196 0.5942 +vn 0.7905 -0.0671 0.6088 +vn 0.8862 0.4618 0.0368 +vn 0.1652 -0.1448 0.9756 +vn 0.8195 -0.0473 0.5711 +vn 0.6796 0.6737 0.2902 +vn 0.2572 -0.5294 0.8085 +vn 0.4845 0.7263 0.4876 +vn 0.4845 -0.7194 0.4978 +vn 0.7503 -0.0099 -0.6610 +vn -0.2831 -0.0644 -0.9569 +vn -0.0201 -0.0892 -0.9958 +vn -0.1331 0.7311 0.6692 +vn -0.1331 -0.7311 0.6691 +vn 0.0200 -0.9947 -0.1006 +vn 0.1510 -0.6333 -0.7591 +vn -0.0284 -0.9987 -0.0426 +vn 0.4845 -0.7263 0.4876 +vn -0.6453 -0.7194 -0.2571 +vn -0.1036 -0.9824 0.1551 +vn -0.8454 -0.5294 0.0718 +vn -0.3928 -0.7071 0.5879 +vn -0.9645 -0.1448 0.2207 +vn -0.5458 -0.1866 0.8169 +vn -0.9756 0.1448 0.1652 +vn -0.5942 0.0196 0.8041 +vn -0.8085 0.5294 0.2572 +vn -0.6088 0.0671 0.7905 +vn -0.5853 0.0948 0.8053 +vn -0.1891 -0.6303 0.7529 +vn -0.5981 0.7150 0.3620 +vn -0.5879 0.7071 -0.3928 +vn -0.3182 0.9239 -0.2126 +vn -0.0718 0.5294 -0.8454 +vn -0.2207 0.1448 -0.9645 +vn -0.8169 0.1866 -0.5458 +vn -0.2296 0.1363 -0.9637 +vn -0.8567 -0.0196 -0.5155 +vn -0.3732 0.4617 -0.8047 +vn -0.8650 -0.0671 -0.4973 +vn -0.5282 0.6737 -0.5168 +vn -0.8413 -0.0473 -0.5386 +vn -0.5177 0.6794 -0.5200 +vn -0.7132 -0.0000 -0.7009 +vn -0.5177 -0.6794 -0.5200 +vn 0.1510 0.6333 -0.7591 +vn 0.0200 0.9947 -0.1006 +vn -0.0284 0.9987 -0.0426 +vn -0.2628 0.9638 -0.0445 +vn 0.4712 -0.8714 -0.1363 +vn 0.4662 0.6003 -0.6499 +vn 0.5155 0.0196 -0.8567 +vn 0.4973 0.0671 -0.8650 +vn 0.5200 0.0948 -0.8489 +vn 0.1056 0.7150 -0.6911 +vn 0.3987 0.6303 0.6661 +vn -0.5024 0.8645 -0.0149 +vn 0.6006 0.4617 0.6527 +vn -0.1234 0.9914 -0.0430 +vn 0.3051 0.4617 -0.8329 +vn 0.6880 0.7168 -0.1132 +vn 0.8025 0.1363 0.5809 +vn 0.5191 0.1363 -0.8438 +vn 0.8438 -0.1363 0.5191 +vn 0.9703 0.0196 -0.2412 +vn 0.9633 0.0671 -0.2600 +vn 0.8329 -0.4618 0.3051 +vn 0.5260 0.1448 -0.8381 +vn 0.7389 -0.6737 -0.0080 +vn 0.5470 0.5294 -0.6485 +vn 0.9757 0.0473 -0.2140 +vn 0.6660 -0.7180 -0.2023 +vn 0.6381 0.7194 -0.2745 +vn 0.9232 0.1887 0.3349 +vn 0.7374 0.6735 0.0505 +vn 0.6140 -0.7180 -0.3279 +vn 0.6140 0.7180 -0.3279 +vn 0.5693 0.7249 -0.3878 +vn 0.5379 -0.7180 -0.4418 +vn 0.3950 0.7125 -0.5799 +vn 0.4418 -0.7180 -0.5379 +vn 0.4418 0.7180 -0.5379 +vn 0.8101 -0.0145 -0.5861 +vn 0.2610 -0.7263 -0.6359 +vn -0.1274 -0.7573 -0.6405 +vn -0.1274 0.7574 -0.6404 +vn 0.6982 0.0784 -0.7116 +vn -0.5755 0.1666 -0.8006 +vn -0.3790 -0.7311 -0.5673 +vn -0.3791 0.7311 -0.5673 +vn 0.0570 0.9947 0.0853 +vn 0.4300 0.6333 0.6435 +vn -0.2793 0.6794 0.6786 +vn -0.0100 0.9987 0.0502 +vn 0.2610 0.7263 -0.6359 +vn -0.4568 0.6942 0.5563 +vn -0.0172 0.9997 0.0172 +vn 0.5379 0.7180 -0.4418 +vn -0.0225 0.9997 0.0093 +vn -0.5563 0.6942 0.4568 +vn -0.6887 0.6942 0.2092 +vn 0.6660 0.7180 -0.2023 +vn -0.0364 0.9824 -0.1830 +vn -0.1380 0.7071 -0.6935 +vn -0.6946 0.7194 -0.0094 +vn -0.8067 0.1448 -0.5730 +vn -0.1917 0.1866 -0.9636 +vn -0.8381 -0.1448 -0.5260 +vn -0.2412 -0.0196 -0.9703 +vn -0.6485 -0.5294 -0.5470 +vn -0.2600 -0.0671 -0.9633 +vn -0.2326 -0.0948 -0.9679 +vn 0.1134 0.6303 -0.7680 +vn -0.3753 -0.9239 0.0747 +vn -0.4140 -0.7150 -0.5633 +vn -0.3898 -0.5294 0.7535 +vn -0.6935 -0.7071 0.1379 +vn -0.5730 -0.1448 0.8067 +vn -0.9636 -0.1866 0.1917 +vn -0.5809 -0.1363 0.8025 +vn -0.9887 0.0196 0.1485 +vn -0.6527 -0.4617 0.6006 +vn -0.9894 0.0671 0.1284 +vn -0.7535 0.5294 -0.3898 +vn -0.6858 -0.6737 0.2754 +vn -0.9833 0.0473 0.1756 +vn -0.6887 -0.6942 0.2092 +vn -0.9576 -0.0000 0.2881 +vn -0.6349 -0.6942 0.3391 +vn -0.8809 -0.0000 0.4734 +vn -0.6349 0.6942 0.3391 +vn -0.5563 -0.6942 0.4568 +vn -0.7744 -0.0000 0.6326 +vn -0.4568 -0.6942 0.5563 +vn -0.6326 -0.0000 0.7744 +vn -0.2793 -0.6794 0.6785 +vn -0.3907 -0.0000 0.9205 +vn 0.4300 -0.6333 0.6435 +vn 0.5556 -0.0000 0.8315 +vn 0.0570 -0.9947 0.0853 +vn -0.0100 -0.9987 0.0502 +vn -0.0172 -0.9997 0.0172 +vn -0.0225 -0.9997 0.0093 +vn -0.0951 -0.9953 0.0209 +vn 0.1359 -0.9891 0.0566 +vn 0.1493 -0.7547 0.6389 +vn 0.1485 -0.0196 0.9887 +vn 0.1284 -0.0671 0.9894 +vn 0.1556 -0.0948 0.9833 +vn -0.1669 -0.7150 0.6789 +vn -0.4628 -0.6303 -0.6233 +vn 0.0336 0.9982 -0.0502 +vn -0.3732 -0.4617 -0.8047 +vn 0.0504 0.9987 -0.0100 +vn 0.8863 -0.4617 0.0368 +vn 0.3803 0.6931 -0.6123 +vn -0.2296 -0.1363 -0.9637 +vn 0.9782 -0.1363 -0.1567 +vn -0.1567 0.1363 -0.9782 +vn 0.5942 -0.0196 -0.8041 +vn 0.6088 -0.0671 -0.7905 +vn 0.0368 0.4618 -0.8862 +vn 0.9756 -0.1448 -0.1652 +vn 0.5711 -0.0473 -0.8195 +vn 0.2902 0.6737 -0.6796 +vn 0.8085 -0.5294 -0.2572 +vn 0.4876 0.7263 -0.4845 +vn 0.4978 -0.7194 -0.4845 +vn 0.6745 0.5755 -0.4625 +vn -0.7275 0.0120 0.6860 +vn -0.8841 -0.1624 0.4383 +vn 0.6692 0.7311 0.1331 +vn 0.6691 -0.7311 0.1332 +vn -0.1006 -0.9947 -0.0200 +vn -0.7591 -0.6333 -0.1510 +vn -0.0426 -0.9987 0.0284 +vn 0.4876 -0.7263 -0.4845 +vn -0.2571 -0.7194 0.6453 +vn 0.1551 -0.9824 0.1036 +vn 0.0718 -0.5294 0.8454 +vn 0.5879 -0.7071 0.3928 +vn 0.2207 -0.1448 0.9645 +vn 0.8169 -0.1866 0.5458 +vn 0.1652 0.1448 0.9756 +vn 0.8041 0.0196 0.5942 +vn 0.2572 0.5294 0.8085 +vn 0.7905 0.0671 0.6088 +vn 0.8053 0.0948 0.5853 +vn 0.7529 -0.6303 0.1891 +vn 0.3620 0.7150 0.5981 +vn -0.3928 0.7071 0.5879 +vn -0.6911 0.7150 -0.1056 +vn -0.2126 0.9239 0.3182 +vn -0.9645 0.1448 0.2207 +vn -0.5458 0.1866 0.8169 +vn -0.9637 0.1363 0.2296 +vn -0.5155 -0.0196 0.8567 +vn -0.8047 0.4617 0.3732 +vn -0.4973 -0.0671 0.8650 +vn -0.5168 0.6737 0.5282 +vn -0.5386 -0.0473 0.8413 +vn -0.5200 0.6794 0.5177 +vn -0.7009 -0.0000 0.7132 +vn -0.5200 -0.6794 0.5177 +vn -0.7591 0.6333 -0.1510 +vn -0.1006 0.9947 -0.0200 +vn -0.0426 0.9987 0.0284 +vn -0.0000 0.9795 -0.2016 +vn -0.0879 0.8879 -0.4515 +vn -0.5402 0.7470 -0.3875 +vn -0.8567 0.0196 -0.5155 +vn -0.8650 0.0671 -0.4973 +vn -0.8454 0.5294 0.0718 +vn -0.8489 0.0948 -0.5200 +vt 0.562500 0.812500 +vt 0.500000 0.781250 +vt 0.562500 0.781250 +vt 0.375000 0.812500 +vt 0.312500 0.781250 +vt 0.375000 0.781250 +vt 0.312500 0.812500 +vt 0.250000 0.781250 +vt 0.250000 0.812500 +vt 0.187500 0.781250 +vt 0.187500 0.812500 +vt 0.125000 0.781250 +vt 0.125000 0.812500 +vt 0.062500 0.781250 +vt 0.062500 0.812500 +vt 0.000000 0.781250 +vt 1.000000 0.812500 +vt 0.937500 0.781250 +vt 1.000000 0.781250 +vt 0.937500 0.812500 +vt 0.875000 0.781250 +vt 0.875000 0.812500 +vt 0.812500 0.781250 +vt 0.812500 0.812500 +vt 0.750000 0.781250 +vt 0.750000 0.812500 +vt 0.687500 0.781250 +vt 0.687500 0.812500 +vt 0.625000 0.781250 +vt 0.625000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.781250 +vt 0.500000 0.651786 +vt 0.437500 0.683036 +vt 0.437500 0.651786 +vt 0.187500 0.870536 +vt 0.125000 0.888393 +vt 0.125000 0.870536 +vt 0.500000 0.812500 +vt 0.500000 0.620536 +vt 0.441925 0.843750 +vt 0.375000 0.651786 +vt 0.437500 0.620536 +vt 0.442655 0.812500 +vt 0.375000 0.843750 +vt 0.369845 0.812500 +vt 0.312500 0.651786 +vt 0.375000 0.620536 +vt 0.316925 0.843750 +vt 0.250000 0.651786 +vt 0.312500 0.620536 +vt 0.317655 0.812500 +vt 0.250000 0.843750 +vt 0.244845 0.812500 +vt 0.187500 0.651786 +vt 0.250000 0.620536 +vt 0.191925 0.843750 +vt 0.125000 0.651786 +vt 0.187500 0.620536 +vt 0.192655 0.812500 +vt 0.125000 0.843750 +vt 0.119845 0.812500 +vt 0.062500 0.651786 +vt 0.125000 0.620536 +vt 0.066925 0.843750 +vt 0.000000 0.651786 +vt 0.062500 0.620536 +vt 0.067655 0.812500 +vt 0.000000 0.843750 +vt -0.005155 0.812500 +vt 0.937500 0.651786 +vt 1.000000 0.620536 +vt 1.000000 0.651786 +vt 0.941925 0.843750 +vt 0.875000 0.651786 +vt 0.937500 0.620536 +vt 0.942655 0.812500 +vt 0.875000 0.843750 +vt 0.869845 0.812500 +vt 0.812500 0.651786 +vt 0.875000 0.620536 +vt 0.816925 0.843750 +vt 0.750000 0.651786 +vt 0.812500 0.620536 +vt 0.817655 0.812500 +vt 0.750000 0.843750 +vt 0.744845 0.812500 +vt 0.687500 0.651786 +vt 0.750000 0.620536 +vt 0.691925 0.843750 +vt 0.625000 0.651786 +vt 0.687500 0.620536 +vt 0.692655 0.812500 +vt 0.625000 0.843750 +vt 0.619845 0.812500 +vt 0.562500 0.651786 +vt 0.625000 0.620536 +vt 0.566925 0.843750 +vt 0.562500 0.620536 +vt 0.567655 0.812500 +vt 0.500000 0.843750 +vt 0.494845 0.812500 +vt 0.437500 0.763393 +vt 0.500000 0.763393 +vt 0.375000 0.763393 +vt 0.625000 0.683036 +vt 0.562500 0.763393 +vt 0.625000 0.763393 +vt 0.687500 0.683036 +vt 0.687500 0.763393 +vt 0.750000 0.683036 +vt 0.750000 0.763393 +vt 0.812500 0.683036 +vt 0.812500 0.763393 +vt 0.875000 0.683036 +vt 0.875000 0.763393 +vt 0.937500 0.683036 +vt 0.937500 0.763393 +vt 1.000000 0.683036 +vt 1.000000 0.763393 +vt 0.062500 0.683036 +vt 0.062500 0.763393 +vt 0.000000 0.763393 +vt 0.125000 0.683036 +vt 0.125000 0.763393 +vt 0.187500 0.683036 +vt 0.187500 0.763393 +vt 0.250000 0.683036 +vt 0.250000 0.763393 +vt 0.312500 0.683036 +vt 0.312500 0.763393 +vt 0.375000 0.683036 +vt 0.562500 0.683036 +vt 0.500000 0.700893 +vt 0.500000 0.683036 +vt 0.562500 0.700893 +vt 0.375000 0.700893 +vt 0.312500 0.700893 +vt 0.250000 0.700893 +vt 0.187500 0.700893 +vt 0.125000 0.700893 +vt 0.062500 0.700893 +vt 0.000000 0.683036 +vt 0.000000 0.700893 +vt 0.937500 0.700893 +vt 1.000000 0.700893 +vt 0.875000 0.700893 +vt 0.812500 0.700893 +vt 0.750000 0.700893 +vt 0.687500 0.700893 +vt 0.625000 0.700893 +vt 0.437500 0.700893 +vt 0.437500 0.870536 +vt 0.500000 0.870536 +vt 0.375000 0.870536 +vt 0.437500 0.843750 +vt 0.312500 0.870536 +vt 0.312500 0.843750 +vt 0.250000 0.870536 +vt 0.187500 0.843750 +vt 0.062500 0.870536 +vt 0.062500 0.843750 +vt 0.937500 0.870536 +vt 1.000000 0.843750 +vt 1.000000 0.870536 +vt 0.875000 0.870536 +vt 0.937500 0.843750 +vt 0.812500 0.870536 +vt 0.812500 0.843750 +vt 0.687500 0.870536 +vt 0.750000 0.870536 +vt 0.625000 0.870536 +vt 0.687500 0.843750 +vt 0.562500 0.870536 +vt 0.562500 0.843750 +vt 0.625000 0.888393 +vt 0.062500 0.888393 +vt 0.562500 0.888393 +vt 0.000000 0.888393 +vt 0.000000 0.870536 +vt 0.437500 0.888393 +vt 0.500000 0.888393 +vt 0.937500 0.888393 +vt 0.375000 0.888393 +vt 0.875000 0.888393 +vt 0.312500 0.888393 +vt 0.812500 0.888393 +vt 0.250000 0.888393 +vt 0.750000 0.888393 +vt 0.187500 0.888393 +vt 0.687500 0.888393 +vt 0.447062 0.888393 +vt 0.490438 0.888393 +vt 0.468750 1.000000 +vt 0.509562 0.888393 +vt 0.552938 0.888393 +vt 0.531250 1.000000 +vt 0.572062 0.888393 +vt 0.615438 0.888393 +vt 0.593750 1.000000 +vt 0.634562 0.888393 +vt 0.677938 0.888393 +vt 0.656250 1.000000 +vt 0.697062 0.888393 +vt 0.740438 0.888393 +vt 0.718750 1.000000 +vt 0.759562 0.888393 +vt 0.802938 0.888393 +vt 0.781250 1.000000 +vt 0.822062 0.888393 +vt 0.865438 0.888393 +vt 0.843750 1.000000 +vt 0.884562 0.888393 +vt 0.927938 0.888393 +vt 0.906250 1.000000 +vt 0.947062 0.888393 +vt 0.990438 0.888393 +vt 0.968750 1.000000 +vt 0.009562 0.888393 +vt 0.052938 0.888393 +vt 0.031250 1.000000 +vt 0.072062 0.888393 +vt 0.115438 0.888393 +vt 0.093750 1.000000 +vt 0.134562 0.888393 +vt 0.177938 0.888393 +vt 0.156250 1.000000 +vt 0.197062 0.888393 +vt 0.240438 0.888393 +vt 0.218750 1.000000 +vt 0.259562 0.888393 +vt 0.302938 0.888393 +vt 0.281250 1.000000 +vt 0.322062 0.888393 +vt 0.365438 0.888393 +vt 0.343750 1.000000 +vt 0.384562 0.888393 +vt 0.427938 0.888393 +vt 0.406250 1.000000 +vt 0.584821 0.241071 +vt 0.558036 0.223214 +vt 0.584821 0.223214 +vt 0.558036 0.241071 +vt 0.531250 0.223214 +vt 0.531250 0.241071 +vt 0.504464 0.223214 +vt 0.504464 0.241071 +vt 0.477679 0.223214 +vt 0.477679 0.241071 +vt 0.450893 0.223214 +vt 0.450893 0.241071 +vt 0.424107 0.223214 +vt 0.745536 0.241071 +vt 0.718750 0.223214 +vt 0.745536 0.223214 +vt 0.718750 0.241071 +vt 0.691964 0.223214 +vt 0.691964 0.241071 +vt 0.665179 0.223214 +vt 0.665179 0.241071 +vt 0.638393 0.223214 +vt 0.912466 0.455357 +vt 0.866071 0.375000 +vt 0.819677 0.455357 +vt 0.638393 0.241071 +vt 0.611607 0.223214 +vt 0.611607 0.241071 +vt 0.937500 0.486607 +vt 0.968750 0.500000 +vt 0.937500 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.486607 +vt 0.968750 0.544643 +vt 0.937500 0.544643 +vt 0.875000 0.544643 +vt 0.812500 0.500000 +vt 0.812500 0.486607 +vt 0.812500 0.544643 +vt 0.781250 0.500000 +vt 0.781250 0.486607 +vt 0.767857 0.544643 +vt 0.781250 0.544643 +vt 0.812500 0.558036 +vt 0.875000 0.558036 +vt 0.937500 0.558036 +vt 0.968750 0.558036 +vt 0.982143 0.544643 +vt 0.316964 0.241071 +vt 0.102679 0.223214 +vt 0.316964 0.223214 +vt 0.388393 0.526786 +vt 0.406250 0.312500 +vt 0.406250 0.526786 +vt 0.267857 0.169643 +vt 0.075893 0.178571 +vt 0.075893 0.169643 +vt 0.031250 0.312500 +vt 0.013393 0.526786 +vt 0.013393 0.312500 +vt 0.102679 0.598214 +vt 0.316964 0.616071 +vt 0.102679 0.616071 +vt 0.102679 0.241071 +vt 0.000000 0.223214 +vt 0.000000 0.598214 +vt 0.419643 0.616071 +vt 0.316964 0.598214 +vt 0.419643 0.598214 +vt 0.419643 0.241071 +vt 0.477679 0.241071 +vt 0.763393 0.312500 +vt 0.114637 0.269943 +vt 0.031250 0.312500 +vt 0.102679 0.241071 +vt 0.060121 0.514827 +vt 0.102679 0.598214 +vt 0.031250 0.526786 +vt 0.305005 0.569343 +vt 0.388393 0.526786 +vt 0.316964 0.598214 +vt 0.359522 0.324459 +vt 0.316964 0.241071 +vt 0.388393 0.312500 +vt 0.060121 0.324459 +vt 0.305005 0.269943 +vt 0.359522 0.514827 +vt 0.114637 0.569343 +vt 0.069050 0.514827 +vt 0.114637 0.278871 +vt 0.350593 0.324459 +vt 0.267857 0.209821 +vt 0.075893 0.218750 +vt 0.075893 0.209821 +vt 0.071429 0.196429 +vt 0.000000 0.205357 +vt 0.000000 0.196429 +vt 0.071429 0.183036 +vt 0.000000 0.191964 +vt 0.000000 0.183036 +vt 0.267857 0.196429 +vt 0.075893 0.205357 +vt 0.075893 0.196429 +vt 0.267857 0.183036 +vt 0.075893 0.191964 +vt 0.075893 0.183036 +vt 0.343750 0.183036 +vt 0.272321 0.191964 +vt 0.272321 0.183036 +vt 0.343750 0.196429 +vt 0.272321 0.205357 +vt 0.272321 0.196429 +vt 0.835100 0.187500 +vt 0.870815 0.209821 +vt 0.835100 0.209821 +vt 0.875908 0.218750 +vt 0.910993 0.209821 +vt 0.910993 0.218750 +vt 0.870814 0.187500 +vt 0.902064 0.209821 +vt 0.919922 0.187500 +vt 0.973493 0.209821 +vt 0.919922 0.209821 +vt 0.910714 0.272321 +vt 0.888393 0.370536 +vt 0.888393 0.272321 +vt 0.835100 0.218750 +vt 0.927874 0.209821 +vt 0.973493 0.218750 +vt 0.919922 0.218750 +vt 0.745814 0.209821 +vt 0.745814 0.187500 +vt 0.745256 0.187500 +vt 0.831557 0.178571 +vt 0.864392 0.178571 +vt 0.995814 0.218750 +vt 0.902064 0.187500 +vt 0.910993 0.187500 +vt 0.875908 0.178571 +vt 0.910993 0.178571 +vt 0.910714 0.250000 +vt 0.901786 0.258929 +vt 0.901786 0.250000 +vt 0.888393 0.250000 +vt 0.897321 0.258929 +vt 0.888393 0.267857 +vt 0.736886 0.209821 +vt 0.736886 0.187500 +vt 0.745256 0.209821 +vt 0.831557 0.218750 +vt 0.736886 0.218750 +vt 0.973493 0.178571 +vt 0.927874 0.187500 +vt 0.919922 0.178571 +vt 0.995814 0.187500 +vt 0.973493 0.187500 +vt 0.995814 0.209821 +vt 0.799107 0.321429 +vt 0.776786 0.357143 +vt 0.776786 0.321429 +vt 0.767857 0.362236 +vt 0.776786 0.397321 +vt 0.767857 0.397321 +vt 0.799107 0.357143 +vt 0.776786 0.388393 +vt 0.799107 0.406250 +vt 0.776786 0.459821 +vt 0.776786 0.406250 +vt 0.767857 0.321429 +vt 0.776786 0.414202 +vt 0.767857 0.459821 +vt 0.767857 0.406250 +vt 0.776786 0.232143 +vt 0.799107 0.232143 +vt 0.799107 0.231585 +vt 0.808036 0.317885 +vt 0.808036 0.350721 +vt 0.767857 0.482143 +vt 0.799107 0.388393 +vt 0.799107 0.397321 +vt 0.808036 0.362236 +vt 0.808036 0.397321 +vt 0.799107 0.223214 +vt 0.776786 0.231585 +vt 0.767857 0.317885 +vt 0.767857 0.223214 +vt 0.808036 0.459821 +vt 0.799107 0.414202 +vt 0.808036 0.406250 +vt 0.799107 0.482143 +vt 0.799107 0.459821 +vt 0.776786 0.482143 +vt 0.835100 0.098214 +vt 0.870815 0.120536 +vt 0.835100 0.120536 +vt 0.875908 0.129464 +vt 0.910993 0.120536 +vt 0.910993 0.129464 +vt 0.870814 0.098214 +vt 0.902064 0.120536 +vt 0.919922 0.098214 +vt 0.973493 0.120536 +vt 0.919922 0.120536 +vt 0.835100 0.129464 +vt 0.927874 0.120536 +vt 0.973493 0.129464 +vt 0.919922 0.129464 +vt 0.745814 0.120536 +vt 0.745814 0.098214 +vt 0.745256 0.098214 +vt 0.831557 0.089286 +vt 0.864392 0.089286 +vt 0.995814 0.129464 +vt 0.902064 0.098214 +vt 0.910993 0.098214 +vt 0.875908 0.089286 +vt 0.910993 0.089286 +vt 0.736886 0.098214 +vt 0.745256 0.120536 +vt 0.831557 0.129464 +vt 0.736886 0.129464 +vt 0.973493 0.089286 +vt 0.927874 0.098214 +vt 0.919922 0.089286 +vt 0.995814 0.098214 +vt 0.973493 0.098214 +vt 0.995814 0.120536 +vt 0.835100 0.142857 +vt 0.870815 0.165179 +vt 0.835100 0.165179 +vt 0.875908 0.174107 +vt 0.910993 0.165179 +vt 0.910993 0.174107 +vt 0.870814 0.142857 +vt 0.902064 0.165179 +vt 0.919922 0.142857 +vt 0.973493 0.165179 +vt 0.919922 0.165179 +vt 0.835100 0.174107 +vt 0.927874 0.165179 +vt 0.973493 0.174107 +vt 0.919922 0.174107 +vt 0.745814 0.165179 +vt 0.745814 0.142857 +vt 0.745256 0.142857 +vt 0.831557 0.133929 +vt 0.864392 0.133929 +vt 0.995814 0.174107 +vt 0.902064 0.142857 +vt 0.910993 0.142857 +vt 0.875908 0.133929 +vt 0.910993 0.133929 +vt 0.736886 0.165179 +vt 0.736886 0.142857 +vt 0.745256 0.165179 +vt 0.831557 0.174107 +vt 0.736886 0.174107 +vt 0.973493 0.133929 +vt 0.927874 0.142857 +vt 0.919922 0.133929 +vt 0.995814 0.142857 +vt 0.973493 0.142857 +vt 0.995814 0.165179 +vt 0.946429 0.598214 +vt 0.982143 0.562500 +vt 0.982143 0.598214 +vt 0.875000 0.598214 +vt 0.839286 0.562500 +vt 0.875000 0.562500 +vt 0.839286 0.616071 +vt 0.875000 0.616071 +vt 0.821429 0.598214 +vt 0.839286 0.598214 +vt 0.892857 0.598214 +vt 0.946429 0.562500 +vt 0.986596 0.237854 +vt 0.995517 0.238834 +vt 0.986596 0.239815 +vt 0.924127 0.238843 +vt 0.933048 0.239823 +vt 0.924104 0.238847 +vt 0.986596 0.251249 +vt 0.995517 0.252229 +vt 0.986596 0.253209 +vt 0.924105 0.252233 +vt 0.933032 0.253214 +vt 0.924104 0.252240 +vt 0.986607 0.258929 +vt 0.995536 0.308036 +vt 0.986607 0.308036 +vt 0.933036 0.258929 +vt 0.924107 0.308036 +vt 0.924107 0.258929 +vt 0.986602 0.313750 +vt 0.995535 0.318081 +vt 0.986602 0.315712 +vt 0.933034 0.309015 +vt 0.924106 0.318081 +vt 0.924106 0.311385 +vt 0.995535 0.324780 +vt 0.986603 0.329107 +vt 0.986602 0.327145 +vt 0.933034 0.322409 +vt 0.924106 0.331475 +vt 0.924106 0.324780 +vt 0.995536 0.334821 +vt 0.986607 0.339286 +vt 0.986607 0.334821 +vt 0.933036 0.334821 +vt 0.924107 0.339286 +vt 0.924107 0.334821 +vt 0.986546 0.343096 +vt 0.995536 0.343758 +vt 0.986546 0.344404 +vt 0.924106 0.343750 +vt 0.933096 0.344404 +vt 0.924108 0.343759 +vt 0.986607 0.348214 +vt 0.995536 0.410714 +vt 0.986607 0.410714 +vt 0.933036 0.348214 +vt 0.924107 0.410714 +vt 0.924107 0.348214 +vt 0.986546 0.414525 +vt 0.995535 0.415179 +vt 0.986546 0.415833 +vt 0.924106 0.415171 +vt 0.933101 0.415833 +vt 0.924112 0.415179 +vt 0.986607 0.419643 +vt 0.995536 0.455357 +vt 0.986607 0.455357 +vt 0.933036 0.419643 +vt 0.924107 0.455357 +vt 0.924107 0.419643 +vt 0.986612 0.461072 +vt 0.995539 0.462053 +vt 0.986612 0.463034 +vt 0.933034 0.461073 +vt 0.924108 0.462053 +vt 0.924104 0.462047 +vt 0.995539 0.475447 +vt 0.986612 0.476428 +vt 0.986612 0.474466 +vt 0.924104 0.475447 +vt 0.933031 0.476428 +vt 0.924105 0.475454 +vt 0.933031 0.474466 +vt 0.941964 0.478797 +vt 0.941964 0.472101 +vt 0.950891 0.481164 +vt 0.941964 0.458707 +vt 0.950892 0.467770 +vt 0.941964 0.465402 +vt 0.933034 0.463034 +vt 0.950893 0.419643 +vt 0.941964 0.455357 +vt 0.941964 0.419643 +vt 0.933036 0.455357 +vt 0.941966 0.412947 +vt 0.950832 0.418989 +vt 0.941966 0.417411 +vt 0.933101 0.414526 +vt 0.941964 0.348214 +vt 0.950893 0.410714 +vt 0.941964 0.410714 +vt 0.933036 0.410714 +vt 0.950831 0.339939 +vt 0.941964 0.345982 +vt 0.941964 0.341517 +vt 0.933096 0.343096 +vt 0.941964 0.334821 +vt 0.950893 0.339286 +vt 0.941964 0.339286 +vt 0.933036 0.339286 +vt 0.950895 0.322409 +vt 0.941967 0.334823 +vt 0.941967 0.321428 +vt 0.941961 0.334823 +vt 0.933034 0.333842 +vt 0.950895 0.309014 +vt 0.941967 0.321429 +vt 0.941967 0.308034 +vt 0.941961 0.321429 +vt 0.933034 0.320448 +vt 0.950893 0.258929 +vt 0.941964 0.308036 +vt 0.941964 0.258929 +vt 0.933036 0.308036 +vt 0.941964 0.248887 +vt 0.950892 0.257950 +vt 0.941964 0.255583 +vt 0.933032 0.251252 +vt 0.941964 0.235493 +vt 0.950897 0.244556 +vt 0.941964 0.242188 +vt 0.933048 0.237863 +vt 0.959819 0.232149 +vt 0.950897 0.233130 +vt 0.959825 0.232141 +vt 0.968747 0.244547 +vt 0.959825 0.245528 +vt 0.959825 0.245535 +vt 0.968747 0.257942 +vt 0.959825 0.258922 +vt 0.950892 0.246516 +vt 0.959819 0.258931 +vt 0.959821 0.258929 +vt 0.968750 0.308036 +vt 0.959821 0.308036 +vt 0.950893 0.308036 +vt 0.959822 0.311381 +vt 0.968754 0.315712 +vt 0.959822 0.318077 +vt 0.950895 0.320448 +vt 0.959822 0.324776 +vt 0.968754 0.329106 +vt 0.959822 0.331471 +vt 0.950895 0.333842 +vt 0.959821 0.334821 +vt 0.968750 0.339286 +vt 0.959821 0.339286 +vt 0.950893 0.334821 +vt 0.959822 0.339285 +vt 0.968812 0.347560 +vt 0.959822 0.348214 +vt 0.959821 0.339285 +vt 0.950831 0.347560 +vt 0.959821 0.348214 +vt 0.968750 0.410714 +vt 0.959821 0.410714 +vt 0.950893 0.348214 +vt 0.959822 0.410714 +vt 0.968812 0.418989 +vt 0.959822 0.419643 +vt 0.950832 0.411369 +vt 0.959821 0.419643 +vt 0.959821 0.419643 +vt 0.968750 0.455357 +vt 0.959821 0.455357 +vt 0.950893 0.455357 +vt 0.959825 0.455355 +vt 0.968753 0.467769 +vt 0.959825 0.468750 +vt 0.950892 0.456337 +vt 0.959819 0.468750 +vt 0.959825 0.468750 +vt 0.968753 0.481164 +vt 0.959825 0.482145 +vt 0.959819 0.468749 +vt 0.950891 0.469730 +vt 0.968753 0.469730 +vt 0.977680 0.478793 +vt 0.977680 0.472097 +vt 0.977680 0.458703 +vt 0.977680 0.465398 +vt 0.968753 0.456336 +vt 0.977679 0.419643 +vt 0.977679 0.455357 +vt 0.968750 0.419643 +vt 0.977679 0.412947 +vt 0.977679 0.417411 +vt 0.968812 0.411368 +vt 0.977679 0.348214 +vt 0.977679 0.410714 +vt 0.968750 0.348214 +vt 0.977679 0.341518 +vt 0.977679 0.345982 +vt 0.968812 0.339939 +vt 0.977679 0.339286 +vt 0.977679 0.334821 +vt 0.968750 0.334821 +vt 0.977676 0.328126 +vt 0.977675 0.328132 +vt 0.968754 0.327145 +vt 0.977681 0.328126 +vt 0.977676 0.314731 +vt 0.977674 0.314738 +vt 0.968754 0.313750 +vt 0.977682 0.314738 +vt 0.977679 0.308036 +vt 0.977679 0.258929 +vt 0.968750 0.258929 +vt 0.977680 0.248883 +vt 0.977680 0.255579 +vt 0.968747 0.246516 +vt 0.977680 0.235489 +vt 0.977680 0.242184 +vt 0.968747 0.233121 +vt 0.821428 0.364820 +vt 0.812501 0.363839 +vt 0.821428 0.362859 +vt 0.883930 0.363845 +vt 0.874997 0.362858 +vt 0.883924 0.363839 +vt 0.821428 0.351427 +vt 0.812501 0.350446 +vt 0.821428 0.349466 +vt 0.883930 0.350452 +vt 0.874997 0.349465 +vt 0.883924 0.350446 +vt 0.812500 0.343750 +vt 0.821429 0.294643 +vt 0.821429 0.343750 +vt 0.875000 0.343750 +vt 0.883929 0.294643 +vt 0.883929 0.343750 +vt 0.821430 0.288927 +vt 0.812502 0.284598 +vt 0.821430 0.286966 +vt 0.875001 0.293663 +vt 0.883930 0.284598 +vt 0.883930 0.291295 +vt 0.821430 0.275534 +vt 0.812502 0.271205 +vt 0.821430 0.273573 +vt 0.875001 0.280269 +vt 0.883930 0.271205 +vt 0.883930 0.277902 +vt 0.821429 0.267857 +vt 0.812500 0.258929 +vt 0.821429 0.258929 +vt 0.875000 0.267857 +vt 0.883929 0.258929 +vt 0.883929 0.267857 +vt 0.821428 0.253213 +vt 0.812499 0.252225 +vt 0.821428 0.251252 +vt 0.883928 0.252233 +vt 0.875001 0.251252 +vt 0.883929 0.252226 +vt 0.821428 0.239820 +vt 0.812499 0.238832 +vt 0.821428 0.237858 +vt 0.883928 0.238839 +vt 0.875001 0.237858 +vt 0.883929 0.238833 +vt 0.875001 0.239820 +vt 0.866072 0.235491 +vt 0.866072 0.242187 +vt 0.857143 0.233123 +vt 0.866072 0.255581 +vt 0.857143 0.246516 +vt 0.866072 0.248884 +vt 0.875001 0.253213 +vt 0.857143 0.267857 +vt 0.866071 0.258929 +vt 0.866071 0.267857 +vt 0.875000 0.258929 +vt 0.857144 0.280269 +vt 0.866072 0.267857 +vt 0.866072 0.281250 +vt 0.866072 0.281250 +vt 0.875001 0.268837 +vt 0.857143 0.293663 +vt 0.866072 0.281250 +vt 0.866072 0.294643 +vt 0.866072 0.294643 +vt 0.875001 0.282231 +vt 0.857143 0.343750 +vt 0.866071 0.294643 +vt 0.866071 0.343750 +vt 0.875000 0.294643 +vt 0.857143 0.356160 +vt 0.866070 0.347098 +vt 0.866070 0.353793 +vt 0.874997 0.351426 +vt 0.866070 0.367186 +vt 0.857142 0.358124 +vt 0.866070 0.360491 +vt 0.874997 0.364819 +vt 0.857142 0.369554 +vt 0.848215 0.357143 +vt 0.839286 0.369555 +vt 0.848215 0.357143 +vt 0.848215 0.370536 +vt 0.848215 0.357143 +vt 0.839286 0.344730 +vt 0.848215 0.343750 +vt 0.848215 0.343750 +vt 0.857143 0.344730 +vt 0.848214 0.343750 +vt 0.839286 0.294643 +vt 0.848214 0.294643 +vt 0.857143 0.294643 +vt 0.848214 0.291295 +vt 0.839286 0.286966 +vt 0.848214 0.284598 +vt 0.857143 0.282231 +vt 0.839286 0.275534 +vt 0.848214 0.271205 +vt 0.848214 0.277902 +vt 0.857144 0.268837 +vt 0.848214 0.267857 +vt 0.839286 0.258929 +vt 0.848214 0.258929 +vt 0.857143 0.258929 +vt 0.848214 0.258929 +vt 0.839285 0.246516 +vt 0.848214 0.245536 +vt 0.857143 0.257948 +vt 0.848214 0.245536 +vt 0.848214 0.245536 +vt 0.839285 0.233123 +vt 0.848214 0.232143 +vt 0.857143 0.244555 +vt 0.848214 0.232142 +vt 0.830356 0.242187 +vt 0.839285 0.244555 +vt 0.830356 0.235491 +vt 0.830356 0.248884 +vt 0.830356 0.255581 +vt 0.839285 0.257948 +vt 0.830357 0.267857 +vt 0.830357 0.258929 +vt 0.839286 0.267857 +vt 0.830358 0.274553 +vt 0.830359 0.274547 +vt 0.830358 0.274553 +vt 0.839286 0.273573 +vt 0.830358 0.287947 +vt 0.830359 0.287940 +vt 0.839286 0.288927 +vt 0.830358 0.287946 +vt 0.830357 0.294643 +vt 0.830357 0.343750 +vt 0.839286 0.343750 +vt 0.830357 0.353795 +vt 0.830357 0.347098 +vt 0.839286 0.356162 +vt 0.830357 0.360491 +vt 0.830357 0.367188 +vt 0.839286 0.358124 +vt 0.995536 0.258929 +vt 0.995536 0.339286 +vt 0.959819 0.245536 +vt 0.812502 0.277902 +vt 0.812500 0.267857 +vt 0.830357 0.274560 +vt 0.959821 0.410716 +vt 0.866072 0.281250 +vt 0.995540 0.462046 +vt 0.995540 0.475454 +vt 0.959819 0.482145 +vt 0.848215 0.357141 +vt 0.848214 0.258929 +vt 0.000000 0.812500 +vt 0.495575 0.843750 +vt 0.370575 0.843750 +vt 0.245575 0.843750 +vt 0.120575 0.843750 +vt 0.000000 0.620536 +vt 0.995575 0.843750 +vt 0.870575 0.843750 +vt 0.745575 0.843750 +vt 0.620575 0.843750 +vt 1.000000 0.888393 +vt 0.424107 0.241071 +vt 0.839286 0.474966 +vt 0.866071 0.482143 +vt 0.892857 0.474966 +vt 0.919643 0.428571 +vt 0.912466 0.401786 +vt 0.892857 0.382177 +vt 0.839286 0.382177 +vt 0.819677 0.401786 +vt 0.812500 0.428571 +vt 0.968750 0.486607 +vt 0.767857 0.500000 +vt 0.781250 0.558036 +vt 0.982143 0.500000 +vt 0.388393 0.312500 +vt 0.267857 0.178571 +vt 0.031250 0.526786 +vt 0.000000 0.241071 +vt 0.000000 0.616071 +vt 0.419643 0.223214 +vt 0.763393 0.526786 +vt 0.691964 0.598214 +vt 0.477679 0.598214 +vt 0.406250 0.312500 +vt 0.691964 0.241071 +vt 0.350593 0.514827 +vt 0.305005 0.560414 +vt 0.114637 0.560414 +vt 0.069050 0.324459 +vt 0.305005 0.278871 +vt 0.267857 0.218750 +vt 0.071429 0.205357 +vt 0.071429 0.191964 +vt 0.267857 0.205357 +vt 0.267857 0.191964 +vt 0.343750 0.191964 +vt 0.343750 0.205357 +vt 0.910714 0.370536 +vt 0.864392 0.218750 +vt 0.736886 0.178571 +vt 0.835100 0.178571 +vt 0.910714 0.267857 +vt 0.897321 0.250000 +vt 0.995814 0.178571 +vt 0.767857 0.350721 +vt 0.808036 0.223214 +vt 0.808036 0.321429 +vt 0.776786 0.223214 +vt 0.808036 0.482143 +vt 0.864392 0.129464 +vt 0.736886 0.089286 +vt 0.835100 0.089286 +vt 0.736886 0.120536 +vt 0.995814 0.089286 +vt 0.864392 0.174107 +vt 0.736886 0.133929 +vt 0.835100 0.133929 +vt 0.995814 0.133929 +vt 0.767857 0.562500 +vt 0.995540 0.238830 +vt 0.995540 0.252225 +vt 0.995535 0.311385 +vt 0.995535 0.331475 +vt 0.995536 0.343750 +vt 0.995536 0.348214 +vt 0.995536 0.415170 +vt 0.995536 0.419643 +vt 0.941961 0.321428 +vt 0.941961 0.308034 +vt 0.959819 0.245536 +vt 0.959821 0.348214 +vt 0.959819 0.455356 +vt 0.977682 0.328119 +vt 0.977681 0.314731 +vt 0.812500 0.363846 +vt 0.812500 0.350453 +vt 0.812500 0.294643 +vt 0.812502 0.291295 +vt 0.812500 0.252232 +vt 0.812501 0.238839 +vt 0.866072 0.267857 +vt 0.848215 0.370534 +vt 0.848214 0.245536 +vt 0.830357 0.287953 s 1 -f 602/493/39 635/494/23 603/495/23 -f 611/496/23 644/497/28 612/498/28 -f 624/499/29 649/500/22 617/501/22 -f 610/502/39 643/503/23 611/496/23 -f 623/504/21 656/505/29 624/506/29 -f 609/507/22 642/508/39 610/502/39 -f 622/509/27 655/510/21 623/504/21 -f 608/511/29 633/512/22 601/513/22 -f 621/514/24 654/515/27 622/509/27 -f 607/516/21 640/517/29 608/511/29 -f 620/518/28 653/519/24 621/514/24 -f 606/520/27 639/521/21 607/516/21 -f 619/522/23 652/523/28 620/518/28 -f 632/524/29 657/525/22 625/526/22 -f 605/527/24 638/528/27 606/529/27 -f 618/530/39 651/531/23 619/522/23 -f 274/532/39 666/533/41 275/534/41 -f 124/535/22 125/536/39 123/537/22 -f 267/538/42 673/539/24 268/540/24 -f 126/541/39 127/542/23 125/536/39 -f 276/543/22 680/544/43 261/545/43 -f 128/546/23 129/547/28 127/542/23 -f 275/534/41 665/548/22 276/549/22 -f 130/550/28 131/551/24 129/547/28 -f 268/552/24 672/553/44 269/554/44 -f 132/555/24 133/556/27 131/551/24 -f 261/545/43 679/557/29 262/558/29 -f 134/559/27 135/560/21 133/556/27 -f 269/554/44 671/561/28 270/562/28 -f 136/563/21 137/564/29 135/565/21 -f 262/558/29 678/566/45 263/567/45 -f 138/568/29 123/537/22 137/564/29 -f 176/569/39 177/570/46 175/571/39 -f 734/572/47 741/573/48 735/574/48 -f 148/575/29 149/576/49 147/577/29 -f 738/578/50 729/579/51 731/580/51 -f 150/581/49 151/582/39 149/576/49 -f 174/583/49 175/571/39 173/584/49 -f 736/585/52 741/586/48 742/587/53 -f 152/588/39 153/589/46 151/582/39 -f 733/590/54 730/591/55 739/592/54 -f 154/593/46 155/594/28 153/589/46 -f 172/595/29 173/584/49 171/596/29 -f 732/597/56 729/598/51 730/599/55 -f 156/600/28 157/601/57 155/594/28 -f 737/602/58 744/603/59 738/578/50 -f 158/604/57 159/605/27 157/601/57 -f 733/590/54 740/606/60 734/572/47 -f 160/607/27 161/608/61 159/605/27 -f 737/602/58 742/609/53 743/610/58 -f 162/611/61 147/612/29 161/608/61 -f 178/613/46 179/614/28 177/570/46 -f 180/615/28 181/616/57 179/614/28 -f 182/617/57 183/618/27 181/616/57 -f 184/619/27 185/620/61 183/618/27 -f 186/621/61 171/622/29 185/620/61 -f 217/623/62 203/624/63 204/625/26 -f 251/626/64 197/627/26 252/628/62 -f 219/629/65 203/624/63 218/630/64 -f 248/631/66 196/632/25 249/633/67 -f 221/634/66 201/635/25 220/636/67 -f 222/637/68 200/638/69 221/634/66 -f 247/639/68 197/627/26 198/640/70 -f 250/641/65 194/642/63 251/626/64 -f 220/643/67 202/644/71 219/629/65 -f 247/639/68 199/645/69 248/631/66 -f 222/637/68 204/625/26 195/646/70 -f 249/647/67 193/648/71 250/641/65 -f 217/623/62 224/649/72 218/630/64 -f 218/630/64 225/650/73 219/629/65 -f 219/629/65 226/651/74 220/643/67 -f 220/636/67 227/652/75 221/634/66 -f 227/652/75 222/637/68 221/634/66 -f 228/653/76 217/623/62 222/637/68 -f 229/654/77 224/649/72 223/655/78 -f 230/656/79 225/650/73 224/649/72 -f 231/657/80 226/651/74 225/650/73 -f 226/658/74 233/659/81 227/652/75 -f 233/659/81 228/653/76 227/652/75 -f 228/653/76 229/654/77 223/655/78 -f 235/660/82 230/656/79 229/654/77 -f 236/661/83 231/657/80 230/656/79 -f 237/662/84 232/663/85 231/657/80 -f 238/664/86 233/659/81 232/665/85 -f 233/659/81 240/666/87 234/667/88 -f 234/667/88 235/660/82 229/654/77 -f 205/668/87 216/669/77 211/670/88 -f 212/671/81 205/668/87 211/670/88 -f 213/672/85 206/673/89 212/671/81 -f 214/674/80 207/675/86 213/676/85 -f 215/677/79 208/678/84 214/674/80 -f 210/679/82 215/677/79 216/669/77 -f 241/680/76 216/669/77 246/681/78 -f 212/671/81 241/680/76 242/682/75 -f 243/683/74 212/671/81 242/682/75 -f 244/684/73 213/676/85 243/685/74 -f 215/677/79 244/684/73 245/686/72 -f 216/669/77 245/686/72 246/681/78 -f 241/680/76 252/628/62 247/639/68 -f 242/682/75 247/639/68 248/631/66 -f 249/633/67 242/682/75 248/631/66 -f 250/641/65 243/685/74 249/647/67 -f 251/626/64 244/684/73 250/641/65 -f 252/628/62 245/686/72 251/626/64 -f 270/562/28 670/687/90 271/688/90 -f 263/567/45 677/689/21 264/690/21 -f 271/688/90 669/691/23 272/692/23 -f 264/693/21 676/694/91 265/695/91 -f 272/696/23 668/697/92 273/698/92 -f 265/695/91 675/699/27 266/700/27 -f 273/698/92 667/701/39 274/532/39 -f 266/700/27 674/702/42 267/538/42 -f 285/703/30 280/704/38 279/705/30 -f 289/706/40 282/707/32 288/708/32 -f 285/703/30 278/709/36 284/710/36 -f 290/711/35 291/712/40 289/706/40 -f 287/713/93 282/714/32 281/715/93 -f 284/716/36 277/717/94 283/718/94 -f 286/719/38 281/720/93 280/721/38 -f 283/718/94 292/722/35 290/711/35 -f 460/723/27 461/724/61 459/725/27 -f 702/726/50 709/727/51 703/728/51 -f 432/729/28 433/730/57 431/731/28 -f 718/732/47 725/733/48 719/734/48 -f 706/735/47 697/736/48 699/737/48 -f 434/738/57 435/739/27 433/730/57 -f 458/740/57 459/725/27 457/741/57 -f 704/742/56 709/743/51 710/744/55 -f 436/745/27 437/746/61 435/739/27 -f 722/747/50 713/748/51 715/749/51 -f 701/750/58 698/751/53 707/752/58 -f 438/753/61 439/754/29 437/746/61 -f 456/755/28 457/741/57 455/756/28 -f 700/757/52 697/758/48 698/759/53 -f 440/760/29 441/761/49 439/754/29 -f 720/762/52 725/763/48 726/764/53 -f 705/765/54 712/766/60 706/735/47 -f 442/767/49 443/768/39 441/761/49 -f 701/750/58 708/769/59 702/726/50 -f 444/770/39 445/771/46 443/768/39 -f 717/772/54 714/773/55 723/774/54 -f 705/765/54 710/775/55 711/776/54 -f 446/777/46 431/778/28 445/771/46 -f 462/779/61 463/780/29 461/724/61 -f 721/781/58 726/782/53 727/783/58 -f 464/784/29 465/785/49 463/780/29 -f 716/786/56 713/787/51 714/788/55 -f 466/789/49 467/790/39 465/785/49 -f 717/772/54 724/791/60 718/732/47 -f 468/792/39 469/793/46 467/790/39 -f 721/781/58 728/794/59 722/747/50 -f 470/795/46 455/796/28 469/793/46 -f 501/797/95 487/798/70 488/799/26 -f 536/800/95 478/801/70 481/802/26 -f 503/803/96 487/798/70 502/804/97 -f 532/805/98 480/806/25 533/807/99 -f 505/808/98 485/809/25 504/810/99 -f 506/811/100 484/812/71 505/808/98 -f 531/813/100 481/802/26 482/814/63 -f 534/815/96 478/801/70 535/816/97 -f 504/817/99 486/818/69 503/803/96 -f 531/813/100 483/819/71 532/805/98 -f 501/797/95 479/820/63 506/811/100 -f 533/821/99 477/822/69 534/815/96 -f 507/823/101 502/804/97 501/797/95 -f 502/804/97 509/824/102 503/803/96 -f 503/803/96 510/825/103 504/817/99 -f 510/826/103 505/808/98 504/810/99 -f 511/827/104 506/811/100 505/808/98 -f 506/811/100 507/823/101 501/797/95 -f 513/828/105 508/829/106 507/823/101 -f 514/830/107 509/824/102 508/829/106 -f 515/831/108 510/825/103 509/824/102 -f 516/832/109 511/827/104 510/826/103 -f 517/833/110 512/834/111 511/827/104 -f 512/834/111 513/828/105 507/823/101 -f 519/835/112 514/830/107 513/828/105 -f 520/836/113 515/831/108 514/830/107 -f 515/831/108 522/837/114 516/838/109 -f 516/832/109 523/839/115 517/833/110 -f 517/833/110 524/840/116 518/841/117 -f 518/841/117 519/835/112 513/828/105 -f 489/842/116 500/843/105 495/844/117 -f 496/845/110 489/842/116 495/844/117 -f 491/846/114 496/845/110 497/847/109 -f 498/848/108 491/849/114 497/850/109 -f 493/851/113 498/848/108 499/852/107 -f 494/853/112 499/852/107 500/843/105 -f 525/854/111 500/843/105 530/855/101 -f 496/845/110 525/854/111 526/856/104 -f 497/847/109 526/856/104 527/857/103 -f 528/858/102 497/850/109 527/859/103 -f 499/852/107 528/858/102 529/860/106 -f 500/843/105 529/860/106 530/855/101 -f 525/854/111 536/800/95 531/813/100 -f 526/856/104 531/813/100 532/805/98 -f 527/857/103 532/805/98 533/807/99 -f 534/815/96 527/859/103 533/821/99 -f 535/816/97 528/858/102 534/815/96 -f 530/855/101 535/816/97 536/800/95 -f 538/861/22 539/862/41 537/863/22 -f 540/864/41 541/865/39 539/866/41 -f 542/867/39 543/868/92 541/869/39 -f 544/870/92 545/871/23 543/872/92 -f 546/873/23 547/874/90 545/875/23 -f 548/876/90 549/877/28 547/878/90 -f 550/879/28 551/880/44 549/881/28 -f 552/882/44 553/883/24 551/884/44 -f 554/885/24 555/886/42 553/887/24 -f 556/888/42 557/889/27 555/890/42 -f 558/891/27 559/892/91 557/893/27 -f 560/894/91 561/895/21 559/896/91 -f 562/897/21 563/898/45 561/899/21 -f 564/900/45 565/901/29 563/902/45 -f 566/903/29 567/904/43 565/905/29 -f 568/906/43 537/907/22 567/908/43 -f 569/909/42 587/910/27 571/911/27 -f 578/912/41 595/913/39 579/914/39 -f 571/915/27 588/916/91 572/917/91 -f 579/918/39 596/919/92 580/920/92 -f 572/921/91 589/922/21 573/923/21 -f 580/924/92 597/925/23 581/926/23 -f 573/927/21 590/928/45 574/929/45 -f 581/930/23 598/931/90 582/932/90 -f 574/933/45 591/934/29 575/935/29 -f 582/936/90 599/937/28 583/938/28 -f 575/939/29 592/940/43 576/941/43 -f 583/942/28 600/943/44 584/944/44 -f 576/945/43 593/946/22 577/947/22 -f 570/948/24 585/949/42 569/950/42 -f 584/951/44 586/952/24 570/953/24 -f 577/954/22 594/955/41 578/956/41 -f 625/526/22 658/957/39 626/958/39 -f 612/959/28 645/960/24 613/961/24 -f 626/962/39 659/963/23 627/964/23 -f 601/513/22 634/965/39 602/493/39 -f 613/961/24 646/966/27 614/967/27 -f 627/964/23 660/968/28 628/969/28 -f 614/967/27 647/970/21 615/971/21 -f 628/969/28 661/972/24 629/973/24 -f 615/971/21 648/974/29 616/975/29 -f 629/973/24 662/976/27 630/977/27 -f 616/975/29 641/978/22 609/507/22 -f 603/495/23 636/979/28 604/980/28 -f 630/977/27 663/981/21 631/982/21 -f 617/501/22 650/983/39 618/530/39 -f 604/980/28 637/984/24 605/527/24 -f 631/982/21 664/985/29 632/524/29 -f 689/986/54 696/987/60 690/988/47 -f 685/989/58 692/990/59 686/991/50 -f 684/992/52 681/993/48 682/994/53 -f 689/986/54 694/995/55 695/996/54 -f 685/989/58 682/997/53 691/998/58 -f 688/999/56 693/1000/51 694/1001/55 -f 690/988/47 681/1002/48 683/1003/48 -f 686/991/50 693/1004/51 687/1005/51 -f 602/493/39 634/965/39 635/494/23 -f 611/496/23 643/503/23 644/497/28 -f 624/499/29 656/1006/29 649/500/22 -f 610/502/39 642/508/39 643/503/23 -f 623/504/21 655/510/21 656/505/29 -f 609/507/22 641/978/22 642/508/39 -f 622/509/27 654/515/27 655/510/21 -f 608/511/29 640/517/29 633/512/22 -f 621/514/24 653/519/24 654/515/27 -f 607/516/21 639/521/21 640/517/29 -f 620/518/28 652/523/28 653/519/24 -f 606/520/27 638/1007/27 639/521/21 -f 619/522/23 651/531/23 652/523/28 -f 632/524/29 664/985/29 657/525/22 -f 605/527/24 637/984/24 638/528/27 -f 618/530/39 650/983/39 651/531/23 -f 274/532/39 667/701/39 666/533/41 -f 124/535/22 126/541/39 125/536/39 -f 267/538/42 674/702/42 673/539/24 -f 126/541/39 128/546/23 127/542/23 -f 276/543/22 665/1008/22 680/544/43 -f 128/546/23 130/550/28 129/547/28 -f 275/534/41 666/533/41 665/548/22 -f 130/550/28 132/555/24 131/551/24 -f 268/552/24 673/1009/24 672/553/44 -f 132/555/24 134/559/27 133/556/27 -f 261/545/43 680/544/43 679/557/29 -f 134/559/27 136/1010/21 135/560/21 -f 269/554/44 672/553/44 671/561/28 -f 136/563/21 138/568/29 137/564/29 -f 262/558/29 679/557/29 678/566/45 -f 138/568/29 124/535/22 123/537/22 -f 176/569/39 178/613/46 177/570/46 -f 734/572/47 740/1011/60 741/573/48 -f 148/575/29 150/581/49 149/576/49 -f 738/578/50 744/1012/59 729/579/51 -f 150/581/49 152/588/39 151/582/39 -f 174/583/49 176/569/39 175/571/39 -f 736/585/52 735/574/48 741/586/48 -f 152/588/39 154/593/46 153/589/46 -f 733/590/54 732/597/56 730/591/55 -f 154/593/46 156/600/28 155/594/28 -f 172/595/29 174/583/49 173/584/49 -f 732/597/56 731/1013/51 729/598/51 -f 156/600/28 158/604/57 157/601/57 -f 737/602/58 743/1014/58 744/603/59 -f 158/604/57 160/607/27 159/605/27 -f 733/590/54 739/1015/54 740/606/60 -f 160/607/27 162/611/61 161/608/61 -f 737/602/58 736/585/52 742/609/53 -f 162/611/61 148/1016/29 147/612/29 -f 178/613/46 180/615/28 179/614/28 -f 180/615/28 182/617/57 181/616/57 -f 182/617/57 184/619/27 183/618/27 -f 184/619/27 186/621/61 185/620/61 -f 186/621/61 172/1017/29 171/622/29 -f 217/623/62 218/630/64 203/624/63 -f 251/626/64 194/642/63 197/627/26 -f 219/629/65 202/644/71 203/624/63 -f 248/631/66 199/645/69 196/632/25 -f 221/634/66 200/638/69 201/635/25 -f 222/637/68 195/646/70 200/638/69 -f 247/639/68 252/628/62 197/627/26 -f 250/641/65 193/648/71 194/642/63 -f 220/643/67 201/1018/25 202/644/71 -f 247/639/68 198/640/70 199/645/69 -f 222/637/68 217/623/62 204/625/26 -f 249/647/67 196/1019/25 193/648/71 -f 217/623/62 223/655/78 224/649/72 -f 218/630/64 224/649/72 225/650/73 -f 219/629/65 225/650/73 226/651/74 -f 220/636/67 226/658/74 227/652/75 -f 227/652/75 228/653/76 222/637/68 -f 228/653/76 223/655/78 217/623/62 -f 229/654/77 230/656/79 224/649/72 -f 230/656/79 231/657/80 225/650/73 -f 231/657/80 232/663/85 226/651/74 -f 226/658/74 232/665/85 233/659/81 -f 233/659/81 234/667/88 228/653/76 -f 228/653/76 234/667/88 229/654/77 -f 235/660/82 236/661/83 230/656/79 -f 236/661/83 237/662/84 231/657/80 -f 237/662/84 238/1020/86 232/663/85 -f 238/664/86 239/1021/89 233/659/81 -f 233/659/81 239/1021/89 240/666/87 -f 234/667/88 240/666/87 235/660/82 -f 205/668/87 210/679/82 216/669/77 -f 212/671/81 206/673/89 205/668/87 -f 213/672/85 207/1022/86 206/673/89 -f 214/674/80 208/678/84 207/675/86 -f 215/677/79 209/1023/83 208/678/84 -f 210/679/82 209/1023/83 215/677/79 -f 241/680/76 211/670/88 216/669/77 -f 212/671/81 211/670/88 241/680/76 -f 243/683/74 213/672/85 212/671/81 -f 244/684/73 214/674/80 213/676/85 -f 215/677/79 214/674/80 244/684/73 -f 216/669/77 215/677/79 245/686/72 -f 241/680/76 246/681/78 252/628/62 -f 242/682/75 241/680/76 247/639/68 -f 249/633/67 243/683/74 242/682/75 -f 250/641/65 244/684/73 243/685/74 -f 251/626/64 245/686/72 244/684/73 -f 252/628/62 246/681/78 245/686/72 -f 270/562/28 671/561/28 670/687/90 -f 263/567/45 678/566/45 677/689/21 -f 271/688/90 670/687/90 669/691/23 -f 264/693/21 677/1024/21 676/694/91 -f 272/696/23 669/1025/23 668/697/92 -f 265/695/91 676/694/91 675/699/27 -f 273/698/92 668/697/92 667/701/39 -f 266/700/27 675/699/27 674/702/42 -f 285/703/30 286/719/38 280/704/38 -f 289/706/40 291/1026/40 282/707/32 -f 285/703/30 279/1027/30 278/709/36 -f 290/711/35 292/1028/35 291/712/40 -f 287/713/93 288/708/32 282/714/32 -f 284/716/36 278/1029/36 277/717/94 -f 286/719/38 287/713/93 281/720/93 -f 283/718/94 277/1030/94 292/722/35 -f 460/723/27 462/779/61 461/724/61 -f 702/726/50 708/1031/59 709/727/51 -f 432/729/28 434/738/57 433/730/57 -f 718/732/47 724/1032/60 725/733/48 -f 706/735/47 712/1033/60 697/736/48 -f 434/738/57 436/745/27 435/739/27 -f 458/740/57 460/723/27 459/725/27 -f 704/742/56 703/728/51 709/743/51 -f 436/745/27 438/753/61 437/746/61 -f 722/747/50 728/1034/59 713/748/51 -f 701/750/58 700/757/52 698/751/53 -f 438/753/61 440/760/29 439/754/29 -f 456/755/28 458/740/57 457/741/57 -f 700/757/52 699/1035/48 697/758/48 -f 440/760/29 442/767/49 441/761/49 -f 720/762/52 719/734/48 725/763/48 -f 705/765/54 711/1036/54 712/766/60 -f 442/767/49 444/770/39 443/768/39 -f 701/750/58 707/1037/58 708/769/59 -f 444/770/39 446/777/46 445/771/46 -f 717/772/54 716/786/56 714/773/55 -f 705/765/54 704/742/56 710/775/55 -f 446/777/46 432/1038/28 431/778/28 -f 462/779/61 464/784/29 463/780/29 -f 721/781/58 720/762/52 726/782/53 -f 464/784/29 466/789/49 465/785/49 -f 716/786/56 715/1039/51 713/787/51 -f 466/789/49 468/792/39 467/790/39 -f 717/772/54 723/1040/54 724/791/60 -f 468/792/39 470/795/46 469/793/46 -f 721/781/58 727/1041/58 728/794/59 -f 470/795/46 456/1042/28 455/796/28 -f 501/797/95 502/804/97 487/798/70 -f 536/800/95 535/816/97 478/801/70 -f 503/803/96 486/818/69 487/798/70 -f 532/805/98 483/819/71 480/806/25 -f 505/808/98 484/812/71 485/809/25 -f 506/811/100 479/820/63 484/812/71 -f 531/813/100 536/800/95 481/802/26 -f 534/815/96 477/822/69 478/801/70 -f 504/817/99 485/1043/25 486/818/69 -f 531/813/100 482/814/63 483/819/71 -f 501/797/95 488/799/26 479/820/63 -f 533/821/99 480/1044/25 477/822/69 -f 507/823/101 508/829/106 502/804/97 -f 502/804/97 508/829/106 509/824/102 -f 503/803/96 509/824/102 510/825/103 -f 510/826/103 511/827/104 505/808/98 -f 511/827/104 512/834/111 506/811/100 -f 506/811/100 512/834/111 507/823/101 -f 513/828/105 514/830/107 508/829/106 -f 514/830/107 515/831/108 509/824/102 -f 515/831/108 516/838/109 510/825/103 -f 516/832/109 517/833/110 511/827/104 -f 517/833/110 518/841/117 512/834/111 -f 512/834/111 518/841/117 513/828/105 -f 519/835/112 520/836/113 514/830/107 -f 520/836/113 521/1045/118 515/831/108 -f 515/831/108 521/1045/118 522/837/114 -f 516/832/109 522/1046/114 523/839/115 -f 517/833/110 523/839/115 524/840/116 -f 518/841/117 524/840/116 519/835/112 -f 489/842/116 494/853/112 500/843/105 -f 496/845/110 490/1047/115 489/842/116 -f 491/846/114 490/1047/115 496/845/110 -f 498/848/108 492/1048/118 491/849/114 -f 493/851/113 492/1048/118 498/848/108 -f 494/853/112 493/851/113 499/852/107 -f 525/854/111 495/844/117 500/843/105 -f 496/845/110 495/844/117 525/854/111 -f 497/847/109 496/845/110 526/856/104 -f 528/858/102 498/848/108 497/850/109 -f 499/852/107 498/848/108 528/858/102 -f 500/843/105 499/852/107 529/860/106 -f 525/854/111 530/855/101 536/800/95 -f 526/856/104 525/854/111 531/813/100 -f 527/857/103 526/856/104 532/805/98 -f 534/815/96 528/858/102 527/859/103 -f 535/816/97 529/860/106 528/858/102 -f 530/855/101 529/860/106 535/816/97 -f 538/861/22 540/1049/41 539/862/41 -f 540/864/41 542/1050/39 541/865/39 -f 542/867/39 544/1051/92 543/868/92 -f 544/870/92 546/1052/23 545/871/23 -f 546/873/23 548/1053/90 547/874/90 -f 548/876/90 550/1054/28 549/877/28 -f 550/879/28 552/1055/44 551/880/44 -f 552/882/44 554/1056/24 553/883/24 -f 554/885/24 556/1057/42 555/886/42 -f 556/888/42 558/1058/27 557/889/27 -f 558/891/27 560/1059/91 559/892/91 -f 560/894/91 562/1060/21 561/895/21 -f 562/897/21 564/1061/45 563/898/45 -f 564/900/45 566/1062/29 565/901/29 -f 566/903/29 568/1063/43 567/904/43 -f 568/906/43 538/1064/22 537/907/22 -f 569/909/42 585/1065/42 587/910/27 -f 578/912/41 594/1066/41 595/913/39 -f 571/915/27 587/1067/27 588/916/91 -f 579/918/39 595/1068/39 596/919/92 -f 572/921/91 588/1069/91 589/922/21 -f 580/924/92 596/1070/92 597/925/23 -f 573/927/21 589/1071/21 590/928/45 -f 581/930/23 597/1072/23 598/931/90 -f 574/933/45 590/1073/45 591/934/29 -f 582/936/90 598/1074/90 599/937/28 -f 575/939/29 591/1075/29 592/940/43 -f 583/942/28 599/1076/28 600/943/44 -f 576/945/43 592/1077/43 593/946/22 -f 570/948/24 586/1078/24 585/949/42 -f 584/951/44 600/1079/44 586/952/24 -f 577/954/22 593/1080/22 594/955/41 -f 625/526/22 657/525/22 658/957/39 -f 612/959/28 644/1081/28 645/960/24 -f 626/962/39 658/1082/39 659/963/23 -f 601/513/22 633/512/22 634/965/39 -f 613/961/24 645/960/24 646/966/27 -f 627/964/23 659/963/23 660/968/28 -f 614/967/27 646/966/27 647/970/21 -f 628/969/28 660/968/28 661/972/24 -f 615/971/21 647/970/21 648/974/29 -f 629/973/24 661/972/24 662/976/27 -f 616/975/29 648/974/29 641/978/22 -f 603/495/23 635/494/23 636/979/28 -f 630/977/27 662/976/27 663/981/21 -f 617/501/22 649/500/22 650/983/39 -f 604/980/28 636/979/28 637/984/24 -f 631/982/21 663/981/21 664/985/29 -f 689/986/54 695/1083/54 696/987/60 -f 685/989/58 691/1084/58 692/990/59 -f 684/992/52 683/1085/48 681/993/48 -f 689/986/54 688/999/56 694/995/55 -f 685/989/58 684/992/52 682/997/53 -f 688/999/56 687/1005/51 693/1000/51 -f 690/988/47 696/1086/60 681/1002/48 -f 686/991/50 692/1087/59 693/1004/51 +usemtl Texture +f 96/1/1 31/2/2 27/3/1 +f 44/4/3 24/5/4 26/6/3 +f 48/7/4 22/8/5 24/5/4 +f 52/9/5 20/10/6 22/8/5 +f 56/11/6 18/12/7 20/10/6 +f 60/13/7 16/14/8 18/12/7 +f 64/15/8 14/16/9 16/14/8 +f 68/17/9 12/18/10 14/19/9 +f 72/20/10 10/21/11 12/18/10 +f 76/22/11 8/23/12 10/21/11 +f 80/24/12 6/25/13 8/23/12 +f 84/26/13 4/27/14 6/25/13 +f 88/28/14 2/29/15 4/27/14 +f 92/30/15 27/3/1 2/29/15 +f 40/31/16 26/6/3 30/32/16 +f 34/33/2 29/34/16 38/35/16 +f 55/36/14 151/37/15 59/38/15 +f 36/39/2 30/32/16 31/2/2 +f 38/35/17 33/40/18 34/33/18 +f 36/39/19 130/41/20 40/31/20 +f 42/42/21 37/43/17 38/35/17 +f 40/44/20 131/45/22 44/46/22 +f 46/47/23 41/48/21 42/42/21 +f 44/4/22 132/49/24 48/7/24 +f 50/50/25 45/51/23 46/47/23 +f 48/52/24 133/53/26 52/54/26 +f 54/55/27 49/56/25 50/50/25 +f 52/9/26 134/57/28 56/11/28 +f 58/58/29 53/59/27 54/55/27 +f 56/60/28 135/61/30 60/62/30 +f 62/63/31 57/64/29 58/58/29 +f 60/13/30 136/65/32 64/15/32 +f 66/66/33 61/67/31 62/63/31 +f 64/68/32 137/69/34 68/70/34 +f 70/71/35 65/72/33 66/73/33 +f 68/17/34 138/74/36 72/20/36 +f 74/75/37 69/76/35 70/71/35 +f 72/77/36 139/78/38 76/79/38 +f 78/80/39 73/81/37 74/75/37 +f 76/22/38 140/82/40 80/24/40 +f 82/83/41 77/84/39 78/80/39 +f 80/85/40 141/86/42 84/87/42 +f 86/88/43 81/89/41 82/83/41 +f 84/26/42 142/90/44 88/28/44 +f 90/91/45 85/92/43 86/88/43 +f 88/93/44 143/94/46 92/95/46 +f 94/96/47 89/97/45 90/91/45 +f 92/30/46 144/98/48 96/1/48 +f 34/33/18 93/99/47 94/96/47 +f 96/100/48 129/101/19 36/102/19 +f 31/2/49 125/103/50 128/104/49 +f 29/34/16 42/42/3 38/35/16 +f 30/32/50 121/105/51 125/103/50 +f 1/106/15 94/96/1 90/91/15 +f 2/29/52 124/107/53 97/108/52 +f 3/109/14 90/91/15 86/88/14 +f 4/27/54 97/108/52 99/110/54 +f 5/111/13 86/88/14 82/83/13 +f 6/25/55 99/110/54 101/112/55 +f 7/113/12 82/83/13 78/80/12 +f 103/114/56 6/25/55 101/112/55 +f 9/115/11 78/80/12 74/75/11 +f 10/21/57 103/114/56 105/116/57 +f 11/117/10 74/75/11 70/71/10 +f 12/18/58 105/116/57 107/118/58 +f 13/119/9 70/71/10 66/73/9 +f 14/19/59 107/118/58 109/120/59 +f 15/121/8 66/66/9 62/63/8 +f 111/122/60 14/16/59 109/123/59 +f 17/124/7 62/63/8 58/58/7 +f 18/12/61 111/122/60 113/125/61 +f 19/126/6 58/58/7 54/55/6 +f 20/10/62 113/125/61 115/127/62 +f 21/128/5 54/55/6 50/50/5 +f 22/8/63 115/127/62 117/129/63 +f 23/130/4 50/50/5 46/47/4 +f 119/131/64 22/8/63 117/129/63 +f 25/132/3 46/47/4 42/42/3 +f 26/6/51 119/131/64 121/105/51 +f 28/133/1 34/33/2 94/96/1 +f 27/3/53 128/104/49 124/107/53 +f 28/133/65 127/134/66 32/135/66 +f 124/107/1 127/134/2 123/136/1 +f 122/137/67 23/130/68 25/132/67 +f 121/105/3 120/138/4 122/137/3 +f 120/138/68 21/128/69 23/130/68 +f 119/131/4 118/139/5 120/138/4 +f 21/128/69 116/140/70 19/126/70 +f 117/129/5 116/140/6 118/139/5 +f 19/126/70 114/141/71 17/124/71 +f 115/127/6 114/141/7 116/140/6 +f 114/141/71 15/121/72 17/124/71 +f 113/125/7 112/142/8 114/141/7 +f 112/142/72 13/143/73 15/121/72 +f 111/122/8 110/144/9 112/142/8 +f 13/119/73 108/145/74 11/117/74 +f 109/120/9 108/145/10 110/146/9 +f 11/117/74 106/147/75 9/115/75 +f 107/118/10 106/147/11 108/145/10 +f 106/147/75 7/113/76 9/115/75 +f 105/116/11 104/148/12 106/147/11 +f 104/148/76 5/111/77 7/113/76 +f 103/114/12 102/149/13 104/148/12 +f 5/111/77 100/150/78 3/109/78 +f 101/112/13 100/150/14 102/149/13 +f 3/109/78 98/151/79 1/106/79 +f 99/110/14 98/151/15 100/150/14 +f 98/151/79 28/133/65 1/106/79 +f 97/108/15 123/136/1 98/151/15 +f 29/34/80 122/137/67 25/132/67 +f 125/103/16 122/137/3 126/152/16 +f 32/135/66 126/152/80 29/34/80 +f 127/134/2 125/103/16 126/152/16 +f 39/153/81 129/101/81 35/154/81 +f 43/155/81 130/156/81 39/153/81 +f 47/157/81 131/45/81 43/155/81 +f 47/157/81 133/53/81 132/158/81 +f 55/36/81 133/53/81 51/159/81 +f 59/38/81 134/160/81 55/36/81 +f 63/161/81 135/61/81 59/38/81 +f 63/161/81 137/69/81 136/162/81 +f 71/163/81 137/164/81 67/165/81 +f 75/166/81 138/167/81 71/163/81 +f 79/168/81 139/78/81 75/166/81 +f 79/168/81 141/86/81 140/169/81 +f 87/170/81 141/86/81 83/171/81 +f 91/172/81 142/173/81 87/170/81 +f 95/174/81 143/94/81 91/172/81 +f 95/174/81 129/101/81 144/175/81 +f 87/170/6 159/176/7 91/172/7 +f 59/38/15 152/177/1 63/161/1 +f 91/172/7 160/178/8 95/174/8 +f 63/161/1 153/179/2 67/180/2 +f 35/154/9 146/181/10 39/153/10 +f 95/174/8 145/182/9 35/154/9 +f 67/165/2 154/183/16 71/163/16 +f 39/153/10 147/184/11 43/155/11 +f 71/163/16 155/185/3 75/166/3 +f 43/155/11 148/186/12 47/157/12 +f 75/166/3 156/187/4 79/168/4 +f 47/157/12 149/188/13 51/159/13 +f 79/168/4 157/189/5 83/171/5 +f 51/159/13 150/190/14 55/36/14 +f 83/171/5 158/191/6 87/170/6 +f 146/192/81 145/193/81 161/194/81 +f 145/195/81 160/196/81 161/197/81 +f 160/198/81 159/199/81 161/200/81 +f 159/201/81 158/202/81 161/203/81 +f 158/204/81 157/205/81 161/206/81 +f 157/207/81 156/208/81 161/209/81 +f 156/210/81 155/211/81 161/212/81 +f 155/213/81 154/214/81 161/215/81 +f 154/216/81 153/217/81 161/218/81 +f 153/219/81 152/220/81 161/221/81 +f 152/222/81 151/223/81 161/224/81 +f 151/225/81 150/226/81 161/227/81 +f 150/228/81 149/229/81 161/230/81 +f 149/231/81 148/232/81 161/233/81 +f 148/234/81 147/235/81 161/236/81 +f 147/237/81 146/238/81 161/239/81 +f 163/240/82 164/241/83 162/242/82 +f 165/243/83 166/244/84 164/241/83 +f 167/245/84 168/246/85 166/244/84 +f 169/247/85 170/248/86 168/246/85 +f 171/249/86 172/250/87 170/248/86 +f 173/251/87 174/252/88 172/250/87 +f 175/253/88 176/254/89 174/255/88 +f 177/256/89 178/257/90 176/254/89 +f 179/258/90 180/259/91 178/257/90 +f 181/260/91 182/261/92 180/259/91 +f 183/262/81 175/263/81 167/264/81 +f 183/265/92 184/266/93 182/261/92 +f 185/267/93 162/242/82 184/266/93 +f 186/268/94 190/269/94 189/270/94 +f 186/268/94 192/271/94 188/272/94 +f 205/273/95 189/270/10 190/269/95 +f 191/274/10 192/271/11 189/270/10 +f 193/275/11 194/276/12 192/271/11 +f 188/272/94 194/276/94 196/277/94 +f 195/278/12 197/279/96 194/276/12 +f 196/277/94 197/279/94 198/280/94 +f 200/281/97 197/279/97 199/282/97 +f 201/283/81 199/282/81 195/278/81 +f 202/284/81 195/278/81 193/275/81 +f 202/284/81 191/274/81 203/285/81 +f 203/285/81 205/273/81 204/286/81 +f 190/269/98 204/287/98 205/273/98 +f 206/268/94 210/269/94 209/270/94 +f 206/268/94 212/271/94 208/272/94 +f 225/273/98 209/270/6 210/269/98 +f 211/274/6 212/271/7 209/270/6 +f 213/275/7 214/276/8 212/271/7 +f 208/272/94 214/276/94 216/277/94 +f 215/278/8 217/279/99 214/276/8 +f 216/277/94 217/279/94 218/280/94 +f 220/281/96 217/279/96 219/282/96 +f 221/283/81 219/282/81 215/278/81 +f 221/283/81 213/275/81 222/284/81 +f 223/285/81 213/275/81 211/274/81 +f 223/285/81 225/273/81 224/286/81 +f 210/269/100 224/287/100 225/273/100 +f 226/268/94 230/269/94 229/270/94 +f 226/268/94 232/271/94 228/272/94 +f 245/273/100 229/270/16 230/269/100 +f 231/274/16 232/271/3 229/270/16 +f 233/275/3 234/276/4 232/271/3 +f 228/272/94 234/276/94 236/277/94 +f 235/278/4 237/279/101 234/276/4 +f 236/277/94 237/279/94 238/280/94 +f 240/281/99 237/279/99 239/282/99 +f 241/283/81 239/282/81 235/278/81 +f 241/283/81 233/275/81 242/284/81 +f 242/284/81 231/274/81 243/285/81 +f 243/285/81 245/273/81 244/286/81 +f 230/269/102 244/287/102 245/273/102 +f 246/268/94 250/269/94 249/270/94 +f 246/268/94 252/271/94 248/272/94 +f 265/273/102 249/270/14 250/269/102 +f 251/274/14 252/271/15 249/270/14 +f 253/275/15 254/276/1 252/271/15 +f 248/272/94 254/276/94 256/277/94 +f 255/278/1 257/279/97 254/276/1 +f 256/277/94 257/279/94 258/280/94 +f 260/281/101 257/279/101 259/282/101 +f 261/283/81 259/282/81 255/278/81 +f 261/283/81 253/275/81 262/284/81 +f 263/285/81 253/275/81 251/274/81 +f 263/285/81 265/273/81 264/286/81 +f 250/269/95 264/287/95 265/273/95 +f 289/288/9 266/289/9 275/290/9 +f 287/291/5 274/292/5 279/293/5 +f 280/294/69 296/295/69 277/296/69 +f 283/297/13 270/298/13 267/299/13 +f 285/300/2 278/301/2 271/302/2 +f 282/303/11 267/304/11 266/289/11 +f 271/302/15 284/305/15 285/300/15 +f 279/306/3 286/307/3 287/308/3 +f 275/290/7 288/309/7 289/288/7 +f 279/293/94 275/310/94 267/311/94 +f 269/312/81 283/313/81 282/314/81 +f 273/315/81 285/316/81 284/317/81 +f 281/318/81 287/319/81 286/320/81 +f 277/321/81 289/322/81 288/323/81 +f 273/315/81 283/313/81 268/324/81 +f 269/312/81 289/322/81 276/325/81 +f 277/321/81 287/319/81 280/326/81 +f 281/318/81 285/316/81 272/327/81 +f 292/328/81 290/329/81 296/330/81 +f 268/331/77 292/332/77 273/333/77 +f 281/334/103 295/335/104 280/336/104 +f 269/337/105 291/338/106 268/339/106 +f 272/340/66 294/341/66 281/342/66 +f 276/343/73 290/344/73 269/345/73 +f 277/346/107 297/347/108 276/348/108 +f 273/349/109 293/350/110 272/351/110 +f 298/352/111 301/353/111 299/354/111 +f 309/355/98 316/356/98 311/357/98 +f 300/358/81 316/359/81 301/353/81 +f 302/360/81 321/361/81 303/362/81 +f 304/363/95 306/364/95 305/365/95 +f 301/353/98 307/366/98 299/354/98 +f 303/367/98 323/368/98 313/369/98 +f 298/352/100 318/370/100 319/371/100 +f 319/372/102 306/373/102 298/352/102 +f 298/352/102 308/374/102 300/358/102 +f 321/361/5 326/375/5 323/368/5 +f 315/376/112 317/356/112 316/359/113 +f 314/377/95 303/362/95 317/356/95 +f 315/377/102 308/378/102 310/379/102 +f 310/380/102 302/381/102 314/382/102 +f 311/383/98 303/384/98 313/385/98 +f 317/357/98 311/356/98 316/362/98 +f 315/360/102 310/377/102 314/379/102 +f 319/371/114 304/386/114 305/387/114 +f 318/388/98 307/389/98 304/390/98 +f 322/391/102 302/392/102 312/393/102 +f 322/391/13 324/394/13 320/395/13 +f 320/395/81 327/396/81 321/361/81 +f 328/397/112 331/398/112 329/399/112 +f 339/400/102 346/401/102 341/402/102 +f 330/403/81 346/404/81 331/398/81 +f 332/405/81 351/406/81 333/407/81 +f 334/363/100 336/364/100 335/365/100 +f 331/398/102 337/408/102 329/399/102 +f 333/409/102 353/410/102 343/411/102 +f 328/397/95 348/412/95 349/413/95 +f 349/414/98 336/415/98 328/397/98 +f 328/397/98 338/416/98 330/403/98 +f 351/406/13 356/417/13 353/410/13 +f 345/418/111 347/401/111 346/404/115 +f 347/401/100 332/405/100 333/407/100 +f 345/419/98 338/420/98 340/421/98 +f 340/380/98 332/381/98 344/382/98 +f 341/383/102 333/384/102 343/385/102 +f 347/402/102 341/401/102 346/407/102 +f 345/405/98 340/419/98 344/421/98 +f 348/412/116 335/422/116 349/413/116 +f 348/423/102 337/424/102 334/425/102 +f 352/426/98 332/427/98 342/428/98 +f 352/426/5 354/429/5 350/430/5 +f 350/430/81 357/431/81 351/406/81 +f 358/432/117 361/433/117 359/434/117 +f 369/435/95 376/436/95 371/437/95 +f 360/438/81 376/439/81 361/433/81 +f 362/440/81 381/441/81 363/442/81 +f 364/363/102 366/364/102 365/365/102 +f 361/433/95 367/443/95 359/434/95 +f 363/444/95 383/445/95 373/446/95 +f 358/432/98 378/447/98 379/448/98 +f 379/449/100 366/450/100 358/432/100 +f 358/432/100 368/451/100 360/438/100 +f 381/441/9 386/452/9 383/445/9 +f 375/453/118 377/436/118 376/439/118 +f 374/454/102 363/442/102 377/436/102 +f 375/454/100 368/455/100 370/456/100 +f 370/380/100 362/381/100 374/382/100 +f 371/383/95 363/384/95 373/385/95 +f 377/437/95 371/436/95 376/442/95 +f 375/440/100 370/454/100 374/456/100 +f 378/447/119 365/457/119 379/448/119 +f 378/458/95 367/459/95 364/460/95 +f 382/461/100 362/462/100 372/463/100 +f 382/461/2 384/464/2 380/465/2 +f 380/465/81 387/466/81 381/441/81 +f 388/467/118 391/468/118 389/469/118 +f 399/470/100 406/471/100 401/472/100 +f 390/473/81 406/474/81 391/468/81 +f 392/475/81 411/476/81 393/477/81 +f 394/363/98 396/364/98 395/365/98 +f 391/468/100 397/478/100 389/469/100 +f 393/479/100 413/480/100 403/481/100 +f 388/467/102 408/482/102 409/483/102 +f 409/484/95 396/485/95 388/467/95 +f 388/467/95 398/486/95 390/473/95 +f 411/476/2 416/487/2 413/480/2 +f 405/488/117 407/471/117 406/474/117 +f 404/489/98 393/477/98 407/471/98 +f 405/489/95 398/490/95 400/491/95 +f 400/380/95 392/381/95 404/382/95 +f 401/383/100 393/384/100 403/385/100 +f 407/472/100 401/471/100 406/477/100 +f 405/475/95 400/489/95 404/491/95 +f 409/483/120 394/492/120 395/493/120 +f 408/494/100 397/495/100 394/496/100 +f 412/497/95 392/498/95 402/499/95 +f 412/497/9 414/500/9 410/501/9 +f 410/501/81 417/502/81 411/476/81 +f 423/503/121 424/504/121 420/505/121 +f 422/506/5 418/507/5 421/508/5 +f 420/509/81 422/506/81 423/510/81 +f 420/511/9 418/507/9 419/512/9 +f 423/513/2 421/508/2 425/514/2 +f 431/503/121 432/504/121 428/505/121 +f 430/506/5 426/507/5 429/508/5 +f 428/509/81 430/506/81 431/510/81 +f 428/511/9 426/507/9 427/512/9 +f 431/513/2 429/508/2 433/514/2 +f 439/503/121 440/504/121 436/505/121 +f 438/506/5 434/507/5 437/508/5 +f 436/509/81 438/506/81 439/510/81 +f 436/511/9 434/507/9 435/512/9 +f 439/513/2 437/508/2 441/514/2 +f 447/503/122 448/504/122 444/505/122 +f 446/506/9 442/507/9 445/508/9 +f 444/509/81 446/506/81 447/510/81 +f 444/511/13 442/507/13 443/512/13 +f 447/513/5 445/508/5 449/514/5 +f 455/503/122 456/504/122 452/505/122 +f 454/506/9 450/507/9 453/508/9 +f 452/509/81 454/506/81 455/510/81 +f 452/511/13 450/507/13 451/512/13 +f 455/513/5 453/508/5 457/514/5 +f 463/503/122 464/504/122 460/505/122 +f 462/506/9 458/507/9 461/508/9 +f 460/509/81 462/506/81 463/510/81 +f 460/511/13 458/507/13 459/512/13 +f 463/513/5 461/508/5 465/514/5 +f 471/503/123 472/504/123 468/505/123 +f 470/506/13 466/507/13 469/508/13 +f 468/509/81 470/506/81 471/510/81 +f 468/511/2 466/507/2 467/512/2 +f 471/513/9 469/508/9 473/514/9 +f 479/503/123 480/504/123 476/505/123 +f 478/506/13 474/507/13 477/508/13 +f 476/509/81 478/506/81 479/510/81 +f 476/511/2 474/507/2 475/512/2 +f 479/513/9 477/508/9 481/514/9 +f 487/503/123 488/504/123 484/505/123 +f 486/506/13 482/507/13 485/508/13 +f 484/509/81 486/506/81 487/510/81 +f 484/511/2 482/507/2 483/512/2 +f 487/513/9 485/508/9 489/514/9 +f 495/503/124 496/504/124 492/505/124 +f 494/506/2 490/507/2 493/508/2 +f 492/509/81 494/506/81 495/510/81 +f 492/511/5 490/507/5 491/512/5 +f 495/513/13 493/508/13 497/514/13 +f 503/503/124 504/504/124 500/505/124 +f 502/506/2 498/507/2 501/508/2 +f 500/509/81 502/506/81 503/510/81 +f 500/511/5 498/507/5 499/512/5 +f 503/513/13 501/508/13 505/514/13 +f 511/503/124 512/504/124 508/505/124 +f 510/506/2 506/507/2 509/508/2 +f 508/509/81 510/506/81 511/510/81 +f 508/511/5 506/507/5 507/512/5 +f 511/513/13 509/508/13 513/514/13 +f 515/515/125 517/516/126 518/517/127 +f 514/518/128 519/519/129 517/520/126 +f 518/521/127 520/522/130 521/523/131 +f 517/524/126 522/525/132 520/526/130 +f 521/527/131 523/528/133 524/529/134 +f 522/530/132 523/531/133 520/532/130 +f 524/533/134 526/534/135 527/535/136 +f 525/536/137 526/537/135 523/538/133 +f 526/539/135 530/540/138 527/541/136 +f 528/542/139 529/543/140 526/544/135 +f 529/545/140 533/546/141 530/547/138 +f 531/548/142 532/549/143 529/550/140 +f 533/551/141 535/552/144 536/553/145 +f 532/554/143 537/555/146 535/556/144 +f 536/557/145 538/558/147 539/559/148 +f 537/560/146 538/561/147 535/562/144 +f 539/563/148 541/564/149 542/565/150 +f 538/566/147 543/567/151 541/568/149 +f 542/569/150 544/570/152 545/571/153 +f 543/572/151 544/573/152 541/574/149 +f 545/575/153 547/576/154 548/577/155 +f 546/578/156 547/579/154 544/580/152 +f 547/581/154 551/582/157 548/583/155 +f 547/584/154 552/585/158 550/586/159 +f 549/587/160 553/588/161 552/585/158 +f 555/589/162 554/590/163 553/588/161 +f 557/591/164 556/592/165 555/593/162 +f 546/578/156 555/593/162 549/594/160 +f 560/595/166 557/596/164 559/597/167 +f 543/572/151 557/596/164 546/598/156 +f 561/599/167 560/600/166 559/601/167 +f 540/602/168 559/601/167 543/567/151 +f 563/603/169 562/604/170 561/605/167 +f 537/560/146 561/605/167 540/606/168 +f 566/607/171 563/608/169 565/609/169 +f 534/610/172 563/608/169 537/555/146 +f 567/611/173 566/612/171 565/613/169 +f 531/548/142 565/613/169 534/614/172 +f 570/615/174 567/616/173 569/617/175 +f 528/542/139 567/618/173 531/619/142 +f 572/620/176 569/621/175 571/622/177 +f 525/536/137 569/623/175 528/624/139 +f 574/625/178 571/626/177 573/627/179 +f 522/530/132 571/626/177 525/628/137 +f 575/629/180 574/630/178 573/631/179 +f 519/632/129 573/631/179 522/525/132 +f 577/633/181 576/634/182 575/635/180 +f 516/636/183 575/635/180 519/519/129 +f 579/637/184 576/634/182 578/638/185 +f 579/639/184 582/640/186 581/641/187 +f 581/642/187 584/643/188 583/644/189 +f 576/645/182 583/646/189 574/630/178 +f 583/647/189 586/648/190 585/649/191 +f 583/647/189 572/650/176 574/625/178 +f 585/651/191 588/652/192 587/653/193 +f 585/651/191 570/654/174 572/620/176 +f 587/655/193 590/656/194 589/657/195 +f 587/655/193 568/658/196 570/615/174 +f 589/659/195 592/660/197 591/661/198 +f 589/659/195 566/612/171 568/662/196 +f 591/663/198 594/664/199 593/665/200 +f 591/666/198 564/667/201 566/607/171 +f 593/668/200 596/669/202 595/670/203 +f 593/668/200 562/604/170 564/671/201 +f 595/672/203 598/673/204 597/674/205 +f 562/675/170 597/676/205 560/600/166 +f 597/677/205 600/678/206 599/679/207 +f 597/677/205 558/680/208 560/595/166 +f 599/681/207 602/682/209 601/683/101 +f 558/684/208 601/685/101 556/592/165 +f 601/686/101 604/687/210 603/688/211 +f 601/689/101 554/590/163 556/690/165 +f 602/691/209 605/692/212 604/687/210 +f 606/693/213 551/582/157 605/692/212 +f 607/694/214 548/577/155 606/695/213 +f 607/694/214 602/682/209 600/696/206 +f 608/697/215 545/571/153 607/698/214 +f 608/697/215 600/678/206 598/699/204 +f 609/700/215 542/565/150 608/701/215 +f 609/700/215 598/673/204 596/702/202 +f 610/703/216 539/559/148 609/704/215 +f 610/703/216 596/669/202 594/705/199 +f 611/706/216 536/553/145 610/707/216 +f 611/706/216 594/664/199 592/708/197 +f 530/547/138 611/709/216 612/710/217 +f 612/710/217 592/660/197 590/711/194 +f 613/712/218 530/540/138 612/713/217 +f 588/714/192 612/715/217 590/656/194 +f 614/716/219 527/535/136 613/717/218 +f 586/718/190 613/719/218 588/652/192 +f 521/527/131 614/720/219 615/721/220 +f 615/721/220 586/648/190 584/722/188 +f 616/723/221 521/523/131 615/724/220 +f 616/723/221 584/643/188 582/725/186 +f 617/726/222 518/517/127 616/727/221 +f 580/728/223 616/727/221 582/640/186 +f 619/729/224 621/730/225 622/731/226 +f 618/732/227 623/733/228 621/734/225 +f 622/735/226 624/736/229 625/737/230 +f 621/738/225 626/739/231 624/740/229 +f 624/741/229 628/742/232 625/743/230 +f 626/744/231 627/745/233 624/746/229 +f 628/747/232 630/748/234 631/749/235 +f 629/750/236 630/751/234 627/752/233 +f 631/753/235 633/754/237 634/755/238 +f 632/756/239 633/757/237 630/758/234 +f 634/759/238 636/760/240 637/761/241 +f 635/762/242 636/763/240 633/764/237 +f 637/765/241 639/766/243 640/767/244 +f 636/768/240 641/769/245 639/770/243 +f 640/771/244 642/772/246 643/773/247 +f 639/774/243 644/775/248 642/776/246 +f 641/777/245 645/778/249 644/775/248 +f 647/779/250 646/780/251 645/778/249 +f 649/781/252 648/782/253 647/783/250 +f 638/784/254 647/783/250 641/769/245 +f 652/785/255 649/786/252 651/787/256 +f 635/762/242 649/786/252 638/788/254 +f 654/789/257 651/790/256 653/791/258 +f 653/792/258 635/793/242 632/756/239 +f 656/794/259 653/795/258 655/796/260 +f 655/797/260 632/798/239 629/750/236 +f 658/799/261 655/800/260 657/801/262 +f 657/801/262 629/802/236 626/744/231 +f 660/803/263 657/804/262 659/805/264 +f 659/805/264 626/739/231 623/806/228 +f 661/807/265 660/808/263 659/809/264 +f 620/810/266 659/809/264 623/733/228 +f 662/811/267 665/812/268 660/808/263 +f 664/813/269 665/814/268 663/815/270 +f 665/816/268 668/817/271 667/818/272 +f 660/803/263 667/819/272 658/820/261 +f 667/821/272 670/822/273 669/823/274 +f 667/821/272 656/824/259 658/799/261 +f 669/825/274 672/826/275 671/827/276 +f 669/825/274 654/828/257 656/794/259 +f 672/829/275 673/830/277 671/831/276 +f 671/831/276 652/832/255 654/789/257 +f 673/833/277 676/834/278 675/835/279 +f 673/833/277 650/836/280 652/785/255 +f 675/837/279 678/838/281 677/839/99 +f 650/840/280 677/841/99 648/782/253 +f 677/842/99 680/843/282 679/844/95 +f 648/845/253 679/846/95 646/780/251 +f 682/847/283 680/843/282 678/848/281 +f 682/847/283 643/773/247 681/849/284 +f 637/765/241 682/850/283 683/851/285 +f 683/851/285 678/838/281 676/852/278 +f 684/853/286 637/761/241 683/854/285 +f 684/853/286 676/834/278 674/855/287 +f 685/856/288 634/755/238 684/857/286 +f 672/829/275 684/858/286 674/859/287 +f 686/860/289 631/749/235 685/861/288 +f 670/862/273 685/863/288 672/826/275 +f 625/743/230 686/864/289 687/865/290 +f 687/865/290 670/822/273 668/866/271 +f 688/867/291 625/737/230 687/868/290 +f 666/869/292 687/868/290 668/817/271 +f 619/729/224 688/870/291 689/871/293 +f 689/871/293 666/872/292 664/813/269 +f 691/515/294 693/516/295 694/517/296 +f 690/518/297 695/519/298 693/520/295 +f 694/521/296 696/522/299 697/523/300 +f 693/524/295 698/525/301 696/526/299 +f 696/873/299 700/529/302 697/527/300 +f 698/530/301 699/531/303 696/532/299 +f 700/533/302 702/534/304 703/535/305 +f 701/536/306 702/537/304 699/538/303 +f 702/539/304 706/540/307 703/541/305 +f 704/542/308 705/543/309 702/544/304 +f 706/547/307 708/874/310 709/546/311 +f 707/548/312 708/549/310 705/550/309 +f 709/551/311 711/552/313 712/553/314 +f 708/554/310 713/555/315 711/556/313 +f 712/557/314 714/558/316 715/559/317 +f 713/560/315 714/561/316 711/562/313 +f 715/563/317 717/564/318 718/565/319 +f 714/566/316 719/567/320 717/568/318 +f 718/569/319 720/570/321 721/571/322 +f 719/572/320 720/573/321 717/574/318 +f 721/575/322 723/576/323 724/577/324 +f 722/578/325 723/579/323 720/580/321 +f 723/581/323 727/582/326 724/583/324 +f 723/584/323 728/585/327 726/586/328 +f 725/587/329 729/588/330 728/585/327 +f 731/589/331 730/590/332 729/588/330 +f 734/684/333 731/593/331 733/591/334 +f 722/578/325 731/593/331 725/594/329 +f 736/595/335 733/596/334 735/597/336 +f 735/597/336 722/598/325 719/572/320 +f 737/599/336 736/600/335 735/601/336 +f 737/599/336 719/567/320 716/602/337 +f 739/603/338 738/604/339 737/605/336 +f 713/560/315 737/605/336 716/606/337 +f 742/607/340 739/608/338 741/609/338 +f 710/610/341 739/608/338 713/555/315 +f 743/611/342 742/612/340 741/613/338 +f 707/548/312 741/613/338 710/614/341 +f 746/615/343 743/616/342 745/617/344 +f 704/542/308 743/618/342 707/619/312 +f 748/620/345 745/621/344 747/622/346 +f 701/536/306 745/623/344 704/624/308 +f 750/625/347 747/626/346 749/627/348 +f 698/530/301 747/626/346 701/628/306 +f 752/645/349 749/631/348 751/629/350 +f 695/632/298 749/631/348 698/525/301 +f 753/633/351 752/634/349 751/635/350 +f 692/636/352 751/635/350 695/519/298 +f 754/638/353 757/875/354 752/634/349 +f 755/639/355 758/640/356 757/641/354 +f 757/642/354 760/643/357 759/644/358 +f 752/645/349 759/646/358 750/630/347 +f 759/647/358 762/648/359 761/649/360 +f 759/647/358 748/650/345 750/625/347 +f 761/651/360 764/652/361 763/653/362 +f 761/651/360 746/654/343 748/620/345 +f 763/655/362 766/656/363 765/657/364 +f 763/655/362 744/658/365 746/615/343 +f 765/659/364 768/660/366 767/661/367 +f 765/659/364 742/612/340 744/662/365 +f 767/663/367 770/664/368 769/665/369 +f 767/666/367 740/667/370 742/607/340 +f 769/668/369 772/669/371 771/670/372 +f 769/668/369 738/604/339 740/671/370 +f 771/672/372 774/673/373 773/674/374 +f 738/675/339 773/676/374 736/600/335 +f 773/677/374 776/678/375 775/679/376 +f 773/677/374 734/680/333 736/595/335 +f 775/681/376 778/682/377 777/683/97 +f 734/684/333 777/685/97 732/592/378 +f 777/686/97 780/687/379 779/688/380 +f 777/689/97 730/590/332 732/690/378 +f 782/693/381 780/687/379 778/691/377 +f 782/693/381 727/582/326 781/692/382 +f 783/694/383 724/577/324 782/695/381 +f 783/694/383 778/682/377 776/696/375 +f 784/697/384 721/571/322 783/698/383 +f 784/697/384 776/678/375 774/699/373 +f 785/700/384 718/565/319 784/701/384 +f 785/700/384 774/673/373 772/702/371 +f 786/703/385 715/559/317 785/704/384 +f 786/703/385 772/669/371 770/705/368 +f 787/706/385 712/553/314 786/707/385 +f 787/706/385 770/664/368 768/708/366 +f 706/547/307 787/709/385 788/710/386 +f 788/710/386 768/660/366 766/711/363 +f 789/712/387 706/540/307 788/713/386 +f 764/714/361 788/715/386 766/656/363 +f 790/716/388 703/535/305 789/717/387 +f 762/718/359 789/719/387 764/652/361 +f 697/527/300 790/720/388 791/721/389 +f 791/721/389 762/648/359 760/722/357 +f 792/723/390 697/523/300 791/724/389 +f 792/723/390 760/643/357 758/725/356 +f 793/726/391 694/517/296 792/727/390 +f 756/728/392 792/727/390 758/640/356 +f 795/729/393 797/730/394 798/731/395 +f 794/732/396 799/733/397 797/734/394 +f 798/735/395 800/736/398 801/737/399 +f 797/738/394 802/739/400 800/740/398 +f 800/741/398 804/742/401 801/743/399 +f 802/744/400 803/745/402 800/746/398 +f 804/747/401 806/748/403 807/749/404 +f 805/750/405 806/751/403 803/752/402 +f 806/876/403 810/755/406 807/753/404 +f 808/756/407 809/757/408 806/758/403 +f 809/877/408 813/761/409 810/759/406 +f 811/762/410 812/763/411 809/764/408 +f 813/765/409 815/766/412 816/767/160 +f 812/768/411 817/769/155 815/770/412 +f 816/771/160 818/772/413 819/773/414 +f 815/774/412 820/775/415 818/776/413 +f 817/777/155 821/778/416 820/775/415 +f 823/779/213 822/780/417 821/778/416 +f 825/781/418 824/782/209 823/783/213 +f 814/784/419 823/783/213 817/769/155 +f 828/785/420 825/786/418 827/787/421 +f 827/787/421 814/788/419 811/762/410 +f 830/789/422 827/790/421 829/791/423 +f 829/792/423 811/793/410 808/756/407 +f 832/794/424 829/795/423 831/796/425 +f 831/797/425 808/798/407 805/750/405 +f 834/799/426 831/800/425 833/801/427 +f 833/801/427 805/802/405 802/744/400 +f 836/803/428 833/804/427 835/805/429 +f 835/805/429 802/739/400 799/806/397 +f 837/807/430 836/808/428 835/809/429 +f 796/810/431 835/809/429 799/733/397 +f 838/811/432 841/812/433 836/808/428 +f 840/813/434 841/814/433 839/815/435 +f 841/816/433 844/817/436 843/818/437 +f 836/803/428 843/819/437 834/820/426 +f 843/821/437 846/822/438 845/823/439 +f 843/821/437 832/824/424 834/799/426 +f 845/825/439 848/826/440 847/827/441 +f 845/825/439 830/828/422 832/794/424 +f 847/831/441 850/859/442 849/830/443 +f 847/831/441 828/832/420 830/789/422 +f 849/833/443 852/834/444 851/835/445 +f 849/833/443 826/836/446 828/785/420 +f 851/837/445 854/838/165 853/839/101 +f 826/840/446 853/841/101 824/782/209 +f 853/842/101 856/843/447 855/844/98 +f 824/845/209 855/846/98 822/780/417 +f 858/847/162 856/843/447 854/848/165 +f 858/847/162 819/773/414 857/849/448 +f 813/765/409 858/850/162 859/851/449 +f 859/851/449 854/838/165 852/852/444 +f 860/853/450 813/761/409 859/854/449 +f 860/853/450 852/834/444 850/855/442 +f 861/856/451 810/755/406 860/857/450 +f 861/878/451 850/859/442 848/829/440 +f 862/860/452 807/749/404 861/861/451 +f 846/862/438 861/863/451 848/826/440 +f 801/743/399 862/864/452 863/865/453 +f 863/865/453 846/822/438 844/866/436 +f 864/867/454 801/737/399 863/868/453 +f 842/869/455 863/868/453 844/817/436 +f 795/729/393 864/870/454 865/871/456 +f 865/871/456 842/872/455 840/813/434 +f 867/515/457 869/516/458 870/517/459 +f 866/518/460 871/519/461 869/520/458 +f 870/521/459 872/522/462 873/523/463 +f 869/524/458 874/525/464 872/526/462 +f 873/527/463 875/528/465 876/529/466 +f 874/530/464 875/531/465 872/532/462 +f 876/533/466 878/534/467 879/535/468 +f 877/536/469 878/537/467 875/538/465 +f 878/539/467 882/540/470 879/541/468 +f 880/542/471 881/543/472 878/544/467 +f 881/545/472 885/546/473 882/547/470 +f 883/548/474 884/549/475 881/550/472 +f 885/551/473 887/552/476 888/553/477 +f 884/554/475 889/555/478 887/556/476 +f 888/557/477 890/558/479 891/559/480 +f 889/560/478 890/561/479 887/562/476 +f 891/563/480 893/564/481 894/565/482 +f 890/566/479 895/567/483 893/568/481 +f 894/569/482 896/570/484 897/571/485 +f 895/572/483 896/573/484 893/574/481 +f 897/575/485 899/576/486 900/577/487 +f 896/580/484 901/594/488 899/579/486 +f 899/581/486 903/582/489 900/583/487 +f 901/587/488 902/586/490 899/584/486 +f 901/587/488 905/588/491 904/585/492 +f 907/589/493 906/590/494 905/588/491 +f 910/684/495 907/593/493 909/591/496 +f 898/578/497 907/593/493 901/594/488 +f 912/595/498 909/596/496 911/597/499 +f 895/572/483 909/596/496 898/598/497 +f 913/599/499 912/600/498 911/601/499 +f 913/599/499 895/567/483 892/602/500 +f 915/603/501 914/604/502 913/605/499 +f 889/560/478 913/605/499 892/606/500 +f 918/607/503 915/608/501 917/609/501 +f 886/610/504 915/608/501 889/555/478 +f 919/611/505 918/612/503 917/613/501 +f 883/548/474 917/613/501 886/614/504 +f 922/615/506 919/616/505 921/617/507 +f 880/542/471 919/618/505 883/619/474 +f 924/620/508 921/621/507 923/622/509 +f 877/536/469 921/623/507 880/624/471 +f 926/625/510 923/626/509 925/627/511 +f 874/530/464 923/626/509 877/628/469 +f 927/629/512 926/630/510 925/631/511 +f 871/632/461 925/631/511 874/525/464 +f 929/633/513 928/634/514 927/635/512 +f 868/636/515 927/635/512 871/519/461 +f 931/637/516 928/634/514 930/638/517 +f 931/639/516 934/640/518 933/641/519 +f 933/642/519 936/643/520 935/644/521 +f 928/645/514 935/646/521 926/630/510 +f 935/647/521 938/648/522 937/649/523 +f 935/647/521 924/650/508 926/625/510 +f 937/651/523 940/652/524 939/653/525 +f 937/651/523 922/654/506 924/620/508 +f 939/655/525 942/656/526 941/657/527 +f 939/655/525 920/658/528 922/615/506 +f 941/659/527 944/660/529 943/661/530 +f 920/662/528 943/661/530 918/612/503 +f 943/663/530 946/664/531 945/665/532 +f 943/666/530 916/667/533 918/607/503 +f 945/668/532 948/669/534 947/670/535 +f 945/668/532 914/604/502 916/671/533 +f 947/672/535 950/673/536 949/674/537 +f 947/879/535 912/600/498 914/675/502 +f 949/677/537 952/678/538 951/679/539 +f 949/677/537 910/680/495 912/595/498 +f 951/681/539 954/682/540 953/683/96 +f 910/684/495 953/685/96 908/592/541 +f 953/686/96 956/687/542 955/688/543 +f 953/689/96 906/590/494 908/690/541 +f 958/693/544 956/687/542 954/691/540 +f 958/693/544 903/582/489 957/692/545 +f 897/575/485 958/695/544 959/694/546 +f 952/696/538 958/695/544 954/682/540 +f 960/697/547 897/571/485 959/698/546 +f 960/697/547 952/678/538 950/699/536 +f 961/700/547 894/565/482 960/701/547 +f 961/700/547 950/673/536 948/702/534 +f 962/703/548 891/559/480 961/704/547 +f 962/703/548 948/669/534 946/705/531 +f 963/706/548 888/553/477 962/707/548 +f 963/706/548 946/664/531 944/708/529 +f 964/710/549 885/546/473 963/709/548 +f 964/710/549 944/660/529 942/711/526 +f 965/712/550 882/540/470 964/713/549 +f 940/714/524 964/715/549 942/656/526 +f 966/716/551 879/535/468 965/717/550 +f 938/718/522 965/719/550 940/652/524 +f 873/527/463 966/720/551 967/721/552 +f 967/721/552 938/648/522 936/722/520 +f 968/723/553 873/523/463 967/724/552 +f 934/725/518 967/724/552 936/643/520 +f 969/726/554 870/517/459 968/727/553 +f 932/728/555 968/727/553 934/640/518 +f 971/729/556 973/730/557 974/731/558 +f 970/732/559 975/733/560 973/734/557 +f 974/735/558 976/736/561 977/737/562 +f 973/738/557 978/739/563 976/740/561 +f 976/741/561 980/742/564 977/743/562 +f 978/744/563 979/745/565 976/746/561 +f 980/747/564 982/748/566 983/749/567 +f 981/750/568 982/751/566 979/752/565 +f 983/753/567 985/754/569 986/755/570 +f 984/756/571 985/757/569 982/758/566 +f 985/877/569 989/761/572 986/759/570 +f 987/762/573 988/763/574 985/764/569 +f 989/765/572 991/766/575 992/767/329 +f 988/768/574 993/769/324 991/770/575 +f 992/771/329 994/772/576 995/773/577 +f 991/774/575 996/775/578 994/776/576 +f 993/777/324 997/778/579 996/775/578 +f 999/779/381 998/780/580 997/778/579 +f 1001/781/581 1000/782/377 999/783/381 +f 990/784/582 999/783/381 993/769/324 +f 1004/785/583 1001/786/581 1003/787/584 +f 1003/787/584 990/788/582 987/762/573 +f 1006/789/585 1003/790/584 1005/791/586 +f 1005/792/586 987/793/573 984/756/571 +f 1008/794/587 1005/795/586 1007/796/588 +f 981/750/568 1005/880/586 984/798/571 +f 1010/799/589 1007/800/588 1009/801/590 +f 978/744/563 1007/800/588 981/802/568 +f 1012/803/591 1009/804/590 1011/805/592 +f 975/806/560 1009/804/590 978/739/563 +f 1013/807/593 1012/808/591 1011/809/592 +f 972/810/594 1011/809/592 975/733/560 +f 1014/811/595 1017/812/596 1012/808/591 +f 1015/815/597 1018/872/598 1017/814/596 +f 1017/816/596 1020/817/599 1019/818/600 +f 1012/803/591 1019/819/600 1010/820/589 +f 1019/821/600 1022/822/601 1021/823/602 +f 1019/821/600 1008/824/587 1010/799/589 +f 1021/825/602 1024/826/603 1023/827/604 +f 1021/825/602 1006/828/585 1008/794/587 +f 1023/831/604 1026/859/605 1025/830/606 +f 1023/831/604 1004/832/583 1006/789/585 +f 1025/833/606 1028/834/607 1027/835/608 +f 1025/833/606 1002/836/609 1004/785/583 +f 1027/837/608 1030/838/378 1029/839/97 +f 1002/840/609 1029/841/97 1000/782/377 +f 1029/842/97 1032/843/610 1031/844/100 +f 1000/845/377 1031/846/100 998/780/580 +f 1030/848/378 1033/849/611 1032/843/610 +f 1034/847/331 995/773/577 1033/849/611 +f 989/765/572 1034/850/331 1035/851/612 +f 1035/851/612 1030/838/378 1028/852/607 +f 1036/853/613 989/761/572 1035/854/612 +f 1036/853/613 1028/834/607 1026/855/605 +f 1037/856/614 986/755/570 1036/857/613 +f 1024/829/603 1036/858/613 1026/859/605 +f 1038/860/615 983/749/567 1037/861/614 +f 1022/862/601 1037/863/614 1024/826/603 +f 977/743/562 1038/864/615 1039/865/616 +f 1039/865/616 1022/822/601 1020/866/599 +f 1040/867/617 977/737/562 1039/868/616 +f 1040/867/617 1020/817/599 1018/869/598 +f 971/729/556 1040/870/617 1041/871/618 +f 1041/871/618 1018/872/598 1016/813/619 +f 1043/515/620 1045/516/621 1046/517/622 +f 1042/518/623 1047/519/624 1045/520/621 +f 1046/521/622 1048/522/625 1049/523/626 +f 1045/524/621 1050/525/627 1048/526/625 +f 1048/873/625 1052/529/628 1049/527/626 +f 1050/530/627 1051/531/629 1048/532/625 +f 1052/533/628 1054/534/630 1055/535/631 +f 1053/536/632 1054/537/630 1051/538/629 +f 1054/539/630 1058/540/633 1055/541/631 +f 1056/542/634 1057/543/635 1054/544/630 +f 1057/545/635 1061/546/636 1058/547/633 +f 1059/548/637 1060/549/638 1057/550/635 +f 1061/551/636 1063/552/639 1064/553/640 +f 1060/554/638 1065/555/641 1063/556/639 +f 1064/557/640 1066/558/642 1067/559/643 +f 1065/560/641 1066/561/642 1063/562/639 +f 1067/563/643 1069/564/644 1070/565/645 +f 1066/566/642 1071/567/646 1069/568/644 +f 1070/569/645 1072/570/647 1073/571/648 +f 1071/572/646 1072/573/647 1069/574/644 +f 1072/881/647 1076/577/649 1073/575/648 +f 1072/580/647 1077/594/650 1075/579/651 +f 1076/583/649 1078/882/652 1079/582/653 +f 1075/584/651 1080/585/654 1078/586/652 +f 1077/587/650 1081/588/655 1080/585/654 +f 1083/589/283 1082/590/656 1081/588/655 +f 1086/684/657 1083/593/283 1085/591/658 +f 1074/578/659 1083/593/283 1077/594/650 +f 1088/595/660 1085/596/658 1087/597/661 +f 1071/572/646 1085/596/658 1074/598/659 +f 1089/599/661 1088/600/660 1087/601/661 +f 1068/602/662 1087/601/661 1071/567/646 +f 1091/603/663 1090/604/664 1089/605/661 +f 1065/560/641 1089/605/661 1068/606/662 +f 1094/607/665 1091/608/663 1093/609/663 +f 1062/610/666 1091/608/663 1065/555/641 +f 1095/611/667 1094/612/665 1093/613/663 +f 1059/548/637 1093/613/663 1062/614/666 +f 1097/617/668 1096/658/669 1095/616/667 +f 1056/542/634 1095/618/667 1059/619/637 +f 1100/620/670 1097/621/668 1099/622/671 +f 1053/536/632 1097/623/668 1056/624/634 +f 1102/625/672 1099/626/671 1101/627/673 +f 1050/530/627 1099/626/671 1053/628/632 +f 1104/645/674 1101/631/673 1103/629/675 +f 1047/632/624 1101/631/673 1050/525/627 +f 1105/633/676 1104/634/674 1103/635/675 +f 1044/636/677 1103/635/675 1047/519/624 +f 1107/637/678 1104/634/674 1106/638/679 +f 1107/639/678 1110/640/680 1109/641/681 +f 1109/642/681 1112/643/682 1111/644/683 +f 1104/645/674 1111/646/683 1102/630/672 +f 1111/647/683 1114/648/684 1113/649/685 +f 1111/647/683 1100/650/670 1102/625/672 +f 1113/651/685 1116/652/686 1115/653/687 +f 1113/651/685 1098/654/688 1100/620/670 +f 1115/655/687 1118/656/689 1117/657/690 +f 1115/655/687 1096/658/669 1098/615/688 +f 1117/659/690 1120/660/691 1119/661/692 +f 1096/662/669 1119/661/692 1094/612/665 +f 1119/663/692 1122/664/693 1121/665/694 +f 1119/666/692 1092/667/695 1094/607/665 +f 1121/668/694 1124/669/696 1123/670/697 +f 1121/668/694 1090/604/664 1092/671/695 +f 1123/672/697 1126/673/698 1125/674/699 +f 1090/675/664 1125/676/699 1088/600/660 +f 1125/677/699 1128/678/700 1127/679/701 +f 1125/677/699 1086/680/657 1088/595/660 +f 1127/681/701 1130/682/253 1129/683/99 +f 1086/684/657 1129/685/99 1084/592/281 +f 1129/686/99 1132/687/702 1131/688/703 +f 1084/690/281 1131/883/703 1082/590/656 +f 1134/693/250 1132/687/702 1130/691/253 +f 1134/693/250 1079/582/653 1133/692/704 +f 1073/575/648 1134/695/250 1135/694/705 +f 1135/694/705 1130/682/253 1128/696/700 +f 1136/697/706 1073/571/648 1135/698/705 +f 1136/697/706 1128/678/700 1126/699/698 +f 1137/700/706 1070/565/645 1136/701/706 +f 1137/700/706 1126/673/698 1124/702/696 +f 1064/557/640 1137/704/706 1138/703/707 +f 1138/703/707 1124/669/696 1122/705/693 +f 1139/706/707 1064/553/640 1138/707/707 +f 1120/708/691 1138/707/707 1122/664/693 +f 1140/710/708 1061/546/636 1139/709/707 +f 1140/710/708 1120/660/691 1118/711/689 +f 1141/712/709 1058/540/633 1140/713/708 +f 1116/714/686 1140/715/708 1118/656/689 +f 1142/716/710 1055/535/631 1141/717/709 +f 1114/718/684 1141/719/709 1116/652/686 +f 1049/527/626 1142/720/710 1143/721/711 +f 1143/721/711 1114/648/684 1112/722/682 +f 1046/521/622 1143/724/711 1144/723/712 +f 1144/723/712 1112/643/682 1110/725/680 +f 1145/726/713 1046/517/622 1144/727/712 +f 1108/728/714 1144/727/712 1110/640/680 +f 1147/729/715 1149/730/716 1150/731/717 +f 1146/732/718 1151/733/719 1149/734/716 +f 1150/735/717 1152/736/720 1153/737/721 +f 1149/738/716 1154/739/722 1152/740/720 +f 1152/741/720 1156/742/723 1153/743/721 +f 1154/744/722 1155/745/724 1152/746/720 +f 1156/747/723 1158/748/725 1159/749/726 +f 1157/750/727 1158/751/725 1155/752/724 +f 1159/753/726 1161/754/728 1162/755/729 +f 1160/756/730 1161/757/728 1158/758/725 +f 1161/877/728 1165/761/731 1162/759/729 +f 1163/762/732 1164/763/733 1161/764/728 +f 1165/765/731 1167/766/734 1168/767/488 +f 1164/768/733 1169/769/487 1167/770/734 +f 1168/771/488 1170/772/735 1171/773/736 +f 1167/774/734 1172/775/737 1170/776/735 +f 1169/777/487 1173/778/738 1172/775/737 +f 1175/779/544 1174/780/739 1173/778/738 +f 1177/781/740 1176/782/540 1175/783/544 +f 1166/784/741 1175/783/544 1169/769/487 +f 1180/785/742 1177/786/740 1179/787/743 +f 1179/787/743 1166/788/741 1163/762/732 +f 1182/789/744 1179/790/743 1181/791/745 +f 1181/792/745 1163/793/732 1160/756/730 +f 1184/794/746 1181/795/745 1183/796/747 +f 1157/750/727 1181/880/745 1160/798/730 +f 1186/799/748 1183/800/747 1185/801/749 +f 1154/744/722 1183/800/747 1157/802/727 +f 1188/803/750 1185/804/749 1187/805/751 +f 1151/806/719 1185/804/749 1154/739/722 +f 1189/807/752 1188/808/750 1187/809/751 +f 1148/810/753 1187/809/751 1151/733/719 +f 1190/811/754 1193/812/755 1188/808/750 +f 1192/813/756 1193/814/755 1191/815/757 +f 1193/816/755 1196/817/758 1195/818/759 +f 1193/884/755 1186/820/748 1188/803/750 +f 1195/821/759 1198/822/760 1197/823/761 +f 1195/821/759 1184/824/746 1186/799/748 +f 1197/825/761 1200/826/762 1199/827/763 +f 1197/825/761 1182/828/744 1184/794/746 +f 1199/831/763 1202/859/764 1201/830/765 +f 1199/831/763 1180/832/742 1182/789/744 +f 1201/833/765 1204/834/766 1203/835/767 +f 1201/833/765 1178/836/768 1180/785/742 +f 1203/837/767 1206/838/541 1205/839/96 +f 1203/885/767 1176/782/540 1178/840/768 +f 1205/842/96 1208/843/769 1207/844/102 +f 1176/845/540 1207/846/102 1174/780/739 +f 1210/847/493 1208/843/769 1206/848/541 +f 1210/847/493 1171/773/736 1209/849/770 +f 1165/765/731 1210/850/493 1211/851/771 +f 1211/851/771 1206/838/541 1204/852/766 +f 1212/853/772 1165/761/731 1211/854/771 +f 1212/853/772 1204/834/766 1202/855/764 +f 1213/856/773 1162/755/729 1212/857/772 +f 1213/878/773 1202/859/764 1200/829/762 +f 1214/860/774 1159/749/726 1213/861/773 +f 1198/862/760 1213/863/773 1200/826/762 +f 1153/743/721 1214/864/774 1215/865/775 +f 1215/865/775 1198/822/760 1196/866/758 +f 1216/867/776 1153/737/721 1215/868/775 +f 1216/867/776 1196/817/758 1194/869/777 +f 1147/729/715 1216/870/776 1217/871/778 +f 1217/871/778 1194/872/777 1192/813/756 +f 96/1/1 36/39/2 31/2/2 +f 44/4/3 48/7/4 24/5/4 +f 48/7/4 52/9/5 22/8/5 +f 52/9/5 56/11/6 20/10/6 +f 56/11/6 60/13/7 18/12/7 +f 60/13/7 64/15/8 16/14/8 +f 64/15/8 68/886/9 14/16/9 +f 68/17/9 72/20/10 12/18/10 +f 72/20/10 76/22/11 10/21/11 +f 76/22/11 80/24/12 8/23/12 +f 80/24/12 84/26/13 6/25/13 +f 84/26/13 88/28/14 4/27/14 +f 88/28/14 92/30/15 2/29/15 +f 92/30/15 96/1/1 27/3/1 +f 40/31/16 44/4/3 26/6/3 +f 34/33/2 32/135/2 29/34/16 +f 55/36/14 150/190/14 151/37/15 +f 36/39/2 40/31/16 30/32/16 +f 38/35/17 37/43/17 33/40/18 +f 36/39/19 129/887/19 130/41/20 +f 42/42/21 41/48/21 37/43/17 +f 40/44/20 130/156/20 131/45/22 +f 46/47/23 45/51/23 41/48/21 +f 44/4/22 131/888/22 132/49/24 +f 50/50/25 49/56/25 45/51/23 +f 48/52/24 132/158/24 133/53/26 +f 54/55/27 53/59/27 49/56/25 +f 52/9/26 133/889/26 134/57/28 +f 58/58/29 57/64/29 53/59/27 +f 56/60/28 134/160/28 135/61/30 +f 62/63/31 61/67/31 57/64/29 +f 60/13/30 135/890/30 136/65/32 +f 66/66/33 65/891/33 61/67/31 +f 64/68/32 136/162/32 137/69/34 +f 70/71/35 69/76/35 65/72/33 +f 68/17/34 137/892/34 138/74/36 +f 74/75/37 73/81/37 69/76/35 +f 72/77/36 138/167/36 139/78/38 +f 78/80/39 77/84/39 73/81/37 +f 76/22/38 139/893/38 140/82/40 +f 82/83/41 81/89/41 77/84/39 +f 80/85/40 140/169/40 141/86/42 +f 86/88/43 85/92/43 81/89/41 +f 84/26/42 141/894/42 142/90/44 +f 90/91/45 89/97/45 85/92/43 +f 88/93/44 142/173/44 143/94/46 +f 94/96/47 93/99/47 89/97/45 +f 92/30/46 143/895/46 144/98/48 +f 34/33/18 33/40/18 93/99/47 +f 96/100/48 144/175/48 129/101/19 +f 31/2/49 30/32/50 125/103/50 +f 29/34/16 25/132/3 42/42/3 +f 30/32/50 26/6/51 121/105/51 +f 1/106/15 28/133/1 94/96/1 +f 2/29/52 27/3/53 124/107/53 +f 3/109/14 1/106/15 90/91/15 +f 4/27/54 2/29/52 97/108/52 +f 5/111/13 3/109/14 86/88/14 +f 6/25/55 4/27/54 99/110/54 +f 7/113/12 5/111/13 82/83/13 +f 103/114/56 8/23/56 6/25/55 +f 9/115/11 7/113/12 78/80/12 +f 10/21/57 8/23/56 103/114/56 +f 11/117/10 9/115/11 74/75/11 +f 12/18/58 10/21/57 105/116/57 +f 13/119/9 11/117/10 70/71/10 +f 14/19/59 12/18/58 107/118/58 +f 15/121/8 13/143/9 66/66/9 +f 111/122/60 16/14/60 14/16/59 +f 17/124/7 15/121/8 62/63/8 +f 18/12/61 16/14/60 111/122/60 +f 19/126/6 17/124/7 58/58/7 +f 20/10/62 18/12/61 113/125/61 +f 21/128/5 19/126/6 54/55/6 +f 22/8/63 20/10/62 115/127/62 +f 23/130/4 21/128/5 50/50/5 +f 119/131/64 24/5/64 22/8/63 +f 25/132/3 23/130/4 46/47/4 +f 26/6/51 24/5/64 119/131/64 +f 28/133/1 32/135/2 34/33/2 +f 27/3/53 31/2/49 128/104/49 +f 28/133/65 123/136/65 127/134/66 +f 124/107/1 128/104/2 127/134/2 +f 122/137/67 120/138/68 23/130/68 +f 121/105/3 119/131/4 120/138/4 +f 120/138/68 118/139/69 21/128/69 +f 119/131/4 117/129/5 118/139/5 +f 21/128/69 118/139/69 116/140/70 +f 117/129/5 115/127/6 116/140/6 +f 19/126/70 116/140/70 114/141/71 +f 115/127/6 113/125/7 114/141/7 +f 114/141/71 112/142/72 15/121/72 +f 113/125/7 111/122/8 112/142/8 +f 112/142/72 110/144/73 13/143/73 +f 111/122/8 109/123/9 110/144/9 +f 13/119/73 110/146/73 108/145/74 +f 109/120/9 107/118/10 108/145/10 +f 11/117/74 108/145/74 106/147/75 +f 107/118/10 105/116/11 106/147/11 +f 106/147/75 104/148/76 7/113/76 +f 105/116/11 103/114/12 104/148/12 +f 104/148/76 102/149/77 5/111/77 +f 103/114/12 101/112/13 102/149/13 +f 5/111/77 102/149/77 100/150/78 +f 101/112/13 99/110/14 100/150/14 +f 3/109/78 100/150/78 98/151/79 +f 99/110/14 97/108/15 98/151/15 +f 98/151/79 123/136/65 28/133/65 +f 97/108/15 124/107/1 123/136/1 +f 29/34/80 126/152/80 122/137/67 +f 125/103/16 121/105/3 122/137/3 +f 32/135/66 127/134/66 126/152/80 +f 127/134/2 128/104/2 125/103/16 +f 39/153/81 130/156/81 129/101/81 +f 43/155/81 131/45/81 130/156/81 +f 47/157/81 132/158/81 131/45/81 +f 47/157/81 51/159/81 133/53/81 +f 55/36/81 134/160/81 133/53/81 +f 59/38/81 135/61/81 134/160/81 +f 63/161/81 136/162/81 135/61/81 +f 63/161/81 67/180/81 137/69/81 +f 71/163/81 138/167/81 137/164/81 +f 75/166/81 139/78/81 138/167/81 +f 79/168/81 140/169/81 139/78/81 +f 79/168/81 83/171/81 141/86/81 +f 87/170/81 142/173/81 141/86/81 +f 91/172/81 143/94/81 142/173/81 +f 95/174/81 144/175/81 143/94/81 +f 95/174/81 35/154/81 129/101/81 +f 87/170/6 158/191/6 159/176/7 +f 59/38/15 151/37/15 152/177/1 +f 91/172/7 159/176/7 160/178/8 +f 63/161/1 152/177/1 153/179/2 +f 35/154/9 145/182/9 146/181/10 +f 95/174/8 160/178/8 145/182/9 +f 67/165/2 153/896/2 154/183/16 +f 39/153/10 146/181/10 147/184/11 +f 71/163/16 154/183/16 155/185/3 +f 43/155/11 147/184/11 148/186/12 +f 75/166/3 155/185/3 156/187/4 +f 47/157/12 148/186/12 149/188/13 +f 79/168/4 156/187/4 157/189/5 +f 51/159/13 149/188/13 150/190/14 +f 83/171/5 157/189/5 158/191/6 +f 163/240/82 165/243/83 164/241/83 +f 165/243/83 167/245/84 166/244/84 +f 167/245/84 169/247/85 168/246/85 +f 169/247/85 171/249/86 170/248/86 +f 171/249/86 173/251/87 172/250/87 +f 173/251/87 175/897/88 174/252/88 +f 175/253/88 177/256/89 176/254/89 +f 177/256/89 179/258/90 178/257/90 +f 179/258/90 181/260/91 180/259/91 +f 181/260/91 183/265/92 182/261/92 +f 167/264/81 165/898/81 163/899/81 +f 163/899/81 185/900/81 183/262/81 +f 183/262/81 181/901/81 179/902/81 +f 179/902/81 177/903/81 175/263/81 +f 175/263/81 173/904/81 171/905/81 +f 171/905/81 169/906/81 167/264/81 +f 167/264/81 163/899/81 183/262/81 +f 183/262/81 179/902/81 175/263/81 +f 175/263/81 171/905/81 167/264/81 +f 183/265/92 185/267/93 184/266/93 +f 185/267/93 163/240/82 162/242/82 +f 186/268/94 187/907/94 190/269/94 +f 186/268/94 189/270/94 192/271/94 +f 205/273/95 191/274/10 189/270/10 +f 191/274/10 193/275/11 192/271/11 +f 193/275/11 195/278/12 194/276/12 +f 188/272/94 192/271/94 194/276/94 +f 195/278/12 199/282/96 197/279/96 +f 196/277/94 194/276/94 197/279/94 +f 200/281/97 198/908/97 197/279/97 +f 201/283/81 200/909/81 199/282/81 +f 202/284/81 201/283/81 195/278/81 +f 202/284/81 193/275/81 191/274/81 +f 203/285/81 191/274/81 205/273/81 +f 190/269/98 187/910/98 204/287/98 +f 206/268/94 207/907/94 210/269/94 +f 206/268/94 209/270/94 212/271/94 +f 225/273/98 211/274/6 209/270/6 +f 211/274/6 213/275/7 212/271/7 +f 213/275/7 215/278/8 214/276/8 +f 208/272/94 212/271/94 214/276/94 +f 215/278/8 219/282/99 217/279/99 +f 216/277/94 214/276/94 217/279/94 +f 220/281/96 218/908/96 217/279/96 +f 221/283/81 220/909/81 219/282/81 +f 221/283/81 215/278/81 213/275/81 +f 223/285/81 222/284/81 213/275/81 +f 223/285/81 211/274/81 225/273/81 +f 210/269/100 207/910/100 224/287/100 +f 226/268/94 227/907/94 230/269/94 +f 226/268/94 229/270/94 232/271/94 +f 245/273/100 231/274/16 229/270/16 +f 231/274/16 233/275/3 232/271/3 +f 233/275/3 235/278/4 234/276/4 +f 228/272/94 232/271/94 234/276/94 +f 235/278/4 239/282/101 237/279/101 +f 236/277/94 234/276/94 237/279/94 +f 240/281/99 238/908/99 237/279/99 +f 241/283/81 240/909/81 239/282/81 +f 241/283/81 235/278/81 233/275/81 +f 242/284/81 233/275/81 231/274/81 +f 243/285/81 231/274/81 245/273/81 +f 230/269/102 227/910/102 244/287/102 +f 246/268/94 247/907/94 250/269/94 +f 246/268/94 249/270/94 252/271/94 +f 265/273/102 251/274/14 249/270/14 +f 251/274/14 253/275/15 252/271/15 +f 253/275/15 255/278/1 254/276/1 +f 248/272/94 252/271/94 254/276/94 +f 255/278/1 259/282/97 257/279/97 +f 256/277/94 254/276/94 257/279/94 +f 260/281/101 258/908/101 257/279/101 +f 261/283/81 260/909/81 259/282/81 +f 261/283/81 255/278/81 253/275/81 +f 263/285/81 262/284/81 253/275/81 +f 263/285/81 251/274/81 265/273/81 +f 250/269/95 247/910/95 264/287/95 +f 289/288/9 282/303/9 266/289/9 +f 287/291/5 288/911/5 274/292/5 +f 280/294/69 295/912/69 296/295/69 +f 283/297/13 284/913/13 270/298/13 +f 285/300/2 286/307/2 278/301/2 +f 282/303/11 283/914/11 267/304/11 +f 271/302/15 270/915/15 284/305/15 +f 279/306/3 278/301/3 286/307/3 +f 275/290/7 274/916/7 288/309/7 +f 267/311/94 270/917/94 271/918/94 +f 271/918/94 278/919/94 279/293/94 +f 279/293/94 274/920/94 275/310/94 +f 275/310/94 266/921/94 267/311/94 +f 267/311/94 271/918/94 279/293/94 +f 269/312/81 268/324/81 283/313/81 +f 273/315/81 272/327/81 285/316/81 +f 281/318/81 280/326/81 287/319/81 +f 277/321/81 276/325/81 289/322/81 +f 273/315/81 284/317/81 283/313/81 +f 269/312/81 282/314/81 289/322/81 +f 277/321/81 288/323/81 287/319/81 +f 281/318/81 286/320/81 285/316/81 +f 296/330/81 295/922/81 294/923/81 +f 294/923/81 293/924/81 292/328/81 +f 292/328/81 291/925/81 290/329/81 +f 290/329/81 297/926/81 296/330/81 +f 296/330/81 294/923/81 292/328/81 +f 268/331/77 291/927/77 292/332/77 +f 281/334/103 294/928/103 295/335/104 +f 269/337/105 290/929/105 291/338/106 +f 272/340/66 293/930/66 294/341/66 +f 276/343/73 297/931/73 290/344/73 +f 277/346/107 296/932/107 297/347/108 +f 273/349/109 292/933/109 293/350/110 +f 298/352/111 300/358/111 301/353/111 +f 309/355/98 301/353/98 316/356/98 +f 300/358/81 315/376/81 316/359/81 +f 302/360/81 320/395/81 321/361/81 +f 304/363/95 307/934/95 306/364/95 +f 301/353/98 309/935/98 307/366/98 +f 303/367/98 321/361/98 323/368/98 +f 298/352/100 299/354/100 318/370/100 +f 319/372/102 305/936/102 306/373/102 +f 298/352/102 306/937/102 308/374/102 +f 321/361/5 327/396/5 326/375/5 +f 315/376/112 314/377/112 317/356/112 +f 314/377/95 302/360/95 303/362/95 +f 315/377/102 300/358/102 308/378/102 +f 310/380/102 312/938/102 302/381/102 +f 311/383/98 317/939/98 303/384/98 +f 319/371/114 318/370/114 304/386/114 +f 318/388/98 299/354/98 307/389/98 +f 322/391/102 320/395/102 302/392/102 +f 322/391/13 325/940/13 324/394/13 +f 320/395/81 324/394/81 327/396/81 +f 328/397/112 330/403/112 331/398/112 +f 339/400/102 331/398/102 346/401/102 +f 330/403/81 345/418/81 346/404/81 +f 332/405/81 350/430/81 351/406/81 +f 334/363/100 337/934/100 336/364/100 +f 331/398/102 339/941/102 337/408/102 +f 333/409/102 351/406/102 353/410/102 +f 328/397/95 329/399/95 348/412/95 +f 349/414/98 335/942/98 336/415/98 +f 328/397/98 336/943/98 338/416/98 +f 351/406/13 357/431/13 356/417/13 +f 345/418/111 344/419/111 347/401/111 +f 347/401/100 344/419/100 332/405/100 +f 345/419/98 330/403/98 338/420/98 +f 340/380/98 342/938/98 332/381/98 +f 341/383/102 347/939/102 333/384/102 +f 348/412/116 334/944/116 335/422/116 +f 348/423/102 329/399/102 337/424/102 +f 352/426/98 350/430/98 332/427/98 +f 352/426/5 355/945/5 354/429/5 +f 350/430/81 354/429/81 357/431/81 +f 358/432/117 360/438/117 361/433/117 +f 369/435/95 361/433/95 376/436/95 +f 360/438/81 375/453/81 376/439/81 +f 362/440/81 380/465/81 381/441/81 +f 364/363/102 367/934/102 366/364/102 +f 361/433/95 369/946/95 367/443/95 +f 363/444/95 381/441/95 383/445/95 +f 358/432/98 359/434/98 378/447/98 +f 379/449/100 365/947/100 366/450/100 +f 358/432/100 366/948/100 368/451/100 +f 381/441/9 387/466/9 386/452/9 +f 375/453/118 374/454/118 377/436/118 +f 374/454/102 362/440/102 363/442/102 +f 375/454/100 360/438/100 368/455/100 +f 370/380/100 372/938/100 362/381/100 +f 371/383/95 377/939/95 363/384/95 +f 378/447/119 364/949/119 365/457/119 +f 378/458/95 359/434/95 367/459/95 +f 382/461/100 380/465/100 362/462/100 +f 382/461/2 385/950/2 384/464/2 +f 380/465/81 384/464/81 387/466/81 +f 388/467/118 390/473/118 391/468/118 +f 399/470/100 391/468/100 406/471/100 +f 390/473/81 405/488/81 406/474/81 +f 392/475/81 410/501/81 411/476/81 +f 394/363/98 397/934/98 396/364/98 +f 391/468/100 399/951/100 397/478/100 +f 393/479/100 411/476/100 413/480/100 +f 388/467/102 389/469/102 408/482/102 +f 409/484/95 395/952/95 396/485/95 +f 388/467/95 396/953/95 398/486/95 +f 411/476/2 417/502/2 416/487/2 +f 405/488/117 404/489/117 407/471/117 +f 404/489/98 392/475/98 393/477/98 +f 405/489/95 390/473/95 398/490/95 +f 400/380/95 402/938/95 392/381/95 +f 401/383/100 407/939/100 393/384/100 +f 409/483/120 408/482/120 394/492/120 +f 408/494/100 389/469/100 397/495/100 +f 412/497/95 410/501/95 392/498/95 +f 412/497/9 415/954/9 414/500/9 +f 410/501/81 414/500/81 417/502/81 +f 423/503/121 425/514/121 424/504/121 +f 422/506/5 419/512/5 418/507/5 +f 420/509/81 419/512/81 422/506/81 +f 420/511/9 424/955/9 418/507/9 +f 423/513/2 422/506/2 421/508/2 +f 431/503/121 433/514/121 432/504/121 +f 430/506/5 427/512/5 426/507/5 +f 428/509/81 427/512/81 430/506/81 +f 428/511/9 432/955/9 426/507/9 +f 431/513/2 430/506/2 429/508/2 +f 439/503/121 441/514/121 440/504/121 +f 438/506/5 435/512/5 434/507/5 +f 436/509/81 435/512/81 438/506/81 +f 436/511/9 440/955/9 434/507/9 +f 439/513/2 438/506/2 437/508/2 +f 447/503/122 449/514/122 448/504/122 +f 446/506/9 443/512/9 442/507/9 +f 444/509/81 443/512/81 446/506/81 +f 444/511/13 448/955/13 442/507/13 +f 447/513/5 446/506/5 445/508/5 +f 455/503/122 457/514/122 456/504/122 +f 454/506/9 451/512/9 450/507/9 +f 452/509/81 451/512/81 454/506/81 +f 452/511/13 456/955/13 450/507/13 +f 455/513/5 454/506/5 453/508/5 +f 463/503/122 465/514/122 464/504/122 +f 462/506/9 459/512/9 458/507/9 +f 460/509/81 459/512/81 462/506/81 +f 460/511/13 464/955/13 458/507/13 +f 463/513/5 462/506/5 461/508/5 +f 471/503/123 473/514/123 472/504/123 +f 470/506/13 467/512/13 466/507/13 +f 468/509/81 467/512/81 470/506/81 +f 468/511/2 472/955/2 466/507/2 +f 471/513/9 470/506/9 469/508/9 +f 479/503/123 481/514/123 480/504/123 +f 478/506/13 475/512/13 474/507/13 +f 476/509/81 475/512/81 478/506/81 +f 476/511/2 480/955/2 474/507/2 +f 479/513/9 478/506/9 477/508/9 +f 487/503/123 489/514/123 488/504/123 +f 486/506/13 483/512/13 482/507/13 +f 484/509/81 483/512/81 486/506/81 +f 484/511/2 488/955/2 482/507/2 +f 487/513/9 486/506/9 485/508/9 +f 495/503/124 497/514/124 496/504/124 +f 494/506/2 491/512/2 490/507/2 +f 492/509/81 491/512/81 494/506/81 +f 492/511/5 496/955/5 490/507/5 +f 495/513/13 494/506/13 493/508/13 +f 503/503/124 505/514/124 504/504/124 +f 502/506/2 499/512/2 498/507/2 +f 500/509/81 499/512/81 502/506/81 +f 500/511/5 504/955/5 498/507/5 +f 503/513/13 502/506/13 501/508/13 +f 511/503/124 513/514/124 512/504/124 +f 510/506/2 507/512/2 506/507/2 +f 508/509/81 507/512/81 510/506/81 +f 508/511/5 512/955/5 506/507/5 +f 511/513/13 510/506/13 509/508/13 +f 515/515/125 514/956/128 517/516/126 +f 514/518/128 516/636/183 519/519/129 +f 518/521/127 517/957/126 520/522/130 +f 517/524/126 519/632/129 522/525/132 +f 521/527/131 520/873/130 523/528/133 +f 522/530/132 525/628/137 523/531/133 +f 524/533/134 523/958/133 526/534/135 +f 525/536/137 528/624/139 526/537/135 +f 526/539/135 529/959/140 530/540/138 +f 528/542/139 531/619/142 529/543/140 +f 529/545/140 532/874/143 533/546/141 +f 531/548/142 534/614/172 532/549/143 +f 533/551/141 532/960/143 535/552/144 +f 532/554/143 534/610/172 537/555/146 +f 536/557/145 535/961/144 538/558/147 +f 537/560/146 540/606/168 538/561/147 +f 539/563/148 538/962/147 541/564/149 +f 538/566/147 540/602/168 543/567/151 +f 542/569/150 541/963/149 544/570/152 +f 543/572/151 546/598/156 544/573/152 +f 545/575/153 544/881/152 547/576/154 +f 546/578/156 549/594/160 547/579/154 +f 547/581/154 550/882/159 551/582/157 +f 547/584/154 549/587/160 552/585/158 +f 549/587/160 555/589/162 553/588/161 +f 555/589/162 556/690/165 554/590/163 +f 557/591/164 558/684/208 556/592/165 +f 546/578/156 557/591/164 555/593/162 +f 560/595/166 558/680/208 557/596/164 +f 543/572/151 559/597/167 557/596/164 +f 561/599/167 562/675/170 560/600/166 +f 540/602/168 561/599/167 559/601/167 +f 563/603/169 564/671/201 562/604/170 +f 537/560/146 563/603/169 561/605/167 +f 566/607/171 564/667/201 563/608/169 +f 534/610/172 565/609/169 563/608/169 +f 567/611/173 568/662/196 566/612/171 +f 531/548/142 567/611/173 565/613/169 +f 570/615/174 568/658/196 567/616/173 +f 528/542/139 569/964/175 567/618/173 +f 572/620/176 570/654/174 569/621/175 +f 525/536/137 571/965/177 569/623/175 +f 574/625/178 572/650/176 571/626/177 +f 522/530/132 573/627/179 571/626/177 +f 575/629/180 576/645/182 574/630/178 +f 519/632/129 575/629/180 573/631/179 +f 577/633/181 578/638/185 576/634/182 +f 516/636/183 577/633/181 575/635/180 +f 579/637/184 581/875/187 576/634/182 +f 579/639/184 580/728/223 582/640/186 +f 581/642/187 582/725/186 584/643/188 +f 576/645/182 581/966/187 583/646/189 +f 583/647/189 584/722/188 586/648/190 +f 583/647/189 585/649/191 572/650/176 +f 585/651/191 586/718/190 588/652/192 +f 585/651/191 587/653/193 570/654/174 +f 587/655/193 588/714/192 590/656/194 +f 587/655/193 589/657/195 568/658/196 +f 589/659/195 590/711/194 592/660/197 +f 589/659/195 591/661/198 566/612/171 +f 591/663/198 592/708/197 594/664/199 +f 591/666/198 593/967/200 564/667/201 +f 593/668/200 594/705/199 596/669/202 +f 593/668/200 595/670/203 562/604/170 +f 595/672/203 596/702/202 598/673/204 +f 562/675/170 595/879/203 597/676/205 +f 597/677/205 598/699/204 600/678/206 +f 597/677/205 599/679/207 558/680/208 +f 599/681/207 600/696/206 602/682/209 +f 558/684/208 599/968/207 601/685/101 +f 601/686/101 602/691/209 604/687/210 +f 601/689/101 603/883/211 554/590/163 +f 602/691/209 606/693/213 605/692/212 +f 606/693/213 548/583/155 551/582/157 +f 607/694/214 545/575/153 548/577/155 +f 607/694/214 606/695/213 602/682/209 +f 608/697/215 542/569/150 545/571/153 +f 608/697/215 607/698/214 600/678/206 +f 609/700/215 539/563/148 542/565/150 +f 609/700/215 608/701/215 598/673/204 +f 610/703/216 536/557/145 539/559/148 +f 610/703/216 609/704/215 596/669/202 +f 611/706/216 533/551/141 536/553/145 +f 611/706/216 610/707/216 594/664/199 +f 530/547/138 533/546/141 611/709/216 +f 612/710/217 611/709/216 592/660/197 +f 613/712/218 527/541/136 530/540/138 +f 588/714/192 613/969/218 612/715/217 +f 614/716/219 524/533/134 527/535/136 +f 586/718/190 614/970/219 613/719/218 +f 521/527/131 524/529/134 614/720/219 +f 615/721/220 614/720/219 586/648/190 +f 616/723/221 518/521/127 521/523/131 +f 616/723/221 615/724/220 584/643/188 +f 617/726/222 515/515/125 518/517/127 +f 580/728/223 617/726/222 616/727/221 +f 619/729/224 618/971/227 621/730/225 +f 618/732/227 620/810/266 623/733/228 +f 622/735/226 621/972/225 624/736/229 +f 621/738/225 623/806/228 626/739/231 +f 624/741/229 627/973/233 628/742/232 +f 626/744/231 629/802/236 627/745/233 +f 628/747/232 627/974/233 630/748/234 +f 629/750/236 632/798/239 630/751/234 +f 631/753/235 630/876/234 633/754/237 +f 632/756/239 635/793/242 633/757/237 +f 634/759/238 633/877/237 636/760/240 +f 635/762/242 638/788/254 636/763/240 +f 637/765/241 636/975/240 639/766/243 +f 636/768/240 638/784/254 641/769/245 +f 640/771/244 639/976/243 642/772/246 +f 639/774/243 641/777/245 644/775/248 +f 641/777/245 647/779/250 645/778/249 +f 647/779/250 648/845/253 646/780/251 +f 649/781/252 650/840/280 648/782/253 +f 638/784/254 649/781/252 647/783/250 +f 652/785/255 650/836/280 649/786/252 +f 635/762/242 651/787/256 649/786/252 +f 654/789/257 652/832/255 651/790/256 +f 653/792/258 651/977/256 635/793/242 +f 656/794/259 654/828/257 653/795/258 +f 655/797/260 653/880/258 632/798/239 +f 658/799/261 656/824/259 655/800/260 +f 657/801/262 655/800/260 629/802/236 +f 660/803/263 658/820/261 657/804/262 +f 659/805/264 657/804/262 626/739/231 +f 661/807/265 662/811/267 660/808/263 +f 620/810/266 661/807/265 659/809/264 +f 662/811/267 663/978/270 665/812/268 +f 664/813/269 666/872/292 665/814/268 +f 665/816/268 666/869/292 668/817/271 +f 660/803/263 665/884/268 667/819/272 +f 667/821/272 668/866/271 670/822/273 +f 667/821/272 669/823/274 656/824/259 +f 669/825/274 670/862/273 672/826/275 +f 669/825/274 671/827/276 654/828/257 +f 672/829/275 674/859/287 673/830/277 +f 671/831/276 673/830/277 652/832/255 +f 673/833/277 674/855/287 676/834/278 +f 673/833/277 675/835/279 650/836/280 +f 675/837/279 676/852/278 678/838/281 +f 650/840/280 675/885/279 677/841/99 +f 677/842/99 678/848/281 680/843/282 +f 648/845/253 677/979/99 679/846/95 +f 682/847/283 681/849/284 680/843/282 +f 682/847/283 640/771/244 643/773/247 +f 637/765/241 640/767/244 682/850/283 +f 683/851/285 682/850/283 678/838/281 +f 684/853/286 634/759/238 637/761/241 +f 684/853/286 683/854/285 676/834/278 +f 685/856/288 631/753/235 634/755/238 +f 672/829/275 685/878/288 684/858/286 +f 686/860/289 628/747/232 631/749/235 +f 670/862/273 686/980/289 685/863/288 +f 625/743/230 628/742/232 686/864/289 +f 687/865/290 686/864/289 670/822/273 +f 688/867/291 622/735/226 625/737/230 +f 666/869/292 688/867/291 687/868/290 +f 619/729/224 622/731/226 688/870/291 +f 689/871/293 688/870/291 666/872/292 +f 691/515/294 690/956/297 693/516/295 +f 690/518/297 692/636/352 695/519/298 +f 694/521/296 693/957/295 696/522/299 +f 693/524/295 695/632/298 698/525/301 +f 696/873/299 699/528/303 700/529/302 +f 698/530/301 701/628/306 699/531/303 +f 700/533/302 699/958/303 702/534/304 +f 701/536/306 704/624/308 702/537/304 +f 702/539/304 705/959/309 706/540/307 +f 704/542/308 707/619/312 705/543/309 +f 706/547/307 705/545/309 708/874/310 +f 707/548/312 710/614/341 708/549/310 +f 709/551/311 708/960/310 711/552/313 +f 708/554/310 710/610/341 713/555/315 +f 712/557/314 711/961/313 714/558/316 +f 713/560/315 716/606/337 714/561/316 +f 715/563/317 714/962/316 717/564/318 +f 714/566/316 716/602/337 719/567/320 +f 718/569/319 717/963/318 720/570/321 +f 719/572/320 722/598/325 720/573/321 +f 721/575/322 720/881/321 723/576/323 +f 722/578/325 725/594/329 723/579/323 +f 723/581/323 726/882/328 727/582/326 +f 723/584/323 725/587/329 728/585/327 +f 725/587/329 731/589/331 729/588/330 +f 731/589/331 732/690/378 730/590/332 +f 734/684/333 732/592/378 731/593/331 +f 722/578/325 733/591/334 731/593/331 +f 736/595/335 734/680/333 733/596/334 +f 735/597/336 733/596/334 722/598/325 +f 737/599/336 738/675/339 736/600/335 +f 737/599/336 735/601/336 719/567/320 +f 739/603/338 740/671/370 738/604/339 +f 713/560/315 739/603/338 737/605/336 +f 742/607/340 740/667/370 739/608/338 +f 710/610/341 741/609/338 739/608/338 +f 743/611/342 744/662/365 742/612/340 +f 707/548/312 743/611/342 741/613/338 +f 746/615/343 744/658/365 743/616/342 +f 704/542/308 745/964/344 743/618/342 +f 748/620/345 746/654/343 745/621/344 +f 701/536/306 747/965/346 745/623/344 +f 750/625/347 748/650/345 747/626/346 +f 698/530/301 749/627/348 747/626/346 +f 752/645/349 750/630/347 749/631/348 +f 695/632/298 751/629/350 749/631/348 +f 753/633/351 754/638/353 752/634/349 +f 692/636/352 753/633/351 751/635/350 +f 754/638/353 755/637/355 757/875/354 +f 755/639/355 756/728/392 758/640/356 +f 757/642/354 758/725/356 760/643/357 +f 752/645/349 757/966/354 759/646/358 +f 759/647/358 760/722/357 762/648/359 +f 759/647/358 761/649/360 748/650/345 +f 761/651/360 762/718/359 764/652/361 +f 761/651/360 763/653/362 746/654/343 +f 763/655/362 764/714/361 766/656/363 +f 763/655/362 765/657/364 744/658/365 +f 765/659/364 766/711/363 768/660/366 +f 765/659/364 767/661/367 742/612/340 +f 767/663/367 768/708/366 770/664/368 +f 767/666/367 769/967/369 740/667/370 +f 769/668/369 770/705/368 772/669/371 +f 769/668/369 771/670/372 738/604/339 +f 771/672/372 772/702/371 774/673/373 +f 738/675/339 771/879/372 773/676/374 +f 773/677/374 774/699/373 776/678/375 +f 773/677/374 775/679/376 734/680/333 +f 775/681/376 776/696/375 778/682/377 +f 734/684/333 775/968/376 777/685/97 +f 777/686/97 778/691/377 780/687/379 +f 777/689/97 779/883/380 730/590/332 +f 782/693/381 781/692/382 780/687/379 +f 782/693/381 724/583/324 727/582/326 +f 783/694/383 721/575/322 724/577/324 +f 783/694/383 782/695/381 778/682/377 +f 784/697/384 718/569/319 721/571/322 +f 784/697/384 783/698/383 776/678/375 +f 785/700/384 715/563/317 718/565/319 +f 785/700/384 784/701/384 774/673/373 +f 786/703/385 712/557/314 715/559/317 +f 786/703/385 785/704/384 772/669/371 +f 787/706/385 709/551/311 712/553/314 +f 787/706/385 786/707/385 770/664/368 +f 706/547/307 709/546/311 787/709/385 +f 788/710/386 787/709/385 768/660/366 +f 789/712/387 703/541/305 706/540/307 +f 764/714/361 789/969/387 788/715/386 +f 790/716/388 700/533/302 703/535/305 +f 762/718/359 790/970/388 789/719/387 +f 697/527/300 700/529/302 790/720/388 +f 791/721/389 790/720/388 762/648/359 +f 792/723/390 694/521/296 697/523/300 +f 792/723/390 791/724/389 760/643/357 +f 793/726/391 691/515/294 694/517/296 +f 756/728/392 793/726/391 792/727/390 +f 795/729/393 794/971/396 797/730/394 +f 794/732/396 796/810/431 799/733/397 +f 798/735/395 797/972/394 800/736/398 +f 797/738/394 799/806/397 802/739/400 +f 800/741/398 803/973/402 804/742/401 +f 802/744/400 805/802/405 803/745/402 +f 804/747/401 803/974/402 806/748/403 +f 805/750/405 808/798/407 806/751/403 +f 806/876/403 809/754/408 810/755/406 +f 808/756/407 811/793/410 809/757/408 +f 809/877/408 812/760/411 813/761/409 +f 811/762/410 814/788/419 812/763/411 +f 813/765/409 812/975/411 815/766/412 +f 812/768/411 814/784/419 817/769/155 +f 816/771/160 815/976/412 818/772/413 +f 815/774/412 817/777/155 820/775/415 +f 817/777/155 823/779/213 821/778/416 +f 823/779/213 824/845/209 822/780/417 +f 825/781/418 826/840/446 824/782/209 +f 814/784/419 825/781/418 823/783/213 +f 828/785/420 826/836/446 825/786/418 +f 827/787/421 825/786/418 814/788/419 +f 830/789/422 828/832/420 827/790/421 +f 829/792/423 827/977/421 811/793/410 +f 832/794/424 830/828/422 829/795/423 +f 831/797/425 829/880/423 808/798/407 +f 834/799/426 832/824/424 831/800/425 +f 833/801/427 831/800/425 805/802/405 +f 836/803/428 834/820/426 833/804/427 +f 835/805/429 833/804/427 802/739/400 +f 837/807/430 838/811/432 836/808/428 +f 796/810/431 837/807/430 835/809/429 +f 838/811/432 839/978/435 841/812/433 +f 840/813/434 842/872/455 841/814/433 +f 841/816/433 842/869/455 844/817/436 +f 836/803/428 841/884/433 843/819/437 +f 843/821/437 844/866/436 846/822/438 +f 843/821/437 845/823/439 832/824/424 +f 845/825/439 846/862/438 848/826/440 +f 845/825/439 847/827/441 830/828/422 +f 847/831/441 848/829/440 850/859/442 +f 847/831/441 849/830/443 828/832/420 +f 849/833/443 850/855/442 852/834/444 +f 849/833/443 851/835/445 826/836/446 +f 851/837/445 852/852/444 854/838/165 +f 826/840/446 851/885/445 853/841/101 +f 853/842/101 854/848/165 856/843/447 +f 824/845/209 853/979/101 855/846/98 +f 858/847/162 857/849/448 856/843/447 +f 858/847/162 816/771/160 819/773/414 +f 813/765/409 816/767/160 858/850/162 +f 859/851/449 858/850/162 854/838/165 +f 860/853/450 810/759/406 813/761/409 +f 860/853/450 859/854/449 852/834/444 +f 861/856/451 807/753/404 810/755/406 +f 861/878/451 860/858/450 850/859/442 +f 862/860/452 804/747/401 807/749/404 +f 846/862/438 862/980/452 861/863/451 +f 801/743/399 804/742/401 862/864/452 +f 863/865/453 862/864/452 846/822/438 +f 864/867/454 798/735/395 801/737/399 +f 842/869/455 864/867/454 863/868/453 +f 795/729/393 798/731/395 864/870/454 +f 865/871/456 864/870/454 842/872/455 +f 867/515/457 866/956/460 869/516/458 +f 866/518/460 868/636/515 871/519/461 +f 870/521/459 869/957/458 872/522/462 +f 869/524/458 871/632/461 874/525/464 +f 873/527/463 872/873/462 875/528/465 +f 874/530/464 877/628/469 875/531/465 +f 876/533/466 875/958/465 878/534/467 +f 877/536/469 880/624/471 878/537/467 +f 878/539/467 881/959/472 882/540/470 +f 880/542/471 883/619/474 881/543/472 +f 881/545/472 884/874/475 885/546/473 +f 883/548/474 886/614/504 884/549/475 +f 885/551/473 884/960/475 887/552/476 +f 884/554/475 886/610/504 889/555/478 +f 888/557/477 887/961/476 890/558/479 +f 889/560/478 892/606/500 890/561/479 +f 891/563/480 890/962/479 893/564/481 +f 890/566/479 892/602/500 895/567/483 +f 894/569/482 893/963/481 896/570/484 +f 895/572/483 898/598/497 896/573/484 +f 897/575/485 896/881/484 899/576/486 +f 896/580/484 898/578/497 901/594/488 +f 899/581/486 902/882/490 903/582/489 +f 901/587/488 904/585/492 902/586/490 +f 901/587/488 907/589/493 905/588/491 +f 907/589/493 908/690/541 906/590/494 +f 910/684/495 908/592/541 907/593/493 +f 898/578/497 909/591/496 907/593/493 +f 912/595/498 910/680/495 909/596/496 +f 895/572/483 911/597/499 909/596/496 +f 913/599/499 914/675/502 912/600/498 +f 913/599/499 911/601/499 895/567/483 +f 915/603/501 916/671/533 914/604/502 +f 889/560/478 915/603/501 913/605/499 +f 918/607/503 916/667/533 915/608/501 +f 886/610/504 917/609/501 915/608/501 +f 919/611/505 920/662/528 918/612/503 +f 883/548/474 919/611/505 917/613/501 +f 922/615/506 920/658/528 919/616/505 +f 880/542/471 921/964/507 919/618/505 +f 924/620/508 922/654/506 921/621/507 +f 877/536/469 923/965/509 921/623/507 +f 926/625/510 924/650/508 923/626/509 +f 874/530/464 925/627/511 923/626/509 +f 927/629/512 928/645/514 926/630/510 +f 871/632/461 927/629/512 925/631/511 +f 929/633/513 930/638/517 928/634/514 +f 868/636/515 929/633/513 927/635/512 +f 931/637/516 933/875/519 928/634/514 +f 931/639/516 932/728/555 934/640/518 +f 933/642/519 934/725/518 936/643/520 +f 928/645/514 933/966/519 935/646/521 +f 935/647/521 936/722/520 938/648/522 +f 935/647/521 937/649/523 924/650/508 +f 937/651/523 938/718/522 940/652/524 +f 937/651/523 939/653/525 922/654/506 +f 939/655/525 940/714/524 942/656/526 +f 939/655/525 941/657/527 920/658/528 +f 941/659/527 942/711/526 944/660/529 +f 920/662/528 941/659/527 943/661/530 +f 943/663/530 944/708/529 946/664/531 +f 943/666/530 945/967/532 916/667/533 +f 945/668/532 946/705/531 948/669/534 +f 945/668/532 947/670/535 914/604/502 +f 947/672/535 948/702/534 950/673/536 +f 947/879/535 949/676/537 912/600/498 +f 949/677/537 950/699/536 952/678/538 +f 949/677/537 951/679/539 910/680/495 +f 951/681/539 952/696/538 954/682/540 +f 910/684/495 951/968/539 953/685/96 +f 953/686/96 954/691/540 956/687/542 +f 953/689/96 955/883/543 906/590/494 +f 958/693/544 957/692/545 956/687/542 +f 958/693/544 900/583/487 903/582/489 +f 897/575/485 900/577/487 958/695/544 +f 952/696/538 959/694/546 958/695/544 +f 960/697/547 894/569/482 897/571/485 +f 960/697/547 959/698/546 952/678/538 +f 961/700/547 891/563/480 894/565/482 +f 961/700/547 960/701/547 950/673/536 +f 962/703/548 888/557/477 891/559/480 +f 962/703/548 961/704/547 948/669/534 +f 963/706/548 885/551/473 888/553/477 +f 963/706/548 962/707/548 946/664/531 +f 964/710/549 882/547/470 885/546/473 +f 964/710/549 963/709/548 944/660/529 +f 965/712/550 879/541/468 882/540/470 +f 940/714/524 965/969/550 964/715/549 +f 966/716/551 876/533/466 879/535/468 +f 938/718/522 966/970/551 965/719/550 +f 873/527/463 876/529/466 966/720/551 +f 967/721/552 966/720/551 938/648/522 +f 968/723/553 870/521/459 873/523/463 +f 934/725/518 968/723/553 967/724/552 +f 969/726/554 867/515/457 870/517/459 +f 932/728/555 969/726/554 968/727/553 +f 971/729/556 970/971/559 973/730/557 +f 970/732/559 972/810/594 975/733/560 +f 974/735/558 973/972/557 976/736/561 +f 973/738/557 975/806/560 978/739/563 +f 976/741/561 979/973/565 980/742/564 +f 978/744/563 981/802/568 979/745/565 +f 980/747/564 979/974/565 982/748/566 +f 981/750/568 984/798/571 982/751/566 +f 983/753/567 982/876/566 985/754/569 +f 984/756/571 987/793/573 985/757/569 +f 985/877/569 988/760/574 989/761/572 +f 987/762/573 990/788/582 988/763/574 +f 989/765/572 988/975/574 991/766/575 +f 988/768/574 990/784/582 993/769/324 +f 992/771/329 991/976/575 994/772/576 +f 991/774/575 993/777/324 996/775/578 +f 993/777/324 999/779/381 997/778/579 +f 999/779/381 1000/845/377 998/780/580 +f 1001/781/581 1002/840/609 1000/782/377 +f 990/784/582 1001/781/581 999/783/381 +f 1004/785/583 1002/836/609 1001/786/581 +f 1003/787/584 1001/786/581 990/788/582 +f 1006/789/585 1004/832/583 1003/790/584 +f 1005/792/586 1003/977/584 987/793/573 +f 1008/794/587 1006/828/585 1005/795/586 +f 981/750/568 1007/797/588 1005/880/586 +f 1010/799/589 1008/824/587 1007/800/588 +f 978/744/563 1009/801/590 1007/800/588 +f 1012/803/591 1010/820/589 1009/804/590 +f 975/806/560 1011/805/592 1009/804/590 +f 1013/807/593 1014/811/595 1012/808/591 +f 972/810/594 1013/807/593 1011/809/592 +f 1014/811/595 1015/978/597 1017/812/596 +f 1015/815/597 1016/813/619 1018/872/598 +f 1017/816/596 1018/869/598 1020/817/599 +f 1012/803/591 1017/884/596 1019/819/600 +f 1019/821/600 1020/866/599 1022/822/601 +f 1019/821/600 1021/823/602 1008/824/587 +f 1021/825/602 1022/862/601 1024/826/603 +f 1021/825/602 1023/827/604 1006/828/585 +f 1023/831/604 1024/829/603 1026/859/605 +f 1023/831/604 1025/830/606 1004/832/583 +f 1025/833/606 1026/855/605 1028/834/607 +f 1025/833/606 1027/835/608 1002/836/609 +f 1027/837/608 1028/852/607 1030/838/378 +f 1002/840/609 1027/885/608 1029/841/97 +f 1029/842/97 1030/848/378 1032/843/610 +f 1000/845/377 1029/979/97 1031/846/100 +f 1030/848/378 1034/847/331 1033/849/611 +f 1034/847/331 992/771/329 995/773/577 +f 989/765/572 992/767/329 1034/850/331 +f 1035/851/612 1034/850/331 1030/838/378 +f 1036/853/613 986/759/570 989/761/572 +f 1036/853/613 1035/854/612 1028/834/607 +f 1037/856/614 983/753/567 986/755/570 +f 1024/829/603 1037/878/614 1036/858/613 +f 1038/860/615 980/747/564 983/749/567 +f 1022/862/601 1038/980/615 1037/863/614 +f 977/743/562 980/742/564 1038/864/615 +f 1039/865/616 1038/864/615 1022/822/601 +f 1040/867/617 974/735/558 977/737/562 +f 1040/867/617 1039/868/616 1020/817/599 +f 971/729/556 974/731/558 1040/870/617 +f 1041/871/618 1040/870/617 1018/872/598 +f 1043/515/620 1042/956/623 1045/516/621 +f 1042/518/623 1044/636/677 1047/519/624 +f 1046/521/622 1045/957/621 1048/522/625 +f 1045/524/621 1047/632/624 1050/525/627 +f 1048/873/625 1051/528/629 1052/529/628 +f 1050/530/627 1053/628/632 1051/531/629 +f 1052/533/628 1051/958/629 1054/534/630 +f 1053/536/632 1056/624/634 1054/537/630 +f 1054/539/630 1057/959/635 1058/540/633 +f 1056/542/634 1059/619/637 1057/543/635 +f 1057/545/635 1060/874/638 1061/546/636 +f 1059/548/637 1062/614/666 1060/549/638 +f 1061/551/636 1060/960/638 1063/552/639 +f 1060/554/638 1062/610/666 1065/555/641 +f 1064/557/640 1063/961/639 1066/558/642 +f 1065/560/641 1068/606/662 1066/561/642 +f 1067/563/643 1066/962/642 1069/564/644 +f 1066/566/642 1068/602/662 1071/567/646 +f 1070/569/645 1069/963/644 1072/570/647 +f 1071/572/646 1074/598/659 1072/573/647 +f 1072/881/647 1075/576/651 1076/577/649 +f 1072/580/647 1074/578/659 1077/594/650 +f 1076/583/649 1075/581/651 1078/882/652 +f 1075/584/651 1077/587/650 1080/585/654 +f 1077/587/650 1083/589/283 1081/588/655 +f 1083/589/283 1084/690/281 1082/590/656 +f 1086/684/657 1084/592/281 1083/593/283 +f 1074/578/659 1085/591/658 1083/593/283 +f 1088/595/660 1086/680/657 1085/596/658 +f 1071/572/646 1087/597/661 1085/596/658 +f 1089/599/661 1090/675/664 1088/600/660 +f 1068/602/662 1089/599/661 1087/601/661 +f 1091/603/663 1092/671/695 1090/604/664 +f 1065/560/641 1091/603/663 1089/605/661 +f 1094/607/665 1092/667/695 1091/608/663 +f 1062/610/666 1093/609/663 1091/608/663 +f 1095/611/667 1096/662/669 1094/612/665 +f 1059/548/637 1095/611/667 1093/613/663 +f 1097/617/668 1098/615/688 1096/658/669 +f 1056/542/634 1097/964/668 1095/618/667 +f 1100/620/670 1098/654/688 1097/621/668 +f 1053/536/632 1099/965/671 1097/623/668 +f 1102/625/672 1100/650/670 1099/626/671 +f 1050/530/627 1101/627/673 1099/626/671 +f 1104/645/674 1102/630/672 1101/631/673 +f 1047/632/624 1103/629/675 1101/631/673 +f 1105/633/676 1106/638/679 1104/634/674 +f 1044/636/677 1105/633/676 1103/635/675 +f 1107/637/678 1109/875/681 1104/634/674 +f 1107/639/678 1108/728/714 1110/640/680 +f 1109/642/681 1110/725/680 1112/643/682 +f 1104/645/674 1109/966/681 1111/646/683 +f 1111/647/683 1112/722/682 1114/648/684 +f 1111/647/683 1113/649/685 1100/650/670 +f 1113/651/685 1114/718/684 1116/652/686 +f 1113/651/685 1115/653/687 1098/654/688 +f 1115/655/687 1116/714/686 1118/656/689 +f 1115/655/687 1117/657/690 1096/658/669 +f 1117/659/690 1118/711/689 1120/660/691 +f 1096/662/669 1117/659/690 1119/661/692 +f 1119/663/692 1120/708/691 1122/664/693 +f 1119/666/692 1121/967/694 1092/667/695 +f 1121/668/694 1122/705/693 1124/669/696 +f 1121/668/694 1123/670/697 1090/604/664 +f 1123/672/697 1124/702/696 1126/673/698 +f 1090/675/664 1123/879/697 1125/676/699 +f 1125/677/699 1126/699/698 1128/678/700 +f 1125/677/699 1127/679/701 1086/680/657 +f 1127/681/701 1128/696/700 1130/682/253 +f 1086/684/657 1127/968/701 1129/685/99 +f 1129/686/99 1130/691/253 1132/687/702 +f 1084/690/281 1129/689/99 1131/883/703 +f 1134/693/250 1133/692/704 1132/687/702 +f 1134/693/250 1076/583/649 1079/582/653 +f 1073/575/648 1076/577/649 1134/695/250 +f 1135/694/705 1134/695/250 1130/682/253 +f 1136/697/706 1070/569/645 1073/571/648 +f 1136/697/706 1135/698/705 1128/678/700 +f 1137/700/706 1067/563/643 1070/565/645 +f 1137/700/706 1136/701/706 1126/673/698 +f 1064/557/640 1067/559/643 1137/704/706 +f 1138/703/707 1137/704/706 1124/669/696 +f 1139/706/707 1061/551/636 1064/553/640 +f 1120/708/691 1139/706/707 1138/707/707 +f 1140/710/708 1058/547/633 1061/546/636 +f 1140/710/708 1139/709/707 1120/660/691 +f 1141/712/709 1055/541/631 1058/540/633 +f 1116/714/686 1141/969/709 1140/715/708 +f 1142/716/710 1052/533/628 1055/535/631 +f 1114/718/684 1142/970/710 1141/719/709 +f 1049/527/626 1052/529/628 1142/720/710 +f 1143/721/711 1142/720/710 1114/648/684 +f 1046/521/622 1049/523/626 1143/724/711 +f 1144/723/712 1143/724/711 1112/643/682 +f 1145/726/713 1043/515/620 1046/517/622 +f 1108/728/714 1145/726/713 1144/727/712 +f 1147/729/715 1146/971/718 1149/730/716 +f 1146/732/718 1148/810/753 1151/733/719 +f 1150/735/717 1149/972/716 1152/736/720 +f 1149/738/716 1151/806/719 1154/739/722 +f 1152/741/720 1155/973/724 1156/742/723 +f 1154/744/722 1157/802/727 1155/745/724 +f 1156/747/723 1155/974/724 1158/748/725 +f 1157/750/727 1160/798/730 1158/751/725 +f 1159/753/726 1158/876/725 1161/754/728 +f 1160/756/730 1163/793/732 1161/757/728 +f 1161/877/728 1164/760/733 1165/761/731 +f 1163/762/732 1166/788/741 1164/763/733 +f 1165/765/731 1164/975/733 1167/766/734 +f 1164/768/733 1166/784/741 1169/769/487 +f 1168/771/488 1167/976/734 1170/772/735 +f 1167/774/734 1169/777/487 1172/775/737 +f 1169/777/487 1175/779/544 1173/778/738 +f 1175/779/544 1176/845/540 1174/780/739 +f 1177/781/740 1178/840/768 1176/782/540 +f 1166/784/741 1177/781/740 1175/783/544 +f 1180/785/742 1178/836/768 1177/786/740 +f 1179/787/743 1177/786/740 1166/788/741 +f 1182/789/744 1180/832/742 1179/790/743 +f 1181/792/745 1179/977/743 1163/793/732 +f 1184/794/746 1182/828/744 1181/795/745 +f 1157/750/727 1183/797/747 1181/880/745 +f 1186/799/748 1184/824/746 1183/800/747 +f 1154/744/722 1185/801/749 1183/800/747 +f 1188/803/750 1186/820/748 1185/804/749 +f 1151/806/719 1187/805/751 1185/804/749 +f 1189/807/752 1190/811/754 1188/808/750 +f 1148/810/753 1189/807/752 1187/809/751 +f 1190/811/754 1191/978/757 1193/812/755 +f 1192/813/756 1194/872/777 1193/814/755 +f 1193/816/755 1194/869/777 1196/817/758 +f 1193/884/755 1195/819/759 1186/820/748 +f 1195/821/759 1196/866/758 1198/822/760 +f 1195/821/759 1197/823/761 1184/824/746 +f 1197/825/761 1198/862/760 1200/826/762 +f 1197/825/761 1199/827/763 1182/828/744 +f 1199/831/763 1200/829/762 1202/859/764 +f 1199/831/763 1201/830/765 1180/832/742 +f 1201/833/765 1202/855/764 1204/834/766 +f 1201/833/765 1203/835/767 1178/836/768 +f 1203/837/767 1204/852/766 1206/838/541 +f 1203/885/767 1205/841/96 1176/782/540 +f 1205/842/96 1206/848/541 1208/843/769 +f 1176/845/540 1205/979/96 1207/846/102 +f 1210/847/493 1209/849/770 1208/843/769 +f 1210/847/493 1168/771/488 1171/773/736 +f 1165/765/731 1168/767/488 1210/850/493 +f 1211/851/771 1210/850/493 1206/838/541 +f 1212/853/772 1162/759/729 1165/761/731 +f 1212/853/772 1211/854/771 1204/834/766 +f 1213/856/773 1159/753/726 1162/755/729 +f 1213/878/773 1212/858/772 1202/859/764 +f 1214/860/774 1156/747/723 1159/749/726 +f 1198/862/760 1214/980/774 1213/863/773 +f 1153/743/721 1156/742/723 1214/864/774 +f 1215/865/775 1214/864/774 1198/822/760 +f 1216/867/776 1150/735/717 1153/737/721 +f 1216/867/776 1215/868/775 1196/817/758 +f 1147/729/715 1150/731/717 1216/870/776 +f 1217/871/778 1216/870/776 1194/872/777 +o B1 +v -0.312500 1.250000 2.125000 +v -0.312500 2.000000 2.125000 +v -0.312500 1.250000 2.000000 +v -0.312500 2.000000 2.000000 +v 0.312500 1.250000 2.125000 +v 0.312500 2.000000 2.125000 +v 0.312500 1.250000 2.000000 +v 0.312500 2.000000 2.000000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.142857 0.875000 +vt 0.000000 0.125000 +vt 0.142857 0.125000 +vt 1.000000 0.875000 +vt 0.857143 0.125000 +vt 1.000000 0.125000 +vt 0.857143 0.875000 +vt 0.857143 -0.000000 +vt 0.142857 -0.000000 +vt 0.142857 1.000000 +vt 0.857143 1.000000 +vt 0.000000 0.875000 +s 1 +usemtl Ashes +f 1219/981/779 1220/982/779 1218/983/779 +f 1225/984/780 1222/985/780 1224/986/780 +f 1223/987/781 1218/983/781 1222/985/781 +f 1224/988/782 1218/983/782 1220/989/782 +f 1221/990/783 1223/987/783 1225/991/783 +f 1219/981/779 1221/992/779 1220/982/779 +f 1225/984/780 1223/987/780 1222/985/780 +f 1223/987/781 1219/981/781 1218/983/781 +f 1224/988/782 1222/985/782 1218/983/782 +f 1221/990/783 1219/981/783 1223/987/783 +o B3 +v 2.125000 1.250000 0.312500 +v 2.125000 2.000000 0.312500 +v 2.000000 1.250000 0.312500 +v 2.000000 2.000000 0.312500 +v 2.125000 1.250000 -0.312500 +v 2.125000 2.000000 -0.312500 +v 2.000000 1.250000 -0.312500 +v 2.000000 2.000000 -0.312500 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.142857 0.875000 +vt 0.000000 0.125000 +vt 0.142857 0.125000 +vt 1.000000 0.875000 +vt 0.857143 0.125000 +vt 1.000000 0.125000 +vt 0.857143 0.875000 +vt 0.857143 -0.000000 +vt 0.142857 -0.000000 +vt 0.142857 1.000000 +vt 0.857143 1.000000 +vt 0.000000 0.875000 +s 1 +usemtl Gavel +f 1227/993/784 1228/994/784 1226/995/784 +f 1233/996/785 1230/997/785 1232/998/785 +f 1231/999/786 1226/995/786 1230/997/786 +f 1232/1000/787 1226/995/787 1228/1001/787 +f 1229/1002/788 1231/999/788 1233/1003/788 +f 1227/993/784 1229/1004/784 1228/994/784 +f 1233/996/785 1231/999/785 1230/997/785 +f 1231/999/786 1227/993/786 1226/995/786 +f 1232/1000/787 1230/997/787 1226/995/787 +f 1229/1002/788 1227/993/788 1231/999/788 +o B2 +v 0.312499 1.250000 -2.125000 +v 0.312499 2.000000 -2.125000 +v 0.312499 1.250000 -2.000000 +v 0.312499 2.000000 -2.000000 +v -0.312501 1.250000 -2.125000 +v -0.312501 2.000000 -2.125000 +v -0.312501 1.250000 -2.000000 +v -0.312501 2.000000 -2.000000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.142857 0.875000 +vt 0.000000 0.125000 +vt 0.142857 0.125000 +vt 1.000000 0.875000 +vt 0.857143 0.125000 +vt 1.000000 0.125000 +vt 0.857143 0.875000 +vt 0.857143 -0.000000 +vt 0.142857 -0.000000 +vt 0.142857 1.000000 +vt 0.857143 1.000000 +vt 0.000000 0.875000 +s 1 +usemtl Book +f 1235/1005/789 1236/1006/789 1234/1007/789 +f 1241/1008/790 1238/1009/790 1240/1010/790 +f 1239/1011/791 1234/1007/791 1238/1009/791 +f 1240/1012/792 1234/1007/792 1236/1013/792 +f 1237/1014/793 1239/1011/793 1241/1015/793 +f 1235/1005/789 1237/1016/789 1236/1006/789 +f 1241/1008/790 1239/1011/790 1238/1009/790 +f 1239/1011/791 1235/1005/791 1234/1007/791 +f 1240/1012/792 1238/1009/792 1234/1007/792 +f 1237/1014/793 1235/1005/793 1239/1011/793 +o B4 +v -2.125000 1.250000 -0.312499 +v -2.125000 2.000000 -0.312499 +v -2.000000 1.250000 -0.312499 +v -2.000000 2.000000 -0.312499 +v -2.125000 1.250000 0.312501 +v -2.125000 2.000000 0.312501 +v -2.000000 1.250000 0.312501 +v -2.000000 2.000000 0.312501 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.142857 0.875000 +vt 0.000000 0.125000 +vt 0.142857 0.125000 +vt 1.000000 0.875000 +vt 0.857143 0.125000 +vt 1.000000 0.125000 +vt 0.857143 0.875000 +vt 0.857143 -0.000000 +vt 0.142857 -0.000000 +vt 0.142857 1.000000 +vt 0.857143 1.000000 +vt 0.000000 0.875000 +s 1 +usemtl Coin +f 1243/1017/794 1244/1018/794 1242/1019/794 +f 1249/1020/795 1246/1021/795 1248/1022/795 +f 1247/1023/796 1242/1019/796 1246/1021/796 +f 1248/1024/797 1242/1019/797 1244/1025/797 +f 1245/1026/798 1247/1023/798 1249/1027/798 +f 1243/1017/794 1245/1028/794 1244/1018/794 +f 1249/1020/795 1247/1023/795 1246/1021/795 +f 1247/1023/796 1243/1017/796 1242/1019/796 +f 1248/1024/797 1246/1021/797 1242/1019/797 +f 1245/1026/798 1243/1017/798 1247/1023/798 diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron.png index 6cfaeb00832b88e5a54b050ced51620d432f8e5a..90064e6180182c0982bd4ddda6743533d38e92a5 100644 GIT binary patch literal 9213 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 literal 4610 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 E04ANK_5c6? literal 1409 zcmV-{1%CR8P)&5Xb*9aLleEQ5Z!^72d!V6)%vE_n@K*UquuNArUGb zB@KcG8X!oB!c@?O%2Gs%C{Y{>q1*z^p7D6siB9g7ZgEzM?5x+bzn$5gogJ4jr?gtF zS-D(>)*4DF3qFDhEc-{uMyd1a&4Ms7``&Xbvo&Ee$vxkBx9Scchu6 z_Bb%L)mmdb9xnvAIs7S?&8|wiWoepDXn#Gl+u5>%qHE5&DU{l$~qf^Cp9Jg7>DAfvlZJ8!w1QC zA(w?Dg9l_yCK%4ex;=5!QF?ga10=0{x&xp>gFeMz&D=I-w9Fq{1ZL!`Osbc)$*hEnP0u(rRy4*=NM z*f8?v9hf*n29Sf0Q|6;ik_1r{0r*)ER5&D+QmJGho6RPGA5BgslZUuF$;pWUBXh2=ufzBK3?#voN+mQJ z4WwzB+46XQE(T*_+ZM$OJ$rk5!}aww+U+)Gvl&)aRty|n*VfiDkVi*H@O>X~9Opa% zFE)l%+Y3pOAP9ooc|&WBU%!6g{{9~IdL0)R7v|Z)!GX~z09;;Pn)6JWrs#A!2*WVv zj3t<4SaoF!WF2X7dwUx@J3H`wAH7}=Q53=VeVm`4oAv}X91fwB!tL!XUSD5Puh$XB zF@hif@cZyo#NhEW1Xrzu1=5}+M;W&)xlt3%?}nan2_If){rA70M~g#X193c%@>0$VPIqMWYpq{G;Gn0EiuV8 zDLZsci6REiw)Ev3am_D&?y#AOr$1z>gv&2t@U+%uiStfAK0eGnrQW0v4(mF$Qb*j3 zN~w(e@px=yNRs6LpMER+MgaiF$H%k(67cNotdL=DhLzxK`9Zm*k@*(+kR$VhuCh>$ znv$Hn$b&f5E&3sc=LeSt{QDtiS-`&^a+U=I>{%}k%>Q#34(!VP6qSDfo`w!6xjD24 P00000NkvXXu0mjfx?7VD diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron_ashes_filled.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron_ashes_filled.png index 280bb360982728dac482dd1f45f3127e9d33dadf..8b1cc1a0282d001c3e8636aa003aa339bd9c8020 100644 GIT binary patch literal 623 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjVdC&eO#)#KZgTbVI%-1Ch4+p2eMU2Uy(IQVPuE z4mj#L9C{(y)BKUAPc6=Yo&SL#S8)GgX1ic54|&t13;K#rwzl+N{}x!Vz;L$yx~kc{ z(?6dKeB38h(=xmGXXD!^(8o`YQU4|v@TfI6|Rc89IRQ+Y_YqyQg(g{gzdCs1*a^eOLw}Pcp z4}}{wDc5S6OcY#pDQKY&YumdM9&R%{yj$nVCm7A$`08wmi&yK8{Ra+f)QMD0jCs3y z5~D+S{sl$NLYp_mf3xDJ@|12bP0l+XkK|KYkB literal 1352 zcmV-O1-JT%P)(=L#p@$GECT?5onU0`SUsqyNr1G1zXm9#;G1g9+W2eMM261iYHfW8BA`4)p*+ij ztQ;-x=TpVsk*QF&5JMyvddNCjHqcU_W<6T?A=z~dQK%x3o-4x@MEt|$r@?veB z(SyYchT&Ndf?Pe0&4|wA*bj|I~(wGn4>12nA)J9Dvg_1prK^ zQy62sBk(Xp*Q3!0-{0Su&*uPsEtzFmNw#c~A(EY;SjE@hXf%Q`1|J_Em3+%XinX@n z(VCSsuu>f4VIcG}7my?g+U+)WyB$`mRS7&4jK||Ky4@~{q9~<2t}n#k;~>Q+X)QUb z*Vk91Y3kSCa=G+Y8jr`wvJ7dOmWt74vk7Ai*6VetD3wiPXlO8bo+FOq%6`K+hi0>h z!C>IS3$?{!;bDz2KJ-xFp3mn=G0 zJz+E&q1|p{v)TA8LI$W~Xz)D*AB}|Mqa-B+J{SxkDshZ zT6N8>y5H~B^T9d>U-F0c8gk?W5ZZ6Z(=A?kb7#;F3^ayFRxP1QL#u9hWgKG!;_2n7~tuMas2yGE~=HTF5ejP*PobxWumAt>d`)fLSlR`LbXxmDP_%vE;OY)D$ zqsoxy`Tzg;t@axQ0NmZ({rs1J4-XHu3@1-m2~Im7lqrp-@0<@g@_aDV&N`!}Lr&i0 zMx6T2{gA`Y2QLQv`yuC2z`q}IE(HYiQ!ft8|8p3*XXdibY5xHJa|@b9Q%1J{0000< KMNUMnLSTX<9c~2x diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron_book.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron_book.png index fdc1e082440c408ba50969b76ea738255c1b3732..b1d2ac286058c95b232efb7915ec133672281d34 100644 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjSsD^mK6y@$gPgabWJ-*ZBY9Q4Pl5=Ihg4o*63^ zzhDf=Nl!>fII${o(JKDsTd(kL;7=@Ewle?30U%hA$*@q9^}7BX_owkKAK3f(FUERk zHT>jAd)M%DLI(HxcpHBKVdjVntQ#6%i=Q`sbAOLqtOPU5QFXx{t|mK`Yeq?oj@&DG z-E@~&No<|)D&dOLs^){~3zzLvY+jtNu*=|P!waq%GnTP$l8X^FxF|M>t02z<3OZL#k;8IHb9e{g~$4H$eTVxW4qnPXSyB$ESF2%-Q8tF?dOL80mQ~w^fXNq zby?4U4JgW_aSguRZlhJWBMh&>w62o?MWpeRl>}127+!!dh4EOzOEVYuol9V76E+_Cs(0P?qIEMZb|_^p9t=Sudb^@3CAiJ1@>=vtFPE z`e8+MHBHm0&sR(TWHRY706?xAkVfb8c`TpL=VqYR9?A1jg0|(YTK{A+F&Uh5KTaYO z**RxA1K;cLqQL+}D@Z4#ehPSqA+M?`dY&ldtG?&|0>?h}xE8k~XhU@F=PJ9!~%Zf6@5SKbmCavCD&mJEiO&|^1wr$5s6125g z3}dzw51%!O*#Q7xx7%U2+YMT8G#Z&!N_nwn$St5$BB~qN@Avrn`a%c+ZQCM*(76|Q zZ6)rs+@~0F3rGiE%j-f25%Tl%GlB`+_xE?KTb5-9%!;EahF(5sEnn9Dp>132_xlJb z)(auT@+`~ZaPu@dv|(a~PCm#W;&q~2&p#_g3L&5iyr0_L(a=j>gALI9?GI9;!lT~>2w<3<0X&VOEJVbXf07JI`e(VE-r9?e~+>(QP(wqACIl;Iyy~V*O*SH zczb*6w8JvQ&pcZ4wt6lAsr`mN-I97$RrThX z2C^7(owcMg4J*5`4kq=Q&F`e9#1KO+J<`V({696nIQ*ox2%N^JQm!F}+@a*jcrxJM4>_j-{{4`1Dj?7g#3H}_kaMj3 Y19?Ug$q{l~9smFU07*qoM6N<$f`Xo0p8x;= diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron_book_filled.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron_book_filled.png index 504ec0d780f8bfb25544534d9f799c99d7d020f3..dfd93206a64ab2d39e48cffd5fc9f4264022b39b 100644 GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjSs@@pN$v@$gPgabWJ-*ZBY9Q4Pl5=Ihg4o*63^ zzhDf=Nl!>fII${o(JKDsTd(kL;7=@Ewle?30U%hA$*@q9^}7BX_owkKAK3f(FUERk zHT>jAd)M%DLI(HxcpHBKVdjVntQ#6%i=Q`UIjX*pdvU{S@pHx*QW8QvTupW@k!61m zRsNabAuqIL!mWfWPOF*&xmWVJ=`OL7s1eJ0C2h1O+M@sA>ErwoTbWmyvNCIm8W{TW zr`Q^}F9<*2678XNAXV|8!cwyX9~5~e2ej6f)1}DLSLu z3K-2|2R7`bcPJ?QqA4dx?g7qlxWut#@*^ctlzfFFve|5Y=JPqc_i)Z(zu%)QOLSd_ zwrv3bWm#gs-$!k{_h{QTJk#v}psFf7KR;hh+0Tvv0tm)fFK&I z=(3)l4JgXQxCU?AHbjLTVR#LubzKA~BF0lu5=a4Kcnzj|%GU}a5xEYcC10)_b7@2 zRaFI8>zAELJ=gd8zCQ|hwb^Wbrr-deD2k(s&XH5}&sM9|D4}}qQB_s+;%c=TC2C-t zRzz3Vby0i%we-*D^AQ68WZHljU9Z>S{(8MO6Sba^JRT)!TeDT`pU>wegLCe8lE^@I z&Y6>euXTFSU;siC#0hDi0-j>X%CZbIPn7bnzUKb|#_KDC>(wQ-#7!||I#S;Ik(WAu zrMgY06D!woH1$1;A=8o4d5odB>nyQW75Y1w1oJm7H0YrAYT~IDsm8p)~reuqPi;th{3G)EikJT zvlucwWJtE^`I36YyThw`@0Xo($)Z$8I>nIj@{@Ww zrJ(Qo5xC{xa=8re@sh{(QVd}XT1ym*uKi?^SSdo<$+NnyCo{nmLzX%Luo5W`aOpZW zri+BOZNoU_A)tF`iXqc8G_};}Zs8ehohnF|Nut)3vMxGO3>ohs*c;sq+RHr8qv+_3 zz1(k_CVD^ROp0NqH!4=nv&PIY3}~7LZ*Ol=?Q zy~XwQH69)wqDp4DT%xY)kSFW9#&WsDZnulzjVtl{fo9Ba5 z44K|juwu(|0Z8pPc#w0X%Ca1dGYw=hM2T7=VTo1U@L17%7Rz92NK7$g;*mbK(90HI z^B75;m~yh!Rg5mVrWi8seOT7m$mi#0xR#?gt%PAy+g81D2psD_91bQ!*L8pY@!RA# z3IKR|diwd3fG;mElMF{sSOv~HAC&Gm=R=M@A56(fXVh}Y$--mroDVsCK6o+UzYjT= p0{;7ub15J&PQ)VTe#kjh{sSxX`Lr{Dv+Do=002ovPDHLkV1lifKx6;_ diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron_coin.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron_coin.png index 4da1affd67b82302392f715a697a6dbd374cd138..86e51a06363adc1c4402168930abeb128d90d39a 100644 GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjSr&^>lFz@$h~+-IuG`K)}tuS~~oias`99lYig~ zUN7;b<^ok*3%g|wD6i1&zpVF0#Q12+r62CK0x51Ee+njpk5v07uXA4Py7=wzwskGU)#M5nzwodH}@UR0|kbstDnm{r-UW|hg+_V literal 1235 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 literal 1363 zcmV-Z1+4msP)}lnnX>hd=~A-v|MAwT zTglML;GtPcN(Mn_hLjMaF1^F!=p7$RPPlmw?r^olk)@-Lj&y!VKEr`Bo6UZ@-7btV z&{|`&*&t0*R8@ujeh&ah(-fP{rq;$7gZ+N*-^q3WuwJk6@bGZfHhyvl5P%-|xLv_(V9o1e3B(0;EEN$FxL{1jgYdm|T&Q z0BLDxa2ix&e9TfCCnHIuh+GXyVBcY9~wGJ8sf0ph=f&uVaph-~s7;qaylBTJ*JQB)(q#xr@eCa|Z6k+%zc@&DRkYq@J z`Vz(BEO)YUwp3pf10(>Rf74Mn)T}tP�j^04|gusjV>vx3{+dfam9D z0KnDNRj{9YmJCT~KgCqeeHDiX{?%5$-}n7*Zf*boPft$(;Fp{CpX5@TrOgQ4&hIzPyPrqd}#qY;!+czu0EQ53cIv<0|<#R_Mr z<%1lAoHB=zmaVnMd_IR#%3JUI`#Z+tG4ee3*6o}_mSs>%wYstpLn13ilV^x_qPY?bUOYSfKPh4mO@~h!8>XhmL#YYP?jZ}bGW;^!(y>OQ52X? zr?o73GMV7(>kAhb7g#J7HLy?~8Dj8zkZUNkN4WM#Q(2Z_wOXMl3crNbT3Bnb-EOg3 ztzfOiVzFrT1Z@nBNJ835)3i}eSHn3l!xOnR^EC^S#n9+7!tYPLY`ip)~vNyE|>WH{H$HM z$vzw)wy%Nap63j;NW%9`>~Ir{#RMfmL+#oQPm;lB)HKs$4o!R@4#%I5Nltl*F(gt@ z+pQBnYj6lUE=nIpnxesZcHI`eI71?jh+J@J<^&KsZ^+v%o_TX)2wfP27!sMa#4?Rg zcEkOgJhOxbjBSZFhD7=)IddsY`nlMRDR;K?ERzi?Z48Mq#+x`F_j-{{4`1Dj*QP_2R(%KZoJKvAdtP@(b8s V7$yxr;xhmM002ovPDHLkV1mm8fLZ_m From 38947ac97a24add7198ecb374200ede323d6b82b Mon Sep 17 00:00:00 2001 From: Adam <92393622+Adam29Adam29@users.noreply.github.com> Date: Wed, 8 Jul 2026 14:14:15 +0200 Subject: [PATCH 065/107] GUI Texture Change for Electric Furnace --- .../hbm/textures/gui/GUIElectricFurnace.png | Bin 3724 -> 2575 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/gui/GUIElectricFurnace.png b/src/main/resources/assets/hbm/textures/gui/GUIElectricFurnace.png index 8fc1e10beb5b9ebc3ab23b9f7a778482229ab3bb..a0aa8fd26627c6f56da46477bccee8f0bab41994 100644 GIT binary patch literal 2575 zcmcgtc~BF17Jl7Hha}vBsHhNzVaO^b;Sf|9(p+-L5jiBNAUGOCD0BchRG=9OfkFk9 z1w24p2Ju7`L=lx16;T*r#2GmR!^*6HqJXR70oh;BncA8^_K&Tt{Z)6r_x;}czOP?* zS9P|;+f|*b&jkQ=cQH-rE)+`-EM;C!y?r!WHH z_YzNk7ZmezlkVIo%gV~~@$m@=2rxD_7K_EsPGV3P!3UF0PZxOm7ey_=xBx~h6bi!w zdlO;E8h*1?C=}2yhR04#^xvS%6&`v*y98PS;7$jC@yZG}K3(N)P7CM+~9BR6}QR*&pcV7T(1PIW_i0Sw1 zfzaG9IeO*5#~9Q5ILgg29JEnfjn0Tn=Jb9P%9V?Z$6yeB8NbIry8@tMo(eEgugJnu zgq42QRen=M>1VA1lq(mGl=10K-=#}X_Jw6G5-F>)liN+!51U8;R07?d9sCnRMv6Iw zhplxp_F2j{RYVv6+8cPutHUa|BiZZSHLs@%#dq6FNM0o~U9I!NwuV@GAS~=+wiJ`%b$t;u)??7s@9O^GW}aO=V!|F zYhFhVdsM*P)LppXO{QU_ZX5@3NNR0McQy5rwFt|F#3G5NDUZJX%|KTf( z)}*ruX;7&%I=eJ~wR`lnGmYmm##E`?#$3h&S%A<~Kp$l7vui7Xfj#SHd7M3W&m;x2 zIWPHHFVFaj@j%ksuX$UpvhxI01<_iUsLFrdx7uWnKlERHp#sVuZuiT7np)-+dMic4 zjPy%RN*g9IABF`!&~1A9uLg|S=Z}`L`G)s=go_!39fNX|x+W$8h`rhE_oSdAGg^^TSAM1 zDf{oMU)<(nLfqpD#g-P%4HwEy$n6cDFeAkz-DoW-HSK5Ygn8Q`s>3A@PiBc(fu)TxYv>MU*|Bk%Z@)h#dZQ~j@o zz==t!_WyczdNX(;Q=;n6xCGK z6>%klCYY1g!$d>|s`p)6BkW+0s$ABqD88Y`v%l1{d6A5yOWsVP2L68x@?oucN}aZ=1#=1@6P zqQA9!&T-vQPWzEs%=oS49%^qq>$$!pWO6t4tt`za?ZcT!(R#5FezkdOb4NsY6|>oJ z5!OHJMjNQ<-qXcfk9XV`l~ZjPLQH&k+P^eBZ8>dFP0s=r_qO(ExvASZN`|Z*Tsxz!#IduN3oo}X8R44Rk^4J8kx$Z`?t!ka-`T}bPQByaQFSk`1=(M->;r>Pu z-%c~X5skNZYw;6A(HUN*b}`o^HvOO?qN?b z&|Td!reoFl^{I8%_!JY>`|&Gc&fc=gr{e*d?T@GeszE7hfXf;ek{vTfZKyQIY!AwA zt*P8ld5bal6oFVPIaR4^ude{sY*pgc*W^(x!U~U4cW2WP?eBttvD+jDLntrPgM2pM zNKI5AB_@_8U`|uLylKW) zU=MzL(xTxW>)l&(KY501$v}hyCUsNi(vF)Ypy!*8Zx<)rVwFrXH`GVPE^7_t*_MAg ztkN;J9XB|_{mJI|T`g?FV$2cKC9&C|X6TBJf8UUBCNz_>GQJD^hu)}G=dD%8fLr?I zP!s9>k#kF_%!$CU!<`E(Rq45+>pLu@OQJSLW8Q^1XQ#zKEB|5f8NQrf^j{H{sPieD zkDg$838B@N9Aq}H*5VR`cW3`6ui#Fl*EIEkUg+eqQ+J!=56*kHp~!)>YKV+tA9$8K zl(0t~^GUU{oHt%m3T8jDh)|=&d{904r)OG~r>{$8JpBK+?4LC%UJ$lY#%nt=qWs;u MyLdZSI)?u6FI&Xz3IG5A literal 3724 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 G5q}5F`M7`p From 90d99a32892e9303262b3d662c6f533b0bb1874e Mon Sep 17 00:00:00 2001 From: Adam <92393622+Adam29Adam29@users.noreply.github.com> Date: Wed, 8 Jul 2026 14:15:52 +0200 Subject: [PATCH 066/107] Electric Furnace Texture Change --- .../blocks/machine_electric_furnace_bottom.png | Bin 510 -> 640 bytes .../machine_electric_furnace_front_off.png | Bin 528 -> 633 bytes .../machine_electric_furnace_front_on.png | Bin 588 -> 695 bytes .../blocks/machine_electric_furnace_side.png | Bin 577 -> 715 bytes .../blocks/machine_electric_furnace_top.png | Bin 490 -> 655 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/blocks/machine_electric_furnace_bottom.png b/src/main/resources/assets/hbm/textures/blocks/machine_electric_furnace_bottom.png index b56c4a73c376cc03ff254211adf8bede3ae5993b..fad5a9e3c5157ef171852d9940cf4d395f8c811e 100644 GIT binary patch literal 640 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Li00G|+7BO_B~WmR=`Ej>L0RaFf$GfP!fHFb3j2?1 z>Nq>Q3knJb1_moBDcjpS`}+s@`ueM>X+#+%odP<5v%n*=n1O-sAP6(=n3(+*C@5Lt z8c`CQpH@C!ZXd&Q;UHE$YEuWVq|4t z1hTwr6KemYTQP)gOHA!N8fb0s{Zdr6*J8dE z^793k&h_(E-ZYQ#q<_IgV*}~;>L=#}HU89&2r*SX_H_56bH~%)`sdHQ>8`ukgSG5e w_0q{Ek4@HEUvSNp37*dK>QU_Lw`Kni$a}N#b;`E~J_C8d)78&qol`;+0Mk6F0{{R3 delta 455 zcmV;&0XY7E1^xq&L4UVUOjJcHD<>2b6c!d08X6iQAs{L$Cn+f>BqSpuA|fLrBNrDJ z7#J8F92+SqDMv>~Nl8geOiWEpO+`gT92^`L78X4{Jv%!)9UUDL6B8L388tOE5D*Yg zPftTbLqK3&zDpyN;z*BtxJw z$VmaGDKF*!zkjQS%*%{M+8rH$>?MDFd;cg3QA#O4p;Ah3x~}ml0&%!rF?*Ott&;+(h;cR&+QUDm`LjJ1@rWX>{ULimGa xy=`lfMvO5c?<*-HI;Hj`ftVBZ4nm2^WdDM=8HfE8O0NI_002ovPDHLkV1oD$oGkzV diff --git a/src/main/resources/assets/hbm/textures/blocks/machine_electric_furnace_front_off.png b/src/main/resources/assets/hbm/textures/blocks/machine_electric_furnace_front_off.png index 529db01dd4cc1c75bd766ab273f7aace9ad36ae7..2864bfb0007433a8a64d89f8b6536b8f140be990 100644 GIT binary patch literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh_0G|-oy1Jr*g0$r1D06ddQ&TNtV+{iXH8V4<_3PKSx3}lzCB??Z+S(d9 zI-2_XJ5*HU0QHH9iA6^TOG!xu270NesELb9n3-7_8k$;L+dDbA8yT5ONJt6_3aY7T zC@LzesHjUyO7ZaU{4}XH1#0Fj@Q5sCVBk9p!i>lBSEK+1B}-f*N`mv#O3D+9QW*jg zGxJLH{9Hp6O!W-)42^^t-AjOqcBDplrg?g5F>nAmtPE0&tPG4mmKP99L)oA(&|qW+ zi!%Y)hKx)Mfb0?2~uGBhv%$=+N(YwF4E-0?u>22U5q5RG8dlhI{|6?hl| z8S9R)tO${s@Z?nP-v6%OW~h9wWM`Q3`JOfVdnb;>SNKy#QI9^c_Fsz(sY-vV^_KCs zxi*)VyW`Vshx58ltZ3>vVb-v2m-G3YL~HH){^+jjdVlcz zh4p%^kH_O_K-;#M4u=ErzivTL6a}U*oV>oikhg8;)WH9f5N~hqieg85L7Jv{p08Fb z4xXNVxFVj%FhT?m5BHQ?EEbqGIYSf0Eu%ZvFqPo>`KNr)iTnMY3zB1 zmVF6B)pedRQQMxPh?{=b^^-|Jv^G&Hp!dyYqph{Z#BXowrs+RE-s`%Bm*uaKj3PGR zmOv*woW!PSghP0E5$Q)n&+GMeyB&JfIFNwM3PF)0Nr~)Jr>W(DDUnzXDpG~TDj+3t zgviGIJU@qBTwEpzTTK|++OJs_vy(W^NYBokXpF6@J^z@xy86cdM~!in5c%M^Uw$?@ bQc8US$!Gky{4b{%00000NkvXXu0mjfOz`Mq diff --git a/src/main/resources/assets/hbm/textures/blocks/machine_electric_furnace_front_on.png b/src/main/resources/assets/hbm/textures/blocks/machine_electric_furnace_front_on.png index 614e746ff8ac24cbc62f061b5d069face21f8184..24bcd75cd9e4330d4dc715cf4459ef1e270087b3 100644 GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh?0X`wFb#+Ar1!>92QRe2_rlwlP#u^3&YG!6y>({SuZ*R}bONxz+wY4>J zbTsw%cc`ey0qPSI6N`=xmXeZ^mlO>Q^iok#6Bm~-GqVb_){b{JPVuyiw%50|wl^{| zm5`A9vyVYgQ1H(~hEiwc27kR8FU|k|8PwD?D&5o+6_r&~)FmaQ-fm>z;o-56<#bdN zwo&9Qm~?qB&>GGHkH}&M2EM}}%y>M1MG8<*vcxr_Bsf2%FBlnn|k4Mt|LI1`X<$jHPX z2&AKcIJ2DvEDrK32qXY8NI#55x0Qhb7~&Jy8CZa742+Bo7#Bdy1?gd305NMCkPQM% zK$DojDuXO7fGnskLjwbl?9Jt~rk>o+9S>w4@pN$v(Fis@b2IF)f{4RK?vxCT1vhS- zNZ@J_h`v4P|9>m-70(OpWf&Ydl6wUHxN|7_UM^emzS@aPhV9q#fIlF4(5)!LL9 zD>5~N*P9;GbY$J}hxKG;H{fxm3Cuj|#c?r1T! xc)h;hcUbxISlj#BHuEf>*WUj==kw={e;F!lMf;1+xX6P1=IQF^vd$@?2>@ODyq5p~ delta 546 zcmV+-0^R+$14^MSTtHHCloO|n3)xD>RE|;(KJg1b(9zqE4uIoq-@H9;khm@Y3Eq}u> zM8X*3oDb@l&h>C=mavHV{dYKqRHQzW$E9t{Yty{BMGIeEcd& zVzehb&znxCtJMk%7Z>03A%tKULkvz&PjK8~v4EH%$IysIZARCseky~@%eA>s7qcwG z29rZNaYr-H4rlKE#18h{N4}#)On;w?<^krqZV&{6dZJpJcWu)MDIKZZG?SX zw7A=BneY40eRclkYD%k*?{0n;Z&x=h-&Ocv)e0d-FB>Vby4H^2^CVy}#a3dF- zoDi!mct}ub?rTF(%v-JnTGp}ccB`8uq>uPgL;^H^a z=!?KpmO73@4-Q^htUY?H9DCGcNvE8uuF1$%O}X2Z-N>b7X5!7Jxr=i;pTEHW!vTYp kAOI{L{KaQ8OO(=ItQqK#iw|jsy8r+H07*qoM6N<$g3Yr8DgXcg diff --git a/src/main/resources/assets/hbm/textures/blocks/machine_electric_furnace_side.png b/src/main/resources/assets/hbm/textures/blocks/machine_electric_furnace_side.png index 0000233838fb796fa731223a3db64228f5f6aa37..5015a4155bfd86ade525a13f9383d9bbb76054a5 100644 GIT binary patch literal 715 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%LgT0X`wFb#+Dg`AJ1ZX%!XOH8lm*)j*VAS(#T+k(-qjpP!%H)Kuo|Y;IIe!7T3g$yt83`$8Yn3#o0(av zsHhtnnwpyf8LFzPYHDg4^8=DOfv)8&@Q5sCVBk9l!i+m6X1@grN|v}rlmzFem6RtI zr7{F0X6BXX`MHKDnCcno85#*Qx|aYI?MRLAO!M^AV&DLBSQ(@kSs56CEH5CIhO$9{ zr@_b!7H0yo4H=mj1c7uE5NEctfW>owY!J9v#>nsj7{)Lf-Btz$pyUL01{R=N10!Pt z#sv^_L3Xk(fS5H6$OZu>pvg>Nl|hykKo(S&p@9KNwr#gT*p@4d8-UD{o-U3d8o{ck z-})Uk;Au@{W@XFa?2XOXme(uUxiF7I{`TMdQeNNxS!|L!$xu*Qd)egd+q-|WzJB2N zu;t#2SzF6;dl)n3MYnr+#JaCFX3$^1?t5sB`#N)m+p<+k@vVP0uv@(0D2#DZiB6Qr z;8A3edvP}J;ReS;hBEz)C#!$+8FtphIJjI=KjP^+eR`y8@VW(7MxSj~zY1@&5fz=9 z8e-uzFKT&|*TtZy&<6#Q;n>6t=uvB`c-= Z0g4q>WZ^qXO#lD@07*qoLNS%LhD0G|-oy1JtL{G_6yw2F%Cnwo;@Y9Pw5tjw#Z$j!=%&(BY8YASPfHa9cV zGB8kcax!ytG+n=beS3R*TwG9Oq+dvgS3yCFrKN6cY-~b8XklThxw&>)TBNJ1Wo2dV z|5%2EgpmJJLrP0CYikQDDso(0EZp3z3JX)xbP^?jZs08Nh%9Dc;5z`qj9J$@Ie~(b zC9V-A!TD(=<%vb93;~Imc_n&&t|1DhdWL$2M#7BlB|t?xQX@RmJUz7-IDi~h1}R2X z21X#u3y7tmY*3JBFfxP1nSg9VMkWS9ARPt7ne8lK@f;u<1ooFPGQ0qW9E?V{m4N{$ zIf0#l1*q1*$k>2!0mNL8ovaHWW=#XKL4XNpG80&3kfjBX1=VF}U;vWkY~Rvo(Nm%f zWN!C#aSYK2*6qI-bl8B0g`Xo}!8GCfmM*>>nRB=O|KBcf*fzt&TKTM8L;LaN>t4@` zkK=FOUjE>*M2>&Y$BZ-?P}Q#ZGz9QZL)?S5za(vuCBeWur_e|pLtkv{Ql_rxyi z2(d`br7f=aKem_#Y$>vvuJFBrk;(QyUxWPn{Y4xhR?f_jlKJl zHm7L?N(IFm9y7T(H*49(q&LZ%cg5vz56g39eYNfGd(j_v>lte12xlIU|JV=mj;E`i J%Q~loCICZs!V~}i delta 435 zcmV;k0Zjgn1?mHkL4T-FOjJciMmjt^Fg-mnLP9o2M>|VPKTJ$OKtMD>K{ZlRMsRRs za&l&Mb!m2XYHn^~MMXJ3KQm@#T4ZEcUS3i;IW2g2Y(qmsMn*V1HC$VO4o~Z9zdnARr(p zC@45MI89AKPEJA`92`SKH+p(*dwXvwDJeumICpnz<@y3)00009a7bBm000ib000ib z0l1NC?EnA(%Sl8*R47wTj^U1iKn#SttSps-0t+fxP(fKx6ahK${om{W{c)2tX(sb^ z3cw7$GKFcH!hb?U4r|-~aa_ltk310H?JE!bKrYmh55ow=#$9iBagrqI-Xnq;5r_PE z%unZHF;GhXkm<70X%=0s6H>e4cGrz=9vRF>TcR$>ORY=QKWD=Vq!s6tZYtGBp^Tud zf4lgVD)mqWCmNx%?RMW6SuqU~J;9f9#W~{07&F4Dr7RmZ?_n5f_wzcRTmB1S$)n|u d-Z)Xr_yg?76v`UCxsm_?002ovPDHLkV1hCLr!)Wn From aff1d337ca8051be006396ad848bb01b596fdc88 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 8 Jul 2026 15:15:31 +0200 Subject: [PATCH 067/107] here i come sanfrandisco --- .../container/ContainerElectricFurnace.java | 12 ++++++------ .../container/ContainerPneumoStorageAccess.java | 2 +- .../container/ContainerPneumoStorageMono.java | 1 - .../inventory/gui/GUIMachineElectricFurnace.java | 15 ++++++++------- .../hbm/inventory/gui/GUIScreenRadioAUTOCAL.java | 15 ++------------- .../com/hbm/render/tileentity/RenderLandmine.java | 2 ++ .../network/TileEntityCraneExtractor.java | 1 - 7 files changed, 19 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/hbm/inventory/container/ContainerElectricFurnace.java b/src/main/java/com/hbm/inventory/container/ContainerElectricFurnace.java index 593b1feb5..995454958 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/container/ContainerElectricFurnace.java @@ -22,20 +22,20 @@ public class ContainerElectricFurnace extends Container { diFurnace = tedf; - this.addSlotToContainer(new Slot(tedf, 0, 56, 53)); - this.addSlotToContainer(new Slot(tedf, 1, 56, 17)); - this.addSlotToContainer(new SlotSmelting(invPlayer.player, tedf, 2, 116, 35)); + this.addSlotToContainer(new Slot(tedf, 0, 152, 54)); + this.addSlotToContainer(new Slot(tedf, 1, 20, 35)); + this.addSlotToContainer(new SlotSmelting(invPlayer.player, tedf, 2, 80, 35)); //Upgrades - this.addSlotToContainer(new SlotUpgrade(tedf, 3, 147, 34)); + this.addSlotToContainer(new SlotUpgrade(tedf, 3, 111, 34)); 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(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)); + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 162)); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index d3fd06ff5..f012f0445 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -225,7 +225,7 @@ public class ContainerPneumoStorageAccess extends Container implements ICustomPa held = slot.getStack().copy(); held.stackSize = 1; } - if(held.stackSize <= 0) held = null; + if(held != null && held.stackSize <= 0) held = null; this.player.inventory.setItemStack(held); sendClickToServer(ClickType.RIGHT_CLICK, hash); return null; diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java index a99bb56da..2848dd059 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageMono.java @@ -36,7 +36,6 @@ public class ContainerPneumoStorageMono extends ContainerBase { if(index < 0 || index >= 3) { return super.slotClick(index, button, mode, player); } - Slot slot = this.getSlot(index); TileEntityPneumoStorageMono mono = (TileEntityPneumoStorageMono) this.tile; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java index bfb80de4b..01bf13c3c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java @@ -23,7 +23,7 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { diFurnace = tedf; this.xSize = 176; - this.ySize = 166; + this.ySize = 186; } @Override @@ -62,18 +62,19 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { diFurnace = (TileEntityMachineElectricFurnace) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); if(diFurnace.hasPower()) { - int i = (int)diFurnace.getPowerScaled(52); - drawTexturedModalRect(guiLeft + 20, guiTop + 69 - i, 200, 52 - i, 16, i); + int i = (int)diFurnace.getPowerScaled(34); + drawTexturedModalRect(guiLeft + 152, guiTop + 52 - i, 176, 64 - i, 16, i); } if(diFurnace.getWorldObj().getBlock(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) == ModBlocks.machine_electric_furnace_on) { - drawTexturedModalRect(guiLeft + 56, guiTop + 35, 176, 0, 16, 16); + drawTexturedModalRect(guiLeft + 45, guiTop + 20, 192, 12, 18, 16); + drawTexturedModalRect(guiLeft + 45, guiTop + 47, 192, 36, 18, 16); } - int j1 = diFurnace.getProgressScaled(24); - drawTexturedModalRect(guiLeft + 79, guiTop + 34, 176, 17, j1 + 1, 17); + int j1 = diFurnace.getProgressScaled(28); + drawTexturedModalRect(guiLeft + 43, guiTop + 36, 176, 0, j1, 12); - this.drawInfoPanel(guiLeft + 151, guiTop + 19, 8, 8, 8); + this.drawInfoPanel(guiLeft + 116, guiTop + 20, 8, 8, 8); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java index b27f2e7bb..febe5c862 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioAUTOCAL.java @@ -103,7 +103,7 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { if(checkClick(x, y, 144, 36, 18, 18)) { try { File uploadFolder = new File(MainRegistry.configDir.getParentFile(), "hbmComputerUpload"); - File doc = new File(uploadFolder, "documentation.md"); + File doc = new File(uploadFolder, "documentation_v1.1.md"); if(!uploadFolder.exists()) uploadFolder.mkdir(); if(!doc.exists()) { doc.createNewFile(); @@ -127,18 +127,7 @@ public class GUIScreenRadioAUTOCAL extends GuiScreen { script.setExecutable(false); return; } - /*FileReader reader = new FileReader(script); - BufferedReader buffer = new BufferedReader(reader); - String[] lines = buffer.lines().toArray(String[]::new); - buffer.close(); - // this is going to blow the fuck up once we hit the max packet size, but let's ignore that for now - data = new NBTTagCompound(); - StringBuilder builder = new StringBuilder(); - for(int l = 0; l < lines.length; l++) { - builder.append(lines[i]); - if(l < lines.length - 1) builder.append("\n"); // yeah why the fuck not - } - data.setString("payload", builder.toString());*/ + byte[] bytes = Files.readAllBytes(Paths.get(script.toURI())); data = new NBTTagCompound(); data.setString("payload", new String(bytes, StandardCharsets.UTF_8)); diff --git a/src/main/java/com/hbm/render/tileentity/RenderLandmine.java b/src/main/java/com/hbm/render/tileentity/RenderLandmine.java index d2889e9e7..e84d97175 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLandmine.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLandmine.java @@ -51,8 +51,10 @@ public class RenderLandmine extends TileEntitySpecialRenderer { } if(block == ModBlocks.mine_fat) { GL11.glScaled(0.25D, 0.25D, 0.25D); + GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.mine_fat_tex); ResourceManager.mine_fat.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); } if(block == ModBlocks.mine_naval) { GL11.glScaled(1D, 1D, 1D); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java index d57e98720..cc6c1011a 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -294,4 +294,3 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU return new int[] {0, 9}; } } - From 090c046ff48a1ce451eb50bea83b1aa3394fd215 Mon Sep 17 00:00:00 2001 From: Adam <92393622+Adam29Adam29@users.noreply.github.com> Date: Wed, 8 Jul 2026 18:26:09 +0200 Subject: [PATCH 068/107] GUI change of the Burner Press and Electric Press --- .../assets/hbm/textures/gui/gui_epress.png | Bin 1874 -> 2361 bytes .../assets/hbm/textures/gui/gui_press.png | Bin 2279 -> 4460 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/gui/gui_epress.png b/src/main/resources/assets/hbm/textures/gui/gui_epress.png index d920d4447e9405f2973b92c058aabd3516868207..601b9c143537ebfe2270fd2d0f64f563f2d1cb83 100644 GIT binary patch literal 2361 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 apS4P8y!bHrfT{G^1sg&(1z!%LfB8EGS|Div diff --git a/src/main/resources/assets/hbm/textures/gui/gui_press.png b/src/main/resources/assets/hbm/textures/gui/gui_press.png index 5e98f8a54083406514343a801a576b4b7525086b..83eb133fd6f57ff7cde75936054a8cc6ce46441e 100644 GIT binary patch literal 4460 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 literal 2279 zcmb7Gc~sL^7XAeip-fl;awr5ufz}~|VgXGg7Q_hzuw|1_#6lvni;=|%$P!?Hf&xh$ zWE-HM5kYp@B`iUdh%6BW0%8Ecf=m*YV!#0Tr5WwabdH|m>HX)vcka92yYIdGedk?q zal$Jr=_mmJpzL6ea{~Z~YzP4qcgfuM5fuS42aP=8;I1gMI7Pp708sqN0cYbLT_oh$ zoJTHcE3D!T^!Ez1>{ZH=-aMVY`L=%iMn?7*Xq(#Ds_eq!51T9mxw!`hc3m=Vj^)>w zj2{T~{bw>Sx$L5v{bces%&{ve=Et%}v@fO_EDV>#lD%p}nMAr@r}Xlo-VnnvZdBD% zIj13tYDwQ?|8K&MY#M`zMsf?B5#h`Zh0 z`e%*849C_KEUjO;b;fCsygvi%zX6W>$^q&cz>oPr;sYpP^d+$OD+q9fhl*A3aINtu zj4iZEbgG8cGf3x^h7n=iXucatxj4E1S?BUs+QCF!QwF%U>3GI9dh*5xKgnh5W@ zyf!u}s#1ey+0ENo&xAC?rN-aBgggm7g4avn2XYJyZgzEQBM@n^_~a}f0jX^j;8dLGkZY#OZo!)x;i*H>>694&=OV>UXi`9#2h=Nv zX4T)<*Z0_3A>x!q7>!1!*EM+~vVGWW_LtnY>kYH#1(iuSpE4+mFq1#cLN6Zn(=kkh zrU2R3)d5+jlyn%I#t3vN)D%GLD>-|dVwjKdcaVcIhAMd2JU*V0D30=~GoH@`)XmgM z6{|r0n+4`_L_i>vPcMt$VGj&4+687FbZ_pW?Vi*ufb8W>IbFrB<*ys0m9;AYy9aau zjXNj*-5QD<> z-Z;q0DuAZ^j+P%_$ryV?#9*y&ZSkGT8G6FO7qmKOV$sPJSU#IejIz`d1_drqUWDJn zI6>YK`(p^dasGqQ?Q!{hE|+*7k2NWG#J$;;P;n{u|5TmwQmb)!Wd#qP?j3w&{9noV zApL)8^0Cm7W+TtW$&NMCAPb$5rAtkW;)1EkiHWvw?DwG|01gfU=#h}-o6nYl@L2O! zhC6Q#1N*%~eGK!1gA{tHmcDD=_BGQH8pYEoC;j#2wj@2>S;@3Q@m8^a&|;izDTS$r zKx}VsBa$}{nY$tEu_tF}SC40$Q~8K6eqvkOy+V_CtcfiB`ROf+JJd^8GpVWZjj%$o z3A6BCT0epCe}e1|eLDQKwRi5D8b#=Uy=|#DTnV`H8^Edk5CUv`*sLkC3w3CnfvTtE zcIjn5%b4H&$IB*=-j`j;s@5eWEwcafsw_us6=?ze48rw}J4!-sTnW-mj^cJ1jeXFy411bpuf zI&lB|O6L}5@_;kfTD;kPb;7h180)DAji#kSE+aMB1#?tS8xH3()d4=kQt+zIO6qIT zgH}vsu7Uj=JW{1rT2k~GjMPj>TLf!}I~y-5v!g{~Ee5_>)d~gY-`)cIgZJx~%p$Rm z=?Axq4@w_lL@`SpBViih%0vBJ+SIl0LyuEXx z#seu~R-UHr^2|KbImN?J#byRw`UiH}Ob&W(#N%|4FqTf+VLmUKN9NY_*3aF}g>?@m oE2xs+3=sCp$vz^Vwo+ZGLW$W_PL-x>%fDAU*gD~APmuopE1^8#p8x;= From 55a40919ccf2175aff9214fadd1642f6c4b9a61c Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 9 Jul 2026 11:59:11 +0200 Subject: [PATCH 069/107] now with extra non-glooby slime --- changelog | 14 +++- .../com/hbm/blocks/generic/BlockPedestal.java | 70 ++++++++++++++++++- .../hbm/entity/mob/glyphid/EntityGlyphid.java | 7 ++ .../com/hbm/handler/BossSpawnHandler.java | 21 +++++- .../gui/GUIMachineElectricFurnace.java | 30 ++++---- .../com/hbm/items/armor/ItemModDefuser.java | 7 +- .../java/com/hbm/items/armor/ItemModMilk.java | 6 +- .../java/com/hbm/items/tool/ItemDefuser.java | 2 +- .../java/com/hbm/main/ModEventHandler.java | 24 ++++--- src/main/java/com/hbm/potion/HbmPotion.java | 2 +- .../tileentity/IControlReceiverFilter.java | 9 +-- .../hbm/tileentity/TileEntityDoorGeneric.java | 20 +++--- .../machine/rbmk/TileEntityRBMKTerminal.java | 45 +++++++++++- .../TileEntityPneumoStorageExporter.java | 14 +++- .../TileEntityPneumoStorageMono.java | 11 ++- .../com/hbm/world/gen/MapGenChainloader.java | 2 - .../com/hbm/world/gen/NTMWorldGenerator.java | 46 ++++++------ .../hbm/world/generator/TimedGenerator.java | 4 +- 18 files changed, 253 insertions(+), 81 deletions(-) diff --git a/changelog b/changelog index e80502e33..be0317ad2 100644 --- a/changelog +++ b/changelog @@ -11,7 +11,9 @@ * Filters can be set using items or RoR commands * Requests can be configured to take as much as possible, to only take full stacks, or to only take full requests * In combination with assembler recipe switching, using RoR logic, this means that on-demand recipe automation is now possible - * Still in testing, there's no recpes for any of the parts yet + * Still in testing, there's no recipes for any of the parts yet +* Cargo door + * Steel grate door which goes well with the cargo elevators ## Changed * Updated chinese localization @@ -71,6 +73,15 @@ * Standard control units now use rubber instead of speed I upgrades * Advanced control units now use hardplastics instead of speed III upgrades * Quantum computers now use speed III upgrades instead of overdrive I +* Updated electric furnace GUI +* The RoR terminal can now accept RoR controller input, allowing the terminal screen to be written directly and RoR terminal commands to be executed via incoming RoR signals + * The last part seems redundant, why would you need to send RoR by sending RoR? The answer being, the terminal can be toggled to send polling signals, which will run independently of the source + * For AUTOCALs, this means that they can now send polling signals "in parallel", i.e. independently of the code that actually runs on said AUTOCAL, by simply toggling polling on a terminal + * Since AUTOCALs now have a proper screen to output things with, it is now theoretically possible to program a functioning arcade machine (with terminal graphics) +* Glyphids will now try to target new players every 5 seconds if their current target is farther away than any other potential target + * 1/3 of glyphids do not have this behavior, this means that larger groups of glyphids cannot be trapped indefinitely by triggering target changes on purpose +* Pedestal blocks fitted with charms now have a 200x200 block square area around them where the charm effect of repelling meteors applies to all players +* Pedestal blocks fitted with golden defusers now have a 50x50 block area around them where creepers are automatically defused ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised @@ -85,3 +96,4 @@ * Fixed AUTOCAL's $buffer$ substitution not working * Fixed meteorite sword localization still being broken * Fixed missing localization on the FM radio +* Fixed mufflers not working on large doors diff --git a/src/main/java/com/hbm/blocks/generic/BlockPedestal.java b/src/main/java/com/hbm/blocks/generic/BlockPedestal.java index 82a2b46bb..a1d1207dd 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPedestal.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPedestal.java @@ -1,14 +1,19 @@ package com.hbm.blocks.generic; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import com.hbm.extprop.HbmPlayerProps; import com.hbm.inventory.recipes.PedestalRecipes; import com.hbm.inventory.recipes.PedestalRecipes.PedestalRecipe; +import com.hbm.items.ModItems; +import com.hbm.items.armor.ItemModDefuser; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.particle.helper.ExplosionSmallCreator; import com.hbm.util.Compat; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -18,6 +23,7 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -194,8 +200,24 @@ public class BlockPedestal extends BlockContainer { public ItemStack item; - @Override public boolean canUpdate() { return false; } - + @Override + public void updateEntity() { + + if(!worldObj.isRemote && worldObj.getTotalWorldTime() % 20 == 0) { + + if(this.item != null) { + if(item.getItem() == ModItems.protection_charm) pushPedestalEntry(worldObj, PedestalEntryType.CHARM_OF_PROTECTION, xCoord, yCoord, zCoord); + if(item.getItem() == ModItems.meteor_charm) pushPedestalEntry(worldObj, PedestalEntryType.METEORITE_CHARM, xCoord, yCoord, zCoord); + if(worldObj.getTotalWorldTime() % 60 == 0 && item.getItem() == ModItems.defuser) castrateCreepers(); + } + } + } + + public void castrateCreepers() { + List creepers = worldObj.getEntitiesWithinAABB(EntityCreeper.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1).expand(25, 25, 25)); + for(EntityCreeper creeper : creepers) ItemModDefuser.castrateCreeper(creeper, null, false); + } + @Override public Packet getDescriptionPacket() { NBTTagCompound nbt = new NBTTagCompound(); @@ -224,4 +246,48 @@ public class BlockPedestal extends BlockContainer { } } } + + public static HashMap> pedestalEntries = new HashMap(); + + public static void pushPedestalEntry(World world, PedestalEntryType type, int x, int y, int z) { + PedestalEntry entry = new PedestalEntry(type, x, y, z, world.getTotalWorldTime()); + + int dim = world.provider.dimensionId; + List entries = pedestalEntries.get(dim); + + if(entries == null) { + entries = new ArrayList(); + pedestalEntries.put(dim, entries); + } + entries.add(entry); + } + + public static final int timeout = 60; //3 seconds + + public static void checkPedestalEntries(int dim, long currentTime) { + List entries = getEntriesForDimension(dim); + if(entries == null) return; + entries.removeIf(x -> { return x.timestamp < currentTime - timeout; }); + } + + public static List getEntriesForDimension(int dim) { + return pedestalEntries.get(dim); + } + + public static class PedestalEntry { + public PedestalEntryType type; + public BlockPos pos; + public long timestamp; + + public PedestalEntry(PedestalEntryType type, int x, int y, int z, long timestamp) { + this.type = type; + this.pos = new BlockPos(x, y, z); + this.timestamp = timestamp; + } + } + + public static enum PedestalEntryType { + CHARM_OF_PROTECTION, + METEORITE_CHARM + } } diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java index ac2f90e7d..95d1e6578 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java @@ -223,6 +223,13 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { @Override protected void updateEntityActionState() { super.updateEntityActionState(); + + // re-scan for new targets every so often + // every third glyphid does not do this, so you cannot "juggle" hordes on purpose + if(this.getEntityId() % 3 > 0 && (this.getEntityId() + this.ticksExisted) % 100 == 0) { + Entity newTarget = this.findPlayerToAttack(); + if(newTarget != null) this.setTarget(newTarget); + } if(!this.isPotionActive(Potion.blindness)) { if (!this.hasPath()) { diff --git a/src/main/java/com/hbm/handler/BossSpawnHandler.java b/src/main/java/com/hbm/handler/BossSpawnHandler.java index a73a36bbe..4b77a265c 100644 --- a/src/main/java/com/hbm/handler/BossSpawnHandler.java +++ b/src/main/java/com/hbm/handler/BossSpawnHandler.java @@ -1,8 +1,12 @@ package com.hbm.handler; +import java.util.List; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.BlockPedestal.PedestalEntry; +import com.hbm.blocks.generic.BlockPedestal.PedestalEntryType; import com.hbm.config.GeneralConfig; import com.hbm.config.MobConfig; import com.hbm.config.WorldConfig; @@ -231,9 +235,22 @@ public class BossSpawnHandler { } } } + + // only check if either charm is not present + if(!repell || strike) { + int x = (int) Math.floor(p.posX); + int z = (int) Math.floor(p.posZ); + + List entries = BlockPedestal.getEntriesForDimension(world.provider.dimensionId); + if(entries != null) for(PedestalEntry entry : entries) { + if(Math.abs(entry.pos.getX() - x) <= 100 && Math.abs(entry.pos.getZ() - z) <= 100) { + if(entry.type == PedestalEntryType.CHARM_OF_PROTECTION) repell = true; + if(entry.type == PedestalEntryType.METEORITE_CHARM) strike = false; + } + } + } - if(strike) - spawnMeteorAtPlayer(p, repell); + if(strike) spawnMeteorAtPlayer(p, repell); } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java index 01bf13c3c..e31ed7ed4 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java @@ -16,11 +16,11 @@ import com.hbm.util.i18n.I18nUtil; public class GUIMachineElectricFurnace extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/GUIElectricFurnace.png"); - private TileEntityMachineElectricFurnace diFurnace; + private TileEntityMachineElectricFurnace furnace; - public GUIMachineElectricFurnace(InventoryPlayer invPlayer, TileEntityMachineElectricFurnace tedf) { - super(new ContainerElectricFurnace(invPlayer, tedf)); - diFurnace = tedf; + public GUIMachineElectricFurnace(InventoryPlayer invPlayer, TileEntityMachineElectricFurnace furnace) { + super(new ContainerElectricFurnace(invPlayer, furnace)); + this.furnace = furnace; this.xSize = 176; this.ySize = 186; @@ -30,18 +30,18 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 20, guiTop + 69 - 52, 16, 52, diFurnace.power, diFurnace.maxPower); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 52 - 34, 16, 34, furnace.power, furnace.maxPower); String[] upgradeText = new String[3]; upgradeText[0] = I18nUtil.resolveKey("desc.gui.upgrade"); upgradeText[1] = I18nUtil.resolveKey("desc.gui.upgrade.speed"); upgradeText[2] = I18nUtil.resolveKey("desc.gui.upgrade.power"); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 151, guiTop + 19, 8, 8, mouseX, mouseY, upgradeText); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 116, guiTop + 20, 8, 8, mouseX, mouseY, upgradeText); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); + String name = this.furnace.hasCustomInventoryName() ? this.furnace.getInventoryName() : I18n.format(this.furnace.getInventoryName()); this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); @@ -58,21 +58,21 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { //if initial ZE is still present, it'll be used instead //works so that container packets can still be used //efficiency! - if(diFurnace.isInvalid() && diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) instanceof TileEntityMachineElectricFurnace) - diFurnace = (TileEntityMachineElectricFurnace) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); + if(furnace.isInvalid() && furnace.getWorldObj().getTileEntity(furnace.xCoord, furnace.yCoord, furnace.zCoord) instanceof TileEntityMachineElectricFurnace) + furnace = (TileEntityMachineElectricFurnace) furnace.getWorldObj().getTileEntity(furnace.xCoord, furnace.yCoord, furnace.zCoord); - if(diFurnace.hasPower()) { - int i = (int)diFurnace.getPowerScaled(34); - drawTexturedModalRect(guiLeft + 152, guiTop + 52 - i, 176, 64 - i, 16, i); + if(furnace.hasPower()) { + int p = (int) furnace.getPowerScaled(34); + drawTexturedModalRect(guiLeft + 152, guiTop + 52 - p, 176, 64 - p, 16, p); } - if(diFurnace.getWorldObj().getBlock(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) == ModBlocks.machine_electric_furnace_on) { + if(furnace.getWorldObj().getBlock(furnace.xCoord, furnace.yCoord, furnace.zCoord) == ModBlocks.machine_electric_furnace_on) { drawTexturedModalRect(guiLeft + 45, guiTop + 20, 192, 12, 18, 16); drawTexturedModalRect(guiLeft + 45, guiTop + 47, 192, 36, 18, 16); } - int j1 = diFurnace.getProgressScaled(28); - drawTexturedModalRect(guiLeft + 43, guiTop + 36, 176, 0, j1, 12); + int p = furnace.getProgressScaled(28); + drawTexturedModalRect(guiLeft + 43, guiTop + 36, 176, 0, p, 12); this.drawInfoPanel(guiLeft + 116, guiTop + 20, 8, 8, 8); } diff --git a/src/main/java/com/hbm/items/armor/ItemModDefuser.java b/src/main/java/com/hbm/items/armor/ItemModDefuser.java index fafc290f1..ea7426817 100644 --- a/src/main/java/com/hbm/items/armor/ItemModDefuser.java +++ b/src/main/java/com/hbm/items/armor/ItemModDefuser.java @@ -42,10 +42,11 @@ public class ItemModDefuser extends ItemArmorMod { List creepers = entity.worldObj.getEntitiesWithinAABB(EntityCreeper.class, entity.boundingBox.expand(5, 5, 5)); - for(EntityCreeper creeper : creepers) defuse(creeper, entity, true); + for(EntityCreeper creeper : creepers) castrateCreeper(creeper, entity, true); } - public static boolean defuse(EntityCreeper creeper, EntityLivingBase entity, boolean dropItem) { + /** my bualls */ + public static boolean castrateCreeper(EntityCreeper creeper, EntityLivingBase entity, boolean dropItem) { creeper.setCreeperState(-1); creeper.getDataWatcher().updateObject(18, new Byte((byte) 0)); @@ -66,7 +67,7 @@ public class ItemModDefuser extends ItemArmorMod { if(dropItem) { creeper.worldObj.playSoundEffect(creeper.posX, creeper.posY, creeper.posZ, "hbm:item.pinBreak", 1.0F, 1.0F); creeper.dropItem(ModItems.safety_fuse, 1); - creeper.attackEntityFrom(DamageSource.causeMobDamage(entity), 1.0F); + creeper.attackEntityFrom(entity != null ? DamageSource.causeMobDamage(entity) : DamageSource.magic, 1.0F); creeper.addPotionEffect(new PotionEffect(Potion.weakness.id, 0, 200)); } creeper.getEntityData().setBoolean("hfr_defused", true); diff --git a/src/main/java/com/hbm/items/armor/ItemModMilk.java b/src/main/java/com/hbm/items/armor/ItemModMilk.java index 1985c6b17..5350516f6 100644 --- a/src/main/java/com/hbm/items/armor/ItemModMilk.java +++ b/src/main/java/com/hbm/items/armor/ItemModMilk.java @@ -38,11 +38,9 @@ public class ItemModMilk extends ItemArmorMod { public void modUpdate(EntityLivingBase entity, ItemStack armor) { List ints = new ArrayList(); - Iterator iterator = ((Collection) entity.getActivePotionEffects()).iterator(); while(iterator.hasNext()) { - PotionEffect eff = (PotionEffect) iterator.next(); if(HbmPotion.getIsBadEffect(Potion.potionTypes[eff.getPotionID()])) { @@ -50,8 +48,6 @@ public class ItemModMilk extends ItemArmorMod { } } - for(Integer i : ints) { - entity.removePotionEffect(i); - } + for(Integer i : ints) entity.removePotionEffect(i); } } diff --git a/src/main/java/com/hbm/items/tool/ItemDefuser.java b/src/main/java/com/hbm/items/tool/ItemDefuser.java index 9a1aa6d9b..c2a04c3b9 100644 --- a/src/main/java/com/hbm/items/tool/ItemDefuser.java +++ b/src/main/java/com/hbm/items/tool/ItemDefuser.java @@ -27,7 +27,7 @@ public class ItemDefuser extends ItemTooling { public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity) { if(entity instanceof EntityCreeper) { - return ItemModDefuser.defuse((EntityCreeper) entity, player, true); + return ItemModDefuser.castrateCreeper((EntityCreeper) entity, player, true); } if(entity instanceof EntityGlyphidNuclear) { diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index e4d50949d..a6f3cb7fe 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -5,6 +5,7 @@ import com.google.common.collect.Multimap; import com.hbm.blocks.IStepTickReceiver; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockAshes; +import com.hbm.blocks.generic.BlockPedestal; import com.hbm.config.GeneralConfig; import com.hbm.config.MobConfig; import com.hbm.config.RadiationConfig; @@ -508,7 +509,7 @@ public class ModEventHandler { public void onLivingUpdate(LivingUpdateEvent event) { if(event.entityLiving instanceof EntityCreeper && event.entityLiving.getEntityData().getBoolean("hfr_defused")) { - ItemModDefuser.defuse((EntityCreeper) event.entityLiving, null, false); + ItemModDefuser.castrateCreeper((EntityCreeper) event.entityLiving, null, false); } ItemStack[] prevArmor = event.entityLiving.previousEquipment; @@ -586,12 +587,15 @@ public class ModEventHandler { @SubscribeEvent public void worldTick(WorldTickEvent event) { + + World world = event.world; + long time = world.getTotalWorldTime(); - if(event.world != null && !event.world.isRemote) { + if(world != null && !world.isRemote) { if(reference != null) { - for(Object player : event.world.playerEntities) { - if(((EntityPlayer) player).ridingEntity != null && event.world.getTotalWorldTime() % (1 * 60 * 20) == 0) { + for(Object player : world.playerEntities) { + if(((EntityPlayer) player).ridingEntity != null && time % (1 * 60 * 20) == 0) { ((EntityPlayer) player).mountEntity(null); didSit = true; } @@ -605,7 +609,7 @@ public class ModEventHandler { int tickrate = Math.max(1, ServerConfig.ITEM_HAZARD_DROP_TICKRATE.get()); - if(event.world.getTotalWorldTime() % tickrate == 0) { + if(time % tickrate == 0) { List loadedEntityList = new ArrayList(); loadedEntityList.addAll(event.world.loadedEntityList); // ConcurrentModificationException my balls @@ -618,13 +622,17 @@ public class ModEventHandler { } } - EntityRailCarBase.updateMotion(event.world); + EntityRailCarBase.updateMotion(world); + } + + if(time % 20 == 0) { + BlockPedestal.checkPedestalEntries(world.provider.dimensionId, time); } } if(event.phase == Phase.START) { - BossSpawnHandler.rollTheDice(event.world); - TimedGenerator.automaton(event.world, 100); + BossSpawnHandler.rollTheDice(world); + TimedGenerator.automaton(world, 100); } } diff --git a/src/main/java/com/hbm/potion/HbmPotion.java b/src/main/java/com/hbm/potion/HbmPotion.java index c1189b8b6..0e03d6458 100644 --- a/src/main/java/com/hbm/potion/HbmPotion.java +++ b/src/main/java/com/hbm/potion/HbmPotion.java @@ -176,7 +176,7 @@ public class HbmPotion extends Potion { public static boolean getIsBadEffect(Potion potion) { try { - Field isBadEffect = ReflectionHelper.findField(Potion.class, "isBadEffect", "field_76418_K"); + Field isBadEffect = ReflectionHelper.findField(Potion.class, "isBadEffect", "field_76418_K"); //TODO: use an AT for this boolean ret = isBadEffect.getBoolean(potion); return ret; diff --git a/src/main/java/com/hbm/tileentity/IControlReceiverFilter.java b/src/main/java/com/hbm/tileentity/IControlReceiverFilter.java index b007be844..5801d7bd4 100644 --- a/src/main/java/com/hbm/tileentity/IControlReceiverFilter.java +++ b/src/main/java/com/hbm/tileentity/IControlReceiverFilter.java @@ -15,11 +15,6 @@ public interface IControlReceiverFilter extends IControlReceiver, ICopiable { void nextMode(int i); - /* - default ModulePatternMatcher getMatcher(){ - - }*/ - @Override default void receiveControl(NBTTagCompound data) { if(data.hasKey("slot")) { @@ -44,11 +39,11 @@ public interface IControlReceiverFilter extends IControlReceiver, ICopiable { } /** * Used for the copy tool - * @return The start and end (start inclusive, end exclusive) of the filter slots of the TE + * @return The start and end (start inclusive, end exclusive) of the filter slots of the TE // seven, what the fuck? */ int[] getFilterSlots(); - @Override + @Override default NBTTagCompound getSettings(World world, int x, int y, int z) { IInventory inv = (IInventory) this; NBTTagCompound nbt = new NBTTagCompound(); diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index 29bfb46ae..ffda38e6b 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -243,18 +243,18 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } if(doorType.getOpenSoundLoop() != null) { - audio = MainRegistry.proxy.getLoopedSound(doorType.getOpenSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); + audio = MainRegistry.proxy.getLoopedSound(doorType.getOpenSoundLoop(), xCoord, yCoord, zCoord, getVolume(), 10F, 1F); audio.startSound(); } if(doorType.getOpenSoundStart() != null) { - worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundStart(), doorType.getSoundVolume(), 1F, false); + worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundStart(), getVolume(), 1F, false); } if(doorType.getSoundLoop2() != null) { if(audio2 != null) audio2.stopSound(); - audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); + audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, getVolume(), 10F, 1F); audio2.startSound(); } } @@ -265,18 +265,18 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } if(doorType.getCloseSoundLoop() != null) { - audio = MainRegistry.proxy.getLoopedSound(doorType.getCloseSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); + audio = MainRegistry.proxy.getLoopedSound(doorType.getCloseSoundLoop(), xCoord, yCoord, zCoord, getVolume(), 10F, 1F); audio.startSound(); } if(doorType.getCloseSoundStart() != null) { - worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundStart(), doorType.getSoundVolume(), 1F, false); + worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundStart(), getVolume(), 1F, false); } if(doorType.getSoundLoop2() != null) { if(audio2 != null) audio2.stopSound(); - audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); + audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, getVolume(), 10F, 1F); audio2.startSound(); } } @@ -294,13 +294,13 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { if(this.state == STATE_OPENING && state == STATE_OPEN) { // Door finished transitioning to open if(doorType.getOpenSoundEnd() != null) { - worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundEnd(), doorType.getSoundVolume(), 1F, false); + worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundEnd(), getVolume(), 1F, false); } } if(this.state == STATE_CLOSING && state == STATE_CLOSED) { // Door finished transitioning to closed if(doorType.getCloseSoundEnd() != null) { - worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundEnd(), doorType.getSoundVolume(), 1F, false); + worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundEnd(), getVolume(), 1F, false); } } @@ -313,6 +313,10 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } } } + + public float getVolume() { + return getVolume(doorType.getSoundVolume()); + } public int getSkinIndex() { return skinIndex; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java index 493ff0a21..c53d8b088 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java @@ -12,6 +12,7 @@ import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.network.RTTYSystem; import com.hbm.util.BufferUtil; +import api.hbm.redstoneoverradio.IRORInteractive; import cpw.mods.fml.common.Optional; import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; @@ -24,7 +25,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityRBMKTerminal extends TileEntityLoadedBase implements IGUIProvider, IControlReceiver, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityRBMKTerminal extends TileEntityLoadedBase implements IGUIProvider, IControlReceiver, SimpleComponent, CompatHandler.OCComponent, IRORInteractive { public String[] history = new String[17]; public String channel = ""; @@ -249,4 +250,46 @@ public class TileEntityRBMKTerminal extends TileEntityLoadedBase implements IGUI markDirty(); return new Object[] {true}; } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_FUNCTION + "clear", + PREFIX_FUNCTION + "write" + NAME_SEPARATOR + "text", + PREFIX_FUNCTION + "set" + NAME_SEPARATOR + "text", + PREFIX_FUNCTION + "submit" + NAME_SEPARATOR + "command", + }; + } + + @Override + public String runRORFunction(String name, String[] params) { + + if((PREFIX_FUNCTION + "clear").equals(name)) { + for(int i = 0; i < history.length; i++) history[i] = ""; + this.markChanged(); + return null; + } + + String allParams = String.join(" ", params); + + if((PREFIX_FUNCTION + "write").equals(name)) { + this.push(allParams); + this.markChanged(); + return null; + } + + if(name.startsWith(PREFIX_FUNCTION + "set")) { + int line = IRORInteractive.parseInt(name.substring(3), 1, 17) - 1; + this.history[line] = allParams; + this.markChanged(); + return null; + } + + if((PREFIX_FUNCTION + "submit").equals(name)) { + this.eval(allParams); + return null; + } + + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index e2e0165ce..631ea9879 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -4,6 +4,7 @@ package com.hbm.tileentity.network.pneumatic; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPneumoStorageExporter; import com.hbm.inventory.gui.GUIPneumoStorageExporter; +import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.network.RTTYSystem; import com.hbm.util.BobMathUtil; @@ -18,7 +19,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver { +public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver, IControlReceiverFilter { /** If requests should be pulled repeatedly every tick */ public boolean continuousRequest = false; @@ -303,9 +304,20 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB if(data.hasKey("ror")) { this.rorConfiguredMode = !this.rorConfiguredMode; } + if(data.hasKey("slot")) { + setFilterContents(data); + } this.markChanged(); } + @Override + public int[] getFilterSlots() { + return new int[] {0, 9}; + } + + @Override + public void nextMode(int i) { } + @Override public String[] getFunctionInfo() { return new String[] { diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java index 30f7c62e4..dcf4d5552 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.network.pneumatic; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPneumoStorageMono; import com.hbm.inventory.gui.GUIPneumoStorageMono; +import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; import api.hbm.fluidmk2.IFluidStandardReceiverMK2; @@ -15,7 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class TileEntityPneumoStorageMono extends TileEntityPneumaticStorageBase implements IPneumaticConnector, IFluidStandardReceiverMK2, ISlotMonitorProvider, IControlReceiver, IGUIProvider { +public class TileEntityPneumoStorageMono extends TileEntityPneumaticStorageBase implements IPneumaticConnector, IFluidStandardReceiverMK2, ISlotMonitorProvider, IControlReceiver, IGUIProvider, IControlReceiverFilter { public static final int CAPACITY = 100_000; public int[] amounts; @@ -86,4 +87,12 @@ public class TileEntityPneumoStorageMono extends TileEntityPneumaticStorageBase } @Override public long setupType(int index, ItemStack zeroStack, long amount) { return amount; } + + @Override + public void nextMode(int i) { } + + @Override + public int[] getFilterSlots() { + return new int[] {0, 3}; + } } diff --git a/src/main/java/com/hbm/world/gen/MapGenChainloader.java b/src/main/java/com/hbm/world/gen/MapGenChainloader.java index 01a605a4c..143b827b6 100644 --- a/src/main/java/com/hbm/world/gen/MapGenChainloader.java +++ b/src/main/java/com/hbm/world/gen/MapGenChainloader.java @@ -116,7 +116,5 @@ public class MapGenChainloader extends MapGenBase { blockMetas = event.metaArray; } } - } - } diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index dbf6922fa..051b11d1e 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -35,43 +35,45 @@ public class NTMWorldGenerator implements IWorldGenerator { boolean regTest = false; - public static boolean isInvalidBiome(BiomeGenBase biome) { - return BiomeDictionary.isBiomeOfType(biome, Type.OCEAN) || BiomeDictionary.isBiomeOfType(biome, Type.RIVER); + /** Includes all biomes tagged as ocean or river */ + public static boolean isWaterBiome(BiomeGenBase biome) { + return BiomeDictionary.isBiomeOfType(biome, Type.WATER); } + /** Includes biomes with little height variation and sparse vegetation, excludes water biomes */ public static boolean isFlatBiome(BiomeGenBase biome) { - return biome.heightVariation <= 0.2F && !isInvalidBiome(biome) && BiomeDictionary.isBiomeOfType(biome, Type.SPARSE); + return biome.heightVariation <= 0.2F && !isWaterBiome(biome) && BiomeDictionary.isBiomeOfType(biome, Type.SPARSE); } public NTMWorldGenerator() { /// SPIRE /// NBTStructure.registerStructure(0, new SpawnCondition("spire") {{ - canSpawn = biome -> biome.heightVariation <= 0.05F && !isInvalidBiome(biome); + canSpawn = biome -> biome.heightVariation <= 0.05F && !isWaterBiome(biome); structure = new JigsawPiece("spire", StructureManager.spire, -1); spawnWeight = StructureConfig.spireSpawnWeight; }}); NBTStructure.registerStructure(0, new SpawnCondition("features") {{ - canSpawn = biome -> !isInvalidBiome(biome); + canSpawn = biome -> !isWaterBiome(biome); start = d -> new MapGenNTMFeatures.Start(d.getW(), d.getX(), d.getY(), d.getZ()); spawnWeight = StructureConfig.featuresSpawnWeight; }}); NBTStructure.registerStructure(0, new SpawnCondition("bunker") {{ - canSpawn = biome -> !isInvalidBiome(biome); + canSpawn = biome -> !isWaterBiome(biome); start = d -> new BunkerStart(d.getW(), d.getX(), d.getY(), d.getZ()); spawnWeight = StructureConfig.bunkerSpawnWeight; }}); NBTStructure.registerStructure(0, new SpawnCondition("vertibird") {{ - canSpawn = biome -> !isInvalidBiome(biome) && BiomeDictionary.isBiomeOfType(biome, Type.SANDY); + canSpawn = biome -> !isWaterBiome(biome) && BiomeDictionary.isBiomeOfType(biome, Type.SANDY); structure = new JigsawPiece("vertibird", StructureManager.vertibird, -3); spawnWeight = StructureConfig.vertibirdSpawnWeight; }}); NBTStructure.registerStructure(0, new SpawnCondition("crashed_vertibird") {{ - canSpawn = biome -> !isInvalidBiome(biome) && BiomeDictionary.isBiomeOfType(biome, Type.SANDY); + canSpawn = biome -> !isWaterBiome(biome) && BiomeDictionary.isBiomeOfType(biome, Type.SANDY); structure = new JigsawPiece("crashed_vertibird", StructureManager.crashed_vertibird, -10); spawnWeight = StructureConfig.vertibirdCrashedSpawnWeight; }}); @@ -116,7 +118,7 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); NBTStructure.registerStructure(0, new SpawnCondition("forestchem") {{ - canSpawn = biome -> biome.heightVariation <= 0.3F && !isInvalidBiome(biome); + canSpawn = biome -> biome.heightVariation <= 0.3F && !isWaterBiome(biome); structure = new JigsawPiece("forest_chem", StructureManager.forest_chem, -9); spawnWeight = StructureConfig.forestChemSpawnWeight; }}); @@ -130,7 +132,7 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); NBTStructure.registerStructure(0, new SpawnCondition("forest_post") {{ - canSpawn = biome -> biome.heightVariation <= 0.3F && !isInvalidBiome(biome); + canSpawn = biome -> biome.heightVariation <= 0.3F && !isWaterBiome(biome); structure = new JigsawPiece("forest_post", StructureManager.forest_post, -10); spawnWeight = StructureConfig.forestPostSpawnWeight; }}); @@ -160,13 +162,13 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); NBTStructure.registerStructure(0, new SpawnCondition("plane1") {{ - canSpawn = biome -> biome.heightVariation <= 0.3F && !isInvalidBiome(biome); + canSpawn = biome -> biome.heightVariation <= 0.3F && !isWaterBiome(biome); structure = new JigsawPiece("crashed_plane_1", StructureManager.plane1, -5); spawnWeight = StructureConfig.plane1SpawnWeight; }}); NBTStructure.registerStructure(0, new SpawnCondition("plane2") {{ - canSpawn = biome -> biome.heightVariation <= 0.3F && !isInvalidBiome(biome); + canSpawn = biome -> biome.heightVariation <= 0.3F && !isWaterBiome(biome); structure = new JigsawPiece("crashed_plane_2", StructureManager.plane2, -8); spawnWeight = StructureConfig.plane2SpawnWeight; }}); @@ -190,52 +192,52 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinA") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsA", StructureManager.ntmruinsA, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsASpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinB") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsB", StructureManager.ntmruinsB, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsBSpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinC") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsC", StructureManager.ntmruinsC, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsCSpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinD") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsD", StructureManager.ntmruinsD, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsDSpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinE") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsE", StructureManager.ntmruinsE, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsESpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinF") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsF", StructureManager.ntmruinsF, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsFSpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinG") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsG", StructureManager.ntmruinsG, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsGSpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinH") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsH", StructureManager.ntmruinsH, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsHSpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinI") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsI", StructureManager.ntmruinsI, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsISpawnWeight : 0; }}); NBTStructure.registerStructure(0, new SpawnCondition("ruinJ") {{ - canSpawn = biome -> !isInvalidBiome(biome) && biome.canSpawnLightningBolt(); + canSpawn = biome -> !isWaterBiome(biome) && biome.canSpawnLightningBolt(); structure = new JigsawPiece("NTMRuinsJ", StructureManager.ntmruinsJ, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsJSpawnWeight : 0; }}); diff --git a/src/main/java/com/hbm/world/generator/TimedGenerator.java b/src/main/java/com/hbm/world/generator/TimedGenerator.java index 9501bbc8d..a9269c8a6 100644 --- a/src/main/java/com/hbm/world/generator/TimedGenerator.java +++ b/src/main/java/com/hbm/world/generator/TimedGenerator.java @@ -3,10 +3,12 @@ package com.hbm.world.generator; import java.util.ArrayList; import java.util.HashMap; +import com.hbm.interfaces.NotableComments; import com.hbm.interfaces.Spaghetti; import net.minecraft.world.World; +@NotableComments @Deprecated @Spaghetti("this class should be destroyed") public class TimedGenerator { @@ -46,7 +48,7 @@ public class TimedGenerator { list.add(job); } - //should i be doing this? probably not, but watch me go + //should i be doing this? probably not, but watch me go // no for the love of fucking god don't do this public interface ITimedJob { public void work(); From 775126f0bae222ffb85d89e56c4cc8ef3ce6ecfc Mon Sep 17 00:00:00 2001 From: HbmMods Date: Thu, 9 Jul 2026 21:33:49 +0200 Subject: [PATCH 070/107] obligatory beach episode --- changelog | 8 ++++- gradle.properties | 2 +- src/main/java/com/hbm/blocks/ModBlocks.java | 10 +++--- .../com/hbm/blocks/generic/BlockPedestal.java | 2 +- .../hbm/handler/nei/PressRecipeHandler.java | 23 ++++++++----- .../container/ContainerMachineEPress.java | 14 ++++---- .../ContainerPneumoStorageExporter.java | 31 +++++++++++++++++- .../java/com/hbm/inventory/fluid/Fluids.java | 2 +- .../hbm/inventory/gui/GUIMachineEPress.java | 10 +++--- .../gui/GUIMachineElectricFurnace.java | 2 +- .../hbm/inventory/gui/GuiInfoContainer.java | 21 ++++++++++-- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../hbm/render/item/ItemRenderLibrary.java | 3 +- .../hbm/render/tileentity/RenderEPress.java | 12 +++---- .../java/com/hbm/tileentity/DoorDecl.java | 2 +- .../machine/TileEntityMachineEPress.java | 9 ++--- src/main/resources/assets/hbm/lang/de_DE.lang | 4 ++- src/main/resources/assets/hbm/lang/en_US.lang | 2 ++ .../textures/blocks/brick_forgotten_bw.png | Bin 0 -> 370 bytes .../blocks/brick_forgotten_bw_top.png | Bin 0 -> 294 bytes .../playground/nullstone_demo_0_wip.png | Bin 0 -> 331 bytes .../assets/hbm/textures/gui/gui_epress.png | Bin 2361 -> 2357 bytes .../assets/hbm/textures/gui/gui_slab.png | Bin 4295 -> 4131 bytes .../gui/processing/gui_supercomputer.png | Bin 4136 -> 4194 bytes .../assets/hbm/textures/items/drives.png | Bin 0 -> 574 bytes .../textures/models/machines/cyclotron.png | Bin 9213 -> 8089 bytes .../models/machines/cyclotron_ashes.png | Bin 595 -> 299 bytes .../machines/cyclotron_ashes_filled.png | Bin 623 -> 318 bytes .../models/machines/cyclotron_book.png | Bin 538 -> 249 bytes .../models/machines/cyclotron_book_filled.png | Bin 557 -> 266 bytes .../models/machines/cyclotron_coin.png | Bin 582 -> 296 bytes .../models/machines/cyclotron_coin_filled.png | Bin 620 -> 323 bytes .../models/machines/cyclotron_gavel.png | Bin 605 -> 313 bytes .../machines/cyclotron_gavel_filled.png | Bin 635 -> 327 bytes .../models/machines/supercomputer.png | Bin 7778 -> 8152 bytes 35 files changed, 106 insertions(+), 53 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/blocks/brick_forgotten_bw.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/brick_forgotten_bw_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/playground/nullstone_demo_0_wip.png create mode 100644 src/main/resources/assets/hbm/textures/items/drives.png diff --git a/changelog b/changelog index be0317ad2..49a10e560 100644 --- a/changelog +++ b/changelog @@ -73,7 +73,7 @@ * Standard control units now use rubber instead of speed I upgrades * Advanced control units now use hardplastics instead of speed III upgrades * Quantum computers now use speed III upgrades instead of overdrive I -* Updated electric furnace GUI +* Updated electric furnace, burner press and electric press GUIs * The RoR terminal can now accept RoR controller input, allowing the terminal screen to be written directly and RoR terminal commands to be executed via incoming RoR signals * The last part seems redundant, why would you need to send RoR by sending RoR? The answer being, the terminal can be toggled to send polling signals, which will run independently of the source * For AUTOCALs, this means that they can now send polling signals "in parallel", i.e. independently of the code that actually runs on said AUTOCAL, by simply toggling polling on a terminal @@ -82,6 +82,11 @@ * 1/3 of glyphids do not have this behavior, this means that larger groups of glyphids cannot be trapped indefinitely by triggering target changes on purpose * Pedestal blocks fitted with charms now have a 200x200 block square area around them where the charm effect of repelling meteors applies to all players * Pedestal blocks fitted with golden defusers now have a 50x50 block area around them where creepers are automatically defused +* Disabled GTNH-NEI filter drag functionality because GTNH-NEI breaks the pattern slots of the new pneumatics stuff and the person who added it originally was too bald to fix it despite being told multiple times + * 70k it's 70k and he's bald bald haha bald head + * baldie baldie hahaha he bald he has the no of hair + * follically challenged baldie bald head +* Increased flue gas burn value from 10kTU to 25kTU ## Fixed * Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised @@ -97,3 +102,4 @@ * Fixed meteorite sword localization still being broken * Fixed missing localization on the FM radio * Fixed mufflers not working on large doors +* Fixed the electric press not displaying the currently pressed item in the model diff --git a/gradle.properties b/gradle.properties index fc85e5e78..105ca8208 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=5719 +mod_build_number=5751 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 537d02097..91c3537de 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1907,11 +1907,11 @@ public class ModBlocks { pneumatic_tube = new PneumoTube().setBlockName("pneumatic_tube").setStepSound(ModSoundTypes.pipe).setHardness(2F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_tube"); pneumatic_tube_paintable = new PneumoTubePaintableBlock().setBlockName("pneumatic_tube_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - pneumatic_storage_access = new PneumoStorageAccess().setBlockName("pneumatic_storage_access").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_access"); - pneumatic_storage_clutter = new PneumoStorageClutter().setBlockName("pneumatic_storage_clutter").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_clutter"); - pneumatic_storage_mono = new PneumoStorageMono().setBlockName("pneumatic_storage_mono").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_mono"); - pneumatic_storage_importer = new PneumoStorageImporter().setBlockName("pneumatic_storage_importer").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_importer"); - pneumatic_storage_exporter = new PneumoStorageExporter().setBlockName("pneumatic_storage_exporter").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_exporter"); + pneumatic_storage_access = new PneumoStorageAccess().setBlockName("pneumatic_storage_access").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_access"); + pneumatic_storage_clutter = new PneumoStorageClutter().setBlockName("pneumatic_storage_clutter").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_clutter"); + pneumatic_storage_mono = new PneumoStorageMono().setBlockName("pneumatic_storage_mono").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_mono"); + pneumatic_storage_importer = new PneumoStorageImporter().setBlockName("pneumatic_storage_importer").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_importer"); + pneumatic_storage_exporter = new PneumoStorageExporter().setBlockName("pneumatic_storage_exporter").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_storage_exporter"); chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); diff --git a/src/main/java/com/hbm/blocks/generic/BlockPedestal.java b/src/main/java/com/hbm/blocks/generic/BlockPedestal.java index a1d1207dd..0333505dc 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPedestal.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPedestal.java @@ -208,7 +208,7 @@ public class BlockPedestal extends BlockContainer { if(this.item != null) { if(item.getItem() == ModItems.protection_charm) pushPedestalEntry(worldObj, PedestalEntryType.CHARM_OF_PROTECTION, xCoord, yCoord, zCoord); if(item.getItem() == ModItems.meteor_charm) pushPedestalEntry(worldObj, PedestalEntryType.METEORITE_CHARM, xCoord, yCoord, zCoord); - if(worldObj.getTotalWorldTime() % 60 == 0 && item.getItem() == ModItems.defuser) castrateCreepers(); + if(worldObj.getTotalWorldTime() % 60 == 0 && item.getItem() == ModItems.defuser_gold) castrateCreepers(); } } } diff --git a/src/main/java/com/hbm/handler/nei/PressRecipeHandler.java b/src/main/java/com/hbm/handler/nei/PressRecipeHandler.java index f0b2adefb..0dc48dddf 100644 --- a/src/main/java/com/hbm/handler/nei/PressRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/PressRecipeHandler.java @@ -41,9 +41,11 @@ public class PressRecipeHandler extends TemplateRecipeHandler implements ICompat return "pressing"; } public LinkedList transferRectsRec = new LinkedList(); - public LinkedList transferRectsGui = new LinkedList(); + public LinkedList transferRectsPress = new LinkedList(); + public LinkedList transferRectsEPress = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); - public LinkedList> guiGui = new LinkedList>(); + public LinkedList> guiPress = new LinkedList>(); + public LinkedList> guiEPress = new LinkedList>(); public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { PositionedStack input; @@ -130,21 +132,24 @@ public class PressRecipeHandler extends TemplateRecipeHandler implements ICompat @Override public Class getGuiClass() { - // return GUIMachineShredder.class; return null; } @Override public void loadTransferRects() { - transferRectsGui = new LinkedList(); - guiGui = new LinkedList>(); + transferRectsPress = new LinkedList(); + transferRectsEPress = new LinkedList(); + guiPress = new LinkedList>(); + guiEPress = new LinkedList>(); transferRects.add(new RecipeTransferRect(new Rectangle(74 + 6, 23, 24, 18), "pressing")); - transferRectsGui.add(new RecipeTransferRect(new Rectangle(74 + 6 + 18, 23, 24, 18), "pressing")); - guiGui.add(GUIMachinePress.class); - guiGui.add(GUIMachineEPress.class); + transferRectsPress.add(new RecipeTransferRect(new Rectangle(74 + 6 + 18, 23, 24, 18), "pressing")); + transferRectsEPress.add(new RecipeTransferRect(new Rectangle(13 + 6 + 18, 23, 24, 18), "pressing")); + guiPress.add(GUIMachinePress.class); + guiEPress.add(GUIMachineEPress.class); RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); + RecipeTransferRectHandler.registerRectsToGuis(guiPress, transferRectsPress); + RecipeTransferRectHandler.registerRectsToGuis(guiEPress, transferRectsEPress); } @Override diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java b/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java index 020eb7ac4..4f6a38ae8 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java @@ -23,24 +23,24 @@ private TileEntityMachineEPress nukeBoy; nukeBoy = tedf; //Battery - this.addSlotToContainer(new Slot(tedf, 0, 44, 53)); + this.addSlotToContainer(new Slot(tedf, 0, 152, 54)); //Stamp - this.addSlotToContainer(new Slot(tedf, 1, 80, 17)); + this.addSlotToContainer(new Slot(tedf, 1, 19, 15)); //Input - this.addSlotToContainer(new Slot(tedf, 2, 80, 53)); + this.addSlotToContainer(new Slot(tedf, 2, 19, 51)); //Output - this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 3, 140, 35)); + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 3, 79, 33)); //Upgrade - this.addSlotToContainer(new SlotUpgrade(tedf, 4, 44, 21)); + this.addSlotToContainer(new SlotUpgrade(tedf, 4, 111, 32)); 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(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)); + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 162)); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java index 4928ba349..4e80cbb46 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageExporter.java @@ -17,7 +17,7 @@ public class ContainerPneumoStorageExporter extends ContainerBase { this.addSlotToContainer(new SlotPattern(exporter, i, 17 + (i % 3) * 18, 17 + (i / 3) * 18).allowStackSize()); } - addSlots(exporter, 9, 80, 17, 3, 3); + addTakeOnlySlots(exporter, 9, 80, 17, 3, 3); playerInv(invPlayer, 103); } @@ -41,4 +41,33 @@ public class ContainerPneumoStorageExporter extends ContainerBase { slot.putStack(held); return ret; } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack slotOriginal = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack slotStack = slot.getStack(); + slotOriginal = slotStack.copy(); + + if(index <= tile.getSizeInventory() - 1) { + if(!this.mergeItemStack(slotStack, tile.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else { + return null; + } + + if(slotStack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + slot.onPickupFromSlot(player, slotStack); + } + + return slotOriginal; + } } diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 18f7908cc..99d05b0ac 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -412,7 +412,7 @@ public class Fluids { CONCRETE = new FluidType("CONCRETE", 0xA2A2A2, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); DHC = new FluidType("DHC", 0xD2AFFF, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS); AIRBLAST = new FluidType("AIRBLAST", 0xFFDADA, 0, 3, 0, EnumSymbol.NONE).setTemp(1_200).addTraits(GASEOUS); - FLUE = new FluidType(155, "FLUE", 0x131313, 1, 4, 1, EnumSymbol.NONE).addContainers(new CD_Gastank(0xFF4545, 0xFFE97F)).addTraits(new FT_Flammable(10_000), GASEOUS, new FT_Polluting().burn(PollutionType.SOOT, SOOT_GAS).release(PollutionType.SOOT, SOOT_GAS * 25)); + FLUE = new FluidType(155, "FLUE", 0x131313, 1, 4, 1, EnumSymbol.NONE).addContainers(new CD_Gastank(0xFF4545, 0xFFE97F)).addTraits(new FT_Flammable(25_000), GASEOUS, new FT_Polluting().burn(PollutionType.SOOT, SOOT_GAS).release(PollutionType.SOOT, SOOT_GAS * 25)); // ^ ^ ^ ^ ^ ^ ^ ^ //ADD NEW FLUIDS HERE diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java b/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java index 383d5bb3d..4d4f54caa 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java @@ -20,14 +20,14 @@ public class GUIMachineEPress extends GuiInfoContainer { press = tedf; this.xSize = 176; - this.ySize = 166; + this.ySize = 186; } @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 17, guiTop + 69 - 52, 16, 52, press.power, press.maxPower); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 52 - 34, 16, 34, press.power, press.maxPower); } @Override @@ -44,10 +44,10 @@ public class GUIMachineEPress extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - int i = (int) (press.power * 52 / press.maxPower); - drawTexturedModalRect(guiLeft + 17, guiTop + 69 - i, 176, 52 - i, 16, i); + int i = (int) (press.power * 34 / press.maxPower); + drawTexturedModalRect(guiLeft + 152, guiTop + 52 - i, 176, 34 - i, 16, i); int k = (int) (press.renderPress * 16 / press.maxPress); - this.drawTexturedModalRect(guiLeft + 79, guiTop + 35, 192, 0, 18, k); + this.drawTexturedModalRect(guiLeft + 18, guiTop + 33, 192, 0, 18, k); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java index e31ed7ed4..06d37ff96 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java @@ -68,7 +68,7 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { if(furnace.getWorldObj().getBlock(furnace.xCoord, furnace.yCoord, furnace.zCoord) == ModBlocks.machine_electric_furnace_on) { drawTexturedModalRect(guiLeft + 45, guiTop + 20, 192, 12, 18, 16); - drawTexturedModalRect(guiLeft + 45, guiTop + 47, 192, 36, 18, 16); + drawTexturedModalRect(guiLeft + 46, guiTop + 47, 192, 28, 18, 16); } int p = furnace.getProgressScaled(28); diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index f99f75244..b5f3f1718 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -341,7 +341,24 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa @Override @Optional.Method(modid = "NotEnoughItems") public boolean handleDragNDrop(GuiContainer gui, int x, int y, ItemStack stack, int button) { - if(gui instanceof GuiInfoContainer && stack != null){ + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! + + /*if(gui instanceof GuiInfoContainer && stack != null){ Slot slot = getSlotAtPosition(x,y); if(slot instanceof SlotPattern){ if(inventorySlots instanceof ContainerBase) { @@ -357,7 +374,7 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa return true; } } - } + }*/ return false; } //all credits for impl to GTNH's EnderCore fork diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 6fb156cc0..d09072c7a 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 (5719)"; + public static final String VERSION = "1.0.27 BETA (5751)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 9160ac8cf..578119be5 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -43,7 +43,8 @@ public class ItemRenderLibrary { renderers.put(Item.getItemFromBlock(ModBlocks.machine_cyclotron), new ItemRenderBase() { public void renderInventory() { - GL11.glScaled(2.25, 2.25, 2.25); + GL11.glTranslated(0, -1, 0); + GL11.glScaled(2.75, 2.75, 2.75); } public void renderCommon() { GL11.glShadeModel(GL11.GL_SMOOTH); diff --git a/src/main/java/com/hbm/render/tileentity/RenderEPress.java b/src/main/java/com/hbm/render/tileentity/RenderEPress.java index cf8915ef8..dc8f818b0 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderEPress.java +++ b/src/main/java/com/hbm/render/tileentity/RenderEPress.java @@ -80,14 +80,10 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glRotatef(180, 0F, 1F, 0F); switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { - case 2: - GL11.glRotatef(270, 0F, 1F, 0F); break; - case 4: - GL11.glRotatef(0, 0F, 1F, 0F); break; - case 3: - GL11.glRotatef(90, 0F, 1F, 0F); break; - case 5: - GL11.glRotatef(180, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(180, 0F, 1F, 0F); break; } GL11.glRotatef(90, 0F, 1F, 0F); diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index e9b62b3fb..f56176c2a 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -666,7 +666,7 @@ public abstract class DoorDecl { return null; } - @Override public int timeToOpen() { return 120; } + @Override public int timeToOpen() { return 60; } @Override public int[][] getDoorOpenRanges() { return new int[][] { { -1, -1, 0, 3, 3, 1 } }; } @Override public int[] getDimensions() { return new int[] { 2, 0, 0, 0, 1, 1 }; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index 4dc4df595..0becdf9fc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -147,10 +147,7 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE super.serialize(buf); buf.writeLong(power); buf.writeInt(press); - if (slots[2] == null) - buf.writeShort(-1); // indicate that the NBT doesn't actually exist to avoid null pointer errors. - else - BufferUtil.writeNBT(buf, slots[2].stackTagCompound); + BufferUtil.writeItemStack(buf, slots[2]); } @Override @@ -158,9 +155,7 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE super.deserialize(buf); this.power = buf.readLong(); this.syncPress = buf.readInt(); - - NBTTagCompound stack = BufferUtil.readNBT(buf); - this.syncStack = ItemStack.loadItemStackFromNBT(stack); + this.syncStack = BufferUtil.readItemStack(buf); this.turnProgress = 2; } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index cf50d61fe..336065b4e 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -359,7 +359,8 @@ container.paSource=Teilchenquelle container.plasmaHeater=Plasmaerhitzer container.pneumoStorageAccess=PLS Zugangsterminal container.pneumoStorageClutter=PLS Gerümpelkiste -container.pneumoStorageImporter=PSN Importer +container.pneumoStorageExporter=PLS Exporter +container.pneumoStorageImporter=PLS Importer container.pneumoStorageMono=PLS Massenspeicher container.pneumoTube=Rohrpost container.press=Befeuerte Presse @@ -4742,6 +4743,7 @@ tile.plasma_heater.name=Plasmaerhitzer tile.plushie.name=%s Plüschfigur tile.pneumatic_storage_access.name=Pneumatisches Lagersystem - Zugangsterminal tile.pneumatic_storage_clutter.name=Pneumatisches Lagersystem - Gerümpelkiste +tile.pneumatic_storage_exporter.name=Pneumatisches Lagersystem - Exporter tile.pneumatic_storage_importer.name=Pneumatisches Lagersystem - Importer tile.pneumatic_storage_mono.name=Pneumatisches Lagersystem - Massenspeicher tile.pneumatic_tube.name=Rohrpost diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index dc5e332c1..ba4ad5547 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -761,6 +761,7 @@ container.paSource=Particle Source container.plasmaHeater=Plasma Heater container.pneumoStorageAccess=PSN Access Terminal container.pneumoStorageClutter=PSN Clutter Storage +container.pneumoStorageExporter=PSN Exporter container.pneumoStorageImporter=PSN Importer container.pneumoStorageMono=PSN Bulk Storage container.pneumoTube=Pneumatic Tube @@ -6003,6 +6004,7 @@ tile.plasma_heater.name=Plasma Heater tile.plushie.name=%s Plushie tile.pneumatic_storage_access.name=Pneumatic Storage Network - Access Terminal tile.pneumatic_storage_clutter.name=Pneumatic Storage Network - Clutter Storage +tile.pneumatic_storage_exporter.name=Pneumatic Storage Network - Exporter tile.pneumatic_storage_importer.name=Pneumatic Storage Network - Importer tile.pneumatic_storage_mono.name=Pneumatic Storage Network - Bulk Storage tile.pneumatic_tube.name=Pneumatic Tube diff --git a/src/main/resources/assets/hbm/textures/blocks/brick_forgotten_bw.png b/src/main/resources/assets/hbm/textures/blocks/brick_forgotten_bw.png new file mode 100644 index 0000000000000000000000000000000000000000..7365aff7deb31123dfd104e5183555111444dd78 GIT binary patch literal 370 zcmV-&0ge8NP)u3;n?rsEg0(Dn8#eo8C zT!OG6EdD({K2NpQv$Y0*s*-cY%-FUKw^}OzW=8Lw=kq!8XEPfKUhF|HHnZ^#P)Zs3 zvv-aj7zlhSFua?Yy&Lr22mF}mZz4j@naAUSh>Qj~XO`GCPP?zJ$vtn$R$}sE?T%-DFqQ>0WQ16 z{Yxn$=Ii8~X|0XRe68#Hol@dBj#0R-D0oneEP)U=8QBR{TlFL) zgz@t)?46Fz^Kt2}G9Hnrz5?gR^R_wARA+J`;!ty?1WFqt+TG ssVe)vhgjaoNOI26;B4Z5oU@7TpMBq`ttnO@_y7O^07*qoM6N<$g1O9ke*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/playground/nullstone_demo_0_wip.png b/src/main/resources/assets/hbm/textures/blocks/playground/nullstone_demo_0_wip.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe7ed29d8952d0a545752701b867458df0a90c8 GIT binary patch literal 331 zcmV-R0kr;!P)wXI3z*HeFtEU?3}T<&Q{F zl)UWwegS~H!^|Ke;28jV?{IgB$Q0x5=)I#b@C_J=kK>r`NnFef0PX-T5;0?rBXMD7 zUPh?|hzL{_z4u2ch2RK?UJ#H=tmpqy&5_Z(9!HcRFU6Q^=Bf%Q6l#d9Pg+` zRZ$48wcdfbl@XNNTB74rLlq+OAfYOf6mD`mW0qJ(t#$HjX{}xEJ`GYHX}+1+V?vkK z+Wi;uW6u7TxwbPq_9M{S>I&({C|002ovPDHLkV1n%0i^u=~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/gui_epress.png b/src/main/resources/assets/hbm/textures/gui/gui_epress.png index 601b9c143537ebfe2270fd2d0f64f563f2d1cb83..0079b6484035c9d738d879dd6fc4d5e0bcf4c969 100644 GIT binary patch literal 2357 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 z zE(z&h`}(z$ik8`}V#zjn)p1BWNfcP~$9Pu>gq-F4C zR%W!NU1;o1$+AE#HS%M@kM@84kB1vQRat~&>QNj#9(BQ(e^SW6ZUqwNIcESe0VzXH zCps%g_s8?@^#l|`_;)C~<#6y{ zAw;i*pPPSEO4CnM@@RWyP#4sH0Iv?=$@y7Me{}&Yf#ih(0(qmz9-|&<`&X`xAe9c;nng$FVdkA za^aAEg;ce84N(yLqlKy{gtR( z66a5|O_z5t<%daNy*OrFRdPlL2OkH`%$kbb7Rks7D~~y7m$H{nr|hDHQG6-iV9T%1 zwG0T^vqz*#jLl_`WHmm4qDL9<7(*TACU@i($C<1fc%N;EC>DR8+w)qeo~7g{bZ{X?Uts_-^^ z>qhY@CL!D5F^t)owW}H1{WC6Cqp`mhC5&a>3rz}dn7}0qrX%VIa9({w{ga>w?%L#u z?S04Ojj_H?Pb&R@ofM)R&f0MTc1Puc(*$IVy>QaQ>Yg0w zUm1ju(Z+|FH)aK3aK+YyY+Ee7;`ti)qRzDYdAH*wydoC zZ+UY@Q9Vz@I#Eh|yDQ;Te|DheN~A!zaM5p!c5F3b$t!myUhudyJ74Teo9?{6$vePj0cq?vVu_pW~PWz!GyvZtf*B?Du2I;}WepmLH6sO!kUOnp30SEalDqF+++MY(vb$oq*rE{vY=Tbr<}Ov4wU_Y%{F`okkb0}=&WZ7l9s^<}+4gywcX2aM?-)&U!Uq62szXs!w#$9r$T$Sn^fW6CKc6dpW&*XjF-$@3k{CUH$|)ULna&@ zJGyR}-L$%GcJq|W1HHLs_M5fg#etm(5=Q7qK0}FNr!@oLnvd8bEXy=s`8xk)y#o55mdN6T zj*wGDZ?Bg2?COj1>+g?v3?q+!fKH5KP}BkAm2am8J{{+_fc*(qot`7j9?4U!xH7cX zKGSHHDcW^SZg?s`+w@r6M-0;0}D{1_|RMf2S0xozXJC3{2L9=DQ%7Bd5AEH87G`(4E;GVQD%MN7Q=NdVVm8?Bx}bul#O_HT0kRWwD*k)OP@dF zM8}fub+#^-cymgY7d=(=SN+-8Hl=K|x#Y5d0b;ooZP6D*UKM+=>#E{B2gaR}$FIs; z=y6aKdd@ekn8_FYQSC){dTYGLj&Z%-qu?T6wzv%@IvcQLQTZ&fq1uuYIhkx|u_yKS zV&!9S5lXiUzRmM)XK{)px28O)*=O0Wgf|eB`;R@1emgT8x=Uj2$gnw4R*F=e3ebAomh`%25LCkC14?8LrBSDb~jP_e%jvFd;Ij&&lI@>nbVAB5&MFTyA literal 4295 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 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_supercomputer.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_supercomputer.png index a68dda7ab3cc93e4605826eb7d08c1afac99cdf5..2703b7dc15516140f2a43d7213c3c07b5a6c24b1 100644 GIT binary patch literal 4194 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 Y<(-rp<7#;{|J#%Cg-Zq{=aJ$6169(pl>h($ literal 4136 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 D1_ggS diff --git a/src/main/resources/assets/hbm/textures/items/drives.png b/src/main/resources/assets/hbm/textures/items/drives.png new file mode 100644 index 0000000000000000000000000000000000000000..c1fb4d94a6d789a94e81801068417accad48f4f1 GIT binary patch literal 574 zcmV-E0>S->P)E3Gy^vpoOh%&~k$MKU5L1L3;9f+rFe*A$a5Mu;DaG^ zgLC_UF?U<(9pKyz3jB0gqSCjdSwKWB>pF M07*qoM6N<$f=jRncK`qY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron.png index 90064e6180182c0982bd4ddda6743533d38e92a5..35ccca0c43e60a77c0bed490917cf1a89f33870b 100644 GIT binary patch literal 8089 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 bdm-0wX{LDaiSjg1YX_+*Ybg~gS_c0g%(Ml) literal 9213 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 diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron_ashes.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron_ashes.png index e291026a4f940b07dc2ee47020c0f9e656d38bbc..ae3417eb446a6df9beba40f5df228424362b5255 100644 GIT binary patch delta 272 zcmV+r0q_3P1gip&B!2{RLP=Bz2nYy#2xN!=0081iL_t(YiS5_h4Z|P|1yECU9`;}c z50V)egc-bt7izyOrA~MlC{3i^KTwhrW08jgl@P*9&y9qL+6uhEt3qZz9sj WbNl}v5)uFa00{s|MNUMnLSTZ>s(45M literal 595 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjVd?$3P6lGsB>j zQ(8j4M|y$xjQ#u^?w@lbAWT&TV%W>ew(cjYNe+H~ldU1Sp z-3Lw+YX+IV=bqYo;{1%mJ&MKhlo%X#ygj#XOX-57yq$IFigf-6PkCA>uPjyZ2?4YsY>kn@JwqqHbru?6q39 ze{O7MyU4~1)1Pw3i}4z6yI;6RyjS1;!_%|E-M_1MF*Akt=CT{5PX~pJr>mdKI;Vst E04ANK_5c6? diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron_ashes_filled.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron_ashes_filled.png index 8b1cc1a0282d001c3e8636aa003aa339bd9c8020..0f15363f8e76c5d63c1d28fdb1dccd4f44c5af11 100644 GIT binary patch delta 291 zcmV+;0o?xY1ik{0B!2{RLP=Bz2nYy#2xN!=008w#L_t(YiS5_X5rZHM24L*<*%_E1 z6S#moxQ8>i2RpFGzfk*>J50eQNNK(6{|49c8Pci@PGp|vhnzc;7~_zRZ!H(sN_eIB?InvQ`xW$d13?Lyo*cYxw(e$GTVe2eScC-G5^<2*54N;=K1&e<2gd z7yvhpqYELJQ8k!i93nEKDlmuDqHnN%1LoXa(Fc;7fJywVg}CuGS_%oTnc>YA@}HPuS)6vUMeTn pb!~dK*tYG*&Kwq>>K&(hg-?#7g(drV2e|+M002ovPDHLkV1nT@fe-)y literal 623 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjVdC&eO#)#KZgTbVI%-1Ch4+p2eMU2Uy(IQVPuE z4mj#L9C{(y)BKUAPc6=Yo&SL#S8)GgX1ic54|&t13;K#rwzl+N{}x!Vz;L$yx~kc{ z(?6dKeB38h(=xmGXXD!^(8o`YQU4|v@TfI6|Rc89IRQ+Y_YqyQg(g{gzdCs1*a^eOLw}Pcp z4}}{wDc5S6OcY#pDQKY&YumdM9&R%{yj$nVCm7A$`08wmi&yK8{Ra+f)QMD0jCs3y z5~D+S{sl$NLYp_mf3xDJ@|12bP0l+XkK|KYkB diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron_book.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron_book.png index b1d2ac286058c95b232efb7915ec133672281d34..b16030be78f10d9c9a42de2db2d6399cec87c3b7 100644 GIT binary patch delta 221 zcmV<303!dI1o;7wB!2{RLP=Bz2nYy#2xN!=006K_L_t(YiS3us4Z|P|M4{?Dw}*G| z9?ZZ*-op#EUzS=o60YJ9K6rn&NRHzoIn?4HqL=TTK}70j{m6WIgr{!+NEHx~uX?(} zYMGg{EQhLkSl^$a;dl5i_Pjr_bsTykjwAVp1XcCt^FD%^hgKUK9%)o8%JdAk;1=A1 zTW|qE0ELLs1VhsTKw;+Ly2uDiore+bpZMk^%aLdPf2nV@)>7{lz4yiL7FT6wOn3MO XYbZBfl-<0S00000NkvXXu0mjf{G(=4 literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjSsD^mK6y@$gPgabWJ-*ZBY9Q4Pl5=Ihg4o*63^ zzhDf=Nl!>fII${o(JKDsTd(kL;7=@Ewle?30U%hA$*@q9^}7BX_owkKAK3f(FUERk zHT>jAd)M%DLI(HxcpHBKVdjVntQ#6%i=Q`sbAOLqtOPU5QFXx{t|mK`Yeq?oj@&DG z-E@~&No<|)D&dOLs^){~3zzLvY+jtNu*=|P!waq%GnTP$l8X^FxF|M>t02z<3OZL#k;8IHb9e{g~$4H$_~h92vSN9+4~0~3a|Ceb8-uJ*+4{B z0U~;aVW7kw&ZUT>}S10&RHFUi0Z;rK^D^{ zVnL1N8E(NXxCOW1eAK-Z5uvpPF-90;%ok))M1+hwq oQA%-rThv-F_O_Un9kblw6G(MH-E3%;o&W#<07*qoM6N<$f|U(t6951J literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjSs@@pN$v@$gPgabWJ-*ZBY9Q4Pl5=Ihg4o*63^ zzhDf=Nl!>fII${o(JKDsTd(kL;7=@Ewle?30U%hA$*@q9^}7BX_owkKAK3f(FUERk zHT>jAd)M%DLI(HxcpHBKVdjVntQ#6%i=Q`UIjX*pdvU{S@pHx*QW8QvTupW@k!61m zRsNabAuqIL!mWfWPOF*&xmWVJ=`OL7s1eJ0C2h1O+M@sA>ErwoTbWmyvNCIm8W{TW zr`Q^}F9<*2678XNAXV|8!cwyX9~5~e2_|=e_unzeqk><-)3yN!+lcP!lt^n$zVYhvVZ%kR~QnkwKjz`E+SB) zo!0P^*pUzd=X|;~_HsysyF}a(fhP?!lZX(}qxG#2 z5q_O@pQS2b<0!+oMKAj`&1_y$swo>yU5oYqr8W>_ocgv%DQ)()_*U(d!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjSr&^>lFz@$h~+-IuG`K)}tuS~~oias`99lYig~ zUN7;b<^ok*3%g|wD6i1&zpVF0#Q12+r62CK0x51Ee+njpk5v07uXA4Py7=wzwskGU)#M5nzwodH}@UR0|kbstDnm{r-UW|hg+_V diff --git a/src/main/resources/assets/hbm/textures/models/machines/cyclotron_coin_filled.png b/src/main/resources/assets/hbm/textures/models/machines/cyclotron_coin_filled.png index 5dc70b950665b118542cf07a6f788512a7f0dbd3..7af3192d397463ef175c0db27f6952259e0e0146 100644 GIT binary patch delta 296 zcmV+@0oVTQ1j7Q5B!2{RLP=Bz2nYy#2xN!=008<)L_t(YiQSjY5riNNg>h%kmO>x) zU?0?AAM`*UslXa&z&*X4m|Z1|k!AMX!XO_n;YS81G)>bc+pZ|3H1POgIk-ko+2Fl5 z1*DXAadU?QY6fRk4vFY%{QDY0a)!0S_cCM69rlybBgs_PE`KsL5TJRUckMC8DzFMj zL~oFE$S0s#Xhk4kM}rZO%Q?GsT~GT#CW~eqM|Iy*V96bq_uj=Ai?#g!eb^UJTNmf_ z^;SE~IcvL~s<;o~lE+;91Txw9fB?kd0CBJhkPj%&(%O6T@@-M8zP803`ba5Kb~SZJ uYX4s<8$t-CZy}3iSvq@L+*LcMxx*LgnQ*t=t>rKP0000Bz literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjVdC+SA1`#KSu|#eunRU*rFaM>QCKo3BrId1kCw z{DLtcCp{q{;l!%UMXUIiZ@t31fj_Zu*~bAzZmPG z)$o%e?Onsqf)CLZe;-wf_-HBIa+<;F_|a2iMo4$$1=bCWGhBHhgoJ%$X3Lm4Txd5q zy)NFO|LTF);^&O#*zK5~c=u4H%hSXrF(KxPAFLNz3z+tZDgEvfxNyZ><<#^F-6gCN z55yTtD3+&U|nD-FBm|lhlmL0c>=)tWvl{vgILeMY1q{r?f{;6m&(L-U9NwN k7~`M)E$-?aYZtr2FW4TJ>?~yj9smFU07*qoM6N<$f<}yeYybcN literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NsHsNx`ZCx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjVd?$J50z#KZgP^|QQ91`@|UvTuLMDcQ(qv7yaa zg8vw=$DF1XXZ8e^2S+Tb6!bOMe|!AYx#yq$vfhX8$(OHitT8z)Uz6v#b)8aijRE`o zj77``Ue?5xwtl~z`dsu<{<23b3=8@WKfm;A+swY*iGOUhpX6)whPj--o7=ki;J)l* z+ozduzuC>UbzQ(~ubwW)LmHY|OqOn*0fH~IL_{04{3fJX&X?nMbX9oj9J_ofhe`SK zJ1z?AHB9F_1!g_h6y>>9rm@g<IMo-9D1QH zU=84fhAbKn)CELDNGVl|Lo2k)p#`1i*{oJwF)SC2*1qrN7~N^1r?7R^{w-}aNX;1$ zK}rdT=y=ak6R?(h<>0NbCSXgVhb8{ms^S7(0W*ODjf4RhF+{}UiGrCxfb+Y4P4}N^ y%F1zt#-B@d$0fS1p?8aI+a7kexGHv{;SRq7Bgvgce~=9T0000!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@GwnEjyr^ZK)BSX`Y^13>-iXD}xjxD+42tQV0J5OE3=IrGvOebzc&PSYUjVdC%hSa%#KZgPbVI%-2LV_6dxu?4uWeASVBp@{ zz_~QtKp}P1e!ym(+~L4`m5un^_Wg+7@%4zxr^) zeb%%)hRyy7HyIPGqD`V6W?AO%bo!O1)x*f3wM+K(qRm(OK1ctt75yaWwXo~O&b6UG zHU&J-G|b}E=PaFTtg|JN*IF$C` wsAdg2f3?)1Id@7kYW+X6Tj$UFv2*`&Z3VA~R~(bd4M8F3>FVdQ&MBb@0Ihw!kpKVy diff --git a/src/main/resources/assets/hbm/textures/models/machines/supercomputer.png b/src/main/resources/assets/hbm/textures/models/machines/supercomputer.png index 23f523d4ac00c8e1dfcece1b528a048ebe95c3ec..6ee264221a0ffa97e19cee234c375260fb770076 100644 GIT binary patch literal 8152 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 literal 7778 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 Date: Thu, 9 Jul 2026 18:19:45 -0400 Subject: [PATCH 071/107] well that was stupid --- .../hbm/inventory/gui/GuiInfoContainer.java | 33 ++---- .../TileEntityPneumaticStorageBase.java | 38 +++--- .../TileEntityPneumoStorageExporter.java | 108 ++++++++++-------- .../TileEntityPneumoStorageMono.java | 28 ++++- 4 files changed, 114 insertions(+), 93 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index b5f3f1718..d74792b31 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -182,14 +182,14 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa this.zLevel = 0.0F; itemRender.zLevel = 0.0F; } - + public static final ItemStack TEMPLATE_FOLDER = new ItemStack(ModItems.template_folder); - + /** Standardsized item rendering from GUIScreenRecipeSelector */ public void renderItem(ItemStack stack, int x, int y) { renderItem(stack, x, y, 100F); } - + public void renderItem(ItemStack stack, int x, int y, float layer) { FontRenderer font = stack.getItem().getFontRenderer(stack); if(font == null) font = fontRendererObj; @@ -323,11 +323,11 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa GL11.glEnable(GL12.GL_RESCALE_NORMAL); } } - + public void click() { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); } - + public void clickSendFlag(TileEntity tile, int x, int y, int left, int top, int sizeX, int sizeY, String name) { if(checkClick(x, y, left, top, sizeX, sizeY)) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); @@ -336,29 +336,14 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, tile.xCoord, tile.yCoord, tile.zCoord)); } } - + ///NEI drag and drop support @Override @Optional.Method(modid = "NotEnoughItems") public boolean handleDragNDrop(GuiContainer gui, int x, int y, ItemStack stack, int button) { // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - // BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! BALD! - - /*if(gui instanceof GuiInfoContainer && stack != null){ + + if(gui instanceof GuiInfoContainer && stack != null){ Slot slot = getSlotAtPosition(x,y); if(slot instanceof SlotPattern){ if(inventorySlots instanceof ContainerBase) { @@ -374,7 +359,7 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa return true; } } - }*/ + } return false; } //all credits for impl to GTNH's EnderCore fork diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java index 3e4ab8c74..8c62229e6 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumaticStorageBase.java @@ -27,7 +27,7 @@ public abstract class TileEntityPneumaticStorageBase extends TileEntityMachineBa public FluidTank compair; public SlotMonitor[] monitors; - + protected PneumaticNode node; protected boolean wasAvailable = false; @@ -35,7 +35,7 @@ public abstract class TileEntityPneumaticStorageBase extends TileEntityMachineBa super(slots); this.compair = new FluidTank(Fluids.AIR, 4_000).withPressure(1); this.monitors = new SlotMonitor[slots]; - + for(int i = 0; i < monitors.length; i++) this.monitors[i] = new SlotMonitor(i, this); } @@ -58,43 +58,43 @@ public abstract class TileEntityPneumaticStorageBase extends TileEntityMachineBa @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + boolean isAvailable = this.isAvailable(); - + if(isAvailable != wasAvailable) { this.wasAvailable = isAvailable; for(SlotMonitor monitor : monitors) monitor.availabilityHasChanged(); } - + if(this.node == null || this.node.expired) { this.node = (PneumaticNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); - + if(this.node == null || this.node.expired) { this.node = (PneumaticNode) new PneumaticNode(new BlockPos(xCoord, yCoord, zCoord)).setStandardConnections(xCoord, yCoord, zCoord); UniNodespace.createNode(worldObj, this.node); } } - + if(node != null && !node.expired && node.hasValidNet()) { this.node.net.storages.add(this); } - + if(worldObj.getTotalWorldTime() % 10 == 0) for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { this.trySubscribe(compair.getTankType(), worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - + if(this.compair.getFill() > 0) { int consumption = (int) Math.ceil(this.compair.getFill() * 9 / this.compair.getMaxFill()) + 1; this.compair.setFill(Math.max(this.compair.getFill() - consumption, 0)); } - + this.updateMonitors(); this.networkPackNT(15); } } - + public boolean isAvailable() { return this.isLoaded && !this.isInvalid() && this.compair.getFill() > 0; } @@ -104,30 +104,30 @@ public abstract class TileEntityPneumaticStorageBase extends TileEntityMachineBa super.invalidate(); if(!worldObj.isRemote) { - + for(SlotMonitor monitor : this.monitors) { for(CacheSlot cache : monitor.viewedBy) cache.removeMonitor(monitor); } - + if(this.node != null) { - + if(node.hasValidNet()) { this.node.net.storages.remove(this); } - + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER); } } } - + @Override public void onChunkUnload() { super.onChunkUnload(); - + for(SlotMonitor monitor : this.monitors) { for(CacheSlot cache : monitor.viewedBy) cache.removeMonitor(monitor); } - + if(node != null && node.hasValidNet()) { this.node.net.storages.remove(this); } diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index 631ea9879..a2bf9a28f 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -14,13 +14,15 @@ import api.hbm.redstoneoverradio.IRORInteractive; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver, IControlReceiverFilter { - + /** If requests should be pulled repeatedly every tick */ public boolean continuousRequest = false; /** If ROR configuration has taken place, ignore manually defined filters entirely */ @@ -39,9 +41,9 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB public static final int MODE_FULL_STACK = 1; /** All request slots try to pull the desired quantities simultaneously */ public static final int MODE_FULL_REQUEST = 2; - + public boolean lastRedstone = false; - + public int[] SLOT_ACCESS = new int[] {9, 10, 11, 12, 13, 14, 15, 16, 17}; public TileEntityPneumoStorageExporter() { @@ -59,45 +61,45 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB @Override public void updateEntity() { super.updateEntity(); - + if(!worldObj.isRemote) { - + for(int i = 0; i < 9; i++) { if(slotDelay[i] > 0) slotDelay[i]--; } boolean redstone = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); - + if(continuousRequest) { this.doRequest(false); } else { if(redstone && !lastRedstone) this.doRequest(true); } - + this.lastRedstone = redstone; - + this.networkPackNT(15); } } - + public void doRequest(boolean force) { - + if(this.requestMode != MODE_FULL_REQUEST) { // handle all filters individually for(int i = 0; i < 9; i++) if(!requestSlot(i, force)) this.slotDelay[i] = SLOT_DELAY; } else { - + // check filter delay if forced pulls aren't active if(!force) for(int i = 0; i < 9; i++) { short[] filter = this.getFilter(i); if(filter != null && slotDelay[i] > 0) return; } - + // check if filter demands are met and space is free for(int i = 0; i < 9; i++) { short[] filter = this.getFilter(i); if(filter == null) continue; - + int itemId = filter[0]; Item item = Item.getItemById(itemId); int meta = filter[1]; @@ -105,7 +107,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB int existingSize = 0; ItemStack existingStack = slots[i + 9]; - + if(existingStack != null) { if(existingStack.getItem() == item && existingStack.getItemDamage() == meta && !existingStack.hasTagCompound()) { existingSize = existingStack.stackSize; @@ -114,21 +116,21 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB return; } } - + ItemStack newStack = new ItemStack(item, 1, meta); int capacityLeft = newStack.getMaxStackSize() - existingSize; - + if(capacityLeft < requestSize || getAvailability(itemId, meta) < requestSize) { this.slotDelay[i] = SLOT_DELAY; return; } } - + // everything is good, pull items. continues should not happen, but are in place nonetheless for(int i = 0; i < 9; i++) { short[] filter = this.getFilter(i); if(filter == null) continue; - + int itemId = filter[0]; Item item = Item.getItemById(itemId); int meta = filter[1]; @@ -137,40 +139,40 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB int existingSize = 0; ItemStack existingStack = slots[i + 9]; if(existingStack != null) existingSize = existingStack.stackSize; - + ItemStack newStack = new ItemStack(item, 1, meta); - + long hash = StackCache.getStackIdentity(itemId, meta, null); if(hash == this.cache.getNullIdentity()) continue; // safeguard - + CacheSlot cacheSlot = this.cache.cacheSlots.get(hash); if(cacheSlot == null) continue; // safeguard - + slots[i + 9] = newStack; slots[i + 9].stackSize = existingSize + (int) this.cache.consumeItemsAndReturnQuantity(newStack, requestSize); } - + this.markChanged(); } } - + /** Returns false if the slot delay should be reset (unsuccessful) or true of not (successful or delay still active) */ public boolean requestSlot(int slot, boolean force) { - + if(!force && slotDelay[slot] > 0) return true; if(this.cache == null || this.cache.hasExpired) return false; - + short[] filter = this.getFilter(slot); if(filter == null) return false; - + int itemId = filter[0]; Item item = Item.getItemById(itemId); int meta = filter[1]; int requestSize = filter[2]; - + int existingSize = 0; ItemStack existingStack = slots[slot + 9]; - + if(existingStack != null) { if(existingStack.getItem() == item && existingStack.getItemDamage() == meta && !existingStack.hasTagCompound()) { existingSize = existingStack.stackSize; @@ -178,31 +180,31 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB return false; } } - + ItemStack newStack = new ItemStack(item, 1, meta); int capacityLeft = newStack.getMaxStackSize() - existingSize; - + // any non-AMAP mode will fail if it can't insert that much before we even check availability from the pneumo sys if(capacityLeft < requestSize && this.requestMode != MODE_AS_MUCH_AS_POSSIBLE) return false; long hash = StackCache.getStackIdentity(itemId, meta, null); if(hash == this.cache.getNullIdentity()) return false; - + CacheSlot cacheSlot = this.cache.cacheSlots.get(hash); if(cacheSlot == null) return false; - + // any non-AMAP mode will fail if the system doesn't have the requested amount if(cacheSlot.stacksize < requestSize && this.requestMode != MODE_AS_MUCH_AS_POSSIBLE) return false; if(cacheSlot.stacksize <= 0) return false; - + int toPull = (int) BobMathUtil.min(requestSize, cacheSlot.stacksize, capacityLeft); - + slots[slot + 9] = newStack; slots[slot + 9].stackSize = existingSize + (int) this.cache.consumeItemsAndReturnQuantity(newStack, toPull); this.markChanged(); - + return true; } - + /** Returns item id, meta and request size for the given filter. Returns null if no filter is specified */ public short[] getFilter(int slot) { if(rorConfiguredMode) { @@ -216,7 +218,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB return null; } } - + public long getAvailability(int item, int meta) { if(this.cache == null || this.cache.hasExpired) return 0; long hash = this.cache.getStackIdentity(item, meta, null); @@ -255,7 +257,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.continuousRequest = nbt.getBoolean("continuousRequest"); this.rorConfiguredMode = nbt.getBoolean("rorConfiguredMode"); this.requestMode = nbt.getByte("requestMode"); @@ -264,7 +266,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB rorFilters[i][1] = nbt.getShort("filter_" + i + "_1"); rorFilters[i][2] = nbt.getShort("filter_" + i + "_2"); } - + this.lastRedstone = nbt.getBoolean("lastRedstone"); this.slotDelay = nbt.getIntArray("slotDelay"); } @@ -276,7 +278,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB nbt.setBoolean("continuousRequest", continuousRequest); nbt.setBoolean("rorConfiguredMode", rorConfiguredMode); nbt.setByte("requestMode", (byte) requestMode); - + for(int i = 0; i < 9; i++) { nbt.setShort("filter_" + i + "_0", (short) rorFilters[i][0]); nbt.setShort("filter_" + i + "_1", (short) rorFilters[i][1]); @@ -318,6 +320,18 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB @Override public void nextMode(int i) { } + @Override + public void setFilterContents(NBTTagCompound nbt) { + TileEntity tile = (TileEntity) this; + IInventory inv = (IInventory) this; + int slot = nbt.getInteger("slot"); + NBTTagCompound stack = nbt.getCompoundTag("stack"); + ItemStack item = ItemStack.loadItemStackFromNBT(stack); + inv.setInventorySlotContents(slot, item); + nextMode(slot); + tile.getWorldObj().markTileEntityChunkModified(tile.xCoord, tile.yCoord, tile.zCoord, tile); + } + @Override public String[] getFunctionInfo() { return new String[] { @@ -331,7 +345,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB @Override public String runRORFunction(String name, String[] params) { - + if((PREFIX_FUNCTION + "setfilter").equals(name) && params.length == 4) { int slot = IRORInteractive.parseInt(params[0], 1, 9) - 1; int itemId = IRORInteractive.parseInt(params[1], 0, Short.MAX_VALUE); @@ -344,25 +358,25 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB this.markChanged(); return null; } - + if((PREFIX_FUNCTION + "setcontinuous").equals(name) && params.length == 1) { if("on".equals(params[0])) this.continuousRequest = true; if("off".equals(params[0])) this.continuousRequest = false; this.markChanged(); return null; } - + if((PREFIX_FUNCTION + "request").equals(name)) { this.doRequest(true); return null; } - + if((PREFIX_FUNCTION + "requestslot").equals(name) && params.length == 1) { int slot = IRORInteractive.parseInt(params[0], 1, 9) - 1; if(!this.requestSlot(slot, true)) this.slotDelay[slot] = SLOT_DELAY; return null; } - + if((PREFIX_FUNCTION + "checkavailability").equals(name) && params.length == 3) { int itemId = IRORInteractive.parseInt(params[0], 0, Short.MAX_VALUE); int meta = IRORInteractive.parseInt(params[1], 0, Short.MAX_VALUE); @@ -371,7 +385,7 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB RTTYSystem.broadcast(worldObj, ret, availability + ""); return null; } - + return null; } } diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java index dcf4d5552..f24ac0129 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java @@ -12,18 +12,20 @@ import api.hbm.ntl.ISlotMonitorProvider; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TileEntityPneumoStorageMono extends TileEntityPneumaticStorageBase implements IPneumaticConnector, IFluidStandardReceiverMK2, ISlotMonitorProvider, IControlReceiver, IGUIProvider, IControlReceiverFilter { public static final int CAPACITY = 100_000; public int[] amounts; - + public TileEntityPneumoStorageMono() { super(3); - + this.amounts = new int[this.monitors.length]; } @@ -65,10 +67,30 @@ public class TileEntityPneumoStorageMono extends TileEntityPneumaticStorageBase public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPneumoStorageMono(player.inventory, this); } - + @Override public long getAmountAt(int index) { return amounts[index]; } @Override public boolean allowTypeSetting() { return false; } + @Override + public void receiveControl(NBTTagCompound data) { + super.receiveControl(data); + if(data.hasKey("slot")){ + setFilterContents(data); + } + } + + @Override + public void setFilterContents(NBTTagCompound nbt) { + TileEntity tile = (TileEntity) this; + IInventory inv = (IInventory) this; + int slot = nbt.getInteger("slot"); + NBTTagCompound stack = nbt.getCompoundTag("stack"); + ItemStack item = ItemStack.loadItemStackFromNBT(stack); + inv.setInventorySlotContents(slot, item); + nextMode(slot); + tile.getWorldObj().markTileEntityChunkModified(tile.xCoord, tile.yCoord, tile.zCoord, tile); + } + @Override public long useUpItem(int index, long amount) { if(amounts[index] <= 0) return amount; From e8cfb8aad9fa79feeaf2eca045fcb111345c8809 Mon Sep 17 00:00:00 2001 From: Raaaaaaaaaay Date: Fri, 10 Jul 2026 02:59:40 +0300 Subject: [PATCH 072/107] Oh --- src/main/resources/assets/hbm/lang/ru_RU.lang | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 9ba0b1fc2..19b317efb 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1652,7 +1652,7 @@ item.ammo_shell_w9.name=240мм Ядерный снаряд W9 item.ammo_secret.bmg50_equestrian.name=Патрон .50 BMG (Разрушитель) item.ammo_secret.folly_nuke.name=Серебряная пуля (Ядерная) item.ammo_secret.folly_sm.name=Серебряная пуля -item.ammo_secret.g12_equestrian.name=Картечь 12-го калибра (Железнодорожный гвоздь) +item.ammo_secret.g12_equestrian.name=Патрон 12 калибра (Картечь железнодорожный гвоздь) item.ammo_secret.m44_equestrian.name=Патрон .44 магнум (Разрыватель голов) item.ammo_secret.p35_800.name=Патрон .35-800 V9 item.ammo_secret.p35_800_bl.name=Патрон .35-800 V9 (Чёрная Молния) @@ -1687,11 +1687,11 @@ item.ammo_standard.g10_explosive.name=Патрон 10 калибра (Разры item.ammo_standard.g12.name=Патрон 12 калибра (Картечь) item.ammo_standard.g12_anthrax.name=Патрон 12 калибра (Сибирская язва) item.ammo_standard.g12_bp.name=Патрон 12 калибра (Картечь на дымном порохе) -item.ammo_standard.g12_bp_magnum.name=Патрон 12 калибра (Магнум-картечь на дымном порохе) +item.ammo_standard.g12_bp_magnum.name=Патрон 12 калибра (Картечь-магнум на дымном порохе) item.ammo_standard.g12_bp_slug.name=Патрон 12 калибра (Пуля на дымном порохе) item.ammo_standard.g12_explosive.name=Патрон 12 калибра (Разрывной) -item.ammo_standard.g12_flechette.name=Патрон 12 калибра (С флешеттами) -item.ammo_standard.g12_magnum.name=Патрон 12 калибра (Магнум-картечь) +item.ammo_standard.g12_flechette.name=Патрон 12 калибра (Флешетты) +item.ammo_standard.g12_magnum.name=Патрон 12 калибра (Картечь-магнум) item.ammo_standard.g12_phosphorus.name=Патрон 12 калибра (Зажигательный) item.ammo_standard.g12_slug.name=Патрон 12 калибра (Пуля) item.ammo_standard.g26_flare.name=26мм сигнальная ракета @@ -1703,13 +1703,13 @@ item.ammo_standard.g40_heat.name=40-мм граната (Кумулятивна item.ammo_standard.g40_inc.name=40-мм граната (Зажигательная) item.ammo_standard.g40_phosphorus.name=40-мм граната (Белый фосфор) item.ammo_standard.m357_ap.name=Патрон .357 Магнум (Бронебойный) -item.ammo_standard.m357_bp.name=Патрон .357 Магнум (На дымном порохе) +item.ammo_standard.m357_bp.name=Патрон .357 Магнум (Дымный порох) item.ammo_standard.m357_express.name=Патрон .357 Магнум (Высокоскоростной оболочечный) item.ammo_standard.m357_fmj.name=Патрон .357 Магнум (Оболочечный) item.ammo_standard.m357_jhp.name=Патрон .357 Магнум (Полуоболочечный экспансивный) item.ammo_standard.m357_sp.name=Патрон .357 Магнум (Экспансивный) item.ammo_standard.m44_ap.name=Патрон .44 Магнум (Бронебойный) -item.ammo_standard.m44_bp.name=Патрон .44 Магнум (На дымном порохе) +item.ammo_standard.m44_bp.name=Патрон .44 Магнум (Дымный порох) item.ammo_standard.m44_express.name=Патрон .44 Магнум (Высокоскоростной оболочечный) item.ammo_standard.m44_fmj.name=Патрон .44 Магнум (Оболочечный) item.ammo_standard.m44_jhp.name=Патрон .44 Магнум (Полуоболочечный экспансивный) @@ -1717,7 +1717,7 @@ item.ammo_standard.m44_sp.name=Патрон .44 Магнум (Экспансив item.ammo_standard.nuke_balefire.name=Ядерный минизаряд (Жар-яйцо) item.ammo_standard.nuke_demo.name=Ядерный минизаряд (Штурмовой) item.ammo_standard.nuke_high.name=Ядерный минизаряд (Повышенной мощности) -item.ammo_standard.nuke_hive.name=Ядерный минизаряд (Ракетный рой) +item.ammo_standard.nuke_hive.name=Ракетный минизаряд (Ракетный рой) item.ammo_standard.nuke_standard.name=Ядерный минизаряд (Стандартный) item.ammo_standard.nuke_tots.name=Ядерный минизаряд (Карапузы) item.ammo_standard.p22_ap.name=Патрон .22 LR (Бронебойный) From 9d7b7ca3bc999b7909fdb349738d305dff58bd7d Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 10 Jul 2026 08:08:23 +0200 Subject: [PATCH 073/107] don't tell 7 but this copy paste job is sloppy af --- .../TileEntityPneumoStorageExporter.java | 10 ++-------- .../pneumatic/TileEntityPneumoStorageMono.java | 15 +-------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java index a2bf9a28f..d67affd4a 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageExporter.java @@ -1,6 +1,5 @@ package com.hbm.tileentity.network.pneumatic; - import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPneumoStorageExporter; import com.hbm.inventory.gui.GUIPneumoStorageExporter; @@ -14,11 +13,9 @@ import api.hbm.redstoneoverradio.IRORInteractive; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineBase implements IRORInteractive, IControlReceiver, IControlReceiverFilter { @@ -322,14 +319,11 @@ public class TileEntityPneumoStorageExporter extends TileEntityPneumaticMachineB @Override public void setFilterContents(NBTTagCompound nbt) { - TileEntity tile = (TileEntity) this; - IInventory inv = (IInventory) this; int slot = nbt.getInteger("slot"); NBTTagCompound stack = nbt.getCompoundTag("stack"); ItemStack item = ItemStack.loadItemStackFromNBT(stack); - inv.setInventorySlotContents(slot, item); - nextMode(slot); - tile.getWorldObj().markTileEntityChunkModified(tile.xCoord, tile.yCoord, tile.zCoord, tile); + this.setInventorySlotContents(slot, item); + this.markChanged(); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java index f24ac0129..c2ad4fd63 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageMono.java @@ -12,10 +12,8 @@ import api.hbm.ntl.ISlotMonitorProvider; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TileEntityPneumoStorageMono extends TileEntityPneumaticStorageBase implements IPneumaticConnector, IFluidStandardReceiverMK2, ISlotMonitorProvider, IControlReceiver, IGUIProvider, IControlReceiverFilter { @@ -74,23 +72,12 @@ public class TileEntityPneumoStorageMono extends TileEntityPneumaticStorageBase @Override public void receiveControl(NBTTagCompound data) { super.receiveControl(data); + if(data.hasKey("slot")){ setFilterContents(data); } } - @Override - public void setFilterContents(NBTTagCompound nbt) { - TileEntity tile = (TileEntity) this; - IInventory inv = (IInventory) this; - int slot = nbt.getInteger("slot"); - NBTTagCompound stack = nbt.getCompoundTag("stack"); - ItemStack item = ItemStack.loadItemStackFromNBT(stack); - inv.setInventorySlotContents(slot, item); - nextMode(slot); - tile.getWorldObj().markTileEntityChunkModified(tile.xCoord, tile.yCoord, tile.zCoord, tile); - } - @Override public long useUpItem(int index, long amount) { if(amounts[index] <= 0) return amount; From beba72f241e4261610c1f39ab9b659501d4126c8 Mon Sep 17 00:00:00 2001 From: R-Kaenbyou <152870189+R-Kaenbyou@users.noreply.github.com> Date: Fri, 10 Jul 2026 21:21:56 +0800 Subject: [PATCH 074/107] Update zh_CN.lang old problems --- src/main/resources/assets/hbm/lang/zh_CN.lang | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 19e2f0a7b..06e1e6fe4 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -2318,7 +2318,7 @@ item.debris_fuel.name=RBMK石墨式反应堆燃料块 item.debris_graphite.name=热石墨块 item.debris_metal.name=断裂金属棒 item.debris_shrapnel.name=走道碎片 -item.definitelyfood.name=完全不脏牌军粮 +item.definitelyfood.name=军粮 item.defuser.name=高科技拆弹装置 item.defuser_gold.name=黄金剪线钳 item.demon_core_closed.name=封闭的恶魔核心 @@ -6377,4 +6377,5 @@ tile.machine_thresher.desc=收割并重新种植作物,$可接受:$-木油$- tile.machine_thresher.suspended=暂停 tile.nospawn=生物不会在这个方块上生成! tile.radio_autocal.name=AUTOCAL自动计算机 -tile.vending_machine.name= 自动售货机 +tile.vending_machine.name=自动售货机 +item.coin_token.name=自动售货机代币 From 114007aad013ffe24aed268ad3f3e166bbb20097 Mon Sep 17 00:00:00 2001 From: R-Kaenbyou <152870189+R-Kaenbyou@users.noreply.github.com> Date: Fri, 10 Jul 2026 21:29:37 +0800 Subject: [PATCH 075/107] Update zh_CN.lang finish --- src/main/resources/assets/hbm/lang/zh_CN.lang | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 06e1e6fe4..fbc8815cd 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -5513,7 +5513,7 @@ tile.turret_fritz.name=重型火焰喷射器炮塔“弗里茨” tile.turret_heavy.name=重型机枪炮塔 tile.turret_himars.name=火箭炮塔“亨利” tile.turret_howard.name=双联守门员近防系统“霍华德” -tile.turret_howard_damaged.name=CIWS双联守门员近防系统 “玛士撒拉” +tile.turret_howard_damaged.name=CIWS双联守门员近防系统 “玛土撒拉” tile.turret_jeremy.name=重炮炮塔“杰里米” tile.turret_light.name=轻型机枪炮塔 tile.turret_maxwell.name=高能微波炮塔 “麦克斯韦” @@ -6379,3 +6379,14 @@ tile.nospawn=生物不会在这个方块上生成! tile.radio_autocal.name=AUTOCAL自动计算机 tile.vending_machine.name=自动售货机 item.coin_token.name=自动售货机代币 +container.pneumoStorageAccess=PSN访问终端 +container.pneumoStorageClutter=PSN杂项存储 +container.pneumoStorageExporter=PSN导出器 +container.pneumoStorageImporter=PSN导入器 +container.pneumoStorageMono=PSN大宗存储 +tile.pneumatic_storage_access.name=气动存储网络 - 访问终端 +tile.pneumatic_storage_clutter.name=气动存储网络 - 杂项储存 +tile.pneumatic_storage_exporter.name=气动存储网络 - 导出器 +tile.pneumatic_storage_importer.name=气动存储网络 - 导入器 +tile.pneumatic_storage_mono.name=气动存储网络 - 大宗储存 +tile.cargo_door.name=货运大门 From 35103853e3bc3f770216b4d63f6e26dfd9b356cd Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sat, 11 Jul 2026 19:19:58 +0200 Subject: [PATCH 076/107] deltarune gas leak theory --- changelog | 105 +---- src/main/java/com/hbm/blocks/ModBlocks.java | 22 +- .../com/hbm/blocks/generic/BlockDecoCT.java | 2 +- .../hbm/blocks/generic/BlockNTMGlassCT.java | 2 +- ...nericPWR.java => BlockGenericTooltip.java} | 4 +- .../hbm/blocks/machine/BlockHadronCoil.java | 2 +- .../java/com/hbm/blocks/machine/BlockICF.java | 2 +- .../java/com/hbm/blocks/machine/BlockPWR.java | 2 +- .../hbm/blocks/machine/pile/BlockPile.java | 58 +++ .../com/hbm/blocks/network/WireCoated.java | 2 +- .../container/ContainerMachinePress.java | 4 +- .../hbm/inventory/gui/GUIMachinePress.java | 8 +- .../com/hbm/render/block/ct/CTContext.java | 14 +- .../com/hbm/render/block/ct/IBlockCT.java | 2 +- .../hbm/models/reactors/pile_control.obj | 318 +++++++++++++++ .../hbm/models/reactors/pile_loader.obj | 324 +++++++++++++++ .../assets/hbm/models/reactors/pile_vent.obj | 378 ++++++++++++++++++ .../assets/hbm/textures/blocks/pile_block.png | Bin 0 -> 634 bytes .../hbm/textures/blocks/pile_block_ct.png | Bin 0 -> 1438 bytes .../hbm/textures/blocks/pile_block_top.png | Bin 0 -> 634 bytes .../hbm/textures/blocks/pile_block_top_ct.png | Bin 0 -> 1532 bytes .../assets/hbm/textures/blocks/pile_brick.png | Bin 0 -> 276 bytes .../assets/hbm/textures/blocks/pile_wood.png | Bin 0 -> 525 bytes .../hbm/textures/blocks/pile_wood_planks.png | Bin 0 -> 647 bytes .../textures/blocks/pile_wood_planks_lr.png | Bin 0 -> 704 bytes .../playground/nullstone_demo_1_wip.png | Bin 0 -> 292 bytes .../assets/hbm/textures/gui/gui_press.png | Bin 4460 -> 3504 bytes .../hbm/textures/models/pile/pile_control.png | Bin 0 -> 408 bytes .../hbm/textures/models/pile/pile_loader.png | Bin 0 -> 465 bytes .../hbm/textures/models/pile/pile_vent.png | Bin 0 -> 469 bytes 30 files changed, 1118 insertions(+), 131 deletions(-) rename src/main/java/com/hbm/blocks/machine/{BlockGenericPWR.java => BlockGenericTooltip.java} (77%) create mode 100644 src/main/java/com/hbm/blocks/machine/pile/BlockPile.java create mode 100644 src/main/resources/assets/hbm/models/reactors/pile_control.obj create mode 100644 src/main/resources/assets/hbm/models/reactors/pile_loader.obj create mode 100644 src/main/resources/assets/hbm/models/reactors/pile_vent.obj create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_block.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_block_ct.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_block_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_block_top_ct.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_brick.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_wood.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_wood_planks.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_wood_planks_lr.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/playground/nullstone_demo_1_wip.png create mode 100644 src/main/resources/assets/hbm/textures/models/pile/pile_control.png create mode 100644 src/main/resources/assets/hbm/textures/models/pile/pile_loader.png create mode 100644 src/main/resources/assets/hbm/textures/models/pile/pile_vent.png diff --git a/changelog b/changelog index 49a10e560..a9bebc540 100644 --- a/changelog +++ b/changelog @@ -1,105 +1,2 @@ -## Added -* Pneumatic Storage System - * Mass storage logistics system that can perform various automation tasks - * Items can be stored in clutter storages (steel crate equivalent) or mono type storages (ironically supports three types set using filters holding several thousand items) - * In order to be accessible, all storages need a supply of compressed air with the compression level dictating range - * Access points allow items to be retrieved and inserted manually - * Access points have a search function as well as several sorting options - * Importers allow hopper IO to add items to the network - * Exporters allow items to be retrieved and then taken using hopper IO, things like filters and request rules can be defined in several ways - * Allows continuous request and request on demand (redstone or RoR command) - * Filters can be set using items or RoR commands - * Requests can be configured to take as much as possible, to only take full stacks, or to only take full requests - * In combination with assembler recipe switching, using RoR logic, this means that on-demand recipe automation is now possible - * Still in testing, there's no recipes for any of the parts yet -* Cargo door - * Steel grate door which goes well with the cargo elevators - -## Changed -* Updated chinese localization -* Watz powerplant now has OC and RoR integration -* The automatic thresher now has a fluid port on the bottom as well -* The foundry basins and outlet filters now use the properly translated name instead of the internal name for the material -* Removed config for new bedrock ores - * New ores are the default anyway and old bedrock ores are now properly deprecated - * Existing setups will continue to work for now - * Old bedrock ore items still exist but are no longer listed in the creative tab -* Removed recipe for the small single block steam turbine - * We have steam engines and industrial turbines are really not that expensive - * "oh no, i have to build an actually good looking setup now if i want to build a zirnox!" yeah you do -* Updated light brick texture -* The maximum character limit on RoR channels is now the same for all RoR devices, being 15 - * This does not include special RoR interactive devices that don't use GUI text fields like the RoR terminal or the AUTOCAL units -* Pile output rods like the bred uranium and the plutonium rods can no longer be dismantled using the anvil, the PUREX is now mandatory -* If too many conveyor item entities intersect with one another, they explode - * The conveyor belt the items were on is broken, preventing further item buildup -* Items that leave the covneyor belt, usually by trying to enter a full inserter, now have a shortened lifespan of 1 minute instead of 5 -* Base steam production per consumed heat has been increased by 50% on the ZIRNOX -* Both radioisotope cell variants have been finally removed after being deprecated for a while -* Selfchargers now have a tooltip explaining the hazards of using them in a battery socket -* The alternate recipe for the assembler in the assembler now uses integrated circuits instead of analog ones -* Added an alternate chemical plant recipe that uses a smaller selection of items and ICs instead of ACs -* Flashgold and flashlead are now made in the PUREX instead of the crafting table - * The flashgold recipe now yields two billets instead of one -* Slightly changed the HSS ingot and plate textures to not look identical to steel except slightly greenish -* The AUTOCAL's buffer is now limited to 256 characters instead of being infinite -* Increased the blast furnace's fuel buffer by 50%, allowing coke blocks to be used -* If an RoR controller tries to parse an integer, but the supplied string represents a decimal, instead of canceling the operation, the system will now interpret decimals and round them to be integers - * This means that the AUTOCAL can now send RoR commands using calculated values directly without the use of `round` or `evalr` -* Assembly machines and chemical plants now support Redstone-over-Radio - * Active state (0 or 1), progress (0-100) and current recipe (internal name) can now be read - * The recipe can be set using a controller - * Do note that setting a recipe that needs a blueprint without that blueprint will not work - * RoR set recipes cause the assembler to go into low power mode, making it run at only 25% speed (visible through the blue progress bar) - * The speed penalty is removed as soon as a recipe is assigned manually again -* Assembly factories, chemical factories, PUREX and plasma forges can now be read (but not configured) using Redstone-over-Radio -* Fusion reactor vessels can now be read and configured using RoR - * Unlike assemblers and chemplants, remote recipe configuration does not cause a speed penalty -* The AUTOCAL's script interpreter now runs MS-ES v1.1 (First Extended Instruction Set) - * Allows the use of a global stack, similar to the buffer which can hold 256 values - * Allows splitting of strings and counting of string fragments - * Adds substring operations - * Polling for receiving only fresh RoR signals - * A command for writing the world time to the buffer, allowing for more precise timers -* All RoR values/commands are now case-insensitive -* Changed mask man spawning rules - * Instead of random checks and chances, if a player meets the requirements, a timer starts (timer exists per player) - * Once this timer runs out, mask man spawns - * Should the timer run out but the spawn be unsuccessful (spawn restrictions) then a different message appears - * If the requirements are no longer met, the timer immediately resets, making it easier to avoid him deliberately - * The default spawn timer is now 20 minutes, making it easier to spawn him deliberately - * One minute before the timer ends, a warning message appears -* Changed normal mode control unit recipes - * Standard control units now use rubber instead of speed I upgrades - * Advanced control units now use hardplastics instead of speed III upgrades - * Quantum computers now use speed III upgrades instead of overdrive I -* Updated electric furnace, burner press and electric press GUIs -* The RoR terminal can now accept RoR controller input, allowing the terminal screen to be written directly and RoR terminal commands to be executed via incoming RoR signals - * The last part seems redundant, why would you need to send RoR by sending RoR? The answer being, the terminal can be toggled to send polling signals, which will run independently of the source - * For AUTOCALs, this means that they can now send polling signals "in parallel", i.e. independently of the code that actually runs on said AUTOCAL, by simply toggling polling on a terminal - * Since AUTOCALs now have a proper screen to output things with, it is now theoretically possible to program a functioning arcade machine (with terminal graphics) -* Glyphids will now try to target new players every 5 seconds if their current target is farther away than any other potential target - * 1/3 of glyphids do not have this behavior, this means that larger groups of glyphids cannot be trapped indefinitely by triggering target changes on purpose -* Pedestal blocks fitted with charms now have a 200x200 block square area around them where the charm effect of repelling meteors applies to all players -* Pedestal blocks fitted with golden defusers now have a 50x50 block area around them where creepers are automatically defused -* Disabled GTNH-NEI filter drag functionality because GTNH-NEI breaks the pattern slots of the new pneumatics stuff and the person who added it originally was too bald to fix it despite being told multiple times - * 70k it's 70k and he's bald bald haha bald head - * baldie baldie hahaha he bald he has the no of hair - * follically challenged baldie bald head -* Increased flue gas burn value from 10kTU to 25kTU - ## Fixed -* Fixed AUTOCAL's number comparison functions not working with variable substitution as advertised -* Fixed broken thorium ore centrifuging recipe shown in NEI -* Fixed industrial turbine not properly saving its energy values, causing the flywheel to stop on relog -* Fixed lapis dust to cobalt shredder recipe not using oredict -* Fixed AUTOCAL's file opening buttons not working on some systems, it will fall back to opening the folder instead -* Fixed some recipes not using ore dict when they should -* Fixed `anyBismoid` group not being a proper group, causing other mods' bismuth and arsenic to not be included -* Fixed RoR gauge not using SI suffixes on values below 0 -* Fixed AUTOCAL units not closing their GUI when the unit is destroyed -* Fixed AUTOCAL's $buffer$ substitution not working -* Fixed meteorite sword localization still being broken -* Fixed missing localization on the FM radio -* Fixed mufflers not working on large doors -* Fixed the electric press not displaying the currently pressed item in the model +* Fixed burner press GUI offsets being incorrect \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 91c3537de..fad72e397 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -851,6 +851,9 @@ public class ModBlocks { public static Block custom_machine; public static Block cm_anchor; + public static Block pile_brick; + public static Block pile_block; + public static Block pwr_fuel; public static Block pwr_control; public static Block pwr_channel; @@ -1958,16 +1961,19 @@ public class ModBlocks { cm_heat = new BlockCMHeat(Material.iron, RefStrings.MODID +":cm_heat_top").setBlockName("cm_heat").setCreativeTab(MainRegistry.machineTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cm_heat_side"); custom_machine = new BlockCustomMachine().setBlockName("custom_machine").setCreativeTab(MainRegistry.machineTab).setLightLevel(1F).setHardness(5.0F).setResistance(10.0F); cm_anchor = new BlockCMAnchor().setBlockName("custom_machine_anchor").setCreativeTab(MainRegistry.machineTab).setHardness(5.0F).setResistance(10.0F); + + pile_brick = new BlockGenericTooltip(Material.iron).setBlockName("pile_brick").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_brick"); + pile_block = new BlockPile().setBlockName("pile_block").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_block"); pwr_fuel = new BlockPillarPWR(Material.iron, RefStrings.MODID + ":pwr_fuel_top").setBlockName("pwr_fuel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_fuel_side"); pwr_control = new BlockPillarPWR(Material.iron, RefStrings.MODID + ":pwr_control_top").setBlockName("pwr_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_control_side"); pwr_channel = new BlockPillarPWR(Material.iron, RefStrings.MODID + ":pwr_channel_top").setBlockName("pwr_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_channel_side"); - pwr_heatex = new BlockGenericPWR(Material.iron).setBlockName("pwr_heatex").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_heatex"); - pwr_heatsink = new BlockGenericPWR(Material.iron).setBlockName("pwr_heatsink").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_heatsink"); - pwr_neutron_source = new BlockGenericPWR(Material.iron).setBlockName("pwr_neutron_source").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_neutron_source"); - pwr_reflector = new BlockGenericPWR(Material.iron).setBlockName("pwr_reflector").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_reflector"); - pwr_casing = new BlockGenericPWR(Material.iron).setBlockName("pwr_casing").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_casing"); - pwr_port = new BlockGenericPWR(Material.iron).setBlockName("pwr_port").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_port"); + pwr_heatex = new BlockGenericTooltip(Material.iron).setBlockName("pwr_heatex").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_heatex"); + pwr_heatsink = new BlockGenericTooltip(Material.iron).setBlockName("pwr_heatsink").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_heatsink"); + pwr_neutron_source = new BlockGenericTooltip(Material.iron).setBlockName("pwr_neutron_source").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_neutron_source"); + pwr_reflector = new BlockGenericTooltip(Material.iron).setBlockName("pwr_reflector").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_reflector"); + pwr_casing = new BlockGenericTooltip(Material.iron).setBlockName("pwr_casing").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_casing"); + pwr_port = new BlockGenericTooltip(Material.iron).setBlockName("pwr_port").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_port"); pwr_controller = new MachinePWRController(Material.iron).setBlockName("pwr_controller").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_casing_blank"); pwr_block = new BlockPWR(Material.iron).setBlockName("pwr_block").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pwr_block"); @@ -3317,6 +3323,10 @@ public class ModBlocks { register(cm_flux); register(cm_heat); register(cm_anchor); + + //Chicago Pile + register(pile_brick); + register(pile_block); //PWR register(pwr_fuel); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoCT.java b/src/main/java/com/hbm/blocks/generic/BlockDecoCT.java index f46a7b4fd..214e05e77 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoCT.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoCT.java @@ -34,7 +34,7 @@ public class BlockDecoCT extends BlockOre implements IBlockCT { } @Override - public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) { + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { return rec.fragCache; } diff --git a/src/main/java/com/hbm/blocks/generic/BlockNTMGlassCT.java b/src/main/java/com/hbm/blocks/generic/BlockNTMGlassCT.java index be9993790..a5bd0f3a4 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockNTMGlassCT.java +++ b/src/main/java/com/hbm/blocks/generic/BlockNTMGlassCT.java @@ -36,7 +36,7 @@ public class BlockNTMGlassCT extends BlockNTMGlass implements IBlockCT { } @Override - public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) { + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { return rec.fragCache; } } diff --git a/src/main/java/com/hbm/blocks/machine/BlockGenericPWR.java b/src/main/java/com/hbm/blocks/machine/BlockGenericTooltip.java similarity index 77% rename from src/main/java/com/hbm/blocks/machine/BlockGenericPWR.java rename to src/main/java/com/hbm/blocks/machine/BlockGenericTooltip.java index d94d06697..e66836750 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockGenericPWR.java +++ b/src/main/java/com/hbm/blocks/machine/BlockGenericTooltip.java @@ -9,9 +9,9 @@ import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -public class BlockGenericPWR extends BlockGeneric implements ITooltipProvider { +public class BlockGenericTooltip extends BlockGeneric implements ITooltipProvider { - public BlockGenericPWR(Material material) { + public BlockGenericTooltip(Material material) { super(material); } diff --git a/src/main/java/com/hbm/blocks/machine/BlockHadronCoil.java b/src/main/java/com/hbm/blocks/machine/BlockHadronCoil.java index 3e099e600..7a0d858b9 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockHadronCoil.java +++ b/src/main/java/com/hbm/blocks/machine/BlockHadronCoil.java @@ -43,7 +43,7 @@ public class BlockHadronCoil extends Block implements IBlockCT, ITooltipProvider } @Override - public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) { + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { return rec.fragCache; } diff --git a/src/main/java/com/hbm/blocks/machine/BlockICF.java b/src/main/java/com/hbm/blocks/machine/BlockICF.java index 442433aba..95d708b63 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockICF.java +++ b/src/main/java/com/hbm/blocks/machine/BlockICF.java @@ -55,7 +55,7 @@ public class BlockICF extends BlockContainer implements IBlockCT { } @Override - public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) { + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { int meta = world.getBlockMetadata(x, y, z); if(meta == 1) return recPort.fragCache; return rec.fragCache; diff --git a/src/main/java/com/hbm/blocks/machine/BlockPWR.java b/src/main/java/com/hbm/blocks/machine/BlockPWR.java index aff9d5cbf..07c368d27 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockPWR.java +++ b/src/main/java/com/hbm/blocks/machine/BlockPWR.java @@ -62,7 +62,7 @@ public class BlockPWR extends BlockContainer implements IBlockCT { } @Override - public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) { + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { int meta = world.getBlockMetadata(x, y, z); if(meta == 1) return recPort.fragCache; return rec.fragCache; diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java new file mode 100644 index 000000000..fb1d35a9f --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -0,0 +1,58 @@ +package com.hbm.blocks.machine.pile; + +import java.util.Random; + +import com.hbm.lib.RefStrings; +import com.hbm.render.block.ct.CT; +import com.hbm.render.block.ct.CTStitchReceiver; +import com.hbm.render.block.ct.IBlockCT; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockPile extends BlockContainer implements IBlockCT { + + @SideOnly(Side.CLIENT) protected IIcon iconTop; + + public BlockPile() { + super(Material.iron); + } + + @Override public int getRenderType() { return CT.renderID; } + + @Override + public Item getItemDropped(int i, Random rand, int j) { + return null; + } + + @SideOnly(Side.CLIENT) public CTStitchReceiver rec; + @SideOnly(Side.CLIENT) public CTStitchReceiver recTop; + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + this.iconTop = reg.registerIcon(RefStrings.MODID + ":pile_block_top"); + + this.rec = IBlockCT.primeReceiver(reg, this.blockIcon.getIconName(), this.blockIcon); + this.recTop = IBlockCT.primeReceiver(reg, this.iconTop.getIconName(), this.iconTop); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return null; + } + + @Override + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0 || side == 1) return recTop.fragCache; + return rec.fragCache; + } +} diff --git a/src/main/java/com/hbm/blocks/network/WireCoated.java b/src/main/java/com/hbm/blocks/network/WireCoated.java index c96c68ad5..ddc06bc6d 100644 --- a/src/main/java/com/hbm/blocks/network/WireCoated.java +++ b/src/main/java/com/hbm/blocks/network/WireCoated.java @@ -40,7 +40,7 @@ public class WireCoated extends BlockContainer implements IBlockCT { } @Override - public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) { + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { return rec.fragCache; } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachinePress.java b/src/main/java/com/hbm/inventory/container/ContainerMachinePress.java index 8fda99d52..86f096a4c 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachinePress.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachinePress.java @@ -33,12 +33,12 @@ public class ContainerMachinePress extends Container { 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, 120 + i * 18)); + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 132 + i * 18)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 178)); + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 190)); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePress.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePress.java index a9c306d77..17e64d6ed 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachinePress.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePress.java @@ -22,7 +22,7 @@ public class GUIMachinePress extends GuiInfoContainer { press = tedf; this.xSize = 176; - this.ySize = 202; + this.ySize = 214; } @Override @@ -37,7 +37,7 @@ public class GUIMachinePress extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer( int i, int j) { String name = this.press.hasCustomInventoryName() ? this.press.getInventoryName() : I18n.format(this.press.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, 5, 0xffffff); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } @@ -48,11 +48,11 @@ public class GUIMachinePress extends GuiInfoContainer { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); if(press.burnTime >= 20) { - this.drawTexturedModalRect(guiLeft + 27, guiTop + 36, 0, 202, 14, 14); + this.drawTexturedModalRect(guiLeft + 27, guiTop + 36, 0, 214, 14, 14); } int k = (int) (press.renderPress * 16 / press.maxPress); - this.drawTexturedModalRect(guiLeft + 79, guiTop + 35, 14, 202, 18, k); + this.drawTexturedModalRect(guiLeft + 79, guiTop + 35, 15, 214, 18, k); double i = (double) press.speed / (double) press.maxSpeed; GUIElements.drawSmoothGauge(guiLeft + 34, guiTop + 25, this.zLevel, i, 5, 2, 1, 0x7f0000); diff --git a/src/main/java/com/hbm/render/block/ct/CTContext.java b/src/main/java/com/hbm/render/block/ct/CTContext.java index d028d2933..74f3b4108 100644 --- a/src/main/java/com/hbm/render/block/ct/CTContext.java +++ b/src/main/java/com/hbm/render/block/ct/CTContext.java @@ -96,7 +96,7 @@ public class CTContext { int ibl = b | l | cornerType(cons[3], cons[5], cons[6]); int ibr = b | r | cornerType(cons[4], cons[7], cons[6]); - faces[i] = new CTFace(world, x, y, z, (IBlockCT)block, itl, itr, ibl, ibr); + faces[i] = new CTFace(world, x, y, z, i, (IBlockCT)block, itl, itr, ibl, ibr); } } @@ -152,6 +152,7 @@ public class CTContext { int x; int y; int z; + int side; IBlockCT ct; int index_tl; int index_tr; @@ -160,11 +161,12 @@ public class CTContext { public CTFace() { } - public CTFace(IBlockAccess world, int x, int y, int z, IBlockCT block, int i, int j, int k, int l) { + public CTFace(IBlockAccess world, int x, int y, int z, int side, IBlockCT block, int i, int j, int k, int l) { this.world = world; this.x = x; this.y = y; this.z = z; + this.side = side; this.ct = block; this.index_tl = i; this.index_tr = j; @@ -172,9 +174,9 @@ public class CTContext { this.index_br = l; } - public IIcon getTopLeft() { return ct.getFragments(world, x, y, z)[index_tl]; } - public IIcon getTopRight() { return ct.getFragments(world, x, y, z)[index_tr]; } - public IIcon getBottomLeft() { return ct.getFragments(world, x, y, z)[index_bl]; } - public IIcon getBottomRight() { return ct.getFragments(world, x, y, z)[index_br]; } + public IIcon getTopLeft() { return ct.getFragments(world, x, y, z, side)[index_tl]; } + public IIcon getTopRight() { return ct.getFragments(world, x, y, z, side)[index_tr]; } + public IIcon getBottomLeft() { return ct.getFragments(world, x, y, z, side)[index_bl]; } + public IIcon getBottomRight() { return ct.getFragments(world, x, y, z, side)[index_br]; } } } diff --git a/src/main/java/com/hbm/render/block/ct/IBlockCT.java b/src/main/java/com/hbm/render/block/ct/IBlockCT.java index c672784c0..0dfdb717f 100644 --- a/src/main/java/com/hbm/render/block/ct/IBlockCT.java +++ b/src/main/java/com/hbm/render/block/ct/IBlockCT.java @@ -7,7 +7,7 @@ import net.minecraft.world.IBlockAccess; public interface IBlockCT { - public IIcon[] getFragments(IBlockAccess world, int x, int y, int z); + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side); public default boolean canConnect(IBlockAccess world, int x, int y, int z, Block block) { return this == block; diff --git a/src/main/resources/assets/hbm/models/reactors/pile_control.obj b/src/main/resources/assets/hbm/models/reactors/pile_control.obj new file mode 100644 index 000000000..a7859bdb4 --- /dev/null +++ b/src/main/resources/assets/hbm/models/reactors/pile_control.obj @@ -0,0 +1,318 @@ +# Blender v2.79 (sub 0) OBJ File: 'pile_control.blend' +# www.blender.org +o Rod +v 0.187500 0.750000 -0.250000 +v 0.250000 0.750000 -0.187500 +v -0.250000 0.750000 -0.187500 +v -0.187500 0.750000 -0.250000 +v -0.187500 0.750000 0.250000 +v -0.250000 0.750000 0.187500 +v 0.250000 0.750000 0.187500 +v 0.187500 0.750000 0.250000 +v 0.250000 1.000000 -0.187500 +v 0.187500 1.000000 -0.250000 +v -0.187500 1.000000 -0.250000 +v -0.250000 1.000000 -0.187500 +v -0.250000 1.000000 0.187500 +v -0.187500 1.000000 0.250000 +v 0.187500 1.000000 0.250000 +v 0.250000 1.000000 0.187500 +v 0.187500 0.750000 -0.125000 +v 0.125000 0.750000 -0.187500 +v -0.125000 0.750000 -0.187500 +v -0.187500 0.750000 -0.125000 +v -0.187500 0.750000 0.125000 +v -0.125000 0.750000 0.187500 +v 0.125000 0.750000 0.187500 +v 0.187500 0.750000 0.125000 +v 0.125000 0.000000 -0.187500 +v 0.187500 0.000000 -0.125000 +v -0.187500 0.000000 -0.125000 +v -0.125000 0.000000 -0.187500 +v -0.125000 0.000000 0.187500 +v -0.187500 0.000000 0.125000 +v 0.187500 0.000000 0.125000 +v 0.125000 0.000000 0.187500 +vt 0.618182 0.600000 +vt 0.509091 0.700000 +vt 0.509091 0.600000 +vt 0.872727 0.600000 +vt 0.763636 0.700000 +vt 0.763636 0.600000 +vt 0.490909 0.600000 +vt 0.381818 0.700000 +vt 0.381818 0.600000 +vt 0.618182 0.700000 +vt 0.636364 0.725000 +vt 0.490909 0.875000 +vt 0.490909 0.575000 +vt 0.509091 0.400000 +vt 0.745455 1.000000 +vt 0.818182 0.700000 +vt 0.818182 1.000000 +vt 0.927273 1.000000 +vt 1.000000 0.700000 +vt 1.000000 1.000000 +vt 0.654545 1.000000 +vt 0.727273 0.700000 +vt 0.727273 1.000000 +vt 0.636364 0.700000 +vt 0.636364 0.600000 +vt 0.490909 0.700000 +vt 0.363636 0.600000 +vt 0.745455 0.600000 +vt 0.745455 0.700000 +vt 0.745455 0.700000 +vt 0.636364 0.700000 +vt 0.636364 1.000000 +vt 0.909091 0.700000 +vt 0.927273 0.700000 +vt 0.836364 1.000000 +vt 0.909091 1.000000 +vt 0.872727 0.700000 +vt 0.636364 0.875000 +vt 0.618182 0.900000 +vt 0.509091 0.900000 +vt 0.490909 0.725000 +vt 0.618182 0.400000 +vt 0.636364 0.425000 +vt 0.636364 0.575000 +vt 0.490909 0.425000 +vt 0.654545 0.700000 +vt 0.363636 0.700000 +vt 0.836364 0.700000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn -0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 0.0000 -1.0000 +s off +f 2/1/1 16/2/1 7/3/1 +f 6/4/2 12/5/2 3/6/2 +f 8/7/3 14/8/3 5/9/3 +f 9/10/4 10/11/4 14/12/4 +f 2/1/5 8/13/5 6/14/5 +f 24/15/1 26/16/1 17/17/1 +f 20/18/2 30/19/2 21/20/2 +f 22/21/3 32/22/3 23/23/3 +f 10/24/6 2/1/6 1/25/6 +f 8/7/7 16/2/7 15/26/7 +f 14/8/8 6/27/8 5/9/8 +f 4/28/9 12/5/9 11/29/9 +f 4/28/10 10/24/10 1/25/10 +f 24/15/7 32/22/7 31/30/7 +f 30/31/8 22/21/8 21/32/8 +f 20/18/9 28/33/9 27/34/9 +f 26/16/6 18/35/6 17/17/6 +f 18/35/10 28/33/10 19/36/10 +f 2/1/1 9/10/1 16/2/1 +f 6/4/2 13/37/2 12/5/2 +f 8/7/3 15/26/3 14/8/3 +f 10/11/4 11/38/4 12/39/4 +f 12/39/4 13/40/4 10/11/4 +f 13/40/4 14/12/4 10/11/4 +f 14/12/4 15/41/4 16/2/4 +f 16/2/4 9/10/4 14/12/4 +f 6/14/5 3/42/5 4/43/5 +f 4/43/5 1/44/5 2/1/5 +f 2/1/5 7/3/5 8/13/5 +f 8/13/5 5/45/5 6/14/5 +f 6/14/5 4/43/5 2/1/5 +f 24/15/1 31/30/1 26/16/1 +f 20/18/2 27/34/2 30/19/2 +f 22/21/3 29/46/3 32/22/3 +f 10/24/6 9/10/6 2/1/6 +f 8/7/7 7/3/7 16/2/7 +f 14/8/8 13/47/8 6/27/8 +f 4/28/9 3/6/9 12/5/9 +f 4/28/10 11/29/10 10/24/10 +f 24/15/7 23/23/7 32/22/7 +f 30/31/8 29/46/8 22/21/8 +f 20/18/9 19/36/9 28/33/9 +f 26/16/6 25/48/6 18/35/6 +f 18/35/10 25/48/10 28/33/10 +o Base +v -0.375000 0.000000 -0.375000 +v -0.375000 0.000000 0.375000 +v 0.375000 0.000000 -0.375000 +v 0.375000 0.000000 0.375000 +v -0.375000 0.250000 -0.375000 +v -0.375000 0.250000 0.375000 +v 0.375000 0.250000 -0.375000 +v 0.375000 0.250000 0.375000 +v 0.500000 0.375000 0.125000 +v 0.500000 0.375000 -0.125000 +v 0.500000 0.625000 -0.125000 +v 0.500000 0.625000 0.125000 +v 0.375000 0.625000 0.125000 +v 0.375000 0.625000 -0.125000 +v 0.375000 0.375000 0.125000 +v 0.375000 0.375000 -0.125000 +v -0.250000 0.250000 -0.187500 +v -0.187500 0.250000 -0.250000 +v -0.187500 0.250000 0.250000 +v -0.250000 0.250000 0.187500 +v 0.187500 0.250000 -0.250000 +v 0.250000 0.250000 -0.187500 +v 0.250000 0.250000 0.187500 +v 0.187500 0.250000 0.250000 +v 0.250000 0.750000 -0.187500 +v 0.187500 0.750000 -0.250000 +v -0.187500 0.750000 -0.250000 +v -0.250000 0.750000 -0.187500 +v -0.250000 0.750000 0.187500 +v -0.187500 0.750000 0.250000 +v 0.187500 0.750000 0.250000 +v 0.250000 0.750000 0.187500 +v 0.312500 0.687500 0.187500 +v 0.312500 0.687500 -0.187500 +v 0.312500 0.312500 0.187500 +v 0.312500 0.312500 -0.187500 +v 0.250000 0.687500 0.187500 +v 0.250000 0.687500 -0.187500 +v 0.250000 0.312500 0.187500 +v 0.250000 0.312500 -0.187500 +vt 0.290909 0.800000 +vt 0.072727 0.500000 +vt 0.290909 0.500000 +vt 0.072727 0.400000 +vt 0.290909 0.100000 +vt 0.290909 0.400000 +vt 0.290909 -0.000000 +vt 0.072727 0.100000 +vt 0.072727 -0.000000 +vt 0.000000 0.100000 +vt 0.000000 0.400000 +vt 0.363636 0.400000 +vt 0.363636 0.100000 +vt 0.618182 0.000000 +vt 0.509091 0.200000 +vt 0.509091 -0.000000 +vt 0.872727 0.000000 +vt 0.763636 0.200000 +vt 0.763636 0.000000 +vt 0.618182 0.200000 +vt 0.636364 0.225000 +vt 0.490909 0.375000 +vt 0.490909 -0.000000 +vt 0.381818 0.200000 +vt 0.381818 0.000000 +vt 0.909091 0.325000 +vt 0.927273 0.450000 +vt 0.909091 0.425000 +vt 0.363636 0.000000 +vt 0.363636 0.200000 +vt 0.745455 0.000000 +vt 0.636364 0.200000 +vt 0.636364 0.000000 +vt 0.872727 0.325000 +vt 0.800000 0.425000 +vt 0.800000 0.325000 +vt 0.909091 0.575000 +vt 0.872727 0.475000 +vt 0.909091 0.475000 +vt 0.909091 0.125000 +vt 0.872727 0.025000 +vt 0.909091 0.025000 +vt 0.909091 0.275000 +vt 0.872727 0.175000 +vt 0.909091 0.175000 +vt 0.927273 0.600000 +vt 0.927273 0.150000 +vt 0.927273 0.300000 +vt 0.945455 0.300000 +vt 0.945455 0.450000 +vt 0.945455 0.600000 +vt 0.927273 -0.000000 +vt 0.945455 0.150000 +vt 0.072727 0.800000 +vt 0.872727 0.200000 +vt 0.636364 0.375000 +vt 0.618182 0.400000 +vt 0.509091 0.400000 +vt 0.490909 0.225000 +vt 0.490909 0.200000 +vt 0.745455 0.200000 +vt 0.872727 0.425000 +vt 0.872727 0.575000 +vt 0.872727 0.125000 +vt 0.872727 0.275000 +vt 0.945455 -0.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn -0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.7071 0.0000 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 -0.7071 0.0000 +s off +f 35/49/11 34/50/11 33/51/11 +f 38/52/12 39/53/12 37/54/12 +f 35/55/13 40/56/13 36/57/13 +f 34/50/14 37/54/14 33/51/14 +f 36/58/15 38/52/15 34/59/15 +f 33/60/16 39/53/16 35/61/16 +f 54/62/13 64/63/13 55/64/13 +f 52/65/14 60/66/14 49/67/14 +f 57/68/12 58/69/12 62/70/12 +f 56/71/15 62/72/15 51/73/15 +f 46/74/17 65/75/17 45/76/17 +f 64/63/18 56/71/18 55/64/18 +f 52/77/19 62/72/19 61/78/19 +f 60/66/20 50/79/20 49/67/20 +f 54/62/21 58/80/21 57/68/21 +f 50/79/16 58/80/16 53/81/16 +f 43/82/13 41/83/13 42/84/13 +f 45/76/12 43/82/12 46/74/12 +f 47/85/15 44/86/15 45/87/15 +f 48/88/11 41/89/11 47/90/11 +f 46/91/16 42/92/16 48/93/16 +f 45/87/18 67/94/18 47/85/18 +f 47/90/22 68/95/22 48/88/22 +f 46/91/21 68/95/21 66/96/21 +f 68/95/16 70/97/16 66/96/16 +f 66/96/12 69/98/12 65/75/12 +f 65/75/15 71/99/15 67/94/15 +f 67/100/11 72/101/11 68/95/11 +f 35/49/11 36/102/11 34/50/11 +f 38/52/12 40/56/12 39/53/12 +f 35/55/13 39/53/13 40/56/13 +f 34/50/14 38/52/14 37/54/14 +f 36/58/15 40/56/15 38/52/15 +f 33/60/16 37/54/16 39/53/16 +f 54/62/13 57/68/13 64/63/13 +f 52/65/14 61/103/14 60/66/14 +f 58/69/12 59/104/12 60/105/12 +f 60/105/12 61/106/12 58/69/12 +f 61/106/12 62/70/12 58/69/12 +f 62/70/12 63/107/12 64/63/12 +f 64/63/12 57/68/12 62/70/12 +f 56/71/15 63/108/15 62/72/15 +f 46/74/17 66/96/17 65/75/17 +f 64/63/18 63/108/18 56/71/18 +f 52/77/19 51/73/19 62/72/19 +f 60/66/20 59/109/20 50/79/20 +f 54/62/21 53/81/21 58/80/21 +f 50/79/16 59/109/16 58/80/16 +f 43/82/13 44/110/13 41/83/13 +f 45/76/12 44/110/12 43/82/12 +f 47/85/15 41/111/15 44/86/15 +f 48/88/11 42/112/11 41/89/11 +f 46/91/16 43/113/16 42/92/16 +f 45/87/18 65/75/18 67/94/18 +f 47/90/22 67/100/22 68/95/22 +f 46/91/21 48/93/21 68/95/21 +f 68/95/16 72/101/16 70/97/16 +f 66/96/12 70/97/12 69/98/12 +f 65/75/15 69/98/15 71/99/15 +f 67/100/11 71/114/11 72/101/11 diff --git a/src/main/resources/assets/hbm/models/reactors/pile_loader.obj b/src/main/resources/assets/hbm/models/reactors/pile_loader.obj new file mode 100644 index 000000000..9752a11f1 --- /dev/null +++ b/src/main/resources/assets/hbm/models/reactors/pile_loader.obj @@ -0,0 +1,324 @@ +# Blender v2.79 (sub 0) OBJ File: 'pile_loader.blend' +# www.blender.org +o Lever +v -0.093750 0.468750 -0.312500 +v -0.093750 0.468750 -0.375000 +v -0.093750 0.531250 -0.375000 +v -0.093750 0.531250 -0.312500 +v -0.218750 0.531250 -0.375000 +v -0.218750 0.468750 -0.375000 +v -0.156250 0.531250 -0.312500 +v -0.156250 0.468750 -0.312500 +v -0.156250 0.468750 -0.250000 +v -0.156250 0.531250 -0.250000 +v -0.218750 0.468750 -0.250000 +v -0.218750 0.531250 -0.250000 +v -0.093750 0.562500 -0.406250 +v -0.093750 0.437500 -0.406250 +v -0.093750 0.562500 -0.281250 +v -0.093750 0.437500 -0.281250 +v 0.531250 0.562500 -0.281250 +v 0.531250 0.562500 -0.406250 +v 0.531250 0.437500 -0.406250 +v 0.531250 0.437500 -0.281250 +vt 0.979167 0.642857 +vt 0.958333 0.666667 +vt 0.958333 0.619048 +vt 0.937500 0.666667 +vt 0.937500 0.619048 +vt 0.937500 0.571429 +vt 0.916667 0.595238 +vt 0.916667 0.571429 +vt 0.958333 0.571429 +vt 0.979167 0.595238 +vt 1.000000 0.571429 +vt 0.979167 0.571429 +vt 0.916667 0.642857 +vt 0.916667 0.666667 +vt 1.000000 0.642857 +vt 0.979167 0.666667 +vt 0.958333 0.571429 +vt 0.916667 0.333333 +vt 0.958333 0.333333 +vt 0.833333 0.333333 +vt 0.875000 0.285714 +vt 0.875000 0.333333 +vt 0.875000 0.619048 +vt 0.833333 0.571429 +vt 0.875000 0.571429 +vt 1.000000 0.571429 +vt 1.000000 0.333333 +vt 0.916667 0.571429 +vt 1.000000 0.595238 +vt 1.000000 0.666667 +vt 0.833333 0.285714 +vt 0.833333 0.619048 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +s off +f 7/1/1 3/2/1 5/3/1 +f 5/3/2 2/4/2 6/5/2 +f 11/6/3 8/7/3 9/8/3 +f 12/9/1 7/10/1 5/3/1 +f 9/11/4 7/10/4 10/12/4 +f 12/9/5 6/5/5 11/6/5 +f 8/13/3 2/4/3 1/14/3 +f 8/15/6 4/16/6 7/1/6 +f 16/17/3 19/18/3 20/19/3 +f 17/20/4 19/21/4 18/22/4 +f 14/23/5 15/24/5 13/25/5 +f 15/26/6 20/19/6 17/27/6 +f 13/25/1 17/20/1 18/22/1 +f 13/25/2 19/18/2 14/28/2 +f 7/1/1 4/16/1 3/2/1 +f 5/3/2 3/2/2 2/4/2 +f 11/6/3 6/5/3 8/7/3 +f 12/9/1 10/12/1 7/10/1 +f 9/11/4 8/29/4 7/10/4 +f 12/9/5 5/3/5 6/5/5 +f 8/13/3 6/5/3 2/4/3 +f 8/15/6 1/30/6 4/16/6 +f 16/17/3 14/28/3 19/18/3 +f 17/20/4 20/31/4 19/21/4 +f 14/23/5 16/32/5 15/24/5 +f 15/26/6 16/17/6 20/19/6 +f 13/25/1 15/24/1 17/20/1 +f 13/25/2 18/22/2 19/18/2 +o Slider +v 0.437500 0.437500 0.125000 +v 0.437500 0.437500 -0.125000 +v 0.312500 0.437500 0.125000 +v 0.312500 0.437500 -0.125000 +v 0.437500 0.687500 0.125000 +v 0.437500 0.687500 -0.125000 +v 0.312500 0.687500 0.125000 +v 0.312500 0.687500 -0.125000 +vt 0.625000 0.761905 +vt 0.583333 0.857143 +vt 0.583333 0.761905 +vt 0.500000 0.761905 +vt 0.500000 0.857143 +vt 0.708333 0.857143 +vt 0.708333 0.761905 +vt 0.625000 0.857143 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 28/33/7 25/34/7 26/35/7 +f 22/36/8 25/34/8 21/37/8 +f 23/38/9 28/33/9 24/39/9 +f 28/33/7 27/40/7 25/34/7 +f 22/36/8 26/35/8 25/34/8 +f 23/38/9 27/40/9 28/33/9 +o Loader +v -0.500000 0.875000 0.375000 +v -0.500000 0.125000 0.375000 +v -0.500000 0.875000 -0.375000 +v -0.500000 0.125000 -0.375000 +v -0.250000 0.875000 -0.375000 +v -0.250000 0.875000 0.375000 +v -0.250000 0.125000 0.375000 +v -0.250000 0.125000 -0.375000 +v -0.250000 0.687500 0.250000 +v -0.250000 0.750000 0.187500 +v -0.250000 0.250000 0.187500 +v -0.250000 0.312500 0.250000 +v -0.250000 0.750000 -0.187500 +v -0.250000 0.687500 -0.250000 +v -0.250000 0.312500 -0.250000 +v -0.250000 0.250000 -0.187500 +v 0.500000 0.687500 -0.250000 +v 0.437500 0.750000 -0.125000 +v 0.437500 0.750000 0.125000 +v 0.500000 0.687500 0.250000 +v 0.500000 0.312500 0.250000 +v 0.500000 0.250000 0.187500 +v 0.500000 0.250000 -0.187500 +v 0.500000 0.312500 -0.250000 +v 0.500000 0.750000 0.187500 +v 0.500000 0.750000 -0.187500 +v -0.187500 0.750000 0.125000 +v -0.187500 0.750000 -0.125000 +v -0.187500 0.437500 -0.125000 +v -0.187500 0.437500 0.125000 +v 0.437500 0.437500 0.125000 +v 0.437500 0.437500 -0.125000 +v 0.312500 0.500000 0.125000 +v 0.312500 0.437500 0.062500 +v 0.312500 0.437500 -0.062500 +v 0.312500 0.500000 -0.125000 +v 0.312500 0.687500 0.062500 +v 0.312500 0.625000 0.125000 +v 0.312500 0.625000 -0.125000 +v 0.312500 0.687500 -0.062500 +v -0.187500 0.625000 0.125000 +v -0.187500 0.687500 0.062500 +v -0.187500 0.687500 -0.062500 +v -0.187500 0.625000 -0.125000 +v -0.187500 0.437500 0.062500 +v -0.187500 0.500000 0.125000 +v -0.187500 0.500000 -0.125000 +v -0.187500 0.437500 -0.062500 +vt 0.750000 0.476190 +vt 0.500000 0.761905 +vt 0.500000 0.476190 +vt 0.500000 0.095238 +vt 0.750000 0.380952 +vt 0.500000 0.380952 +vt 0.750000 -0.000000 +vt 0.500000 -0.000000 +vt 0.833333 0.380952 +vt 0.750000 0.095238 +vt 0.833333 0.095238 +vt 0.416667 0.095238 +vt 0.416667 0.380952 +vt 0.416667 0.642857 +vt 0.166667 0.500000 +vt 0.416667 0.500000 +vt 0.416667 0.142857 +vt 0.166667 0.000000 +vt 0.416667 0.000000 +vt 0.416667 0.309524 +vt 0.166667 0.166667 +vt 0.416667 0.166667 +vt -0.000000 0.476190 +vt 0.020833 0.309524 +vt 0.166667 0.333333 +vt 0.166667 0.666667 +vt 0.416667 0.666667 +vt 0.416667 0.476190 +vt 0.166667 0.476190 +vt 0.166667 0.309524 +vt 0.187500 1.000000 +vt 0.395833 0.880952 +vt 0.395833 1.000000 +vt 0.395833 0.452381 +vt 0.187500 0.452381 +vt 0.187500 0.357143 +vt 0.416667 0.333333 +vt 0.395833 0.357143 +vt 0.187500 0.785714 +vt 0.395833 0.785714 +vt 0.500000 0.880952 +vt 0.500000 0.785714 +vt 0.083333 0.785714 +vt 0.187500 0.880952 +vt 0.083333 0.880952 +vt 0.395833 0.666667 +vt 0.187500 0.666667 +vt 0.750000 0.761905 +vt 0.166667 0.642857 +vt 0.166667 0.142857 +vt 0.145833 0.500000 +vt 0.020833 0.500000 +vt -0.000000 0.333333 +vt 0.145833 0.309524 +vt 0.833333 0.071429 +vt 1.000000 0.119048 +vt 0.833333 0.119048 +vt 0.833333 0.214286 +vt 1.000000 0.261905 +vt 0.833333 0.261905 +vt 0.833333 0.142857 +vt 1.000000 0.190476 +vt 0.833333 0.190476 +vt 0.833333 -0.000000 +vt 1.000000 0.047619 +vt 0.833333 0.047619 +vt 0.833333 0.285714 +vt 1.000000 0.071429 +vt 1.000000 0.142857 +vt 1.000000 0.214286 +vt 1.000000 -0.000000 +vt 1.000000 0.285714 +vn -1.0000 0.0000 0.0000 +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 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 0.3827 -0.9239 +vn 0.0000 0.3827 0.9239 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.9239 -0.3827 +s off +f 31/41/10 30/42/10 29/43/10 +f 35/44/11 33/45/11 34/46/11 +f 32/47/12 35/44/12 30/48/12 +f 29/43/13 33/45/13 31/41/13 +f 31/49/14 36/50/14 32/51/14 +f 30/52/15 34/46/15 29/53/15 +f 40/54/15 48/55/15 37/56/15 +f 44/57/12 50/58/12 39/59/12 +f 42/60/14 52/61/14 43/62/14 +f 50/63/11 52/64/11 54/65/11 +f 50/66/16 40/54/16 39/67/16 +f 38/68/17 48/55/17 53/69/17 +f 52/61/18 44/57/18 43/62/18 +f 42/60/19 54/65/19 45/70/19 +f 47/71/14 58/72/14 55/73/14 +f 55/74/13 53/69/13 47/75/13 +f 46/76/13 41/77/13 56/78/13 +f 56/78/13 38/68/13 55/74/13 +f 47/75/13 54/65/13 46/76/13 +f 58/72/13 60/79/13 57/80/13 +f 55/81/11 57/80/11 56/82/11 +f 46/83/10 59/84/10 47/85/10 +f 56/86/15 60/79/15 46/87/15 +f 31/41/10 32/88/10 30/42/10 +f 35/44/11 36/50/11 33/45/11 +f 32/47/12 36/50/12 35/44/12 +f 29/43/13 34/46/13 33/45/13 +f 31/49/14 33/45/14 36/50/14 +f 30/52/15 35/44/15 34/46/15 +f 40/54/15 49/89/15 48/55/15 +f 44/57/12 51/90/12 50/58/12 +f 42/60/14 45/70/14 52/61/14 +f 54/65/11 53/69/11 48/91/11 +f 48/91/11 49/92/11 50/63/11 +f 50/63/11 51/93/11 52/64/11 +f 52/64/11 45/94/11 54/65/11 +f 54/65/11 48/91/11 50/63/11 +f 50/66/16 49/89/16 40/54/16 +f 38/68/17 37/56/17 48/55/17 +f 52/61/18 51/90/18 44/57/18 +f 42/60/19 41/77/19 54/65/19 +f 47/71/14 59/84/14 58/72/14 +f 55/74/13 38/68/13 53/69/13 +f 46/76/13 54/65/13 41/77/13 +f 56/78/13 41/77/13 38/68/13 +f 47/75/13 53/69/13 54/65/13 +f 58/72/13 59/84/13 60/79/13 +f 55/81/11 58/72/11 57/80/11 +f 46/83/10 60/79/10 59/84/10 +f 56/86/15 57/80/15 60/79/15 +s 1 +f 64/95/20 72/96/21 67/97/21 +f 66/98/22 74/99/23 61/100/23 +f 68/101/24 70/102/25 65/103/25 +f 62/104/26 76/105/27 63/106/27 +f 74/99/23 62/107/26 61/100/23 +f 64/95/20 76/105/27 75/108/20 +f 68/101/24 72/96/21 71/109/24 +f 66/98/22 70/102/25 69/110/22 +f 64/95/20 75/108/20 72/96/21 +f 66/98/22 69/110/22 74/99/23 +f 68/101/24 71/109/24 70/102/25 +f 62/104/26 73/111/26 76/105/27 +f 74/99/23 73/112/26 62/107/26 +f 64/95/20 63/106/27 76/105/27 +f 68/101/24 67/97/21 72/96/21 +f 66/98/22 65/103/25 70/102/25 diff --git a/src/main/resources/assets/hbm/models/reactors/pile_vent.obj b/src/main/resources/assets/hbm/models/reactors/pile_vent.obj new file mode 100644 index 000000000..b13ceeb4b --- /dev/null +++ b/src/main/resources/assets/hbm/models/reactors/pile_vent.obj @@ -0,0 +1,378 @@ +# Blender v2.79 (sub 0) OBJ File: 'pile_vent.blend' +# www.blender.org +o Fan +v 0.000000 0.812500 -0.031250 +v -0.022097 0.812500 -0.022097 +v -0.031250 0.812500 0.000000 +v -0.022097 0.812500 0.022097 +v 0.000000 0.812500 0.031250 +v 0.022097 0.812500 0.022097 +v 0.031250 0.812500 -0.000000 +v 0.022097 0.812500 -0.022097 +v -0.022097 0.875000 -0.022097 +v -0.000000 0.875000 -0.031250 +v -0.031250 0.875000 0.000000 +v -0.022097 0.875000 0.022097 +v -0.000000 0.875000 0.031250 +v 0.022097 0.875000 0.022097 +v 0.031250 0.875000 -0.000000 +v 0.022097 0.875000 -0.022097 +v -0.027063 0.859375 0.109375 +v 0.027063 0.828125 0.109375 +v -0.027063 0.859375 0.000000 +v 0.027063 0.828125 0.000000 +v -0.027063 0.828125 0.000000 +v 0.027063 0.859375 0.000000 +v -0.027063 0.828125 -0.109375 +v 0.027063 0.859375 -0.109375 +v 0.109375 0.859375 0.027063 +v 0.109375 0.828125 -0.027063 +v -0.000000 0.859375 0.027063 +v -0.000000 0.828125 -0.027063 +v -0.000000 0.828125 0.027063 +v -0.000000 0.859375 -0.027063 +v -0.109375 0.828125 0.027063 +v -0.109375 0.859375 -0.027063 +vt 0.048780 0.775000 +vt 0.146341 0.825000 +vt 0.048780 0.825000 +vt 0.012195 0.775314 +vt 0.020602 0.778883 +vt 0.024084 0.787500 +vt 0.146341 0.825000 +vt 0.048780 0.775000 +vt 0.146341 0.775000 +vt 0.048780 0.775000 +vt 0.146341 0.825000 +vt 0.048780 0.825000 +vt 0.146341 0.825000 +vt 0.048780 0.775000 +vt 0.146341 0.775000 +vt 0.146341 0.775000 +vt 0.020602 0.796117 +vt 0.012195 0.799686 +vt 0.003788 0.796117 +vt 0.000306 0.787500 +vt 0.003788 0.778883 +vt 0.048780 0.825000 +vt 0.146341 0.775000 +vt 0.048780 0.825000 +vt 0.146341 0.750000 +vt 0.121951 0.775000 +vt 0.121951 0.750000 +vt 0.073171 0.750000 +vt 0.097561 0.775000 +vt 0.073171 0.775000 +vt 0.024390 0.750000 +vt 0.048780 0.775000 +vt 0.024390 0.775000 +vt 0.195122 0.750000 +vt 0.170732 0.775000 +vt 0.170732 0.750000 +vt 0.097561 0.750000 +vt 0.048780 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.775000 +vt 0.146341 0.775000 +vt 0.195122 0.775000 +vn 0.5000 0.8660 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.5000 0.8660 0.0000 +vn -0.0000 0.8660 -0.5000 +vn 0.0000 0.8660 0.5000 +vn 0.0000 -0.0000 -1.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn 1.0000 0.0000 0.0000 +vn -0.7071 -0.0000 0.7071 +vn -0.0000 0.0000 1.0000 +vn -1.0000 -0.0000 0.0000 +vn -0.7071 -0.0000 -0.7071 +s off +f 18/1/1 19/2/1 17/3/1 +f 15/4/2 16/5/2 10/6/2 +f 22/7/3 23/8/3 21/9/3 +f 26/10/4 27/11/4 25/12/4 +f 30/13/5 31/14/5 29/15/5 +f 18/1/1 20/16/1 19/2/1 +f 10/6/2 9/17/2 11/18/2 +f 11/18/2 12/19/2 10/6/2 +f 12/19/2 13/20/2 10/6/2 +f 13/20/2 14/21/2 10/6/2 +f 14/21/2 15/4/2 10/6/2 +f 22/7/3 24/22/3 23/8/3 +f 26/10/4 28/23/4 27/11/4 +f 30/13/5 32/24/5 31/14/5 +s 1 +f 1/25/6 16/26/7 8/27/7 +f 6/28/8 15/29/9 14/30/8 +f 4/31/10 13/32/11 12/33/10 +f 3/34/12 9/35/13 2/36/13 +f 8/27/7 15/29/9 7/37/9 +f 5/38/11 14/30/8 13/32/11 +f 3/39/12 12/33/10 11/40/12 +f 2/36/13 10/41/6 1/25/6 +f 1/25/6 10/41/6 16/26/7 +f 6/28/8 7/37/9 15/29/9 +f 4/31/10 5/38/11 13/32/11 +f 3/34/12 11/42/12 9/35/13 +f 8/27/7 16/26/7 15/29/9 +f 5/38/11 6/28/8 14/30/8 +f 3/39/12 4/31/10 12/33/10 +f 2/36/13 9/35/13 10/41/6 +o Pipe +v -0.500000 0.875000 0.375000 +v -0.500000 0.125000 0.375000 +v -0.500000 0.875000 -0.375000 +v -0.500000 0.125000 -0.375000 +v -0.375000 0.875000 -0.375000 +v -0.375000 0.875000 0.375000 +v -0.375000 0.125000 0.375000 +v -0.375000 0.125000 -0.375000 +v 0.500000 0.750000 0.250000 +v 0.500000 0.250000 0.250000 +v 0.500000 0.750000 -0.250000 +v 0.500000 0.250000 -0.250000 +v 0.375000 0.750000 -0.250000 +v 0.375000 0.750000 0.250000 +v 0.375000 0.250000 0.250000 +v 0.375000 0.250000 -0.250000 +v 0.375000 0.687500 0.187500 +v 0.375000 0.312500 0.187500 +v 0.375000 0.687500 -0.187500 +v 0.375000 0.312500 -0.187500 +v 0.125000 0.687500 -0.187500 +v 0.125000 0.687500 0.187500 +v 0.125000 0.312500 0.187500 +v 0.125000 0.312500 -0.187500 +v 0.125000 0.750000 0.250000 +v 0.125000 0.250000 0.250000 +v 0.125000 0.750000 -0.250000 +v 0.125000 0.250000 -0.250000 +v -0.125000 0.750000 -0.250000 +v -0.125000 0.750000 0.250000 +v -0.125000 0.250000 0.250000 +v -0.125000 0.250000 -0.250000 +v -0.125000 0.687500 0.187500 +v -0.125000 0.312500 0.187500 +v -0.125000 0.687500 -0.187500 +v -0.125000 0.312500 -0.187500 +v -0.375000 0.687500 -0.187500 +v -0.375000 0.687500 0.187500 +v -0.375000 0.312500 0.187500 +v -0.375000 0.312500 -0.187500 +v -0.187500 0.687500 0.187500 +v 0.187500 0.687500 0.187500 +v -0.187500 0.687500 -0.187500 +v 0.187500 0.687500 -0.187500 +v -0.125000 0.875000 -0.125000 +v -0.125000 0.875000 0.125000 +v 0.125000 0.875000 0.125000 +v 0.125000 0.875000 -0.125000 +v -0.187500 0.875000 -0.187500 +v -0.187500 0.875000 0.187500 +v 0.187500 0.875000 0.187500 +v 0.187500 0.875000 -0.187500 +v -0.125000 0.812500 -0.125000 +v -0.125000 0.812500 0.125000 +v 0.125000 0.812500 0.125000 +v 0.125000 0.812500 -0.125000 +vt 0.487805 0.600000 +vt 0.512195 0.425000 +vt 0.512195 0.575000 +vt 0.951219 0.400000 +vt 0.658537 0.700000 +vt 0.658537 0.400000 +vt 0.658537 0.050000 +vt 0.951219 0.350000 +vt 0.658537 0.350000 +vt 1.000000 0.350000 +vt 0.951219 0.050000 +vt 1.000000 0.050000 +vt 0.609756 0.050000 +vt 0.609756 0.350000 +vt 0.951219 -0.000000 +vt 0.658537 0.000000 +vt 0.000000 0.600000 +vt 0.195122 0.400000 +vt 0.195122 0.600000 +vt 0.512195 0.775000 +vt 0.512195 0.625000 +vt 0.195122 -0.000000 +vt 0.243902 0.200000 +vt 0.195122 0.200000 +vt 0.243902 0.600000 +vt 0.243902 0.400000 +vt 0.243902 0.800000 +vt 0.195122 0.800000 +vt 0.512195 0.175000 +vt 0.487805 -0.000000 +vt 0.512195 0.025000 +vt 0.487805 0.400000 +vt 0.512195 0.225000 +vt 0.512195 0.375000 +vt 0.365854 0.625000 +vt 0.268293 0.775000 +vt 0.268293 0.625000 +vt 0.365854 0.025000 +vt 0.268293 0.175000 +vt 0.268293 0.025000 +vt 0.365854 0.425000 +vt 0.268293 0.575000 +vt 0.268293 0.425000 +vt 0.365854 0.225000 +vt 0.268293 0.375000 +vt 0.268293 0.225000 +vt 0.390244 -0.000000 +vt 0.487805 0.200000 +vt 0.390244 0.200000 +vt 0.390244 0.400000 +vt 0.390244 0.600000 +vt 0.487805 0.800000 +vt 0.390244 0.800000 +vt 0.609756 0.625000 +vt 0.609756 0.025000 +vt 0.609756 0.425000 +vt 0.609756 0.225000 +vt 0.024390 0.750000 +vt 0.121951 0.725000 +vt 0.121951 0.750000 +vt 0.829268 0.700000 +vt 0.682927 0.775000 +vt 0.682927 0.700000 +vt 0.682927 1.000000 +vt 0.829268 0.925000 +vt 0.829268 1.000000 +vt 0.609756 0.775000 +vt 0.682927 0.925000 +vt 0.609756 0.925000 +vt 0.902439 0.925000 +vt 0.829268 0.775000 +vt 0.902439 0.775000 +vt 0.804878 0.800000 +vt 0.804878 0.900000 +vt 0.707317 0.900000 +vt 0.707317 0.800000 +vt 0.024390 0.725000 +vt 0.121951 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.725000 +vt 0.146341 0.725000 +vt 0.146341 0.625000 +vt 0.121951 0.600000 +vt 0.024390 0.625000 +vt 0.024390 0.600000 +vt 0.365854 0.375000 +vt 0.365854 0.575000 +vt 0.365854 0.775000 +vt 0.365854 0.175000 +vt 0.951219 0.700000 +vt -0.000000 0.400000 +vt 0.243902 0.000000 +vt 0.609756 0.775000 +vt 0.609756 0.175000 +vt 0.609756 0.575000 +vt 0.609756 0.375000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 62/43/14 67/44/14 65/45/14 +f 35/46/14 34/47/14 33/48/14 +f 39/49/15 37/50/15 38/51/15 +f 35/52/16 40/53/16 36/54/16 +f 34/55/17 38/51/17 33/56/17 +f 36/57/18 39/49/18 34/58/18 +f 33/48/19 37/50/19 35/46/19 +f 42/59/15 43/60/15 41/61/15 +f 66/62/14 62/43/14 65/63/14 +f 42/64/18 48/65/18 44/66/18 +f 43/60/19 46/67/19 41/61/19 +f 44/66/16 45/68/16 43/60/16 +f 41/61/17 47/69/17 42/70/17 +f 68/71/14 63/72/14 66/73/14 +f 61/74/14 68/75/14 67/76/14 +f 54/77/17 50/78/17 49/79/17 +f 55/80/18 52/81/18 50/82/18 +f 53/83/19 49/84/19 51/85/19 +f 56/86/16 51/87/16 52/88/16 +f 58/89/18 64/90/18 60/91/18 +f 59/92/19 62/43/19 57/93/19 +f 60/91/16 61/74/16 59/92/16 +f 57/93/17 63/94/17 58/95/17 +f 70/96/17 66/62/17 65/63/17 +f 71/97/18 68/71/18 66/73/18 +f 69/98/19 65/45/19 67/44/19 +f 72/99/16 67/76/16 68/75/16 +f 79/100/16 86/101/16 78/102/16 +f 75/103/16 84/104/16 76/105/16 +f 74/106/17 82/107/17 73/108/17 +f 76/109/15 83/110/15 74/111/15 +f 73/112/14 81/113/14 75/114/14 +f 77/115/19 82/107/19 78/116/19 +f 78/116/19 83/110/19 79/117/19 +f 79/117/19 84/104/19 80/118/19 +f 80/118/19 81/113/19 77/115/19 +f 87/119/19 85/120/19 86/101/19 +f 80/121/14 87/119/14 79/122/14 +f 78/123/15 85/120/15 77/124/15 +f 77/125/17 88/126/17 80/127/17 +f 56/86/15 59/92/15 53/128/15 +f 53/83/15 57/93/15 54/129/15 +f 54/77/15 58/95/15 55/130/15 +f 55/80/15 60/91/15 56/131/15 +f 48/65/14 51/87/14 45/68/14 +f 46/67/14 51/85/14 49/84/14 +f 46/67/14 50/78/14 47/69/14 +f 48/65/14 50/82/14 52/81/14 +f 62/43/14 61/74/14 67/44/14 +f 35/46/14 36/132/14 34/47/14 +f 39/49/15 40/53/15 37/50/15 +f 35/52/16 37/50/16 40/53/16 +f 34/55/17 39/49/17 38/51/17 +f 36/57/18 40/53/18 39/49/18 +f 33/48/19 38/51/19 37/50/19 +f 42/59/15 44/133/15 43/60/15 +f 66/62/14 63/94/14 62/43/14 +f 42/64/18 47/134/18 48/65/18 +f 43/60/19 45/68/19 46/67/19 +f 44/66/16 48/65/16 45/68/16 +f 41/61/17 46/67/17 47/69/17 +f 68/71/14 64/90/14 63/72/14 +f 61/74/14 64/90/14 68/75/14 +f 54/77/17 55/130/17 50/78/17 +f 55/80/18 56/131/18 52/81/18 +f 53/83/19 54/129/19 49/84/19 +f 56/86/16 53/128/16 51/87/16 +f 58/89/18 63/72/18 64/90/18 +f 59/92/19 61/74/19 62/43/19 +f 60/91/16 64/90/16 61/74/16 +f 57/93/17 62/43/17 63/94/17 +f 70/96/17 71/135/17 66/62/17 +f 71/97/18 72/136/18 68/71/18 +f 69/98/19 70/137/19 65/45/19 +f 72/99/16 69/138/16 67/76/16 +f 79/100/16 87/119/16 86/101/16 +f 75/103/16 81/113/16 84/104/16 +f 74/106/17 83/110/17 82/107/17 +f 76/109/15 84/104/15 83/110/15 +f 73/112/14 82/107/14 81/113/14 +f 77/115/19 81/113/19 82/107/19 +f 78/116/19 82/107/19 83/110/19 +f 79/117/19 83/110/19 84/104/19 +f 80/118/19 84/104/19 81/113/19 +f 87/119/19 88/126/19 85/120/19 +f 80/121/14 88/126/14 87/119/14 +f 78/123/15 86/101/15 85/120/15 +f 77/125/17 85/120/17 88/126/17 +f 56/86/15 60/91/15 59/92/15 +f 53/83/15 59/92/15 57/93/15 +f 54/77/15 57/93/15 58/95/15 +f 55/80/15 58/89/15 60/91/15 +f 48/65/14 52/88/14 51/87/14 +f 46/67/14 45/68/14 51/85/14 +f 46/67/14 49/79/14 50/78/14 +f 48/65/14 47/134/14 50/82/14 diff --git a/src/main/resources/assets/hbm/textures/blocks/pile_block.png b/src/main/resources/assets/hbm/textures/blocks/pile_block.png new file mode 100644 index 0000000000000000000000000000000000000000..d4aefb1d12fa4e74e6729b1bb208143397908fca GIT binary patch literal 634 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 P00000NkvXXu0mjfW}Wfx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pile_wood_planks.png b/src/main/resources/assets/hbm/textures/blocks/pile_wood_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..262060858374c695c2735433cd1feb22bc651c9d GIT binary patch literal 647 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 om!{zaG(#hur;s##yjEv09>P#P5=M^ literal 4460 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 diff --git a/src/main/resources/assets/hbm/textures/models/pile/pile_control.png b/src/main/resources/assets/hbm/textures/models/pile/pile_control.png new file mode 100644 index 0000000000000000000000000000000000000000..01c9468082c294b6b1d3d5c2dc2969e163df834b GIT binary patch literal 408 zcmV;J0cZY+P)PBw>3CK!Qa zVa#Y5z9S59o`)_@Dnrf3thMZ%i|%Qyfp1gvy{eu| z3ESJtrRlJ2THGqs1gOiuJ>q*yzJvK5cSzG=*|fM-Z%GF)SjyP(7Q}l_ zU7-9T;v-(%A2b1UeO#+LX3$zEtKzf0Wmp+QK|TWq-!*#b3GcDsygJeUo%rwE7R}^b zjH)?Tf>dRsY2BqX<2kziR!kr9;(BjcgW5Bc;sxcE8H%+w8eUuH0F$&ud|3A0QY!P9 z9*YcNFBtZUdxYod;Q4pbOjyR~;?B%+gIaF!YWV};9(IrG-+Q?L0000 z=eY=;LRT1bh50|l+ua8u*MQdAc&`JlxPSmuCjkJLobU+XwH}Z91b{n8AR!_%)W-vr z1C7mvf@JCkDy5ullxD`CX2!EbOhl{(i-^2-oN{74F2Y_%zl2K8@Tff=}R=rssDX^^F5f&j+7? zjY8H0wzg3lg1^-76q*as`Cq5o+ss{mu&fXM1n!=Eo5JeY_4!{v8Q*s0!h1!=8x_jiI_K|ZJ*bE0)kGOxR?V{{^!kp1W@ zV+;<%0B#HY+g$9LCz~_i&zB0mqhsyI Date: Sat, 11 Jul 2026 23:18:22 +0200 Subject: [PATCH 077/107] dess is gaster and also a toilet theory --- changelog | 10 +- src/main/java/com/hbm/blocks/ModBlocks.java | 6 +- .../java/com/hbm/blocks/generic/BlockOre.java | 10 +- .../blocks/generic/BlockSellafieldSlaked.java | 2 +- .../hbm/blocks/generic/BlockTrinitite.java | 41 ++++++ .../blocks/machine/MachinePWRController.java | 2 +- .../blocks/machine/pile/BlockPileBrick.java | 117 ++++++++++++++++++ .../blocks/pile_block_control_top_ct.png | Bin 0 -> 1592 bytes .../textures/blocks/pile_block_input_ct.png | Bin 0 -> 1568 bytes .../textures/blocks/pile_block_output_ct.png | Bin 0 -> 1535 bytes .../hbm/textures/blocks/pile_brick_side.png | Bin 0 -> 276 bytes .../hbm/textures/blocks/pile_brick_top.png | Bin 0 -> 214 bytes .../hbm/textures/blocks/waste_trinitite.0.png | Bin 0 -> 894 bytes .../hbm/textures/blocks/waste_trinitite.1.png | Bin 0 -> 896 bytes .../hbm/textures/blocks/waste_trinitite.2.png | Bin 0 -> 915 bytes .../hbm/textures/blocks/waste_trinitite.3.png | Bin 0 -> 890 bytes .../textures/blocks/waste_trinitite_red.0.png | Bin 0 -> 797 bytes .../textures/blocks/waste_trinitite_red.1.png | Bin 0 -> 790 bytes .../textures/blocks/waste_trinitite_red.2.png | Bin 0 -> 806 bytes .../textures/blocks/waste_trinitite_red.3.png | Bin 0 -> 784 bytes 20 files changed, 179 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockTrinitite.java create mode 100644 src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_block_control_top_ct.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_block_input_ct.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_block_output_ct.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_brick_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_brick_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_trinitite.0.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_trinitite.1.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_trinitite.2.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_trinitite.3.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_trinitite_red.0.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_trinitite_red.1.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_trinitite_red.2.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_trinitite_red.3.png diff --git a/changelog b/changelog index a9bebc540..ff72aae47 100644 --- a/changelog +++ b/changelog @@ -1,2 +1,10 @@ +## Changed +* Updated the trinitite ore textures + * The ore spots are now smaller and more shard-like + * Each trinitite ore block now has four randomized texture variants +* Trinitite ores now spawn fewer particles +* The radiation effect caused by walking on trinitite ore is now much shorter but more intense to compensate + ## Fixed -* Fixed burner press GUI offsets being incorrect \ No newline at end of file +* Fixed burner press GUI offsets being incorrect +* Potentially fixed an issue with journey map where slaked sellafite would sometimes get the wrong color in the minimap \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index fad72e397..4f4bb29d8 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1649,8 +1649,8 @@ public class ModBlocks { waste_earth = new WasteEarth(Material.ground, true).setBlockName("waste_earth").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_earth"); waste_mycelium = new WasteEarth(Material.ground, true).setBlockName("waste_mycelium").setStepSound(Block.soundTypeGrass).setLightLevel(1F).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_mycelium_side"); - waste_trinitite = new BlockOre(Material.sand).noFortune().setBlockName("waste_trinitite").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.5F).setBlockTextureName(RefStrings.MODID + ":waste_trinitite"); - waste_trinitite_red = new BlockOre(Material.sand).noFortune().setBlockName("waste_trinitite_red").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.5F).setBlockTextureName(RefStrings.MODID + ":waste_trinitite_red"); + waste_trinitite = new BlockTrinitite(Material.sand).noFortune().setBlockName("waste_trinitite").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.5F).setBlockTextureName(RefStrings.MODID + ":waste_trinitite"); + waste_trinitite_red = new BlockTrinitite(Material.sand).noFortune().setBlockName("waste_trinitite_red").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.5F).setBlockTextureName(RefStrings.MODID + ":waste_trinitite_red"); waste_log = new WasteLog(Material.wood).setBlockName("waste_log").setStepSound(Block.soundTypeWood).setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(2.5F); waste_leaves = new WasteLeaves(Material.leaves).setBlockName("waste_leaves").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.1F).setBlockTextureName(RefStrings.MODID + ":waste_leaves"); waste_planks = new BlockOre(Material.wood).setBlockName("waste_planks").setStepSound(Block.soundTypeWood).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.5F).setBlockTextureName(RefStrings.MODID + ":waste_planks"); @@ -1962,7 +1962,7 @@ public class ModBlocks { custom_machine = new BlockCustomMachine().setBlockName("custom_machine").setCreativeTab(MainRegistry.machineTab).setLightLevel(1F).setHardness(5.0F).setResistance(10.0F); cm_anchor = new BlockCMAnchor().setBlockName("custom_machine_anchor").setCreativeTab(MainRegistry.machineTab).setHardness(5.0F).setResistance(10.0F); - pile_brick = new BlockGenericTooltip(Material.iron).setBlockName("pile_brick").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_brick"); + pile_brick = new BlockPileBrick().setBlockName("pile_brick").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_brick"); pile_block = new BlockPile().setBlockName("pile_block").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_block"); pwr_fuel = new BlockPillarPWR(Material.iron, RefStrings.MODID + ":pwr_fuel_top").setBlockName("pwr_fuel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_fuel_side"); diff --git a/src/main/java/com/hbm/blocks/generic/BlockOre.java b/src/main/java/com/hbm/blocks/generic/BlockOre.java index 9e613c75b..c621053d3 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockOre.java +++ b/src/main/java/com/hbm/blocks/generic/BlockOre.java @@ -159,7 +159,7 @@ public class BlockOre extends Block { living.addPotionEffect(new PotionEffect(HbmPotion.radiation.id, 30 * 20, 2)); } if(this == ModBlocks.waste_trinitite || this == ModBlocks.waste_trinitite_red) { - living.addPotionEffect(new PotionEffect(HbmPotion.radiation.id, 30 * 20, 0)); + living.addPotionEffect(new PotionEffect(HbmPotion.radiation.id, 5 * 20, 2)); } if(this == ModBlocks.brick_jungle_ooze) { living.addPotionEffect(new PotionEffect(HbmPotion.radiation.id, 15 * 20, 9)); @@ -178,8 +178,12 @@ public class BlockOre extends Block { public void randomDisplayTick(World world, int x, int y, int z, Random rand) { super.randomDisplayTick(world, x, y, z, rand); - if(this == ModBlocks.waste_trinitite || this == ModBlocks.waste_trinitite_red || this == ModBlocks.block_trinitite || this == ModBlocks.block_waste) { - world.spawnParticle("townaura", x + rand.nextFloat(), y + 1.1F, z + rand.nextFloat(), 0.0D, 0.0D, 0.0D); + if(this == ModBlocks.block_trinitite || this == ModBlocks.block_waste) { + world.spawnParticle("townaura", x + rand.nextFloat(), y + 1.0625, z + rand.nextFloat(), 0, 0, 0); + } + + if((this == ModBlocks.waste_trinitite || this == ModBlocks.waste_trinitite_red) && rand.nextInt(5) == 0) { + world.spawnParticle("townaura", x + rand.nextFloat(), y + 1.0625, z + rand.nextFloat(), 0, 0, 0); } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockSellafieldSlaked.java b/src/main/java/com/hbm/blocks/generic/BlockSellafieldSlaked.java index be264d979..c382bb0d8 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockSellafieldSlaked.java +++ b/src/main/java/com/hbm/blocks/generic/BlockSellafieldSlaked.java @@ -41,7 +41,7 @@ public class BlockSellafieldSlaked extends Block { @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { icons = new IIcon[4]; - icons[0] = reg.registerIcon(RefStrings.MODID + ":sellafield_slaked"); + this.blockIcon = icons[0] = reg.registerIcon(RefStrings.MODID + ":sellafield_slaked"); icons[1] = reg.registerIcon(RefStrings.MODID + ":sellafield_slaked_1"); icons[2] = reg.registerIcon(RefStrings.MODID + ":sellafield_slaked_2"); icons[3] = reg.registerIcon(RefStrings.MODID + ":sellafield_slaked_3"); diff --git a/src/main/java/com/hbm/blocks/generic/BlockTrinitite.java b/src/main/java/com/hbm/blocks/generic/BlockTrinitite.java new file mode 100644 index 000000000..437218f38 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockTrinitite.java @@ -0,0 +1,41 @@ +package com.hbm.blocks.generic; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +public class BlockTrinitite extends BlockOre { + + public IIcon[] icons; + + public BlockTrinitite(Material mat) { + super(mat); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return icons[0]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[4]; + + for(int i = 0; i < 4; i++) icons[i] = reg.registerIcon(this.getTextureName() + "." + i); + this.blockIcon = icons[0]; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + long l = (long) (x * 3129871) ^ (long)y * 116129781L ^ (long)z; + l = l * l * 42317861L + l * 11L; + int i = (int)(l >> 16 & 3L); + return icons[(int)(Math.abs(i) % icons.length)]; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 61b9930dc..10de4e22d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -187,7 +187,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv errored = true; } - private void sendError(World world, int x, int y, int z, String message, EntityPlayer player) { + public static void sendError(World world, int x, int y, int z, String message, EntityPlayer player) { if(player instanceof EntityPlayerMP) { NBTTagCompound data = new NBTTagCompound(); diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java new file mode 100644 index 000000000..2faef09a7 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java @@ -0,0 +1,117 @@ +package com.hbm.blocks.machine.pile; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.MachinePWRController; +import com.hbm.lib.RefStrings; + +import api.hbm.block.IToolable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockPileBrick extends Block implements IToolable { + + @SideOnly(Side.CLIENT) protected IIcon iconTop; + @SideOnly(Side.CLIENT) protected IIcon iconSide; + + public static int MAX_SIZE = 15; + + public BlockPileBrick() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + this.iconTop = reg.registerIcon(RefStrings.MODID + ":pile_brick_top"); + this.iconSide = reg.registerIcon(RefStrings.MODID + ":pile_brick_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if(side == 0 || side == 1) return this.iconTop; + if(side == 4 || side == 5) return this.iconSide; + return this.blockIcon; + } + + @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 == tool.HAND_DRILL) { + if(side == 0 || side == 1) return false; + if(world.isRemote) return true; + + ForgeDirection dir = ForgeDirection.getOrientation(side).getOpposite(); + + int negHeight = 0; + int posHeight = 0; + int left = 0; + int right = 0; + int depth = 0; + + for(int i = 1; i <= MAX_SIZE; i++) { if(world.getBlock(x, y + i, z) != this) break; posHeight = i; } + for(int i = 1; i <= MAX_SIZE - posHeight - 1; i++) { if(world.getBlock(x, y - i, z) != this) break; negHeight = i; } + + ForgeDirection dirLeft = dir.getRotation(ForgeDirection.DOWN); + for(int i = 1; i <= MAX_SIZE; i++) { if(world.getBlock(x + dirLeft.offsetX * i, y, z + dirLeft.offsetZ * i) != this) break; left = i; } + for(int i = 1; i <= MAX_SIZE - left - 1; i++) { if(world.getBlock(x - dirLeft.offsetX * i, y, z - dirLeft.offsetZ * i) != this) break; right = i; } + + for(int i = 1; i <= MAX_SIZE; i++) { if(world.getBlock(x + dir.offsetX * i, y, z + dir.offsetZ * i) != this) break; depth = i; } + + if(posHeight + negHeight + 1 < 5) { + MachinePWRController.sendError(world, x, y + posHeight, z, "Height too low (<5)", player); + MachinePWRController.sendError(world, x, y - negHeight, z, "Height too low (<5)", player); + return true; + } + + if(left + right + 1 < 5) { + MachinePWRController.sendError(world, x + dirLeft.offsetX * left, y, z + dirLeft.offsetZ * right, "Width too low (<5)", player); + MachinePWRController.sendError(world, x - dirLeft.offsetX * right, y, z - dirLeft.offsetZ * right, "Width too low (<5)", player); + return true; + } + + if(depth + 1 < 5) { + MachinePWRController.sendError(world, x + dir.offsetX * depth, y, z + dir.offsetZ * depth, "Depth too low (<5)", player); + return true; + } + + for(int h = -negHeight; h <= posHeight; h++) { + for(int v = -left; v <= right; v++) { + for(int d = 0; d <= depth; d++) { + int iX = x - dirLeft.offsetX * v + dir.offsetX * d; + int iY = y + h; + int iZ = z - dirLeft.offsetZ * v + dir.offsetZ * d; + + if(world.getBlock(iX, iY, iZ) != this) { + MachinePWRController.sendError(world, iX, iY, iZ, "Graphite block missing", player); + return true; + } + } + } + } + + for(int h = -negHeight; h <= posHeight; h++) { + for(int v = -left; v <= right; v++) { + for(int d = 0; d <= depth; d++) { + int iX = x - dirLeft.offsetX * v + dir.offsetX * d; + int iY = y + h; + int iZ = z - dirLeft.offsetZ * v + dir.offsetZ * d; + world.setBlock(iX, iY, iZ, ModBlocks.pile_block); + } + } + } + + return true; + } + + return false; + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/pile_block_control_top_ct.png b/src/main/resources/assets/hbm/textures/blocks/pile_block_control_top_ct.png new file mode 100644 index 0000000000000000000000000000000000000000..267661c4680208669ffcbd17322320c21ec40e2f GIT binary patch literal 1592 zcmV-82FLk{P)s{oMArP-S{w|mC6CTxd%aQLQ!eehA?m41~{0oGPjmF3IT08vdTZQTi?x=?WYYh>zp^ar|F_ms zRTU>^NBGckFq`q|yg+1x_n~KwrhAA8!{Lxm=LIHB3El(H`heawZmngpSoHALSXEU3 zOsCV{aGvM4kyzIp%wV&L&xt518&F9Cv|KGVWZmN7EqyS_?`9rG(TNLfZmxyuZhAkfYQZNTB;4Ku;zUCX-2jrXN3ke9{4c_wV1| zam2YLl50W;q*->yL8VlGU2ZB85u9@vV{lD_))FJI4fl5U^ZEQyB<1_M=lu z(5I)TcV7NWIdFP<+UE>F-IV0r?vzse^y!=sJhiO}Ay8S%a5%(=K%x|%&kO3>V(S_o z{Np+B+`6wDOk)DZoTzzuG{rebS+4nVyjf$6#<$@%2X5;+X8Tj?eh!F?k*?gfXM8-n zRYOtHDWw$7IlT8AOa?et1EAl%d-v55*wqc^9Fpghn+=Hw*2WhH?_-d}#5Zy~BUL zT#_0?nx-Tje}1#+c@f<+`d~KWU^c@!hie*!g8@Li?mCxr4P=`4 z8;^0$0UL~t!^qpStmn7OIY;v2KmO8YSw@pthE#@eBqzX_~TJ zF8LN-|MB;~A$X7XzLV4x=NbUMTo!zH_6ns0*EGH7+w=6^^X6pwEZ-!;58u6dlGm%{ z0`Eg#tIpM2%vZcPoDzbkC<-p-D~@L)RHteo_@1%0dX`_874!KuKmB~o@7^3g;I*qA zJ_MWtQ3@r({wSv`*VMMgxs>t1uw1SH$n%`qIYggn5JI0kA;e)bw0E#y&FhzklRGbnJMw*9=UIji9*7g}?Mk>T)*Maup5!m) zD~t%U+1{gk=cq7WR^)kxF$N`qF)4YLF&qv%L5d@nF)7BR+^iiU@qt)4@gYg4im*u+e-=Q0+#sgus zTE)rLdyZ$Fws-SCz;e0l46A4PK^BkZV4UNc<^iAl`1e1xqJ%^gtq)zvfg}pw21H35 qpS7WB98DANXK6|zipDvoQGK z{+}buGJdyh+3h7bU*erZYmIXbgy1Zlqm`oDj_}R_pmosbPsTHXRd8br#u&QYF2)#s z8jYG4%d+HOy&h2%VT@_sUn~~*ZVTs2jz$?z9_>I`^8Vw5Cy#ar!w`T_Yu=qr`EtJx zWy!mbDf>HHNGTAnUcD+;!HqFQQPc!}lVt$>Se5|vdc7ua9LFpc3tl~Y$iqPgYb|!U zBx$t(u-0-knxF&4{_Zx;Ih0aJDVz0=PROF;Nr|h9TBDO6L$#R@(r0 z@9WfS019JRE*-5_Oc;g)!{Lx_x7#fE{{8z~gT8$ElGO)iS%wZZhX(_kb9nEGq7ZAB z034sDEQR8mCkNQ&vRPwQ4@aZPW(};)$K&y}!TbF_X_}H{S+f-v-Gn?3d4DqD$-w|? z3r6E94|jTa@0iUOjK}Bv^4mGT|6&h-k7p@^Zh|cg65yX7K9JS>eV4-+!`r$TBPFrc zvftmr78d6`+wGY7d`4jkqCl}&7AGQq`}N9G_)P@%iimDFnVQ?4aB2LLGQG9DcS2hQlHJ{4)U0o;@RwXYBU2 zn&(PNoOd{1G8#|OO409c0Rkx3RuY`1Gvq1*KSdFD>4r2-dAql_7Eqy-;&?nmYmHQj z$;=W*5pf)Y5P;yN84mUFOm#+s%Ay7dzVhdxM zo?kjg={-Wq>Yfmkb-MznARu`D{P{*-uLrp4dVOx_Fs$0IC{Rj~Bne6>CX)&0*@F4P zaCk64D%G$8N}MnGaD0Yb_4Q~pB2Ck#RkAGOO_uRPU2s{JHP7L4ZrGy0JICo{hI5WI zP5JjPzgF2OOfxS&9G~HwBhPdG^X?e$97;->!Ms?j0b@+V0jTE0dfKxrYql#8o;=S< zLcw%8#oB^SOEH~JF-1WusT*FWB{1y|oUMZ(Fs zLnuk^~KTvA-l8ZB^Z5nGrxPAM7yvc4g&>Zq(fT?4$`7393my(SpXh`6e1>zrX%Vf1 z4W2va*z4D`T~x&gkmq?FSl+6?&JV2X#rNO+p;S`c$a5tX&bu3VzOH2kiLZAp S$us8w0000G62m9n$Z!dYagg{xA2 z0>6QG*`>VmPH*5R@=iOgoJ=f_hciP0AUOb<-N*tLf#bO)(^V`Im%mT5`<(Or;?=8H zMHEH+KO>G~J{lSJhh3~IaMq%=###$Pa2jpUN-^jKIBNmW+H3U3i#4(io@E(v9Pj*= z-~EXE?nmM{CXVCgejLZl=X0Vc!np$L3f|3Q!Z1Wh$-9#TUu%5dM<|7_HOI^I>bc_Q z`3ma_q!f5{!1_}!V)XiLv(nM)xBTmyhYW{9vMeJ_Q^GI=U@#ak8TaY;dYJ8&Zl}ZZ zejj5DaE|sA-ENmpW&uhmq?CNx?*ovU0`cO-i#r{`moFX@1OdM9W2~jH79nMM41ja4 z+IkH@o@H#emQE+c_kFzSbjn~bXeK;7JiIpO%a<>y7aYei+SkkuCRl56&JhGY#%uvN zI*Hf{#nUGTnC-Tiqt1tS^Cez82kPI8#p2T7hlMfPNz5Kz;rq#pnzq4%oi)PQjEuYfB=ftOoEeWjf~@%<+o1(xJ@e5P;z4d4kqHTKg>52Bj2%@8i|U6n*pX#^Cih|Ho%!S$SNu$KA5d zf7b=dEuV%V#^h+vLrO`%-{+HV7lfeO3DLffl9E+w5wqE>*_Yeoz;rs@*{RPzo*;!l zd1Z^uv#hE4t+f=+A*3wt2|-bnD}eGmyywrK@6>fWz*X1nzM*};EWbQQsj}-SrC2VP zoW&`dG-Gx!K`Pa-0?PLNpQF>V547ugFc^?!8J+LnFai?ZB7x<%Pl=+a310UNbHAMU zWVvR4v_}+0oWHm zF20}TU5?KzLP-kiu&(R_N=R(sD4gTpzs&JG&30?pZp-I^?<17N`^!uN`xVbe70)MC z`P{?zJo2qqHJDMw^L+r07ajJ8W%j@K1L2MzP@-Vm@05Dq-|++16-es}ju&f`6b;Xn zlK5H^1_83-d0p2^Di%rB@Z45@psl~j4=Cj|8gDWlGZ~LD#xy(!%4=iLTBDT0THElv z*W&qPJbwTFE&V_}j4_C>{`y&Q7oI0cayLKl$3HyAS$ieVpUe)BQeDb(Yb_r>7+$Nt z&JS2?@m5KUwGO3ZwJp0mkD`eAV#WP&4=GjkuWX~qvh-U0WqzQo_e^fE&S6YRGO5%K z&yDfvcQi?|0w4@Sa$`_ZHk#}77yZCRy?FKVX`7Lk^4vN1p6AZ(@ciQVU-jOjdxM<` z+B|pG5(YulTrTH%+Y4OO-{c3Xg(?5Fy=(Q?`2myXcv*$vy4_yn`DSy@(aDkz9!!7=+d>cq zWox}jf0-X>>%GlpjkT^R5v{!)o?C0VKdySaD3cK&Ns=nCyjFjiA86~vS6}|AP*PpV lb0rnl*(-UzHHN$B{|h>gme%~p<+K0*002ovPDHLkV1hWR44nV~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pile_brick_side.png b/src/main/resources/assets/hbm/textures/blocks/pile_brick_side.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b1fe0d029bfcfcc06ef06318d4c6235bdf3384 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfFzDWw4#?J3+Cl#-)J18xMFaIQ;)~W6DIEH+GMW*rgOIcU61FO-r3TxtV=tO`GlcyC0d( XPKmt}&uN?i^cI7stDnm{r-UW|2i9)I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pile_brick_top.png b/src/main/resources/assets/hbm/textures/blocks/pile_brick_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1c077f2d425bb953b3e1d47ee30e0137418dba GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf_9KZy9hWm)v+{?fNWE9W)b@Tfbrc5B)Dy^m!lx=1E^ zPH5?v@jN!o?7pg^ap1KLDih{3CZ6+QI8Z2K{Nf!$gOgBpYvR63@02@(vRz$jjyVXO zdDF?-AlyHl=UD#h19$Z+dwyQ%Jb0_{`NsSEk0-qScfUFQPBZ(CX+qjJjn$3;9me44 L>gTe~DWM4fE!I~r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/waste_trinitite.0.png b/src/main/resources/assets/hbm/textures/blocks/waste_trinitite.0.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4868251f2194d79a6a2b5173e5920387253ecd GIT binary patch literal 894 zcmV-^1A+XBP)2UA=-&xXA=ce zr3hT3AR!835s5KXz(=Eq8ng*wBS?hcS%{IG*$}hGaZfWhJGV2lH?#BDow2a;5BSPY zSpWHAwJ^UxRaN9=Oug3RcodMPDXOYs7^hnc`vMed`0;D-~$ztW?3rvI@Q54zU{Ebe_q1kF8>~ybIrfE_)O*Xf? zh=M>#g`y|`2!epBYRIL5D2jwbpCpTrWSK`FdII?{+~+vedG~{BxUS3Pw_nF`E>|zVMSE%<0L_|0l%)S* zfI&aR3->v(`ZR;10ix^PN7r?}ys*Y&Prim1>>+3cX*nd06Rw;;jqAGjzK`$wy!hrC zmSxco4#@HhaWEJ_p)($d^t#{C@B3uwh&;=Q3m+=Da{e@77!rmd03B-)Ns@6|O9+4e z^;tC@k7*h(HRD@B;d!PKkoW0Ea%!4$H85)*_ zR4aJt^cr?+iKvWd&ovf z%bY_zPLHTJWhw!pXvp%3$1yAk&+{)plWR2`h$g6KjfpcFEEZrB)NoH=Lm8q_>Z051}7Fy;W!SS=Me+} zqi}>QR9074*&7ZRMm;`XI!(p0m}wqB*L9YExr#jF%zz}gv~-rWwKaku;Ko-Mu`4YK zdYOX<9%LNF#7RspGx2)?x9+Udu;wsLlbq}BP^(ti?%iYM+Mlfc`UR4f677YENJTXi zPM-S|$8m67cc1w6`93C>9FryqzPnDC?jl{g@}_W_ z4n?g-nCv1Dg3A^C7~bmk$zi#S2(pcs1f(?bZN|0h@%Kq)tICS zc}+uPf`!EoxO(XwR&L$|KxBfB+eJRuIz*HW*!6r49iB&)B_@+8YCg}__7ZLh^$Y{0Zko%)PhEn0_(@R|c={kd80FodW1U!1|31*w~Ts-&UexIVJ z1mh0PY8#QNa+mGKsR|>>Qh}AUFG>xt9UH%6# WDvO^Iz~__z0000P)=Yu$eCZ;%abUH^Y z9_RS^%UG7h+|(H)Ndmy@{tL3g*2-U;n*0dEFt99(*~ya(8HW*e><4UDORSgfVObWn zT8(2T-lNm*AcQiDi;J|H4o$ZTz|ztZwOS2TRhj?&2O{OQFG9y|kWCcWZEliH6aeT4 z0fH#9T`3dbBS}#PlP0#^;KkEt`TN^ztgPKdu&iw~O=GLN!Prx;Q)!fmC_Zk#NxR)a z)J!BH!J(5RM#pf@-xwIhKp1%e=8_<+grb2Ges@hW4ZV<@VM*NU*) z+T!rBR}iBDp6`LG$ECiwZc?};k|`>AZ(=GG^(7}+8(zjF~irn9}Z34rr5j9k0vQrur%K~r^d`8++p$Azn3?Vs)Q4=0c%1)NqumCY}+>ZOp(x+5u*JlPP0i&)fgT&dE?z_#6UySHEPXGwyPzq zdYQZb++l9&47P3a<;*3ldWl#(j?i*~kjA0h#ubDF2QEA8iiD6R4LG17fiwYy!hn^fBdr@dj^j9S>?G!Zc>aY) zxqa({yuH#U&vVj6Ov$hrO$H=Mg0AbBW{E7z$fg-ZO){U&X>UHs&v$N8tyB=sxd!8O zNWM_9^d`R_{z;M~EEWs0Gz0Y$>>9&ljKWqZBieMMNBr(WT1fg-uM;)08;#A%_>1MT}4$3I7{m& zcMm?vXR{f$+2W~}cDZ%^8sm6OqtT?*YSKAACi17~R?d7j$0}PWGfAcS5Xs;ep=&x) zU7}bt0MK#^Aq46|^5DoLiBm3ZU#54~LrRlLJRwU{0{4(O>!W;gb3b=l4py;7oc77d z(Xfc(0HNg=hJjF20BZFbp4UTH%1n|G^;Q+JzP^s3mihMkuXypT_X+v|cGae67Lclq zQ(LFmtYel;PEWc3w6~riS5pSz01@>2XqwKIE8B!&NXv0>`yI4`&RmJ{!Y;j@&u|#> z=*5d9Ny6ceH^|Z%_m4V=jrJDFVo2W)`02~f5JF)#o1<$Q-IFe7r|y3}3x%g&-lHO$ zyz=%n@_a$Ny@GP@x9hnfBwhb+PP!+oudSg71qFrktB>IMKCMQBK^QX4BMJpU6pgS= zhaduxv>tX42YIU1hWtmp1iJ_MG{KI|hmPxT#q}w~-9Ptl86-A3aKFV3{Sxu^uz_k8L3DJ z@d!v9dV>=Z2gC)5XCV?2R1IlJH(Bqlv-aAa8P9Ow!~=Y{FZ%xD^RO&40^qzQ(+Rzs zaNZ*YC@Ba;I2RBerpa-7TJiE~O_52&Vv%AdOB~0P*^GZyJ=TJ=4r3fbBqRtPKRg2k zv5?%ZcN`TdMXnHvn0cO4%@muqqg)6g9I29MDY0&3!gF`CC66?d2NOKKHOv!@+zvh2 zB>6FY%4%BiNmwzCsT2a?E zbzSr2pAEB2v+V`~AohoWh?vR1)y-@6onbT+&U)-LLGXMk?`WEarfC3J&T?WUD3X-u z=V$K)XB~x3Xzhqnl5up*GsW>y%4$2%H4|~-!9$u#A|F$f1-9=II*v(IN|HzlrHEWa z2%b0yZr%(G2g{T9m$U~*l1Z%dOu(UQ>Fj`bv)N;uq3;bp%|GCUsYqi@-S+g;h?Ih_ z{)%|9*Az)i6boVjW|}BxDe|PsiCn~YLq&akLDMu;ADu%Fe)JsAGroyC#$(N{GejOv z&rkUK^)+wH-FkDwV1yMyJvGdw;kv6JWW`UW2a>&<|8 zds#AiOVe6@`0y<;9alvzO+0YLT zl%yXFzs%lckth~fLZTIUu2DMh^_Atg$`L^j{rc=lIM|60JkA)hL}MK26oe3L?*|t1 zl-qU7vdWoj#qG97YEPNZ5UsJ~Sp)(O&hy~W5m_PF_y64}3e8cTP|i~ng5FHzg+xlp by6N~A3r%xnaO`j500000NkvXXu0mjfB;0S9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/waste_trinitite_red.1.png b/src/main/resources/assets/hbm/textures/blocks/waste_trinitite_red.1.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c38c244d6cf1e0f008f9175cbbf8b48945221f GIT binary patch literal 790 zcmV+x1L^#UP)>JRpL`k&*Q9whH ztyv-91%QX4BhUZ}0fG}d_QZ2N=gb)jqaR?C+A$WYc1`SduZng&& zc}$*agho=NDP^WPuTs9x)|}sXVyy_3!n%PG&+YY|7tMmvgPA;?H55^Z*!LaBuIG!J znDu(iZnvYVDhA_F2>$&0p1QNteapxBfg)3^k`yfkKVR+;t0Dpc&*lvm7Z+4j#aHh? zpiCknC3#TB80YW^LZLaK2ClCE;@B7lGvchrjw4K-r|Oo?X2Wi`dr5ruYegQ# z1V4QE=H#p+4zF7~P<-VkzlH%LHf?tuX`=BBclf zOdjUBrs_s?AaQ zma4X#KFUA{y!S`}cU4PuwEUQz0r2#vdt#|6bc7#aS*D2ES`r=d{8n&rS<&?lw4&<` zXRoiAN1Bh^A20XmaH2K?t1?AQ0;MOxv2%QS0?sHBAutBQSW)!@`?kl+iK?nNKbs>b zN#7cryJwbWh}u}vBme=e^St)Pf+YVxnuig291KIqEP)d9SeR8EHDcYk}<|McF#;tPd}!rx|@YX?*5*;IM@5`otOLBD5eKoXNiN5 z+O@c@LkVal^msVeBOSD@V}F0bpQqQPu|me<2-8}8-)9sL_~)|5T5#53j6)9{&y@vNNk)9iJg+dXP) z7={6|YHEtQ;bK*Cd3i~eWqkB|!Ol1o!e3__wzXy3Q~(?wACqMn+82I3$x!oQNM%|^ zVZ{4&#_%YjZ8h{A;t4NJB8+o{LBOL?$wuJOA32kI3yRVq>#aqLa9va!-nz}Q+~Nmd z=&5ao)`}mz1GEy(vJHlgPwx#`l?^>0Mb+Tp(;7HE|C^#T>`aTZ9ky+u?|7)LNPNXx zclL;5&1{h1YatCIWN(_%m>u&`NZWSo%~PIMQ=YpyhqnfVv8LS#>!#u1FFDfp>}<<; zFlICekihqebVL{`QmuJbO<61!0DSOsNmE(wzcyoAIX*rVtm|ljs@ziA2Dw-k7-y(! zLuoDlC(APOJVza!^gM~e~Pm^mkB z=XAYry=;(!*@#_d`EoPi@L&KUe0F!h*KbZ)<`sEi@w=Yhb$r#_2H^7xp=)6_Nsz6z z#5&+z?~>z_oVszK6?J2H@XDNVs2Rs0VW3|;HP3VAlLYAn(Y;XAj!+b{MDgTG@C*cj zB5!uAs+#L+$N5#kd-|sQ`1XKoy&(#HWNR!*?14b#I=+2-N}S$6(;y^G1ExvHXc(ap kzIZStNfk;duJe-r04Seom!!dZBme*a07*qoM6N<$f@x@U00000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/waste_trinitite_red.3.png b/src/main/resources/assets/hbm/textures/blocks/waste_trinitite_red.3.png new file mode 100644 index 0000000000000000000000000000000000000000..14794a073ee5642d3376596ca42423dba86cf5c2 GIT binary patch literal 784 zcmV+r1MmEaP)mM#+pb_So&VyW3UO)hr_30e*VXZ!g}R7FEUs_~6Lmgx-(%5YPff z3lkCEPe_1q^ju%pyu8^^W*V8#Q|#zaN>OD6uh%`!fp;EjJt7GS!n3DKFrY;9X0zv_ zOeu4N7!G(}4#%v}TxK~&34g7&$mJ{nf#q_^dcCG;8j{FRX9m4#poZZO0m{S!o5-UY&Qj$ai5c!B{3aClA zy&D)h$44J8ICh>S(>Na(f$ntV;EnyNi4+HYfqT(DJ&C&7uXOBRH z5CTfzq3LK^hYAyu4}85cq{{H~oe)M?)H%_gpFf{crMN$KGzZIKo+4U^yk}X@XpWY} zEN0hRMkZo`)8LtxIc;kZGYM_)Nkp^AHJJ#Jg*etU!xBtn`1 O0000 Date: Sun, 12 Jul 2026 18:05:52 +0300 Subject: [PATCH 078/107] =?UTF-8?q?=D0=BD=D1=83=20=D1=8F=20=D0=BC=D0=B0?= =?UTF-8?q?=D0=B3=20=D0=B8=20=D0=BA=D0=BE=D0=BB=D0=B4=D1=83=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/ru_RU.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 19b317efb..4cbcd6dcd 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1687,11 +1687,11 @@ item.ammo_standard.g10_explosive.name=Патрон 10 калибра (Разры item.ammo_standard.g12.name=Патрон 12 калибра (Картечь) item.ammo_standard.g12_anthrax.name=Патрон 12 калибра (Сибирская язва) item.ammo_standard.g12_bp.name=Патрон 12 калибра (Картечь на дымном порохе) -item.ammo_standard.g12_bp_magnum.name=Патрон 12 калибра (Картечь-магнум на дымном порохе) +item.ammo_standard.g12_bp_magnum.name=Патрон 12 калибра (Картечь магнум на дымном порохе) item.ammo_standard.g12_bp_slug.name=Патрон 12 калибра (Пуля на дымном порохе) item.ammo_standard.g12_explosive.name=Патрон 12 калибра (Разрывной) item.ammo_standard.g12_flechette.name=Патрон 12 калибра (Флешетты) -item.ammo_standard.g12_magnum.name=Патрон 12 калибра (Картечь-магнум) +item.ammo_standard.g12_magnum.name=Патрон 12 калибра (Картечь магнум) item.ammo_standard.g12_phosphorus.name=Патрон 12 калибра (Зажигательный) item.ammo_standard.g12_slug.name=Патрон 12 калибра (Пуля) item.ammo_standard.g26_flare.name=26мм сигнальная ракета From 88d0c68a3873b7f6d2aaaa414d9472c7a56a5821 Mon Sep 17 00:00:00 2001 From: TheVitya2127 Date: Sun, 12 Jul 2026 19:15:01 +0400 Subject: [PATCH 079/107] Robox Players will Cry --- .../hbm/textures/blocks/barrel_antimatter.png | Bin 1205 -> 630 bytes .../hbm/textures/blocks/barrel_plastic.png | Bin 1425 -> 1325 bytes .../hbm/textures/blocks/barrel_steel.png | Bin 1082 -> 1038 bytes .../hbm/textures/blocks/barrel_tcalloy.png | Bin 1076 -> 1040 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/blocks/barrel_antimatter.png b/src/main/resources/assets/hbm/textures/blocks/barrel_antimatter.png index ed6b74202b6f9cc20ddef6257f08dd2102261140..87e09bb1df8bb7873a8a1ce8d4da38c3a31846f0 100644 GIT binary patch delta 616 zcmV-u0+;=@3HAh#8Gi-<00374`G)`i00DDSM?wIu&K&6g00J;cL_t(&f$f+vOXNTl z$NyPlCs+-xMPS2KZsBbTYs-Tx?;vg9u(HVqP$Y<7;1I0ccDe3Au=NWh+a%>~A-KnY zg;)x?BFyZ@U3Dfy!duL*%4Gh-%zJtB-b^fLa(sH8>yFXk>VM+Q($U*hCdtO}hnl^w zUS+)wol2ts9PD4iVIekO4)J)uz0}?tct-l#4VXQ|m^~!;H%svC`|qW;sa};zAyh1= znEdGECxAOR9*`wZ805v`9M4Q&y8(00-62bg7|+Hr99DQ1_+q42rE&;~FnEpdw5eVd zgAgh_mnBc7EPu1;X%oFF2AjC>+*TfzvdKrDR@K*Tz+2fwv`zJ@XjMI6UWrxmw%DvX z`bH|Tn5<5{DpuWRo4T=8&MB1X9PD4?@qQbdFNbhgh;?gkJU`E(o$dhL-2uA09&T?! ztW(>%{PS0N4`fNKb!u!vZ;J<|0pnrwoh7l-UjqR(eP=5VwJIMq{pYI06tU|%r#FSX{rJA0Gsa4toO6su zBkfyTlgJxczuyM{^m;u2z;rsrYlA3a`M#fv#RFvn1ZkR*{Sx+~mxse)sWS)y03iJ( zY+&wn0AZL+CIA4}b>(}`dE*OHW&Mv5KsnxB*OkwU@2O&Q&Si`TL9lWYQw|}SS)wS) zf#oa|MG?vDBan3 CPAcgD literal 1205 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WChB(1o(uw*45S3)YKFd6l7;-$Hm2^rKN?1h1uHL9xry>5TkW4*ZOe2?YSzC zV?_=pOPx2z>zbIDY)>})zbxf*0+Qa;U0{5~)3N`v43jg?0W?e}Du9muiTmt}FS zDPUKc$-kw!#>U1cN}RH?vQkr1BO)UHuP8W_XY+q~zM-LEQ&ZFKbko?_*u=!d+}zys z^z{E*YyYn;{j)gR+uJ)QCnqyAGb$?TMoZAo1sSKyT|+}d&CSi@J-%U&SIyde8^u%xT(tj_?+Ma5*H_Pf&naj2m(>%FBlnqK&8jQ?faV8+!kdcW&5J*P>ab`OU zSUd;F27#Mpj0`V;sSie@+seQIl$^lMzyefjU}S8-xBy}<$WGP;5VNKM*&x6KG?@vk zGRV>b$b#xJgoJt9ZiBEbR~R<{Q}Iks7sn6}@3&JtgAW-Qmt8Xb%g!e!_k8x-m!`%l%aySCCc_49zU8NVtvd~U z4nC8V`c_p_=dZw#sczV2t7u{*CD+^2)9deW%d;oZe@2f>dvfq)$cHQl0i*)NGF`a{~1uf1p2{(QRzq&(-K@IB9W@7|_6 zvnv6WZ@51pXvrNHoB7-#3LxFAyG5q(1-s6_AK$QLvczE#naQe4r-b(%IxY#)>~oNJ zp+@(HZXY0uF z_T$T+EA=zS=I>iED{+rm^n~N=29vl~<~u!#{h_hC<9Pk!t%t%sU%kNdb?M62Hg*jY zdA_{#;>avXvakahz3N%&LvCYnKK8A0yr1lJ7)}4I2$=gu*N{8@?YHUI{1@ha+T2>_ w?i3~d&uQ_!<~O>DbtyJ~#4CO@xB5Mojw}7YzI$1-1t>Z_UHx3vIVCg!08}jh00000 diff --git a/src/main/resources/assets/hbm/textures/blocks/barrel_plastic.png b/src/main/resources/assets/hbm/textures/blocks/barrel_plastic.png index 675349a397071707608c337269bdadeba157d80b..75a4b4ed4a89d6fdf6e169f94adf8e00a2569d2d 100644 GIT binary patch delta 1317 zcmV+=1={+N3#|%}8Gi-<00374`G)`i00DDSM?wIu&K&6g00ierL_t(&f$f+-kK9BU z#(y*RdTigWvn$w0p&(lF0ZyU}5(0@LZ3+sYi$p=6GE}6aMWTqrH-NMh6sag9OzMSN0-k?xUJdm2Bx_dfGJ?>q0TV1FQvkB@Cp6aa)_NLiMI zVThEHwr$Z`W345QW308TKDkShBm_agWHO;?8iGL4G!0cw>q|vVUAINsI*q47`ed zH-!+CWl33Iz*{3gR zfIQDRIyxdvQ=%v$&vyr+yPX$8vfXZIn&#~b5Pw22pU-LAmMDrS%aUl{9JY^ToAm*Uq<* z{~7#ScOKBTElMfo^Ep8f5XZ4QC9^CeO;fbi&evn&ORY6w7^0MNqj6Cb#BuEA8l@Cr z7=P}2_qh1t^RIriV3`C*MDgt0`1|6;i*8oWPVu}6`Q`-ASB!}-zP|gbold9BW;2X2 zBuTSu#>AJ0qi_^OZdB;oqcMgs3<-k3`EF!<>53$s!hAC3X*^_tmiMt@nBNGYkR3az#CU=S$A#+On`!mzs;MPcN+ zfRvIrj-BE-j;Sic==g2h^77?NJkLW)i801q?Y7&k8xg9iqN*y!#+QA1JkKNF<<5Wo zk-c88F~+!_JT|`6WmoxHYXsfBwI8th$_FsUkYyQTmKVRq#Mu$K3hOMjr7 zI`cedyGbc`-NB*t2Hy`E6@T&mhb)&%q?F9(bDE|lNoH;eOw*M0dd+sbrD+=Kx*io@ zV!NM0`a#Kefpd~AKo8+)BX?PZe+(F ze+IxuH*Ns%*VCu4TJh(@`|l*MH-Ck=dHbI2gNIiH?D6FBqtRxYO~=AFO9B_1wuiA!AK b5@WzWruag(&Psj2Dd=@}RpsH>|7WG#-X*qBncJ+paFTEotqwgZ{XdsFIn zWVP&#E#DB7vs6-2Qc6lnLP8>;YIAzyuHxR~rTr(%CY-F8bUL^FU}5)>)cPHX)msXC zj^=e7tekwdeB!CH38!+~52QEkmXni9uH9DLd#rB8rIvZuYo}jmnsc>g+WGv>Lq$DD zTj$^CUUt8G>HYSFx2vX{&FeT+KJj$-(t8tDJ?U9?ziH03;=bdms;Wgj$LeQZ>RNJl z^4e!T%N{h$x>7pfWI@-F+UXbD7vAbzd?%@9YeCoHhS^u@W?Yn&mCb0{UC@1`dg{5V zspm@jPZV|^&F?&{p`qcMz96SvD9-y1o?;lWVtEO+Gte)#I9}=bPtVi!5FfUbreCb8%7k zQJdgK&!pL&iL)FdI;{e08fRY#D_H5DvB<*00vH8A;28O>0!USt1o;L3A27f$`S6NY zKxc3kctjR6Fz_7$VMb96uLhu?WQl7;NpOBzNqJ&XDnmeGW?qS&pKFMMsh**pp^-47 zdkIj{j?@UxG*3@01`Z&Hl|hP;m4Ok+@&aOMC>xX{H5i$};!HrcAtMumAdrp%;>>my zuy_uT4FaFa7#UswQ!b1~x0QhbC^>kOkFcXaLF|49)fWGDR0I-v_F*^mK6y@$h~-<#zEU2a#jv)h3#(y`aL&mdqo- z%Cs;eT5##tFhSQN+yVhz8XciIALB&-RZTCIKVu;~jeY(X^Ovm80x*|0-Jcl{iZ=7phI!haYer-?=$U9Gbw^WX1 zYMK3tt8%;gC%H|%#S+i(;lPhSZ?xK01(kjOSazvuQp94A^{+WtDXK&7^__b#9b5HNyyyunu zKnbr~TMu>5y3MmE<>Cc#_FbQ|Uc6xbXxiP@U?LIrjr-@8x2+K-6}JwY*#0g0*MdK7 zuFW&I-n06>IPg{;8&E>=aqQECCp)&4omiCkhPUUT zH+ES1d*=fN`N*{|O0Je>q!UaOk_< RzHAOkP@b-SF6*2UngDEHkVyal diff --git a/src/main/resources/assets/hbm/textures/blocks/barrel_steel.png b/src/main/resources/assets/hbm/textures/blocks/barrel_steel.png index 590b2e695be91629ce28912b3476077fa41138cc..a2fd66866a922709799c0f1cb885373712e1067c 100644 GIT binary patch delta 1027 zcmV+e1pNED2#yGl8Gi-<00374`G)`i00DDSM?wIu&K&6g00YQLL_t(&f$f;hPAfMU zh97_9`B4Z2@z=uw1Y2~JC3|iH38_*xm3kK_*HNhp7TusqUG@T4u?MzLsS+F|LIe`> zV~^bh9UpQIi!+fp9aVW(lksE6pZ)pu*ou-mK0fx&x$s*=0DpLVe8d>T)6)}KmhtfL z!0qiV2L}g~;m^*_RGI$hvH>{fxWE0IPj`1jk)~d+Ga8Ms){-PK07^OPS{M$8rTMZd z9e{|CTg#6>{fu)Cr4%B9_a3Db)>=e_-+ujNCcbok%2sgBF>+-m|*8O08BSNfOdD zB~4TA?(Pr~qJK!^y)VtbdjLfa7k?%qBuN6m`T02)7Z-T%sn_c`=SuTsRXT;V)=VY_ zr4*yl2;kp*PT1eyCyFA5!(k{Z%fEX7MW;jrtu;{;;hZB$5}b2bYw_NP+@6Imqw+O? zEX%OgVvOPP@)BbVgTVk1VR3O0rBra3S@?Giz*cf_~Ks>16yj)~(K=Nxeylcp(A z6p^MW&(F_{$775!hzQ0QfJ*TKFV+~x)4p9amSq`n9Am8wkynY=ufaHuSy)&IkpuL4 zy-;S1p=!Lg)`l;`BArH~Q2+{OC_V+M#!DQ>rjCNe_O7*_YP>3Zw7tFEE>`yI+k)|UOq!1p|c>UUH)k?rm60kE^P1HjGA z4PORSMXAHXLtk_rrUNK+b#+zQnb5CC`F!N$WU8>$Y5`PwCNz8=b$B_n1MKeZhWDLL z=eu|8TQ$?oT$Q9@I^TD9cf<4R_f?hdbUGo&Tdmfci@3@u6r82qZhQFJh1%_QCEce` x*axnzu2^4RpBn8dkNjM7%{A9tbInx+{R3l6yh&^&N_zkR002ovPDHLkV1ifG`Yr$f literal 1082 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCili2l#}z*45S3)YKFd6l7;-$Hm2^rKN?1h1uHLW+f*CdwYcW`6NX}L#=Cay+Oua* zLqkJGMuwrGVN+An&Ye5=@87?7@7}|Q4{zSQIWjWR*VotI-#<4uHz+75At6CePfuT8 z-@?Me%*@Q%+S$H&Lr-QC&Q*}=gfBqYSr($dSz%frJXIXO8iD=RuWIy^i) zFfeezf(5CmsRjlhuLD6{eB>)2+ zZUCmDU7jwEAs*guC&v~qGLUGE?_Mo>L?a+0aLe7dOq-;b7rprAy!PM!`&WLL8T+p5 zu)e(dUGe00%VM848PG$Vd*qSPCxJX3my6ojwv$oyc-0?=q?TU2O-^Rz^ zV$Z)6xar!n!u-a$UU`=7PzQlqu{^2fgkA~rkjc7k*| zU6=j)=c@(JuQZL_9fDgEDz}&Kv#%<78&D>w{K|YroJpMo+u{3W6Jw8b1nqdWqwhJ7 z&H1;2V1t%j-JH8Qd*3Of3mb9bGUTx`WBy({jY z@8vBCB?}*4=$fql_~+3I-^mfj{}*0M{b(8AJ3l@4Y3iZ$Qmd$Mh%FIU8v#+S;Z72ApN9pmS1|I0q{NBtG1 z--l!3-~9~*R(qLcyY3!Q Tn!f)CD84;i{an^LB{Ts5NV2}3 diff --git a/src/main/resources/assets/hbm/textures/blocks/barrel_tcalloy.png b/src/main/resources/assets/hbm/textures/blocks/barrel_tcalloy.png index 3a74dfde77b53cb3bb27beb49c487c372b7295dd..5f5fee71f788399c28f507617b083acff86867b6 100644 GIT binary patch delta 1029 zcmV+g1p5252#^Sn8Gi-<00374`G)`i00DDSM?wIu&K&6g00YWNL_t(&f$f+*Pa{Vd z$A9ze?2C-Cc@sGbIJu01DCzkSCtZgq`2wjaPgh3QpRS9PBK3U)dWg~?PLbdu3$XF~ z%+91BJK#GC))HYA`QO;y`R#h1ndkY>%qmLi_s^fbb1wWA5q|)>-7dx$Zf|eNvW%OX z8!j#`*xTEq4FAi!cdAT(blCu$b6j2g#n;PAqDWJ(*BOmQSZhg=7yzXlbuA2s!_s_N zl@35e$gSn4AGdMNp_D>I@ZO`8!di=n@W-F0Gx4SSQ}zbu9Q}SD?>(!ltJG>Wk|ZHb zQ_?i$^70Z9A%BWA-uu%0vjfeRlIIq!H9I>yY;SJ|mnjNWYt6#K!c6?L2XJ+DMYFlY<=+?d`+Wc=6NA>8 zEX(NidgQs~hgYv=;-5W$v$M0XVirCxBHvB_`PVjio|op!O1=N^!S{MSM1+lv4LY3; zD=RCA$ba27;OdI;cub?wz&VF8hAQ!D|M1YmbOC+4B0knu6<)`2OdQ8J=ZNE&G);-3 zh%`+Z3drzFj;l%QE6P##$R9uM)2xf^i(Pu&@v!2k3M< zq0JaW)p%{K4LidkokpWk019U)wgOe-C5~hAJbw>4Hy8}UD8z9bR>_AZIPQ*;`P?n*3@FLwzd{dOzn1?X0sWrt0<%@@oN9@ z&?}|Fizay7$_f=+Rrqk_?ZJUxY&51CZ@XQ7{rIu`LG?dWIFW6=ehomY)dKELUdzkN zFVm|MQg06qe9?KB4xrGN^YhBignpPdzkYrCG}ZWKe;#kSa6jsBKk}_sD_p<6 zzJ7tOJxw#cnX8gCOy~P!vr%Q~+io|w&71xGM~nEj+kKJFJw?G;em*+#@VyJYKRT+U z`xFZ6z?buL78{MJg01q%&o$RvbImo^TvgCNNR_`fX%k0E00000NkvXXu0mjfR}uF* literal 1076 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCili1o(uwuHU(H?e^^pSFfJ4Y+3)znbQ|8Y@awWucBi1yxA>n&F!7-lc!GZ z?(OdF@0l@cdTM_D`t|GAu3fus-MS4MHmq5*=D>jiJ9g~Ywr$(??c1kJnUa#1w`vG&E#nWF+O}Y~H(f=gyt`_wV1kckkiDhc|ED+%;uNT}MYlSJ%wNi|4Ia(cIfR zarW%^%*=$Wtjyx#^uofNva;gZ+Omd*+V=K}rlyj*y29$}*8cvil9KAy*2?DQDf8yd zUb?hr+O&>IlbU*Z3=Ba227<_dx?CXTQWE4B{GW2bPfk$L90|Vb-5N14{ zzaj-FC|TkfQ4*Y=R#Ki=l*$m0n3-3i=jR%tV5(=RXJ{nM=w1R;v?DdbGtJXei-7~k zVP%kFWMyCkvb=y;8p;Mmn+78@SeyySHe_UC5CqauK%Cjm0v68!vOypLh(Y>cG`g(} z48W+Lz|Oz|RAXRdY{0kxVlGGz>jH>b(|~LcU;>)N1XdYjX#r$Gbs0j!^5*hcQ%`Q^ zjtAPe!_&nv#KZgT#|HS1P|5=6q9X#~$2cJ*b<(3Uo=Bt8Y N+tbz0Wt~$(69AdV)6f6_ From e3653b819b6be39830ef067e8317d3c716d061cb Mon Sep 17 00:00:00 2001 From: TheVitya2127 Date: Sun, 12 Jul 2026 19:16:17 +0400 Subject: [PATCH 080/107] The b --- .../assets/hbm/models/blocks/barrel.obj | 135 +++++++++--------- 1 file changed, 66 insertions(+), 69 deletions(-) diff --git a/src/main/resources/assets/hbm/models/blocks/barrel.obj b/src/main/resources/assets/hbm/models/blocks/barrel.obj index a9f9119f4..4a3e6f1d9 100644 --- a/src/main/resources/assets/hbm/models/blocks/barrel.obj +++ b/src/main/resources/assets/hbm/models/blocks/barrel.obj @@ -1,50 +1,6 @@ -# Blender v2.82 (sub 7) OBJ File: 'barrel.blend' +# Blender 5.1.2 # www.blender.org mtllib barrel.mtl -o Connector -v 0.500000 0.687500 0.187500 -v 0.500000 0.312500 -0.187500 -v 0.500000 0.687500 -0.187500 -v 0.375000 0.312500 -0.187500 -v 0.375000 0.687500 0.187500 -v 0.375000 0.687500 -0.187500 -v 0.375000 0.312500 0.187500 -v 0.500000 0.312500 0.187500 -vt 0.145833 0.270833 -vt 0.020833 0.395833 -vt 0.020833 0.270833 -vt 0.020833 0.375000 -vt 0.000000 0.250000 -vt 0.020833 0.250000 -vt 0.166667 0.395833 -vt 0.041667 0.416667 -vt 0.041667 0.395833 -vt 0.145833 0.291667 -vt 0.166667 0.416667 -vt 0.145833 0.416667 -vt 0.000000 0.270833 -vt 0.125000 0.250000 -vt 0.125000 0.270833 -vt 0.145833 0.395833 -vt -0.000000 0.375000 -vt 0.166667 0.291667 -vn 1.0000 0.0000 0.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 1.0000 -0.0000 -vn 0.0000 -0.0000 -1.0000 -vn 0.0000 -1.0000 0.0000 -usemtl Default_OBJ -s 1 -f 1/1/1 2/2/1 3/3/1 -f 1/4/2 7/5/2 8/6/2 -f 3/7/3 5/8/3 1/9/3 -f 2/10/4 6/11/4 3/12/4 -f 8/13/5 4/14/5 2/15/5 -f 1/1/1 8/16/1 2/2/1 -f 1/4/2 5/17/2 7/5/2 -f 3/7/3 6/11/3 5/8/3 -f 2/10/4 4/18/4 6/11/4 -f 8/13/5 7/5/5 4/14/5 o Barrel v 0.375000 1.000000 0.375000 v 0.375000 0.000000 0.375000 @@ -54,6 +10,12 @@ v -0.375000 0.000000 0.375000 v -0.375000 1.000000 -0.375000 v -0.375000 -0.000000 -0.375000 v 0.375000 1.000000 -0.375000 +vn 1.0000 -0.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 +vn -0.0000 1.0000 -0.0000 vt 0.000000 0.750000 vt 0.000000 0.416667 vt 0.250000 0.416667 @@ -63,32 +25,67 @@ vt 1.000000 0.416667 vt 0.500000 0.750000 vt 0.500000 0.416667 vt 0.250000 0.750000 -vt 0.750000 0.750000 vt 0.750000 1.000000 vt 0.500000 1.000000 -vt 0.500000 0.750000 -vt 0.500000 1.000000 vt 0.250000 1.000000 vt 1.000000 0.750000 -vt 0.500000 0.750000 -vt 0.250000 0.750000 -vn 1.0000 0.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 -vn 0.0000 1.0000 -0.0000 -usemtl Default_OBJ s 1 -f 9/19/6 10/20/6 11/21/6 -f 12/22/7 13/23/7 10/24/7 -f 14/25/8 15/26/8 13/23/8 -f 16/27/9 11/21/9 15/26/9 -f 10/28/10 13/29/10 15/30/10 -f 12/31/11 9/32/11 16/33/11 -f 16/27/6 9/19/6 11/21/6 -f 9/34/7 12/22/7 10/24/7 -f 12/22/8 14/25/8 13/23/8 -f 14/25/9 16/27/9 15/26/9 -f 11/35/10 10/28/10 15/30/10 -f 14/36/11 12/31/11 16/33/11 +usemtl m_2f3dbca4-45a7-429b-31df-58e8185a2095 +f 1/1/1 2/2/1 3/3/1 +f 4/4/2 5/5/2 2/6/2 +f 6/7/3 7/8/3 5/5/3 +f 8/9/4 3/3/4 7/8/4 +f 2/4/5 5/10/5 7/11/5 +f 4/7/6 1/11/6 8/12/6 +f 8/9/1 1/1/1 3/3/1 +f 1/13/2 4/4/2 2/6/2 +f 4/4/3 6/7/3 5/5/3 +f 6/7/4 8/9/4 7/8/4 +f 3/7/5 2/4/5 7/11/5 +f 6/9/6 4/7/6 8/12/6 +o Connector +v 0.500000 0.687500 0.187500 +v 0.500000 0.312500 -0.187500 +v 0.500000 0.687500 -0.187500 +v 0.375000 0.312500 0.187500 +v 0.500000 0.312500 0.187500 +v 0.375000 0.687500 0.187500 +v 0.375000 0.687500 -0.187500 +v 0.375000 0.312500 -0.187500 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -1.0000 -0.0000 +vt 0.041667 0.375000 +vt 0.166667 0.250000 +vt 0.166667 0.375000 +vt 0.041666 0.375000 +vt 0.000000 0.250000 +vt 0.041666 0.250000 +vt 0.166667 0.375000 +vt 0.041667 0.416667 +vt 0.041667 0.375000 +vt 0.166666 0.250000 +vt 0.208334 0.375000 +vt 0.166666 0.375000 +vt 0.041667 0.250000 +vt 0.166667 0.208333 +vt 0.166667 0.250000 +vt 0.041667 0.250000 +vt 0.000000 0.375000 +vt 0.166667 0.416667 +vt 0.208334 0.250000 +vt 0.041667 0.208333 +s 1 +usemtl m_2f3dbca4-45a7-429b-31df-58e8185a2095 +f 9/14/7 10/15/7 11/16/7 +f 9/17/8 12/18/8 13/19/8 +f 11/20/9 14/21/9 9/22/9 +f 10/23/10 15/24/10 11/25/10 +f 13/26/11 16/27/11 10/28/11 +f 9/14/7 13/29/7 10/15/7 +f 9/17/8 14/30/8 12/18/8 +f 11/20/9 15/31/9 14/21/9 +f 10/23/10 16/32/10 15/24/10 +f 13/26/11 12/33/11 16/27/11 From 4ba77e96de30355f53ea05a44d2110d051cd938c Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 13 Jul 2026 14:58:01 +0200 Subject: [PATCH 081/107] fried dough balls. of octopus. --- changelog | 1 + .../com/hbm/blocks/generic/BlockWand.java | 21 ++--------- .../hbm/blocks/generic/BlockWandTandem.java | 2 + .../java/com/hbm/crafting/ToolRecipes.java | 1 - .../hbm/inventory/recipes/MachineRecipes.java | 3 -- src/main/java/com/hbm/items/ModItems.java | 37 +------------------ .../com/hbm/items/machine/ItemBattery.java | 21 +---------- .../com/hbm/items/tool/ItemAnchorRemote.java | 18 ++------- .../java/com/hbm/main/CraftingManager.java | 5 +-- src/main/java/com/hbm/main/MainRegistry.java | 4 ++ .../com/hbm/world/gen/nbt/NBTStructure.java | 30 ++++++++++++--- 11 files changed, 45 insertions(+), 98 deletions(-) diff --git a/changelog b/changelog index ff72aae47..67749c28e 100644 --- a/changelog +++ b/changelog @@ -4,6 +4,7 @@ * Each trinitite ore block now has four randomized texture variants * Trinitite ores now spawn fewer particles * The radiation effect caused by walking on trinitite ore is now much shorter but more intense to compensate +* Finally removed the old terra drill items after being deprecated for almost a year ## Fixed * Fixed burner press GUI offsets being incorrect diff --git a/src/main/java/com/hbm/blocks/generic/BlockWand.java b/src/main/java/com/hbm/blocks/generic/BlockWand.java index c25c390eb..8fbc8ae18 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWand.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWand.java @@ -19,33 +19,20 @@ public class BlockWand extends Block { setBlockBounds(1F/16F, 1F/16F, 1F/16F, 15F/16F, 15F/16F, 15F/16F); } - @Override - public boolean isOpaqueCube() { - return false; - } + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - @Override - public boolean renderAsNormalBlock() { - return false; - } + @Override public int getRenderType() { return renderID; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { return null; } - public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - - @Override - public int getRenderType() { - return renderID; - } - @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { Block block = world.getBlock(x, y, z); - return block != this; } - } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java b/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java index 2a9342454..b512adefc 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java @@ -9,6 +9,7 @@ import com.hbm.blocks.IBlockSideRotation; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; +import com.hbm.interfaces.NotableComments; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -73,6 +74,7 @@ import net.minecraftforge.common.util.ForgeDirection; * * @author hbm, Mellow */ +@NotableComments public class BlockWandTandem extends BlockContainer implements IBlockSideRotation, INBTBlockTransformable, IGUIProvider, ILookOverlay { private IIcon iconTop; diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index abe8c9dec..d54702964 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -62,7 +62,6 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.elec_pickaxe, 1), new Object[] { "RDM", " PB", " P ", 'P', ANY_PLASTIC.ingot(), 'D', DURA.ingot(), 'R', DURA.bolt(), 'M', ModItems.motor, 'B', EnumBatteryPack.BATTERY_LEAD.stack() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.elec_axe, 1), new Object[] { " DP", "RRM", " PB", 'P', ANY_PLASTIC.ingot(), 'D', DURA.ingot(), 'R', DURA.bolt(), 'M', ModItems.motor, 'B', EnumBatteryPack.BATTERY_LEAD.stack() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.elec_shovel, 1), new Object[] { " P", "RRM", " B", 'P', ANY_PLASTIC.ingot(), 'D', DURA.ingot(), 'R', DURA.bolt(), 'M', ModItems.motor, 'B', EnumBatteryPack.BATTERY_LEAD.stack() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.centri_stick, 1), new Object[] { ModItems.centrifuge_element, ModItems.energy_core, KEY_STICK }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.smashing_hammer, 1), new Object[] { "STS", "SPS", " P ", 'S', STEEL.block(), 'T', W.block(), 'P', ANY_PLASTIC.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.meteorite_sword, 1), new Object[] { " B", "GB ", "SG ", 'B', ModItems.blade_meteorite, 'G', GOLD.plate(), 'S', KEY_STICK }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.dwarven_pickaxe, 1), new Object[] { "CIC", " S ", " S ", 'C', CU.ingot(), 'I', IRON.ingot(), 'S', KEY_STICK }); diff --git a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java index e578f6fee..939647898 100644 --- a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java @@ -47,9 +47,6 @@ public class MachineRecipes { public ArrayList getBatteries() { ArrayList fuels = new ArrayList(); - fuels.add(new ItemStack(ModItems.battery_potato)); - fuels.add(new ItemStack(ModItems.battery_potatos)); - fuels.add(new ItemStack(ModItems.energy_core)); for(EnumBatteryPack num : EnumBatteryPack.values()) fuels.add(new ItemStack(ModItems.battery_pack, 1, num.ordinal())); for(EnumBatterySC num : EnumBatterySC.values()) fuels.add(new ItemStack(ModItems.battery_sc, 1, num.ordinal())); fuels.add(new ItemStack(ModItems.battery_creative)); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index f39c41fda..f44a125be 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1547,7 +1547,6 @@ public class ModItems { public static Item battery_potatos; public static Item hev_battery; public static Item fusion_core; - @Deprecated public static Item energy_core; public static Item fuse; //by using these in crafting table recipes, i'm running the risk of making my recipes too greg-ian (which i don't like) //in the event that i forget about the meaning of the word "sparingly", please throw a brick at my head @@ -1793,9 +1792,6 @@ public class ModItems { public static Item starmetal_hoe; public static Item smashing_hammer; public static Item centri_stick; - public static Item drax; - public static Item drax_mk2; - public static Item drax_mk3; public static Item bismuth_pickaxe; public static Item bismuth_axe; public static Item volcanic_pickaxe; @@ -3704,7 +3700,6 @@ public class ModItems { battery_potatos = new ItemPotatos(500000, 0, 100).setUnlocalizedName("battery_potatos").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_potatos"); hev_battery = new ItemFusionCore(150000).setUnlocalizedName("hev_battery").setMaxStackSize(4).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":hev_battery"); fusion_core = new ItemFusionCore(2500000).setUnlocalizedName("fusion_core").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fusion_core"); - energy_core = new ItemBattery(10000000, 0, 1000).setUnlocalizedName("energy_core").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":energy_core"); fuse = new ItemCustomLore().setUnlocalizedName("fuse").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fuse"); screwdriver = new ItemTooling(ToolType.SCREWDRIVER, 100).setUnlocalizedName("screwdriver"); screwdriver_desh = new ItemTooling(ToolType.SCREWDRIVER, 0).setUnlocalizedName("screwdriver_desh"); @@ -4133,31 +4128,6 @@ public class ModItems { .addAbility(IToolHarvestAbility.CENTRIFUGE, 0).setMaxDamage(50).setUnlocalizedName("centri_stick").setTextureName(RefStrings.MODID + ":centri_stick"); smashing_hammer = new ItemToolAbility(12F, -0.1, MainRegistry.tMatSteel, EnumToolType.MINER) .addAbility(IToolHarvestAbility.SHREDDER, 0).setMaxDamage(2500).setUnlocalizedName("smashing_hammer").setTextureName(RefStrings.MODID + ":smashing_hammer"); - drax = new ItemToolAbilityPower(10F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 500000000, 100000, 5000) - .addAbility(IToolHarvestAbility.SMELTER, 0) - .addAbility(IToolHarvestAbility.SHREDDER, 0) - .addAbility(IToolHarvestAbility.LUCK, 1) - .addAbility(IToolAreaAbility.HAMMER, 1) - .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) - .addAbility(IToolAreaAbility.RECURSION, 2).setUnlocalizedName("drax").setCreativeTab(null).setTextureName(RefStrings.MODID + ":drax"); - drax_mk2 = new ItemToolAbilityPower(15F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 1000000000, 250000, 7500) - .addAbility(IToolHarvestAbility.SMELTER, 0) - .addAbility(IToolHarvestAbility.SHREDDER, 0) - .addAbility(IToolHarvestAbility.CENTRIFUGE, 0) - .addAbility(IToolHarvestAbility.LUCK, 2) - .addAbility(IToolAreaAbility.HAMMER, 2) - .addAbility(IToolAreaAbility.HAMMER_FLAT, 2) - .addAbility(IToolAreaAbility.RECURSION, 4).setUnlocalizedName("drax_mk2").setCreativeTab(null).setTextureName(RefStrings.MODID + ":drax_mk2"); - drax_mk3 = new ItemToolAbilityPower(20F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 2500000000L, 500000, 10000) - .addAbility(IToolHarvestAbility.SMELTER, 0) - .addAbility(IToolHarvestAbility.SHREDDER, 0) - .addAbility(IToolHarvestAbility.CENTRIFUGE, 0) - .addAbility(IToolHarvestAbility.CRYSTALLIZER, 0) - .addAbility(IToolHarvestAbility.SILK, 0) - .addAbility(IToolHarvestAbility.LUCK, 3) - .addAbility(IToolAreaAbility.HAMMER, 3) - .addAbility(IToolAreaAbility.HAMMER_FLAT, 3) - .addAbility(IToolAreaAbility.RECURSION, 5).setUnlocalizedName("drax_mk3").setCreativeTab(null).setTextureName(RefStrings.MODID + ":drax_mk3"); ToolMaterial matBismuth = EnumHelper.addToolMaterial("HBM_BISMUTH", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.ingot_bismuth)); bismuth_pickaxe = new ItemToolAbility(15F, 0, matBismuth, EnumToolType.MINER) @@ -5173,7 +5143,6 @@ public class ModItems { GameRegistry.registerItem(battery_potatos, battery_potatos.getUnlocalizedName()); GameRegistry.registerItem(hev_battery, hev_battery.getUnlocalizedName()); GameRegistry.registerItem(fusion_core, fusion_core.getUnlocalizedName()); - GameRegistry.registerItem(energy_core, energy_core.getUnlocalizedName()); //Folders GameRegistry.registerItem(blueprints, blueprints.getUnlocalizedName()); @@ -5929,9 +5898,6 @@ public class ModItems { GameRegistry.registerItem(dnt_sword, dnt_sword.getUnlocalizedName()); GameRegistry.registerItem(smashing_hammer, smashing_hammer.getUnlocalizedName()); GameRegistry.registerItem(centri_stick, centri_stick.getUnlocalizedName()); - GameRegistry.registerItem(drax, drax.getUnlocalizedName()); - GameRegistry.registerItem(drax_mk2, drax_mk2.getUnlocalizedName()); - GameRegistry.registerItem(drax_mk3, drax_mk3.getUnlocalizedName()); GameRegistry.registerItem(bismuth_pickaxe, bismuth_pickaxe.getUnlocalizedName()); GameRegistry.registerItem(bismuth_axe, bismuth_axe.getUnlocalizedName()); GameRegistry.registerItem(volcanic_pickaxe, volcanic_pickaxe.getUnlocalizedName()); @@ -5939,7 +5905,8 @@ public class ModItems { GameRegistry.registerItem(chlorophyte_pickaxe, chlorophyte_pickaxe.getUnlocalizedName()); GameRegistry.registerItem(chlorophyte_axe, chlorophyte_axe.getUnlocalizedName()); GameRegistry.registerItem(mese_pickaxe, mese_pickaxe.getUnlocalizedName()); - GameRegistry.registerItem(mese_axe, mese_axe.getUnlocalizedName()); GameRegistry.registerItem(matchstick, matchstick.getUnlocalizedName()); + GameRegistry.registerItem(mese_axe, mese_axe.getUnlocalizedName()); + GameRegistry.registerItem(matchstick, matchstick.getUnlocalizedName()); GameRegistry.registerItem(balefire_and_steel, balefire_and_steel.getUnlocalizedName()); GameRegistry.registerItem(crowbar, crowbar.getUnlocalizedName()); GameRegistry.registerItem(wrench, wrench.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemBattery.java b/src/main/java/com/hbm/items/machine/ItemBattery.java index bc35e2803..f3c840fd3 100644 --- a/src/main/java/com/hbm/items/machine/ItemBattery.java +++ b/src/main/java/com/hbm/items/machine/ItemBattery.java @@ -2,7 +2,6 @@ package com.hbm.items.machine; import java.util.List; -import com.hbm.items.ModItems; import com.hbm.util.BobMathUtil; import api.hbm.energymk2.IBatteryItem; @@ -10,7 +9,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -30,30 +28,15 @@ public class ItemBattery extends Item implements IBatteryItem { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { long charge = maxCharge; + if(itemstack.hasTagCompound()) charge = getCharge(itemstack); - if(itemstack.getItem() != ModItems.fusion_core && itemstack.getItem() != ModItems.energy_core) { - list.add("Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); - } else { - String charge1 = BobMathUtil.getShortNumber((charge * 100) / this.maxCharge); - list.add("Charge: " + charge1 + "%"); - list.add("(" + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE)"); - } + list.add("Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); list.add("Charge rate: " + BobMathUtil.getShortNumber(chargeRate) + "HE/t"); list.add("Discharge rate: " + BobMathUtil.getShortNumber(dischargeRate) + "HE/t"); } - @Override - public EnumRarity getRarity(ItemStack p_77613_1_) { - - if(this == ModItems.fusion_core || this == ModItems.energy_core) { - return EnumRarity.uncommon; - } - - return EnumRarity.common; - } - public void chargeBattery(ItemStack stack, long i) { if(stack.getItem() instanceof ItemBattery) { if(stack.hasTagCompound()) { diff --git a/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java b/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java index 0ebd77c33..65a72b7ef 100644 --- a/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java +++ b/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java @@ -3,7 +3,6 @@ package com.hbm.items.tool; import java.util.List; import com.hbm.blocks.ModBlocks; -import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBattery; import com.hbm.main.NTMSounds; import com.hbm.util.BobMathUtil; @@ -20,21 +19,10 @@ public class ItemAnchorRemote extends ItemBattery { } @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { long charge = maxCharge; - - if(itemstack.hasTagCompound()) - charge = getCharge(itemstack); - - if(itemstack.getItem() != ModItems.fusion_core && itemstack.getItem() != ModItems.energy_core) { - list.add("Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); - } else { - String charge1 = BobMathUtil.getShortNumber((charge * 100) / this.maxCharge); - list.add("Charge: " + charge1 + "%"); - list.add("(" + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE)"); - } - + if(stack.hasTagCompound()) charge = getCharge(stack); + list.add("Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); list.add("Charge rate: " + BobMathUtil.getShortNumber(chargeRate) + "HE/t"); } diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 6a2c5ab1e..9f25e38bc 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -703,11 +703,10 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModItems.ams_catalyst_dineutronium, 1), new Object[] { ModItems.ams_catalyst_blank, ModItems.rune_hagalaz, ModItems.rune_hagalaz, ModItems.rune_thurisaz, ModItems.rune_thurisaz, DNT.dust(), DNT.dust(), DNT.dust(), DNT.dust() }); addRecipeAuto(new ItemStack(ModBlocks.barrel_plastic, 1), new Object[] { "IPI", "I I", "IPI", 'I', ModItems.plate_polymer, 'P', AL.plate() }); addRecipeAuto(new ItemStack(ModBlocks.barrel_steel, 1), new Object[] { "IPI", "I I", "IPI", 'I', STEEL.plate(), 'P', STEEL.ingot() }); - addRecipeAuto(new ItemStack(ModBlocks.barrel_tcalloy, 1), new Object[] { "IPI", "I I", "IPI", 'I', "ingotTcAlloy", 'P', TI.plate() }); - addRecipeAuto(new ItemStack(ModBlocks.barrel_antimatter, 1), new Object[] { "IPI", "I I", "IPI", 'I', BIGMT.plate(), 'P', ModItems.coil_gold_torus }); + addRecipeAuto(new ItemStack(ModBlocks.barrel_tcalloy, 1), new Object[] { "IPI", "I I", "IPI", 'I', TCALLOY.ingot(), 'P', TI.plate() }); + addRecipeAuto(new ItemStack(ModBlocks.barrel_antimatter, 1), new Object[] { "IPI", "I I", "IPI", 'I', BIGMT.plate(), 'P', BSCCO.wireDense() }); addRecipeAuto(new ItemStack(ModBlocks.tesla, 1), new Object[] { "CCC", "PIP", "WTW", 'C', ModItems.coil_copper, 'I', IRON.ingot(), 'P', ANY_PLASTIC.ingot(), 'T', ModBlocks.machine_transformer, 'W', KEY_PLANKS }); addRecipeAuto(new ItemStack(ModBlocks.struct_watz_core, 1), new Object[] { "CBC", "BHB", "CBC", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'B', ANY_RESISTANTALLOY.plateCast(), 'H', ModBlocks.watz_cooler }); - addShapelessAuto(new ItemStack(ModItems.energy_core), new Object[] { ModItems.fusion_core, ModItems.fuse }); addRecipeAuto(new ItemStack(ModItems.catalytic_converter, 1), new Object[] { "PCP", "PBP", "PCP", 'P', ANY_HARDPLASTIC.ingot(), 'C', CO.dust(), 'B', ANY_BISMOID.ingot() }); addRecipeAuto(new ItemStack(ModItems.upgrade_nullifier, 1), new Object[] { "SPS", "PUP", "SPS", 'S', STEEL.plate(), 'P', ModItems.powder_fire, 'U', ModItems.upgrade_template }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 0f4b640a6..f28893151 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1631,6 +1631,10 @@ public class MainRegistry { ignoreMappings.add("hbm:item.blades_advanced_alloy"); ignoreMappings.add("hbm:tile.machine_minirtg"); ignoreMappings.add("hbm:tile.machine_powerrtg"); + ignoreMappings.add("hbm:item.energy_core"); + ignoreMappings.add("hbm:item.drax"); + ignoreMappings.add("hbm:item.drax_mk2"); + ignoreMappings.add("hbm:item.drax_mk3"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java index e9ddf68b0..ac8829106 100644 --- a/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java @@ -7,6 +7,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; +import java.util.function.Consumer; import java.util.function.Predicate; import com.hbm.config.ServerConfig; @@ -84,9 +85,25 @@ public class NBTStructure { // incredibly shitty system for translating legacy block definitions to new ones @Untested // i can't find a god damn factory - private static Map substitutions = new HashMap() {{ - put("hbm:tile.ore_coal_oil", "coal_ore"); + private static Map substitutions = new HashMap() {{ + put("hbm:tile.ore_coal_oil", new BlockMigration("coal_ore")); }}; + + public static class BlockMigration { + public String block; + public int meta; + // i may have misjudged, migration is only done when the palette is loaded, rendering this basically useless + public Consumer tileEntityTransformerObject; + + public BlockMigration(String block) { this(block, 0, null); } + public BlockMigration(String block, int meta) { this(block, meta, null); } + public BlockMigration(String block, Consumer teto) { this(block, 0, teto); } + public BlockMigration(String block, int meta, Consumer teto) { + this.block = block; + this.meta = meta; + this.tileEntityTransformerObject = teto; + } + } public NBTStructure(ResourceLocation resource) { // Can't use regular resource loading, servers don't know how! @@ -328,13 +345,16 @@ public class NBTStructure { NBTTagCompound p = paletteList.getCompoundTagAt(i); String blockName = p.getString("Name"); + int meta = 0; NBTTagCompound prop = p.getCompoundTag("Properties"); /// BOB PATCH /// - if(substitutions.containsKey(blockName)) blockName = substitutions.get(blockName); + if(substitutions.containsKey(blockName)) { + BlockMigration mig = substitutions.get(blockName); + blockName = mig.block; + meta = mig.meta; + } /// BOB PATCH /// - - int meta = 0; try { meta = Integer.parseInt(prop.getString("meta")); } catch(NumberFormatException ex) { From d67cb7e49ed29a416de2698eeb319d6a2cb426bb Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 13 Jul 2026 15:50:59 +0200 Subject: [PATCH 082/107] have fun --- changelog | 2 ++ .../com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java | 2 +- .../com/hbm/tileentity/machine/TileEntityElectrolyser.java | 6 ++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/changelog b/changelog index 67749c28e..f2304c57b 100644 --- a/changelog +++ b/changelog @@ -5,6 +5,8 @@ * Trinitite ores now spawn fewer particles * The radiation effect caused by walking on trinitite ore is now much shorter but more intense to compensate * Finally removed the old terra drill items after being deprecated for almost a year +* The electrolysis machine now instantly annihilates all buffered fluid output when changing recipe + * This is a straight downgrade but people for some reason wanted it so sure why not ## Fixed * Fixed burner press GUI offsets being incorrect diff --git a/src/main/java/com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java b/src/main/java/com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java index 93ebcf84b..3a207828c 100644 --- a/src/main/java/com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ElectrolyserFluidRecipes.java @@ -29,7 +29,7 @@ public class ElectrolyserFluidRecipes extends SerializableRecipe { recipes.put(Fluids.VITRIOL, new ElectrolysisRecipe(1_000, new FluidStack(Fluids.SULFURIC_ACID, 500), new FluidStack(Fluids.CHLORINE, 500), new ItemStack(ModItems.powder_iron), new ItemStack(ModItems.ingot_mercury))); recipes.put(Fluids.SLOP, new ElectrolysisRecipe(1_000, new FluidStack(Fluids.MERCURY, 250), new FluidStack(Fluids.NONE, 0), new ItemStack(ModItems.niter, 2), new ItemStack(ModItems.powder_limestone, 2), new ItemStack(ModItems.sulfur))); recipes.put(Fluids.REDMUD, new ElectrolysisRecipe(450, new FluidStack(Fluids.MERCURY, 150), new FluidStack(Fluids.LYE, 50), new ItemStack(ModItems.powder_titanium, 3), new ItemStack(ModItems.powder_iron, 3), new ItemStack(ModItems.powder_aluminium, 2))); - recipes.put(Fluids.ALUMINA, new ElectrolysisRecipe(200, new FluidStack(Fluids.CARBONDIOXIDE, 100), new FluidStack(Fluids.NONE, 0),40, new ItemStack(ModItems.powder_aluminium, 7), new ItemStack(ModItems.fluorite, 2))); + recipes.put(Fluids.ALUMINA, new ElectrolysisRecipe(200, new FluidStack(Fluids.CARBONDIOXIDE, 100), new FluidStack(Fluids.NONE, 0), 40, new ItemStack(ModItems.powder_aluminium, 7), new ItemStack(ModItems.fluorite, 2))); recipes.put(Fluids.POTASSIUM_CHLORIDE, new ElectrolysisRecipe(250, new FluidStack(Fluids.CHLORINE, 125), new FluidStack(Fluids.NONE, 0), new ItemStack(ModItems.dust))); recipes.put(Fluids.CALCIUM_CHLORIDE, new ElectrolysisRecipe(250, new FluidStack(Fluids.CHLORINE, 125), new FluidStack(Fluids.CALCIUM_SOLUTION, 125))); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 4e9c74c5c..bedb9d993 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -278,9 +278,11 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn ElectrolysisRecipe recipe = ElectrolyserFluidRecipes.recipes.get(tanks[0].getTankType()); if(recipe == null) return false; + tanks[1].setTankType(recipe.output1.type); + tanks[2].setTankType(recipe.output2.type); if(recipe.amount > tanks[0].getFill()) return false; - if(recipe.output1.type == tanks[1].getTankType() && recipe.output1.fill + tanks[1].getFill() > tanks[1].getMaxFill()) return false; - if(recipe.output2.type == tanks[2].getTankType() && recipe.output2.fill + tanks[2].getFill() > tanks[2].getMaxFill()) return false; + if(recipe.output1.fill + tanks[1].getFill() > tanks[1].getMaxFill()) return false; + if(recipe.output2.fill + tanks[2].getFill() > tanks[2].getMaxFill()) return false; if(recipe.byproduct != null) { From 33a416a011b09a9511cf0e8092e46f86229b5dbf Mon Sep 17 00:00:00 2001 From: TheVitya2127 Date: Tue, 14 Jul 2026 01:00:13 +0400 Subject: [PATCH 083/107] Its a FUCKING HELL for Perfectionists --- .../hbm/inventory/gui/GUICrystallizer.java | 2 +- .../inventory/gui/GUIMachineCyclotron.java | 2 +- .../hbm/inventory/gui/GUIMachineEPress.java | 4 ++-- .../gui/GUIMachineElectricFurnace.java | 6 +++--- .../hbm/inventory/gui/GUIMachinePress.java | 4 ++-- .../com/hbm/inventory/gui/GUIMachineRTG.java | 2 +- .../hbm/inventory/gui/GUIMachineShredder.java | 4 ++-- .../hbm/textures/gui/GUIElectricFurnace.png | Bin 2575 -> 0 bytes .../assets/hbm/textures/gui/gui_epress.png | Bin 2357 -> 0 bytes .../assets/hbm/textures/gui/gui_press.png | Bin 3504 -> 0 bytes .../assets/hbm/textures/gui/gui_rtg.png | Bin 7552 -> 6339 bytes .../assets/hbm/textures/gui/gui_shredder.png | Bin 4108 -> 0 bytes .../textures/gui/machine/gui_cyclotron.png | Bin 3417 -> 2940 bytes .../gui/processing/gui_electric_furnace.png | Bin 0 -> 2926 bytes .../gui/processing/gui_electric_press.png | Bin 0 -> 2323 bytes .../hbm/textures/gui/processing/gui_press.png | Bin 0 -> 3493 bytes .../textures/gui/processing/gui_shredder.png | Bin 0 -> 4062 bytes .../textures/gui/storage/gui_battery_redd.png | Bin 10989 -> 10979 bytes .../gui/storage/gui_battery_socket.png | Bin 3353 -> 3349 bytes .../models/pheodoors/secure_door_black.png | Bin 25455 -> 24976 bytes 20 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 src/main/resources/assets/hbm/textures/gui/GUIElectricFurnace.png delete mode 100644 src/main/resources/assets/hbm/textures/gui/gui_epress.png delete mode 100644 src/main/resources/assets/hbm/textures/gui/gui_press.png delete mode 100644 src/main/resources/assets/hbm/textures/gui/gui_shredder.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_electric_furnace.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_electric_press.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_press.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_shredder.png diff --git a/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java b/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java index f94527ed6..f5b86037e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java @@ -44,7 +44,7 @@ public class GUICrystallizer extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.acidomatic.hasCustomInventoryName() ? this.acidomatic.getInventoryName() : I18n.format(this.acidomatic.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java index 29cf1d2a1..546bd8570 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java @@ -47,7 +47,7 @@ public class GUIMachineCyclotron extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.cyclotron.hasCustomInventoryName() ? this.cyclotron.getInventoryName() : I18n.format(this.cyclotron.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(name, 79 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 15, this.ySize - 96 + 2, 4210752); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java b/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java index 4d4f54caa..006461313 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java @@ -12,7 +12,7 @@ import net.minecraft.util.ResourceLocation; public class GUIMachineEPress extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_epress.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_electric_press.png"); private TileEntityMachineEPress press; public GUIMachineEPress(InventoryPlayer invPlayer, TileEntityMachineEPress tedf) { @@ -34,7 +34,7 @@ public class GUIMachineEPress extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer( int i, int j) { String name = this.press.hasCustomInventoryName() ? this.press.getInventoryName() : I18n.format(this.press.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(name, 89 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java index 06d37ff96..5519b2fa1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java @@ -15,7 +15,7 @@ import com.hbm.util.i18n.I18nUtil; public class GUIMachineElectricFurnace extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/GUIElectricFurnace.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_electric_furnace.png"); private TileEntityMachineElectricFurnace furnace; public GUIMachineElectricFurnace(InventoryPlayer invPlayer, TileEntityMachineElectricFurnace furnace) { @@ -43,7 +43,7 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.furnace.hasCustomInventoryName() ? this.furnace.getInventoryName() : I18n.format(this.furnace.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } @@ -74,7 +74,7 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { int p = furnace.getProgressScaled(28); drawTexturedModalRect(guiLeft + 43, guiTop + 36, 176, 0, p, 12); - this.drawInfoPanel(guiLeft + 116, guiTop + 20, 8, 8, 8); + this.drawInfoPanel(guiLeft + 115, guiTop + 19, 8, 8, 8); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePress.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePress.java index 17e64d6ed..d0d6a64c6 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachinePress.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePress.java @@ -14,7 +14,7 @@ import net.minecraft.util.ResourceLocation; public class GUIMachinePress extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_press.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_press.png"); private TileEntityMachinePress press; public GUIMachinePress(InventoryPlayer invPlayer, TileEntityMachinePress tedf) { @@ -48,7 +48,7 @@ public class GUIMachinePress extends GuiInfoContainer { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); if(press.burnTime >= 20) { - this.drawTexturedModalRect(guiLeft + 27, guiTop + 36, 0, 214, 14, 14); + this.drawTexturedModalRect(guiLeft + 26, guiTop + 36, 0, 214, 14, 14); } int k = (int) (press.renderPress * 16 / press.maxPress); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineRTG.java b/src/main/java/com/hbm/inventory/gui/GUIMachineRTG.java index 90ca0759b..a0ebfe680 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineRTG.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineRTG.java @@ -52,7 +52,7 @@ public class GUIMachineRTG extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer( int i, int j) { String name = this.rtg.hasCustomInventoryName() ? this.rtg.getInventoryName() : I18n.format(this.rtg.getInventoryName()); - this.fontRendererObj.drawString(name, 13 ,7, 10925486); + this.fontRendererObj.drawString(name, 60 - this.fontRendererObj.getStringWidth(name) / 2, 7, 10925486); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineShredder.java b/src/main/java/com/hbm/inventory/gui/GUIMachineShredder.java index d7df00134..5bf8b7259 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineShredder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineShredder.java @@ -13,7 +13,7 @@ import net.minecraft.util.ResourceLocation; public class GUIMachineShredder extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_shredder.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_shredder.png"); private TileEntityMachineShredder diFurnace; public GUIMachineShredder(InventoryPlayer invPlayer, TileEntityMachineShredder tedf) { @@ -45,7 +45,7 @@ public class GUIMachineShredder extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(name, 106 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } diff --git a/src/main/resources/assets/hbm/textures/gui/GUIElectricFurnace.png b/src/main/resources/assets/hbm/textures/gui/GUIElectricFurnace.png deleted file mode 100644 index a0aa8fd26627c6f56da46477bccee8f0bab41994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2575 zcmcgtc~BF17Jl7Hha}vBsHhNzVaO^b;Sf|9(p+-L5jiBNAUGOCD0BchRG=9OfkFk9 z1w24p2Ju7`L=lx16;T*r#2GmR!^*6HqJXR70oh;BncA8^_K&Tt{Z)6r_x;}czOP?* zS9P|;+f|*b&jkQ=cQH-rE)+`-EM;C!y?r!WHH z_YzNk7ZmezlkVIo%gV~~@$m@=2rxD_7K_EsPGV3P!3UF0PZxOm7ey_=xBx~h6bi!w zdlO;E8h*1?C=}2yhR04#^xvS%6&`v*y98PS;7$jC@yZG}K3(N)P7CM+~9BR6}QR*&pcV7T(1PIW_i0Sw1 zfzaG9IeO*5#~9Q5ILgg29JEnfjn0Tn=Jb9P%9V?Z$6yeB8NbIry8@tMo(eEgugJnu zgq42QRen=M>1VA1lq(mGl=10K-=#}X_Jw6G5-F>)liN+!51U8;R07?d9sCnRMv6Iw zhplxp_F2j{RYVv6+8cPutHUa|BiZZSHLs@%#dq6FNM0o~U9I!NwuV@GAS~=+wiJ`%b$t;u)??7s@9O^GW}aO=V!|F zYhFhVdsM*P)LppXO{QU_ZX5@3NNR0McQy5rwFt|F#3G5NDUZJX%|KTf( z)}*ruX;7&%I=eJ~wR`lnGmYmm##E`?#$3h&S%A<~Kp$l7vui7Xfj#SHd7M3W&m;x2 zIWPHHFVFaj@j%ksuX$UpvhxI01<_iUsLFrdx7uWnKlERHp#sVuZuiT7np)-+dMic4 zjPy%RN*g9IABF`!&~1A9uLg|S=Z}`L`G)s=go_!39fNX|x+W$8h`rhE_oSdAGg^^TSAM1 zDf{oMU)<(nLfqpD#g-P%4HwEy$n6cDFeAkz-DoW-HSK5Ygn8Q`s>3A@PiBc(fu)TxYv>MU*|Bk%Z@)h#dZQ~j@o zz==t!_WyczdNX(;Q=;n6xCGK z6>%klCYY1g!$d>|s`p)6BkW+0s$ABqD88Y`v%l1{d6A5yOWsVP2L68x@?oucN}aZ=1#=1@6P zqQA9!&T-vQPWzEs%=oS49%^qq>$$!pWO6t4tt`za?ZcT!(R#5FezkdOb4NsY6|>oJ z5!OHJMjNQ<-qXcfk9XV`l~ZjPLQH&k+P^eBZ8>dFP0s=r_qO(ExvASZN`|Z*Tsxz!#IduN3oo}X8R44Rk^4J8kx$Z`?t!ka-`T}bPQByaQFSk`1=(M->;r>Pu z-%c~X5skNZYw;6A(HUN*b}`o^HvOO?qN?b z&|Td!reoFl^{I8%_!JY>`|&Gc&fc=gr{e*d?T@GeszE7hfXf;ek{vTfZKyQIY!AwA zt*P8ld5bal6oFVPIaR4^ude{sY*pgc*W^(x!U~U4cW2WP?eBttvD+jDLntrPgM2pM zNKI5AB_@_8U`|uLylKW) zU=MzL(xTxW>)l&(KY501$v}hyCUsNi(vF)Ypy!*8Zx<)rVwFrXH`GVPE^7_t*_MAg ztkN;J9XB|_{mJI|T`g?FV$2cKC9&C|X6TBJf8UUBCNz_>GQJD^hu)}G=dD%8fLr?I zP!s9>k#kF_%!$CU!<`E(Rq45+>pLu@OQJSLW8Q^1XQ#zKEB|5f8NQrf^j{H{sPieD zkDg$838B@N9Aq}H*5VR`cW3`6ui#Fl*EIEkUg+eqQ+J!=56*kHp~!)>YKV+tA9$8K zl(0t~^GUU{oHt%m3T8jDh)|=&d{904r)OG~r>{$8JpBK+?4LC%UJ$lY#%nt=qWs;u MyLdZSI)?u6FI&Xz3IG5A diff --git a/src/main/resources/assets/hbm/textures/gui/gui_epress.png b/src/main/resources/assets/hbm/textures/gui/gui_epress.png deleted file mode 100644 index 0079b6484035c9d738d879dd6fc4d5e0bcf4c969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2357 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 om!{zaG(#hur;s##yjEv09>P#P5=M^ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_rtg.png b/src/main/resources/assets/hbm/textures/gui/gui_rtg.png index ce99dbca6b052a46364cbaf1af6bf2cabcb23770..1c2dfac5fa2811fdaa2990bdd4c67808ffae0c52 100644 GIT binary patch literal 6339 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 diff --git a/src/main/resources/assets/hbm/textures/gui/gui_shredder.png b/src/main/resources/assets/hbm/textures/gui/gui_shredder.png deleted file mode 100644 index 19b774c76f77d5ef938c3d07155c07d4f4dec418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4108 zcmbVOc{r4P_rK>hVziBsRI*K$r;)V~V;Pw53&I@h`H`<(AN-}5==e81h`~u_R`#OM6DoQ+1^{+8TH#IY12Z^-46kSA`|9WO zEdnl_PB3nb3G2Qy*tlfA&FtIL^GN*8bZY}W!R`5k$jDgIoP7I)n(QwB`J)siBat_v zC9f#wP`gW}8{AK(K8%i?VOzoXzW>Dfomc)Txga>Am$&51?OPVIG06N8Jai-|E4X0F z=GF=I^u4l$*0g%k6GP+b3-bYsKN_Y@`Se=?WQ#;brpqra^L9nU21R38RB8Snsd%GBK_mUK!1L*nBCCplof$USs(L&1O31n7H#? zBCfMY-kbsE{RYXNDD&G92AS&DUBkEzMJncVxfq>5E^lhNrlzJ(x0gCedoviHtOeVp zvwz2xqx;+1HR{gwuL7(EkQ5N$bj*3Wj~ZXzmx;(}(YiRC43HBhj4C+##cW39BV6}! z^p-w-fHHX#(>QF4$Ls3pNvCN5ZQ8>AyR)OCqpe+kHgSG_9Ad>yr)oU~aVis+ZY5Gf zLhO8hV20bvC4T-}MM3k_<9=lUy4>Es>UE4#`iUPJ$sZ9oHGw&PjlXeG zI{{%@szjscai=!rS^vmMKvV+`@=B3y{|=Jk#_)IT(4g8me!^^ zdns$Z{goKGvn%Af&gV~$=$0tkC|BQnPbKlFqbxVg=W3>*bHn!oq@|@9 zEnmJgo0c7}^#4>NBhHdbG7u_LHKnx`0lhi`%v9F?ub%^(rnv(&LsbtCIgwAqOaXt- z$63j5yr?S#5JVh+0T5;PxCGC81x>!EMO{@nQuY!A6ix{_(ghWDCXQ>|sY~Xra#4M# z`pNmsJpNZ*3tIUt%tQ>vRJQT;lXplU({H*%Lu%P)ta>d&oAaW#yuDN^rw;?9_}f;j z8t`whJz&AS*yd!~>Xr4-4}!|F%&|*N55$1Xr^{;T>a~WmPFRH;5a&@D>|sY^-Nb5n7J;b*39n$M{3ICo)PR}ZeL$ew)442pC|7~ zt;&Le{i?g|fr)3%zTs87X0Ejs3qC9{53O+hFUl$SHj(hyqh;m{s-{`A?) zqJVwZUAB}03`oAIuwrfr;66h1cg_>|HlO@`{_wLlSWluo!tD>vHMMk)RAyD+Tvyf4 zhm+&CGEba08)%J|iTqp20sIZEk#L?-Mt2PRn$LF-y{bZWm=RrMvRrGK6xR63AER~@ z&v8Iq*6>5v%(sTd_Z>@LX9}}K7pdtkcB7}wJ0)bpXI2MMQa&J3OT@$9mA|pRAw_X1 z6sg@vT{E`zD7BB>24 z$6t9q5$(x)C68bIF~%)0Z(5)F?Be=eVpadBNPn?9z1(t6N?-0COy`0qTd581w$H1^ zooSO-shYs;AKxxQ;EZSPY$QL?gwLVIkhszO6Ol$$D(I5mXg;thF{zR@_$nt_+TWXZt1TRcvQPyd@e_5}(!52sOJ#M*M>cWl9F(`W+ zw3Mk2=w$b5RkDOUNWxKGt9b#sZ!5M7FLXBFJXbcu_x#0_3sihFol|h>3(K zlQVBr!zz3PpC8gtZpe z>p<0F26`eITqRN#Y9U43Tz?GY00n$&LP7=szY#Ne4MpHxtUjR83D?}S?J|i(au^3s zJmriw#^HuZ%H#(Rwgw6K%k&+P^x4pCNLk`4yHR3R_eMbKL50$v2p<(Wf4G?I52V}C z{lPMBB$6F8`)C-22Zwr;FV=P!-er1)MyEZh4m6$-eH=&3V<0L0W`_C1;hspkeHJ`} zm~TBqDcThpV$?srl4d+uF?nL-wM_q#5p{=s(q6e8Q@N*vH8Y76F#PC#m*b)~JyERk zyUUmmw|;%(`u3;b+^K4?E6OBEDKaOSyry-=VT`YGUV1E`J6_ttrV`m=Jtl^`EW3E7 zo>mRE?E2E|D``5uc4ycj%i_k$O*f6??*Kt5;>(5l%i7%{zK2I7WEOE-IdwCOKj&9t zv`*W?0$&&+CTa{P+IO#i3F`^0eNlf{DWmqM0;2bh%U5eJ3g|@NfqQm#ryR4-1xk-* z;%kC^3()NMBoeW${mD_$1>MCXct>sXJ zb30kt+!0|5lO$96Fl2*bA!O_9n3H~A=T>ij;5s1KHk!9sT#~7B?Qaa3;z<*Fg*aGgWOh<- zT3b54IaWq`P%Djq#|M`z_kZMB9ts*?w(`Yz?gJM)84NzlUaw!8l}=E$k%jaGSO}H( zx*}cfjs$}Pxr+AymtHuI@!<6OS1TwPt*Cl$-2)rq(JnN-q(cy3fmLX@37T}{2Ktf1 z%NY^&*vI`iOUeeQEFvPJEgOGDJM9Bh1dLOl{EE1Yy71E9dG#^Un=JyhfMWJ0(>(xN zfv&CV+hBy?Q*+g_|43R4*&*l!Yw;igJ`0r?u`5Uc>K5x7aN>T;0qyt^*A_$A2mEMw z_ZCYa#+iw5Q$`DTlS@9yo8QvE1Dj2y#u2NRhF0ZnHX-ioa{%faF|vZgAf)28`lUZB1a%bSfX*s1lbFEHGKWI=}}HB>?0*S|ViP zDkDPUgs7~HzDvSU6p*vzoVP9|9^~g0-X3~3Fly$AzQnJfYJ+-s^3cX@RtHHG4}QeY z-t}n@>Vp|UkTd=_n0GK*JH6vO75&V&wmuG5Dq)6Qi^D+)L!-6R2$w^63wK;~52o6P z-jE^7V8L$U9Oq~NykuoDypPv-*8z~fpa|UT+{)gl*33Mf8=|BrM&@+!3R zuKoVP$8LU>tTf&RBi~7cQkMuIlV7e|7|BW|y3qR5Gcz*gzJvE$F=SR>pJSm4__zV? pX0)jHM_=0+U`%`+_^;2!xrkRtw&Bf+lcHQwlQ>4lsicxyy3v_)zV&_U`;LFVwe}y++G{`SdDh;$Y4p%2sW_Lc z$7uDn5(hiC@Z_!+{kxhi^jRUx9S=x?maFM-H1N#5NrwkFx63RJ4c_p&JEB>UG(5cU z^6jEei;A8)_68Tf3v*6f>SO&zTat9fT2kQY;QheZslT_3bgzGYrZvUF>lH5Ya)`cS zq8;nrB`JQ%&0F@tIlt0`3~RR4UvRw3_i#FWXSdMo(oX>kLeZMp`9-4wpts>r+Mpdn zZuPQU^H;yw&>537fk}-qTK3F#^x;`65R3F5N#O=s%3Do%tlx_9JNY65{H+Exer)_8 zPu_hI#^U$dV455XdcTY%gKdd$eFuEw3~YwlPF_w@CP%5s$8rh_b>mi|x~PrxgOE^| z6}Lmo4A&8{6xCSKIHyF-Pdsw0T3qkP%dHR}?LVL7WY{(bF)9S0cwLhkp_2j5ClLgz8GZWd%;-T{jM=6jR zQVB6H=Mu6r9~23+8?1MFwa!i?uiYACS&_ldBFG&HPUe3Ux2|z<=JZ&{fUZDj+_%B`bIR0JOOWP$6IM9p0IQ!JW#n<$Q9F^1w59?kf7#e{ig>-hLNj7u z&Z1AoY*s8oexwsm5Y9`4>5-1eo;<^^GnUr~P2@53yiN6Z*8E%+Tt#eTkBFXt8NP;3 z37z9_Sn^B4wOWg@*Vd*4$2(*=qT+8tZ6Bic3hT&qoe)YE6 z>5bP2(H^)OUA50eq^{6CI%0*4N4^0K;Ur^>`k_-0kexW=bXIp0OF2RsF)7)bag>Jl zlOQx34lu&==LyKixO|mR>EDi*87FWqf4t;1>ouTa6>TIY#OfzMHJV$24#ELL-8{+1IDdTw?dU1Uj)W|%{t#rwI?(0yP zod(QNGmm^?$efJz_IJ~dnXMXnN*n&i!it}!=taNfLBob;yFmMdBOgV5971AhP9$dp0oh#nG|b_taP>`k#}*cjgsW& zOcQIu%qAv-G+*q6^=VWZ$g&Rc#0=P>Pa4Sxjnk|?!%96eXm~Y??}~lUOWg?c&T32* z=ycK=tN-Rpi2d?q5$`AIdE&zNM4y&Q{8xI9(s)>dkDa^>C9~orV!_3D3ss5@ETx&0 z4-2Qk;7p0I3<=kdQwB>x6+`ji1` z#|QJ|9O~s(HEOep*Ui|DqCG(e@4|=FqA=mFq{+i+@^`{-(BZO8fNP=QwB!**%pO+k zY|>Q_1~w|4dJ9)pFr1+w>%Mb-IVMU0Ix-y3`szy)JrU6kOtOX5Gdp%VdW`9#Kc<@J z*6hkquJXTca&c}i*2fYt89}*GU?j;RHpU)d5lafhBWlO zx##PGfyO7rp{wk}5$@@Hp5hMgHmn=Fh;3(Z= zB{`+Xx>F(Z+^W88GxEf_kgY*l)SJ*SAQ$r|H1~B0So%rD!^x2R#mMFOq??-zs0;J2 znYzsuOmONPr!K_kQh%Kj&Vd6myU!jwa#f7ca>BvV*Us(Ij3X@kKYps^Jn7wCEVctYlOm#oA>ULX1KxIuj za!TJkH!P@Q`AY?skzr&qOvrH9K~qVr^3$|k1+YRa72hY+sY%m}$GqZ?Sy zo%ip?+|Do z^Hl^qI8T4iIu!Kt#e+&AmN|j z+F z==)25Gm+S}(68q|o7sP5V|>6Ym=6ns<$;nXFlKK1BP#^#?;+cPu6Prfmu@wv7LvE1 zLK7JEsB7TrjgF$uUF!W7hwPJTr`y X_%5x^Yyaj0TmX>#xYXf_Jr(sQ_mJm7 delta 2933 zcmb7DX;c$g7JgN!idonRn}UR}$fAG>ih@$C24!ua1yn%EpeV||BYBb4r6qz&Mo|Ky zfD59~4T4H3Dqy!QA`03lQD_8oB<`UFous!pbLQ97Iq#hJZr%Icd%y4AY3)a|g|;dH z+w9`w0>Fi0=JZDVg7rg$59smS&?EpM+ZIC3k&l% zIGx?yuWO6ZVntYPLQ9+t)q9`7WUyx8(gCA4(_anieoOgKS>oAQyUy|A#IenNM|RXT zzYI?ED^9I=^dPludC(7YGtO0(d@|qv&C@lPi-lz>YomDIZ!q8+T0SKws`V`S?a#S; zQtz=P@x#tnpDVrE^ObkyaSoA?d~wIGO`+tWj**FA-AJVOi)BsC8CA=2sNM*@q%XVP)u#bBD2_o*AHX0&DShVB<~pW zB*E7$2pwUDT1^vOwrg|=V-fpa$m?Av~l>PzTxZjQEF1^CUkq)YX)wl{u~^#~qP~fIeKh z)wXv5QDC%q77`KcfZPLEWaz$|0nKngltGgnx$d*egcx;c)=#Za8X(G`NlvCW8xBc3 zX|h&VtN}3>>o`&QBOL)XVEnU^RV`DZYP=%k$7jd25nkjz7-wD%u2KM=y(+JbuYJ{x*0swUFR6)`y_V4Xf?8UHMvxa0~pdbepr|Jm?;@|8Z8%;erRregO0dY zmBTozU7%C>sdanHetfB-2cP?K>4q% zJx72Z<*B^cqHSD)*|K+Hiy%XAEH4Jnj;JgE*U$zE#QhJ-=MqZ*9{|@5~T*XdRmhyJK*|-asA$;s!0|6<$R1k*owYx zM3z!p@mIB>nBBpT+R`X|(`|7*i1vNQOJnZPg-#GQr>gOD{y}ZT> z3$^>~OeSF$4pg&rC83g)b0YCzB*ApOKY3T-9R`)$Jm~{Ht@iI>mM@YfNSX(gS|V1u z00XDpa4AdfvYLqX4hHp`IcyTGLT+=ht~ygbez}hD&aGu|pVzFiBo8p8pTg$gL5~(d z)9=)!htY+~RUG2Cl^u-7*m~)F8vf!QIT!6Bb&+;|_9>SjoXhOd;)3E~?sCi_yasHL z51h5v3*fiH-6GPHE<33JuqNZe@Ij9ovGPr>foo1_Nv#xI`GD4T8lQ04qtlRxcELHA zFEaZfpEh{g7Rxy&uc-&UjuA(f$mhEGmS540rcz0qqKmds@YDy7kND0_%pnV3a|>Yk zV>5;L&5Rp%MW+?YgIs(0su1At%@FJj{CTt`&ihB7$ zr18xt7F;5q`bYzBJBE-!sgJfH7Ey{nGi7Jwi8fV(BcF`evqj&MLkiqsyh~R~m6Mnz zCoxZ(-60$|h8vLqua(M+0%@{Bd59~$=(}+n@$Dw`%YVdegi%wb_pPaPiQ6rjtV|({ zTv@(c+A7d~HXmA7fjF@TFpw`{yJDb%kzOHsxzw&B?`lW0--@!5KXgEi-bHIL<^fiWx+%(h@l)K$s5DmT=!q9}fln!c155920 z8dVqTNZS{8I?|#IHIU-D+x&$B1N*(Op!X?y{Hl-CoUr{Yq>1#^dx$t>U}uR3S@6*G zAHrbXu~_tJ_d@#NsLeBG>{95o=2_xF7S#1j$Up}%zL5=UuNt6SJQG>~PpS%*Sg!)N zc#a>Mlgs|8{UGsU?bi~lYsG2Oz>AVLp;PKx<=vdpmzcd={G}CS3%v7l)kvM~9ox81 zpTB*O^p+;f+OGZyXB2H@8RJ}p*tlX|DHxv;xQ!v%$ELn1oL8T1U#N2QJY1e_{&gcZ z?91hMJkjq@8p|t3Ti&%@;h-%Z=kB&bhMK=oBMfAOr84Pb=|Onx{*%x44-XG#svHyg zf$c4n$aV;J#OWl9ZWK>CREf3>P}07ilbFch{$QF(EOn~!n%2Ym>gbW$*s}2vRiFu9e%|>+SAa z_i|Zs$k__3*qslt8Q>v^M+Qq zY0ZTby8{_x=`uIt!Fw|g1Acrno{rQNps1`Q#i-D8FhynU(b`{S$;6Bccwvh2&7+%@ zEIDFUR$qG{!81Y~1kmC&?GR@#G#llx=POa6rWcVuCw7xH`Z0PObx5^KCS z%fXMMxlInt%8OcjzUEKfT`^?8eU0qy(48%8b?NKaBE!;KQE2v7)EoA#q1_;FE{`0Yer(+#?C(hB*>vFSk48MAM# z=cC|3Q6WrJzI!Mzgt*jpNr5SvB{$ArN4#~ey`{M|Ea6IHC4`hOWliJUfDu%RB4ubJp$F-qM`~VJ@6DR`;gxwG-u-g!zGvV6KKr-M`k#|(ZDq{QBgq2* z;5Rifumu3ZeuV%y7khBQl6?=NP+Ma?P}+%}1%MZ0YH;2zDrb?Vb4}`t#QT+$`x$R8 zo(*f&wc~=>>B{5SsGz&R{Tv*KUw8bnv?BdqUNf}5f*xsxnIv%+XDt+3Uk!8BnD%IIZ~I+ zdG!S^vPA7oY|rj))uvxyC~Z3;=;qf%G&O3d66X`{l{Gn*l{y_i&%JZuBn>s?u+>ki zxghDD1Olw(BHXlYWJaWcQ#V%b4_ThRRnXhB&o&j}s+b#5S zZEV+>p>R0l3e{w62mo0wKi1lzN{80nk#UnB(Hn6pd7KH3*huN7Bx?HdI`xZex?x28 z>CaB;jgfd5u_iH?sslP>`H_LB*AfFgj;Q?Z?CC~aNG4`lpJrSELKrg`t_xcjKg;= z2%0UqctfX%KmRt7Zduc+eGwP7uxSjX-G!S_Nvq==A70DF==p6e zm%C5yEnZ6OsD~$rMA4#<*&37T%BlYPzV4H;sb&jVL0UD!iE}(_lPVItK2gvxkA9F0kv?43 zQJErb8U-(>mX7WWvoufe%}5OB5GyX%qcC%W_i8)sJ0l_6KdnrZrsOMW3%vY6-Pqkx z(byFe*4_Sm&x1Ve5Kn2FE@|S476Klo_Uosh-VvL%StE^-TXm#9e$$CqbVv14trRqy z;Z5bXT9XG)RhGluK$QnOjfCC4ygOyoSXOBDY?W}z2^@bRbtAcnLKAI@kN=vwyHLcE ziXIB@j`gms(u4U(M`My(B);nv`v*cOG@zwhC{n-aSsmTdJV7ck4GAnulXdgX@g*zA zHdk>XYtv^|b$)7;{AGayD$`Pcgm;d)#m5To1c~WTerP)4)3Pq9ivhT=eqYKCmRAfk zcJ?h5KL;O$nK9f*`C_WhanY#M`c-Ms8=M-W>j=jM=*^9?jr-^J{+@0^IDQmV;85jt zScG%LVF>cqr1l_euSh<>n<;MJ#3T{mn9lTV}e}NF*U>_EbOq`19=^WsW*8mxS79-m8^Yx8^dU%To`Kr=2pyHhqZH;xS+_#W;nqVHU`yJ3^ovpL)|GGZ! zY0B|B8(!eGHZen^XbprEjh6eg2sMDHgEK|Tx*=RWBHG4szoHJ}!l5?tvAg#SDRbT; zh1;18Xhj|n?+@R*)y1jyru+71HteGSX}rZ>v#(E$V8#@0&RSfl%zwnVFf1+qsQO zLR`^Goh=+sfsk~pb00r8yBb8^{Uz90!RWM^kNMh~KAoF=!}#NY&(;X3RZ_vkxV((H z(aZl0lAcMj5r>!W*X&<0Z5i%sU{ z=0;ME&d!;Oi`UzqtrW`U0sdlG!M2`*I=}z^c*O{lf+b$y zL=_LrhoffqVuF2PPjfW0dbQ-b4m!fyDT@5?&QILS(@3VhE$-|Gcow=8^544oH@%*O z+E^`hoX0*y;jvgZfs@d0QzQ~G3QW41oHe$F>#uP77s?;t24^X%+-(vXa!8`_2e>!F z^-msBQ7Gc&#A6Bwde|o(zSxH%4-YDf6=mv+{SUzYneIO%GMZmD1q)O{KmRE-mX)`K zI45uL%o-y+*B3y#&5IGL0z9Fip^ui}NNzE(IHR4gVX+Ctr?(^i*l7RfQTORS;+$LD UqcQ!r_6Ma*4Xq4H_1tg$4dv?fRR910 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_electric_press.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_electric_press.png new file mode 100644 index 0000000000000000000000000000000000000000..8575156ba16bd7d01ee468918f7f7b7d2a71d26f GIT binary patch literal 2323 zcmbtVXHXMb7QP9=07?LnqEZAD5uP9_HTZ&3WfxG26cMtbl!br~NQjgqJPU0k7KpS6 z%F?7oSizws)~rH6K%_SjLJUO=kOT>A(0Ma&*Kzj8o*%d0?>pza=gdt#<>DYKvr7g5 zAbZl$)(rrNcnASfTg07TR9VpGEZWWC1gP#%;{YJVI%#{{1D`)PVjOw4Z|9bAS9_A~ zZsxY(W+h+0u=_{w2Y&~j_K?@%{xH1bbwfKyuzPYihjL3}SD_;X_g4ELu2x<>4c~K< zD8Kg_3$f_w=)2eMp3N73LZ<`_QBzs8HHY0YX2BnRenr4C9}j{z2#`Yw8-4|y`zLD) zzB1{Frpv4AngrDH>QwB8559Tv5~q-Lkf9y?NdT8_bkTv#N=3O z{Ry__4g0>0u?2onAGZqoYa~H9;ycEy87&9svj{mk9qsdnR4dO}=uNgsfivCp`isj( z(88+#&9yH&omD}+DpQyV(EHdbsM*yWCD{^sI-tKik}fi>7F$4#rB)eKyyX4*l6iiM z?2~S%=GR|P+7J4;&RBtGGAu%Zq5#4@>0{)l=tI~_&S!2rTosym06`is={89avD#*c zg5%4$0}UbS49rqoORS|Z+>@5J%Z6mPFmX8`&uX+DsZ&wr26?wG*^FOITtZzw_1Jk3 zGtvYRW0#x41Wc4s+K{nQ;Sr2VCxmOG*Io7n1}yhohrB6_1LbQ-+z z*h(rYivMkGQRK^d#Bin(qf!oAWM;=E1c;q0R|XHjKSWvug9t7{e`Z$li5;}JNmQ|nUC$B)g@ zZ9!%AW?2m4LG*!Jx2Wfi0iNcMdONw*CIi%kAGQEEztCwPp++%-s=t`9pxA*bvPUf=J0 z1`>Zn+VR#um8^@nSs-)9Ly{(at_nD5xJ0Rt>`S5O5i@RcMMB@$+CIhj_y!HqF$*%RTi(e>mAU|w4riMT^ zXz5M4wL@m_=)z39A}}HXYReUIC6qgWVYfWpp2n!+*2cy(Bl=ox*$o0+v&Fxrd#CYV z!0_#J?+nBO?Q+{P#UAzd;IAdUYO{kyPR7Lt9E#k zWk|(;C&sLW9L@doIXO9b0R|n?0^ZdhUJ~nhW>*;zQh*XCns)A8$;}|(@p$zumKzb- z66o?pTggk8*LyvV9l{InQ!5dTgB1X0189o6qQT>UwmnR1CEWrz{#BCUWR?0PzysXO zmLX+rOMX7!c^rFJs@Ag?TIlTB*5%KdYaM6;JY}gzKD|&zPn1P?lsXvlQUfe@`&0cG z0ZtD=T2I!r-M9lc>9~gQE`C#|bLwjj>_T8%%RQEruZx(B3s%yx-x#h1)d-sW;p3@K z8*_>6kL2>vITM#u7l-15x&;COo=fHRR(SC`lF#O@P2DhCOj4XpmZZ{+TjTljln#4# z&C6Ps2(Bp=leeHr)fE3Fn}&Y&&WS;#N>;woE_A9ckW?iv6B{SyN|m-I$;@BvaAo@W z`Pr6vSD2^d0NRzUm{=T6S)n1$I(1)(DXdGVrGkVWKMw`l6~!I`(hC^as|)rRLqMvu zSRY{hr!8fI`3#2>x+rIEVUf!2EC_QzhBffI95j_0p0g+f%g?W0pX`#uuP%jJ5!d~Y zgFa2_uH_LKT0ckp30eO$5pZ#F`M~KZeTlL~4&J9Cw9i{%q`OBn~#H7X3e!`GErm>vrJ|{ViH~UJ8b};7}O14f2Pk;S+lc&m}$XxsD5pl`PR{ zf`*CR&dwiIv-xkme?a}=mA+r5S>Pl~qGx6N$bU#}U3zp1g>6<*fQxN1J$)wGI&umZ`xT0b{`r3!_DTeSpkN(fLzidN7SER@bz56D26Y8X$i*5A@^zZ)$ D$PWDr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_press.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_press.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e7ed166e961edf47aa37ea91fb3b25b2b709e2 GIT binary patch literal 3493 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 E0MA->Gynhq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_redd.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_redd.png index 3c32ee17d45de6ff4af30468a308b9dfe86ec27a..1782a231295685faf8a1d414ab707a7fd8262d6b 100644 GIT binary patch literal 10979 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 literal 10989 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 delta 3123 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 diff --git a/src/main/resources/assets/hbm/textures/models/pheodoors/secure_door_black.png b/src/main/resources/assets/hbm/textures/models/pheodoors/secure_door_black.png index 4018c69720d1f8d3a2cbfd04f5adb5978a984835..cc9100cf06e9d7067dbc1f110d7dd746c4e6870b 100644 GIT binary patch literal 24976 zcmXtcIOb@G}m^1YY9>F8zTw6c=>`X;95L z^&SXB4^onq()7sw+hr4NKIHTKI?BV!lE&zVC7ssN2fb$eS1{H{g``4jwNk~=si{If zR9y072xae=TN9Id%-P=*xVT=DxR#RSgME((in{v2UjHGp(PnsNqdZhj!(4;UK|hQ| zz3`8D(hrHx9c(XGDC+4L9}}L)ZW`D=vuDY*pS^|t%D7qgAUx@b16gthQK+E5FQW5% znDaBr6LLb`naCRo!68$HVa(3Wsm<{R(t|+O)r4{hdn#abDSvn*RE{u_S*mRM>vESD zL$LoWW!c-j!P{GrWOZEwgCKRtN28(|q^#P^bybr*6dl|Tb)q)A`nLp?UL9etl}%($ z&&ukL^Sd_#^#Wg$-z2XFD?gx=25V}CaN{xrJG#v3%P8+{w>35f_lFV4fCFAyjkgM` zOM2!OalC4I#;3r_f*FKToUE9Lu8$m>m?)awTix;fw*vxoxE=Pz`JOXXRaY0(AkROE zCtF~bBztjXTBTapzf(%2$CU{-4QEz5&b{iyQdhpeFn+oSz5BNIcy~1CnY(emHw_L1 zdFIL>@jyaemmHOqwqkkA*r#IdUJ#HnD=@xq-{e}Fl@eF~{`sOf4a<3hB@I5m^8qHM zfrFtWSRDd<67&_M24ldL5sX!bn35M(vcXFzH?SF0Q&|e(&Ms>YCr5j24IE3l>dM)Y zezZ6^IR6AivhF=gVCzC|cNFL-B02cmJ3IAO6SSaSvhL%MgeLq4E}?8ucYLey?5~T9 z)ayd>)I-2r_J!d5lLKS#uAoan>0fIoverASNKi}qQk#;u2T{urx*aXY`1Zt!O)N>3 zVx*}v;>rMr)YYxt?z@Wo?(vi4G;H;MSBu4fPD)A&EJCUUJhIOY^a4zSNl67-7aAnd zF$|yw|2%Z7Z*PxW>Tus^ntRs|eE$^RxB2DWp8CzL)zMeHMKCR`A@|Z)L{6g;DU}NPQacLN?9u_rKyL~^YYx!#5_+o_4MuI<~7RzbK<)F@EZ`R=$W)%ngc*wkMe`Xw(kgqGH}AV`XS z=@YXP?r)c$M+CqS^OFOig-*|4Ob!12q0LBa1hQjg`=+vnA;f=*vQk@BUkXW&iv|WG zdb6o0fZqn3qNP$9UK7DAY{J!``Hcto)oQ;WQYPc6qGgwhn5N-yFg;oX-)sFjR~hp) zECDcTSeFyEsB(33;4Gz0rbtzaI^%>3aK|?{o>jHAg13L&I^dD0L0@~-rhI#jpe$h2 zE9u5o3q4?7;3e^;tmE0j8|7!fycG!nHUfBELW$;SL?2aQyd zbdfm`FpRBnM4?jpPeBq=V9Dz6(Gex6oSy!GR(e*Rj5e(NGvx@8S#=YOhkr6kuv}>; zTHpr^Mh8u7}lpHzB5!6F;Qo95_n)UAsG(r&^nUigUkigo$Z_MDu~FGMiHAs~$xoE9uc#X3D{K`R zsHjI2nL`!9tcH^EGjG)9Mi|Ka85oqJ*`Naf;(ukiQ;1hyqpihjLIN5pq54X2+!zni zP)ydu-}wQRcw`&u=wWyX7NYT`6>cyXFb$g3@mn{t;NORCjW8l*_VRg0R51PMGh`lf z1U_m+=B6e?LBZs~#dF%8ny^I;b_{Y0@AXS9Eva7+UT)_mZOR}HuUBBzY}xYL(0yBm zf=0rW=yZ05V7~QeFbJiH-5QT!%+w$~PeCswniywO4hT2gf^$tpVx9==Lt zDP`Ve+>h4yfM01h5l==>!UHRj{_#f2va`EWm}%&GQ+$*D^7JgWS~9%snwif&eL zD+mq!@=Hnm88XDatmrQ2Yv^G|PAsO0g{ci|Q9|u=ioE$SQ~&l#LUbZ!PylXxX~a9@ zqt`PMk&K#!wjUOmH{PNpPrV7NObJxyk1XVi?7}1^+u<2@el8(}oRLO=>2ak$^C{rf zE3t;$c$!uDV+O-io1_y5;GakK^5!EY^pVU?(KyHh-RwN9;5suDXz1s$j~($+tMN4r z@5`auR@0Pf)NN-ng}Ie@&nu8N+f*ULXQ)clGX0$zF!|vqAnF%#u#bJCL4eP288pqI z^3A*7B~)niY8G8WI7f(35k~B?YStF=rX(*TZrX%>ZpZ%2qJ3#ZsuAPFGMX83ev48$< zYAv5IZmqNNLZOdkgd<}LPDE`gC#rLMHo?SlgzY)_n0njgpVUa>r5V9!9P&I3V(zyH zSm-!Z`k8YXu0aBpdh18{$jIL>BwKt{Z>+D3zyXgY{vjcrAOz7+sHhS)1v>l`wW*TO zKt@GtZdaDj97-R-Xx%$jF`Qu0M*MJEh?t7u8Fq1PXKmmZS~Mh6BWJ`#ozZ8)m(f%< zwXX@{5Hw4yk6gyN6jM$}zd;?(UcuB@s>}1b>Ts1JYHw zZ`a>PpXSM*etxwuf|VpuBr!X|VhmEk8M{8+U&!CN8+}wHXc+6NO14B>hX*DHXgmh> z>Yn?aPH$gJx?Hm@(cw~GRBIh>?!$2ziupoO8S1zt!}7ZCm5UzMKI89mj2e02vG?h5 z;*d*9L($U@+)k$68h4w6&q5}as)G>vQE5&8bZs;BG<>KPpwKti&q~NZ?b?PF)hXYv zz2Cz^E{OFW5PC+85Ii+zp3rExG}xRJ<@+iF2t5_4pk|(Ii~IvYwEBvh`Qkms4x|tsX`2Ui+KjVa`Qw$7(C*8YbdKdATi9qfIFU$7$cwvwpv zx~1V;<)ndjVpJ>o*58+A2^Nri6qAbrwDh+uvh?|EF}r59g0z*i#sQW5vY<}ihQW@1 zHX`%dbRzz$;ISXCl0)SGHcikO$-e_3Gy1&Q>JDOwV^+Atyg{m{N^JCe`U^N9Wsp_{ z&r^iu-F>|Ux-@+_`kU;^`umLSqi<%T;iv&;J|RNr?Q{;0<2$u%F{?#CPA-Vq%aJDH zR5p?y&2JWKz4epe)&n;_X)#dXua3~( zC6wKhY`{gB_~divDF?SScjkc<*G~vp{AQw!*<*~1u$^9=UD*URGMWv^qg#{b1jy=J z{AkFYmv`C}GFMBTMHE4;T~@yfD|eT0Oyo$vUeBJLcQXHn6;<7eVOM3Tmn!-og)}2! zA0Yzj-C<1i0hfa^RPLD~dfc+cQb*R{lkdNu_A8gQ?*!5za-ZppC!1!&86yg36gz|X zJj^L<6i}6^%un&vAFd(gUFwKcn)BNe5^GjfQpkgf*@V%LAn)xgtoVUmL&4tt%)Wo3 znc?w1RusIjcu=J>(?iJi(UuweFnh=wN`x|Ekx#_80A%wGJI^dNu6ot5c5r#g^x$qT zt`-rBs!9o5a9qY!#gtCs>Cc2ULojiOG<(rp%83~+X2zsO;c#d>IpJ#=s-1iiJrBA! zjTpT#q{SY@?8^m7QWM%TW$o5KG=0>h zeC}@Ts&c1?2~^M@K0lbm^UtpP-T&};kK}<-`9neblR@e z1G5Nd*9KR|YU=f)I7vhX`ZMpwdtdki2Y^3&D$`V0kO4_dfaY zi`x+rD|+(TkeMcXyF5B06lsJUYF9wt)bp%xUSP@9AjS2)^mD%t84`U@>CJKfwlnrl zby80{jr*K|Y_Z8Y(>%gu&(bRVldW_7UhoyFA|Ux^P6ULxV&Gte*z<&E?~5N+6D+Fm zVWlX+;NG7LMhh|;I{c@Fj$s8WbotE%H1m|Ah1}G8LANnQ!x`>MSZgSaAFH#4{If-M^$|MQ{t|!WC41>yFZIBZ`zNfM4t4}C0$fZ9 zeRp>s0l1(|UMON`d-5{mXSf+Q`lsS93geCw1=*e=OK%D=Ogu#RtzOv;yD3!8P;lhL z`Vr2z9@o@F7t3W&yCoDJpsBc9rtO-5*WzE>;`<&$u_{>`i2$wNni}5}jVjuE$tWU? zV3(`Jzp6gZvmS36AneB4#MlfJ*T%+Xu=ZY1h895+XOs&X-)re5$C|~TaY1CPOLAg0 z^`j`9NNjxAWS7|49|`#hJ~TQ~e~az^^)cor<~WgHGN~s@|5oGFxU3;;t9kwoiSi-n z3#=qm+rLtQpzpSS6n;xtSNbm@=yCv}T%xu`33o+$CI4>h(j;H-{c?h|E}x1%B1T*8 zCQ*Bq{-nK}$20==2oG#G>RLl7kxqxY@y4M#8kWG7(F2@*w*BV({QTOdHJhbm>FYBM z4u+UyA|I+4{B)rzAl_u?>TyZPC8KF`M2(>^TVyJDCS_#cSAsH9>}Ei1=*5ny0@BLW ze3(HW77i6=iPL(6YV-6^Y|TV4OGVmomMHYtArQm`>92a77g?B5nrg368+ z64oSa5_QYWR(;&3BqfYx$CQ66LO&r(|YZrw)dKgJCb3Q5myyC zGavkTy~bHkQaPhg4HHodA7N_`;`mb0QZd?{EKPp1!gk}^ibFF(52jq>97HWM>Q0F0 zp$hFtS5chC5|(7emDfK>P+7A{1iY@F#g0fX@fqhLOT9=210N_D&z^?tUtu!xe`V47 z%FSu|V+2lH_-CTDRY zd%hel_`ko1cBWzktDx7xh=^ny1irZ?Y(=i`4r9qou6Heiq|<|zl|+GZyKebJC^lh> zqLAC!$sIO9HiXR#XQW5yQE~Yi&1o}7GoZ0E;`63;f$`37eGnj}?DY2(Hh~Rr=r^AC zREY#p<|5ImtQZW@J!NoZs`Vr(U1a_g1(8JG&LLl z$l!ryqgwIxZ;WE_6fn7VEBL6MsZziAM;Z{8F5=0Q+7kudekk;#&Inv#X+5psQ|c~X zx=QWv>ZjuAz5L2(IXk;9tCUYc@fN1)^--0c(GD6LJ_XT6lFU^uDwh5_wsr>HG&kzsx*BF$c!nj{9Md!Nl9{(K> zL=P2F7{bWS31tk#zSqG9X@=^tbIMbSEC)5Hq#$3kv_IrFtrT3^9q$&!?I%5dyFOE) z0SID4CmTalHaKTzXK*|I6pm5D*DnI$k&gcsg%>wGoB+uJyhce2F+cWa69HzeaNWN*GD4RIO&63J-PI4TsvsU=1NoCoNTqU3KsTO`{vtUhER>tXRN1;hAB_a zkYiO6*(ARAHLdyhS_TA_p6|0yh>;C>iGlz5L;8-jI&X5U@{jqW4|f8)7q`O=W4jn~ zYgMnrk*0-#p3h$Xf)zvibmcr5sVqK0z={WZg35I-#?rPpWs5mp1s7D`mdAV>r(W!q z0~aM#S6@{%jhh!qqsf^@Q+d7<8elOhuSE7^ykOiW^@K;gjAhDtlfNXYskKEkr}7Zc zCydPm$%>k2!hAONQHto08S}2n0^X{|4dqgQW4ggeh1r+H zor-qh8|lC6K>Dnko@=cHdzSt@JUS^EToJAxjhMJ_hA^;$p|KiTS|OEHKfin}0F+j^ zGXg1yd6OB;{bv4Mt;0c>jRFT8(ow~Be)n)PT-fBsF=x>e@UC!=1TU~|?N^EQf3AsK z!IXlExKzwST$b=rl^)>i?devmgkxL#K{`SdnE@F71EGz{77;f$oXNbi%%{W@)Addg z@(Cw|7HAq=`U~###&~jU#60n{3?k7lk)M_#lGLg2HgF0@#N}uB&KRD5o)WO0+JBKe zYX|M7bha{$SJjX6p$hg_D@3KJyGOMdb5gO?iagy9`^6Lj1^4%U`eb$JUg<+6tG3H% z|H>rr~gyqH+E_W4Pt4+El8)!XerwePbL(eiBJ z+c(bx86w3*a(%P{?g!BJYNq~d-{t@~03H$3BZI4f;$g`G3N{U{b1Y9=kI8y>4oMe8~Tw zx(K{2|EBCMxd7$}qxZTng_>1?7!AFLaD0)F&~);b$nQjmq0qEoDSvK=5zoJ$^4H@N zKcp%s`}PIuL@-T+QlWi96dMCR3X0I7L2OoZ|6z~ij+~iY!KR8@>X3l5zOsswcC1uu zSyOa8JB>UU*@Cs;D4a9;IN!v9ct$B`XnfrwjeoOYjLrj{6lt0P{rfaP;~|a=hT0b? zQ<0jyo4S|yU#39xZY~ZLymoBRf=3l{hns$@L@3Yb7YyToZSeore8bTA&H|}#UhX$+ zi4vQ5{n4Af;iJg*N&tz2Iu)CY=WTJC>(sz5p;kycZws2HfUG1w(>W#@@R{e23fh+p z``uk$`6xPwTKH(G?{jo>4!j{ov+x{ZCuTOEUk4XFbBCFHpXm{5q;(Aph1>}8XS(Tm zR*crf(xB`8m8G5+ShHjj?k%KHcqNh8${*%q*&2~gQ1sI5p3tacTw)T6;I zs&bV`$)L z3I3j}5V;Nx=$eq#`<8Q=-)IAZoloJDf8@wqk$x3MJ%)=&MEMNa?h%iWVvX1qJ>t#xj4E zH7zWNi;7(gNt=gFjDEqRri5Q9F*8r|e(Ovqm)}F*EMpKKf>Bb-vk(gwxzi6Ym8YD@ zsL^askv>M*(HA#&SJ*UOnX(N_-%R-z?B3hMMtV1%spcN3+)yb|cgV6-Unq79IHAuQ zKA$tN-4%k2l0Bccv8)YekD6M-l)G8~`TO#E!OoA>U!`R82WRBemizU`{&4^Ah;~_a zqMRRE#Gz0*Q|rieR(@Dsc14GtVD!DLEZ=>*=}hXWhiwU>#NBg=yK-{uB?oIJJw&FL zF$30D!V*9IQS@-Zgw5ug*h&Tj&AK;Lx9Od2R;e-xPQ)*KOp5lLH%!J0GgPrTGVHI3 zt#q(L(`Z=-YaYCvP-HOr>HQlTJm_C{3mN^Exmm9{y_JjQDp}ONvq2avai=|yVUpwW zT6snlfx|OD_6I}9y=XB5MoXEULf{Q`;rZ3R(ntBp*fdh&=Ok)i9KO#~mUFpeU+8I` z$1>^=_$#m9e(do#-7{wFm4=}A?N_=^r`I(9S~i}j_=U&h6!hLB@TaO58yTcpD(z1z z8tMKbA3AA2IVoiqoNIvuCgIMS z84womopE*ORiHnVe14A|MERa5<>=49>uKvAqx4^R9p@kWO9MHkM!xiN$7m{=RWveJ?~7Mb3*bMs)%fTE0mpA9VVDxgy?MJkz-S(pWoee04>+fB{u8gxt1ZnXr zQn@{`f5nS;K45aEK{>F&0nuIny4@%Gy~LE5#C&uLL-wcS3fSs8{b`oc(sK!y{^5kR<^ryLo+C)Xg?MmG=?m zpPtc#!<2kOXw{yT#MmRY7aA&6b@F5CYl7yjL^`6ja4!GDtKh5$NQ9~|6>7Yb+l4C zer25Zng+xa&{7AZ1ac$%xE%#k+MMM-#t22^F!x_rgAAsMdT!mXaJor*lkYiTW@zMp z58Xt@M^yE($m=a5pC(7BY5OeKrO&CpcX00inr&yyzh<`1pH})I9nWaVs^?!oZKo@N z@dC4^@wwf)+aM5XZ2XM{t4uA3E;Bpf(z!qZH z@id`@98iV&GfM}n`@`lufvW1OpL@mI@yZbh$T=1T;{m*?Aip5HO*9^b*TA!(QU&g< zmqKa-Q~esLFK;^Wh1$mgziz>}L{*y~bO^ac!Ni6K_pmkMxE@~IDJH>`f5oQbH;i5T z6Iod5YP{FM$WXSn+om2WeQzmHPKe$QH`i=BJJ`JR)vz{GgpO!#QD;U3Ncox6FwL2u z`vrNY9-`JOmqDdOAu?Q2d2Qafd_}MJgxO}GO8u8bLedsRiWS~gd$3PlF@Z}ak@)%g zt)|vAhFXU;t*KLnFRB$iKVLKtmi5_@i9fvpZNHzS&f)v07a7roIf1UK4OQ1)!OYjR z`>Y00oG3@GWxuJHgF)EezE8rHBdv;}kyKqk`mwHd_dE^G^gnXBr_ZMlZ?=Vy zcS*+Ua%{P%KFVx7_BIO@a)0m$WA%!wN!M0x>kOgiF2v)@_T+w}0g_=?wD^W``}f0r z>Wlvwz>eeHVaq{4jA<4C8ORf4G!P%;hlL66 z?U$Lk;-06>si~=k!41hoE7yY_==Yn?B`fxX^<6-4NYUHqtg|7>N2iBjrnuG>`<@54 zhq$NfxPNC)kN4S+{RCHwJ5P|^C%(|jJD;VGb4IsWEBB>$_kNw}yH8hLZFl#1C=bSi zrwMB55WNL^>YrQ7x&6;2POyEhk4?SzHS+o<9{*0P19Z&5*C4F=hK4`@H0iusIvQMZ zUseFaiN*iMSNXZ7uexP9a%;=tzw2P(Q}+Te z&*Yw~BQT=>j$pEL=(^DM8KQAt?WcRJ!}Oy)j5g6Y_ zk>G*yFwgxO{e~_s3J81@(RzRB7+1$p3kQlGb!wpX);>xeP3!bLAM(4t>!Jin5bQqT zuKFznMp&?ATTGnnV3T()9{&hfBiwb8wo8F)%to^{k7xyu9_3j zIX?iSR|WNIycK8ZkB+M@Vg(Pi@J_<-;;b=c}EC3Zt=es%kQbj80RH1_dNTNG%jXCs)#!4B)6dt3pfN8=@OKZ5{64lXP_@`cKo6Os=ER_X2MFfJ8_JW~g zpf|K0pofZQzlz!~HgHTHUFEbY`m(U$O4xr8Swwej#RjW^A8mvByY!5M;phfZFcbY7 z4rxAT>fxwYIPw?Pd%E#5(VRzZiwiF0l@N!{6U@e0ADy zCFcYGlFy>Uf%4f@+$oNWck5^%CH0 z^itPu4{C?j*9*Iky6*=5cicvdpa|#Rr^Bl|A-_j4fNe72MwCrE`F-K&SCG6_0~D8o zyMG-HGQk;{OX{FlbvCj-=`d?@V4(=A8%w%vXP41v*`!HJm0piY1lp4fM(8J<%Z25{ zy%0QR$zb$g1#qs^w6uD^CtpBtp&K0?1*o;FWiPHbxndELw?&fDJu5>x-KQk~!C?P= zetEQVbjvcJtE=1F?Q?frKFDj-d9Sw&)@9n{|+-l2W-Cqx!Qor(W3u+FbF*b#u}?pLvzps12hXOeLx zB`lo>Mn`?@wVhMCI{;*7GLb9(yTu{zarvq{%&5a{4S-U}W-i+gYGg7?shR->tk(DB z8yO)witlj{T{r>o+FpY+^n1A2b?eBAy<3msDg;=(ww+vJz-V&b85<7)fvC}D0f;gW zz(3#H*kHdEI|)`*Ui*(F%X{3*TOT!k*F3E>$#Sj z`55!o?{->OU%&6@e*DP9#^!s3+ef30?(XvvF4LpsE`Y*QgB8pj0Jz`%eC-2eWMS`) zg04%Et5Kul1H)45I?M@MN(Pl`73L7UYIpSn|}RMTeJIt zb&>sZ6xuh^cF+GfqOQ}QyW82>RdF^FroSiuR%&Ns&%A!JStEA$6~LSVK>lDYh6+al-rT4wkaWLtov?6IX<#B_A&F6Qe~BfrgXHei@<6kH)NKw>m30A z`h8YUwa8+d*GK*bV3KhfBB+PLH-6vf4QBXyF8unXg{#Z@oEODm88MC!0&(#% znqxQXDX|kzTFu|64f3~=59g(&8x`maOAi@uZ6H0*{m{5MV5@BOwprpf6&w~vZPwGH zjSq8{X(ioECO{hHCPyH>=or!3SD#I|JfB1BM`Ed9QkQJJ>ptYt`Ja8w&r|05J>Eo+ zN-0-FYyi`9ad8okv)}Mjud!74)s8GY)`(q!B5I$M#9sE^VW zgHKpA87W_coAwM5$Z;pfeZS+Vo67G@&<`!?4UI@ho@-MfoHCrbWX8qC1z?Af=S_qv zFJya2)KKjjpAZN`cklBneKZ~r19b8C>D|`UBQLu8?osF28vwv9J6ZUi^gPFD{mS>~ zimz(o>c7|yltHmTYWOdA49@jDetb9`<-&=~{jX?|zh(T^RmmoHF{4pa3sf_Nf=jN% zxu5n~sfC@<0jtXM-Ad6BkWB}CHx7QW!H%ddsFI-YZuC?g8A>Z)!(;WoID_Eyc&sNj z)S&WgVv}1D zBnY&W+3LeN0Mt0^U{=K`SB{I6Xnv^IAW7Y3c3YYh8-7qoC1gebQs>=Q_tXRn%Cj?6 zy;23}+Pw^xDmFb8=#>kqON$rv$D}K|mrtW_aMAq#OPlRA&l_azFk6<~vS@KJHTICy zDkOU6NmwWaYUY&Es3+A$)C%&5p0Wga)UN>U*llM#OL^8JNU#q)053KQ@O@j91r9gJ zJUlC6-`#;oqb$XeQ#}2uJsQeoXC|`oW-Ji&eVQae55TlVpzL~Jy4?+yV(0>uT6ls zV1SjTf9q7JfBQ6n1}>Irgj0)`BcD7#o(1uks8SqIuW-l50*kQ{)SX#aC0Mt!=+9Gy z!#@Qr)=f0}SOww1y(dqQ4TtKs0NFRHyk%osloJ2(p{&Ebhm;GP+e0gEaUt*PI&EcB z3kwV>=<3N3-AXdKxXbiwJgnJ^w-UlrmTYQ6f80|GZ1dR`2)AYgubAQyTpGIb{E_e= zh13LjA`9$nBaLuLfk^PHGa@U_8AXxzn^$K9GzhicZ`MssZ<+GTVQxpMOyLc;)o8l= znBWowEQV3}@;5Ikis3H1b%la202hS@`&R}OPBDc~0e8Kv9w1eqYN~mj_4Rx$)xiEM zP`*+A3Tnmy6hnRFxeH#1+L;Z2uOw;~R>lx>3QgU2d3?Z-1|iWxqzdYHYD#yTZmTWM zUzx^2mfs;MNibQTd~Hg`OhRCY6E* z9kp2LZ>*!NSMam-VKM%MX zYmjXv3SFJmlZjF`uFUK17z~l-8Jt~_L>$eMY;Nb(uulb@t@cPz&O9j6{Ns&(7;^a?t-dou2v6>(eiIs+bgR1?i(HHG{MXjJ~d}MZUe?yU| zLWoZ%QH5>lJw7$)0}8^myTyJOlzi*+g_Mk}v5~N~iL&(f6iVnUxCp#6UfmokK6hx# zijm0d)FP+mqu*bpGGkx6;$Zi7gLsGg7Z#ol{CAVl$cC>6BJ$j%$6HyKW+x_*f)^ zrTV?DX7bvYaSn zco7@KY1>Vi-@V@8BZy*b==O{j#o5PhhM0USCgdaD8T1Bie^J{aL(P5nI$=l+wlwN=4Yr*12AlgwRE!0JUApvG%09N-bKN#&CDEpEJ%vaujY(pyxTC&0{5)$eHj zs72+%H6VK!RS2N}|B7I!+EsjHnfAf($9sm=8jbS5-$cBMXwmeIW-_w2f3(!u*(QYTl;&`yWm>p&pF zMmr`S>JOHV>w%NiQMtoW(-TV>y<$mi>LzPmruJ-o*$Jh1x*@<`IGnge^ zr17~0svh{;+nbN2M}YL8=PE)oWCUjY{^$1~PwP1Ei*$xj{JxhHVlHZnN7pACS(4`t z;8+^b=Cz|F=hVY}j+f?tq<#ZkM5(6f6jo&6Z_Tx>8@hYZDHQK6{{u?HwABrDQCpeS zwDhgRdq{#|{Z(E;J*!p7V2141vU6)rWo1^NrEen~cmDgE#|aQBe1Pt4y`n6)570Ok z-8Z0Hx6kva>tmaI1bG@3T_(g0c$*>&@5uM^T zqC+Yau!rdFm>-i-NLKXT@rnB9$FEz83VxoV67PCeR?dASj{^u=3q2Qg2}27?)tiIi z{!*y~e%JjTYawKH4ZOI|PYErVWY;F3eJar$E032g&wX4mi9xK_hOkL}hkY}Y=)kuj zjVMCQC#?J}pPc^nrFh~Gun6hQ@47$YYSk6&2o*XrZ$(Oibk?nzfISp)Wz#m{CP2t* zx1d(r?aK4H)T5U0_88!MJ@FUkW`oK2916AM;m^WSH zZ0mL=^0*I&%jD_tK_hGE_mB3ST(5IH!9{-uzqrjpBzu#KnQ^E>+T zBv2`<8T_h#pZt!TXoYQ(1hnV<(AJ(X(sjDBhlu~&7ZtzyQQ+;J{(`u z-{#Dp$PE0*M>nUTz;X@um_+U7c`P_(<!B-;0cFU#kC?e3_d_B8*$93)u5b|t8r*HzS@_b0K2xzH2b91}WH)~(G zkS2--Ox9sNc{L0+exF^$Rf>{YLE7yf5Z#p>dEa$DQPIVDlj|SIJK0JQbgvnHIN9>Z zLshS!z0K`m^3z%A;W3za^(9w2Ts~dGDHRZZ_;N33l9K3g{VYe-hB{YyNo;7Zd~$bU zM~>4^$<(aFD9u> z+!Qb)lBgQ@82`5dMDgk0`i%w|AW~F)jsL|6xW#&^(67~*vO_O?Cu$kiEtO1lWraik z0{)OV1%BI#7cXEL(t9tr+<#);j4+`@u*&A#FXAa@jx>yYW1P&krUl6hWV5&0Wi6D( zkI%ZaAM8aX2g9d>BN9p~*>>z$M*6Bb3=5bdr3L#S4BX_nlrS&|*aJspI_IxPZ>z9T zQ(MavStwtF{+18b-?wKaoj}bfKjVv(osmQrIp)=gi~>q*$d8+{$b)k|fJlg}Yi{0F zDRm`-T(kiS-9HLFeSJ#3X+RP~Lmd2?Yb*u4*}V|$O(CV=cX_qV+ts62E5z!uYUsJ? zf`WoOt=K=ZCPL!g8s>Ana<70M@`n_vK4V^bA>)%UE(=zNVKi{Kc)`$7fDMLfu%GjW z`2$xO%dc3Q_CntD;)m@X%{PtKze_B_whj;)eK9(<^h=>+?B?<__pS)hiG6$p@<;f(ve77CmliP0)t6R$(O8_sc` zfbFP2&`ZZ|>r>#BpvmOMT`I7{+1=3l*d4PXXyA+kHOUTLocZpu>=PC1M*(-ApZpZf z(P@{&96<$S*;%&rN_{Fx>}s?Y`$^H;ZS$uk;jm}sMNUf5XGK`|?wcw0tzQ!3{e>vF zJEtd~r+U}$Db)B)ei;zo^OWQ_rHXUiGMEt${+0AaoqEG=dWNZwZ`@n z2>B7@F-;w94lsvgvd=ck`|9GXkmZfIgor5-4L$g9ew)C{qkE8FAv9h6G_H+*yTDj| z9e`!2({6|1yQSkRcQ=#S|8TV;X)y7kSNv+RNRaoN2D!uz$A+^W_}S~n%-<91qJ5U! z6wqJxL5Jb!X)mJe*c}I9-h^ihoH?U>6Y8dl~iIaD27a3OER;5rTZ~E@Q6Co0IOFSj;n=Qlo;J zKV}USz6^5v{g>Ld+Uc-qZvA4;c!hh$`g0wNHqXLpb-#*tj>HEy{5U#E&T_+GKvG;;T(BLo06KF`>~C49OdIFsk>F*GfMivnq`LbxZ7NW)8(>I8KQ3mTd`v9&=+z zNZtPRYIA$?cAvZccr?U+DZx zecj&l!*B7(SM#g9oku!;-d*d3EmD#*JKSXP6NG`1jKZec>FkGKhqM=Zx0!QMRP^=B z^P?9@V!88sL)WV0XvXNY%d25Y$8t6shTdxnq)At6VKvuJcWZQZSczA!&Pv>Evhw1N zAFU)G?TRiok$ZHQe)t>l?nT0<5)0w72D(rJt91rp-(8#wrSNb4zTT@YS34blL>!uP zsVQ>3PrpYvJlY;sZM8&6lbR&&6CIlfNxq3{L7N{vypB@nB`k^gWH-oS{lV|uBehVY zlQRBe!KLIGeZLboC$43Y5MS(YueBI;o@88GQP0NZpz+I3soh8_7sCYsS<04Fv6j+9 zK}meaqKo1g)AqcO*74t%t?1v4(KiIr{OKfoJ+7s;aK7iQgujm=9ug4Qq!yT>5}^DX zGh+8FR!uUinxyXJlQY|VvppZ_Qw~$cTg~}aR)tUj{0$fPyoGDSKMJz~jN4J_5_43~ z+wX!uF?krEt55x?eVL9cz+Nt4Fj4)r7-OGH?sRTU<&3mfNLlD5jWM-KgMC`ym$7&Y zEK^JMZr7h~Wt(oM%?6_2m*dV(btE|!nFaFyRjKL!8DtD}^>@9QG&1HtwWzlHmJP5Z z7d`O2_lpIHd&XDXWzL_L59pz5SJL2}c;P5ul4nOZYz)Kx6)(eUN|7Fi3FO z!wg-o8O^{=*>{tPZZeF3&i=u!$Y1Pr9ZIYnt#6Mch>7;VY1!mfjI(j@$h~Mq z@HFe#jmqdq{^9ySc#pE#XZeG~|umm>DKHn>)X@q$9^GIBR;m%?Kpn?!Ed2WO=lZ9 z*LP?AzeryV-K`$2(KR>29iD#18Qe8X-0ujjo!vQj#R>H7U}@WMaCd}++^9V3#2Z9v0y8a{l&U!4ie3IjzTsc zbjd?o|Fs_+11jJ@l~b~>%)?V|9^R3If*A^Zu{b0<*+|&gRNr9M{K0T~8dZ>OBee z+?M*0-h0Lvyp_Cpg^clg-0>R(IuUs`A~p0=mbZ_nmH~bSA$s&%uBL`^BcE&jUt?$e zPWS)+aZEE^)5g@)FwW$3Obj#AjA6RFjyBWv)_L?{o1ShajukgouBMlfwSakxyih zkkJ;HRYh~2(RP_}^CRm;E%T5e7(bB1nkZ3a!;k3 z;c5pK!~FM4dyEB&0b@}dZ~;`DcI@7+c;tM|+)>7oFG!)i!AT@l04FZ6N5d++Q}6Gd zKHnn{^**8ecCsQ%gpT}YDY?5J89#0yS8p@TgU$2}L=A}hoHq;uKhE>t_da*<0X&eM zl&wo~pWNKs*209Z@Tk6@Z;cg*imeWqD7+f9AZV;dqxW1wjsKKZ^v1nrioglv8DvH# z?R))m6>*5VHt&W1Rg0=MzTMI30rNO-`@O)*Q)%oquNW4kx6`0k*Kzt%b!Ev%v^~Zp zC2PR|#d9k!e1SNl$CNhSOSEEBbj($J;OFr8m;2}rHJ2R^PL+h4Gq5pq!^qX2U)l_k zb2v1vQ?vx!-}PRsIjz5VZD+SVQ+EJ8N5bkXy^LGgvV9u;)cHoaWEI*HsiZN{?tdNE z;VIqT&2G3KuPIGi(0&~Ct_v+hv6^2TkR(Ogw2NjZ;AA!E#Ue0!E_`Sl3q3c|EJ3BxA^-71298(tT2+*@@>L!V?bfHQpH}yu zdRsCVjSZ)xM@d8~#IO+xF?FwML#-7#XeI@5f*3)R0+BSNXR0bqI|bI{p5FIbBf!`G z=G*ayN}(mWe^!q#J2oPuas~d0lUYFPgWET^?Sz&3j)72N?RDO+x%{JcAorV8Q{YT|Ohwa|lN|7oRdy z?|1dtuk2sqSO&0l*aw|i;$mIUawbL%4^XHxjHk~OMf2TV5hB9$apdeVX5qGC<0+C| z(B6Vt>Wc-o11uBTtd7n7R#2nR?Vh62soXi_f05Jp z%EfnkCWqF>;Qac^Hfuxf{(5XcP@?!}2*d#Wq`+!GQ})({Kzdiok91Veu3Hx=AWMc6 zIc}5FsBxCxkwl#Ip43#%nS7dX7_^ARAN?$&wisq>Zcj(3#_nile%pE;Ni-1%mr4k zX*eLKp!nDV{}I@Bm*TKr+IV@T1#vFUu2t0st1o5YR@Y|Gt9-dEx|J*73(ZFAcAz!YEM_|puhJsR>TF20BvR{Nj#C0n_v8^tIYoa2_sj(e`7vq5c zUx#^alC*A0^noW2UdIDfvf39bj6JEXV+gz4R3h5Qzu}V8Xh7)!$E;bRu%T*!Kh(Bl zN(=5Mlui^s*ZMb)Q&}!|lXZ;JB26h#T?tpPBo3kR2i072dAcnw%WRUDkx`6R!64?v z2JXfT_tYCOCUr@9qSFZJ|6$v0tFjnNI%dH~e|0Nyb$b_vr~z~C5vzPkax(cp;6|4P z8xuUBEe|J2-+--ACUE}y*Zy^323+JH`)T;)T9=igi``(QfZ?{J$dN>O?^zUK=zB+A z5yCN)UgOkZxct1!V9V&KEmc^_?yQq&_LBkefkILir64gxmVzXHm;7r+!dRvyCQAPZ zJl+i1*V%iGjg7t6_O2b)w0#igwTQ}HY7MeRFC;9>(~lb$?>JaWNwx^dcYLm;Pw$di zR63|NrdKex7xNos)kgiKz#sYZP!XG+aw8ma`6Af=9g2yoC_S~zZXYwh6@5lW3~N9# zxZmuBM7SoN{~?Psu$59iMXXXiup_DgUf7tSx}!xbSir2-iw=pZ2=Q0O%_ zw8LZxjTM!YqVo}RsiX+mjj+FG1koW8zEM+or42sjqwvhv0zs)DodV&-QlUuc^r#rC=sZ&|qR6A`TOhZ)*BqAPz}Q@^@RBHKd=r#;(A-?vc3SGz4l%y?K%toMQkO%wSNVU) zE^1p_37F7<*-MSc67?8y5?$ckoV|%VyS|OTBp#R5SnDlx4^b35Odut4#u!D0xPlr_ zRr%G&uS;!C`{Z)*c*?Lv&sPTCF^E{w5=cy5ZE2kndeYTOsDMx~-8vUYVZjO{rV$Rr zOkG~Ag)U|XEDRki#ma=kRF_vX-k5#W!uN7Lf#iO#L!&vXZ*6Ubwa!j?7C0fB?0>t@ zzTT}#gT*3ZtL*ee@0&VIMv+4}T1j-vaywY>nUhypU4{l;K=2fjNR zI*RYrM9!2nb{k`s5g;fk4Vw(8Inpiwl7blw6(B`ZwPYqw-&l0X!LIL097q_-5QG1x z5-BL8UcPRjS>`d6l{#;)?nj6j+zUAsZNa)EMT#O>4eq{b;+B_}7a|&KuZJup3SdbM z_jlJlfK-DgYr<`sYHHS|3b+}vGK{>adByuqPW%`i!-<7e9X62b5|6X%5f|~ZCrNhu zK1Xy7zb!J&(nSMqFC_e~1RwY#8z11r+MqnVf<mg#fb70|H(Q;;XK%yt~4sBv?(h9(}x^wf>{(2Yg)gditvfX`Ac2i?+pA zxBw}Wjd*mK5Mec1?W?-oRA-45j0*CZ4BOU-i~aIy*Iwc_5W=~CL8m${vbvrAO~EI& z8(JZG=wTXvni&>}4YbLPytiTTwa?H5of8((tV}k27Eb7I$KUWqf)#AnWpiYi(tnwf zdff>ETOLu+dy7lG_AWuF$HT-)4MVUhWR>3GUQ~I)?s;5$0V;&NKmrJ8?_!tjJQZ3gp3re|bDO%kX*VDE9ZX2x9mOh?EHo|N+CMnpQ2_M;V*VF>hZb_6 z(VT7Y2B`Y(_jb9n->@i=P!dZSRKZtp_wb6ZBvSLn;l6Z@Cn+ugxFqW_($0*>d@S@& z+L>9bJ6rgG5`n)fLltKKLeVuZbz=oTb}YZ= znFEhFV(x?wa~5=+xZTlFmfjpe)>v{(*GTX=h&>x z%h~SFt(AhtA~*A-2h3l1^N$)G$KpE^`nv)Ek-2IV5!XSd=$HA!?YgQk~mx2`eXce;GBj)pzm3e<>(ZYNfXqMF$Ue z^Zl=j#GIRMI5!h6R^{O3u>>I(%gQ=d{*}$Z#n(X6Iwu?X7v`CKPJZZC?+4b*4w2vL zYV$l!ps70fUPK<7HgYx%T6{vjiAgqUGtjZ);?qn!WEeX2Up5=3`pLk_Jd;RHF#?Ko@D(%ak3+M#bz8>n?s*;H;1|;wEc^Mcbwt*u zd)l8FX9XVezS!Jwy8lOo>FqMFY}DWL6@Nj_+PnZ4^koX71Z}@x(q)^YL9v-W1c8HrS`WW6X9i@&HUG4AR$YEz?IK96@LmzXX zpV|PCy5ttbEKW!g?&w~bvT;H#dL@)gftlZtW>8zRii0z2@efpoAG`R4A3SOiUStpvH7G1-S+;ca_ooNcRfd%v@5`E}c#+a#Gm+CB>y6Clc6pOG zfmcZiHhV%t^(w@g>s|}Um=ZFL3^4?q^jl}@`VU9{6oZ5+W&IM)`Zn_=9O2j*GvIQedn6nQw_dx~R#{r^$=R&RWN3Fh=p3e_))o(rk1JR-=jRQ|Bi#k6xuH1}xcFH1?+s0j*MlODtDlEB4MsSF)YazgTuiG$OKBK72x0;kv&Y zo=S_;PxacMhppE@Wi_QOib*jQS5KX-g{m#baU3Uh;!^|Hu%yd=dt0#=Q79Ao62VJj zqsI9jB3Ht=GN<|5!M$z569OYG=@)1HozFLiA|Z-)*$1qPaTy9z`HRqZkBxApvR`D+nmf zW6x96={=;u&EoByFVAlZr;g2$E}xq>CYPe4)X0(5y778Z4702R3DGkSGE~X8=xf!7 zpMYmYq`HWCv4{L+r{9mk#7}u?W!8}RRSRPOX;~`6Ev;)K5Gz>-OPN6#U+>3AH&jkTL!BY z8c^XGUKjiAa4}b&2$}N!_i6}jY|7l?e0KL3K4@fiT~vcR;$y?DTs7dv$=kqVSEUoW zzL_@k)?fFa<7H{*k;B>Xdm}RKKRe>pB`TRJGSBbr(s8@~t(-0XG+BbsRiG7TOJTg# z>be1)Tr;j!@cFsl9Kw1Bs&eCBYKKe4G%aiOteALrXR6V~4#LWa_|yuHzspE3vsC-u zRN{&@aeAHy?`p3WX}hlr2%R-=2#juY)J~^w&uL5D>Bv0-}Tge3%A)Y z<@8s};T{Y=28G1o?e&G&&ADS^@B6h_c*_UV>6)Ll@{x3qC z%aT&al-LDz)JtT0idHNiTW6}U_LRTE<=hI0=7$QE4~cv?a1w%(o05FzHEdShJ*L(x zeMZbW+<8-%qlkc4-A0I70GS04`P9@D@1xYo z$w?)uFzl{Tywkqb@4E%mz(qUr1`(r9v_6jg=MJA~r565(B&;_Mi*T&fS?UIEfA&^Y zpR+ZhaQ$_x`1Agh@8-f&Og_B`V5Oe7S7(yEb>^Mlfc5Fz_*D|YxrgQ}Lma>2C*kXcB~3t{1K=f;0hW#Bg!rFq6UM(lYbtH7!>&SNwA;3Hr_4H)^n(#EJ}CC znf-;9-7u5UZyIk)(Gv&I)w9Je;ky!^hwTHwcVi7c4}x*3%eGn!V|*tS8mDll5GNs~l`?8xV2CfIFJ2cK|rLbOMXf zsBoIf{KgC#7Fjlw}$){K? zsJe5)>Zi)fb+kRp<(W-0s~lP zsKxFKc~YHrr?>?(R6$0nd;#>iPG!S?C4cQ#cc-h=gviv&(fC)>rfvRjorsXyQ>0mH zU~Fh?jO4@5A_wGh;z0Lfw~72z`ozhPg;VBM+7`8?Dg}(#{CIikBNBK;bA_SywhIR~ z%*>|SpSfCLU@&{P?1yOLl~#o1$aB2P&b}b^-O&+Blh;}{v8~w0V)|3>nQ7cZK_|GrU#CYZt%w6L7j{L)NF3dDkLk5&iC%- z2>?gINF90e*(RxSvw8G4ZmSg_mqWjOF#`)Mmj(;2H~QcVa08 z6sKLzwgJjseOf2jH3>RYl%epzcJ2N-?&wRKCK7VEW~qsb3n}h$wR&mhiAjM3O1K0GE#;7~S8MuvUJ-WgGebc_PRmIyJo3?z zj=gf!j*rT7TYY#6{P&l8qiN`qe$?VMS;Xo}>aW<5`_EppR!0Pjd{AIg8MD-SgtpX; zNXap1lMu}#xL1Fi!-?BcmycPQELJyVm=gsTx)Jxf-~TImFk@9=#U=P$IUg0aGRl{e z>Yf^e%gN6639S>{bhS>t(-rK;SJ2foJ-y5y4rg@H@(bpKdi=vPh+m`ZJnx^ExKY2s zML;Mb5Jk{JaU)wMOz!k^!|e+%-t(R_Z}DcJ2&ST3ZwzN7LSpEWeuM0zZ++LC==m3; z(hTa3J08DX4uO*JTYnoWGK(+krbPWokI$nXYd(wh8p`o_lIVv!0} zN)ZPLXRf7~LZi|_>6>|BPm(-XM25;BbeK+!we8D$$AdRL_ebtNr?U&>E^%>jHEeD+ z`eEkb!pIg~x`5UaOisoqj)p=zO(>Ez@>`h6@<<3@2IyDWuu1Ez2qyMIAYw}wWZRK{l3DMRKQq0bA6X6{qeThUHw~zOla1%7W_RiIyCAC>1*4hW2OkBBZv(P zn%;E-`W^@)ZfR*TXuh2jJj0i8oL}Lmjy?ocZyM!KziT0|&bBONcxnqsx`$O}KmV>^ z^;hOS=RzaF@Yy5B>@U-kHG)+zZA(3o;lnXbXSKEeNp&7kIj z7{><4P*xQkpb6RWJGSWDI;(JWi9Y{O7n8DLIY8rW#QBp>IHOE!&Ck zvf})u_gbl+7G-i7_%7s6%_OFDSQBw(_uMPbSd~`rpTxe*!AdXVg1;ZsofE69p0sY{ zQU$Gdju2OJ{iy25Ij@9xirC=u`7RvUk9I)^AvF}`20YA4BuUE8zyJ#lex%d05$2-$ z4>HOU)EOrhTvGZD|HDaLeDz$)#mEH9pWU->)zzzCVge<-BM|NQBsQw=&{q7l1v$y0 z^-5iR--n;YfynG>{K4}}M(l5GZ3hXj$gJns(Enbl&8Vf)`GWM>96E+ zpjPxHxko6$;(v*ZCW^k|M1N4M-n;pn?!Eb<2Caf#wzzNiJBqgFf>s7+bq=u&df`lcSN$^C0H}7CzZN@()+3>>$$LX=!u|Gs%MW1)}WlH*OQ2T;kH0U%F zm{xY`s!bM#GnHzj%bl9v`rjKouIP7t0?r7DdT>mXk$j+pSD}^Tm%iiNUt9F_J>5BQ zZ`%7v%yNZW9)r>mTV_y)&a;+4UbSDk3aW7&%AjMiUmBWs_ysBkEQOJ_4yJ zDXa#RX5wdW>#$;9a&do2U?>>t7ac3pmBGBGE*QHyk*KpOFXnGl-wA~j>yh&K!hcSE zP)tv-9C`_MIaD?w7bUNitAHEi5rQ0+3wD8$|M!o3^((?jISmPu&(^QNBNkAUnV2bEHhcK`qY literal 25455 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

CB6vEhb@{80l(VZNs?H5(_kqi)T_^hz( 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 UxexR&ei>nEWNBEZ@BZrl01mr&_5c6? From 5336b7cfb44ef87d97583289639a851b2774a93d Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 14 Jul 2026 15:23:16 +0200 Subject: [PATCH 084/107] who tf names their child "gershwin" --- changelog | 2 + .../api/hbm/block/IPileNeutronReceiver.java | 1 + .../blocks/machine/pile/BlockGraphite.java | 31 +--- .../pile/BlockGraphiteBreedingFuel.java | 1 + .../pile/BlockGraphiteBreedingProduct.java | 1 + .../machine/pile/BlockGraphiteDrilled.java | 1 + .../pile/BlockGraphiteDrilledBase.java | 1 + .../machine/pile/BlockGraphiteDrilledTE.java | 1 + .../machine/pile/BlockGraphiteFuel.java | 1 + .../pile/BlockGraphiteNeutronDetector.java | 1 + .../blocks/machine/pile/BlockGraphiteRod.java | 1 + .../machine/pile/BlockGraphiteSource.java | 1 + .../hbm/blocks/machine/pile/BlockPile.java | 87 ++++++++-- .../blocks/machine/pile/BlockPileBrick.java | 76 +++++--- .../com/hbm/blocks/network/CableDiode.java | 164 ++++++------------ .../java/com/hbm/inventory/gui/GUIDiode.java | 95 ++++++++++ .../hbm/packet/toserver/AuxButtonPacket.java | 5 - .../hbm/tileentity/TileEntityTickingBase.java | 8 +- .../machine/TileEntityICFController.java | 5 - .../machine/TileEntitySolarMirror.java | 5 - .../machine/pile/TileEntityPileBase.java | 1 + .../machine/pile/TileEntityPileBaseMK2.java | 69 ++++++++ .../pile/TileEntityPileBreedingFuel.java | 1 + .../machine/pile/TileEntityPileCore.java | 150 ++++++++++++++++ .../machine/pile/TileEntityPileFuel.java | 1 + .../pile/TileEntityPileNeutronDetector.java | 1 + .../machine/pile/TileEntityPileSource.java | 1 + .../network/TileEntityRadioAUTOCAL.java | 5 - 28 files changed, 512 insertions(+), 205 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/gui/GUIDiode.java create mode 100644 src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java create mode 100644 src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java diff --git a/changelog b/changelog index f2304c57b..501633972 100644 --- a/changelog +++ b/changelog @@ -7,6 +7,8 @@ * Finally removed the old terra drill items after being deprecated for almost a year * The electrolysis machine now instantly annihilates all buffered fluid output when changing recipe * This is a straight downgrade but people for some reason wanted it so sure why not +* Cable diodes now have a GUI for configuration instead of requiring tools + * The throughput can now be configured more precisely instead of increments of powers of 10 ## Fixed * Fixed burner press GUI offsets being incorrect diff --git a/src/main/java/api/hbm/block/IPileNeutronReceiver.java b/src/main/java/api/hbm/block/IPileNeutronReceiver.java index caac67bcc..63448c086 100644 --- a/src/main/java/api/hbm/block/IPileNeutronReceiver.java +++ b/src/main/java/api/hbm/block/IPileNeutronReceiver.java @@ -1,5 +1,6 @@ package api.hbm.block; +@Deprecated public interface IPileNeutronReceiver { public void receiveNeutrons(int n); diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphite.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphite.java index 28ddcd06a..826c56e78 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphite.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphite.java @@ -1,41 +1,12 @@ package com.hbm.blocks.machine.pile; -import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockFlammable; -import com.hbm.items.ModItems; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.ParticleBurstPacket; -import api.hbm.block.IToolable; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class BlockGraphite extends BlockFlammable implements IToolable { +public class BlockGraphite extends BlockFlammable { public BlockGraphite(Material mat, int en, int flam) { super(mat, en, flam); } - - @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.HAND_DRILL) - return false; - - if(!world.isRemote) { - world.setBlock(x, y, z, ModBlocks.block_graphite_drilled, side / 2, 3); - PacketDispatcher.wrapper.sendToAllAround(new ParticleBurstPacket(x, y, z, Block.getIdFromBlock(this), 0), new TargetPoint(world.provider.dimensionId, x, y, z, 50)); - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, this.stepSound.func_150496_b(), (this.stepSound.getVolume() + 1.0F) / 2.0F, this.stepSound.getPitch() * 0.8F); - - BlockGraphiteRod.ejectItem(world, x, y, z, ForgeDirection.getOrientation(side), new ItemStack(ModItems.ingot_graphite)); - } - - return true; - } - } diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteBreedingFuel.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteBreedingFuel.java index fdfcac709..795898430 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteBreedingFuel.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteBreedingFuel.java @@ -19,6 +19,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class BlockGraphiteBreedingFuel extends BlockGraphiteDrilledTE implements IToolable { @Override diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteBreedingProduct.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteBreedingProduct.java index 04ab98c8b..6f7d6b2de 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteBreedingProduct.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteBreedingProduct.java @@ -9,6 +9,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.Item; +@Deprecated public class BlockGraphiteBreedingProduct extends BlockGraphiteDrilledBase implements IToolable { @Override diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilled.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilled.java index 309f8b2d5..c628eb524 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilled.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilled.java @@ -12,6 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class BlockGraphiteDrilled extends BlockGraphiteDrilledBase implements IToolable { @Override diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilledBase.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilledBase.java index efe9764b6..9b3dfe978 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilledBase.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilledBase.java @@ -26,6 +26,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public abstract class BlockGraphiteDrilledBase extends BlockFlammable implements IToolable, IInsertable { @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilledTE.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilledTE.java index 5aff70327..4c5b1f6a2 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilledTE.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteDrilledTE.java @@ -4,6 +4,7 @@ import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.world.World; +@Deprecated public abstract class BlockGraphiteDrilledTE extends BlockGraphiteDrilledBase implements ITileEntityProvider { public BlockGraphiteDrilledTE() { diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteFuel.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteFuel.java index 7b3b892ca..b8435722f 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteFuel.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteFuel.java @@ -21,6 +21,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class BlockGraphiteFuel extends BlockGraphiteDrilledTE implements IToolable, IBlowable { @Override diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteNeutronDetector.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteNeutronDetector.java index ce6fddf76..535eb7ac2 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteNeutronDetector.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteNeutronDetector.java @@ -19,6 +19,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class BlockGraphiteNeutronDetector extends BlockGraphiteDrilledTE { @Override diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteRod.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteRod.java index 36f65bacf..46e9dc969 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteRod.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteRod.java @@ -13,6 +13,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class BlockGraphiteRod extends BlockGraphiteDrilledBase implements IToolable { @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteSource.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteSource.java index 979ad2471..819f641c7 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteSource.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteSource.java @@ -13,6 +13,7 @@ import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +@Deprecated public class BlockGraphiteSource extends BlockGraphiteDrilledTE implements IToolable { @Override diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java index fb1d35a9f..151713658 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -2,36 +2,63 @@ package com.hbm.blocks.machine.pile; import java.util.Random; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.MachinePWRController; import com.hbm.lib.RefStrings; import com.hbm.render.block.ct.CT; import com.hbm.render.block.ct.CTStitchReceiver; import com.hbm.render.block.ct.IBlockCT; +import com.hbm.tileentity.machine.pile.TileEntityPileBaseMK2; +import com.hbm.tileentity.machine.pile.TileEntityPileCore; +import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class BlockPile extends BlockContainer implements IBlockCT { +public class BlockPile extends BlockContainer implements IBlockCT, IToolable { + + /** Blank dummy, the pile is mostly composed of that */ + public static final int META_DUMMY = 0; + /** The core, gets its own TE and runs the simulation, only one per pile */ + public static final int META_CORE = 1; + /** Channel mid segment for channel intersect checks */ + public static final int META_CHANNEL = 3; + /** Startpoint of the channel */ + public static final int META_FUEL_IN = 4; + /** Endpoint of the fuel channel */ + public static final int META_FUEL_OUT = 5; + /** Startpoint of the ventilation channel */ + public static final int META_AIR_IN = 6; + /** Endpoint of the ventilation channel */ + public static final int META_AIR_OUT = 7; + /** Control rod channel */ + public static final int META_CONTROL = 8; + /** Edge of our pile "cube" to prevent channels from being drilled there */ + public static final int META_EDGE = 9; @SideOnly(Side.CLIENT) protected IIcon iconTop; - public BlockPile() { - super(Material.iron); + public BlockPile() { super(Material.iron); } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta == META_CORE) return new TileEntityPileCore(); + return new TileEntityPileBaseMK2(); } @Override public int getRenderType() { return CT.renderID; } - - @Override - public Item getItemDropped(int i, Random rand, int j) { - return null; - } + @Override public Item getItemDropped(int i, Random rand, int j) { return null; } @SideOnly(Side.CLIENT) public CTStitchReceiver rec; @SideOnly(Side.CLIENT) public CTStitchReceiver recTop; @@ -40,19 +67,51 @@ public class BlockPile extends BlockContainer implements IBlockCT { public void registerBlockIcons(IIconRegister reg) { super.registerBlockIcons(reg); this.iconTop = reg.registerIcon(RefStrings.MODID + ":pile_block_top"); - this.rec = IBlockCT.primeReceiver(reg, this.blockIcon.getIconName(), this.blockIcon); this.recTop = IBlockCT.primeReceiver(reg, this.iconTop.getIconName(), this.iconTop); } - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return null; - } - @Override public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { if(side == 0 || side == 1) return recTop.fragCache; return rec.fragCache; } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPileBaseMK2) { + TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; + world.removeTileEntity(x, y, z); + world.setBlock(x, y, z, ModBlocks.pile_brick); + + TileEntityPileCore core = pile.getCore(); + if(core != null) core.destroy(); + + } else { + world.removeTileEntity(x, y, z); + world.setBlock(x, y, z, ModBlocks.pile_brick); + } + super.breakBlock(world, x, y, z, block, meta); + } + + @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 == tool.HAND_DRILL) { + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityPileBaseMK2) { + TileEntityPileCore core = ((TileEntityPileBaseMK2) tile).getCore(); + if(core != null) { + ForgeDirection dir = ForgeDirection.getOrientation(side).getOpposite(); + return core.drillChannel(x, y, z, dir, player); + } + } + MachinePWRController.sendError(world, x, y, z, "No core found", player); + } + + return false; + } } diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java index 2faef09a7..cf02d71c0 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java @@ -3,6 +3,8 @@ package com.hbm.blocks.machine.pile; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachinePWRController; import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.pile.TileEntityPileCore; +import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileOrientation; import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; @@ -19,8 +21,6 @@ public class BlockPileBrick extends Block implements IToolable { @SideOnly(Side.CLIENT) protected IIcon iconTop; @SideOnly(Side.CLIENT) protected IIcon iconSide; - - public static int MAX_SIZE = 15; public BlockPileBrick() { super(Material.rock); @@ -42,6 +42,12 @@ public class BlockPileBrick extends Block implements IToolable { return this.blockIcon; } + + public static final int MIN_V_SIZE = 5; + public static final int MIN_H_SIZE = 5; + public static final int MAX_V_SIZE = 15; + public static final int MAX_H_SIZE = 15; + @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { @@ -50,6 +56,7 @@ public class BlockPileBrick extends Block implements IToolable { if(world.isRemote) return true; ForgeDirection dir = ForgeDirection.getOrientation(side).getOpposite(); + ForgeDirection dirLeft = dir.getRotation(ForgeDirection.DOWN); int negHeight = 0; int posHeight = 0; @@ -57,32 +64,41 @@ public class BlockPileBrick extends Block implements IToolable { int right = 0; int depth = 0; - for(int i = 1; i <= MAX_SIZE; i++) { if(world.getBlock(x, y + i, z) != this) break; posHeight = i; } - for(int i = 1; i <= MAX_SIZE - posHeight - 1; i++) { if(world.getBlock(x, y - i, z) != this) break; negHeight = i; } + /// PROBE DIMENSIONS /// + // height + for(int i = 1; i <= MAX_V_SIZE - 1; i++) { if(world.getBlock(x, y + i, z) != this) break; posHeight = i; } + for(int i = 1; i <= MAX_V_SIZE - posHeight - 1; i++) { if(world.getBlock(x, y - i, z) != this) break; negHeight = i; } + // side width + for(int i = 1; i <= MAX_H_SIZE - 1; i++) { if(world.getBlock(x + dirLeft.offsetX * i, y, z + dirLeft.offsetZ * i) != this) break; left = i; } + for(int i = 1; i <= MAX_H_SIZE - left - 1; i++) { if(world.getBlock(x - dirLeft.offsetX * i, y, z - dirLeft.offsetZ * i) != this) break; right = i; } + // depth + for(int i = 1; i <= MAX_H_SIZE; i++) { if(world.getBlock(x + dir.offsetX * i, y, z + dir.offsetZ * i) != this) break; depth = i; } - ForgeDirection dirLeft = dir.getRotation(ForgeDirection.DOWN); - for(int i = 1; i <= MAX_SIZE; i++) { if(world.getBlock(x + dirLeft.offsetX * i, y, z + dirLeft.offsetZ * i) != this) break; left = i; } - for(int i = 1; i <= MAX_SIZE - left - 1; i++) { if(world.getBlock(x - dirLeft.offsetX * i, y, z - dirLeft.offsetZ * i) != this) break; right = i; } + /// SIZE CHECKS /// + if(posHeight + negHeight + 1 < MIN_V_SIZE) { + MachinePWRController.sendError(world, x, y + posHeight, z, "Height too low (<" + MIN_V_SIZE + ")", player); + MachinePWRController.sendError(world, x, y - negHeight, z, "Height too low (<" + MIN_V_SIZE + ")", player); + return true; + } + + if(left + right + 1 < MIN_H_SIZE) { + MachinePWRController.sendError(world, x + dirLeft.offsetX * left, y, z + dirLeft.offsetZ * right, "Width too low (<" + MIN_H_SIZE + ")", player); + MachinePWRController.sendError(world, x - dirLeft.offsetX * right, y, z - dirLeft.offsetZ * right, "Width too low (<" + MIN_H_SIZE + ")", player); + return true; + } + + if(depth + 1 < MIN_H_SIZE) { + MachinePWRController.sendError(world, x + dir.offsetX * depth, y, z + dir.offsetZ * depth, "Depth too low (<" + MIN_H_SIZE + ")", player); + return true; + } - for(int i = 1; i <= MAX_SIZE; i++) { if(world.getBlock(x + dir.offsetX * i, y, z + dir.offsetZ * i) != this) break; depth = i; } - - if(posHeight + negHeight + 1 < 5) { - MachinePWRController.sendError(world, x, y + posHeight, z, "Height too low (<5)", player); - MachinePWRController.sendError(world, x, y - negHeight, z, "Height too low (<5)", player); + /// CORE EDGE CHECK /// + if(posHeight == 0 || negHeight == 0 || left == 0 || right == 0) { + MachinePWRController.sendError(world, x, y, z, "Core cannot be on an edge", player); return true; } - - if(left + right + 1 < 5) { - MachinePWRController.sendError(world, x + dirLeft.offsetX * left, y, z + dirLeft.offsetZ * right, "Width too low (<5)", player); - MachinePWRController.sendError(world, x - dirLeft.offsetX * right, y, z - dirLeft.offsetZ * right, "Width too low (<5)", player); - return true; - } - - if(depth + 1 < 5) { - MachinePWRController.sendError(world, x + dir.offsetX * depth, y, z + dir.offsetZ * depth, "Depth too low (<5)", player); - return true; - } - + + /// VOLUME CHECK /// for(int h = -negHeight; h <= posHeight; h++) { for(int v = -left; v <= right; v++) { for(int d = 0; d <= depth; d++) { @@ -97,14 +113,22 @@ public class BlockPileBrick extends Block implements IToolable { } } } - + + /// BUILD /// for(int h = -negHeight; h <= posHeight; h++) { for(int v = -left; v <= right; v++) { for(int d = 0; d <= depth; d++) { int iX = x - dirLeft.offsetX * v + dir.offsetX * d; int iY = y + h; int iZ = z - dirLeft.offsetZ * v + dir.offsetZ * d; - world.setBlock(iX, iY, iZ, ModBlocks.pile_block); + + if(x == iX && y == iY && z == iZ) { + world.setBlock(iX, iY, iZ, ModBlocks.pile_block, BlockPile.META_CORE, 3); + TileEntityPileCore core = (TileEntityPileCore) world.getTileEntity(iX, iY, iZ); + core.orientation = PileOrientation.getOrientation(dir); + } else { + world.setBlock(iX, iY, iZ, ModBlocks.pile_block, BlockPile.META_DUMMY, 3); + } } } } diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 4dd7a8f80..371abb076 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -1,34 +1,36 @@ package com.hbm.blocks.network; -import api.hbm.block.IToolable; import api.hbm.energymk2.IEnergyConnectorBlock; import api.hbm.energymk2.IEnergyConnectorMK2; import api.hbm.energymk2.IEnergyReceiverMK2; -import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.energymk2.Nodespace; import api.hbm.energymk2.Nodespace.PowerNode; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.gui.GUIDiode; +import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BobMathUtil; import com.hbm.util.Compat; +import com.hbm.util.EnumUtil; import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockPistonBase; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; @@ -37,28 +39,16 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; -public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, ILookOverlay, IToolable, ITooltipProvider { +public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, ILookOverlay, ITooltipProvider { public CableDiode(Material mat) { super(mat); } public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - - @Override - public int getRenderType() { - return renderID; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } + @Override public int getRenderType() { return renderID; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } @Override @SideOnly(Side.CLIENT) @@ -76,57 +66,16 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, return true; } - @Override - public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - - TileEntityDiode te = (TileEntityDiode)world.getTileEntity(x, y, z); - - if(world.isRemote) - return true; - - if(tool == ToolType.SCREWDRIVER) { - if(te.level < 11) - te.level++; - te.markDirty(); - world.markBlockForUpdate(x, y, z); - return true; - } - - if(tool == ToolType.HAND_DRILL) { - if(te.level > 1) - te.level--; - te.markDirty(); - world.markBlockForUpdate(x, y, z); - return true; - } - - if(tool == ToolType.DEFUSER) { - int p = te.priority.ordinal() + 1; - if(p > 4) p = 0; - te.priority = ConnectionPriority.values()[p]; - te.markDirty(); - world.markBlockForUpdate(x, y, z); - return true; - } - - return false; - } - @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add(EnumChatFormatting.GOLD + "Limits throughput and restricts flow direction"); - list.add(EnumChatFormatting.YELLOW + "Use screwdriver to increase throughput"); - list.add(EnumChatFormatting.YELLOW + "Use hand drill to decrease throughput"); - list.add(EnumChatFormatting.YELLOW + "Use defuser to change network priority"); } @Override public void printHook(Pre event, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - - if(!(te instanceof TileEntityDiode)) - return; + if(!(te instanceof TileEntityDiode)) return; TileEntityDiode diode = (TileEntityDiode) te; @@ -142,36 +91,47 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, return new TileEntityDiode(); } - public static class TileEntityDiode extends TileEntityLoadedBase implements IEnergyReceiverMK2 { + public static class TileEntityDiode extends TileEntityLoadedBase implements IEnergyReceiverMK2, IControlReceiver, IGUIProvider { + + /** Used as an intra-tick tracker for how much energy has been transmitted, resets to 0 each tick and maxes out based on transfer */ + private long power; + private boolean recursionBrake = false; + private int pulses = 0; + public ConnectionPriority priority = ConnectionPriority.NORMAL; + public long limit = 1_000; @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - level = nbt.getInteger("level"); - priority = ConnectionPriority.values()[nbt.getByte("p")]; + if(nbt.hasKey("level")) { + this.limit = (long) Math.pow(10, nbt.getInteger("level")); + } else { + this.limit = nbt.getLong("limit"); + } + this.priority = ConnectionPriority.values()[nbt.getByte("p")]; } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setInteger("level", level); + nbt.setLong("limit", limit); nbt.setByte("p", (byte) this.priority.ordinal()); } @Override - public Packet getDescriptionPacket() { - NBTTagCompound nbt = new NBTTagCompound(); - this.writeToNBT(nbt); - return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeByte((byte) priority.ordinal()); + buf.writeLong(limit); } @Override - public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { - this.readFromNBT(pkt.func_148857_g()); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, buf.readByte()); + limit = buf.readLong(); } - int level = 1; - private ForgeDirection getDir() { return ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite(); } @@ -181,34 +141,22 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, if(!worldObj.isRemote) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - - if(dir == getDir()) - continue; - + if(dir == getDir()) continue; this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } pulses = 0; - this.setPower(0); //tick is over, reset our allowed transfe + this.setPower(0); //tick is over, reset our allowed transfer + this.networkPackNT(15); } } - @Override - public boolean canConnect(ForgeDirection dir) { - return dir != getDir(); - } - - /** Used as an intra-tick tracker for how much energy has been transmitted, resets to 0 each tick and maxes out based on transfer */ - private long power; - private boolean recursionBrake = false; - private int pulses = 0; - public ConnectionPriority priority = ConnectionPriority.NORMAL; + @Override public boolean canConnect(ForgeDirection dir) { return dir != getDir(); } @Override public long transferPower(long power) { - if(recursionBrake) - return power; + if(recursionBrake) return power; pulses++; if(this.getPower() >= this.getMaxPower() || pulses > 10) return power; //if we have already maxed out transfer or max pulses, abort @@ -241,29 +189,25 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, return power; } + @Override public long getReceiverSpeed() { return this.getMaxPower() - this.getPower(); } + @Override public long getMaxPower() { return this.limit; } + @Override public long getPower() { return Math.min(power, this.getMaxPower()); } + @Override public void setPower(long power) { this.power = power; } + @Override public ConnectionPriority getPriority() { return this.priority; } + @Override - public long getReceiverSpeed() { - return this.getMaxPower() - this.getPower(); + public boolean hasPermission(EntityPlayer player) { + return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 128; } @Override - public long getMaxPower() { - return (long) Math.pow(10, level); + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("capacity")) this.limit = MathHelper.clamp_int(data.getInteger("limit"), 0, 1_000_000_000); + if(data.hasKey("priority")) this.priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, data.getByte("priority")); + this.markDirty(); } - @Override - public long getPower() { - return Math.min(power, this.getMaxPower()); - } - - @Override - public void setPower(long power) { - this.power = power; - } - - @Override - public ConnectionPriority getPriority() { - return this.priority; - } + @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIDiode(this); } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIDiode.java b/src/main/java/com/hbm/inventory/gui/GUIDiode.java new file mode 100644 index 000000000..bb90c636b --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIDiode.java @@ -0,0 +1,95 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.input.Keyboard; + +import com.hbm.blocks.network.CableDiode.TileEntityDiode; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.util.EnumUtil; + +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +@SideOnly(Side.CLIENT) +public class GUIDiode extends GuiScreen { + + protected final TileEntityDiode diode; + + private GuiTextField textThroughput; + private GuiButton buttonPriority; + private int priority; + + public GUIDiode(TileEntityDiode diode) { + this.diode = diode; + this.priority = diode.priority.ordinal(); + } + + @Override + public void initGui() { + Keyboard.enableRepeatEvents(true); + + textThroughput = new GuiTextField(fontRendererObj, this.width / 2 - 150, 100, 90, 20); + textThroughput.setText("" + diode.limit); + textThroughput.setMaxStringLength(10); + + buttonPriority = new GuiButton(0, this.width / 2 + 50, 100, 90, 20, diode.priority.name()); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + drawDefaultBackground(); + + drawString(fontRendererObj, "Throughput:", this.width / 2 - 150, 80, 0xA0A0A0); + drawString(fontRendererObj, "(max. 1,000,000,000 HE)", this.width / 2 - 150, 90, 0xA0A0A0); + textThroughput.drawTextBox(); + + drawString(fontRendererObj, "Priority:", this.width / 2 + 50, 80, 0xA0A0A0); + buttonPriority.drawButton(mc, mouseX, mouseY); + + super.drawScreen(mouseX, mouseY, partialTicks); + } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + + NBTTagCompound data = new NBTTagCompound(); + data.setByte("priority", (byte) priority); + + try { data.setInteger("limit", Integer.parseInt(textThroughput.getText())); } catch(Exception ex) {} + + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, diode.xCoord, diode.yCoord, diode.zCoord)); + } + + @Override + protected void keyTyped(char typedChar, int keyCode) { + super.keyTyped(typedChar, keyCode); + if(textThroughput.textboxKeyTyped(typedChar, keyCode)) return; + + if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.thePlayer.closeScreen(); + } + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) { + super.mouseClicked(mouseX, mouseY, mouseButton); + textThroughput.mouseClicked(mouseX, mouseY, mouseButton); + + if(buttonPriority.mousePressed(mc, mouseX, mouseY)) { + this.priority++; + if(priority >= ConnectionPriority.values().length) priority = 0; + buttonPriority.displayString = EnumUtil.grabEnumSafely(ConnectionPriority.class, priority).name(); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + } + } + + @Override public boolean doesGuiPauseGame() { return false; } +} diff --git a/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java b/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java index 7183c202b..00f7d6ea5 100644 --- a/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java +++ b/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java @@ -5,7 +5,6 @@ import com.hbm.entity.mob.EntityDuck; import com.hbm.interfaces.NotableComments; import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; import com.hbm.tileentity.TileEntityMachineBase; -import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.tileentity.bomb.TileEntityLaunchTable; import com.hbm.tileentity.machine.TileEntityCoreEmitter; import com.hbm.tileentity.machine.TileEntityCoreStabilizer; @@ -146,10 +145,6 @@ public class AuxButtonPacket implements IMessage { TileEntityMachineBase base = (TileEntityMachineBase)te; base.handleButtonPacket(m.value, m.id); } - if(te instanceof TileEntityTickingBase) { - TileEntityTickingBase base = (TileEntityTickingBase)te; - base.handleButtonPacket(m.value, m.id); - } //why make new packets when you can just abuse and uglify the existing ones? if(te == null && m.value == 999) { diff --git a/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java b/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java index 0381ef795..dd082bf11 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java @@ -1,11 +1,12 @@ package com.hbm.tileentity; +import com.hbm.interfaces.NotableComments; + +@NotableComments public abstract class TileEntityTickingBase extends TileEntityLoadedBase { public TileEntityTickingBase() { } - public abstract String getInventoryName(); - //abstracting this method forces child classes to implement it //so i don't have to remember the fucking method name //was it update? onUpdate? updateTile? did it have any args? @@ -13,7 +14,4 @@ public abstract class TileEntityTickingBase extends TileEntityLoadedBase { @Override public abstract void updateEntity(); - @Deprecated - public void handleButtonPacket(int value, int meta) { } - } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityICFController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityICFController.java index 7d9795b15..eaa04d873 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityICFController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityICFController.java @@ -102,11 +102,6 @@ public class TileEntityICFController extends TileEntityTickingBase implements IE this.ports.addAll(ports); } - @Override - public String getInventoryName() { - return "container.icfController"; - } - @Override public void updateEntity() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java index f921d04ad..34a710a5e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java @@ -18,11 +18,6 @@ public class TileEntitySolarMirror extends TileEntityTickingBase { public int tZ; public boolean isOn; - @Override - public String getInventoryName() { - return null; - } - @Override public void updateEntity() { diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java index 80bc476ab..34d4753f2 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java @@ -10,6 +10,7 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; +@Deprecated public abstract class TileEntityPileBase extends TileEntity { @Override diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java new file mode 100644 index 000000000..60c5d4174 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java @@ -0,0 +1,69 @@ +package com.hbm.tileentity.machine.pile; + +import com.hbm.tileentity.TileEntityTickingBase; +import com.hbm.util.Compat; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +/** Base class for all tile entities used by the Chicago Pile, except for the core tile. */ +public class TileEntityPileBaseMK2 extends TileEntityTickingBase { + + public TileEntityPileCore cachedCore; + public int coreX; + public int coreY; + public int coreZ; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + if(worldObj.getTotalWorldTime() % 20 == 0) { + + TileEntityPileCore controller = getCore(); + + if((controller == null || controller.isInvalid()) && worldObj.getChunkProvider().chunkExists(coreX >> 4, coreZ >> 4)) { + this.getBlockType().breakBlock(worldObj, xCoord, yCoord, zCoord, this.getBlockType(), this.getBlockMetadata()); + } + } + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + coreX = nbt.getInteger("cX"); + coreY = nbt.getInteger("cY"); + coreZ = nbt.getInteger("cZ"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("cX", coreX); + nbt.setInteger("cY", coreY); + nbt.setInteger("cZ", coreZ); + } + + @Override + public void markDirty() { + if(this.worldObj != null) { + this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); + } + } + + public TileEntityPileCore getCore() { + if(cachedCore != null && !cachedCore.isInvalid()) return cachedCore; + + if(worldObj.getChunkProvider().chunkExists(coreX >> 4, coreZ >> 4)) { + + TileEntity tile = Compat.getTileStandard(worldObj, coreX, coreY, coreZ); + if(tile instanceof TileEntityPileCore) { + TileEntityPileCore core = (TileEntityPileCore) tile; + cachedCore = core; + return core; + } + } + return null; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java index c1f775e0e..8bb298049 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java @@ -6,6 +6,7 @@ import com.hbm.config.GeneralConfig; import api.hbm.block.IPileNeutronReceiver; import net.minecraft.nbt.NBTTagCompound; +@Deprecated public class TileEntityPileBreedingFuel extends TileEntityPileBase implements IPileNeutronReceiver { public int neutrons; diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java new file mode 100644 index 000000000..2764fe847 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -0,0 +1,150 @@ +package com.hbm.tileentity.machine.pile; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.MachinePWRController; +import com.hbm.blocks.machine.pile.BlockPile; +import com.hbm.interfaces.NotableComments; +import com.hbm.tileentity.TileEntityTickingBase; +import com.hbm.util.fauxpointtwelve.DirPos; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; + +@NotableComments +public class TileEntityPileCore extends TileEntityTickingBase { + + /** + * Orientation is kind of important now. The "direction" the pile is facing in is now decided + * by the side the core is on, i.e. the side it was assembled from. Any channel that goes along + * with the orientation is automatically considered a fuel channel. Any channel perpendicular + * to the orientation is for ventilation. Vertical channels are always for control rods. + */ + public PileOrientation orientation = PileOrientation.NEITHER; + + public int height; + public int width; + public int depth; + + public List fuelChannels = new ArrayList(); + public List ventilationChannels = new ArrayList(); + public List controlChannels = new ArrayList(); + + public TileEntityPileCore setupSize(int h, int w, int d) { + this.height = h; + this.width = w; + this.depth = d; + return this; + } + + public List getChannelList(PileChannelType type) { + if(type == PileChannelType.FUEL) return this.fuelChannels; + if(type == PileChannelType.VENTILATION) return this.ventilationChannels; + return this.controlChannels; + } + + public boolean drillChannel(int x, int y, int z, ForgeDirection dir, EntityPlayer player) { + PileChannelType type = PileChannelType.getChannelType(dir, orientation); + int size = + type == PileChannelType.CONTROL ? height : + type == PileChannelType.FUEL ? depth : width; + + boolean error = false; + for(int i = 0; i <= size; i++) { + int iX = x + dir.offsetX * i; + int iY = y + dir.offsetY * i; + int iZ = z + dir.offsetZ * i; + if(worldObj.getBlock(iX, iY, iZ) != ModBlocks.pile_block) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Foreign block in reactor", player); error = true; } + int meta = worldObj.getBlockMetadata(iX, iY, iZ); + if(meta == BlockPile.META_EDGE) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot drill along edge", player); error = true; } + if(meta == BlockPile.META_CORE) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect core", player); error = true; } + if(meta == BlockPile.META_CHANNEL) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect channel", player); error = true; } + if(meta != BlockPile.META_DUMMY) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect channel IO", player); error = true; } + } + + if(error) return false; + + for(int i = 0; i <= size; i++) { + int iX = x + dir.offsetX * i; + int iY = y + dir.offsetY * i; + int iZ = z + dir.offsetZ * i; + if(i == 0) { + if(type == PileChannelType.FUEL) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_FUEL_IN, 3); + if(type == PileChannelType.VENTILATION) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_AIR_IN, 3); + if(type == PileChannelType.CONTROL) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_CONTROL, 3); + } else if(i == size) { + if(type == PileChannelType.FUEL) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_FUEL_OUT, 3); + if(type == PileChannelType.VENTILATION) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_AIR_OUT, 3); + if(type == PileChannelType.CONTROL) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_CONTROL, 3); + } else { + worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_DUMMY, 3); + } + } + + List list = getChannelList(type); + list.add(new PileChannel(x, y, z, dir, size, type)); + + this.markChanged(); + + return true; + } + + @Override + public void updateEntity() { + + } + + public void destroy() { + + } + + public static enum PileOrientation { + NORTH_SOUTH, + EAST_WEST, + NEITHER; + + public static PileOrientation getOrientation(ForgeDirection dir) { + if(dir == ForgeDirection.NORTH || dir == ForgeDirection.SOUTH) return NORTH_SOUTH; + if(dir == ForgeDirection.EAST || dir == ForgeDirection.WEST) return EAST_WEST; + return NEITHER; + } + } + + public class PileChannel { // originally called "PileHole", however i didn't want it sounding too sexual + + public final DirPos entry; // first channel block plus direction it faces inward + public final int length; // length of the channel, always equal to the h/w/d size of that axis + public final PileChannelType type; + + public PileChannel(int x, int y, int z, ForgeDirection dir) { + this.entry = new DirPos(x, y, z, dir); + this.type = PileChannelType.getChannelType(dir, orientation); + this.length = + type == PileChannelType.CONTROL ? height : + type == PileChannelType.FUEL ? depth : width; + } + + public PileChannel(int x, int y, int z, ForgeDirection dir, int length, PileChannelType type) { + this.entry = new DirPos(x, y, z, dir); + this.type = type; + this.length = length; + } + } + + public static enum PileChannelType { + FUEL, VENTILATION, CONTROL; + + public static PileChannelType getChannelType(ForgeDirection channelDir, PileOrientation pileOrientation) { + + if(channelDir == ForgeDirection.UP || channelDir == ForgeDirection.DOWN) { + return PileChannelType.CONTROL; + } else if(PileOrientation.getOrientation(channelDir) == pileOrientation) { + return PileChannelType.FUEL; + } else { + return PileChannelType.VENTILATION; + } + } + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java index c5480f753..d1e9f97b6 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; +@Deprecated public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutronReceiver { public int heat; diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileNeutronDetector.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileNeutronDetector.java index c05f164fd..977653142 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileNeutronDetector.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileNeutronDetector.java @@ -6,6 +6,7 @@ import com.hbm.blocks.machine.pile.BlockGraphiteNeutronDetector; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +@Deprecated public class TileEntityPileNeutronDetector extends TileEntity implements IPileNeutronReceiver { public int lastNeutrons; diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java index 6b38b7875..cb5cf84ea 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine.pile; import com.hbm.blocks.ModBlocks; +@Deprecated public class TileEntityPileSource extends TileEntityPileBase { @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java index 0d1de3d5c..b0d991443 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioAUTOCAL.java @@ -33,11 +33,6 @@ public class TileEntityRadioAUTOCAL extends TileEntityTickingBase implements ICo public String[] history = new String[] {"", "", "", "", "", ""}; - @Override - public String getInventoryName() { - return "container.autocal"; - } - @Override public void updateEntity() { From 7d635bfc0dd6004f4d9a9294f551d419cc221057 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Tue, 14 Jul 2026 19:18:10 +0200 Subject: [PATCH 085/107] blargle --- .../com/hbm/blocks/machine/pile/BlockPile.java | 18 +++++++++--------- .../blocks/machine/pile/BlockPileBrick.java | 5 +++++ .../java/com/hbm/tileentity/TileMappings.java | 3 +++ .../machine/pile/TileEntityPileBaseMK2.java | 4 ++-- .../machine/pile/TileEntityPileCore.java | 2 +- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java index 151713658..6e14258c0 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -33,19 +33,19 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { /** The core, gets its own TE and runs the simulation, only one per pile */ public static final int META_CORE = 1; /** Channel mid segment for channel intersect checks */ - public static final int META_CHANNEL = 3; + public static final int META_CHANNEL = 2; /** Startpoint of the channel */ - public static final int META_FUEL_IN = 4; + public static final int META_FUEL_IN = 3; /** Endpoint of the fuel channel */ - public static final int META_FUEL_OUT = 5; + public static final int META_FUEL_OUT = 4; /** Startpoint of the ventilation channel */ - public static final int META_AIR_IN = 6; + public static final int META_AIR_IN = 5; /** Endpoint of the ventilation channel */ - public static final int META_AIR_OUT = 7; + public static final int META_AIR_OUT = 6; /** Control rod channel */ - public static final int META_CONTROL = 8; + public static final int META_CONTROL = 7; /** Edge of our pile "cube" to prevent channels from being drilled there */ - public static final int META_EDGE = 9; + public static final int META_EDGE = 8; @SideOnly(Side.CLIENT) protected IIcon iconTop; @@ -85,10 +85,10 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { if(tile instanceof TileEntityPileBaseMK2) { TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; world.removeTileEntity(x, y, z); - world.setBlock(x, y, z, ModBlocks.pile_brick); + if(pile.coreY >= 0) world.setBlock(x, y, z, ModBlocks.pile_brick); TileEntityPileCore core = pile.getCore(); - if(core != null) core.destroy(); + if(core != null && !core.isInvalid()) core.destroy(); } else { world.removeTileEntity(x, y, z); diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java index cf02d71c0..b6b6b4c46 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java @@ -3,6 +3,7 @@ package com.hbm.blocks.machine.pile; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachinePWRController; import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.pile.TileEntityPileBaseMK2; import com.hbm.tileentity.machine.pile.TileEntityPileCore; import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileOrientation; @@ -128,6 +129,10 @@ public class BlockPileBrick extends Block implements IToolable { core.orientation = PileOrientation.getOrientation(dir); } else { world.setBlock(iX, iY, iZ, ModBlocks.pile_block, BlockPile.META_DUMMY, 3); + TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) world.getTileEntity(iX, iY, iZ); + pile.coreX = x; + pile.coreY = y; + pile.coreZ = z; } } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 07e01bbca..e5f166816 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -388,6 +388,9 @@ public class TileMappings { put(TileEntityPileSource.class, "tileentity_pile_source"); put(TileEntityPileBreedingFuel.class, "tileentity_pile_breedingfuel"); put(TileEntityPileNeutronDetector.class, "tileentity_pile_neutrondetector"); + + put(TileEntityPileCore.class, "tileentity_pile_core"); + put(TileEntityPileBaseMK2.class, "tileentity_pile_block"); } private static void putRBMK() { diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java index 60c5d4174..71024d384 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java @@ -11,14 +11,14 @@ public class TileEntityPileBaseMK2 extends TileEntityTickingBase { public TileEntityPileCore cachedCore; public int coreX; - public int coreY; + public int coreY = -999; public int coreZ; @Override public void updateEntity() { if(!worldObj.isRemote) { - if(worldObj.getTotalWorldTime() % 20 == 0) { + if(coreY >= 0) { TileEntityPileCore controller = getCore(); diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index 2764fe847..e5d98dfda 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -97,7 +97,7 @@ public class TileEntityPileCore extends TileEntityTickingBase { } public void destroy() { - + worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.pile_brick); } public static enum PileOrientation { From 747c827486a559598e02474c4edc7b233b28db4e Mon Sep 17 00:00:00 2001 From: TheVitya2127 Date: Wed, 15 Jul 2026 01:52:19 +0400 Subject: [PATCH 086/107] Bob, Yes, Bob --- .../textures/gui/storage/gui_battery_redd.png | Bin 10979 -> 10989 bytes .../gui/storage/gui_battery_socket.png | Bin 3349 -> 3353 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_redd.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_redd.png index 1782a231295685faf8a1d414ab707a7fd8262d6b..3c32ee17d45de6ff4af30468a308b9dfe86ec27a 100644 GIT binary patch literal 10989 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 fk0${yl&q;JcCN_v~;#h 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 diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_socket.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_socket.png index 3dea93ab42a7fb0aaa84fb656ca0bf189e10c466..9a0371157299248c9a1ca8017ff013cb81e33bc3 100644 GIT binary patch delta 3123 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 literal 3349 zcmcgvX*?9%9zHXJ#+Kc+k5Cwel%-@z#vU?EmMlpTA$zZF21!{GrRV=VF^Pp;Z@lP?&?c33$>gGXnr$pQY(>$18=5ajf6ivMgnBq$emXHJ&?yvE2b92nCSi`qsro4ty4OvNnh2-qlH9bDgT}qzH@oL#oV6)-&@A4&h@CK3${d`9H9;D z9pBz{Zb9EaB;*ttjdmblE7gNDIweU>%12;+!=FEU=LTo$boppW$;vt*bH2~zk%lxP z8IRA1x&qC$_u?$x<*3}{X@idpq|wWLY@4Bq6M}-sNj?(1ZC7hOm)F&ar17I#oGQ;6 z{JwUybqawxH#8cT>c%C57|W0cUb@2|y+5W-8uDjLI8a=Yo9&DPW^nK^qZ?=TVz%v7 zia^Tv)dytq@#WRkk+|{p&D)Wkkr^3HU-h!cqNMADHeEeEiAWJ8OZ~{%>5ZgQ*4EZ$ zOkH7T_g6c$5PB)YLlqFrRls`&K_d4i1E0ea1y6WuQ24-x7}_Vw;1aJ06qFYPf+qr1{>V zEtd#3F|VLxF^JcAaK-hoM@B9%P2s$W0P~z;v+5ro-#oK2WS9Vn8;KS}=QlHK zy32!L&F^=*i=z3>Lg~IsH zE;0gcf;$A!_B#b3p{ppG#f@`C@;X0vU8#1n;Y~Dq%u>E7DMz<3p)Ow^ zIHc@G-73Q7>Bt|$aNv}-!}@gsA_PZQf^Ur;=;`hCUu!F^D-gEK(tsz zKdC>+XpMTb*3{#DyZRT)xQ)yrAU5kNR-YH6NOM{)f=YV+F-uwIN|x$N4u%}p@?AM% z=RTmHFZM!;^o#E*xxev=c-85#V}2w>O^+=$s{1rNk3Co&Kpd#1UBcGi#wOo!yYywq4=g7EVOOh;w65CiBRrfi#;7?Ee^#@c#LUW-d+f`4%7>O@=*7ts0NJG z`TayQt$?QbmV#9_nD7lxe>)4Au@fLXL`5!Y0s37wEZbr+Hxt9HW2oNJPoSiWGwp;3 zuf_Gc0wI?|2+4WhZSGcXrwZnTdVHMM;vZXIhCPR3x76$i&FUYRN&z4vl`-C`tE;0U z{!fHd%Q^ZxSchPh?i#Ej6Gpr84W}fAfV7`I7rfY)IA22DJVT+<_|MuvywNwu!V^Ou zI$C9WpC!C9odHHs$J{rM3Vz_ejB-ZfoRK+Q$x9Q{g% zP6hcwoy${@nc+@P7RB?$`)8e|f)L=FV+$!ak@&Fix|ZfY6Supm@$_LqaM@OKK}`)> zk@9o&2WNtv6%2^kK1CHu1ru;$#ny!Q(Wmu;PTIjnf&52J;qH$R=PF8LlXl&_8J`a?ue z`>l^dSy|bmNDWJSA(ge~p~S8cj=AmkanIdWn?4lVmADV2ML(>Fdxa4PeDN*!b5e~R z;^hen>v=^S4VupTIK+b#E{cuZ; z2Ij=o!fom&qKWb;VZJ#eU%X|0oOflZyN=2c>L(VZs`y)VB57B|s`t8` zYVVt%!(WDdFdU@+P-KggoSgjm*Jh95$b6VAj{R(|-Yd+lQA;E6rr~guza~pR2n7og z5O5_OfMaF=$SDGlc}nQ|r0KTaw9Icx7?k{}Z-a2L1U=g?nS<=O9Zu2yQ>y>iTL}DD zgBRwDCE!#ZDA+SKIsbM&bcUlGsY$uKJe#oG><--Cqj zc1k!a`v^)9K>wROhTE3)UQSx6!@J%&=)#3-y`0BH3L&qrrKFq)g!l7_gVC}ESXgNz k)K4x6!TxOgKa<}$3*zaTC$x`&PTTQoiLy0)V&awfFMKcYDF6Tf From 981d49dffc938b6cf89eff658052635fa2b929ab Mon Sep 17 00:00:00 2001 From: NotMega Date: Wed, 15 Jul 2026 10:24:45 +0300 Subject: [PATCH 087/107] now were thinking with wiki --- .../com/hbm/commands/CommandWikiRender.java | 87 +++++++++++++++++++ src/main/java/com/hbm/main/MainRegistry.java | 1 + 2 files changed, 88 insertions(+) create mode 100644 src/main/java/com/hbm/commands/CommandWikiRender.java diff --git a/src/main/java/com/hbm/commands/CommandWikiRender.java b/src/main/java/com/hbm/commands/CommandWikiRender.java new file mode 100644 index 000000000..6833d3cab --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandWikiRender.java @@ -0,0 +1,87 @@ +package com.hbm.commands; + +import java.util.ArrayList; +import java.util.Locale; +import java.util.List; +import java.util.Arrays; + +import com.hbm.inventory.gui.GUIScreenWikiRender; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemDepletedFuel; +import com.hbm.items.machine.ItemFluidDuct; +import com.hbm.items.machine.ItemRBMKPellet; +import com.hbm.main.MainRegistry; + +import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraft.command.WrongUsageException; +import net.minecraft.command.PlayerNotFoundException; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.command.CommandBase; +import net.minecraft.item.Item; +import net.minecraft.init.Items; +import net.minecraft.init.Blocks; + +// horribly written command so you can render more than fucking guns without having to decompile the JAR +public class CommandWikiRender extends CommandBase { + @Override + public String getCommandName() { + return "ntmwikirender"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return String.format(Locale.US, + "%s/%s %s- Render screenshots of a selected item type (e.g ItemGunBaseNT). Intended for developers and wiki editors only.", + EnumChatFormatting.GREEN, getCommandName(), EnumChatFormatting.LIGHT_PURPLE + ); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if(!(sender instanceof EntityPlayer)) { + throw new PlayerNotFoundException(); + } + + if(args.length == 0) { + throw new WrongUsageException(getCommandUsage(sender), new Object[0]); + } + + MainRegistry.logger.info("Taking a screenshot of " + args[0]); + + List ignoredItems = Arrays.asList( + ModItems.achievement_icon, + Items.spawn_egg, + Item.getItemFromBlock(Blocks.mob_spawner) + ); + + List> collapsedClasses = Arrays.asList( + ItemRBMKPellet.class, + ItemDepletedFuel.class, + ItemFluidDuct.class + ); + + String prefix = args[0]; + int slotScale = 16; + boolean ignoreNonNTM = true; + + List stacks = new ArrayList(); + for (Object reg : Item.itemRegistry) { + Item item = (Item) reg; + if(ignoreNonNTM && !Item.itemRegistry.getNameForObject(item).startsWith("hbm:")) continue; + if(ignoredItems.contains(item)) continue; + if(!item.getClass().getSimpleName().equalsIgnoreCase(args[0]) && (net.minecraft.block.Block.getBlockFromItem(item) == null || !net.minecraft.block.Block.getBlockFromItem(item).getClass().getSimpleName().equalsIgnoreCase(args[0]))) continue; + if(collapsedClasses.contains(item.getClass())) { + stacks.add(new ItemStack(item)); + } else { + item.getSubItems(item, null, stacks); + } + } + + Minecraft.getMinecraft().thePlayer.closeScreen(); + FMLCommonHandler.instance().showGuiScreen(new GUIScreenWikiRender(stacks.toArray(new ItemStack[0]), prefix, "wiki-block-renders-256", slotScale)); + } + } \ No newline at end of file diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index f28893151..8520a82d7 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -666,6 +666,7 @@ public class MainRegistry { event.registerServerCommand(new CommandPacketInfo()); event.registerServerCommand(new CommandReloadServer()); event.registerServerCommand(new CommandLocate()); + event.registerServerCommand(new CommandWikiRender()); event.registerServerCommand(new CommandCustomize()); event.registerServerCommand(new CommandReapNetworks()); ArcFurnaceRecipes.registerFurnaceSmeltables(); // because we have to wait for other mods to take their merry ass time to register recipes From d1593aecb99a3f26711df653c01b033774550127 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 15 Jul 2026 13:10:42 +0200 Subject: [PATCH 088/107] DEVICE_PILE --- src/main/java/com/hbm/blocks/ModBlocks.java | 23 +++--- .../hbm/blocks/machine/pile/BlockPile.java | 8 +++ .../blocks/machine/pile/BlockPileBrick.java | 8 +-- .../blocks/machine/pile/BlockPileDevice.java | 60 ++++++++++++++++ .../java/com/hbm/tileentity/TileMappings.java | 7 +- .../machine/pile/TileEntityPileBaseMK2.java | 7 ++ .../machine/pile/TileEntityPileControl.java | 7 ++ .../machine/pile/TileEntityPileCore.java | 71 +++++++++++++++++++ .../machine/pile/TileEntityPileLoader.java | 7 ++ .../machine/pile/TileEntityPileVent.java | 7 ++ 10 files changed, 187 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java create mode 100644 src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java create mode 100644 src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java create mode 100644 src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 4f4bb29d8..5dd6c790d 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -225,14 +225,14 @@ public class ModBlocks { public static Block block_foam; public static Block block_coke; public static Block block_graphite; - public static Block block_graphite_drilled; - public static Block block_graphite_fuel; - public static Block block_graphite_plutonium; - public static Block block_graphite_rod; - public static Block block_graphite_source; - public static Block block_graphite_lithium; - public static Block block_graphite_tritium; - public static Block block_graphite_detector; + @Deprecated public static Block block_graphite_drilled; + @Deprecated public static Block block_graphite_fuel; + @Deprecated public static Block block_graphite_plutonium; + @Deprecated public static Block block_graphite_rod; + @Deprecated public static Block block_graphite_source; + @Deprecated public static Block block_graphite_lithium; + @Deprecated public static Block block_graphite_tritium; + @Deprecated public static Block block_graphite_detector; public static Block block_boron; public static Block block_lanthanium; public static Block block_ra226; @@ -853,6 +853,7 @@ public class ModBlocks { public static Block pile_brick; public static Block pile_block; + public static Block pile_device; public static Block pwr_fuel; public static Block pwr_control; @@ -1962,8 +1963,9 @@ public class ModBlocks { custom_machine = new BlockCustomMachine().setBlockName("custom_machine").setCreativeTab(MainRegistry.machineTab).setLightLevel(1F).setHardness(5.0F).setResistance(10.0F); cm_anchor = new BlockCMAnchor().setBlockName("custom_machine_anchor").setCreativeTab(MainRegistry.machineTab).setHardness(5.0F).setResistance(10.0F); - pile_brick = new BlockPileBrick().setBlockName("pile_brick").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_brick"); - pile_block = new BlockPile().setBlockName("pile_block").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_block"); + pile_brick = new BlockPileBrick().setBlockName("pile_brick").setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_brick"); + pile_device = new BlockPileDevice().setBlockName("pile_device").setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + pile_block = new BlockPile().setBlockName("pile_block").setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_block"); pwr_fuel = new BlockPillarPWR(Material.iron, RefStrings.MODID + ":pwr_fuel_top").setBlockName("pwr_fuel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_fuel_side"); pwr_control = new BlockPillarPWR(Material.iron, RefStrings.MODID + ":pwr_control_top").setBlockName("pwr_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_control_side"); @@ -3326,6 +3328,7 @@ public class ModBlocks { //Chicago Pile register(pile_brick); + register(pile_device); register(pile_block); //PWR diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java index 6e14258c0..32941d8ee 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -101,7 +101,14 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { 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 == tool.HAND_DRILL) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPileCore || world.getBlockMetadata(x, y, z) == META_CORE) { + MachinePWRController.sendError(world, x, y, z, "Cannot intersect core", player); + return false; + } + if(tile instanceof TileEntityPileBaseMK2) { TileEntityPileCore core = ((TileEntityPileBaseMK2) tile).getCore(); if(core != null) { @@ -109,6 +116,7 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { return core.drillChannel(x, y, z, dir, player); } } + MachinePWRController.sendError(world, x, y, z, "No core found", player); } diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java index b6b6b4c46..65c6d169b 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java @@ -127,12 +127,12 @@ public class BlockPileBrick extends Block implements IToolable { world.setBlock(iX, iY, iZ, ModBlocks.pile_block, BlockPile.META_CORE, 3); TileEntityPileCore core = (TileEntityPileCore) world.getTileEntity(iX, iY, iZ); core.orientation = PileOrientation.getOrientation(dir); + core.setupSize(posHeight + negHeight + 1, left + right + 1, depth + 1); } else { - world.setBlock(iX, iY, iZ, ModBlocks.pile_block, BlockPile.META_DUMMY, 3); + boolean isEdge = h == -negHeight || h == posHeight || v == -left || v == right || d == 0 || d == depth; + world.setBlock(iX, iY, iZ, ModBlocks.pile_block, isEdge ? BlockPile.META_EDGE : BlockPile.META_DUMMY, 3); TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) world.getTileEntity(iX, iY, iZ); - pile.coreX = x; - pile.coreY = y; - pile.coreZ = z; + pile.setCore(x, y, z); } } } diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java new file mode 100644 index 000000000..87631c14f --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java @@ -0,0 +1,60 @@ +package com.hbm.blocks.machine.pile; + +import com.hbm.tileentity.machine.pile.TileEntityPileControl; +import com.hbm.tileentity.machine.pile.TileEntityPileLoader; +import com.hbm.tileentity.machine.pile.TileEntityPileVent; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class BlockPileDevice extends BlockContainer { + + public static final int ITEM_META_LOADER = 0; + public static final int ITEM_META_VENT = 1; + public static final int ITEM_META_CONTROL = 2; + + public static final int BLOCK_META_LOADER = 0; + public static final int BLOCK_META_VENT = 4; + public static final int BLOCK_META_CONTROL = 8; + + public BlockPileDevice() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta == BLOCK_META_LOADER) return new TileEntityPileLoader(); + if(meta == BLOCK_META_VENT) return new TileEntityPileVent(); + if(meta == BLOCK_META_CONTROL) return new TileEntityPileControl(); + return null; + } + + @Override public int getRenderType() { return -1; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } + + @Override + public int onBlockPlaced(World world, int x, int y, int z, int side, float fx, float fy, float fz, int meta) { + int metaOffset = itemMetaToBlockMeta(meta); + // side is reduced by 2 because UP and DOWN (0 and 1) aren't relevant + // therefore, all item metas (device subtypes) are neatly packed into 4 metas each + side = MathHelper.clamp_int(side - 2, 0, 3); + return metaOffset + side; + } + + public static int itemMetaToBlockMeta(int meta) { + if(meta >= ITEM_META_CONTROL) return BLOCK_META_CONTROL; + if(meta == ITEM_META_VENT) return BLOCK_META_VENT; + return BLOCK_META_LOADER; + } + + @Override + public int damageDropped(int meta) { + if(meta >= BLOCK_META_CONTROL) return ITEM_META_CONTROL; + if(meta >= BLOCK_META_VENT) return ITEM_META_VENT; + return ITEM_META_LOADER; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index e5f166816..ad13bb825 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -391,6 +391,9 @@ public class TileMappings { put(TileEntityPileCore.class, "tileentity_pile_core"); put(TileEntityPileBaseMK2.class, "tileentity_pile_block"); + put(TileEntityPileLoader.class, "tileentity_pile_loader"); + put(TileEntityPileVent.class, "tileentity_pile_vent"); + put(TileEntityPileControl.class, "tileentity_pile_control"); } private static void putRBMK() { @@ -510,10 +513,6 @@ public class TileMappings { private static void put(Class clazz, String... names) { map.put(clazz, names); - /*if((IFluidSource.class.isAssignableFrom(clazz) || IFluidAcceptor.class.isAssignableFrom(clazz)) && !IFluidConnector.class.isAssignableFrom(clazz)) { - LoggingUtil.errorWithHighlight(clazz.getCanonicalName() + " implements the old interfaces but not IFluidConnector!"); - }*/ - if(IConfigurableMachine.class.isAssignableFrom(clazz)) { configurables.add((Class) clazz); } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java index 71024d384..e96cc420d 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBaseMK2.java @@ -14,6 +14,13 @@ public class TileEntityPileBaseMK2 extends TileEntityTickingBase { public int coreY = -999; public int coreZ; + public TileEntityPileBaseMK2 setCore(int x, int y, int z) { + this.coreX = x; + this.coreY = y; + this.coreZ = z; + return this; + } + @Override public void updateEntity() { diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java new file mode 100644 index 000000000..652c4b02a --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java @@ -0,0 +1,7 @@ +package com.hbm.tileentity.machine.pile; + +import net.minecraft.tileentity.TileEntity; + +public class TileEntityPileControl extends TileEntity { + +} diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index e5d98dfda..763c0802c 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -11,11 +11,27 @@ import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.util.fauxpointtwelve.DirPos; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @NotableComments public class TileEntityPileCore extends TileEntityTickingBase { + /* + * ____,__,___ + * |\ I, I, \ + * | \ I I \ + * -- \___________\ + * |--| | + * -- | U U U | + * \--| X | + * \ | U U U | + * \|___________| + * + * BEHOLD + * THE CUBE + */ + /** * Orientation is kind of important now. The "direction" the pile is facing in is now decided * by the side the core is on, i.e. the side it was assembled from. Any channel that goes along @@ -32,6 +48,46 @@ public class TileEntityPileCore extends TileEntityTickingBase { public List ventilationChannels = new ArrayList(); public List controlChannels = new ArrayList(); + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + height = nbt.getInteger("height"); + width = nbt.getInteger("width"); + depth = nbt.getInteger("depth"); + + int fuelCount = nbt.getByte("fc"); + int ventCount = nbt.getByte("vc"); + int contCount = nbt.getByte("cc"); + + fuelChannels.clear(); + ventilationChannels.clear(); + controlChannels.clear(); + + for(int i = 0; i < fuelCount; i++) fuelChannels.add(readChannelFromNBT(nbt, "f" + i)); + for(int i = 0; i < ventCount; i++) ventilationChannels.add(readChannelFromNBT(nbt, "v" + i)); + for(int i = 0; i < contCount; i++) controlChannels.add(readChannelFromNBT(nbt, "c" + i)); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("height", height); + nbt.setInteger("width", width); + nbt.setInteger("depth", depth); + + int fuelCount = fuelChannels.size(); + int ventCount = ventilationChannels.size(); + int contCount = controlChannels.size(); + + nbt.setByte("fc", (byte) fuelCount); + nbt.setByte("vc", (byte) ventCount); + nbt.setByte("cc", (byte) contCount); + + for(int i = 0; i < fuelCount; i++) fuelChannels.get(i).writeChannelToNBT(nbt, "f" + i); + for(int i = 0; i < ventCount; i++) ventilationChannels.get(i).writeChannelToNBT(nbt, "v" + i); + for(int i = 0; i < contCount; i++) controlChannels.get(i).writeChannelToNBT(nbt, "c" + i); + } + public TileEntityPileCore setupSize(int h, int w, int d) { this.height = h; this.width = w; @@ -131,6 +187,21 @@ public class TileEntityPileCore extends TileEntityTickingBase { this.type = type; this.length = length; } + + public void writeChannelToNBT(NBTTagCompound nbt, String name) { + nbt.setInteger(name + "_x", entry.getX()); + nbt.setInteger(name + "_y", entry.getY()); + nbt.setInteger(name + "_z", entry.getZ()); + nbt.setByte(name + "_d", (byte) entry.getDir().ordinal()); + } + } + + public PileChannel readChannelFromNBT(NBTTagCompound nbt, String name) { + int x = nbt.getInteger(name + "_x"); + int y = nbt.getInteger(name + "_y"); + int z = nbt.getInteger(name + "_z"); + ForgeDirection dir = ForgeDirection.getOrientation(nbt.getByte(name + "_d")); + return new PileChannel(x, y, z, dir); } public static enum PileChannelType { diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java new file mode 100644 index 000000000..6516997d2 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java @@ -0,0 +1,7 @@ +package com.hbm.tileentity.machine.pile; + +import net.minecraft.tileentity.TileEntity; + +public class TileEntityPileLoader extends TileEntity { + +} diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java new file mode 100644 index 000000000..15f803176 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java @@ -0,0 +1,7 @@ +package com.hbm.tileentity.machine.pile; + +import net.minecraft.tileentity.TileEntity; + +public class TileEntityPileVent extends TileEntity { + +} From 17ed5e4b6d34c24fc3cd17c02c7af8c49efff1da Mon Sep 17 00:00:00 2001 From: NotMega Date: Wed, 15 Jul 2026 15:46:29 +0300 Subject: [PATCH 089/107] somebody said i should dip my balls in sulfuric acid --- src/main/java/com/hbm/commands/CommandWikiRender.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/commands/CommandWikiRender.java b/src/main/java/com/hbm/commands/CommandWikiRender.java index 6833d3cab..acef76222 100644 --- a/src/main/java/com/hbm/commands/CommandWikiRender.java +++ b/src/main/java/com/hbm/commands/CommandWikiRender.java @@ -13,6 +13,8 @@ import com.hbm.items.machine.ItemRBMKPellet; import com.hbm.main.MainRegistry; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.command.WrongUsageException; import net.minecraft.command.PlayerNotFoundException; import net.minecraft.entity.player.EntityPlayer; @@ -26,6 +28,7 @@ import net.minecraft.init.Items; import net.minecraft.init.Blocks; // horribly written command so you can render more than fucking guns without having to decompile the JAR +@SideOnly(Side.CLIENT) // make it clientside so bobcat would not come after me public class CommandWikiRender extends CommandBase { @Override public String getCommandName() { @@ -35,7 +38,7 @@ public class CommandWikiRender extends CommandBase { @Override public String getCommandUsage(ICommandSender sender) { return String.format(Locale.US, - "%s/%s %s- Render screenshots of a selected item type (e.g ItemGunBaseNT). Intended for developers and wiki editors only.", + "%s/%s %s- Render screenshots of a selected item type (e.g ItemGunBaseNT). Intended for developers and wiki editors only.", EnumChatFormatting.GREEN, getCommandName(), EnumChatFormatting.LIGHT_PURPLE ); } From 8b3a17b60cdc245b1fbe79f37b45542003f96e2d Mon Sep 17 00:00:00 2001 From: NotMega Date: Wed, 15 Jul 2026 16:11:39 +0300 Subject: [PATCH 090/107] glungus --- src/main/java/com/hbm/main/MainRegistry.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 8520a82d7..f28893151 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -666,7 +666,6 @@ public class MainRegistry { event.registerServerCommand(new CommandPacketInfo()); event.registerServerCommand(new CommandReloadServer()); event.registerServerCommand(new CommandLocate()); - event.registerServerCommand(new CommandWikiRender()); event.registerServerCommand(new CommandCustomize()); event.registerServerCommand(new CommandReapNetworks()); ArcFurnaceRecipes.registerFurnaceSmeltables(); // because we have to wait for other mods to take their merry ass time to register recipes From 425e317640030a37ab867fb113a98caa0834b63d Mon Sep 17 00:00:00 2001 From: NotMega Date: Wed, 15 Jul 2026 16:22:14 +0300 Subject: [PATCH 091/107] damn forge --- .../java/com/hbm/commands/CommandWikiRender.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/commands/CommandWikiRender.java b/src/main/java/com/hbm/commands/CommandWikiRender.java index acef76222..07db17c2e 100644 --- a/src/main/java/com/hbm/commands/CommandWikiRender.java +++ b/src/main/java/com/hbm/commands/CommandWikiRender.java @@ -21,6 +21,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.command.ICommandSender; import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.client.ClientCommandHandler; import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.item.Item; @@ -30,7 +31,7 @@ import net.minecraft.init.Blocks; // horribly written command so you can render more than fucking guns without having to decompile the JAR @SideOnly(Side.CLIENT) // make it clientside so bobcat would not come after me public class CommandWikiRender extends CommandBase { - @Override + @Override public String getCommandName() { return "ntmwikirender"; } @@ -86,5 +87,11 @@ public class CommandWikiRender extends CommandBase { Minecraft.getMinecraft().thePlayer.closeScreen(); FMLCommonHandler.instance().showGuiScreen(new GUIScreenWikiRender(stacks.toArray(new ItemStack[0]), prefix, "wiki-block-renders-256", slotScale)); - } - } \ No newline at end of file + } + + public static void register() { + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { + ClientCommandHandler.instance.registerCommand(new CommandWikiRender()); + } + } +} \ No newline at end of file From 5f7229051041650c346df12efd68a3bf9c9f8d72 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 15 Jul 2026 16:42:00 +0200 Subject: [PATCH 092/107] *throws graphite bricks at you* --- .../hbm/blocks/machine/pile/BlockPile.java | 18 +++++++++++---- .../com/hbm/blocks/network/CableDiode.java | 13 +++++++++++ .../java/com/hbm/items/armor/ArmorFSB.java | 22 +++++-------------- .../java/com/hbm/lib/ModDamageSource.java | 1 - .../machine/pile/TileEntityPileCore.java | 9 ++++++++ .../com/hbm/util/DamageResistanceHandler.java | 16 +++++++++----- 6 files changed, 51 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java index 32941d8ee..738b21427 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -46,6 +46,12 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { public static final int META_CONTROL = 7; /** Edge of our pile "cube" to prevent channels from being drilled there */ public static final int META_EDGE = 8; + + @SideOnly(Side.CLIENT) public CTStitchReceiver rec; + @SideOnly(Side.CLIENT) public CTStitchReceiver recTop; + @SideOnly(Side.CLIENT) public CTStitchReceiver recChanIn; + @SideOnly(Side.CLIENT) public CTStitchReceiver recChanOut; + @SideOnly(Side.CLIENT) public CTStitchReceiver recCon; @SideOnly(Side.CLIENT) protected IIcon iconTop; @@ -60,20 +66,24 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { @Override public int getRenderType() { return CT.renderID; } @Override public Item getItemDropped(int i, Random rand, int j) { return null; } - @SideOnly(Side.CLIENT) public CTStitchReceiver rec; - @SideOnly(Side.CLIENT) public CTStitchReceiver recTop; - @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { super.registerBlockIcons(reg); this.iconTop = reg.registerIcon(RefStrings.MODID + ":pile_block_top"); + this.rec = IBlockCT.primeReceiver(reg, this.blockIcon.getIconName(), this.blockIcon); this.recTop = IBlockCT.primeReceiver(reg, this.iconTop.getIconName(), this.iconTop); + this.recChanIn = IBlockCT.primeReceiver(reg, "pile_block_input", this.blockIcon); + this.recChanOut = IBlockCT.primeReceiver(reg, "pile_block_output", this.blockIcon); + this.recCon = IBlockCT.primeReceiver(reg, "pile_block_control_top", this.iconTop); } @Override public IIcon[] getFragments(IBlockAccess world, int x, int y, int z, int side) { - if(side == 0 || side == 1) return recTop.fragCache; + int meta = world.getBlockMetadata(x, y, z); + if(side == 0 || side == 1) return meta == META_CONTROL ? recCon.fragCache : recTop.fragCache; + if(meta == META_FUEL_IN || meta == META_AIR_IN) return recChanIn.fragCache; + if(meta == META_FUEL_OUT || meta == META_AIR_OUT) return recChanOut.fragCache; return rec.fragCache; } diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 371abb076..10275bb8d 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -9,6 +9,7 @@ import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.gui.GUIDiode; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BobMathUtil; @@ -17,6 +18,7 @@ import com.hbm.util.EnumUtil; import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -61,6 +63,17 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, world.setBlockMetadataWithNotify(x, y, z, l, 2); } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + if(!player.isSneaking() && world.isRemote) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } + + return false; + } + @Override public boolean canConnect(IBlockAccess world, int x, int y, int z, ForgeDirection dir) { return true; diff --git a/src/main/java/com/hbm/items/armor/ArmorFSB.java b/src/main/java/com/hbm/items/armor/ArmorFSB.java index f64a07456..24d7bfa11 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSB.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSB.java @@ -222,19 +222,12 @@ public class ArmorFSB extends ItemArmor implements IArmorDisableModel { ItemStack armor = player.inventory.armorInventory[i]; - if(armor == null || !(armor.getItem() instanceof ArmorFSB)) - return false; - - if(((ArmorFSB) armor.getItem()).getArmorMaterial() != chestplate.getArmorMaterial()) - return false; - - if(!((ArmorFSB) armor.getItem()).isArmorEnabled(armor)) - return false; + if(armor == null || !(armor.getItem() instanceof ArmorFSB)) return false; + if(((ArmorFSB) armor.getItem()).getArmorMaterial() != chestplate.getArmorMaterial()) return false; + if(!((ArmorFSB) armor.getItem()).isArmorEnabled(armor)) return false; } - return true; } - return false; } @@ -251,16 +244,11 @@ public class ArmorFSB extends ItemArmor implements IArmorDisableModel { ItemStack armor = player.inventory.armorInventory[i]; - if(armor == null || !(armor.getItem() instanceof ArmorFSB)) - return false; - - if(((ArmorFSB) armor.getItem()).getArmorMaterial() != chestplate.getArmorMaterial()) - return false; + if(armor == null || !(armor.getItem() instanceof ArmorFSB)) return false; + if(((ArmorFSB) armor.getItem()).getArmorMaterial() != chestplate.getArmorMaterial()) return false; } - return true; } - return false; } diff --git a/src/main/java/com/hbm/lib/ModDamageSource.java b/src/main/java/com/hbm/lib/ModDamageSource.java index df39c8958..eeb0a528b 100644 --- a/src/main/java/com/hbm/lib/ModDamageSource.java +++ b/src/main/java/com/hbm/lib/ModDamageSource.java @@ -43,7 +43,6 @@ public class ModDamageSource extends DamageSource { public static DamageSource vacuum = (new DamageSource("vacuum")).setDamageIsAbsolute().setDamageBypassesArmor(); public static DamageSource overdose = (new DamageSource("overdose")).setDamageIsAbsolute().setDamageBypassesArmor(); public static DamageSource microwave = (new DamageSource("microwave")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource nitan = (new DamageSource("nitan")).setDamageIsAbsolute().setDamageBypassesArmor().setDamageAllowedInCreativeMode();; public static final String s_bullet = "revolverBullet"; public static final String s_emplacer = "chopperBullet"; diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index 763c0802c..18b30b554 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -67,6 +67,15 @@ public class TileEntityPileCore extends TileEntityTickingBase { for(int i = 0; i < ventCount; i++) ventilationChannels.add(readChannelFromNBT(nbt, "v" + i)); for(int i = 0; i < contCount; i++) controlChannels.add(readChannelFromNBT(nbt, "c" + i)); } + + public PileChannel getFuelChannel(int x, int y, int z) { return getChannel(x, y, z, fuelChannels); } + public PileChannel getVentilationChannel(int x, int y, int z) { return getChannel(x, y, z, ventilationChannels); } + public PileChannel getControlChannel(int x, int y, int z) { return getChannel(x, y, z, controlChannels); } + + public PileChannel getChannel(int x, int y, int z, List list) { + for(PileChannel channel : list) if(channel.entry.compare(x, y, z)) return channel; + return null; + } @Override public void writeToNBT(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index 805ab13bc..d153d7f44 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -419,7 +419,11 @@ public class DamageResistanceHandler { LASER, MICROWAVE, SUBATOMIC, - OTHER + OTHER; + + public boolean isApplicable(String name) { + return name.toLowerCase(Locale.US).equals(this.name().toLowerCase(Locale.US)); + } } public static void setup(float dt, float dr) { @@ -471,11 +475,11 @@ public class DamageResistanceHandler { if(source.isExplosion()) return CATEGORY_EXPLOSION; if(source.isFireDamage()) return CATEGORY_FIRE; if(source.isProjectile()) return CATEGORY_PHYSICAL; - if(source.damageType.toLowerCase(Locale.US).equals(DamageClass.LASER.name().toLowerCase(Locale.US))) return CATEGORY_ENERGY; - if(source.damageType.toLowerCase(Locale.US).equals(DamageClass.PLASMA.name().toLowerCase(Locale.US))) return CATEGORY_ENERGY; - if(source.damageType.toLowerCase(Locale.US).equals(DamageClass.MICROWAVE.name().toLowerCase(Locale.US))) return CATEGORY_ENERGY; - if(source.damageType.toLowerCase(Locale.US).equals(DamageClass.SUBATOMIC.name().toLowerCase(Locale.US))) return CATEGORY_ENERGY; - if(source.damageType.toLowerCase(Locale.US).equals(DamageClass.ELECTRIC.name().toLowerCase(Locale.US))) return CATEGORY_ENERGY; + if(DamageClass.LASER.isApplicable(source.damageType)) return CATEGORY_ENERGY; + if(DamageClass.PLASMA.isApplicable(source.damageType)) return CATEGORY_ENERGY; + if(DamageClass.MICROWAVE.isApplicable(source.damageType)) return CATEGORY_ENERGY; + if(DamageClass.SUBATOMIC.isApplicable(source.damageType)) return CATEGORY_ENERGY; + if(DamageClass.ELECTRIC.isApplicable(source.damageType)) return CATEGORY_ENERGY; if(source == DamageSource.cactus) return CATEGORY_PHYSICAL; if(source == ModDamageSource.spikes) return CATEGORY_PHYSICAL; if(source == ModDamageSource.electricity) return CATEGORY_ENERGY; From 3af3d8d39cbe167bb491f55d74007f0b285eca13 Mon Sep 17 00:00:00 2001 From: NotMega Date: Thu, 16 Jul 2026 10:07:30 +0300 Subject: [PATCH 093/107] actually a fix for once??? no way --- src/main/java/com/hbm/commands/CommandWikiRender.java | 7 ------- src/main/java/com/hbm/main/MainRegistry.java | 1 + 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/commands/CommandWikiRender.java b/src/main/java/com/hbm/commands/CommandWikiRender.java index 07db17c2e..4a816b318 100644 --- a/src/main/java/com/hbm/commands/CommandWikiRender.java +++ b/src/main/java/com/hbm/commands/CommandWikiRender.java @@ -21,7 +21,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.command.ICommandSender; import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.client.ClientCommandHandler; import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.item.Item; @@ -88,10 +87,4 @@ public class CommandWikiRender extends CommandBase { Minecraft.getMinecraft().thePlayer.closeScreen(); FMLCommonHandler.instance().showGuiScreen(new GUIScreenWikiRender(stacks.toArray(new ItemStack[0]), prefix, "wiki-block-renders-256", slotScale)); } - - public static void register() { - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { - ClientCommandHandler.instance.registerCommand(new CommandWikiRender()); - } - } } \ No newline at end of file diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index f28893151..fa8c04d04 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -667,6 +667,7 @@ public class MainRegistry { event.registerServerCommand(new CommandReloadServer()); event.registerServerCommand(new CommandLocate()); event.registerServerCommand(new CommandCustomize()); + event.registerServerCommand(new CommandWikiRender()); // TODO: make this shitfuck be clientside event.registerServerCommand(new CommandReapNetworks()); ArcFurnaceRecipes.registerFurnaceSmeltables(); // because we have to wait for other mods to take their merry ass time to register recipes } From cefcd7dee5a7b84752435210a29e35daf5fefc24 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 16 Jul 2026 09:21:33 +0200 Subject: [PATCH 094/107] YOUR TAKING TOO LONG --- .../com/hbm/commands/CommandWikiRender.java | 84 +++++++++---------- src/main/java/com/hbm/main/MainRegistry.java | 1 + 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/hbm/commands/CommandWikiRender.java b/src/main/java/com/hbm/commands/CommandWikiRender.java index 4a816b318..67453b235 100644 --- a/src/main/java/com/hbm/commands/CommandWikiRender.java +++ b/src/main/java/com/hbm/commands/CommandWikiRender.java @@ -13,14 +13,15 @@ import com.hbm.items.machine.ItemRBMKPellet; import com.hbm.main.MainRegistry; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.FMLLaunchHandler; import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.command.WrongUsageException; import net.minecraft.command.PlayerNotFoundException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.command.ICommandSender; import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.client.ClientCommandHandler; import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.item.Item; @@ -28,63 +29,62 @@ import net.minecraft.init.Items; import net.minecraft.init.Blocks; // horribly written command so you can render more than fucking guns without having to decompile the JAR -@SideOnly(Side.CLIENT) // make it clientside so bobcat would not come after me public class CommandWikiRender extends CommandBase { + + public static void register() { + if(FMLLaunchHandler.side() != Side.CLIENT) return; + ClientCommandHandler.instance.registerCommand(new CommandWikiRender()); + } + @Override - public String getCommandName() { - return "ntmwikirender"; - } - - @Override - public String getCommandUsage(ICommandSender sender) { - return String.format(Locale.US, - "%s/%s %s- Render screenshots of a selected item type (e.g ItemGunBaseNT). Intended for developers and wiki editors only.", - EnumChatFormatting.GREEN, getCommandName(), EnumChatFormatting.LIGHT_PURPLE - ); - } + public String getCommandName() { + return "ntmwikirender"; + } - @Override - public void processCommand(ICommandSender sender, String[] args) { - if(!(sender instanceof EntityPlayer)) { - throw new PlayerNotFoundException(); - } - - if(args.length == 0) { + @Override + public String getCommandUsage(ICommandSender sender) { + return String.format(Locale.US, "%s/%s %s- Render screenshots of a selected item type (e.g ItemGunBaseNT). Intended for developers and wiki editors only.", EnumChatFormatting.GREEN, + getCommandName(), EnumChatFormatting.LIGHT_PURPLE); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if(!(sender instanceof EntityPlayer)) { + throw new PlayerNotFoundException(); + } + + if(args.length == 0) { throw new WrongUsageException(getCommandUsage(sender), new Object[0]); - } + } - MainRegistry.logger.info("Taking a screenshot of " + args[0]); - - List ignoredItems = Arrays.asList( - ModItems.achievement_icon, - Items.spawn_egg, - Item.getItemFromBlock(Blocks.mob_spawner) - ); + MainRegistry.logger.info("Taking a screenshot of " + args[0]); - List> collapsedClasses = Arrays.asList( - ItemRBMKPellet.class, - ItemDepletedFuel.class, - ItemFluidDuct.class - ); + List ignoredItems = Arrays.asList(ModItems.achievement_icon, Items.spawn_egg, Item.getItemFromBlock(Blocks.mob_spawner)); - String prefix = args[0]; + List> collapsedClasses = Arrays.asList(ItemRBMKPellet.class, ItemDepletedFuel.class, ItemFluidDuct.class); + + String prefix = args[0]; int slotScale = 16; boolean ignoreNonNTM = true; List stacks = new ArrayList(); - for (Object reg : Item.itemRegistry) { + for(Object reg : Item.itemRegistry) { Item item = (Item) reg; - if(ignoreNonNTM && !Item.itemRegistry.getNameForObject(item).startsWith("hbm:")) continue; - if(ignoredItems.contains(item)) continue; - if(!item.getClass().getSimpleName().equalsIgnoreCase(args[0]) && (net.minecraft.block.Block.getBlockFromItem(item) == null || !net.minecraft.block.Block.getBlockFromItem(item).getClass().getSimpleName().equalsIgnoreCase(args[0]))) continue; + if(ignoreNonNTM && !Item.itemRegistry.getNameForObject(item).startsWith("hbm:")) + continue; + if(ignoredItems.contains(item)) + continue; + if(!item.getClass().getSimpleName().equalsIgnoreCase(args[0]) + && (net.minecraft.block.Block.getBlockFromItem(item) == null || !net.minecraft.block.Block.getBlockFromItem(item).getClass().getSimpleName().equalsIgnoreCase(args[0]))) + continue; if(collapsedClasses.contains(item.getClass())) { stacks.add(new ItemStack(item)); } else { item.getSubItems(item, null, stacks); - } } - - Minecraft.getMinecraft().thePlayer.closeScreen(); - FMLCommonHandler.instance().showGuiScreen(new GUIScreenWikiRender(stacks.toArray(new ItemStack[0]), prefix, "wiki-block-renders-256", slotScale)); } + + Minecraft.getMinecraft().thePlayer.closeScreen(); + FMLCommonHandler.instance().showGuiScreen(new GUIScreenWikiRender(stacks.toArray(new ItemStack[0]), prefix, "wiki-block-renders-256", slotScale)); + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index fa8c04d04..9ffb9ebc0 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -606,6 +606,7 @@ public class MainRegistry { Compat.handleRailcraftNonsense(); SuicideThreadDump.register(); CommandReloadClient.register(); + CommandWikiRender.register(); //ExplosionTests.runTest(); } From 6f6ebffd412fef257f3137b12abf2f489c20171f Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 16 Jul 2026 15:49:13 +0200 Subject: [PATCH 095/107] yes i think i see the issue --- src/main/java/com/hbm/handler/BossSpawnHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/handler/BossSpawnHandler.java b/src/main/java/com/hbm/handler/BossSpawnHandler.java index 4b77a265c..1e5d82382 100644 --- a/src/main/java/com/hbm/handler/BossSpawnHandler.java +++ b/src/main/java/com/hbm/handler/BossSpawnHandler.java @@ -46,7 +46,7 @@ public class BossSpawnHandler { public static void rollTheDice(World world) { /* - * Spawns every 3 hours with a 33% chance if + * Spawns every 20 minutes if * - the player is 3 blocks below the surface * - the player has at least 50 RAD * - the player has either crafted or placed an ore acidizer before @@ -70,7 +70,7 @@ public class BossSpawnHandler { data.maskManTimer++; - if(data.maskManTimer == MobConfig.maskmanDelay - 20 * 60) { + if(data.maskManTimer == MobConfig.maskmanDelay - 60) { player.addChatComponentMessage(new ChatComponentText("The mask man draws near.").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); } From ea217756a07ef40d3e74f12f92fcc4fece6e0770 Mon Sep 17 00:00:00 2001 From: Alexmaster75 Date: Thu, 16 Jul 2026 17:44:58 +0200 Subject: [PATCH 096/107] doom commit? who knows - smooth texture gauge - smooth linear gauge - updated zirnox, ccgt and watz gui (gauges) --- .../inventory/gui/GUIMachineTurbineGas.java | 207 +++++++++--------- .../hbm/inventory/gui/GUIReactorZirnox.java | 25 +-- .../java/com/hbm/inventory/gui/GUIWatz.java | 14 +- .../inventory/gui/element/GUIElements.java | 160 +++++++++++++- .../gui/generators/gui_turbinegas.png | Bin 4560 -> 8156 bytes .../hbm/textures/gui/reactors/gui_zirnox.png | Bin 7726 -> 4825 bytes 6 files changed, 268 insertions(+), 138 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 66a3b7152..2e21214ca 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -3,6 +3,7 @@ package com.hbm.inventory.gui; import java.util.ArrayList; import java.util.List; +import com.hbm.inventory.gui.element.GUIElements; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineTurbineGas; @@ -25,96 +26,96 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; public class GUIMachineTurbineGas extends GuiInfoContainer { - + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/generators/gui_turbinegas.png"); private static ResourceLocation gauge_tex = new ResourceLocation(RefStrings.MODID + ":textures/gui/gauges/button_big.png"); private TileEntityMachineTurbineGas turbinegas; - + int yStart; int slidStart; - + public GUIMachineTurbineGas(InventoryPlayer invPlayer, TileEntityMachineTurbineGas te) { super(new ContainerMachineTurbineGas(invPlayer, te)); turbinegas = te; - + this.xSize = 176; this.ySize = 223; } - + //@Override protected void mouseClicked(int x, int y, int i) { - + super.mouseClicked(x, y, i); - + slidStart = turbinegas.powerSliderPos; yStart = y; - + if(Math.sqrt(Math.pow((x - guiLeft - 88), 2) + Math.pow((y - guiTop - 40), 2)) <= 8) { //start-stop circular button - + if(turbinegas.counter == 0 || turbinegas.counter == 579) { - + int state = turbinegas.state - 1; //offline(0) to startup(-1), online(1) to offline(0) - + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - + NBTTagCompound data = new NBTTagCompound(); data.setInteger("state", state); PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, turbinegas.xCoord, turbinegas.yCoord, turbinegas.zCoord)); } - else + else return; - } - + } + if(turbinegas.state == 1 && x > guiLeft + 74 && x <= guiLeft + 74 + 29 && y >= guiTop + 86 && y < guiTop + 86 + 13) { //auto mode button - + boolean automode = !turbinegas.autoMode; mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - + NBTTagCompound data = new NBTTagCompound(); data.setBoolean("autoMode", automode); PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, turbinegas.xCoord, turbinegas.yCoord, turbinegas.zCoord)); } - + if(turbinegas.state == 1 && (guiTop + 97 - slidStart) <= yStart && (guiTop + 103 - slidStart) > yStart && guiLeft + 36 < x && guiLeft + 52 >= x) { //power slider - + NBTTagCompound data = new NBTTagCompound(); data.setBoolean("autoMode", false); //if you click the slider with automode on, turns off automode PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, turbinegas.xCoord, turbinegas.yCoord, turbinegas.zCoord)); mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); } } - + @Override protected void mouseClickMove(int x, int y, int p_146273_3_, long p_146273_4_) { - + super.mouseClickMove(x, y, p_146273_3_, p_146273_4_); - + int slidPos = turbinegas.powerSliderPos; - + if(!turbinegas.autoMode && turbinegas.state == 1 && guiLeft + 36 < x && guiLeft + 52 >= x && guiTop + 37 < y && guiTop + 103 >= y) { //area in which the slider can move - + if((guiTop + 97 - slidStart) <= yStart && (guiTop + 103 - slidStart) > yStart) { slidPos = guiTop + 100 - y; - - if(slidPos > 60) + + if(slidPos > 60) slidPos = 60; else if(slidPos < 0) slidPos = 0; - + NBTTagCompound data = new NBTTagCompound(); data.setDouble("slidPos", slidPos); PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, turbinegas.xCoord, turbinegas.yCoord, turbinegas.zCoord)); } } } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { - + super.drawScreen(mouseX, mouseY, f); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 108, 142, 16, turbinegas.power, turbinegas.getMaxPower()); - + if(turbinegas.state == 1) { double consumption = turbinegas.fuelMaxCons.containsKey(turbinegas.tanks[0].getTankType()) ? turbinegas.fuelMaxCons.get(turbinegas.tanks[0].getTankType()) : 5D; this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Fuel consumption: " + 20 * (consumption * 0.05D + consumption * turbinegas.throttle / 100) + " mb/s"}); @@ -122,20 +123,20 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { else { this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Generator offline"}); } - + if(turbinegas.temp >= 20) this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); else this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); - + turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); turbinegas.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 147, guiTop + 61, 16, 36); turbinegas.tanks[3].renderTankInfo(this, mouseX, mouseY, guiLeft + 147, guiTop + 21, 16, 36); - + String[] info = I18nUtil.resolveKeyArray("desc.gui.turbinegas.automode"); this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 34, 16, 16, guiLeft - 8, guiTop + 44 + 16, info); - + List fuels = new ArrayList(); fuels.add(I18nUtil.resolveKey("desc.gui.turbinegas.fuels")); for(FluidType type : Fluids.getInNiceOrder()) { @@ -144,25 +145,25 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } } this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 34 + 16, 16, 16, guiLeft - 8, guiTop + 44 + 16, fuels); - + String[] warning = I18nUtil.resolveKeyArray("desc.gui.turbinegas.warning"); if(turbinegas.tanks[0].getFill() < 5000 || turbinegas.tanks[1].getFill() < 1000) this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 34 + 32, 16, 16, guiLeft - 8, guiTop + 44 + 16, warning); } - + @Override protected void drawGuiContainerBackgroundLayer(float iinterpolation, int x, int y) { - + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); //the main thing - + if(turbinegas.autoMode) drawTexturedModalRect(guiLeft + 74, guiTop + 86, 194, 11, 29, 13); //auto mode button else drawTexturedModalRect(guiLeft + 74, guiTop + 86, 194, 24, 29, 13); - + switch(turbinegas.state) { case 0: drawTexturedModalRect(guiLeft + 80, guiTop + 32, 178, 38, 16, 16); //red button @@ -178,36 +179,36 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { default: break; } - + drawTexturedModalRect(guiLeft + 36, guiTop + 97 - turbinegas.powerSliderPos, 178, 0, 16, 6); //power slider - + int power = (int) (turbinegas.power * 142 / turbinegas.maxPower); //power storage drawTexturedModalRect(guiLeft + 26, guiTop + 109, 0, 223, power, 16); - - drawRPMGauge(turbinegas.rpm); + + GUIElements.drawSmoothTextureModalCircle(guiLeft + 64, guiTop + 16, this.zLevel, 176, 64, 48, 48, (double) turbinegas.rpm / 100); drawThermometer(turbinegas.temp); - + this.drawInfoPanel(guiLeft - 16, guiTop + 34, 16, 16, 3); //info this.drawInfoPanel(guiLeft - 16, guiTop + 34 + 16, 16, 16, 2); //fuels if((turbinegas.tanks[0].getFill()) < 5000 || turbinegas.tanks[1].getFill() < 1000) this.drawInfoPanel(guiLeft - 16, guiTop + 34 + 32, 16, 16, 7); if(turbinegas.tanks[0].getFill() == 0 || turbinegas.tanks[1].getFill() == 0) this.drawInfoPanel(guiLeft - 16, guiTop + 34 + 32, 16, 16, 6); - + turbinegas.tanks[0].renderTank(guiLeft + 8, guiTop + 65, this.zLevel, 16, 48); turbinegas.tanks[1].renderTank(guiLeft + 8, guiTop + 103, this.zLevel, 16, 32); turbinegas.tanks[2].renderTank(guiLeft + 147, guiTop + 98, this.zLevel, 16, 36); turbinegas.tanks[3].renderTank(guiLeft + 147, guiTop + 58, this.zLevel, 16, 36); } - + int numberToDisplay = 0; //for startup - int digitNumber = 0; + int digitNumber = 0; int exponent = 0; - + public void displayStartup() { - + if(numberToDisplay < 8888888 && turbinegas.counter < 60) { //48 frames needed to complete - + digitNumber++; if(digitNumber == 9) { digitNumber = 1; @@ -215,66 +216,66 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } numberToDisplay += Math.pow(10, exponent); } - + if(turbinegas.counter > 50) numberToDisplay = 0; - + drawPowerMeterDisplay(numberToDisplay); } - + protected void drawPowerMeterDisplay(int number) { //display code - + int firstDigitX = 65; int firstDigitY = 62; - + int[] digit = new int[7]; - + for(int i = 6; i >= 0; i--) { //creates an array of digits that represent the numbers - + digit[i] = (int) (number % 10); - + number = number / 10; - + drawTexturedModalRect(guiLeft + firstDigitX + i * 7, guiTop + 9 + firstDigitY, 194 + digit[i] * 5, 0, 5, 11); } - + int uselessZeros = 0; - + for(int i = 0; i < 6; i++) { //counts how much zeros there are before the number, to display 57 instead of 000057 - + if(digit[i] == 0) uselessZeros++; else break; } - + for(int i = 0; i < uselessZeros; i++) { //turns off the useless zeros - + drawTexturedModalRect(guiLeft + firstDigitX + i * 7, guiTop + 9 + firstDigitY, 244, 0, 5, 11); } } - + protected void drawThermometer(int temp) { - + int xPos = guiLeft + 136; int yPos = guiTop + 28; - + int width = 2; int height = 64; - + int maxTemp = 800; - + double uMin = (176D / 256D); double uMax = (178D / 256D); double vMin = ((64D - 64 * temp / maxTemp) / 256D); double vMax = (64D / 256D); - + GL11.glEnable(GL11.GL_BLEND); - + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - + Tessellator tessellator = Tessellator.instance; - + tessellator.startDrawingQuads(); tessellator.addVertexWithUV(xPos, yPos + height, this.zLevel, uMin, vMax); tessellator.addVertexWithUV(xPos + width, yPos + height, this.zLevel, uMax, vMax); @@ -284,41 +285,41 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { GL11.glDisable(GL11.GL_BLEND); } - - protected void drawRPMGauge(int position) { - - int xPos = guiLeft + 64; - int yPos = guiTop + 16; - - int squareSideLenght = 48; - - double uMin = (48D / 4848D) * position; - double uMax = (48D / 4848D) * (position + 1); - double vMin = 0D; - double vMax = 1D; - - GL11.glEnable(GL11.GL_BLEND); - - Minecraft.getMinecraft().getTextureManager().bindTexture(gauge_tex); //long boi - - Tessellator tessellator = Tessellator.instance; - - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV(xPos, yPos + squareSideLenght, this.zLevel, uMin, vMax); - tessellator.addVertexWithUV(xPos + squareSideLenght, yPos + squareSideLenght, this.zLevel, uMax, vMax); - tessellator.addVertexWithUV(xPos + squareSideLenght, yPos, this.zLevel,uMax, vMin); - tessellator.addVertexWithUV(xPos, yPos, this.zLevel, uMin, vMin); - tessellator.draw(); - GL11.glDisable(GL11.GL_BLEND); - } - +// protected void drawRPMGauge(int position) { +// +// int xPos = guiLeft + 64; +// int yPos = guiTop + 16; +// +// int squareSideLenght = 48; +// +// double uMin = (48D / 4848D) * position; +// double uMax = (48D / 4848D) * (position + 1); +// double vMin = 0D; +// double vMax = 1D; +// +// GL11.glEnable(GL11.GL_BLEND); +// +// Minecraft.getMinecraft().getTextureManager().bindTexture(gauge_tex); //long boi +// +// Tessellator tessellator = Tessellator.instance; +// +// tessellator.startDrawingQuads(); +// tessellator.addVertexWithUV(xPos, yPos + squareSideLenght, this.zLevel, uMin, vMax); +// tessellator.addVertexWithUV(xPos + squareSideLenght, yPos + squareSideLenght, this.zLevel, uMax, vMax); +// tessellator.addVertexWithUV(xPos + squareSideLenght, yPos, this.zLevel,uMax, vMin); +// tessellator.addVertexWithUV(xPos, yPos, this.zLevel, uMin, vMin); +// tessellator.draw(); +// +// GL11.glDisable(GL11.GL_BLEND); +// } + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { //useless piece of shit, at least for now String name = this.turbinegas.hasCustomInventoryName() ? this.turbinegas.getInventoryName() : I18n.format(this.turbinegas.getInventoryName()); - + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 94, 4210752); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIReactorZirnox.java b/src/main/java/com/hbm/inventory/gui/GUIReactorZirnox.java index 25072180d..aa0948990 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIReactorZirnox.java +++ b/src/main/java/com/hbm/inventory/gui/GUIReactorZirnox.java @@ -1,5 +1,6 @@ package com.hbm.inventory.gui; +import com.hbm.inventory.gui.element.GUIElements; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerReactorZirnox; @@ -39,10 +40,10 @@ public class GUIReactorZirnox extends GuiInfoContainer { zirnox.water.renderTankInfo(this, mouseX, mouseY, guiLeft + 178, guiTop + 108, 18, 12); this.drawCustomInfo(this, mouseX, mouseY, guiLeft + 160, guiTop + 33, 18, 17, new String[] { "Temperature:", " " + Math.round((zirnox.heat) * 0.00001 * 780 + 20) + "°C" }); this.drawCustomInfo(this, mouseX, mouseY, guiLeft + 178, guiTop + 33, 18, 17, new String[] { "Pressure:", " " + Math.round((zirnox.pressure) * 0.00001 * 30) + " bar" }); - + String[] coolantText = I18nUtil.resolveKeyArray("desc.gui.zirnox.coolant"); this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, coolantText); - + String[] pressureText = I18nUtil.resolveKeyArray("desc.gui.zirnox.pressure"); this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36 + 16, 16, 16, guiLeft - 8, guiTop + 36 + 16 + 16, pressureText); @@ -92,20 +93,12 @@ public class GUIReactorZirnox extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - int s = zirnox.getGaugeScaled(6, 0); - drawTexturedModalRect(guiLeft + 160, guiTop + 108, 238, 0 + 12 * s, 18, 12); + GUIElements.drawSmoothLinearGauge(guiLeft + 162, guiTop + 114, this.zLevel, (double) zirnox.steam.getFill() / zirnox.steam.getMaxFill(), 2, 5, 0.75, 14, 0, 0x7F0000); + GUIElements.drawSmoothLinearGauge(guiLeft + 144, guiTop + 114, this.zLevel, (double) zirnox.carbonDioxide.getFill() / zirnox.carbonDioxide.getMaxFill(), 2, 5, 0.75, 14, 0, 0x7F0000); + GUIElements.drawSmoothLinearGauge(guiLeft + 180, guiTop + 114, this.zLevel, (double) zirnox.water.getFill() / zirnox.water.getMaxFill(), 2, 5, 0.75, 14, 0, 0x7F0000); - int c = zirnox.getGaugeScaled(6, 1); - drawTexturedModalRect(guiLeft + 142, guiTop + 108, 238, 0 + 12 * c, 18, 12); - - int w = zirnox.getGaugeScaled(6, 2); - drawTexturedModalRect(guiLeft + 178, guiTop + 108, 238, 0 + 12 * w, 18, 12); - - int h = zirnox.getGaugeScaled(12, 3); - drawTexturedModalRect(guiLeft + 160, guiTop + 33, 220, 0 + 18 * h, 18, 17); - - int p = zirnox.getGaugeScaled(12, 4); - drawTexturedModalRect(guiLeft + 178, guiTop + 33, 220, 0 + 18 * p, 18, 17); + GUIElements.drawSmoothGauge(guiLeft + 169, guiTop + 42, this.zLevel, (double) zirnox.heat/100000, 5, 2, 1, 0x7F0000); + GUIElements.drawSmoothGauge(guiLeft + 187, guiTop + 42, this.zLevel, (double) zirnox.pressure/100000, 5, 2, 1, 0x7F0000); if(zirnox.isOn) { for(int x = 0; x < 4; x++) @@ -127,4 +120,4 @@ public class GUIReactorZirnox extends GuiInfoContainer { this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 32 + 16, 16, 16, 6); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIWatz.java b/src/main/java/com/hbm/inventory/gui/GUIWatz.java index 835c84f4d..e83437036 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIWatz.java +++ b/src/main/java/com/hbm/inventory/gui/GUIWatz.java @@ -28,11 +28,11 @@ public class GUIWatz extends GuiInfoContainer { public GUIWatz(InventoryPlayer invPlayer, TileEntityWatz watz) { super(new ContainerWatz(invPlayer, watz)); this.watz = watz; - + this.xSize = 176; this.ySize = 229; } - + @Override public void drawScreen(int x, int y, float interp) { super.drawScreen(x, y, interp); @@ -44,11 +44,11 @@ public class GUIWatz extends GuiInfoContainer { watz.tanks[1].renderTankInfo(this, x, y, guiLeft + 148, guiTop + 23, 6, 45); watz.tanks[2].renderTankInfo(this, x, y, guiLeft + 154, guiTop + 23, 6, 45); } - + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 93, 4210752); - + double scale = 1.25; String flux = String.format(Locale.US, "%,.1f", watz.fluxDisplay); GL11.glScaled(1 / scale, 1 / scale, 1); @@ -76,7 +76,7 @@ public class GUIWatz extends GuiInfoContainer { GL11.glColor4f(1.0F, col, col, 1.0F); drawTexturedModalRect(guiLeft, guiTop, 0, 0, 131, 122); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - + drawTexturedModalRect(guiLeft + 131, guiTop, 131, 0, 36, 122); drawTexturedModalRect(guiLeft, guiTop + 130, 0, 130, xSize, 99); drawTexturedModalRect(guiLeft + 126, guiTop + 31, 176, 31, 9, 60); @@ -85,8 +85,8 @@ public class GUIWatz extends GuiInfoContainer { if(watz.isOn) drawTexturedModalRect(guiLeft + 147, guiTop + 8, 176, 0, 8, 8); if(watz.isLocked) drawTexturedModalRect(guiLeft + 142, guiTop + 70, 210, 0, 18, 18); - - GUIElements.renderGauge(Gauge.ROUND_SMALL, guiLeft + 13, guiTop + 100, this.zLevel, 1 - col); + + GUIElements.drawSmoothGauge(guiLeft + 22, guiTop + 109, this.zLevel, (double) 1 - col, 5, 2, 1, 0x7F0000); watz.tanks[0].renderTank(guiLeft + 143, guiTop + 69, this.zLevel, 4, 43); watz.tanks[1].renderTank(guiLeft + 149, guiTop + 69, this.zLevel, 4, 43); diff --git a/src/main/java/com/hbm/inventory/gui/element/GUIElements.java b/src/main/java/com/hbm/inventory/gui/element/GUIElements.java index c30aa81c4..cb0416455 100644 --- a/src/main/java/com/hbm/inventory/gui/element/GUIElements.java +++ b/src/main/java/com/hbm/inventory/gui/element/GUIElements.java @@ -21,7 +21,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class GUIElements { - + @Deprecated public static enum Gauge { ROUND_SMALL("small_round", 18, 18, 13); ResourceLocation texture; @@ -33,7 +33,7 @@ public class GUIElements { this.count = count; } } - + @Deprecated public static void renderGauge(Gauge gauge, double x, double y, double z, double progress) { Minecraft.getMinecraft().renderEngine.bindTexture(gauge.texture); int frameNum = (int) Math.round((gauge.count - 1) * progress); @@ -47,7 +47,7 @@ public class GUIElements { tess.addVertexWithUV(x, y, z, 0, frameOffset); tess.draw(); } - + public static void drawSmoothGauge(int x, int y, double z, double progress, double tipLength, double backLength, double backSide, int color) { drawSmoothGauge(x, y, z, progress, tipLength, backLength, backSide, color, 0x000000); } @@ -55,12 +55,12 @@ public class GUIElements { private static Vec3NT tip = new Vec3NT(); private static Vec3NT left = new Vec3NT(); private static Vec3NT right = new Vec3NT(); - + public static void drawSmoothGauge(int x, int y, double z, double progress, double tipLength, double backLength, double backSide, int color, int colorOuter) { GL11.glDisable(GL11.GL_TEXTURE_2D); - + progress = MathHelper.clamp_double(progress, 0, 1); - + float angle = (float) Math.toRadians(-progress * 270 - 45); tip.setComponents(0, tipLength, 0); left.setComponents(backSide, -backLength, 0); @@ -69,7 +69,7 @@ public class GUIElements { tip.rotateAroundZ(angle); left.rotateAroundZ(angle); right.rotateAroundZ(angle); - + Tessellator tess = Tessellator.instance; tess.startDrawing(GL11.GL_TRIANGLES); tess.setColorOpaque_I(colorOuter); @@ -82,11 +82,147 @@ public class GUIElements { tess.addVertex(x + left.xCoord, y + left.yCoord, z); tess.addVertex(x + right.xCoord, y + right.yCoord, z); tess.draw(); - + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glEnable(GL11.GL_TEXTURE_2D); } + public static void drawSmoothLinearGauge(int x, int y, double z, double progress, double tipLength, double backLength, double backSide, double scale, float rotation, int color) { + drawSmoothLinearGauge(x, y, z, progress, tipLength, backLength, backSide, scale, rotation, color, 0x000000); + } + + private static Vec3NT Bleft = new Vec3NT(); + private static Vec3NT Bright = new Vec3NT(); + + public static void drawSmoothLinearGauge(int x, int y, double z, double progress, double tipLength, double backLength, double backSide, double scale, float rotation, int color, int colorOuter) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + + scale = Math.max(scale, 1); + progress = MathHelper.clamp_double(progress, 0, 1) * scale; + + tip.setComponents(0, -tipLength, 0); + right.setComponents(-backSide, 0, 0); + Bright.setComponents(-backSide, backLength, 0); + Bleft.setComponents(backSide, backLength, 0); + left.setComponents(backSide, 0, 0); + + float angle = (float) Math.toRadians(-rotation); + + tip.rotateAroundZ(angle); + right.rotateAroundZ(angle); + Bright.rotateAroundZ(angle); + Bleft.rotateAroundZ(angle); + left.rotateAroundZ(angle); + + double deltaX = progress * MathHelper.cos(angle); + double deltaY = progress * MathHelper.sin(angle); + + Tessellator tess = Tessellator.instance; + tess.startDrawing(GL11.GL_POLYGON); + tess.setColorOpaque_I(colorOuter); + double mult = 1.5; + tess.addVertex(x + deltaX + tip.xCoord * mult, y + deltaY + tip.yCoord * mult, z); + tess.addVertex(x + deltaX + right.xCoord * mult, y + deltaY + right.yCoord * mult, z); + tess.addVertex(x + deltaX + Bright.xCoord * mult, y + deltaY + Bright.yCoord, z); + tess.addVertex(x + deltaX + Bleft.xCoord * mult, y + deltaY + Bleft.yCoord, z); + tess.addVertex(x + deltaX + left.xCoord * mult, y + deltaY + left.yCoord * mult, z); + tess.draw(); + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + tess.startDrawing(GL11.GL_POLYGON); + tess.setColorOpaque_I(color); + tess.addVertex(x + deltaX + tip.xCoord, y + deltaY + tip.yCoord, z); + tess.addVertex(x + deltaX + right.xCoord, y + deltaY + right.yCoord, z); + tess.addVertex(x + deltaX + Bright.xCoord, y + deltaY + Bright.yCoord, z); + tess.addVertex(x + deltaX + Bleft.xCoord, y + deltaY + Bleft.yCoord, z); + tess.addVertex(x + deltaX + left.xCoord, y + deltaY + left.yCoord, z); + tess.draw(); + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public static void drawSmoothTextureModalCircle(int xDraw, int yDraw, float zDraw, int xStart, int yStart, int xDelta, int yDelta, double progress) { + float var7 = 0.00390625F; + float var8 = 0.00390625F; + + progress = MathHelper.clamp_double(progress, 0, 1); + float angle = (float) (-progress * 270.0); + double theta = Math.toRadians(angle - 135); + int addons = 0; + double xTarget = 0; + double yTarget = 0; + + // addons is just a numeric flag for how many fixed point to add, to generate the triangles + if (angle >= -180 && angle < -90) { + addons = 1; + } else if (angle >= -270 && angle < -180) { + addons = 2; + } + + // the abysmal control under here is responsible for the positioning of the last point + // basically this whole function makes this shape: + // + - - - - - - - - - - - + + // | \ * * * * * * * * * / | + // | * \ * * * * * * * / * | + // | * * \ * * * * * / * * | + // | * * * \ * * * / * * * | + // | * * * * \ * / * * * * | + // | * * * * * + * * * * * | + // | * * * * / \ * * * * | + // | * * * / \ * * * | + // | * * / \ * * | + // | * / \ * | + // | / \ | + // + - - - - - - - - - - - + + // the "/, \" are the sides, "+" points and "*" rendered part (lower triangle isn't shown) + if (angle >= -90) { + xTarget = -1; + yTarget = -Math.tan(theta); + } else if (angle > -135 && angle < -90) { + xTarget = Math.tan(Math.PI/2 - theta); + yTarget = 1; + } else if (angle > -180 && angle < -135) { + xTarget = Math.tan(Math.PI/2 - theta); + yTarget = 1; + } else if (angle <= -180) { + xTarget = 1; + yTarget = Math.tan(theta); + } else if (angle == -135) { + xTarget = 0; + yTarget = 1; + } + + double xMid = (double) xDelta / 2; + double yMid = (double) yDelta / 2; + + xTarget *= xMid; + yTarget *= yMid; + + Tessellator tess = Tessellator.instance; + + tess.startDrawing(GL11.GL_TRIANGLES); // i should've used GL_POLYGON yes i know, too bad im either too retarded to understand it or OpenGL makes it funky, i already tried + tess.addVertexWithUV((double) (xDraw), (double) (yDraw + yDelta), (double) zDraw, (double) ((float) (xStart) * var7), (double) ((float) (yStart + yDelta) * var8)); + tess.addVertexWithUV((double) (xDraw + xMid), (double) (yDraw + yMid), (double) zDraw, (double) ((float) (xStart + xMid) * var7), (double) ((float) (yStart + yMid) * var8)); + if (addons == 2 || addons == 1) { + tess.addVertexWithUV((double) (xDraw), (double) (yDraw), (double) zDraw, (double) ((float) (xStart) * var7), (double) ((float) (yStart) * var8)); + tess.draw(); + tess.startDrawing(GL11.GL_TRIANGLES); + tess.addVertexWithUV((double) (xDraw), (double) (yDraw), (double) zDraw, (double) ((float) (xStart) * var7), (double) ((float) (yStart) * var8)); + tess.addVertexWithUV((double) (xDraw + xMid), (double) (yDraw + yMid), (double) zDraw, (double) ((float) (xStart + xMid) * var7), (double) ((float) (yStart + yMid) * var8)); + } + if (addons == 2) { + tess.addVertexWithUV((double) (xDraw + xDelta), (double) (yDraw), (double) zDraw, (double) ((float) (xStart + xDelta) * var7), (double) ((float) (yStart) * var8)); + tess.draw(); + tess.startDrawing(GL11.GL_TRIANGLES); + tess.addVertexWithUV((double) (xDraw + xDelta), (double) (yDraw), (double) zDraw, (double) ((float) (xStart + xDelta) * var7), (double) ((float) (yStart) * var8)); + tess.addVertexWithUV((double) (xDraw + xMid), (double) (yDraw + yMid), (double) zDraw, (double) ((float) (xStart + xMid) * var7), (double) ((float) (yStart + yMid) * var8)); + } + tess.addVertexWithUV((double) (xDraw + xTarget + xMid), (double) (yDraw - yTarget + yMid), (double) zDraw, (double) ((float) (xStart + xTarget + xMid) * var7), (double) ((float) (yStart - yTarget + yMid) * var8)); + tess.draw(); + } + public static final int STANDARD_COLOR_BACKGROUND = -0xFEFFFF0; public static final int STANDARD_COLOR_LINE0 = 0x505000FF; public static final int STANDARD_COLOR_LINE1 = (STANDARD_COLOR_LINE0 & 0xFEFEFE) >> 1 | STANDARD_COLOR_LINE0 & -0xFEFEFE; @@ -114,7 +250,7 @@ public class GUIElements { } public static void drawHoveringText(List lines, int x, int y, FontRenderer font, RenderItem itemRender, int guiWidth, int guiHeight, int headerOffset, int lineDist, int colBG0, int colBG1, int colLine0, int colLine1) { - + if(!lines.isEmpty()) { GL11.glDisable(GL12.GL_RESCALE_NORMAL); RenderHelper.disableStandardItemLighting(); @@ -154,7 +290,7 @@ public class GUIElements { drawGradientRect(boundX - 3, boundY - 3, boundX + width + 3, boundY + height + 3, colBG0, colBG1); drawGradientRect(boundX - 4, boundY - 3, boundX - 3, boundY + height + 3, colBG0, colBG1); drawGradientRect(boundX + width + 3, boundY - 3, boundX + width + 4, boundY + height + 3, colBG0, colBG1); - + drawGradientRect(boundX - 3, boundY - 3 + 1, boundX - 3 + 1, boundY + height + 3 - 1, colLine0, colLine1); drawGradientRect(boundX + width + 2, boundY - 3 + 1, boundX + width + 3, boundY + height + 3 - 1, colLine0, colLine1); drawGradientRect(boundX - 3, boundY - 3, boundX + width + 3, boundY - 3 + 1, colLine0, colLine0); @@ -163,7 +299,7 @@ public class GUIElements { for(int i = 0; i < lines.size(); ++i) { String line = (String) lines.get(i); font.drawStringWithShadow(line, boundX, boundY, -1); - + if(i == 0) boundY += headerOffset; boundY += lineDist; } @@ -175,7 +311,7 @@ public class GUIElements { GL11.glEnable(GL12.GL_RESCALE_NORMAL); } } - + /** Colors don't use the RGBA, but rather ARGB (evil route) */ protected static void drawGradientRect(int x0, int y0, int x1, int y1, int col0, int col1) { float a0 = (float) (col0 >> 24 & 255) / 255F; diff --git a/src/main/resources/assets/hbm/textures/gui/generators/gui_turbinegas.png b/src/main/resources/assets/hbm/textures/gui/generators/gui_turbinegas.png index ce95196166cb449669d4b407743fe88459332a2a..b8f12a72e84adef8b2417d9b41de14decdcb401e 100644 GIT binary patch literal 8156 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 Date: Thu, 16 Jul 2026 17:50:44 +0200 Subject: [PATCH 097/107] removed redundand shit --- .../java/com/hbm/inventory/gui/GUIWatz.java | 1 - .../hbm/inventory/gui/element/GUIElements.java | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIWatz.java b/src/main/java/com/hbm/inventory/gui/GUIWatz.java index e83437036..c7d4dfd3d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIWatz.java +++ b/src/main/java/com/hbm/inventory/gui/GUIWatz.java @@ -6,7 +6,6 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerWatz; import com.hbm.inventory.gui.element.GUIElements; -import com.hbm.inventory.gui.element.GUIElements.Gauge; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toserver.NBTControlPacket; diff --git a/src/main/java/com/hbm/inventory/gui/element/GUIElements.java b/src/main/java/com/hbm/inventory/gui/element/GUIElements.java index cb0416455..721d8d68f 100644 --- a/src/main/java/com/hbm/inventory/gui/element/GUIElements.java +++ b/src/main/java/com/hbm/inventory/gui/element/GUIElements.java @@ -203,23 +203,23 @@ public class GUIElements { Tessellator tess = Tessellator.instance; tess.startDrawing(GL11.GL_TRIANGLES); // i should've used GL_POLYGON yes i know, too bad im either too retarded to understand it or OpenGL makes it funky, i already tried - tess.addVertexWithUV((double) (xDraw), (double) (yDraw + yDelta), (double) zDraw, (double) ((float) (xStart) * var7), (double) ((float) (yStart + yDelta) * var8)); - tess.addVertexWithUV((double) (xDraw + xMid), (double) (yDraw + yMid), (double) zDraw, (double) ((float) (xStart + xMid) * var7), (double) ((float) (yStart + yMid) * var8)); + tess.addVertexWithUV(xDraw, yDraw + yDelta, zDraw, ((float) (xStart) * var7), ((float) (yStart + yDelta) * var8)); + tess.addVertexWithUV(xDraw + xMid, yDraw + yMid, zDraw, (float) (xStart + xMid) * var7, (float) (yStart + yMid) * var8); if (addons == 2 || addons == 1) { - tess.addVertexWithUV((double) (xDraw), (double) (yDraw), (double) zDraw, (double) ((float) (xStart) * var7), (double) ((float) (yStart) * var8)); + tess.addVertexWithUV(xDraw, yDraw, zDraw, (float) (xStart) * var7, (float) (yStart) * var8); tess.draw(); tess.startDrawing(GL11.GL_TRIANGLES); - tess.addVertexWithUV((double) (xDraw), (double) (yDraw), (double) zDraw, (double) ((float) (xStart) * var7), (double) ((float) (yStart) * var8)); - tess.addVertexWithUV((double) (xDraw + xMid), (double) (yDraw + yMid), (double) zDraw, (double) ((float) (xStart + xMid) * var7), (double) ((float) (yStart + yMid) * var8)); + tess.addVertexWithUV(xDraw, yDraw, zDraw, (float) (xStart) * var7, (float) (yStart) * var8); + tess.addVertexWithUV(xDraw + xMid, yDraw + yMid, zDraw, (float) (xStart + xMid) * var7, (float) (yStart + yMid) * var8); } if (addons == 2) { - tess.addVertexWithUV((double) (xDraw + xDelta), (double) (yDraw), (double) zDraw, (double) ((float) (xStart + xDelta) * var7), (double) ((float) (yStart) * var8)); + tess.addVertexWithUV(xDraw + xDelta, yDraw, zDraw, (float) (xStart + xDelta) * var7, (float) (yStart) * var8); tess.draw(); tess.startDrawing(GL11.GL_TRIANGLES); - tess.addVertexWithUV((double) (xDraw + xDelta), (double) (yDraw), (double) zDraw, (double) ((float) (xStart + xDelta) * var7), (double) ((float) (yStart) * var8)); - tess.addVertexWithUV((double) (xDraw + xMid), (double) (yDraw + yMid), (double) zDraw, (double) ((float) (xStart + xMid) * var7), (double) ((float) (yStart + yMid) * var8)); + tess.addVertexWithUV(xDraw + xDelta, yDraw, (double) zDraw, (float) (xStart + xDelta) * var7, (float) (yStart) * var8); + tess.addVertexWithUV(xDraw + xMid, yDraw + yMid, zDraw, (float) (xStart + xMid) * var7, (float) (yStart + yMid) * var8); } - tess.addVertexWithUV((double) (xDraw + xTarget + xMid), (double) (yDraw - yTarget + yMid), (double) zDraw, (double) ((float) (xStart + xTarget + xMid) * var7), (double) ((float) (yStart - yTarget + yMid) * var8)); + tess.addVertexWithUV(xDraw + xTarget + xMid, yDraw - yTarget + yMid, zDraw, (float) (xStart + xTarget + xMid) * var7, (float) (yStart - yTarget + yMid) * var8); tess.draw(); } From 9ca6b3d3e03a9f94f66439bbdc5b1be9df53b274 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Thu, 16 Jul 2026 22:08:24 +0200 Subject: [PATCH 098/107] sustingus --- changelog | 10 +- gradle.properties | 2 +- .../hbm/blocks/machine/pile/BlockPile.java | 6 +- .../blocks/machine/pile/BlockPileBrick.java | 6 +- .../blocks/machine/pile/BlockPileDevice.java | 24 +- .../com/hbm/blocks/network/CableDiode.java | 5 +- .../pneumatic/PneumoStorageExporter.java | 52 +++ .../java/com/hbm/inventory/gui/GUIDiode.java | 10 +- .../inventory/recipes/anvil/AnvilRecipes.java | 2 +- .../com/hbm/items/armor/ArmorFSBPowered.java | 1 - src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 5 + .../java/com/hbm/main/ResourceManager.java | 10 + .../render/tileentity/RenderPileControl.java | 34 ++ .../render/tileentity/RenderPileLoader.java | 77 ++++ .../hbm/render/tileentity/RenderPileVent.java | 34 ++ .../machine/pile/TileEntityPileCore.java | 60 ++- .../assets/hbm/models/pile/pile_control.obj | 318 +++++++++++++++ .../assets/hbm/models/pile/pile_loader.obj | 325 +++++++++++++++ .../assets/hbm/models/pile/pile_vent.obj | 378 ++++++++++++++++++ .../hbm/textures/models/pile/pile_control.png | Bin 408 -> 1037 bytes .../hbm/textures/models/pile/pile_loader.png | Bin 465 -> 922 bytes .../hbm/textures/models/pile/pile_vent.png | Bin 469 -> 832 bytes 23 files changed, 1336 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/hbm/render/tileentity/RenderPileControl.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderPileLoader.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderPileVent.java create mode 100644 src/main/resources/assets/hbm/models/pile/pile_control.obj create mode 100644 src/main/resources/assets/hbm/models/pile/pile_loader.obj create mode 100644 src/main/resources/assets/hbm/models/pile/pile_vent.obj diff --git a/changelog b/changelog index 501633972..88cea5685 100644 --- a/changelog +++ b/changelog @@ -1,4 +1,5 @@ ## Changed +* Updated russian and chinese localization * Updated the trinitite ore textures * The ore spots are now smaller and more shard-like * Each trinitite ore block now has four randomized texture variants @@ -9,7 +10,14 @@ * This is a straight downgrade but people for some reason wanted it so sure why not * Cable diodes now have a GUI for configuration instead of requiring tools * The throughput can now be configured more precisely instead of increments of powers of 10 +* The magnetic storage barrel now uses BSCCO and has a new texture ## Fixed * Fixed burner press GUI offsets being incorrect -* Potentially fixed an issue with journey map where slaked sellafite would sometimes get the wrong color in the minimap \ No newline at end of file +* Potentially fixed an issue with journey map where slaked sellafite would sometimes get the wrong color in the minimap +* Finally fixed an issue making electric armor way worse than it should be, as well as preventing the vanilla armor points from working almost entirely +* Fixed pneumatic storage exporter duping filter items when broken +* Re-enabled the GTNH-NEI filter slot integration +* Fixed various GUI title offsets +* Fixed mask man announcement being sent 20 minutes before spawn (therefore never being sent at all) instead of one minute as intended +* Fixed old BAT9000 recycling \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 105ca8208..fb5115c4e 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=5751 +mod_build_number=5758 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java index 738b21427..b189566bc 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -73,9 +73,9 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { this.rec = IBlockCT.primeReceiver(reg, this.blockIcon.getIconName(), this.blockIcon); this.recTop = IBlockCT.primeReceiver(reg, this.iconTop.getIconName(), this.iconTop); - this.recChanIn = IBlockCT.primeReceiver(reg, "pile_block_input", this.blockIcon); - this.recChanOut = IBlockCT.primeReceiver(reg, "pile_block_output", this.blockIcon); - this.recCon = IBlockCT.primeReceiver(reg, "pile_block_control_top", this.iconTop); + this.recChanIn = IBlockCT.primeReceiver(reg, RefStrings.MODID + ":pile_block_input", this.blockIcon); + this.recChanOut = IBlockCT.primeReceiver(reg, RefStrings.MODID + ":pile_block_output", this.blockIcon); + this.recCon = IBlockCT.primeReceiver(reg, RefStrings.MODID + ":pile_block_control_top", this.iconTop); } @Override diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java index 65c6d169b..f309e03ba 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java @@ -129,7 +129,11 @@ public class BlockPileBrick extends Block implements IToolable { core.orientation = PileOrientation.getOrientation(dir); core.setupSize(posHeight + negHeight + 1, left + right + 1, depth + 1); } else { - boolean isEdge = h == -negHeight || h == posHeight || v == -left || v == right || d == 0 || d == depth; + int edgeCount = 0; + if(h == -negHeight || h == posHeight) edgeCount++; + if(v == -left || v == right) edgeCount++; + if(d == 0 || d == depth) edgeCount++; + boolean isEdge = edgeCount > 1; world.setBlock(iX, iY, iZ, ModBlocks.pile_block, isEdge ? BlockPile.META_EDGE : BlockPile.META_DUMMY, 3); TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) world.getTileEntity(iX, iY, iZ); pile.setCore(x, y, z); diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java index 87631c14f..f0e8ca863 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java @@ -1,16 +1,24 @@ package com.hbm.blocks.machine.pile; +import java.util.List; + +import com.hbm.blocks.IBlockMulti; import com.hbm.tileentity.machine.pile.TileEntityPileControl; import com.hbm.tileentity.machine.pile.TileEntityPileLoader; import com.hbm.tileentity.machine.pile.TileEntityPileVent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockPileDevice extends BlockContainer { +public class BlockPileDevice extends BlockContainer implements IBlockMulti { public static final int ITEM_META_LOADER = 0; public static final int ITEM_META_VENT = 1; @@ -24,8 +32,22 @@ public class BlockPileDevice extends BlockContainer { super(Material.iron); } + @Override + public int getSubCount() { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < getSubCount(); ++i) { + list.add(new ItemStack(item, 1, i)); + } + } + @Override public TileEntity createNewTileEntity(World world, int meta) { + meta -= meta % 4; if(meta == BLOCK_META_LOADER) return new TileEntityPileLoader(); if(meta == BLOCK_META_VENT) return new TileEntityPileVent(); if(meta == BLOCK_META_CONTROL) return new TileEntityPileControl(); diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 10275bb8d..40bc329e4 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -32,7 +32,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; @@ -215,8 +214,10 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, @Override public void receiveControl(NBTTagCompound data) { - if(data.hasKey("capacity")) this.limit = MathHelper.clamp_int(data.getInteger("limit"), 0, 1_000_000_000); + if(data.hasKey("limit")) this.limit = data.getLong("limit"); if(data.hasKey("priority")) this.priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, data.getByte("priority")); + if(limit < 0) limit = 0; + if(limit > 10_000_000_000L) limit = 10_000_000_000L; this.markDirty(); } diff --git a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java index 033447355..fe494f755 100644 --- a/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java +++ b/src/main/java/com/hbm/blocks/network/pneumatic/PneumoStorageExporter.java @@ -3,7 +3,12 @@ package com.hbm.blocks.network.pneumatic; import com.hbm.blocks.machine.BlockMachineBase; import com.hbm.tileentity.network.pneumatic.TileEntityPneumoStorageExporter; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -17,4 +22,51 @@ public class PneumoStorageExporter extends BlockMachineBase { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPneumoStorageExporter(); } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof ISidedInventory)) return; + + ISidedInventory tileentityfurnace = (ISidedInventory) te; + + if(tileentityfurnace != null) { + + for(int i = 9; i < tileentityfurnace.getSizeInventory(); ++i) { + + ItemStack itemstack = tileentityfurnace.getStackInSlot(i); + + if(itemstack != null) { + + float mX = world.rand.nextFloat() * 0.8F + 0.1F; + float mY = world.rand.nextFloat() * 0.8F + 0.1F; + float mZ = world.rand.nextFloat() * 0.8F + 0.1F; + + while(itemstack.stackSize > 0) { + + int amount = world.rand.nextInt(21) + 10; + if(amount > itemstack.stackSize) amount = itemstack.stackSize; + + itemstack.stackSize -= amount; + EntityItem entityitem = new EntityItem(world, x + mX, y + mY, z + mZ, new ItemStack(itemstack.getItem(), amount, itemstack.getItemDamage())); + + if(itemstack.hasTagCompound()) + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + + float motion = 0.05F; + entityitem.motionX = (float) world.rand.nextGaussian() * motion; + entityitem.motionY = (float) world.rand.nextGaussian() * motion + 0.2F; + entityitem.motionZ = (float) world.rand.nextGaussian() * motion; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIDiode.java b/src/main/java/com/hbm/inventory/gui/GUIDiode.java index bb90c636b..2b7fa3609 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIDiode.java +++ b/src/main/java/com/hbm/inventory/gui/GUIDiode.java @@ -37,9 +37,9 @@ public class GUIDiode extends GuiScreen { textThroughput = new GuiTextField(fontRendererObj, this.width / 2 - 150, 100, 90, 20); textThroughput.setText("" + diode.limit); - textThroughput.setMaxStringLength(10); + textThroughput.setMaxStringLength(11); - buttonPriority = new GuiButton(0, this.width / 2 + 50, 100, 90, 20, diode.priority.name()); + buttonPriority = new GuiButton(0, this.width / 2 + 20, 100, 90, 20, diode.priority.name()); } @Override @@ -47,10 +47,10 @@ public class GUIDiode extends GuiScreen { drawDefaultBackground(); drawString(fontRendererObj, "Throughput:", this.width / 2 - 150, 80, 0xA0A0A0); - drawString(fontRendererObj, "(max. 1,000,000,000 HE)", this.width / 2 - 150, 90, 0xA0A0A0); + drawString(fontRendererObj, "(max. 10,000,000,000 HE)", this.width / 2 - 150, 90, 0xA0A0A0); textThroughput.drawTextBox(); - drawString(fontRendererObj, "Priority:", this.width / 2 + 50, 80, 0xA0A0A0); + drawString(fontRendererObj, "Priority:", this.width / 2 + 20, 80, 0xA0A0A0); buttonPriority.drawButton(mc, mouseX, mouseY); super.drawScreen(mouseX, mouseY, partialTicks); @@ -63,7 +63,7 @@ public class GUIDiode extends GuiScreen { NBTTagCompound data = new NBTTagCompound(); data.setByte("priority", (byte) priority); - try { data.setInteger("limit", Integer.parseInt(textThroughput.getText())); } catch(Exception ex) {} + try { data.setLong("limit", Long.parseLong(textThroughput.getText())); } catch(Exception ex) {} PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, diode.xCoord, diode.yCoord, diode.zCoord)); } 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 43a7edd7d..5f0e52e54 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -731,7 +731,7 @@ public class AnvilRecipes extends SerializableRecipe { } ).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModBlocks.machine_bat9000, 1, 1), + new ComparableStack(ModBlocks.machine_bat9000, 1), new AnvilOutput[] { new AnvilOutput(new ItemStack(ModItems.plate_welded, 4, Mats.MAT_TCALLOY.id)), new AnvilOutput(new ItemStack(ModItems.plate_steel, 16)) diff --git a/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java b/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java index bfc6ba444..33ed1dc58 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java @@ -26,7 +26,6 @@ public class ArmorFSBPowered extends ArmorFSB implements IBatteryItem { this.chargeRate = chargeRate; this.consumption = consumption; this.drain = drain; - this.setMaxDamage(1); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index d09072c7a..7edfe0a91 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 (5751)"; + public static final String VERSION = "1.0.27 BETA (5758)"; //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 a97f4d088..71d29a399 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -80,6 +80,7 @@ import com.hbm.tileentity.machine.*; import com.hbm.tileentity.machine.albion.*; import com.hbm.tileentity.machine.fusion.*; import com.hbm.tileentity.machine.oil.*; +import com.hbm.tileentity.machine.pile.*; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.network.*; @@ -375,6 +376,10 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryBasin.class, new RenderFoundry()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryMold.class, new RenderFoundry()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineStrandCaster.class, new RenderStrandCaster()); + //CHICAGO PILE + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPileLoader.class, new RenderPileLoader()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPileVent.class, new RenderPileVent()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPileControl.class, new RenderPileControl()); //ZIRNOX ClientRegistry.bindTileEntitySpecialRenderer(TileEntityReactorZirnox.class, new RenderZirnox()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityZirnoxDestroyed.class, new RenderZirnoxDestroyed()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 280da2c97..fc2f13c3a 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -394,6 +394,11 @@ public class ResourceManager { public static final IModelCustom siege_ufo = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/siege_ufo.obj")); public static final IModelCustom glyphid = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/glyphid.obj")); public static final IModelCustom drone = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mobs/quadcopter.obj")); + + //PILE + public static final IModelCustom pile_loader = new HFRWavefrontObject("models/pile/pile_loader.obj").asVBO(); + public static final IModelCustom pile_vent = new HFRWavefrontObject("models/pile/pile_vent.obj").asVBO(); + public static final IModelCustom pile_control = new HFRWavefrontObject("models/pile/pile_control.obj").asVBO(); //ZIRNOX public static final IModelCustom zirnox = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/zirnox.obj")).asVBO(); @@ -841,6 +846,11 @@ public class ResourceManager { public static final ResourceLocation glyphid_scout_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/glyphid_scout.png"); public static final ResourceLocation glyphid_nuclear_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/glyphid_nuclear.png"); public static final ResourceLocation glyphid_digger_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/glyphid_digger.png"); + + //PILE + public static final ResourceLocation pile_loader_tex = new ResourceLocation(RefStrings.MODID, "textures/models/pile/pile_loader.png"); + public static final ResourceLocation pile_vent_tex = new ResourceLocation(RefStrings.MODID, "textures/models/pile/pile_vent.png"); + public static final ResourceLocation pile_control_tex = new ResourceLocation(RefStrings.MODID, "textures/models/pile/pile_control.png"); //ZIRNOX public static final ResourceLocation zirnox_tex = new ResourceLocation(RefStrings.MODID, "textures/models/zirnox.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderPileControl.java b/src/main/java/com/hbm/render/tileentity/RenderPileControl.java new file mode 100644 index 000000000..7acf06b59 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderPileControl.java @@ -0,0 +1,34 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +public class RenderPileControl 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_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(te.getBlockMetadata() % 4) { + case 0: GL11.glRotated(90, 0, 1, 0); break; + case 1: GL11.glRotated(270, 0, 1, 0); break; + case 2: GL11.glRotated(180, 0, 1, 0); break; + case 3: GL11.glRotated(0, 0, 1, 0); break; + } + + bindTexture(ResourceManager.pile_control_tex); + ResourceManager.pile_control.renderPart("Base"); + GL11.glTranslated(0, 0.5, 0); + ResourceManager.pile_control.renderPart("Rod"); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java b/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java new file mode 100644 index 000000000..4b9641c4b --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java @@ -0,0 +1,77 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.pile.BlockPileDevice; +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 RenderPileLoader extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @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_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(te.getBlockMetadata() % 4) { + case 0: GL11.glRotated(90, 0, 1, 0); break; + case 1: GL11.glRotated(270, 0, 1, 0); break; + case 2: GL11.glRotated(180, 0, 1, 0); break; + case 3: GL11.glRotated(0, 0, 1, 0); break; + } + + bindTexture(ResourceManager.pile_loader_tex); + ResourceManager.pile_loader.renderPart("Loader"); + GL11.glPushMatrix(); { + GL11.glTranslated(-0.1875, 0.5, 0); + GL11.glRotated(90, 0, 0, 1); + GL11.glTranslated(0.1875, -0.5, 0); + ResourceManager.pile_loader.renderPart("Lever"); + } GL11.glPopMatrix(); + ResourceManager.pile_loader.renderPart("Slider"); + ResourceManager.pile_loader.renderPart("Rod"); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.pile_device); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -3.5, 0); + double scale = 10; + GL11.glScaled(scale, scale, scale); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glShadeModel(GL11.GL_SMOOTH); + if(item.getItemDamage() == BlockPileDevice.ITEM_META_LOADER) { + bindTexture(ResourceManager.pile_loader_tex); + ResourceManager.pile_loader.renderAll(); + } + if(item.getItemDamage() == BlockPileDevice.ITEM_META_VENT) { + bindTexture(ResourceManager.pile_vent_tex); + ResourceManager.pile_vent.renderAll(); + } + if(item.getItemDamage() == BlockPileDevice.ITEM_META_CONTROL) { + bindTexture(ResourceManager.pile_control_tex); + ResourceManager.pile_control.renderAll(); + } + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderPileVent.java b/src/main/java/com/hbm/render/tileentity/RenderPileVent.java new file mode 100644 index 000000000..4b8829125 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderPileVent.java @@ -0,0 +1,34 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +public class RenderPileVent 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_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(te.getBlockMetadata() % 4) { + case 0: GL11.glRotated(90, 0, 1, 0); break; + case 1: GL11.glRotated(270, 0, 1, 0); break; + case 2: GL11.glRotated(180, 0, 1, 0); break; + case 3: GL11.glRotated(0, 0, 1, 0); break; + } + + bindTexture(ResourceManager.pile_vent_tex); + ResourceManager.pile_vent.renderPart("Pipe"); + GL11.glRotated((te.getWorldObj().getTotalWorldTime() % 360 + interp) * 45, 0, -1, 0); + ResourceManager.pile_vent.renderPart("Fan"); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index 18b30b554..6de16c533 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -2,14 +2,18 @@ package com.hbm.tileentity.machine.pile; import java.util.ArrayList; import java.util.List; +import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachinePWRController; import com.hbm.blocks.machine.pile.BlockPile; import com.hbm.interfaces.NotableComments; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.util.fauxpointtwelve.DirPos; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -111,27 +115,47 @@ public class TileEntityPileCore extends TileEntityTickingBase { } public boolean drillChannel(int x, int y, int z, ForgeDirection dir, EntityPlayer player) { + int startMeta = worldObj.getBlockMetadata(x, y, z); PileChannelType type = PileChannelType.getChannelType(dir, orientation); + int size = type == PileChannelType.CONTROL ? height : type == PileChannelType.FUEL ? depth : width; + List list = getChannelList(type); + + if(startMeta == BlockPile.META_FUEL_IN || startMeta == BlockPile.META_AIR_IN || startMeta == BlockPile.META_CONTROL) { + for(int i = 0; i < list.size(); i++) { + PileChannel chan = list.get(i); + if(chan.entry.compare(x, y, z) && chan.entry.getDir() == dir) { + list.remove(i); + for(int j = 0; j < size; j++) { + int iX = x + dir.offsetX * j; + int iY = y + dir.offsetY * j; + int iZ = z + dir.offsetZ * j; + worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_DUMMY, 3); + } + return true; + } + } + } + boolean error = false; - for(int i = 0; i <= size; i++) { + for(int i = 0; i < size; i++) { int iX = x + dir.offsetX * i; int iY = y + dir.offsetY * i; int iZ = z + dir.offsetZ * i; if(worldObj.getBlock(iX, iY, iZ) != ModBlocks.pile_block) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Foreign block in reactor", player); error = true; } int meta = worldObj.getBlockMetadata(iX, iY, iZ); if(meta == BlockPile.META_EDGE) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot drill along edge", player); error = true; } - if(meta == BlockPile.META_CORE) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect core", player); error = true; } - if(meta == BlockPile.META_CHANNEL) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect channel", player); error = true; } - if(meta != BlockPile.META_DUMMY) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect channel IO", player); error = true; } + else if(meta == BlockPile.META_CORE) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect core", player); error = true; } + else if(meta == BlockPile.META_CHANNEL) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect channel", player); error = true; } + else if(meta != BlockPile.META_DUMMY) { MachinePWRController.sendError(worldObj, iX, iY, iZ, "Cannot intersect channel IO", player); error = true; } } if(error) return false; - for(int i = 0; i <= size; i++) { + for(int i = 0; i < size; i++) { int iX = x + dir.offsetX * i; int iY = y + dir.offsetY * i; int iZ = z + dir.offsetZ * i; @@ -139,16 +163,15 @@ public class TileEntityPileCore extends TileEntityTickingBase { if(type == PileChannelType.FUEL) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_FUEL_IN, 3); if(type == PileChannelType.VENTILATION) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_AIR_IN, 3); if(type == PileChannelType.CONTROL) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_CONTROL, 3); - } else if(i == size) { + } else if(i == size - 1) { if(type == PileChannelType.FUEL) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_FUEL_OUT, 3); if(type == PileChannelType.VENTILATION) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_AIR_OUT, 3); if(type == PileChannelType.CONTROL) worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_CONTROL, 3); } else { - worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_DUMMY, 3); + worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_CHANNEL, 3); } } - List list = getChannelList(type); list.add(new PileChannel(x, y, z, dir, size, type)); this.markChanged(); @@ -159,6 +182,27 @@ public class TileEntityPileCore extends TileEntityTickingBase { @Override public void updateEntity() { + if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 3 == 0) for(PileChannel chan : this.ventilationChannels) { + + double x = chan.entry.getX() + 0.5 + chan.entry.getDir().offsetX * (this.width - 0.375); + double y = chan.entry.getY() + 0.5; + double z = chan.entry.getZ() + 0.5 + chan.entry.getDir().offsetZ * (this.width - 0.375); + Random rand = worldObj.rand; + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "tower"); + data.setFloat("lift", 1F); + data.setFloat("base", 0.125F + rand.nextFloat() * 0.125F); + data.setFloat("max", 1F); + data.setFloat("strafe", 0.0025F); + data.setBoolean("noWind", true); + data.setInteger("life", 20 + worldObj.rand.nextInt(30)); + data.setInteger("color", 0xa0a0a0); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + } + } } public void destroy() { diff --git a/src/main/resources/assets/hbm/models/pile/pile_control.obj b/src/main/resources/assets/hbm/models/pile/pile_control.obj new file mode 100644 index 000000000..a7859bdb4 --- /dev/null +++ b/src/main/resources/assets/hbm/models/pile/pile_control.obj @@ -0,0 +1,318 @@ +# Blender v2.79 (sub 0) OBJ File: 'pile_control.blend' +# www.blender.org +o Rod +v 0.187500 0.750000 -0.250000 +v 0.250000 0.750000 -0.187500 +v -0.250000 0.750000 -0.187500 +v -0.187500 0.750000 -0.250000 +v -0.187500 0.750000 0.250000 +v -0.250000 0.750000 0.187500 +v 0.250000 0.750000 0.187500 +v 0.187500 0.750000 0.250000 +v 0.250000 1.000000 -0.187500 +v 0.187500 1.000000 -0.250000 +v -0.187500 1.000000 -0.250000 +v -0.250000 1.000000 -0.187500 +v -0.250000 1.000000 0.187500 +v -0.187500 1.000000 0.250000 +v 0.187500 1.000000 0.250000 +v 0.250000 1.000000 0.187500 +v 0.187500 0.750000 -0.125000 +v 0.125000 0.750000 -0.187500 +v -0.125000 0.750000 -0.187500 +v -0.187500 0.750000 -0.125000 +v -0.187500 0.750000 0.125000 +v -0.125000 0.750000 0.187500 +v 0.125000 0.750000 0.187500 +v 0.187500 0.750000 0.125000 +v 0.125000 0.000000 -0.187500 +v 0.187500 0.000000 -0.125000 +v -0.187500 0.000000 -0.125000 +v -0.125000 0.000000 -0.187500 +v -0.125000 0.000000 0.187500 +v -0.187500 0.000000 0.125000 +v 0.187500 0.000000 0.125000 +v 0.125000 0.000000 0.187500 +vt 0.618182 0.600000 +vt 0.509091 0.700000 +vt 0.509091 0.600000 +vt 0.872727 0.600000 +vt 0.763636 0.700000 +vt 0.763636 0.600000 +vt 0.490909 0.600000 +vt 0.381818 0.700000 +vt 0.381818 0.600000 +vt 0.618182 0.700000 +vt 0.636364 0.725000 +vt 0.490909 0.875000 +vt 0.490909 0.575000 +vt 0.509091 0.400000 +vt 0.745455 1.000000 +vt 0.818182 0.700000 +vt 0.818182 1.000000 +vt 0.927273 1.000000 +vt 1.000000 0.700000 +vt 1.000000 1.000000 +vt 0.654545 1.000000 +vt 0.727273 0.700000 +vt 0.727273 1.000000 +vt 0.636364 0.700000 +vt 0.636364 0.600000 +vt 0.490909 0.700000 +vt 0.363636 0.600000 +vt 0.745455 0.600000 +vt 0.745455 0.700000 +vt 0.745455 0.700000 +vt 0.636364 0.700000 +vt 0.636364 1.000000 +vt 0.909091 0.700000 +vt 0.927273 0.700000 +vt 0.836364 1.000000 +vt 0.909091 1.000000 +vt 0.872727 0.700000 +vt 0.636364 0.875000 +vt 0.618182 0.900000 +vt 0.509091 0.900000 +vt 0.490909 0.725000 +vt 0.618182 0.400000 +vt 0.636364 0.425000 +vt 0.636364 0.575000 +vt 0.490909 0.425000 +vt 0.654545 0.700000 +vt 0.363636 0.700000 +vt 0.836364 0.700000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn -0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 0.0000 -1.0000 +s off +f 2/1/1 16/2/1 7/3/1 +f 6/4/2 12/5/2 3/6/2 +f 8/7/3 14/8/3 5/9/3 +f 9/10/4 10/11/4 14/12/4 +f 2/1/5 8/13/5 6/14/5 +f 24/15/1 26/16/1 17/17/1 +f 20/18/2 30/19/2 21/20/2 +f 22/21/3 32/22/3 23/23/3 +f 10/24/6 2/1/6 1/25/6 +f 8/7/7 16/2/7 15/26/7 +f 14/8/8 6/27/8 5/9/8 +f 4/28/9 12/5/9 11/29/9 +f 4/28/10 10/24/10 1/25/10 +f 24/15/7 32/22/7 31/30/7 +f 30/31/8 22/21/8 21/32/8 +f 20/18/9 28/33/9 27/34/9 +f 26/16/6 18/35/6 17/17/6 +f 18/35/10 28/33/10 19/36/10 +f 2/1/1 9/10/1 16/2/1 +f 6/4/2 13/37/2 12/5/2 +f 8/7/3 15/26/3 14/8/3 +f 10/11/4 11/38/4 12/39/4 +f 12/39/4 13/40/4 10/11/4 +f 13/40/4 14/12/4 10/11/4 +f 14/12/4 15/41/4 16/2/4 +f 16/2/4 9/10/4 14/12/4 +f 6/14/5 3/42/5 4/43/5 +f 4/43/5 1/44/5 2/1/5 +f 2/1/5 7/3/5 8/13/5 +f 8/13/5 5/45/5 6/14/5 +f 6/14/5 4/43/5 2/1/5 +f 24/15/1 31/30/1 26/16/1 +f 20/18/2 27/34/2 30/19/2 +f 22/21/3 29/46/3 32/22/3 +f 10/24/6 9/10/6 2/1/6 +f 8/7/7 7/3/7 16/2/7 +f 14/8/8 13/47/8 6/27/8 +f 4/28/9 3/6/9 12/5/9 +f 4/28/10 11/29/10 10/24/10 +f 24/15/7 23/23/7 32/22/7 +f 30/31/8 29/46/8 22/21/8 +f 20/18/9 19/36/9 28/33/9 +f 26/16/6 25/48/6 18/35/6 +f 18/35/10 25/48/10 28/33/10 +o Base +v -0.375000 0.000000 -0.375000 +v -0.375000 0.000000 0.375000 +v 0.375000 0.000000 -0.375000 +v 0.375000 0.000000 0.375000 +v -0.375000 0.250000 -0.375000 +v -0.375000 0.250000 0.375000 +v 0.375000 0.250000 -0.375000 +v 0.375000 0.250000 0.375000 +v 0.500000 0.375000 0.125000 +v 0.500000 0.375000 -0.125000 +v 0.500000 0.625000 -0.125000 +v 0.500000 0.625000 0.125000 +v 0.375000 0.625000 0.125000 +v 0.375000 0.625000 -0.125000 +v 0.375000 0.375000 0.125000 +v 0.375000 0.375000 -0.125000 +v -0.250000 0.250000 -0.187500 +v -0.187500 0.250000 -0.250000 +v -0.187500 0.250000 0.250000 +v -0.250000 0.250000 0.187500 +v 0.187500 0.250000 -0.250000 +v 0.250000 0.250000 -0.187500 +v 0.250000 0.250000 0.187500 +v 0.187500 0.250000 0.250000 +v 0.250000 0.750000 -0.187500 +v 0.187500 0.750000 -0.250000 +v -0.187500 0.750000 -0.250000 +v -0.250000 0.750000 -0.187500 +v -0.250000 0.750000 0.187500 +v -0.187500 0.750000 0.250000 +v 0.187500 0.750000 0.250000 +v 0.250000 0.750000 0.187500 +v 0.312500 0.687500 0.187500 +v 0.312500 0.687500 -0.187500 +v 0.312500 0.312500 0.187500 +v 0.312500 0.312500 -0.187500 +v 0.250000 0.687500 0.187500 +v 0.250000 0.687500 -0.187500 +v 0.250000 0.312500 0.187500 +v 0.250000 0.312500 -0.187500 +vt 0.290909 0.800000 +vt 0.072727 0.500000 +vt 0.290909 0.500000 +vt 0.072727 0.400000 +vt 0.290909 0.100000 +vt 0.290909 0.400000 +vt 0.290909 -0.000000 +vt 0.072727 0.100000 +vt 0.072727 -0.000000 +vt 0.000000 0.100000 +vt 0.000000 0.400000 +vt 0.363636 0.400000 +vt 0.363636 0.100000 +vt 0.618182 0.000000 +vt 0.509091 0.200000 +vt 0.509091 -0.000000 +vt 0.872727 0.000000 +vt 0.763636 0.200000 +vt 0.763636 0.000000 +vt 0.618182 0.200000 +vt 0.636364 0.225000 +vt 0.490909 0.375000 +vt 0.490909 -0.000000 +vt 0.381818 0.200000 +vt 0.381818 0.000000 +vt 0.909091 0.325000 +vt 0.927273 0.450000 +vt 0.909091 0.425000 +vt 0.363636 0.000000 +vt 0.363636 0.200000 +vt 0.745455 0.000000 +vt 0.636364 0.200000 +vt 0.636364 0.000000 +vt 0.872727 0.325000 +vt 0.800000 0.425000 +vt 0.800000 0.325000 +vt 0.909091 0.575000 +vt 0.872727 0.475000 +vt 0.909091 0.475000 +vt 0.909091 0.125000 +vt 0.872727 0.025000 +vt 0.909091 0.025000 +vt 0.909091 0.275000 +vt 0.872727 0.175000 +vt 0.909091 0.175000 +vt 0.927273 0.600000 +vt 0.927273 0.150000 +vt 0.927273 0.300000 +vt 0.945455 0.300000 +vt 0.945455 0.450000 +vt 0.945455 0.600000 +vt 0.927273 -0.000000 +vt 0.945455 0.150000 +vt 0.072727 0.800000 +vt 0.872727 0.200000 +vt 0.636364 0.375000 +vt 0.618182 0.400000 +vt 0.509091 0.400000 +vt 0.490909 0.225000 +vt 0.490909 0.200000 +vt 0.745455 0.200000 +vt 0.872727 0.425000 +vt 0.872727 0.575000 +vt 0.872727 0.125000 +vt 0.872727 0.275000 +vt 0.945455 -0.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn -0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.7071 0.0000 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 -0.7071 0.0000 +s off +f 35/49/11 34/50/11 33/51/11 +f 38/52/12 39/53/12 37/54/12 +f 35/55/13 40/56/13 36/57/13 +f 34/50/14 37/54/14 33/51/14 +f 36/58/15 38/52/15 34/59/15 +f 33/60/16 39/53/16 35/61/16 +f 54/62/13 64/63/13 55/64/13 +f 52/65/14 60/66/14 49/67/14 +f 57/68/12 58/69/12 62/70/12 +f 56/71/15 62/72/15 51/73/15 +f 46/74/17 65/75/17 45/76/17 +f 64/63/18 56/71/18 55/64/18 +f 52/77/19 62/72/19 61/78/19 +f 60/66/20 50/79/20 49/67/20 +f 54/62/21 58/80/21 57/68/21 +f 50/79/16 58/80/16 53/81/16 +f 43/82/13 41/83/13 42/84/13 +f 45/76/12 43/82/12 46/74/12 +f 47/85/15 44/86/15 45/87/15 +f 48/88/11 41/89/11 47/90/11 +f 46/91/16 42/92/16 48/93/16 +f 45/87/18 67/94/18 47/85/18 +f 47/90/22 68/95/22 48/88/22 +f 46/91/21 68/95/21 66/96/21 +f 68/95/16 70/97/16 66/96/16 +f 66/96/12 69/98/12 65/75/12 +f 65/75/15 71/99/15 67/94/15 +f 67/100/11 72/101/11 68/95/11 +f 35/49/11 36/102/11 34/50/11 +f 38/52/12 40/56/12 39/53/12 +f 35/55/13 39/53/13 40/56/13 +f 34/50/14 38/52/14 37/54/14 +f 36/58/15 40/56/15 38/52/15 +f 33/60/16 37/54/16 39/53/16 +f 54/62/13 57/68/13 64/63/13 +f 52/65/14 61/103/14 60/66/14 +f 58/69/12 59/104/12 60/105/12 +f 60/105/12 61/106/12 58/69/12 +f 61/106/12 62/70/12 58/69/12 +f 62/70/12 63/107/12 64/63/12 +f 64/63/12 57/68/12 62/70/12 +f 56/71/15 63/108/15 62/72/15 +f 46/74/17 66/96/17 65/75/17 +f 64/63/18 63/108/18 56/71/18 +f 52/77/19 51/73/19 62/72/19 +f 60/66/20 59/109/20 50/79/20 +f 54/62/21 53/81/21 58/80/21 +f 50/79/16 59/109/16 58/80/16 +f 43/82/13 44/110/13 41/83/13 +f 45/76/12 44/110/12 43/82/12 +f 47/85/15 41/111/15 44/86/15 +f 48/88/11 42/112/11 41/89/11 +f 46/91/16 43/113/16 42/92/16 +f 45/87/18 65/75/18 67/94/18 +f 47/90/22 67/100/22 68/95/22 +f 46/91/21 48/93/21 68/95/21 +f 68/95/16 72/101/16 70/97/16 +f 66/96/12 70/97/12 69/98/12 +f 65/75/15 69/98/15 71/99/15 +f 67/100/11 71/114/11 72/101/11 diff --git a/src/main/resources/assets/hbm/models/pile/pile_loader.obj b/src/main/resources/assets/hbm/models/pile/pile_loader.obj new file mode 100644 index 000000000..bf6e7c9d8 --- /dev/null +++ b/src/main/resources/assets/hbm/models/pile/pile_loader.obj @@ -0,0 +1,325 @@ +# Blender v2.79 (sub 0) OBJ File: 'pile_loader.blend' +# www.blender.org +o Rod +v 0.312500 0.500000 0.125000 +v 0.312500 0.437500 0.062500 +v 0.312500 0.437500 -0.062500 +v 0.312500 0.500000 -0.125000 +v 0.312500 0.687500 0.062500 +v 0.312500 0.625000 0.125000 +v 0.312500 0.625000 -0.125000 +v 0.312500 0.687500 -0.062500 +v -0.187500 0.625000 0.125000 +v -0.187500 0.687500 0.062500 +v -0.187500 0.687500 -0.062500 +v -0.187500 0.625000 -0.125000 +v -0.187500 0.437500 0.062500 +v -0.187500 0.500000 0.125000 +v -0.187500 0.500000 -0.125000 +v -0.187500 0.437500 -0.062500 +vt 0.833333 0.071429 +vt 1.000000 0.119048 +vt 0.833333 0.119048 +vt 0.833333 0.214286 +vt 1.000000 0.261905 +vt 0.833333 0.261905 +vt 0.833333 0.142857 +vt 1.000000 0.190476 +vt 0.833333 0.190476 +vt 0.833333 -0.000000 +vt 1.000000 0.047619 +vt 0.833333 0.047619 +vt 0.833333 0.285714 +vt 1.000000 0.071429 +vt 1.000000 0.142857 +vt 1.000000 0.214286 +vt 1.000000 -0.000000 +vt 1.000000 0.285714 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 0.3827 -0.9239 +vn 0.0000 0.3827 0.9239 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.9239 -0.3827 +s 1 +f 4/1/1 12/2/2 7/3/2 +f 6/4/3 14/5/4 1/6/4 +f 8/7/5 10/8/6 5/9/6 +f 2/10/7 16/11/8 3/12/8 +f 14/5/4 2/13/7 1/6/4 +f 4/1/1 16/11/8 15/14/1 +f 8/7/5 12/2/2 11/15/5 +f 6/4/3 10/8/6 9/16/3 +f 4/1/1 15/14/1 12/2/2 +f 6/4/3 9/16/3 14/5/4 +f 8/7/5 11/15/5 10/8/6 +f 2/10/7 13/17/7 16/11/8 +f 14/5/4 13/18/7 2/13/7 +f 4/1/1 3/12/8 16/11/8 +f 8/7/5 7/3/2 12/2/2 +f 6/4/3 5/9/6 10/8/6 +o Lever +v -0.093750 0.468750 -0.312500 +v -0.093750 0.468750 -0.375000 +v -0.093750 0.531250 -0.375000 +v -0.093750 0.531250 -0.312500 +v -0.218750 0.531250 -0.375000 +v -0.218750 0.468750 -0.375000 +v -0.156250 0.531250 -0.312500 +v -0.156250 0.468750 -0.312500 +v -0.156250 0.468750 -0.250000 +v -0.156250 0.531250 -0.250000 +v -0.218750 0.468750 -0.250000 +v -0.218750 0.531250 -0.250000 +v -0.093750 0.562500 -0.406250 +v -0.093750 0.437500 -0.406250 +v -0.093750 0.562500 -0.281250 +v -0.093750 0.437500 -0.281250 +v 0.531250 0.562500 -0.281250 +v 0.531250 0.562500 -0.406250 +v 0.531250 0.437500 -0.406250 +v 0.531250 0.437500 -0.281250 +vt 0.979167 0.642857 +vt 0.958333 0.666667 +vt 0.958333 0.619048 +vt 0.937500 0.666667 +vt 0.937500 0.619048 +vt 0.937500 0.571429 +vt 0.916667 0.595238 +vt 0.916667 0.571429 +vt 0.958333 0.571429 +vt 0.979167 0.595238 +vt 1.000000 0.571429 +vt 0.979167 0.571429 +vt 0.916667 0.642857 +vt 0.916667 0.666667 +vt 1.000000 0.642857 +vt 0.979167 0.666667 +vt 0.958333 0.571429 +vt 0.916667 0.333333 +vt 0.958333 0.333333 +vt 0.833333 0.333333 +vt 0.875000 0.285714 +vt 0.875000 0.333333 +vt 0.875000 0.619048 +vt 0.833333 0.571429 +vt 0.875000 0.571429 +vt 1.000000 0.571429 +vt 1.000000 0.333333 +vt 0.916667 0.571429 +vt 1.000000 0.595238 +vt 1.000000 0.666667 +vt 0.833333 0.285714 +vt 0.833333 0.619048 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +s off +f 23/19/9 19/20/9 21/21/9 +f 21/21/10 18/22/10 22/23/10 +f 27/24/11 24/25/11 25/26/11 +f 28/27/9 23/28/9 21/21/9 +f 25/29/12 23/28/12 26/30/12 +f 28/27/13 22/23/13 27/24/13 +f 24/31/11 18/22/11 17/32/11 +f 24/33/14 20/34/14 23/19/14 +f 32/35/11 35/36/11 36/37/11 +f 33/38/12 35/39/12 34/40/12 +f 30/41/13 31/42/13 29/43/13 +f 31/44/14 36/37/14 33/45/14 +f 29/43/9 33/38/9 34/40/9 +f 29/43/10 35/36/10 30/46/10 +f 23/19/9 20/34/9 19/20/9 +f 21/21/10 19/20/10 18/22/10 +f 27/24/11 22/23/11 24/25/11 +f 28/27/9 26/30/9 23/28/9 +f 25/29/12 24/47/12 23/28/12 +f 28/27/13 21/21/13 22/23/13 +f 24/31/11 22/23/11 18/22/11 +f 24/33/14 17/48/14 20/34/14 +f 32/35/11 30/46/11 35/36/11 +f 33/38/12 36/49/12 35/39/12 +f 30/41/13 32/50/13 31/42/13 +f 31/44/14 32/35/14 36/37/14 +f 29/43/9 31/42/9 33/38/9 +f 29/43/10 34/40/10 35/36/10 +o Slider +v 0.437500 0.437500 0.125000 +v 0.437500 0.437500 -0.125000 +v 0.312500 0.437500 0.125000 +v 0.312500 0.437500 -0.125000 +v 0.437500 0.687500 0.125000 +v 0.437500 0.687500 -0.125000 +v 0.312500 0.687500 0.125000 +v 0.312500 0.687500 -0.125000 +vt 0.625000 0.761905 +vt 0.583333 0.857143 +vt 0.583333 0.761905 +vt 0.500000 0.761905 +vt 0.500000 0.857143 +vt 0.708333 0.857143 +vt 0.708333 0.761905 +vt 0.625000 0.857143 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 44/51/15 41/52/15 42/53/15 +f 38/54/16 41/52/16 37/55/16 +f 39/56/17 44/51/17 40/57/17 +f 44/51/15 43/58/15 41/52/15 +f 38/54/16 42/53/16 41/52/16 +f 39/56/17 43/58/17 44/51/17 +o Loader +v -0.500000 0.875000 0.375000 +v -0.500000 0.125000 0.375000 +v -0.500000 0.875000 -0.375000 +v -0.500000 0.125000 -0.375000 +v -0.250000 0.875000 -0.375000 +v -0.250000 0.875000 0.375000 +v -0.250000 0.125000 0.375000 +v -0.250000 0.125000 -0.375000 +v -0.250000 0.687500 0.250000 +v -0.250000 0.750000 0.187500 +v -0.250000 0.250000 0.187500 +v -0.250000 0.312500 0.250000 +v -0.250000 0.750000 -0.187500 +v -0.250000 0.687500 -0.250000 +v -0.250000 0.312500 -0.250000 +v -0.250000 0.250000 -0.187500 +v 0.500000 0.687500 -0.250000 +v 0.437500 0.750000 -0.125000 +v 0.437500 0.750000 0.125000 +v 0.500000 0.687500 0.250000 +v 0.500000 0.312500 0.250000 +v 0.500000 0.250000 0.187500 +v 0.500000 0.250000 -0.187500 +v 0.500000 0.312500 -0.250000 +v 0.500000 0.750000 0.187500 +v 0.500000 0.750000 -0.187500 +v -0.187500 0.750000 0.125000 +v -0.187500 0.750000 -0.125000 +v -0.187500 0.437500 -0.125000 +v -0.187500 0.437500 0.125000 +v 0.437500 0.437500 0.125000 +v 0.437500 0.437500 -0.125000 +vt 0.750000 0.476190 +vt 0.500000 0.761905 +vt 0.500000 0.476190 +vt 0.500000 0.095238 +vt 0.750000 0.380952 +vt 0.500000 0.380952 +vt 0.750000 -0.000000 +vt 0.500000 -0.000000 +vt 0.833333 0.380952 +vt 0.750000 0.095238 +vt 0.833333 0.095238 +vt 0.416667 0.095238 +vt 0.416667 0.380952 +vt 0.416667 0.642857 +vt 0.166667 0.500000 +vt 0.416667 0.500000 +vt 0.416667 0.142857 +vt 0.166667 0.000000 +vt 0.416667 0.000000 +vt 0.416667 0.309524 +vt 0.166667 0.166667 +vt 0.416667 0.166667 +vt -0.000000 0.476190 +vt 0.020833 0.309524 +vt 0.166667 0.333333 +vt 0.166667 0.666667 +vt 0.416667 0.666667 +vt 0.416667 0.476190 +vt 0.166667 0.476190 +vt 0.166667 0.309524 +vt 0.187500 1.000000 +vt 0.395833 0.880952 +vt 0.395833 1.000000 +vt 0.395833 0.452381 +vt 0.187500 0.452381 +vt 0.187500 0.357143 +vt 0.416667 0.333333 +vt 0.395833 0.357143 +vt 0.187500 0.785714 +vt 0.395833 0.785714 +vt 0.500000 0.880952 +vt 0.500000 0.785714 +vt 0.083333 0.785714 +vt 0.187500 0.880952 +vt 0.083333 0.880952 +vt 0.395833 0.666667 +vt 0.187500 0.666667 +vt 0.750000 0.761905 +vt 0.166667 0.642857 +vt 0.166667 0.142857 +vt 0.145833 0.500000 +vt 0.020833 0.500000 +vt -0.000000 0.333333 +vt 0.145833 0.309524 +vn -1.0000 0.0000 0.0000 +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 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +s off +f 47/59/18 46/60/18 45/61/18 +f 51/62/19 49/63/19 50/64/19 +f 48/65/20 51/62/20 46/66/20 +f 45/61/21 49/63/21 47/59/21 +f 47/67/22 52/68/22 48/69/22 +f 46/70/23 50/64/23 45/71/23 +f 56/72/23 64/73/23 53/74/23 +f 60/75/20 66/76/20 55/77/20 +f 58/78/22 68/79/22 59/80/22 +f 66/81/19 68/82/19 70/83/19 +f 66/84/24 56/72/24 55/85/24 +f 54/86/25 64/73/25 69/87/25 +f 68/79/26 60/75/26 59/80/26 +f 58/78/27 70/83/27 61/88/27 +f 63/89/22 74/90/22 71/91/22 +f 71/92/21 69/87/21 63/93/21 +f 62/94/21 57/95/21 72/96/21 +f 72/96/21 54/86/21 71/92/21 +f 63/93/21 70/83/21 62/94/21 +f 74/90/21 76/97/21 73/98/21 +f 71/99/19 73/98/19 72/100/19 +f 62/101/18 75/102/18 63/103/18 +f 72/104/23 76/97/23 62/105/23 +f 47/59/18 48/106/18 46/60/18 +f 51/62/19 52/68/19 49/63/19 +f 48/65/20 52/68/20 51/62/20 +f 45/61/21 50/64/21 49/63/21 +f 47/67/22 49/63/22 52/68/22 +f 46/70/23 51/62/23 50/64/23 +f 56/72/23 65/107/23 64/73/23 +f 60/75/20 67/108/20 66/76/20 +f 58/78/22 61/88/22 68/79/22 +f 70/83/19 69/87/19 64/109/19 +f 64/109/19 65/110/19 66/81/19 +f 66/81/19 67/111/19 68/82/19 +f 68/82/19 61/112/19 70/83/19 +f 70/83/19 64/109/19 66/81/19 +f 66/84/24 65/107/24 56/72/24 +f 54/86/25 53/74/25 64/73/25 +f 68/79/26 67/108/26 60/75/26 +f 58/78/27 57/95/27 70/83/27 +f 63/89/22 75/102/22 74/90/22 +f 71/92/21 54/86/21 69/87/21 +f 62/94/21 70/83/21 57/95/21 +f 72/96/21 57/95/21 54/86/21 +f 63/93/21 69/87/21 70/83/21 +f 74/90/21 75/102/21 76/97/21 +f 71/99/19 74/90/19 73/98/19 +f 62/101/18 76/97/18 75/102/18 +f 72/104/23 73/98/23 76/97/23 diff --git a/src/main/resources/assets/hbm/models/pile/pile_vent.obj b/src/main/resources/assets/hbm/models/pile/pile_vent.obj new file mode 100644 index 000000000..b13ceeb4b --- /dev/null +++ b/src/main/resources/assets/hbm/models/pile/pile_vent.obj @@ -0,0 +1,378 @@ +# Blender v2.79 (sub 0) OBJ File: 'pile_vent.blend' +# www.blender.org +o Fan +v 0.000000 0.812500 -0.031250 +v -0.022097 0.812500 -0.022097 +v -0.031250 0.812500 0.000000 +v -0.022097 0.812500 0.022097 +v 0.000000 0.812500 0.031250 +v 0.022097 0.812500 0.022097 +v 0.031250 0.812500 -0.000000 +v 0.022097 0.812500 -0.022097 +v -0.022097 0.875000 -0.022097 +v -0.000000 0.875000 -0.031250 +v -0.031250 0.875000 0.000000 +v -0.022097 0.875000 0.022097 +v -0.000000 0.875000 0.031250 +v 0.022097 0.875000 0.022097 +v 0.031250 0.875000 -0.000000 +v 0.022097 0.875000 -0.022097 +v -0.027063 0.859375 0.109375 +v 0.027063 0.828125 0.109375 +v -0.027063 0.859375 0.000000 +v 0.027063 0.828125 0.000000 +v -0.027063 0.828125 0.000000 +v 0.027063 0.859375 0.000000 +v -0.027063 0.828125 -0.109375 +v 0.027063 0.859375 -0.109375 +v 0.109375 0.859375 0.027063 +v 0.109375 0.828125 -0.027063 +v -0.000000 0.859375 0.027063 +v -0.000000 0.828125 -0.027063 +v -0.000000 0.828125 0.027063 +v -0.000000 0.859375 -0.027063 +v -0.109375 0.828125 0.027063 +v -0.109375 0.859375 -0.027063 +vt 0.048780 0.775000 +vt 0.146341 0.825000 +vt 0.048780 0.825000 +vt 0.012195 0.775314 +vt 0.020602 0.778883 +vt 0.024084 0.787500 +vt 0.146341 0.825000 +vt 0.048780 0.775000 +vt 0.146341 0.775000 +vt 0.048780 0.775000 +vt 0.146341 0.825000 +vt 0.048780 0.825000 +vt 0.146341 0.825000 +vt 0.048780 0.775000 +vt 0.146341 0.775000 +vt 0.146341 0.775000 +vt 0.020602 0.796117 +vt 0.012195 0.799686 +vt 0.003788 0.796117 +vt 0.000306 0.787500 +vt 0.003788 0.778883 +vt 0.048780 0.825000 +vt 0.146341 0.775000 +vt 0.048780 0.825000 +vt 0.146341 0.750000 +vt 0.121951 0.775000 +vt 0.121951 0.750000 +vt 0.073171 0.750000 +vt 0.097561 0.775000 +vt 0.073171 0.775000 +vt 0.024390 0.750000 +vt 0.048780 0.775000 +vt 0.024390 0.775000 +vt 0.195122 0.750000 +vt 0.170732 0.775000 +vt 0.170732 0.750000 +vt 0.097561 0.750000 +vt 0.048780 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.775000 +vt 0.146341 0.775000 +vt 0.195122 0.775000 +vn 0.5000 0.8660 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.5000 0.8660 0.0000 +vn -0.0000 0.8660 -0.5000 +vn 0.0000 0.8660 0.5000 +vn 0.0000 -0.0000 -1.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn 1.0000 0.0000 0.0000 +vn -0.7071 -0.0000 0.7071 +vn -0.0000 0.0000 1.0000 +vn -1.0000 -0.0000 0.0000 +vn -0.7071 -0.0000 -0.7071 +s off +f 18/1/1 19/2/1 17/3/1 +f 15/4/2 16/5/2 10/6/2 +f 22/7/3 23/8/3 21/9/3 +f 26/10/4 27/11/4 25/12/4 +f 30/13/5 31/14/5 29/15/5 +f 18/1/1 20/16/1 19/2/1 +f 10/6/2 9/17/2 11/18/2 +f 11/18/2 12/19/2 10/6/2 +f 12/19/2 13/20/2 10/6/2 +f 13/20/2 14/21/2 10/6/2 +f 14/21/2 15/4/2 10/6/2 +f 22/7/3 24/22/3 23/8/3 +f 26/10/4 28/23/4 27/11/4 +f 30/13/5 32/24/5 31/14/5 +s 1 +f 1/25/6 16/26/7 8/27/7 +f 6/28/8 15/29/9 14/30/8 +f 4/31/10 13/32/11 12/33/10 +f 3/34/12 9/35/13 2/36/13 +f 8/27/7 15/29/9 7/37/9 +f 5/38/11 14/30/8 13/32/11 +f 3/39/12 12/33/10 11/40/12 +f 2/36/13 10/41/6 1/25/6 +f 1/25/6 10/41/6 16/26/7 +f 6/28/8 7/37/9 15/29/9 +f 4/31/10 5/38/11 13/32/11 +f 3/34/12 11/42/12 9/35/13 +f 8/27/7 16/26/7 15/29/9 +f 5/38/11 6/28/8 14/30/8 +f 3/39/12 4/31/10 12/33/10 +f 2/36/13 9/35/13 10/41/6 +o Pipe +v -0.500000 0.875000 0.375000 +v -0.500000 0.125000 0.375000 +v -0.500000 0.875000 -0.375000 +v -0.500000 0.125000 -0.375000 +v -0.375000 0.875000 -0.375000 +v -0.375000 0.875000 0.375000 +v -0.375000 0.125000 0.375000 +v -0.375000 0.125000 -0.375000 +v 0.500000 0.750000 0.250000 +v 0.500000 0.250000 0.250000 +v 0.500000 0.750000 -0.250000 +v 0.500000 0.250000 -0.250000 +v 0.375000 0.750000 -0.250000 +v 0.375000 0.750000 0.250000 +v 0.375000 0.250000 0.250000 +v 0.375000 0.250000 -0.250000 +v 0.375000 0.687500 0.187500 +v 0.375000 0.312500 0.187500 +v 0.375000 0.687500 -0.187500 +v 0.375000 0.312500 -0.187500 +v 0.125000 0.687500 -0.187500 +v 0.125000 0.687500 0.187500 +v 0.125000 0.312500 0.187500 +v 0.125000 0.312500 -0.187500 +v 0.125000 0.750000 0.250000 +v 0.125000 0.250000 0.250000 +v 0.125000 0.750000 -0.250000 +v 0.125000 0.250000 -0.250000 +v -0.125000 0.750000 -0.250000 +v -0.125000 0.750000 0.250000 +v -0.125000 0.250000 0.250000 +v -0.125000 0.250000 -0.250000 +v -0.125000 0.687500 0.187500 +v -0.125000 0.312500 0.187500 +v -0.125000 0.687500 -0.187500 +v -0.125000 0.312500 -0.187500 +v -0.375000 0.687500 -0.187500 +v -0.375000 0.687500 0.187500 +v -0.375000 0.312500 0.187500 +v -0.375000 0.312500 -0.187500 +v -0.187500 0.687500 0.187500 +v 0.187500 0.687500 0.187500 +v -0.187500 0.687500 -0.187500 +v 0.187500 0.687500 -0.187500 +v -0.125000 0.875000 -0.125000 +v -0.125000 0.875000 0.125000 +v 0.125000 0.875000 0.125000 +v 0.125000 0.875000 -0.125000 +v -0.187500 0.875000 -0.187500 +v -0.187500 0.875000 0.187500 +v 0.187500 0.875000 0.187500 +v 0.187500 0.875000 -0.187500 +v -0.125000 0.812500 -0.125000 +v -0.125000 0.812500 0.125000 +v 0.125000 0.812500 0.125000 +v 0.125000 0.812500 -0.125000 +vt 0.487805 0.600000 +vt 0.512195 0.425000 +vt 0.512195 0.575000 +vt 0.951219 0.400000 +vt 0.658537 0.700000 +vt 0.658537 0.400000 +vt 0.658537 0.050000 +vt 0.951219 0.350000 +vt 0.658537 0.350000 +vt 1.000000 0.350000 +vt 0.951219 0.050000 +vt 1.000000 0.050000 +vt 0.609756 0.050000 +vt 0.609756 0.350000 +vt 0.951219 -0.000000 +vt 0.658537 0.000000 +vt 0.000000 0.600000 +vt 0.195122 0.400000 +vt 0.195122 0.600000 +vt 0.512195 0.775000 +vt 0.512195 0.625000 +vt 0.195122 -0.000000 +vt 0.243902 0.200000 +vt 0.195122 0.200000 +vt 0.243902 0.600000 +vt 0.243902 0.400000 +vt 0.243902 0.800000 +vt 0.195122 0.800000 +vt 0.512195 0.175000 +vt 0.487805 -0.000000 +vt 0.512195 0.025000 +vt 0.487805 0.400000 +vt 0.512195 0.225000 +vt 0.512195 0.375000 +vt 0.365854 0.625000 +vt 0.268293 0.775000 +vt 0.268293 0.625000 +vt 0.365854 0.025000 +vt 0.268293 0.175000 +vt 0.268293 0.025000 +vt 0.365854 0.425000 +vt 0.268293 0.575000 +vt 0.268293 0.425000 +vt 0.365854 0.225000 +vt 0.268293 0.375000 +vt 0.268293 0.225000 +vt 0.390244 -0.000000 +vt 0.487805 0.200000 +vt 0.390244 0.200000 +vt 0.390244 0.400000 +vt 0.390244 0.600000 +vt 0.487805 0.800000 +vt 0.390244 0.800000 +vt 0.609756 0.625000 +vt 0.609756 0.025000 +vt 0.609756 0.425000 +vt 0.609756 0.225000 +vt 0.024390 0.750000 +vt 0.121951 0.725000 +vt 0.121951 0.750000 +vt 0.829268 0.700000 +vt 0.682927 0.775000 +vt 0.682927 0.700000 +vt 0.682927 1.000000 +vt 0.829268 0.925000 +vt 0.829268 1.000000 +vt 0.609756 0.775000 +vt 0.682927 0.925000 +vt 0.609756 0.925000 +vt 0.902439 0.925000 +vt 0.829268 0.775000 +vt 0.902439 0.775000 +vt 0.804878 0.800000 +vt 0.804878 0.900000 +vt 0.707317 0.900000 +vt 0.707317 0.800000 +vt 0.024390 0.725000 +vt 0.121951 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.725000 +vt 0.146341 0.725000 +vt 0.146341 0.625000 +vt 0.121951 0.600000 +vt 0.024390 0.625000 +vt 0.024390 0.600000 +vt 0.365854 0.375000 +vt 0.365854 0.575000 +vt 0.365854 0.775000 +vt 0.365854 0.175000 +vt 0.951219 0.700000 +vt -0.000000 0.400000 +vt 0.243902 0.000000 +vt 0.609756 0.775000 +vt 0.609756 0.175000 +vt 0.609756 0.575000 +vt 0.609756 0.375000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 62/43/14 67/44/14 65/45/14 +f 35/46/14 34/47/14 33/48/14 +f 39/49/15 37/50/15 38/51/15 +f 35/52/16 40/53/16 36/54/16 +f 34/55/17 38/51/17 33/56/17 +f 36/57/18 39/49/18 34/58/18 +f 33/48/19 37/50/19 35/46/19 +f 42/59/15 43/60/15 41/61/15 +f 66/62/14 62/43/14 65/63/14 +f 42/64/18 48/65/18 44/66/18 +f 43/60/19 46/67/19 41/61/19 +f 44/66/16 45/68/16 43/60/16 +f 41/61/17 47/69/17 42/70/17 +f 68/71/14 63/72/14 66/73/14 +f 61/74/14 68/75/14 67/76/14 +f 54/77/17 50/78/17 49/79/17 +f 55/80/18 52/81/18 50/82/18 +f 53/83/19 49/84/19 51/85/19 +f 56/86/16 51/87/16 52/88/16 +f 58/89/18 64/90/18 60/91/18 +f 59/92/19 62/43/19 57/93/19 +f 60/91/16 61/74/16 59/92/16 +f 57/93/17 63/94/17 58/95/17 +f 70/96/17 66/62/17 65/63/17 +f 71/97/18 68/71/18 66/73/18 +f 69/98/19 65/45/19 67/44/19 +f 72/99/16 67/76/16 68/75/16 +f 79/100/16 86/101/16 78/102/16 +f 75/103/16 84/104/16 76/105/16 +f 74/106/17 82/107/17 73/108/17 +f 76/109/15 83/110/15 74/111/15 +f 73/112/14 81/113/14 75/114/14 +f 77/115/19 82/107/19 78/116/19 +f 78/116/19 83/110/19 79/117/19 +f 79/117/19 84/104/19 80/118/19 +f 80/118/19 81/113/19 77/115/19 +f 87/119/19 85/120/19 86/101/19 +f 80/121/14 87/119/14 79/122/14 +f 78/123/15 85/120/15 77/124/15 +f 77/125/17 88/126/17 80/127/17 +f 56/86/15 59/92/15 53/128/15 +f 53/83/15 57/93/15 54/129/15 +f 54/77/15 58/95/15 55/130/15 +f 55/80/15 60/91/15 56/131/15 +f 48/65/14 51/87/14 45/68/14 +f 46/67/14 51/85/14 49/84/14 +f 46/67/14 50/78/14 47/69/14 +f 48/65/14 50/82/14 52/81/14 +f 62/43/14 61/74/14 67/44/14 +f 35/46/14 36/132/14 34/47/14 +f 39/49/15 40/53/15 37/50/15 +f 35/52/16 37/50/16 40/53/16 +f 34/55/17 39/49/17 38/51/17 +f 36/57/18 40/53/18 39/49/18 +f 33/48/19 38/51/19 37/50/19 +f 42/59/15 44/133/15 43/60/15 +f 66/62/14 63/94/14 62/43/14 +f 42/64/18 47/134/18 48/65/18 +f 43/60/19 45/68/19 46/67/19 +f 44/66/16 48/65/16 45/68/16 +f 41/61/17 46/67/17 47/69/17 +f 68/71/14 64/90/14 63/72/14 +f 61/74/14 64/90/14 68/75/14 +f 54/77/17 55/130/17 50/78/17 +f 55/80/18 56/131/18 52/81/18 +f 53/83/19 54/129/19 49/84/19 +f 56/86/16 53/128/16 51/87/16 +f 58/89/18 63/72/18 64/90/18 +f 59/92/19 61/74/19 62/43/19 +f 60/91/16 64/90/16 61/74/16 +f 57/93/17 62/43/17 63/94/17 +f 70/96/17 71/135/17 66/62/17 +f 71/97/18 72/136/18 68/71/18 +f 69/98/19 70/137/19 65/45/19 +f 72/99/16 69/138/16 67/76/16 +f 79/100/16 87/119/16 86/101/16 +f 75/103/16 81/113/16 84/104/16 +f 74/106/17 83/110/17 82/107/17 +f 76/109/15 84/104/15 83/110/15 +f 73/112/14 82/107/14 81/113/14 +f 77/115/19 81/113/19 82/107/19 +f 78/116/19 82/107/19 83/110/19 +f 79/117/19 83/110/19 84/104/19 +f 80/118/19 84/104/19 81/113/19 +f 87/119/19 88/126/19 85/120/19 +f 80/121/14 88/126/14 87/119/14 +f 78/123/15 86/101/15 85/120/15 +f 77/125/17 85/120/17 88/126/17 +f 56/86/15 60/91/15 59/92/15 +f 53/83/15 59/92/15 57/93/15 +f 54/77/15 57/93/15 58/95/15 +f 55/80/15 58/89/15 60/91/15 +f 48/65/14 52/88/14 51/87/14 +f 46/67/14 45/68/14 51/85/14 +f 46/67/14 49/79/14 50/78/14 +f 48/65/14 47/134/14 50/82/14 diff --git a/src/main/resources/assets/hbm/textures/models/pile/pile_control.png b/src/main/resources/assets/hbm/textures/models/pile/pile_control.png index 01c9468082c294b6b1d3d5c2dc2969e163df834b..a07e4a0eb9d8d609e3365349aa96b3790b436924 100644 GIT binary patch delta 1000 zcmV}h>n22O@8f4M#_;Frf|K2Jwqe^g4=u(R48!0u3PHm#u(7cL&-0XeBwK09aM6<^ zBnkawJ&{-t1n9ka%e`lsCW0VHg`R1eJlqV!;4(SaRDbujA)&v!lgKyb;qvN6nR`V! zEE@t$!_G8K#BmJMG`URflV!SlGvvD6ZfRmP2&&?utEQG^Vf^bSHl1z6aSZS2f#)B= zFpLy&dXK7@s6cudaw77G`o5q0g1l;KSr-02{sxdPE^!?5e+ogWn6iw#L=ZhjaxFQ= z7)ECo%74DYgZ)&SNQ{sqx@syDk-a4vDgKi!vW&bV%4Fnvt}MjRb6q$2jx7LF0Y1Caud z*)?d%mD%mS6e1asQaPwMDi>vg|y@7(=()<@#lFP7I%{g-mR_Sxj=93IY-3m z6qMV&J=_B56b$A<$kmzW#O0L;aiv0dRl9=q_4QPHAyYw<^W1PaOmx+9A)ceDfQZ$d z^D3<^XN59nC{3bqa^m*@)mcd184BH7 zPBw>3CK!QaVa#Y5z9S59o`)_@Dnrf3thMZ%i|%Qy zfp1gvy{eu|3ESJtrRlJ2THGqn*qPXODRV(*&r?zdho6OTL5o9(PF7VcE2}Rc}cL zFIdXh@fO5;PFIv_$;JiA~ z|DE{n+!oE`TxX1`Iah*IWu$4{r8MI?y8c#7AMxUPZ&`!dGnC>5<&_zVwKf`FTjv0i zv_*Va_TEw|^Ozos3}G)A_KJIi=jq`2chXE)#^~bC%yNTTZt-gQ1K=KZkL%xixc~qF M07*qoM6N<$f_9y_0ssI2 diff --git a/src/main/resources/assets/hbm/textures/models/pile/pile_loader.png b/src/main/resources/assets/hbm/textures/models/pile/pile_loader.png index f4558f5c122e3e8ef2d8c527c6559146891fe936..68c127b439c37d267d58d492921bf314b9979696 100644 GIT binary patch delta 884 zcmV-)1B?981DXerGk*h7Nkld{@C)Q2GI-697YKMW1VSKm3MHNL2A(_>JlvrZ)zPX$a_UKubtlPk)6x%wq|;Bw z@4MgMlQv)h-}hr1x$Eoe4I8;tV#`KI2+_12mGPgzpT@sOz<>AsSO@|AD1lV4`@Y|J zU|U(B4nBT3j$PMHjWNcck1@tDy}PeObhDm%W^m5I7{h!%PmKY$;$nz8a^LB5R$purgb>+qEiWPft&;<~usrOWsu^IOm|0rdIy*m#>vv$SMXL$Eh+m z0HhSv70$YiB7a(zNaF;`xJZ>)Xq^<7=~!K+sXZ6u}H4R<8j=0FMm`QO8H)|7X!d_I!!&dBH($R zafLn4!(=iklsP)s%N;LDp^&*&VdlT|`o%MF;>S=RgQVQrZ#lJkKaI8jY~Cvr|LO zd?QlczN zNGa_i=2qb?kmtDwoIW*NoNbh5#-C=!vqVfptOkpSymp>Lh+YHHC$M-OFrD6q z9M`{C;<*}Fo!eX_Q&t&*jW!kc8KPw*U$tK)Hirp$_kk7e#IE=>)&4$>+$(}l;FqT7 zcN_JM15M8dpMZ@*)&#b;Q5%B4)bA9U3(@&sr`y}iT_Jz4tPlPK?w&%?7qUO_fNq1j SNq`do0000cmhUoSNVC)J2KxqMtU16`*$~|nSY&NyJ@jP#8^_r%WZCt0>Yzoiwa>L=!dXwwAf^!Z+2-@woCj8*jI|1k^qO^cF zZ$D~0Gllz&oqtFpsorTKXGYM(>FFu@{XPgGD3{9sfKsUh-}kY!cmuWI8M^|d1^oQ| zQsdR@bt&4`>D}HS@?t6+&+~HTo2l+!tybk+_@|W8yOA5~L!-Q?C>3#yId_L&B6hd860hMw5a96mB>5MNX`Q>r-KzZs YI}@I%uNpbL$N&HU07*qoM6N<$g0<{~!2kdN delta 428 zcmV;d0aO0K2Gs+QGk*b$Nkl=Eo5JeY_4!{v8Q*s0!h1!=8xz-x|%7*~L=UlXzK{C)wMIyBh(}ZCmYP*`*4yUyxS)vGa-u zoI_+PUQcAMdU7_pwbQqrciJ;X?Y6Qg1+A?oxAJ;EnI(%uWGZ&KyKObIwhAhup8N&P W$eyBNxdTxE0000 Date: Fri, 17 Jul 2026 05:32:50 +0400 Subject: [PATCH 099/107] Well... --- .../container/ContainerMachineOilWell.java | 19 +++++------ .../gui/GUIMachineElectricFurnace.java | 2 +- .../hbm/inventory/gui/GUIMachineOilWell.java | 32 +++++++++--------- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../hbm/textures/gui/machine/gui_well.png | Bin 3350 -> 3748 bytes 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java b/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java index 17e749105..716a32ee0 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java @@ -19,28 +19,27 @@ public class ContainerMachineOilWell extends Container { well = tedf; // Battery - this.addSlotToContainer(new Slot(tedf, 0, 8, 53)); + this.addSlotToContainer(new Slot(tedf, 0, 8, 58)); // Canister Input - this.addSlotToContainer(new Slot(tedf, 1, 80, 17)); + this.addSlotToContainer(new Slot(tedf, 1, 94, 22)); // Canister Output - this.addSlotToContainer(new SlotTakeOnly(tedf, 2, 80, 53)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 2, 94, 58)); // Gas Input - this.addSlotToContainer(new Slot(tedf, 3, 125, 17)); + this.addSlotToContainer(new Slot(tedf, 3, 130, 22)); // Gas Output - this.addSlotToContainer(new SlotTakeOnly(tedf, 4, 125, 53)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 4, 130, 58)); //Upgrades - this.addSlotToContainer(new Slot(tedf, 5, 152, 17)); - this.addSlotToContainer(new Slot(tedf, 6, 152, 35)); - this.addSlotToContainer(new Slot(tedf, 7, 152, 53)); + this.addSlotToContainer(new Slot(tedf, 5, 156, 36)); + this.addSlotToContainer(new Slot(tedf, 6, 156, 54)); 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(invPlayer, j + i * 9 + 9, 12 + j * 18, 108 + i * 18)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + this.addSlotToContainer(new Slot(invPlayer, i, 12 + i * 18, 166)); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java index 5519b2fa1..e685553cf 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java @@ -36,7 +36,7 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { upgradeText[0] = I18nUtil.resolveKey("desc.gui.upgrade"); upgradeText[1] = I18nUtil.resolveKey("desc.gui.upgrade.speed"); upgradeText[2] = I18nUtil.resolveKey("desc.gui.upgrade.power"); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 116, guiTop + 20, 8, 8, mouseX, mouseY, upgradeText); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 115, guiTop + 19, 8, 8, mouseX, mouseY, upgradeText); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java b/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java index 91e00e52d..dfb32841c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java @@ -21,19 +21,19 @@ public class GUIMachineOilWell extends GuiInfoContainer { super(new ContainerMachineOilWell(invPlayer, tedf)); derrick = tedf; - this.xSize = 176; - this.ySize = 166; + this.xSize = 184; + this.ySize = 190; } @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - derrick.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 62, guiTop + 69 - 52, 16, 52); - derrick.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 107, guiTop + 69 - 52, 16, 52); + derrick.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 76, guiTop + 74 - 52, 16, 52); + derrick.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 112, guiTop + 74 - 52, 16, 52); if(derrick.tanks.length >= 3) { - derrick.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 40, guiTop + 37, 6, 32); + derrick.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 54, guiTop + 45, 6, 32); } String[] upgradeText = new String[4]; @@ -41,17 +41,17 @@ public class GUIMachineOilWell extends GuiInfoContainer { upgradeText[1] = I18nUtil.resolveKey("desc.gui.upgrade.speed"); upgradeText[2] = I18nUtil.resolveKey("desc.gui.upgrade.power"); upgradeText[3] = I18nUtil.resolveKey("desc.gui.upgrade.afterburner"); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 156, guiTop + 3, 8, 8, mouseX, mouseY, upgradeText); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 160, guiTop + 21, 8, 8, mouseX, mouseY, upgradeText); - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 17, 16, 34, derrick.power, derrick.getMaxPower()); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 22, 16, 34, derrick.power, derrick.getMaxPower()); } @Override protected void drawGuiContainerForegroundLayer( int i, int j) { String name = this.derrick.hasCustomInventoryName() ? this.derrick.getInventoryName() : I18n.format(this.derrick.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + this.fontRendererObj.drawString(name, 126 - this.fontRendererObj.getStringWidth(name) / 2, 10, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 12, this.ySize - 96 + 2, 4210752); } @Override @@ -61,24 +61,24 @@ public class GUIMachineOilWell extends GuiInfoContainer { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); int i = (int)(derrick.getPower() * 34 / derrick.getMaxPower()); - drawTexturedModalRect(guiLeft + 8, guiTop + 51 - i, 176, 34 - i, 16, i); + drawTexturedModalRect(guiLeft + 8, guiTop + 56 - i, 184, 34 - i, 16, i); int k = derrick.indicator; if(k != 0) - drawTexturedModalRect(guiLeft + 35, guiTop + 17, 176 + (k - 1) * 16, 52, 16, 16); + drawTexturedModalRect(guiLeft + 50, guiTop + 19, 184 + (k - 1) * 14, 34, 14, 14); if(derrick.tanks.length < 3) { - drawTexturedModalRect(guiLeft + 34, guiTop + 36, 192, 0, 18, 34); + drawTexturedModalRect(guiLeft + 48, guiTop + 44, 200, 0, 18, 34); } - derrick.tanks[0].renderTank(guiLeft + 62, guiTop + 69, this.zLevel, 16, 52); - derrick.tanks[1].renderTank(guiLeft + 107, guiTop + 69, this.zLevel, 16, 52); + derrick.tanks[0].renderTank(guiLeft + 76, guiTop + 74, this.zLevel, 16, 52); + derrick.tanks[1].renderTank(guiLeft + 112, guiTop + 74, this.zLevel, 16, 52); if(derrick.tanks.length > 2) { - derrick.tanks[2].renderTank(guiLeft + 40, guiTop + 69, this.zLevel, 6, 32); + derrick.tanks[2].renderTank(guiLeft + 54, guiTop + 77, this.zLevel, 6, 32); } - this.drawInfoPanel(guiLeft + 156, guiTop + 3, 8, 8, 8); + this.drawInfoPanel(guiLeft + 160, guiTop + 21, 8, 8, 8); } } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index ba4ad5547..3982584e7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -669,7 +669,7 @@ container.factoryTitanium=Basic Factory container.fluidtank=Tank container.fileCabinet=Filing Cabinet container.forceField=Forcefield Emitter -container.frackingTower=Hydraulic Fracking Tower +container.frackingTower=H.F.T. container.furnaceBrick=Bricked Furnace container.furnaceCombination=Combination Oven container.furnaceIron=Iron Furnace diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_well.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_well.png index 6ceaf8805023f90b9236344d4efdd71c39fecad3..86466899ea473cd4d6e83fbd3e7c41db91945f7d 100644 GIT binary patch literal 3748 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 literal 3350 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 Date: Fri, 17 Jul 2026 05:44:27 +0400 Subject: [PATCH 100/107] WUCK WUCK --- .../hbm/textures/gui/machine/gui_well.png | Bin 3748 -> 3749 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_well.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_well.png index 86466899ea473cd4d6e83fbd3e7c41db91945f7d..f1b1d0ddbc499c8344c3dc877ce84e2c6b4004c6 100644 GIT binary patch literal 3749 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 nCI1l&cC7vW82lZ%fAdW`sgL=R5xaBW0fE literal 3748 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 From 15db7eee10a2f0d465ecfe49dde9302b116214c8 Mon Sep 17 00:00:00 2001 From: NotMega Date: Fri, 17 Jul 2026 09:00:11 +0300 Subject: [PATCH 101/107] eat permissions --- src/main/java/com/hbm/commands/CommandWikiRender.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/hbm/commands/CommandWikiRender.java b/src/main/java/com/hbm/commands/CommandWikiRender.java index 67453b235..4ff79e9ba 100644 --- a/src/main/java/com/hbm/commands/CommandWikiRender.java +++ b/src/main/java/com/hbm/commands/CommandWikiRender.java @@ -47,6 +47,11 @@ public class CommandWikiRender extends CommandBase { getCommandName(), EnumChatFormatting.LIGHT_PURPLE); } + @Override + public boolean canCommandSenderUseCommand(ICommandSender sender) { + return true; + } + @Override public void processCommand(ICommandSender sender, String[] args) { if(!(sender instanceof EntityPlayer)) { From 3bccdef3114ff193245e5881472c42d9e7d333ff Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 17 Jul 2026 11:30:18 +0200 Subject: [PATCH 102/107] balls.mp4 --- changelog | 24 +---- src/main/java/com/hbm/blocks/ModBlocks.java | 16 +-- .../blocks/machine/pile/BlockPileDevice.java | 12 +++ .../com/hbm/blocks/network/CableDiode.java | 4 +- .../com/hbm/explosion/ExplosionBalefire.java | 49 --------- .../inventory/gui/GUIMachineTurbineGas.java | 1 - .../recipes/AssemblyMachineRecipes.java | 5 + .../hbm/render/tileentity/RenderPileVent.java | 6 +- .../machine/pile/TileEntityPileControl.java | 75 ++++++++++++- .../machine/pile/TileEntityPileCore.java | 17 +++ .../machine/pile/TileEntityPileVent.java | 102 +++++++++++++++++- 11 files changed, 228 insertions(+), 83 deletions(-) diff --git a/changelog b/changelog index 88cea5685..3e1f26717 100644 --- a/changelog +++ b/changelog @@ -1,23 +1,7 @@ ## Changed -* Updated russian and chinese localization -* Updated the trinitite ore textures - * The ore spots are now smaller and more shard-like - * Each trinitite ore block now has four randomized texture variants -* Trinitite ores now spawn fewer particles -* The radiation effect caused by walking on trinitite ore is now much shorter but more intense to compensate -* Finally removed the old terra drill items after being deprecated for almost a year -* The electrolysis machine now instantly annihilates all buffered fluid output when changing recipe - * This is a straight downgrade but people for some reason wanted it so sure why not -* Cable diodes now have a GUI for configuration instead of requiring tools - * The throughput can now be configured more precisely instead of increments of powers of 10 -* The magnetic storage barrel now uses BSCCO and has a new texture +* Updated all oil well GUI textures + * There's now only two upgrade slots instead of three +* All legacy pixel gauges have been replaced with smooth ones (watz, ZIRNOX, CCGT) making them more accurate ## Fixed -* Fixed burner press GUI offsets being incorrect -* Potentially fixed an issue with journey map where slaked sellafite would sometimes get the wrong color in the minimap -* Finally fixed an issue making electric armor way worse than it should be, as well as preventing the vanilla armor points from working almost entirely -* Fixed pneumatic storage exporter duping filter items when broken -* Re-enabled the GTNH-NEI filter slot integration -* Fixed various GUI title offsets -* Fixed mask man announcement being sent 20 minutes before spawn (therefore never being sent at all) instead of one minute as intended -* Fixed old BAT9000 recycling \ No newline at end of file +* Fixed held block being placed when not sneaking when opening the cable diode's GUI \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 5dd6c790d..507d6d814 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1965,7 +1965,7 @@ public class ModBlocks { pile_brick = new BlockPileBrick().setBlockName("pile_brick").setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_brick"); pile_device = new BlockPileDevice().setBlockName("pile_device").setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - pile_block = new BlockPile().setBlockName("pile_block").setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_block"); + pile_block = new BlockPile().setBlockName("pile_block").setStepSound(Block.soundTypeMetal).setHardness(15.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pile_block"); pwr_fuel = new BlockPillarPWR(Material.iron, RefStrings.MODID + ":pwr_fuel_top").setBlockName("pwr_fuel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_fuel_side"); pwr_control = new BlockPillarPWR(Material.iron, RefStrings.MODID + ":pwr_control_top").setBlockName("pwr_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_control_side"); @@ -1977,7 +1977,7 @@ public class ModBlocks { pwr_casing = new BlockGenericTooltip(Material.iron).setBlockName("pwr_casing").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_casing"); pwr_port = new BlockGenericTooltip(Material.iron).setBlockName("pwr_port").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_port"); pwr_controller = new MachinePWRController(Material.iron).setBlockName("pwr_controller").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_casing_blank"); - pwr_block = new BlockPWR(Material.iron).setBlockName("pwr_block").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pwr_block"); + pwr_block = new BlockPWR(Material.iron).setBlockName("pwr_block").setHardness(15.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pwr_block"); fusion_heater = new BlockPillar(Material.iron, RefStrings.MODID + ":fusion_heater_top").setBlockName("fusion_heater").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":fusion_heater_side"); fusion_hatch = new FusionHatch(Material.iron).setBlockName("fusion_hatch").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":fusion_hatch"); @@ -3134,12 +3134,12 @@ public class ModBlocks { register(red_pylon_medium_wood_transformer); register(red_pylon_medium_steel); register(red_pylon_medium_steel_transformer); - GameRegistry.registerBlock(red_pylon_large, ItemBlockBase.class, red_pylon_large.getUnlocalizedName()); - GameRegistry.registerBlock(substation, ItemBlockBase.class, substation.getUnlocalizedName()); - GameRegistry.registerBlock(cable_switch, cable_switch.getUnlocalizedName()); - GameRegistry.registerBlock(cable_detector, cable_detector.getUnlocalizedName()); - GameRegistry.registerBlock(cable_diode, ItemBlockBase.class, cable_diode.getUnlocalizedName()); - GameRegistry.registerBlock(machine_detector, machine_detector.getUnlocalizedName()); + register(red_pylon_large); + register(substation); + register(cable_switch); + register(cable_detector); + register(cable_diode); + register(machine_detector); register(fluid_duct_neo); register(fluid_duct_box); diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java index f0e8ca863..d4d7968f9 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java @@ -12,6 +12,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -66,6 +67,17 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti { side = MathHelper.clamp_int(side - 2, 0, 3); return metaOffset + side; } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + if(world.getBlockMetadata(x, y, z) != BLOCK_META_CONTROL) return; + + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 1, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 2, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 0, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 3, 2); + } public static int itemMetaToBlockMeta(int meta) { if(meta >= ITEM_META_CONTROL) return BLOCK_META_CONTROL; diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 40bc329e4..ca349a096 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -65,8 +65,8 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { - if(!player.isSneaking() && world.isRemote) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + if(!player.isSneaking()) { + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; } diff --git a/src/main/java/com/hbm/explosion/ExplosionBalefire.java b/src/main/java/com/hbm/explosion/ExplosionBalefire.java index 9df326909..1e40b08f1 100644 --- a/src/main/java/com/hbm/explosion/ExplosionBalefire.java +++ b/src/main/java/com/hbm/explosion/ExplosionBalefire.java @@ -127,53 +127,4 @@ public class ExplosionBalefire } } } - - /*private void breakColumn(int x, int z) - { - int dist = this.radius2 - (x * x + z * z); - if (dist > 0) - { - int pX = posX + x; - int pZ = posZ + z; - - int y = worldObj.getHeightValue(pX, pZ); - float strength = (float)dist / (float) this.radius; - - while(y > 0) { - - if(strength <= 10) { - if(worldObj.rand.nextInt(10) == 0) { - worldObj.setBlock(pX, y + 1, pZ, ModBlocks.balefire); - - if(worldObj.getBlock(pX, y, pZ) == ModBlocks.block_schrabidium_cluster) - worldObj.setBlock(pX, y, pZ, ModBlocks.block_euphemium_cluster, worldObj.getBlockMetadata(pX, y, pZ), 3); - } - - if(worldObj.getBlock(pX, y, pZ) == Blocks.stone) - worldObj.setBlock(pX, y, pZ, ModBlocks.sellafield_slaked); - if(worldObj.getBlock(pX, y - 1, pZ) == Blocks.stone) - worldObj.setBlock(pX, y - 1, pZ, ModBlocks.sellafield_slaked); - if(worldObj.getBlock(pX, y - 2, pZ) == Blocks.stone) - worldObj.setBlock(pX, y - 2, pZ, ModBlocks.sellafield_slaked); - if(worldObj.getBlock(pX, y - 3, pZ) == Blocks.stone) - worldObj.setBlock(pX, y - 3, pZ, ModBlocks.sellafield_slaked); - if(worldObj.getBlock(pX, y - 4, pZ) == Blocks.stone) - worldObj.setBlock(pX, y - 4, pZ, ModBlocks.sellafield_slaked); - - return; - } - - float hardness = worldObj.getBlock(pX, y, pZ).getBlockHardness(worldObj, pX, y, pZ); - - if(worldObj.getBlock(pX, y, pZ).getMaterial().isLiquid()) - hardness = Blocks.air.getBlockHardness(worldObj, pX, y + 1, pZ); - - strength -= hardness; - - worldObj.setBlockToAir(pX, y, pZ); - - y--; - } - } - }*/ } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 2e21214ca..e196aed5d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -28,7 +28,6 @@ import net.minecraft.util.ResourceLocation; public class GUIMachineTurbineGas extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/generators/gui_turbinegas.png"); - private static ResourceLocation gauge_tex = new ResourceLocation(RefStrings.MODID + ":textures/gui/gauges/button_big.png"); private TileEntityMachineTurbineGas turbinegas; int yStart; diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 043a24446..4b34d1d84 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -492,6 +492,11 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 24), new OreDictStack(GOLD.wireDense(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.COMPUTER)) .setPools528(GenericRecipes.POOL_PREFIX_528 + "chip_quantum")); + // pile + this.register(new GenericRecipe("ass.pileblock").setup(20, 250).outputItems(new ItemStack(ModBlocks.pile_brick, 1)) + .inputItems(new OreDictStack(KEY_PLANKS, 1), new OreDictStack(GRAPHITE.ingot(), 4), new OreDictStack(STEEL.bolt(), 2)) + .inputItemsEx(new OreDictStack(KEY_PLANKS, 1), new OreDictStack(GRAPHITE.ingot(), 8), new OreDictStack(STEEL.plate(), 1))); + // reactors this.register(new GenericRecipe("ass.breedingreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_reactor_breeding, 1)) .inputItems(new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1)) diff --git a/src/main/java/com/hbm/render/tileentity/RenderPileVent.java b/src/main/java/com/hbm/render/tileentity/RenderPileVent.java index 4b8829125..a665ee8e8 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPileVent.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPileVent.java @@ -3,6 +3,7 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.main.ResourceManager; +import com.hbm.tileentity.machine.pile.TileEntityPileVent; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; @@ -23,9 +24,12 @@ public class RenderPileVent extends TileEntitySpecialRenderer { case 3: GL11.glRotated(0, 0, 1, 0); break; } + TileEntityPileVent vent = (TileEntityPileVent) te; + float rot = vent.lastFan + (vent.fan - vent.lastFan) * interp; + bindTexture(ResourceManager.pile_vent_tex); ResourceManager.pile_vent.renderPart("Pipe"); - GL11.glRotated((te.getWorldObj().getTotalWorldTime() % 360 + interp) * 45, 0, -1, 0); + GL11.glRotated(rot, 0, -1, 0); ResourceManager.pile_vent.renderPart("Fan"); GL11.glShadeModel(GL11.GL_FLAT); diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java index 652c4b02a..69689a864 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java @@ -1,7 +1,80 @@ package com.hbm.tileentity.machine.pile; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.pile.BlockPile; +import com.hbm.tileentity.TileEntityTickingBase; +import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; +import com.hbm.util.Compat; + +import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; -public class TileEntityPileControl extends TileEntity { +public class TileEntityPileControl extends TileEntityTickingBase { + + public double syncLevel; + public double level; + public double lastLevel; + + public int turnProgress; + + public int chanNum; + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + boolean canMove = false; + + if(worldObj.getBlock(xCoord, yCoord - 1, zCoord) == ModBlocks.pile_block && worldObj.getBlockMetadata(xCoord, yCoord - 1, zCoord) == BlockPile.META_CONTROL) { + + TileEntity tile = Compat.getTileStandard(worldObj, xCoord, yCoord - 1, zCoord); + + if(tile instanceof TileEntityPileBaseMK2) { + TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; + TileEntityPileCore core = pile.getCore(); + + if(core != null) { + PileChannel controlChan = core.getControlChannel(xCoord, yCoord - 1, zCoord); + + if(controlChan != null) { + canMove = true; + this.chanNum = core.getControlChannelNum(controlChan); + controlChan.control = this.level; + } + } + } + } + + this.networkPackNT(100); + + } else { + + this.lastLevel = this.level; + + if(this.turnProgress > 0) { + this.level = this.level + ((this.syncLevel - this.level) / (double) this.turnProgress); + --this.turnProgress; + } else { + this.level = this.syncLevel; + } + } + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.level); + buf.writeInt(this.chanNum); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + double lastSync = this.syncLevel; + this.syncLevel = buf.readDouble(); + this.chanNum = buf.readInt(); + + if(this.syncLevel != lastSync) this.turnProgress = 2; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index 6de16c533..654e2d234 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -15,6 +15,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -80,6 +81,14 @@ public class TileEntityPileCore extends TileEntityTickingBase { for(PileChannel channel : list) if(channel.entry.compare(x, y, z)) return channel; return null; } + + public int getFuelChannelNum(PileChannel chan) { return getChannelNum(chan, fuelChannels); } + public int getVentilationChannelNum(PileChannel chan) { return getChannelNum(chan, ventilationChannels); } + public int getControlChannelNum(PileChannel chan) { return getChannelNum(chan, controlChannels); } + + public int getChannelNum(PileChannel chan, List list) { + return list.indexOf(chan); // more reliable when channels change and not that big of a deal because we have lists in single digit length + } @Override public void writeToNBT(NBTTagCompound nbt) { @@ -185,6 +194,7 @@ public class TileEntityPileCore extends TileEntityTickingBase { if(!worldObj.isRemote) { if(worldObj.getTotalWorldTime() % 3 == 0) for(PileChannel chan : this.ventilationChannels) { + if(chan.air <= 0) continue; double x = chan.entry.getX() + 0.5 + chan.entry.getDir().offsetX * (this.width - 0.375); double y = chan.entry.getY() + 0.5; @@ -227,18 +237,25 @@ public class TileEntityPileCore extends TileEntityTickingBase { public final int length; // length of the channel, always equal to the h/w/d size of that axis public final PileChannelType type; + public final ItemStack[] rods; + public int air; + public double control = 1D; // pulled out by default, unlike me who never pulls out + public PileChannel(int x, int y, int z, ForgeDirection dir) { this.entry = new DirPos(x, y, z, dir); this.type = PileChannelType.getChannelType(dir, orientation); this.length = type == PileChannelType.CONTROL ? height : type == PileChannelType.FUEL ? depth : width; + + this.rods = new ItemStack[length]; } public PileChannel(int x, int y, int z, ForgeDirection dir, int length, PileChannelType type) { this.entry = new DirPos(x, y, z, dir); this.type = type; this.length = length; + this.rods = new ItemStack[length]; } public void writeChannelToNBT(NBTTagCompound nbt, String name) { diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java index 15f803176..4d48a2a3e 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java @@ -1,7 +1,107 @@ package com.hbm.tileentity.machine.pile; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.pile.BlockPile; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.TileEntityTickingBase; +import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; +import com.hbm.util.Compat; + +import api.hbm.fluidmk2.IFluidStandardReceiverMK2; +import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPileVent extends TileEntity { +public class TileEntityPileVent extends TileEntityTickingBase implements IFluidStandardReceiverMK2 { + + public FluidTank compair; + public boolean isActive = false; + + public float fan; + public float lastFan; + + public int chanNum; + + public TileEntityPileVent() { + this.compair = new FluidTank(Fluids.AIR, 4_000); + } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {compair}; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {compair}; } + + @Override + public boolean canConnect(FluidType type, ForgeDirection dir) { + if(type != compair.getTankType()) return false; + ForgeDirection conDir = getOrientation(); + return dir == conDir.getOpposite(); + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + ForgeDirection dir = getOrientation(); + this.trySubscribe(compair.getTankType(), worldObj, xCoord - dir.offsetX, yCoord, zCoord - dir.offsetZ, dir.getOpposite()); + + this.isActive = false; + + if(this.compair.getFill() > 0) { + int x = xCoord + dir.offsetX; + int y = yCoord; + int z = zCoord + dir.offsetZ; + + if(worldObj.getBlock(x, y, z) == ModBlocks.pile_block && worldObj.getBlockMetadata(x, y, z) == BlockPile.META_AIR_IN) { + TileEntity tile = Compat.getTileStandard(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(tile instanceof TileEntityPileBaseMK2) { + TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; + TileEntityPileCore core = pile.getCore(); + + if(core != null) { + PileChannel ventChan = core.getVentilationChannel(x, y, z); + + if(ventChan != null) { + this.isActive = true; + this.chanNum = core.getVentilationChannelNum(ventChan); + // compair stuff here + } + } + } + } + } + + this.networkPackNT(35); + + } else { + + this.lastFan = fan; + if(this.isActive) this.fan += 45; + + if(this.fan >= 360) { + this.lastFan -= 360; + this.fan -= 360; + } + } + } + + public ForgeDirection getOrientation() { + return ForgeDirection.getOrientation(this.getBlockMetadata() % 4 + 2); + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.isActive); + buf.writeInt(this.chanNum); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.isActive = buf.readBoolean(); + this.chanNum = buf.readInt(); + } } From 434d95b545633b395dae3d57253cd4df25c0908d Mon Sep 17 00:00:00 2001 From: LegendaryDoge30 Date: Fri, 17 Jul 2026 19:14:09 +0200 Subject: [PATCH 103/107] ough ough --- .../java/com/hbm/module/ParseMSES1Ext1.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hbm/module/ParseMSES1Ext1.java b/src/main/java/com/hbm/module/ParseMSES1Ext1.java index 875c136b0..fa730889e 100644 --- a/src/main/java/com/hbm/module/ParseMSES1Ext1.java +++ b/src/main/java/com/hbm/module/ParseMSES1Ext1.java @@ -8,13 +8,13 @@ import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; /** * MSES1-FEIS: Machine Script, Equestrian Standard - First Extended Instruction Set (v1.1) - * + * * Additions compared to v1 Standard: * * Support for splitter chars, splitting and split count * * Support for the stack, a secondary buffer that can push, pop and peek * * Support for getting string length and substring using first and last * * Support for listening only to recent RoR signals using poll - * + * * @author hbm */ public class ParseMSES1Ext1 extends ParseMSES1 { @@ -22,7 +22,7 @@ public class ParseMSES1Ext1 extends ParseMSES1 { @Override public EnumStatementReturn eval(ParseContext ctx, String line) { String lower = line.toLowerCase(Locale.US); - + // sets the splitter char if(lower.startsWith("splitter ")) { if(line.length() <= 9) return EnumStatementReturn.PARAMETER_ERROR; @@ -30,12 +30,13 @@ public class ParseMSES1Ext1 extends ParseMSES1 { ctx.splitString = splitter; return EnumStatementReturn.OK; } - + // grabs a fragment based on index if(lower.startsWith("split ")) { if(line.length() <= 6) return EnumStatementReturn.PARAMETER_ERROR; try { - int index = Integer.parseInt(line.substring(6)); + String statement = substitute(ctx, line.substring(6), true); + int index = Integer.parseInt(statement); if(index < 1) return EnumStatementReturn.PARAMETER_ERROR; String[] frags = ctx.readBuffer().split(Pattern.quote(ctx.splitString)); if(index > frags.length) return EnumStatementReturn.PARAMETER_ERROR; @@ -43,7 +44,7 @@ public class ParseMSES1Ext1 extends ParseMSES1 { return EnumStatementReturn.OK; } catch(Throwable ex) { return EnumStatementReturn.PARAMETER_ERROR; } } - + // counts the amount of fragments in this string if(lower.equals("splitcount")) { if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; @@ -51,21 +52,21 @@ public class ParseMSES1Ext1 extends ParseMSES1 { ctx.writeBuffer(frags.length + ""); return EnumStatementReturn.OK; } - + // pushes the buffer to stack if(lower.equals("push")) { if(ctx.readBuffer().isEmpty()) return EnumStatementReturn.PARAMETER_ERROR; boolean succ = ctx.push(ctx.readBuffer()); return succ ? EnumStatementReturn.OK : EnumStatementReturn.STACK_EXCEEDED; } - + // pushes the supplied value (or variable) to stack if(lower.startsWith("push ")) { if(line.length() <= 5) return EnumStatementReturn.PARAMETER_ERROR; boolean succ = ctx.push(substitute(ctx, line.substring(5), false)); return succ ? EnumStatementReturn.OK : EnumStatementReturn.STACK_EXCEEDED; } - + // removes the most recent element from stack and writes it to the buffer if(lower.equals("pop")) { String val = ctx.pop(); @@ -73,7 +74,7 @@ public class ParseMSES1Ext1 extends ParseMSES1 { ctx.writeBuffer(val); return EnumStatementReturn.OK; } - + // writes the most recent element to the buffer if(lower.equals("peek")) { String val = ctx.peek(); @@ -81,13 +82,13 @@ public class ParseMSES1Ext1 extends ParseMSES1 { ctx.writeBuffer(val); return EnumStatementReturn.OK; } - + // figures out buffer string's length if(lower.equals("length")) { ctx.writeBuffer("" + ctx.readBuffer().length()); return EnumStatementReturn.OK; } - + // grabs the first x characters from the buffer and writes them back to the buffer if(lower.startsWith("first ")) { if(line.length() <= 6) return EnumStatementReturn.PARAMETER_ERROR; @@ -111,7 +112,7 @@ public class ParseMSES1Ext1 extends ParseMSES1 { return EnumStatementReturn.OK; } catch(Exception x) { return EnumStatementReturn.PARAMETER_ERROR; } } - + // listens to an RoR signal using the supplied channel name and saves it to the buffer if(lower.startsWith("poll ")) { if(line.length() <= 5) return EnumStatementReturn.PARAMETER_ERROR; @@ -119,13 +120,13 @@ public class ParseMSES1Ext1 extends ParseMSES1 { if(chan != null && chan.timeStamp >= ctx.world.getTotalWorldTime() - 1) ctx.writeBuffer(chan.signal + ""); return EnumStatementReturn.OK; } - + // writes the total world time to the buffer if(lower.equals("worldtime")) { ctx.writeBuffer("" + ctx.world.getTotalWorldTime()); return EnumStatementReturn.OK; } - + return super.eval(ctx, line); } } From fa6f54f01a18c4d34115f87ad3afd5e65d95a507 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Fri, 17 Jul 2026 21:07:26 +0200 Subject: [PATCH 104/107] now we're cooking with fire --- .../hbm/blocks/machine/pile/BlockPile.java | 3 + .../blocks/machine/pile/BlockPileDevice.java | 18 ++++-- .../render/tileentity/RenderPileControl.java | 6 +- .../machine/pile/TileEntityPileControl.java | 59 +++++++++++++++++- .../machine/pile/TileEntityPileCore.java | 7 ++- .../machine/pile/TileEntityPileVent.java | 17 ++--- .../textures/blocks/pile_block_core_ct.png | Bin 0 -> 1172 bytes 7 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/blocks/pile_block_core_ct.png diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java index b189566bc..2495ffc5e 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -52,6 +52,7 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { @SideOnly(Side.CLIENT) public CTStitchReceiver recChanIn; @SideOnly(Side.CLIENT) public CTStitchReceiver recChanOut; @SideOnly(Side.CLIENT) public CTStitchReceiver recCon; + @SideOnly(Side.CLIENT) public CTStitchReceiver recCore; @SideOnly(Side.CLIENT) protected IIcon iconTop; @@ -76,6 +77,7 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { this.recChanIn = IBlockCT.primeReceiver(reg, RefStrings.MODID + ":pile_block_input", this.blockIcon); this.recChanOut = IBlockCT.primeReceiver(reg, RefStrings.MODID + ":pile_block_output", this.blockIcon); this.recCon = IBlockCT.primeReceiver(reg, RefStrings.MODID + ":pile_block_control_top", this.iconTop); + this.recCore = IBlockCT.primeReceiver(reg, RefStrings.MODID + ":pile_block_core", this.iconTop); } @Override @@ -84,6 +86,7 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { if(side == 0 || side == 1) return meta == META_CONTROL ? recCon.fragCache : recTop.fragCache; if(meta == META_FUEL_IN || meta == META_AIR_IN) return recChanIn.fragCache; if(meta == META_FUEL_OUT || meta == META_AIR_OUT) return recChanOut.fragCache; + if(meta == META_CORE) return recCore.fragCache; return rec.fragCache; } diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java index d4d7968f9..500c9fe29 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java @@ -17,7 +17,9 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPileDevice extends BlockContainer implements IBlockMulti { @@ -73,10 +75,10 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti { if(world.getBlockMetadata(x, y, z) != BLOCK_META_CONTROL) return; int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - if(i == 0) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 1, 2); - if(i == 1) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 2, 2); - if(i == 2) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 0, 2); - if(i == 3) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 3, 2); + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 0, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 3, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 1, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, BLOCK_META_CONTROL + 2, 2); } public static int itemMetaToBlockMeta(int meta) { @@ -91,4 +93,12 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti { if(meta >= BLOCK_META_VENT) return ITEM_META_VENT; return ITEM_META_LOADER; } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + int meta = world.getBlockMetadata(x, y, z); + if(meta < BLOCK_META_CONTROL) return false; + + return side.ordinal() == meta % 4 + 2; + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderPileControl.java b/src/main/java/com/hbm/render/tileentity/RenderPileControl.java index 7acf06b59..f3c248a22 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPileControl.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPileControl.java @@ -3,6 +3,7 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.main.ResourceManager; +import com.hbm.tileentity.machine.pile.TileEntityPileControl; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; @@ -23,9 +24,12 @@ public class RenderPileControl extends TileEntitySpecialRenderer { case 3: GL11.glRotated(0, 0, 1, 0); break; } + TileEntityPileControl control = (TileEntityPileControl) te; + double level = control.lastLevel + (control.level - control.lastLevel) * interp; + bindTexture(ResourceManager.pile_control_tex); ResourceManager.pile_control.renderPart("Base"); - GL11.glTranslated(0, 0.5, 0); + GL11.glTranslated(0, level * 0.75, 0); ResourceManager.pile_control.renderPart("Rod"); GL11.glShadeModel(GL11.GL_FLAT); diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java index 69689a864..3b904f198 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java @@ -6,10 +6,13 @@ import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; import com.hbm.util.Compat; +import api.hbm.redstoneoverradio.IRORInteractive; import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPileControl extends TileEntityTickingBase { +public class TileEntityPileControl extends TileEntityTickingBase implements IRORInteractive { public double syncLevel; public double level; @@ -17,6 +20,10 @@ public class TileEntityPileControl extends TileEntityTickingBase { public int turnProgress; + public double targetLevel; + public static final double SPEED = 1D / 60D; // full traverse takes 3s + public boolean wasRedstone; + public int chanNum; @Override @@ -46,6 +53,24 @@ public class TileEntityPileControl extends TileEntityTickingBase { } } + if(canMove) { + if(Math.abs(level - targetLevel) <= SPEED) { + this.level = this.targetLevel; + } else if(level < targetLevel) { + this.level += SPEED; + } else if(level > targetLevel) { + this.level -= SPEED; + } + } + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() % 4 + 2); + boolean redstone = worldObj.getIndirectPowerOutput(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite().ordinal()); + + if(redstone && !wasRedstone) this.setTarget(1D); + if(!redstone && wasRedstone) this.setTarget(0D); + + this.wasRedstone = redstone; + this.networkPackNT(100); } else { @@ -77,4 +102,36 @@ public class TileEntityPileControl extends TileEntityTickingBase { if(this.syncLevel != lastSync) this.turnProgress = 2; } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_FUNCTION + "setrods" + NAME_SEPARATOR + "percent", + PREFIX_FUNCTION + "extendrods" + NAME_SEPARATOR + "percent" + }; + } + + @Override + public String runRORFunction(String name, String[] params) { + + if((PREFIX_FUNCTION + "setrods").equals(name) && params.length > 0) { + int percent = IRORInteractive.parseInt(params[0], 0, 100); + this.setTarget(percent / 100D); + this.markChanged(); + return null; + } + + if((PREFIX_FUNCTION + "extendrods").equals(name) && params.length > 0) { + int percent = IRORInteractive.parseInt(params[0], -100, 100); + this.setTarget(MathHelper.clamp_double(this.targetLevel + percent / 100D, 0D, 1D)); + this.markChanged(); + return null; + } + + return null; + } + + public void setTarget(double target) { + this.targetLevel = target; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index 654e2d234..6d11f60d7 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -193,8 +193,13 @@ public class TileEntityPileCore extends TileEntityTickingBase { if(!worldObj.isRemote) { - if(worldObj.getTotalWorldTime() % 3 == 0) for(PileChannel chan : this.ventilationChannels) { + for(PileChannel chan : this.ventilationChannels) { if(chan.air <= 0) continue; + + int toUse = (int) Math.ceil(chan.air * 5D / 1_000); + chan.air -= toUse; + + if(worldObj.getTotalWorldTime() % 3 != 0) continue; double x = chan.entry.getX() + 0.5 + chan.entry.getDir().offsetX * (this.width - 0.375); double y = chan.entry.getY() + 0.5; diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java index 4d48a2a3e..af645c568 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java @@ -7,6 +7,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; +import com.hbm.util.BobMathUtil; import com.hbm.util.Compat; import api.hbm.fluidmk2.IFluidStandardReceiverMK2; @@ -25,7 +26,7 @@ public class TileEntityPileVent extends TileEntityTickingBase implements IFluidS public int chanNum; public TileEntityPileVent() { - this.compair = new FluidTank(Fluids.AIR, 4_000); + this.compair = new FluidTank(Fluids.AIR, 4_000).withPressure(1); } @Override public FluidTank[] getAllTanks() { return new FluidTank[] {compair}; } @@ -35,7 +36,7 @@ public class TileEntityPileVent extends TileEntityTickingBase implements IFluidS public boolean canConnect(FluidType type, ForgeDirection dir) { if(type != compair.getTankType()) return false; ForgeDirection conDir = getOrientation(); - return dir == conDir.getOpposite(); + return dir == conDir; } @Override @@ -44,17 +45,17 @@ public class TileEntityPileVent extends TileEntityTickingBase implements IFluidS if(!worldObj.isRemote) { ForgeDirection dir = getOrientation(); - this.trySubscribe(compair.getTankType(), worldObj, xCoord - dir.offsetX, yCoord, zCoord - dir.offsetZ, dir.getOpposite()); + this.trySubscribe(compair.getTankType(), worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir); this.isActive = false; if(this.compair.getFill() > 0) { - int x = xCoord + dir.offsetX; + int x = xCoord - dir.offsetX; int y = yCoord; - int z = zCoord + dir.offsetZ; + int z = zCoord - dir.offsetZ; if(worldObj.getBlock(x, y, z) == ModBlocks.pile_block && worldObj.getBlockMetadata(x, y, z) == BlockPile.META_AIR_IN) { - TileEntity tile = Compat.getTileStandard(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + TileEntity tile = Compat.getTileStandard(worldObj, x, y, z); if(tile instanceof TileEntityPileBaseMK2) { TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; @@ -66,7 +67,9 @@ public class TileEntityPileVent extends TileEntityTickingBase implements IFluidS if(ventChan != null) { this.isActive = true; this.chanNum = core.getVentilationChannelNum(ventChan); - // compair stuff here + int toFill = BobMathUtil.min(compair.getFill(), 1_000 - ventChan.air); + ventChan.air += toFill; + this.compair.setFill(this.compair.getFill() - toFill); } } } diff --git a/src/main/resources/assets/hbm/textures/blocks/pile_block_core_ct.png b/src/main/resources/assets/hbm/textures/blocks/pile_block_core_ct.png new file mode 100644 index 0000000000000000000000000000000000000000..f78e3eba37a491d77a42aeaf53041fc38dfdd7c0 GIT binary patch literal 1172 zcmV;F1Z(?=P)yjF3p$&z_RG2=Qu(T1|Eem0631U`RH_roc%n{bMibV48yvA(LB$q zzvp>QmSq&-CZ;I)6f5@k+EA8!_;SYnUK`hS0dO6M_q_pkZZ)ASdH*HlR{I9FZ6Rly z9UUFjKZ@g+PN!417cGh+Uc7h#Kp2L!nho|J{a(*Iw=2$>qWg@Z=s!8tJNY&60$5qDaBwIq9+9p4wmDKB*k?%k=<^WFbwMj?RJ|y&+F@+ zzjn{_=yWT5^6?mZJ_as&Fgy8de9@Fr z@b~sMuIplqAq+!K zPEN2ai;ay9+J4DSv%%PDF2%RxkW5diJTU*}^E~I-vu9U&{N%}#x*x|eS(YJM4TKO& z^Fjzb*R5gzxbnSUv>*t8>gs1Pu<85wzP~i@`#w@SU-Lj5$CpkT1ObD=;L=93XRDNA zl(+a8rRe5z{Kx1RA?4RR(CKt2%aWa)o$q=A%;f=>{oNLuOY-;c{J_WKUKImMDWWJM zNfMGIsTV1w2*a>$=Pl23(lkYP1cfn6^Mx@8+oqPL=g*%ncm|NBX+54j)!BF!xY8=B zMAZM2uqbM^(|Ur=MlccFZ#JMDfMp@x>&+SKDz4w+fzN?n(BEAEDLDkO38R4r+U6M^>7=2 z=ya3qn?Ar?J+QG*4+yKI+1RXj*IlRwOi^N+q9i&UBJ3)$2-`*o8`p8z@H}iG>V7pZ zIPK>ZY+IP3#1!QM|LLTU>o~Zsi#6q=vr)|pA!|mqnoU~GCgH)a^~t_h56tU%tJwrt z;J;T7L{UVb-k`Nc{_`Qi^SqVyd_CSp{&fF#U9Z7%dTxy2$DNyN@%EsvR@U=8&sdk2 zdaN-;u`v1a@DOjVy-v@y24UN4@%F#**~)r;+*7Q}i^sp*dm8xO%6h)jY_KXH_#RRS z!O7W>-Ra4e)${pUU|HUABz6!4+}Z1_tmi=xtXvN`j*EQvIl;E9mGyjGUOqVJqP1R0 z&-HkWf8)klyv(Pi)k=CU1ncth{CtQp#kG3gX>8GHaHXCD2w{Jd|5iN!VEys<=Tg|> mT0IxGz!c_MJ)daJI{be$LevC@vt$_n0000 Date: Fri, 17 Jul 2026 22:46:38 +0200 Subject: [PATCH 105/107] the clicky bits --- .../java/com/hbm/blocks/ITooltipProvider.java | 6 +- .../hbm/blocks/machine/pile/BlockPile.java | 20 ++- .../blocks/machine/pile/BlockPileDevice.java | 83 +++++++++- .../render/tileentity/RenderPileLoader.java | 13 +- .../hbm/render/tileentity/RenderPileVent.java | 2 +- .../machine/pile/TileEntityPileControl.java | 11 +- .../machine/pile/TileEntityPileCore.java | 5 +- .../pile/TileEntityPileDeviceBase.java | 27 ++++ .../machine/pile/TileEntityPileLoader.java | 151 +++++++++++++++++- .../machine/pile/TileEntityPileVent.java | 58 +++---- src/main/resources/assets/hbm/lang/en_US.lang | 5 + 11 files changed, 331 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileDeviceBase.java diff --git a/src/main/java/com/hbm/blocks/ITooltipProvider.java b/src/main/java/com/hbm/blocks/ITooltipProvider.java index 829de9f15..9b4d4dfc6 100644 --- a/src/main/java/com/hbm/blocks/ITooltipProvider.java +++ b/src/main/java/com/hbm/blocks/ITooltipProvider.java @@ -16,9 +16,13 @@ public interface ITooltipProvider { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext); public default void addStandardInfo(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, ((Block) this).getUnlocalizedName() + ".desc", player, list, ext); + } + + public default void addStandardInfo(ItemStack stack, String name, EntityPlayer player, List list, boolean ext) { if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { - for(String s : I18nUtil.resolveKeyArray(((Block)this).getUnlocalizedName() + ".desc")) list.add(EnumChatFormatting.YELLOW + s); + for(String s : I18nUtil.resolveKeyArray(name)) list.add(EnumChatFormatting.YELLOW + s); } else { list.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC +"Hold <" + EnumChatFormatting.YELLOW + "" + EnumChatFormatting.ITALIC + "LSHIFT" + diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java index 2495ffc5e..c205ef53d 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -1,7 +1,10 @@ package com.hbm.blocks.machine.pile; +import java.util.ArrayList; +import java.util.List; import java.util.Random; +import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachinePWRController; import com.hbm.lib.RefStrings; @@ -10,6 +13,7 @@ import com.hbm.render.block.ct.CTStitchReceiver; import com.hbm.render.block.ct.IBlockCT; import com.hbm.tileentity.machine.pile.TileEntityPileBaseMK2; import com.hbm.tileentity.machine.pile.TileEntityPileCore; +import com.hbm.util.i18n.I18nUtil; import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; @@ -24,9 +28,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class BlockPile extends BlockContainer implements IBlockCT, IToolable { +public class BlockPile extends BlockContainer implements IBlockCT, IToolable, ILookOverlay { /** Blank dummy, the pile is mostly composed of that */ public static final int META_DUMMY = 0; @@ -123,6 +128,7 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { } if(tile instanceof TileEntityPileBaseMK2) { + if(world.isRemote) return true; TileEntityPileCore core = ((TileEntityPileBaseMK2) tile).getCore(); if(core != null) { ForgeDirection dir = ForgeDirection.getOrientation(side).getOpposite(); @@ -135,4 +141,16 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable { return false; } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + List text = new ArrayList(); + if(meta == META_FUEL_IN) text.add("Fuel Loading Port"); + if(meta == META_FUEL_OUT) text.add("Fuel Ejection Port"); + if(meta == META_AIR_IN) text.add("Air Inlet"); + if(meta == META_AIR_OUT) text.add("Air Outlet"); + if(meta == META_CONTROL) text.add("Control Rod Channel"); + if(!text.isEmpty()) ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } } diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java index 500c9fe29..4d07078c6 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java @@ -1,11 +1,16 @@ package com.hbm.blocks.machine.pile; +import java.util.ArrayList; import java.util.List; import com.hbm.blocks.IBlockMulti; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.main.NTMSounds; import com.hbm.tileentity.machine.pile.TileEntityPileControl; import com.hbm.tileentity.machine.pile.TileEntityPileLoader; import com.hbm.tileentity.machine.pile.TileEntityPileVent; +import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -13,15 +18,17 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class BlockPileDevice extends BlockContainer implements IBlockMulti { +public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILookOverlay, ITooltipProvider { public static final int ITEM_META_LOADER = 0; public static final int ITEM_META_VENT = 1; @@ -69,6 +76,35 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti { side = MathHelper.clamp_int(side - 2, 0, 3); return metaOffset + side; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + int meta = world.getBlockMetadata(x, y, z); + meta -= meta % 4; + + if(meta == BLOCK_META_LOADER) { + if(world.isRemote) return true; + + TileEntityPileLoader tile = (TileEntityPileLoader) world.getTileEntity(x, y, z); + + if(tile.level <= 0 && !tile.loading) { + + if(player.getHeldItem() != null && tile.stack == null && tile.isItemLoadable(player.getHeldItem())) { + tile.stack = player.getHeldItem().copy(); + tile.stack.stackSize = 1; + player.getHeldItem().stackSize--; + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, NTMSounds.UPGRADE_PLUG, 1F, 1F); + return true; + } + + tile.loading = true; + } + + return true; + } + + return false; + } @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { @@ -101,4 +137,49 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti { return side.ordinal() == meta % 4 + 2; } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, this.getUnlocalizedName(stack) + ".desc", player, list, ext); + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + + List text = new ArrayList(); + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPileLoader) { + TileEntityPileLoader device = (TileEntityPileLoader) tile; + text.add("Index: " + device.chanNum); + } + + if(tile instanceof TileEntityPileVent) { + TileEntityPileVent device = (TileEntityPileVent) tile; + text.add("Index: " + device.chanNum); + } + + if(tile instanceof TileEntityPileControl) { + TileEntityPileControl device = (TileEntityPileControl) tile; + text.add("Extraction level: " + (int) + (device.level * 100) + "%"); + text.add("Index: " + device.chanNum); + } + + if(!text.isEmpty()) + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedNameFromItemMeta(this.damageDropped(meta)) + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return getUnlocalizedNameFromItemMeta(stack.getItemDamage()); + } + + public String getUnlocalizedNameFromItemMeta(int meta) { + meta = Math.abs(meta % 3); // recitfy + if(meta == ITEM_META_LOADER) return this.getUnlocalizedName() + ".loader"; + if(meta == ITEM_META_VENT) return this.getUnlocalizedName() + ".vent"; + if(meta == ITEM_META_CONTROL) return this.getUnlocalizedName() + ".control"; + return this.getUnlocalizedName(); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java b/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java index 4b9641c4b..b08f82c0a 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java @@ -6,6 +6,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.pile.BlockPileDevice; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.pile.TileEntityPileLoader; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; @@ -29,16 +30,21 @@ public class RenderPileLoader extends TileEntitySpecialRenderer implements IItem case 3: GL11.glRotated(0, 0, 1, 0); break; } + TileEntityPileLoader loader = (TileEntityPileLoader) te; + double position = loader.lastLevel + (loader.level - loader.lastLevel) * interp; + bindTexture(ResourceManager.pile_loader_tex); ResourceManager.pile_loader.renderPart("Loader"); GL11.glPushMatrix(); { GL11.glTranslated(-0.1875, 0.5, 0); - GL11.glRotated(90, 0, 0, 1); + GL11.glRotated(position * 90, 0, 0, 1); GL11.glTranslated(0.1875, -0.5, 0); ResourceManager.pile_loader.renderPart("Lever"); } GL11.glPopMatrix(); + + GL11.glTranslated(position * -0.5, 0, 0); ResourceManager.pile_loader.renderPart("Slider"); - ResourceManager.pile_loader.renderPart("Rod"); + if(loader.hasRod) ResourceManager.pile_loader.renderPart("Rod"); GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); @@ -54,10 +60,11 @@ public class RenderPileLoader extends TileEntitySpecialRenderer implements IItem return new ItemRenderBase() { public void renderInventory() { GL11.glTranslated(0, -3.5, 0); - double scale = 10; + double scale = 5; GL11.glScaled(scale, scale, scale); } public void renderCommonWithStack(ItemStack item) { + GL11.glScaled(2, 2, 2); GL11.glShadeModel(GL11.GL_SMOOTH); if(item.getItemDamage() == BlockPileDevice.ITEM_META_LOADER) { bindTexture(ResourceManager.pile_loader_tex); diff --git a/src/main/java/com/hbm/render/tileentity/RenderPileVent.java b/src/main/java/com/hbm/render/tileentity/RenderPileVent.java index a665ee8e8..88fa636c1 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPileVent.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPileVent.java @@ -29,7 +29,7 @@ public class RenderPileVent extends TileEntitySpecialRenderer { bindTexture(ResourceManager.pile_vent_tex); ResourceManager.pile_vent.renderPart("Pipe"); - GL11.glRotated(rot, 0, -1, 0); + GL11.glRotated(rot, 0, 1, 0); ResourceManager.pile_vent.renderPart("Fan"); GL11.glShadeModel(GL11.GL_FLAT); diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java index 3b904f198..e01a7ad67 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java @@ -2,7 +2,6 @@ package com.hbm.tileentity.machine.pile; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.pile.BlockPile; -import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; import com.hbm.util.Compat; @@ -12,7 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPileControl extends TileEntityTickingBase implements IRORInteractive { +public class TileEntityPileControl extends TileEntityPileDeviceBase implements IRORInteractive { public double syncLevel; public double level; @@ -24,8 +23,6 @@ public class TileEntityPileControl extends TileEntityTickingBase implements IROR public static final double SPEED = 1D / 60D; // full traverse takes 3s public boolean wasRedstone; - public int chanNum; - @Override public void updateEntity() { @@ -53,7 +50,7 @@ public class TileEntityPileControl extends TileEntityTickingBase implements IROR } } - if(canMove) { + if(canMove && this.level != this.targetLevel) { if(Math.abs(level - targetLevel) <= SPEED) { this.level = this.targetLevel; } else if(level < targetLevel) { @@ -63,7 +60,7 @@ public class TileEntityPileControl extends TileEntityTickingBase implements IROR } } - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() % 4 + 2); + ForgeDirection dir = this.getOrientation(); boolean redstone = worldObj.getIndirectPowerOutput(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite().ordinal()); if(redstone && !wasRedstone) this.setTarget(1D); @@ -90,7 +87,6 @@ public class TileEntityPileControl extends TileEntityTickingBase implements IROR public void serialize(ByteBuf buf) { super.serialize(buf); buf.writeDouble(this.level); - buf.writeInt(this.chanNum); } @Override @@ -98,7 +94,6 @@ public class TileEntityPileControl extends TileEntityTickingBase implements IROR super.deserialize(buf); double lastSync = this.syncLevel; this.syncLevel = buf.readDouble(); - this.chanNum = buf.readInt(); if(this.syncLevel != lastSync) this.turnProgress = 2; } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index 6d11f60d7..0fc73eed9 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -8,6 +8,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachinePWRController; import com.hbm.blocks.machine.pile.BlockPile; import com.hbm.interfaces.NotableComments; +import com.hbm.main.NTMSounds; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.TileEntityTickingBase; @@ -144,6 +145,7 @@ public class TileEntityPileCore extends TileEntityTickingBase { int iZ = z + dir.offsetZ * j; worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_DUMMY, 3); } + worldObj.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, NTMSounds.VANILLA_PLINK, 1F, 0.75F); return true; } } @@ -182,7 +184,8 @@ public class TileEntityPileCore extends TileEntityTickingBase { } list.add(new PileChannel(x, y, z, dir, size, type)); - + + worldObj.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, NTMSounds.VANILLA_PLINK, 1F, 1.25F); this.markChanged(); return true; diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileDeviceBase.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileDeviceBase.java new file mode 100644 index 000000000..1d0ada371 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileDeviceBase.java @@ -0,0 +1,27 @@ +package com.hbm.tileentity.machine.pile; + +import com.hbm.tileentity.TileEntityTickingBase; + +import io.netty.buffer.ByteBuf; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class TileEntityPileDeviceBase extends TileEntityTickingBase { + + public int chanNum; + + public ForgeDirection getOrientation() { + return ForgeDirection.getOrientation(this.getBlockMetadata() % 4 + 2); + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.chanNum); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.chanNum = buf.readInt(); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java index 6516997d2..de16d3a7c 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java @@ -1,7 +1,156 @@ package com.hbm.tileentity.machine.pile; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.pile.BlockPile; +import com.hbm.main.NTMSounds; +import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; +import com.hbm.util.Compat; + +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPileLoader extends TileEntity { +public class TileEntityPileLoader extends TileEntityPileDeviceBase implements ISidedInventory{ + + public double syncLevel; + public double level; + public double lastLevel; + + public int turnProgress; + + public static final double SPEED = 1D / 7D; + + public boolean loading = false; + public int delay = 0; + public boolean hasRod = false; + public ItemStack stack; + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + this.hasRod = this.stack != null; + + ForgeDirection dir = getOrientation(); + + int x = xCoord - dir.offsetX; + int y = yCoord; + int z = zCoord - dir.offsetZ; + + if(worldObj.getBlock(x, y, z) == ModBlocks.pile_block && worldObj.getBlockMetadata(x, y, z) == BlockPile.META_FUEL_IN) { + TileEntity tile = Compat.getTileStandard(worldObj, x, y, z); + + if(tile instanceof TileEntityPileBaseMK2) { + TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; + TileEntityPileCore core = pile.getCore(); + + if(core != null) { + PileChannel fuelChan = core.getFuelChannel(x, y, z); + + if(fuelChan != null) { + this.chanNum = core.getFuelChannelNum(fuelChan); + } + } + } + } + + if(this.delay > 0) { + this.delay--; + } else { + + if(loading) { + + if(this.level == 0) worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, NTMSounds.GUN_BOLT_OPEN, this.getVolume(1F), 1F); + + this.level += SPEED; + if(this.level >= 1D) { + this.level = 1D; + this.loading = false; + this.delay = 5; + } + } else { + + if(this.level == 1) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, NTMSounds.GUN_BOLT_OPEN, this.getVolume(1F), 0.75F); + this.setInventorySlotContents(0, null); + } + + if(this.level > 0D) { + this.level -= SPEED; + if(this.level < 0D) this.level = 0D; + } + } + } + + this.networkPackNT(35); + + } else { + + this.lastLevel = this.level; + + if(this.turnProgress > 0) { + this.level = this.level + ((this.syncLevel - this.level) / (double) this.turnProgress); + --this.turnProgress; + } else { + this.level = this.syncLevel; + } + } + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.level); + buf.writeBoolean(this.hasRod); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + double lastSync = this.syncLevel; + this.syncLevel = buf.readDouble(); + this.hasRod = buf.readBoolean(); + + if(this.syncLevel != lastSync) this.turnProgress = 2; + } + + public static boolean isItemLoadable(ItemStack stack) { + return true; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) { + if(amount == 1 && this.stack != null) { + ItemStack ret = stack.copy(); + this.setInventorySlotContents(0, null); + return ret; + } + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + this.stack = stack; + this.markDirty(); + } + + @Override public int getSizeInventory() { return 1; } + @Override public ItemStack getStackInSlot(int slot) { return stack; } + @Override public ItemStack getStackInSlotOnClosing(int slot) { return null; } + @Override public String getInventoryName() { return "NULL"; } + @Override public boolean hasCustomInventoryName() { return false; } + @Override public int getInventoryStackLimit() { return 1; } + + @Override public boolean isUseableByPlayer(EntityPlayer player) { return false; } + @Override public void openInventory() { } + @Override public void closeInventory() { } + + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] {0}; } + @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return isItemLoadable(stack); } + @Override public boolean canInsertItem(int slot, ItemStack stack, int side) { return isItemLoadable(stack); } + @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { return false; } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java index af645c568..149c4bec4 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java @@ -5,7 +5,6 @@ import com.hbm.blocks.machine.pile.BlockPile; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; import com.hbm.util.BobMathUtil; import com.hbm.util.Compat; @@ -15,7 +14,7 @@ import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPileVent extends TileEntityTickingBase implements IFluidStandardReceiverMK2 { +public class TileEntityPileVent extends TileEntityPileDeviceBase implements IFluidStandardReceiverMK2 { public FluidTank compair; public boolean isActive = false; @@ -23,8 +22,6 @@ public class TileEntityPileVent extends TileEntityTickingBase implements IFluidS public float fan; public float lastFan; - public int chanNum; - public TileEntityPileVent() { this.compair = new FluidTank(Fluids.AIR, 4_000).withPressure(1); } @@ -49,28 +46,26 @@ public class TileEntityPileVent extends TileEntityTickingBase implements IFluidS this.isActive = false; - if(this.compair.getFill() > 0) { - int x = xCoord - dir.offsetX; - int y = yCoord; - int z = zCoord - dir.offsetZ; - - if(worldObj.getBlock(x, y, z) == ModBlocks.pile_block && worldObj.getBlockMetadata(x, y, z) == BlockPile.META_AIR_IN) { - TileEntity tile = Compat.getTileStandard(worldObj, x, y, z); - - if(tile instanceof TileEntityPileBaseMK2) { - TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; - TileEntityPileCore core = pile.getCore(); - - if(core != null) { - PileChannel ventChan = core.getVentilationChannel(x, y, z); - - if(ventChan != null) { - this.isActive = true; - this.chanNum = core.getVentilationChannelNum(ventChan); - int toFill = BobMathUtil.min(compair.getFill(), 1_000 - ventChan.air); - ventChan.air += toFill; - this.compair.setFill(this.compair.getFill() - toFill); - } + int x = xCoord - dir.offsetX; + int y = yCoord; + int z = zCoord - dir.offsetZ; + + if(worldObj.getBlock(x, y, z) == ModBlocks.pile_block && worldObj.getBlockMetadata(x, y, z) == BlockPile.META_AIR_IN) { + TileEntity tile = Compat.getTileStandard(worldObj, x, y, z); + + if(tile instanceof TileEntityPileBaseMK2) { + TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; + TileEntityPileCore core = pile.getCore(); + + if(core != null) { + PileChannel ventChan = core.getVentilationChannel(x, y, z); + + if(ventChan != null) { + this.chanNum = core.getVentilationChannelNum(ventChan); + int toFill = BobMathUtil.min(compair.getFill(), 1_000 - ventChan.air); + ventChan.air += toFill; + this.compair.setFill(this.compair.getFill() - toFill); + this.isActive = toFill > 0; } } } @@ -81,7 +76,10 @@ public class TileEntityPileVent extends TileEntityTickingBase implements IFluidS } else { this.lastFan = fan; - if(this.isActive) this.fan += 45; + if(this.isActive) { + this.fan += 45; + if(worldObj.rand.nextInt(20) == 0) worldObj.spawnParticle("cloud", xCoord + 0.5, yCoord + 1, zCoord + 0.5, 0, 0.05, 0); + } if(this.fan >= 360) { this.lastFan -= 360; @@ -89,22 +87,16 @@ public class TileEntityPileVent extends TileEntityTickingBase implements IFluidS } } } - - public ForgeDirection getOrientation() { - return ForgeDirection.getOrientation(this.getBlockMetadata() % 4 + 2); - } @Override public void serialize(ByteBuf buf) { super.serialize(buf); buf.writeBoolean(this.isActive); - buf.writeInt(this.chanNum); } @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); this.isActive = buf.readBoolean(); - this.chanNum = buf.readInt(); } } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 3982584e7..375d2c3c0 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5979,6 +5979,11 @@ tile.pa_source.name=Particle Source tile.pa_source.desc=Requires cooling!$Uses two items to create a particle. tile.part_emitter.name=Deco Particle Emitter tile.pedestal.name=Pedestal +tile.pile_block.name=Chicago Pile +tile.pile_brick.name=Chicago Pile Graphite Bricks +tile.pile_device.control.name=Chicago Pile Control Rod +tile.pile_device.loader.name=Chicago Pile Fuel Loader +tile.pile_device.vent.name=Chicago Pile Vent tile.pink_barrel.name=Kerosene Barrel tile.pink_log.name=Pink Log tile.pink_planks.name=Pink Wood Planks From 798382bf42af37a036356b504c4b44c9ca6a136f Mon Sep 17 00:00:00 2001 From: HbmMods Date: Fri, 17 Jul 2026 23:10:09 +0200 Subject: [PATCH 106/107] and one for the road --- .../hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java index c53d8b088..cf9dce471 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKTerminal.java @@ -271,7 +271,7 @@ public class TileEntityRBMKTerminal extends TileEntityLoadedBase implements IGUI } String allParams = String.join(" ", params); - + if((PREFIX_FUNCTION + "write").equals(name)) { this.push(allParams); this.markChanged(); @@ -279,7 +279,7 @@ public class TileEntityRBMKTerminal extends TileEntityLoadedBase implements IGUI } if(name.startsWith(PREFIX_FUNCTION + "set")) { - int line = IRORInteractive.parseInt(name.substring(3), 1, 17) - 1; + int line = IRORInteractive.parseInt(name.substring(PREFIX_FUNCTION.length() + 3), 1, 17) - 1; this.history[line] = allParams; this.markChanged(); return null; From 4064efd028356df06784707d026b7c51a924ac86 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sun, 19 Jul 2026 16:47:23 +0200 Subject: [PATCH 107/107] guh? --- .../blocks/machine/pile/BlockPileDevice.java | 10 +- src/main/java/com/hbm/items/ModItems.java | 34 ++++--- .../com/hbm/items/machine/ItemPileRodMK2.java | 90 ++++++++++++++++++ .../render/tileentity/RenderPileLoader.java | 2 +- .../machine/pile/TileEntityPileCore.java | 62 +++++++++++- .../machine/pile/TileEntityPileLoader.java | 32 +++++-- .../assets/hbm/textures/items/pile_rod.nu.png | Bin 0 -> 274 bytes .../hbm/textures/items/pile_rod.po210be.png | Bin 0 -> 274 bytes .../hbm/textures/items/pile_rod.pu239.png | Bin 0 -> 279 bytes .../hbm/textures/items/pile_rod.ra226be.png | Bin 0 -> 274 bytes .../hbm/textures/items/pile_rod.rgp.png | Bin 0 -> 275 bytes .../hbm/textures/items/pile_rod.waste.png | Bin 0 -> 231 bytes .../assets/hbm/textures/items/pile_rod.zr.png | Bin 0 -> 271 bytes 13 files changed, 201 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/hbm/items/machine/ItemPileRodMK2.java create mode 100644 src/main/resources/assets/hbm/textures/items/pile_rod.nu.png create mode 100644 src/main/resources/assets/hbm/textures/items/pile_rod.po210be.png create mode 100644 src/main/resources/assets/hbm/textures/items/pile_rod.pu239.png create mode 100644 src/main/resources/assets/hbm/textures/items/pile_rod.ra226be.png create mode 100644 src/main/resources/assets/hbm/textures/items/pile_rod.rgp.png create mode 100644 src/main/resources/assets/hbm/textures/items/pile_rod.waste.png create mode 100644 src/main/resources/assets/hbm/textures/items/pile_rod.zr.png diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java index 4d07078c6..d362e0c7e 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java @@ -133,9 +133,10 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILoo @Override public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { int meta = world.getBlockMetadata(x, y, z); - if(meta < BLOCK_META_CONTROL) return false; - - return side.ordinal() == meta % 4 + 2; + if(meta >= BLOCK_META_CONTROL) return side.ordinal() == meta % 4 + 2; + if(meta >= BLOCK_META_VENT) return false; + if(meta >= BLOCK_META_LOADER) return side.ordinal() == meta % 4 + 2; + return false; } @Override @@ -153,6 +154,7 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILoo if(tile instanceof TileEntityPileLoader) { TileEntityPileLoader device = (TileEntityPileLoader) tile; text.add("Index: " + device.chanNum); + if(device.syncStack != null) text.add("Loading: " + device.syncStack.getDisplayName()); } if(tile instanceof TileEntityPileVent) { @@ -162,8 +164,8 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILoo if(tile instanceof TileEntityPileControl) { TileEntityPileControl device = (TileEntityPileControl) tile; - text.add("Extraction level: " + (int) + (device.level * 100) + "%"); text.add("Index: " + device.chanNum); + text.add("Extraction level: " + (int) + (device.level * 100) + "%"); } if(!text.isEmpty()) diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index f44a125be..aeae45ce9 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -973,13 +973,15 @@ public class ModItems { public static Item waste_plate_ra226be; public static Item waste_plate_pu238be; - public static Item pile_rod_uranium; - public static Item pile_rod_pu239; - public static Item pile_rod_plutonium; - public static Item pile_rod_source; - public static Item pile_rod_boron; - public static Item pile_rod_lithium; - public static Item pile_rod_detector; + @Deprecated public static Item pile_rod_uranium; + @Deprecated public static Item pile_rod_pu239; + @Deprecated public static Item pile_rod_plutonium; + @Deprecated public static Item pile_rod_source; + @Deprecated public static Item pile_rod_boron; + @Deprecated public static Item pile_rod_lithium; + @Deprecated public static Item pile_rod_detector; + + public static Item pile_rod; public static Item plate_fuel_u233; public static Item plate_fuel_u235; @@ -2998,13 +3000,15 @@ public class ModItems { waste_plate_ra226be = new ItemDepletedFuel().setUnlocalizedName("waste_plate_ra226be").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_ra226be"); waste_plate_pu238be = new ItemDepletedFuel().setUnlocalizedName("waste_plate_pu238be").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_pu238be"); - pile_rod_uranium = new ItemPileRod().setUnlocalizedName("pile_rod_uranium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pile_rod_uranium"); - pile_rod_pu239 = new ItemPileRod().setUnlocalizedName("pile_rod_pu239").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pile_rod_pu239"); - pile_rod_plutonium = new ItemPileRod().setUnlocalizedName("pile_rod_plutonium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pile_rod_plutonium"); - pile_rod_source = new ItemPileRod().setUnlocalizedName("pile_rod_source").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pile_rod_source"); - pile_rod_boron = new ItemPileRod().setUnlocalizedName("pile_rod_boron").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pile_rod_boron"); - pile_rod_lithium = new ItemPileRod().setUnlocalizedName("pile_rod_lithium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pile_rod_lithium"); - pile_rod_detector = new ItemPileRod().setUnlocalizedName("pile_rod_detector").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pile_rod_detector"); + pile_rod_uranium = new ItemPileRod().setUnlocalizedName("pile_rod_uranium").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_uranium"); + pile_rod_pu239 = new ItemPileRod().setUnlocalizedName("pile_rod_pu239").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_pu239"); + pile_rod_plutonium = new ItemPileRod().setUnlocalizedName("pile_rod_plutonium").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_plutonium"); + pile_rod_source = new ItemPileRod().setUnlocalizedName("pile_rod_source").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_source"); + pile_rod_boron = new ItemPileRod().setUnlocalizedName("pile_rod_boron").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_boron"); + pile_rod_lithium = new ItemPileRod().setUnlocalizedName("pile_rod_lithium").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_lithium"); + pile_rod_detector = new ItemPileRod().setUnlocalizedName("pile_rod_detector").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_detector"); + + pile_rod = new ItemPileRodMK2().setUnlocalizedName("pile_rod").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pile_rod"); plate_fuel_u233 = new ItemPlateFuel(2200000).setFunction(FunctionEnum.SQUARE_ROOT, 50).setUnlocalizedName("plate_fuel_u233").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":plate_fuel_u233"); plate_fuel_u235 = new ItemPlateFuel(2200000).setFunction(FunctionEnum.SQUARE_ROOT, 40).setUnlocalizedName("plate_fuel_u235").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":plate_fuel_u235"); @@ -5357,6 +5361,8 @@ public class ModItems { GameRegistry.registerItem(pile_rod_boron, pile_rod_boron.getUnlocalizedName()); GameRegistry.registerItem(pile_rod_lithium, pile_rod_lithium.getUnlocalizedName()); GameRegistry.registerItem(pile_rod_detector, pile_rod_detector.getUnlocalizedName()); + + GameRegistry.registerItem(pile_rod, pile_rod.getUnlocalizedName()); //Plate Fuels GameRegistry.registerItem(plate_fuel_u233, plate_fuel_u233.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemPileRodMK2.java b/src/main/java/com/hbm/items/machine/ItemPileRodMK2.java new file mode 100644 index 000000000..2fd4fc344 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemPileRodMK2.java @@ -0,0 +1,90 @@ +package com.hbm.items.machine; + +import com.hbm.items.ItemEnumMulti; +import com.hbm.util.BobMathUtil; +import com.hbm.util.EnumUtil; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemPileRodMK2 extends ItemEnumMulti { + + /* _____ + * / \ + * \_____/ + * | | + * | | + * | | + * | | + * \_____/ + * + * Not terribly sophisticated, + * it's a cylinder. + */ + + public static final String KEY_NBT_DEPLETION = "depletion"; + + public ItemPileRodMK2() { + super(EnumPileRod.class, true, true); + } + + public static enum EnumPileRod { + RA226BE(1D), + PO210BE(1D), + ZR( 0D, 0D, 0D), + NU( 1D, 1_000D, 1D), + RGP( 1D, 1_000D, 1D), + PU239( 1D, 1_000D, 1D), + WASTE( 1D, 1_000D, 1D); + + public double reactionMult = 1.0D; + public double life = 1_000D; + public double heatMult = 1.0D; + public double neutronSource = 0D; + + private EnumPileRod(double neutronSource) { + this.neutronSource = neutronSource; + this.reactionMult = 0; + this.life = 0; + this.heatMult = 0; + } + + private EnumPileRod(double reaction, double life, double heat) { + this.reactionMult = reaction; + this.life = life; + this.heatMult = heat; + } + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return getDurabilityForDisplay(stack) > 0D; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + EnumPileRod rod = EnumUtil.grabEnumSafely(EnumPileRod.class, stack.getItemDamage()); + double life = rod.life; + if(life <= 0) return 0D; + return getDepletion(stack) / life; + } + + public static double getDepletion(ItemStack stack) { + if(!stack.hasTagCompound()) return 0D; + return stack.stackTagCompound.getDouble(KEY_NBT_DEPLETION); + } + + public static void setDepletion(ItemStack stack, double depletion) { + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setDouble(KEY_NBT_DEPLETION, depletion); + } + + public static double getReactivity(ItemStack stack, double inFlux) { + EnumPileRod rod = EnumUtil.grabEnumSafely(EnumPileRod.class, stack.getItemDamage()); + double outFlux = rod.neutronSource; + if(rod.reactionMult > 0) { + outFlux += BobMathUtil.squirt(inFlux) * rod.reactionMult; + } + return outFlux; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java b/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java index b08f82c0a..35f557bb5 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPileLoader.java @@ -44,7 +44,7 @@ public class RenderPileLoader extends TileEntitySpecialRenderer implements IItem GL11.glTranslated(position * -0.5, 0, 0); ResourceManager.pile_loader.renderPart("Slider"); - if(loader.hasRod) ResourceManager.pile_loader.renderPart("Rod"); + if(loader.syncStack != null) ResourceManager.pile_loader.renderPart("Rod"); GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index 0fc73eed9..a92e97f8d 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -15,9 +15,11 @@ import com.hbm.tileentity.TileEntityTickingBase; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.ForgeDirection; @NotableComments @@ -246,6 +248,7 @@ public class TileEntityPileCore extends TileEntityTickingBase { public final PileChannelType type; public final ItemStack[] rods; + public double heat = 0D; public int air; public double control = 1D; // pulled out by default, unlike me who never pulls out @@ -255,7 +258,7 @@ public class TileEntityPileCore extends TileEntityTickingBase { this.length = type == PileChannelType.CONTROL ? height : type == PileChannelType.FUEL ? depth : width; - + this.rods = new ItemStack[length]; } @@ -271,6 +274,47 @@ public class TileEntityPileCore extends TileEntityTickingBase { nbt.setInteger(name + "_y", entry.getY()); nbt.setInteger(name + "_z", entry.getZ()); nbt.setByte(name + "_d", (byte) entry.getDir().ordinal()); + + if(type == type.FUEL) { + NBTTagList list = new NBTTagList(); + for(int i = 0; i < rods.length; i++) { + if(rods[i] != null) { + NBTTagCompound nbt1 = new NBTTagCompound(); + nbt1.setByte("slot", (byte)i); + rods[i].writeToNBT(nbt1); + list.appendTag(nbt1); + } + } + nbt.setTag("items", list); + } + } + + public void loadItem(ItemStack stack) { + if(stack == null) return; + if(rods.length <= 0) { dropItem(stack, -1); return; } + + for(int i = 0; i < rods.length; i++) { + if(rods[i] == null) { + rods[i] = stack; + return; + + } else { + ItemStack prev = rods[i]; + rods[i] = stack; + stack = prev; + } + } + + if(stack != null) dropItem(stack, length); + } + + public void dropItem(ItemStack stack, int depth) { + int x = entry.getX() + entry.getDir().offsetX * depth; + int y = entry.getY(); + int z = entry.getZ() + entry.getDir().offsetZ * depth; + + EntityItem item = new EntityItem(worldObj, x + 0.5, y + 0.5, z + 0.5, stack); + worldObj.spawnEntityInWorld(item); } } @@ -279,7 +323,21 @@ public class TileEntityPileCore extends TileEntityTickingBase { int y = nbt.getInteger(name + "_y"); int z = nbt.getInteger(name + "_z"); ForgeDirection dir = ForgeDirection.getOrientation(nbt.getByte(name + "_d")); - return new PileChannel(x, y, z, dir); + + PileChannel chan = new PileChannel(x, y, z, dir); + + if(chan.type == chan.type.FUEL) { + NBTTagList list = nbt.getTagList("fuel", 10); + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound nbt1 = list.getCompoundTagAt(i); + byte b0 = nbt1.getByte("slot"); + if(b0 >= 0 && b0 < chan.rods.length) { + chan.rods[b0] = ItemStack.loadItemStackFromNBT(nbt1); + } + } + } + + return chan; } public static enum PileChannelType { diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java index de16d3a7c..503d7684e 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine.pile; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.pile.BlockPile; +import com.hbm.items.ModItems; import com.hbm.main.NTMSounds; import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; import com.hbm.util.Compat; @@ -9,6 +10,7 @@ import com.hbm.util.Compat; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; @@ -25,17 +27,17 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS public boolean loading = false; public int delay = 0; - public boolean hasRod = false; + public ItemStack syncStack; public ItemStack stack; + public boolean wasRedstone; @Override public void updateEntity() { if(!worldObj.isRemote) { - this.hasRod = this.stack != null; - ForgeDirection dir = getOrientation(); + PileChannel fuelChan = null; int x = xCoord - dir.offsetX; int y = yCoord; @@ -49,7 +51,7 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS TileEntityPileCore core = pile.getCore(); if(core != null) { - PileChannel fuelChan = core.getFuelChannel(x, y, z); + fuelChan = core.getFuelChannel(x, y, z); if(fuelChan != null) { this.chanNum = core.getFuelChannelNum(fuelChan); @@ -58,6 +60,10 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS } } + boolean redstone = worldObj.getIndirectPowerOutput(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite().ordinal()); + if(redstone && !wasRedstone && this.delay <= 0 && this.level <= 0) this.loading = true; + this.wasRedstone = redstone; + if(this.delay > 0) { this.delay--; } else { @@ -76,7 +82,10 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS if(this.level == 1) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, NTMSounds.GUN_BOLT_OPEN, this.getVolume(1F), 0.75F); - this.setInventorySlotContents(0, null); + if(fuelChan != null) { + fuelChan.loadItem(stack); + this.setInventorySlotContents(0, null); + } } if(this.level > 0D) { @@ -105,7 +114,12 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS public void serialize(ByteBuf buf) { super.serialize(buf); buf.writeDouble(this.level); - buf.writeBoolean(this.hasRod); + if(this.stack != null) { + buf.writeInt(Item.getIdFromItem(this.stack.getItem())); + buf.writeShort(this.stack.getItemDamage()); + } else { + buf.writeInt(-1); + } } @Override @@ -113,13 +127,15 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS super.deserialize(buf); double lastSync = this.syncLevel; this.syncLevel = buf.readDouble(); - this.hasRod = buf.readBoolean(); + int itemId = buf.readInt(); + if(itemId != -1) this.syncStack = new ItemStack(Item.getItemById(itemId), 1, buf.readShort()); + else this.syncStack = null; if(this.syncLevel != lastSync) this.turnProgress = 2; } public static boolean isItemLoadable(ItemStack stack) { - return true; + return stack.getItem() == ModItems.pile_rod; } @Override diff --git a/src/main/resources/assets/hbm/textures/items/pile_rod.nu.png b/src/main/resources/assets/hbm/textures/items/pile_rod.nu.png new file mode 100644 index 0000000000000000000000000000000000000000..cfffc6c48ee3d6b603c21852d90529b54bf9190f GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfyU$h>-?ncy@x7TgCjVij_MY5RB+k$H_iQ4#iy8XAc_0@gKdowM^7zCY2xhK zKl|p-{Qn2^YF7H)J*YEBWc}BlC4uSHrO!0FCM;x7P|CR}Cbi_!jMm9YaYs^hl`7sd zTFCWHRf*MYoEz=3#N_wvfRY*yUTbqoeC z_zjLtIdH9ESr+Sw_dn%@GPZAFs+oIW>2<$JDpMVw%joT`t2^c2yZqqo^h;;#FEXEh WW-al;wQMEOQw*N2elF{r5}E*=S#c!* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pile_rod.po210be.png b/src/main/resources/assets/hbm/textures/items/pile_rod.po210be.png new file mode 100644 index 0000000000000000000000000000000000000000..f31b52872560faaa0dd8d4503fdb91de2e1df437 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfe_Mh4R=Z|sNR-GLt(l>4!aeV%4WB>#oK64ux=*0b!pRFjtv}@9y z|8xKDc~DbV=h)USf8Q9S;?3PHyoXhNZp0)cWgR?lUZ3OopKp)T*@T0+bG$ZICw@Hh zl4s+~nG#7Z(g#i+KfNLCr%>Db`F6=yTX;59HG)8R$ehN>{o;8FC)otJJ&YdwJ)U1u zz-SijVbqW$Zu9fo^p9sga!YWnkK23t!;{ZW!B P&{GVau6{1-oD!M@TOAvdw`O{-*YT{{`|P@$3=S?G{D#~Yr7mr}l^|VWD(I-m z%3v}7oK(s&)ekZJE?0P0?{0ctHD{`SLVixm?hV)bzX^WIUZ*;vI7E?UQgYL-bvM^G zhchq~CpvLlWOQfVcU8mTbH=|34Y!TB3@jZ(r?|~pHp}p|QHZPMpDFQCCrjTO7aq31 aC@kP;e^=@0#WiU>eMNo8k-s(5U{yp!^30B^M9jclVU(v@Q3>W z_XW;9fA}o%$EUB{%s_DXXZLf%m_sdRS*>PSfs_}VoxiUp>B7Y;2bYQL7T@;n)~N?? zpYI7`JP}{EiM5BJ9g}lxN-C5L$*md3>zC%nD5orxU-8V zY;ILy)+jqT=VZ6U`g=RN7JfMQ*P5qTORvml?Pc}`St2H%dW75n0 zcc1Qm|IdLbXUg}N3R5orh%>)B_v@y!0d9-0Nx85vC@4uJM|51~NHsZDXmiztC0mz4 z;e0XsrpH1WOC4M;Z`dm4rFrg@`h-tCDm%~o%FGG~HCI14Z!yYg=vy2ZPd~eebjOvt=l@>=P99(qwotr~Qn(^}Xu;jxPn8tnc?)t+Hy| zI!)s7Ss%^9dCw;VGM=+!$XdI-i7j9~LqbntYulO%8o-UMWUTM29t0wc6 c@!o5!8ml#8x7mxV1iF;L)78&qol`;+01T{H+yDRo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pile_rod.zr.png b/src/main/resources/assets/hbm/textures/items/pile_rod.zr.png new file mode 100644 index 0000000000000000000000000000000000000000..d37b23242c514c2abf5a72602241c0fd42b36d87 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfSsN5M436=% zt>&GUG}ZC;wt9~RzLBXLEFJIK?AfHFeq`0E6|;|jU;gLV%ZeXAd}jSnuVC8CZ`pWU TX!{+Yj~F~%{an^LB{Ts51gvcJ literal 0 HcmV?d00001