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 01/17] 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 02/17] 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 03/17] 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 d91f85e610ea48b79f996c91db5432912d9a4872 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Mon, 15 Jun 2026 22:01:14 +0200 Subject: [PATCH 04/17] 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 7c7df7c4598b5e8b1a2803eb9b81d1dec48d5029 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 16 Jun 2026 16:41:23 +0200 Subject: [PATCH 05/17] 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 06/17] 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 07/17] 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 08/17] 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 09/17] 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 10/17] 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 11/17] 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 12/17] '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 13/17] 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 14/17] 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 c6f78d17c9c49c3027132b3edc9ad6266ba255c0 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 22 Jun 2026 15:50:09 +0200 Subject: [PATCH 15/17] 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 16/17] 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 0fcb0d05c49b48fa8f8da54182d0f705ee4f05f8 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Mon, 22 Jun 2026 22:29:29 +0200 Subject: [PATCH 17/17] 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