From 22aefff48d5839e7de10fd0f8e8ca377236f36d1 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Tue, 6 May 2025 23:18:28 +0200 Subject: [PATCH 1/9] get to work on the mob spawners bugboy --- .../java/com/hbm/main/StructureManager.java | 2 +- .../com/hbm/world/gen/NTMWorldGenerator.java | 16 ++++++++++------ .../assets/hbm/structures/radio_house.nbt | Bin 0 -> 17417 bytes 3 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/radio_house.nbt diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 5c3f93090..601b3c44f 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -53,7 +53,6 @@ public class StructureManager { - public static final NBTStructure vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/vertibird.nbt")); public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); public static final NBTStructure aircraft_carrier = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/aircraft_carrier.nbt")); @@ -61,6 +60,7 @@ public class StructureManager { public static final NBTStructure beached_patrol = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/beached_patrol.nbt")); public static final NBTStructure lighthouse = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/lighthouse.nbt")); public static final NBTStructure dish = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/dish.nbt")); + public static final NBTStructure radio_house = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/radio_house.nbt")); public static final NBTStructure spire = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/spire.nbt")); diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index bb1c7b3d3..aefeedf4e 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -39,6 +39,7 @@ public class NTMWorldGenerator implements IWorldGenerator { final List oceanBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean }); final List beachBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); final List lighthouseBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); + final List flatbiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.plains, BiomeGenBase.icePlains, BiomeGenBase.desert }); /// SPIRE /// NBTStructure.registerStructure(0, new SpawnCondition() {{ @@ -102,18 +103,21 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 8; }}); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); //why the fuck did this change - NBTStructure.registerStructure(0, new SpawnCondition() {{ - canSpawn = biome -> biome == BiomeGenBase.plains; + canSpawn = flatbiomes::contains; structure = new JigsawPiece("dish", StructureManager.dish, -10); minHeight = 53; maxHeight = 65; - spawnWeight = 1; + spawnWeight = 4; }}); - NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = flatbiomes::contains; + structure = new JigsawPiece("radio_house", StructureManager.radio_house, -6); + spawnWeight = 40; + }}); + + NBTStructure.registerNullWeight(0, 4, oceanBiomes::contains); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); diff --git a/src/main/resources/assets/hbm/structures/radio_house.nbt b/src/main/resources/assets/hbm/structures/radio_house.nbt new file mode 100644 index 0000000000000000000000000000000000000000..394ac3b228623e6b38ff8ddc6674efa8440fb2cb GIT binary patch literal 17417 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 izm9AYJx Date: Wed, 27 Aug 2025 13:12:01 +1000 Subject: [PATCH 2/9] fix transparent pixel issue in wiki icon screenshitter --- .../inventory/gui/GUIScreenWikiRender.java | 93 ++++++++++--------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java index 900e4e9b6..a183812dc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java @@ -26,12 +26,12 @@ import net.minecraft.util.ResourceLocation; public class GUIScreenWikiRender extends GuiScreen { - // Basically the same thing as GUIScreenPreview, but will iterate through all provided preview stacks - // taking a screenshot of each, as fast as the game can render them + // Basically the same thing as GUIScreenPreview, but will iterate through all provided preview stacks + // taking a screenshot of each, as fast as the game can render them protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/nei/gui_nei.png"); protected ItemStack[] preview; - protected int index = 0; + protected int index = 0; protected int scale = 1; protected String saveLocation = "wiki-screenshots"; protected String prefix = ""; @@ -52,7 +52,7 @@ public class GUIScreenWikiRender extends GuiScreen { this.getStackName = getStackName; } - @Override + @Override public void drawScreen(int mouseX, int mouseY, float f) { if(this.mc.theWorld != null) { GuiScreen.drawRect(0, 0, this.width, this.height, 0xFFC6C6C6); @@ -60,57 +60,64 @@ public class GUIScreenWikiRender extends GuiScreen { this.drawBackground(0); } - // Once we've reached the end of the array, immedaitely close this GUI - if(index >= preview.length) { - this.mc.thePlayer.closeScreen(); - return; - } - + // Once we've reached the end of the array, immedaitely close this GUI + if(index >= preview.length) { + this.mc.thePlayer.closeScreen(); + return; + } + this.drawGuiContainerBackgroundLayer(); GL11.glDisable(GL11.GL_LIGHTING); this.drawGuiContainerForegroundLayer(preview[index]); GL11.glEnable(GL11.GL_LIGHTING); - + ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); int zoom = scale * res.getScaleFactor(); - try { - String slotName = getStackName.apply(preview[index]).replaceAll("§.", "").replaceAll("[^\\w ().-]+", ""); - if(!slotName.endsWith(".name")) { - saveScreenshot(Minecraft.getMinecraft().mcDataDir, saveLocation, prefix + slotName + ".png", zoom, zoom, zoom * 16, zoom * 16, 0xFF8B8B8B); - } - } catch (Exception ex) { - // Just skip any failures caused by display name or rendering - } + try { + String slotName = getStackName.apply(preview[index]).replaceAll("§.", "").replaceAll("[^\\w ().-]+", ""); + if(!slotName.endsWith(".name")) { + saveScreenshot(Minecraft.getMinecraft().mcDataDir, saveLocation, prefix + slotName + ".png", zoom, zoom, zoom * 16, zoom * 16, 0xFFFF00FF); + } + } catch (Exception ex) { + // Just skip any failures caused by display name or rendering + } - index++; - } + index++; + } protected void drawGuiContainerBackgroundLayer() { GL11.glPushMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(texture); - ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); - GL11.glScaled(scale, scale, scale); - this.drawTexturedModalRect(0, res.getScaledHeight_double() / scale - 18D, 5, 87, 18, 18); - GL11.glPopMatrix(); - } + { - public void drawTexturedModalRect(double x, double y, int sourceX, int sourceY, int sizeX, int sizeY) { - double f = 0.00390625D; - double f1 = 0.00390625D; - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV((double) (x + 0), (double) (y + sizeY), (double) this.zLevel, (double) ((float) (sourceX + 0) * f), (double) ((float) (sourceY + sizeY) * f1)); - tessellator.addVertexWithUV((double) (x + sizeX), (double) (y + sizeY), (double) this.zLevel, (double) ((float) (sourceX + sizeX) * f), (double) ((float) (sourceY + sizeY) * f1)); - tessellator.addVertexWithUV((double) (x + sizeX), (double) (y + 0), (double) this.zLevel, (double) ((float) (sourceX + sizeX) * f), (double) ((float) (sourceY + 0) * f1)); - tessellator.addVertexWithUV((double) (x + 0), (double) (y + 0), (double) this.zLevel, (double) ((float) (sourceX + 0) * f), (double) ((float) (sourceY + 0) * f1)); - tessellator.draw(); + ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + + int size = 18; + double y = res.getScaledHeight_double() / scale - 18D; + + GL11.glScaled(scale, scale, scale); + + GL11.glColor4f(1.0F, 0.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertex((double) 0, (double) y + size, (double) this.zLevel); + tessellator.addVertex((double) size, (double) y + size, (double) this.zLevel); + tessellator.addVertex((double) size, (double) y, (double) this.zLevel); + tessellator.addVertex((double) 0, (double) y, (double) this.zLevel); + tessellator.draw(); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + } + GL11.glPopMatrix(); } protected void drawGuiContainerForegroundLayer(ItemStack preview) { if(preview == null) return; - + GL11.glPushMatrix(); RenderHelper.enableGUIStandardItemLighting(); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); @@ -119,11 +126,11 @@ public class GUIScreenWikiRender extends GuiScreen { GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_DEPTH_TEST); - + GL11.glScaled(scale, scale, scale); - + ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); - GL11.glTranslated(9D, res.getScaledHeight_double() / scale - 9D, -200); + GL11.glTranslated(9D, res.getScaledHeight_double() / scale - 9D, -200); this.zLevel = 200.0F; itemRender.zLevel = 200.0F; @@ -134,7 +141,7 @@ public class GUIScreenWikiRender extends GuiScreen { itemRender.zLevel = 0.0F; this.zLevel = 0.0F; - + GL11.glPopMatrix(); } From a00034787769fbf55972db0190c539ad524428fc Mon Sep 17 00:00:00 2001 From: George Paton Date: Wed, 27 Aug 2025 13:38:43 +1000 Subject: [PATCH 3/9] yeah I was overcomplicating that, this is much better --- .../inventory/gui/GUIScreenWikiRender.java | 37 +------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java index a183812dc..42b3c6b49 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java @@ -19,7 +19,6 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -54,11 +53,7 @@ public class GUIScreenWikiRender extends GuiScreen { @Override public void drawScreen(int mouseX, int mouseY, float f) { - if(this.mc.theWorld != null) { - GuiScreen.drawRect(0, 0, this.width, this.height, 0xFFC6C6C6); - } else { - this.drawBackground(0); - } + GuiScreen.drawRect(0, 0, this.width, this.height, 0xFFFF00FF); // Once we've reached the end of the array, immedaitely close this GUI if(index >= preview.length) { @@ -66,7 +61,6 @@ public class GUIScreenWikiRender extends GuiScreen { return; } - this.drawGuiContainerBackgroundLayer(); GL11.glDisable(GL11.GL_LIGHTING); this.drawGuiContainerForegroundLayer(preview[index]); GL11.glEnable(GL11.GL_LIGHTING); @@ -86,35 +80,6 @@ public class GUIScreenWikiRender extends GuiScreen { index++; } - protected void drawGuiContainerBackgroundLayer() { - GL11.glPushMatrix(); - { - - ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); - - int size = 18; - double y = res.getScaledHeight_double() / scale - 18D; - - GL11.glScaled(scale, scale, scale); - - GL11.glColor4f(1.0F, 0.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_TEXTURE_2D); - - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertex((double) 0, (double) y + size, (double) this.zLevel); - tessellator.addVertex((double) size, (double) y + size, (double) this.zLevel); - tessellator.addVertex((double) size, (double) y, (double) this.zLevel); - tessellator.addVertex((double) 0, (double) y, (double) this.zLevel); - tessellator.draw(); - - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - } - GL11.glPopMatrix(); - } - protected void drawGuiContainerForegroundLayer(ItemStack preview) { if(preview == null) return; From 76b51ebca951dea6788350c75c049f06b1f30dd4 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 16:04:30 +0200 Subject: [PATCH 4/9] BOIIIIIIIIIIIIIIIIII TS (type soul) getting a 20 hog code ( setro and minors? like in minecraft? I know nothing of association with setro and minors.) --- src/main/java/com/hbm/config/WorldConfig.java | 6 ++--- src/main/java/com/hbm/lib/HbmWorldGen.java | 22 +++++++++---------- .../com/hbm/world/gen/NTMWorldGenerator.java | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index 0eb14c026..f6faf2856 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -81,7 +81,7 @@ public class WorldConfig { public static boolean enableSulfurCave = true; public static boolean enableAsbestosCave = true; - public static int radioStructure = 500; +// public static int radioStructure = 500; public static int antennaStructure = 250; public static int atomStructure = 500; public static int dungeonStructure = 64; @@ -204,7 +204,7 @@ public class WorldConfig { enableAsbestosCave = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.C01_enableAsbestosCave", "Toggles asbestos caves", true); final String CATEGORY_DUNGEON = CommonConfig.CATEGORY_DUNGEONS; - radioStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.00_radioSpawn", "Spawn radio station on every nTH chunk", 500); +// radioStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.00_radioSpawn", "Spawn radio station on every nTH chunk", 500); antennaStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.01_antennaSpawn", "Spawn antenna on every nTH chunk", 250); atomStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.02_atomSpawn", "Spawn power plant on every nTH chunk", 500); dungeonStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.04_dungeonSpawn", "Spawn library dungeon on every nTH chunk", 64); @@ -245,7 +245,7 @@ public class WorldConfig { craterBiomeOuterRad = (float) CommonConfig.createConfigDouble(config, CATEGORY_BIOMES, "17.R02_craterBiomeOuterRad", "RAD/s for the outer crater biome", 0.5D); craterBiomeWaterMult = (float) CommonConfig.createConfigDouble(config, CATEGORY_BIOMES, "17.R03_craterBiomeWaterMult", "Multiplier for RAD/s in crater biomes when in water", 5D); - radioStructure = CommonConfig.setDefZero(radioStructure, 1000); +// radioStructure = CommonConfig.setDefZero(radioStructure, 1000); antennaStructure = CommonConfig.setDefZero(antennaStructure, 1000); atomStructure = CommonConfig.setDefZero(atomStructure, 1000); dungeonStructure = CommonConfig.setDefZero(dungeonStructure, 1000); diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 6bdbc7b8b..25d85495b 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -223,17 +223,17 @@ public class HbmWorldGen implements IWorldGenerator { } } - if(biome == BiomeGenBase.plains || biome == BiomeGenBase.desert) { - if(WorldConfig.radioStructure > 0 && rand.nextInt(WorldConfig.radioStructure) == 0) { - for(int a = 0; a < 1; a++) { - int x = i + rand.nextInt(16); - int z = j + rand.nextInt(16); - int y = world.getHeightValue(x, z); - - new Radio01().generate(world, rand, x, y, z); - } - } - } +// if(biome == BiomeGenBase.plains || biome == BiomeGenBase.desert) { +// if(WorldConfig.radioStructure > 0 && rand.nextInt(WorldConfig.radioStructure) == 0) { +// for(int a = 0; a < 1; a++) { +// int x = i + rand.nextInt(16); +// int z = j + rand.nextInt(16); +// int y = world.getHeightValue(x, z); +// +// new Radio01().generate(world, rand, x, y, z); +// } +// } +// } if(biome.temperature >= 0.4F && biome.rainfall <= 0.6F) { if(WorldConfig.antennaStructure > 0 && rand.nextInt(WorldConfig.antennaStructure) == 0) { diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index aefeedf4e..baf4a1a1b 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -47,7 +47,7 @@ public class NTMWorldGenerator implements IWorldGenerator { structure = new JigsawPiece("spire", StructureManager.spire, -1); spawnWeight = 2; }}); - + NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> !invalidBiomes.contains(biome); start = d -> new MapGenNTMFeatures.Start(d.getW(), d.getX(), d.getY(), d.getZ()); @@ -114,7 +114,7 @@ public class NTMWorldGenerator implements IWorldGenerator { NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = flatbiomes::contains; structure = new JigsawPiece("radio_house", StructureManager.radio_house, -6); - spawnWeight = 40; + spawnWeight = 30; }}); NBTStructure.registerNullWeight(0, 4, oceanBiomes::contains); From 848ac39463735dcf6a5e24a11dc2ad66aedec76f Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 17:24:58 +0200 Subject: [PATCH 5/9] resolve hopefully i hope --- src/main/java/com/hbm/world/gen/NTMWorldGenerator.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 049428707..9ea1272e2 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -40,6 +40,7 @@ public class NTMWorldGenerator implements IWorldGenerator { final List oceanBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean }); final List beachBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); final List lighthouseBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); + final List flatbiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.plains, BiomeGenBase.icePlains, BiomeGenBase.desert }); /// SPIRE /// NBTStructure.registerStructure(0, new SpawnCondition("spire") {{ @@ -113,6 +114,12 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); + NBTStructure.registerStructure(0, new SpawnCondition("radio") {{ + canSpawn = flatbiomes::contains; + structure = new JigsawPiece("radio_house", StructureManager.radio_house, -6); + spawnWeight = 30; + }}); + NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); From c978fa8955c6eddddce0f8d1e995ea626264fadb Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 28 Aug 2025 15:01:39 +1000 Subject: [PATCH 6/9] PWR printing device, exports a built PWR as a series of slices to be edited together for posting --- .../blocks/machine/MachinePWRController.java | 2 + .../inventory/gui/GUIScreenSlicePrinter.java | 127 +++++++++++++ .../inventory/gui/GUIScreenWikiRender.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 33 ++-- .../com/hbm/items/machine/ItemPWRPrinter.java | 173 ++++++++++++++++++ .../machine/TileEntityPWRController.java | 20 +- src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../assets/hbm/textures/items/pwr_printer.png | Bin 0 -> 433 bytes 8 files changed, 341 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java create mode 100644 src/main/java/com/hbm/items/machine/ItemPWRPrinter.java create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_printer.png diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 0d27ea490..61b9930dc 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -4,6 +4,7 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; import com.hbm.handler.threading.PacketThreading; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.packet.toclient.AuxParticlePacketNT; @@ -80,6 +81,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv if(!controller.assembled) { assemble(world, x, y, z, player); } else { + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.pwr_printer) return false; FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java new file mode 100644 index 000000000..f26624082 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java @@ -0,0 +1,127 @@ +package com.hbm.inventory.gui; + +import java.io.File; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.BlockPWR; +import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; + +import net.minecraft.block.Block; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; + +public class GUIScreenSlicePrinter extends GuiScreen { + + private final int x1, y1, z1; + private final int x2, y2, z2; + private final int sizeX, sizeY, sizeZ; + + private HashSet whitelist; + + private int yIndex; + + private RenderBlocks renderer; + + private String dirname; + private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); + + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2) { + this.x1 = Math.min(x1, x2); + this.y1 = Math.min(y1, y2); + this.z1 = Math.min(z1, z2); + this.x2 = Math.max(x1, x2); + this.y2 = Math.max(y1, y2); + this.z2 = Math.max(z1, z2); + + this.sizeX = this.x2 - this.x1 + 1; + this.sizeY = this.y2 - this.y1 + 1; + this.sizeZ = this.z2 - this.z1 + 1; + + dirname = dateFormat.format(new Date()).toString(); + } + + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, HashSet whitelist) { + this(x1, y1, z1, x2, y2, z2); + this.whitelist = whitelist; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + if(renderer == null) { + this.renderer = new RenderBlocks(mc.theWorld); + } + + GuiScreen.drawRect(0, 0, width, height, 0xFFFF00FF); + + // Once we've reached the top slice, close the GUI + if(yIndex >= sizeY) { + mc.thePlayer.addChatMessage(new ChatComponentText("Slices saved to: .minecraft/printer/" + dirname)); + mc.thePlayer.closeScreen(); + return; + } + + GL11.glPushMatrix(); + { + + setupRotation(); + + mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator.instance.startDrawingQuads(); + + for(int x = 0; x < sizeX; x++) { + for(int z = 0; z < sizeZ; z++) { + Block block = mc.theWorld.getBlock(x1 + x, y1 + yIndex, z1 + z); + if(whitelist != null && !whitelist.contains(block)) continue; + + // Revert PWR blocks to originals for slice rendering + if(block instanceof BlockPWR) { + TileEntity tile = mc.theWorld.getTileEntity(x1 + x, y1 + yIndex, z1 + z); + if(tile instanceof TileEntityBlockPWR) { + TileEntityBlockPWR pwr = (TileEntityBlockPWR) tile; + if(pwr.block != null) { + block = pwr.block; + } + } + } + + renderer.renderBlockByRenderType(block, x, 0, z); + } + } + + Tessellator.instance.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + + } + GL11.glPopMatrix(); + + File printerDir = new File(mc.mcDataDir, "printer"); + printerDir.mkdir(); + + GUIScreenWikiRender.saveScreenshot(printerDir, dirname, "slice_" + yIndex + ".png", 0, 0, mc.displayWidth, mc.displayHeight, 0xFFFF00FF); + + yIndex++; + } + + private void setupRotation() { + double scale = -24; + + GL11.glTranslated(width / 2, height / 2 - 36, 400); + GL11.glScaled(scale, scale, scale); + GL11.glScaled(1, 1, 0.5); //incredible flattening power + + GL11.glRotated(-30, 1, 0, 0); + GL11.glRotated(-45, 0, 1, 0); + GL11.glTranslated(sizeX / -2D, -sizeY / 2D, sizeZ / -2D); + } + +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java index 42b3c6b49..576f3bdf7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java @@ -116,7 +116,7 @@ public class GUIScreenWikiRender extends GuiScreen { // This implementation is based directly on ScreenShotHelper.saveScreenshot() // But allows for defining a rect where you want to sample pixels from - private static void saveScreenshot(File dataDir, String ssDir, String fileName, int x, int y, int width, int height, int transparentColor) { + public static void saveScreenshot(File dataDir, String ssDir, String fileName, int x, int y, int width, int height, int transparentColor) { try { File screenshotDirectory = new File(dataDir, ssDir); screenshotDirectory.mkdir(); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index f04a7218f..0bd86628a 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -64,7 +64,7 @@ import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; public class ModItems { - + public static HashSet excludeNEI = new HashSet(); public static void mainRegistry() { @@ -645,7 +645,7 @@ public class ModItems { public static Item seg_10; public static Item seg_15; public static Item seg_20; - + public static Item combine_scrap; public static Item shimmer_head; @@ -1035,6 +1035,7 @@ public class ModItems { public static Item pwr_fuel; public static Item pwr_fuel_hot; public static Item pwr_fuel_depleted; + public static Item pwr_printer; public static Item rbmk_lid; public static Item rbmk_lid_glass; @@ -1476,7 +1477,7 @@ public class ModItems { public static Item gun_aberrator_eott; public static Item gun_double_barrel; public static Item gun_double_barrel_sacred_dragon; - + public static Item gun_charge_thrower; public static Item ammo_standard; @@ -2072,7 +2073,7 @@ public class ModItems { public static Item hazmat_paa_boots; public static Item rebar_placer; - + public static Item wand; public static Item wand_s; public static Item wand_d; @@ -2234,7 +2235,7 @@ public class ModItems { public static Item conveyor_wand; public static void initializeItem() { - + redstone_sword = new RedstoneSword(ToolMaterial.STONE).setUnlocalizedName("redstone_sword").setCreativeTab(CreativeTabs.tabCombat).setTextureName(RefStrings.MODID + ":redstone_sword"); big_sword = new BigSword(ToolMaterial.EMERALD).setUnlocalizedName("big_sword").setCreativeTab(CreativeTabs.tabCombat).setTextureName(RefStrings.MODID + ":big_sword"); @@ -2966,7 +2967,7 @@ public class ModItems { gas_full = new ItemGasTank().setUnlocalizedName("gas_full").setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.gas_empty).setTextureName(RefStrings.MODID + ":gas_empty"); ItemSimpleConsumable.init(); - + //TODO: move all this crap to ItemSimpleConsumable syringe_empty = new Item().setUnlocalizedName("syringe_empty").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_empty"); syringe_metal_empty = new Item().setUnlocalizedName("syringe_metal_empty").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_metal_empty"); @@ -2976,7 +2977,7 @@ public class ModItems { syringe_metal_super = new ItemSyringe().setUnlocalizedName("syringe_metal_super").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_metal_super"); syringe_taint = new ItemSyringe().setUnlocalizedName("syringe_taint").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_taint"); syringe_mkunicorn = new ItemSyringe().setUnlocalizedName("syringe_mkunicorn").setFull3D().setCreativeTab(null).setTextureName(RefStrings.MODID + ":syringe_mkunicorn"); - + med_bag = new ItemSyringe().setUnlocalizedName("med_bag").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":med_bag"); radx = new ItemPill(0).setUnlocalizedName("radx").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":radx"); siox = new ItemPill(0).setUnlocalizedName("siox").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":siox"); @@ -3181,6 +3182,7 @@ public class ModItems { pwr_fuel = new ItemPWRFuel().setUnlocalizedName("pwr_fuel").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel"); pwr_fuel_hot = new ItemEnumMulti(EnumPWRFuel.class, true, false).setUnlocalizedName("pwr_fuel_hot").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel_hot"); pwr_fuel_depleted = new ItemEnumMulti(EnumPWRFuel.class, true, false).setUnlocalizedName("pwr_fuel_depleted").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel_depleted"); + pwr_printer = new ItemPWRPrinter().setUnlocalizedName("pwr_printer").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_printer"); rbmk_lid = new ItemRBMKLid().setUnlocalizedName("rbmk_lid").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":rbmk_lid"); rbmk_lid_glass = new ItemRBMKLid().setUnlocalizedName("rbmk_lid_glass").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":rbmk_lid_glass"); @@ -4512,7 +4514,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cmb_pickaxe").setTextureName(RefStrings.MODID + ":cmb_pickaxe"); - + cmb_axe = new ItemToolAbility(30F, 0, MainRegistry.tMatCMB, EnumToolType.AXE) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SMELTER, 0) @@ -4537,7 +4539,7 @@ public class ModItems { .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_pickaxe").setTextureName(RefStrings.MODID + ":elec_drill_anim"); - + elec_axe = new ItemToolAbilityPower(10F, 0, MainRegistry.tMatElec, EnumToolType.AXE, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) @@ -4546,14 +4548,14 @@ public class ModItems { .addAbility(IToolHarvestAbility.LUCK, 1) .addAbility(IWeaponAbility.CHAINSAW, 0) .addAbility(IWeaponAbility.BEHEADER, 0).setShears().setUnlocalizedName("elec_axe").setTextureName(RefStrings.MODID + ":elec_chainsaw_anim"); - + elec_shovel = new ItemToolAbilityPower(5F, 0, MainRegistry.tMatElec, EnumToolType.SHOVEL, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_shovel").setTextureName(RefStrings.MODID + ":elec_shovel_anim"); - + desh_sword = new ItemSwordAbility(12.5F, 0, MainRegistry.tMatDesh) .addAbility(IWeaponAbility.STUN, 0).setUnlocalizedName("desh_sword").setTextureName(RefStrings.MODID + ":desh_sword"); @@ -4563,7 +4565,7 @@ public class ModItems { .addAbility(IToolAreaAbility.RECURSION, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("desh_pickaxe").setTextureName(RefStrings.MODID + ":desh_pickaxe"); - + desh_axe = new ItemToolAbility(7.5F, -0.05, MainRegistry.tMatDesh, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 0) .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) @@ -4978,9 +4980,9 @@ public class ModItems { } private static void registerItem() { - + excludeNEI.add(item_secret); - + //Weapons GameRegistry.registerItem(redstone_sword, redstone_sword.getUnlocalizedName()); GameRegistry.registerItem(big_sword, big_sword.getUnlocalizedName()); @@ -5687,7 +5689,7 @@ public class ModItems { GameRegistry.registerItem(fluid_barrel_empty, fluid_barrel_empty.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_full, fluid_barrel_full.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_infinite, fluid_barrel_infinite.getUnlocalizedName()); - + //Packaged fluids GameRegistry.registerItem(fluid_pack_empty, fluid_pack_empty.getUnlocalizedName()); GameRegistry.registerItem(fluid_pack_full, fluid_pack_full.getUnlocalizedName()); @@ -5994,6 +5996,7 @@ public class ModItems { GameRegistry.registerItem(pwr_fuel, pwr_fuel.getUnlocalizedName()); GameRegistry.registerItem(pwr_fuel_hot, pwr_fuel_hot.getUnlocalizedName()); GameRegistry.registerItem(pwr_fuel_depleted, pwr_fuel_depleted.getUnlocalizedName()); + GameRegistry.registerItem(pwr_printer, pwr_printer.getUnlocalizedName()); //RBMK parts GameRegistry.registerItem(rbmk_lid, rbmk_lid.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java new file mode 100644 index 000000000..d7c3f5ee7 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java @@ -0,0 +1,173 @@ +package com.hbm.items.machine; + +import java.util.HashSet; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.BlockPWR; +import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; +import com.hbm.inventory.gui.GUIScreenSlicePrinter; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.TileEntityPWRController; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class ItemPWRPrinter extends Item implements IGUIProvider { + + private static int x1, y1, z1; + private static int x2, y2, z2; + private static Block[] blockSync; + + private HashSet fill = new HashSet<>(); + private static HashSet whitelist = new HashSet() {{ + add(ModBlocks.pwr_block); + add(ModBlocks.pwr_controller); + }}; + + // Piggybacking functions using the bytebuf TE sync + public static void serialize(World world, ByteBuf buf) { + buf.writeInt(x1); + buf.writeInt(y1); + buf.writeInt(z1); + buf.writeInt(x2); + buf.writeInt(y2); + buf.writeInt(z2); + + for(Block block : blockSync) { + buf.writeInt(Block.getIdFromBlock(block)); + } + + blockSync = null; + } + + public static void deserialize(World world, ByteBuf buf) { + x1 = buf.readInt(); + y1 = buf.readInt(); + z1 = buf.readInt(); + x2 = buf.readInt(); + y2 = buf.readInt(); + z2 = buf.readInt(); + + for(int x = x1; x <= x2; x++) { + for(int y = y1; y <= y2; y++) { + for(int z = z1; z <= z2; z++) { + Block block = Block.getBlockById(buf.readInt()); + + TileEntity tile = world.getTileEntity(x, y, z); + if(!(tile instanceof TileEntityBlockPWR)) continue; + ((TileEntityBlockPWR) tile).block = block; + } + } + } + + System.out.println("oh wow it synced and attempted to GUI!"); + + // Open the printer GUI on any client players holding the printer + // yeah it's a shit hack yay weee wooo + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if(player != null && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemPWRPrinter) { + FMLNetworkHandler.openGui(Minecraft.getMinecraft().thePlayer, MainRegistry.instance, 0, world, 0, 0, 0); + } + + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { + TileEntity tile = world.getTileEntity(x, y, z); + if(!(tile instanceof TileEntityPWRController)) return false; + if(world.isRemote) return true; + + TileEntityPWRController pwr = (TileEntityPWRController) tile; + syncAndScreenshot(world, pwr); + + return true; + } + + public void syncAndScreenshot(World world, TileEntityPWRController pwr) { + findBounds(world, pwr); + + int sizeX = x2 - x1 + 1; + int sizeY = y2 - y1 + 1; + int sizeZ = z2 - z1 + 1; + + blockSync = new Block[sizeX * sizeY * sizeZ]; + int i = 0; + + for(int x = x1; x <= x2; x++) { + for(int y = y1; y <= y2; y++) { + for(int z = z1; z <= z2; z++) { + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityBlockPWR) { + blockSync[i] = ((TileEntityBlockPWR) tile).block; + } + i++; + } + } + } + + pwr.isPrinting = true; + } + + public void findBounds(World world, TileEntityPWRController pwr) { + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(pwr.xCoord, pwr.yCoord, pwr.zCoord)).getOpposite(); + + fill.clear(); + fill.add(new BlockPos(pwr.xCoord, pwr.yCoord, pwr.zCoord)); + x1 = x2 = pwr.xCoord; + y1 = y2 = pwr.yCoord; + z1 = z2 = pwr.zCoord; + floodFill(world, pwr.xCoord + dir.offsetX, pwr.yCoord, pwr.zCoord + dir.offsetZ); + } + + public void floodFill(World world, int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + if(fill.contains(pos)) return; + + if(world.getBlock(x, y, z) instanceof BlockPWR) { + fill.add(pos); + + x1 = Math.min(x1, x); + y1 = Math.min(y1, y); + z1 = Math.min(z1, z); + x2 = Math.max(x2, x); + y2 = Math.max(y2, y); + z2 = Math.max(z2, z); + + floodFill(world, x + 1, y, z); + floodFill(world, x - 1, y, z); + floodFill(world, x, y + 1, z); + floodFill(world, x, y - 1, z); + floodFill(world, x, y, z + 1); + floodFill(world, x, y, z - 1); + } + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIScreenSlicePrinter(x1, y1, z1, x2, y2, z2, whitelist); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + list.add("Use on a constructed PWR controller to generate construction diagrams"); + } + +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 653ec66ca..1cff1e6e5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -12,12 +12,13 @@ import com.hbm.inventory.container.ContainerPWR; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Heatable; -import com.hbm.inventory.fluid.trait.FT_PWRModerator; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; +import com.hbm.inventory.fluid.trait.FT_PWRModerator; import com.hbm.inventory.gui.GUIPWR; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.items.machine.ItemPWRPrinter; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; @@ -375,8 +376,17 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG return this.rodCount + (int) Math.ceil(this.heatsinkCount / 4D); } + public boolean isPrinting; + @Override public void serialize(ByteBuf buf) { + buf.writeBoolean(isPrinting); + if(isPrinting) { + ItemPWRPrinter.serialize(worldObj, buf); + isPrinting = false; + return; + } + super.serialize(buf); buf.writeInt(this.rodCount); buf.writeLong(this.coreHeat); @@ -395,6 +405,14 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public void deserialize(ByteBuf buf) { + if(buf.readBoolean()) { + // piggybacking off of this packet so that we don't have to sync EVERY PWR + // block continuously to the client for one tiny screenshot tool + + ItemPWRPrinter.deserialize(worldObj, buf); + return; + } + super.deserialize(buf); this.rodCount = buf.readInt(); this.coreHeat = buf.readLong(); diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e772302f4..1ce70f12f 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4013,6 +4013,7 @@ item.pwr_fuel_hot.men.name=Hot MEN PWR Fuel Rod item.pwr_fuel_hot.mep.name=Hot MEP PWR Fuel Rod item.pwr_fuel_hot.meu.name=Hot MEU PWR Fuel Rod item.pwr_fuel_hot.mox.name=Hot MOX PWR Fuel Rod +item.pwr_printer.name=PWR Printer item.quartz_plutonium.name=Plutonic Quartz item.radar_linker.name=Radar Linker item.radaway.name=RadAway diff --git a/src/main/resources/assets/hbm/textures/items/pwr_printer.png b/src/main/resources/assets/hbm/textures/items/pwr_printer.png new file mode 100644 index 0000000000000000000000000000000000000000..a79ce1f2448d16a8180250315274362c2f06fef2 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4;$2!aJHjZQ!j&H|6fVg?4j10c+pb*+;VD9B#o>Fdh=l0$~YOvL&9x*I^DubwWB zAr_~T6C_w89M4{!_5a3?7mq9&J0@JKH#avgOR+QR<(W|+`RVm_eYFzjjVljl9{B$L z{?EiW=I_@TDqTLo;C$fTz3=wSK%guv%*@U%e)xNS{DT}eHn%oob^QerN17JhJow(; z+M0dN|M&Of*~<9*+W!ClZ~W))@Aik+&&%`J*Z)y_(;6>$k*8``5f3|mPKrfEg7RTo zYj?I<+e)^k#1HaPKF5s@JxH>z|Chq?r+`1bXQ9M_6CD?}#5r_6e13jD4+x}h$(2;| zpVxDh!R-q}%JT;zopr0C*Rjv;Y7A literal 0 HcmV?d00001 From a636440d136300f12ccbbfb0b4eb833ab3dcd26f Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 28 Aug 2025 15:47:22 +1000 Subject: [PATCH 7/9] rotate to always show controller at bottom right --- .../blocks/machine/MachinePWRController.java | 2 +- .../inventory/gui/GUIScreenSlicePrinter.java | 25 ++++++++++++++++--- .../com/hbm/items/machine/ItemPWRPrinter.java | 7 ++++-- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 61b9930dc..68007db4d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -56,7 +56,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { - return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); + return metadata == 0 && side != 0 && side != 1 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java index f26624082..915f99b1c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java @@ -18,12 +18,14 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; +import net.minecraftforge.common.util.ForgeDirection; public class GUIScreenSlicePrinter extends GuiScreen { private final int x1, y1, z1; private final int x2, y2, z2; private final int sizeX, sizeY, sizeZ; + private final ForgeDirection dir; private HashSet whitelist; @@ -34,7 +36,7 @@ public class GUIScreenSlicePrinter extends GuiScreen { private String dirname; private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); - public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2) { + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, ForgeDirection dir) { this.x1 = Math.min(x1, x2); this.y1 = Math.min(y1, y2); this.z1 = Math.min(z1, z2); @@ -42,6 +44,8 @@ public class GUIScreenSlicePrinter extends GuiScreen { this.y2 = Math.max(y1, y2); this.z2 = Math.max(z1, z2); + this.dir = dir; + this.sizeX = this.x2 - this.x1 + 1; this.sizeY = this.y2 - this.y1 + 1; this.sizeZ = this.z2 - this.z1 + 1; @@ -49,8 +53,8 @@ public class GUIScreenSlicePrinter extends GuiScreen { dirname = dateFormat.format(new Date()).toString(); } - public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, HashSet whitelist) { - this(x1, y1, z1, x2, y2, z2); + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, ForgeDirection dir, HashSet whitelist) { + this(x1, y1, z1, x2, y2, z2, dir); this.whitelist = whitelist; } @@ -121,7 +125,20 @@ public class GUIScreenSlicePrinter extends GuiScreen { GL11.glRotated(-30, 1, 0, 0); GL11.glRotated(-45, 0, 1, 0); - GL11.glTranslated(sizeX / -2D, -sizeY / 2D, sizeZ / -2D); + + if(dir == ForgeDirection.WEST) { + GL11.glRotated(180, 0, 1, 0); + } else if(dir == ForgeDirection.NORTH) { + GL11.glRotated(-90, 0, 1, 0); + } else if(dir == ForgeDirection.SOUTH) { + GL11.glRotated(90, 0, 1, 0); + } + + if(dir == ForgeDirection.WEST || dir == ForgeDirection.EAST) { + GL11.glTranslated(sizeX / -2D, -sizeY / 2D, sizeZ / -2D); + } else { + GL11.glTranslated(sizeZ / -2D, -sizeY / 2D, sizeX / -2D); + } } } diff --git a/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java index d7c3f5ee7..1ef5ec736 100644 --- a/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java +++ b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java @@ -29,6 +29,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { private static int x1, y1, z1; private static int x2, y2, z2; private static Block[] blockSync; + private static ForgeDirection dir; private HashSet fill = new HashSet<>(); private static HashSet whitelist = new HashSet() {{ @@ -44,6 +45,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { buf.writeInt(x2); buf.writeInt(y2); buf.writeInt(z2); + buf.writeInt(dir.ordinal()); for(Block block : blockSync) { buf.writeInt(Block.getIdFromBlock(block)); @@ -59,6 +61,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { x2 = buf.readInt(); y2 = buf.readInt(); z2 = buf.readInt(); + dir = ForgeDirection.values()[buf.readInt()]; for(int x = x1; x <= x2; x++) { for(int y = y1; y <= y2; y++) { @@ -121,7 +124,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { } public void findBounds(World world, TileEntityPWRController pwr) { - ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(pwr.xCoord, pwr.yCoord, pwr.zCoord)).getOpposite(); + dir = ForgeDirection.getOrientation(world.getBlockMetadata(pwr.xCoord, pwr.yCoord, pwr.zCoord)).getOpposite(); fill.clear(); fill.add(new BlockPos(pwr.xCoord, pwr.yCoord, pwr.zCoord)); @@ -161,7 +164,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIScreenSlicePrinter(x1, y1, z1, x2, y2, z2, whitelist); + return new GUIScreenSlicePrinter(x1, y1, z1, x2, y2, z2, dir, whitelist); } @SuppressWarnings({ "unchecked", "rawtypes" }) From 4fba0fc42a5e8668311b8f721c84f8a45435fef4 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 29 Aug 2025 15:18:26 +0200 Subject: [PATCH 8/9] i forgor --- changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog b/changelog index 1751d00af..191a7880f 100644 --- a/changelog +++ b/changelog @@ -1,5 +1,6 @@ ## Changed -* Updated ukrainian and chinese localization, including QMAW +* Updated ukrainian, chinese and russian localization, including QMAW +* Some previously hardcoded lang strings are now affected by translations * Due to severe issues with ticking order as well as a crash caused by certain tiles that uses threaded packets, Torcherino accelerator torches no longer affect NTM machines * RBMK control rod colors and auto control rod settings are now copiable * Murky wings no longer have slowfall, and using shift+space cancels the momentum From 53d1323604a409da848b4b2393cf486f9529c3d3 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 31 Aug 2025 12:08:19 +0200 Subject: [PATCH 9/9] i lied, get fucked --- .../java/com/hbm/entity/EntityMappings.java | 1 + .../projectile/EntityBulletBeamBase.java | 117 +- .../com/hbm/entity/projectile/EntityCoin.java | 51 + .../ae2/ArcFurnaceLargeMEInventory.java | 51 +- src/main/java/com/hbm/items/ModItems.java | 3 +- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 5 +- .../sedna/factory/GunFactoryClient.java | 3 + .../weapon/sedna/factory/LegoClient.java | 19 + .../sedna/factory/XFactoryAccelerator.java | 59 + .../items/weapon/sedna/impl/ItemGunNI4NI.java | 110 + .../weapon/sedna/mags/MagazineInfinite.java | 39 + src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 3 + .../render/entity/projectile/RenderCoin.java | 39 + .../item/weapon/sedna/ItemRenderNI4NI.java | 189 ++ src/main/java/com/hbm/util/ColorUtil.java | 24 + src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../assets/hbm/models/weapons/n_i_4_n_i.obj | 2082 +++++++++++++++++ .../textures/models/trinkets/chip_gold.png | Bin 0 -> 1817 bytes .../hbm/textures/models/weapons/n_i_4_n_i.png | Bin 0 -> 3361 bytes .../models/weapons/n_i_4_n_i_greyscale.png | Bin 0 -> 3346 bytes 22 files changed, 2765 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/hbm/entity/projectile/EntityCoin.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java create mode 100644 src/main/java/com/hbm/render/entity/projectile/RenderCoin.java create mode 100644 src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java create mode 100644 src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj create mode 100644 src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 324c67a97..5f50d8f1a 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -205,6 +205,7 @@ public class EntityMappings { addEntity(EntityFallingBlockNT.class, "entity_falling_block_nt", 1000); addEntity(EntityBoatRubber.class, "entity_rubber_boat", 250, false); addEntity(EntityMissileStealth.class, "entity_missile_stealth", 1000); + addEntity(EntityCoin.class, "entity_coin", 1000); addEntity(EntityItemWaste.class, "entity_item_waste", 100); addEntity(EntityItemBuoyant.class, "entity_item_buoyant", 100); diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java index 036971822..b14a5f80b 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java @@ -2,14 +2,19 @@ package com.hbm.entity.projectile; import java.util.List; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; @@ -144,9 +149,30 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(!this.worldObj.isRemote && this.doesImpactEntities()) { Entity hitEntity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.headingX, this.headingY, this.headingZ).expand(1.0D, 1.0D, 1.0D)); + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.headingX, this.headingY, this.headingZ).expand(1.0D, 1.0D, 1.0D)); double nearest = 0.0D; MovingObjectPosition nonPenImpact = null; + MovingObjectPosition coinHit = null; + + double closestCoin = 0; + EntityCoin hitCoin = null; + + for(Entity entity : list) { + if(entity.isDead) continue; + if(entity instanceof EntityCoin) { + double hitbox = 0.3F; + AxisAlignedBB aabb = entity.boundingBox.expand(hitbox, hitbox, hitbox); + MovingObjectPosition hitMop = aabb.calculateIntercept(pos, nextPos); + if(hitMop != null) { + double dist = pos.distanceTo(hitMop.hitVec); + if(closestCoin == 0 || dist < closestCoin) { + closestCoin = dist; + hitCoin = (EntityCoin) entity; + coinHit = hitMop; + } + } + } + } for(int j = 0; j < list.size(); ++j) { Entity entity = (Entity) list.get(j); @@ -158,13 +184,14 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(hitMop != null) { + double dist = pos.distanceTo(hitMop.hitVec); + // if penetration is enabled, run impact for all intersecting entities if(this.doesPenetrate()) { - this.onImpact(new MovingObjectPosition(entity, hitMop.hitVec)); + if(hitCoin == null || dist < closestCoin) { + this.onImpact(new MovingObjectPosition(entity, hitMop.hitVec)); + } } else { - - double dist = pos.distanceTo(hitMop.hitVec); - if(dist < nearest || nearest == 0.0D) { hitEntity = entity; nearest = dist; @@ -179,6 +206,86 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(!this.doesPenetrate() && hitEntity != null) { mop = new MovingObjectPosition(hitEntity, nonPenImpact.hitVec); } + + if(hitCoin != null) { + Vec3 vec = Vec3.createVectorHelper(coinHit.hitVec.xCoord - posX, coinHit.hitVec.yCoord - posY, coinHit.hitVec.zCoord - posZ); + this.beamLength = vec.lengthVector(); + + double range = 50; + List targets = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord).expand(range, range, range)); + Entity nearestCoin = null; + Entity nearestPlayer = null; + Entity nearestMob = null; + Entity nearestOther = null; + double coinDist = 0; + double playerDist = 0; + double mobDist = 0; + double otherDist = 0; + + hitCoin.setDead(); + + // well i mean we could just uuse a single var for all variants and then overwrite stuff + // when we run into things with higher priority. however i can't be assed fuck off + for(Entity entity : targets) { + if(entity == this.getThrower()) continue; + if(entity.isDead) continue; + double dist = entity.getDistanceToEntity(hitCoin); + if(dist > range) continue; + + if(entity instanceof EntityCoin) { + if(coinDist == 0 || dist < coinDist) { + coinDist = dist; + nearestCoin = entity; + } + } else if(entity instanceof EntityPlayer) { + if(playerDist == 0 || dist < playerDist) { + playerDist = dist; + nearestPlayer = entity; + } + } else if(entity instanceof EntityMob) { + if(mobDist == 0 || dist < mobDist) { + mobDist = dist; + nearestMob = entity; + } + } else if(entity instanceof EntityLivingBase) { + if(otherDist == 0 || dist < otherDist) { + otherDist = dist; + nearestOther = entity; + } + } + } + + // ternary of shame + Entity target = nearestCoin != null ? nearestCoin : + nearestPlayer != null ? nearestPlayer : + nearestMob != null ? nearestMob : + nearestOther != null ? nearestOther : null; + + if(target != null) { + EntityBulletBeamBase newBeam = new EntityBulletBeamBase(hitCoin.getThrower() != null ? hitCoin.getThrower() : this.thrower, this.config, this.damage * 1.25F); + newBeam.setPosition(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord); + Vec3 delta = Vec3.createVectorHelper(target.posX - newBeam.posX, (target.posY + target.height / 2D) - newBeam.posY, target.posZ - newBeam.posZ); + newBeam.setRotationsFromVector(delta); + newBeam.performHitscanExternal(delta.lengthVector()); + worldObj.spawnEntityInWorld(newBeam); + } else { + EntityBulletBeamBase newBeam = new EntityBulletBeamBase(hitCoin.getThrower() != null ? hitCoin.getThrower() : this.thrower, this.config, this.damage * 1.25F); + newBeam.setPosition(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord); + newBeam.setRotationsFromVector(Vec3.createVectorHelper(rand.nextGaussian() * 0.5, -1, rand.nextGaussian() * 0.5)); + newBeam.performHitscanExternal(100); + worldObj.spawnEntityInWorld(newBeam); + } + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "vanillaExt"); + data.setString("mode", "largeexplode"); + data.setFloat("size", 1.5F); + data.setByte("count", (byte)1); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord), new TargetPoint(worldObj.provider.dimensionId, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord, 100)); + + + return; + } } if(mop != null) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityCoin.java b/src/main/java/com/hbm/entity/projectile/EntityCoin.java new file mode 100644 index 000000000..15b1c6a33 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityCoin.java @@ -0,0 +1,51 @@ +package com.hbm.entity.projectile; + +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class EntityCoin extends EntityThrowableInterp { + + public EntityCoin(World world) { + super(world); + this.setSize(1F, 1F); + this.yOffset = 0.5F; + } + + @Override + public void onUpdate() { + super.onUpdate(); + } + + public void setPosition(double x, double y, double z) { + this.posX = x; + this.posY = y; + this.posZ = z; + float f = this.width / 2.0F; + this.boundingBox.setBounds(x - f, y - this.yOffset + this.ySize, z - f, x + f, y - this.yOffset + this.ySize + this.height, z + f); + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + if(mop.typeOfHit == mop.typeOfHit.BLOCK) this.setDead(); + } + + @Override + protected float getAirDrag() { + return 1F; + } + + @Override + public double getGravityVelocity() { + return 0.02D; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean canAttackWithItem() { + return true; + } +} diff --git a/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java b/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java index 5698bebed..3245629e6 100644 --- a/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java +++ b/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java @@ -1,7 +1,6 @@ package com.hbm.handler.ae2; import com.hbm.tileentity.machine.TileEntityMachineArcFurnaceLarge; -import com.hbm.tileentity.TileEntityProxyCombo; import cpw.mods.fml.common.Optional; @@ -14,47 +13,47 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import net.minecraft.item.ItemStack; -@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2")}) +@Optional.InterfaceList({ @Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2") }) public class ArcFurnaceLargeMEInventory implements IMEInventory { - private TileEntityMachineArcFurnaceLarge afl; + private TileEntityMachineArcFurnaceLarge afl; - public ArcFurnaceLargeMEInventory(TileEntityMachineArcFurnaceLarge afl) { - this.afl = afl; - } + public ArcFurnaceLargeMEInventory(TileEntityMachineArcFurnaceLarge afl) { + this.afl = afl; + } - @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { - ItemStack is = input.getItemStack(); - is = afl.distributeInput(is, type == Actionable.MODULATE); + @Override + public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { + ItemStack is = input.getItemStack(); + is = afl.distributeInput(is, type == Actionable.MODULATE); if(is == null) return null; - return AEApi.instance().storage().createItemStack(is); - } + return AEApi.instance().storage().createItemStack(is); + } - @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { + @Override + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { ItemStack is = request.getItemStack(); is = afl.collectRequested(is, mode == Actionable.MODULATE); if(is == null) return null; return AEApi.instance().storage().createItemStack(is); - } + } - @Override - public IItemList getAvailableItems(IItemList out) { - ItemStack is; + @Override + public IItemList getAvailableItems(IItemList out) { + ItemStack is; for(int i = 0; i < 25; i++) { is = afl.getAvailableItemFromSlot(i); - if(is != null) out.add(AEApi.instance().storage().createItemStack(is)); + if(is != null) + out.add(AEApi.instance().storage().createItemStack(is)); } - return out; - } - - @Override - public StorageChannel getChannel() { - return StorageChannel.ITEMS; - } + return out; + } + @Override + public StorageChannel getChannel() { + return StorageChannel.ITEMS; + } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 8a8c42675..0025e1f51 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1476,7 +1476,7 @@ public class ModItems { public static Item gun_aberrator_eott; public static Item gun_double_barrel; public static Item gun_double_barrel_sacred_dragon; - public static Item gun_n_i_4_n_i; // we GET THERE when we GET THERE + public static Item gun_n_i_4_n_i; public static Item gun_charge_thrower; @@ -6400,6 +6400,7 @@ public class ModItems { GameRegistry.registerItem(gun_aberrator_eott, gun_aberrator_eott.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel, gun_double_barrel.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel_sacred_dragon, gun_double_barrel_sacred_dragon.getUnlocalizedName()); + GameRegistry.registerItem(gun_n_i_4_n_i, gun_n_i_4_n_i.getUnlocalizedName()); GameRegistry.registerItem(gun_fireext, gun_fireext.getUnlocalizedName()); GameRegistry.registerItem(gun_charge_thrower, gun_charge_thrower.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index c43550972..f950c9590 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -19,6 +19,7 @@ import com.hbm.items.IKeybindReceiver; import com.hbm.items.armor.ArmorTrenchmaster; import com.hbm.items.weapon.sedna.hud.IHUDComponent; import com.hbm.items.weapon.sedna.mags.IMagazine; +import com.hbm.items.weapon.sedna.mags.MagazineInfinite; import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -173,7 +174,9 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I GunConfig config = getConfig(stack, i); for(Receiver rec : config.getReceivers(stack)) { IMagazine mag = rec.getMagazine(stack); - list.add(I18nUtil.resolveKey("gui.weapon.ammo") + ": " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); + if(!(mag instanceof MagazineInfinite)) { + list.add(I18nUtil.resolveKey("gui.weapon.ammo") + ": " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); + } float dmg = rec.getBaseDamage(stack); list.add(I18nUtil.resolveKey("gui.weapon.baseDamage") + ": " + FORMAT_DMG.format(dmg)); if(mag.getType(stack, player.inventory) instanceof BulletConfig) { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index dfa406299..acca45ca7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -101,6 +101,7 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_charge_thrower, new ItemRenderChargeThrower()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_n_i_4_n_i, new ItemRenderNI4NI()); //PROJECTILES ammo_debug.setRenderer(LegoClient.RENDER_STANDARD_BULLET); @@ -226,6 +227,8 @@ public class GunFactoryClient { p35800.setRendererBeam(LegoClient.RENDER_CRACKLE); p35800_bl.setRendererBeam(LegoClient.RENDER_BLACK_LIGHTNING); + + ni4ni_arc.setRendererBeam(LegoClient.RENDER_NI4NI_BOLT); ct_hook.setRenderer(LegoClient.RENDER_CT_HOOK); ct_mortar.setRenderer(LegoClient.RENDER_CT_MORTAR); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index 0b835d173..a2bf670d2 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -397,6 +397,25 @@ public class LegoClient { GL11.glPopMatrix(); RenderArcFurnace.fullbright(false); }; + + public static BiConsumer RENDER_NI4NI_BOLT = (bullet, interp) -> { + + RenderArcFurnace.fullbright(true); + double age = MathHelper.clamp_double(1D - ((double) bullet.ticksExisted - 2 + interp) / (double) bullet.getBulletConfig().expires, 0, 1); + + GL11.glPushMatrix(); + GL11.glRotatef(180 - bullet.rotationYaw, 0, 1F, 0); + GL11.glRotatef(-bullet.rotationPitch - 90, 1F, 0, 0); + + double scale = 5D; + GL11.glScaled(age * scale, 1, age * scale); + GL11.glTranslated(0, bullet.beamLength, 0); + GL11.glRotatef(-90, 0, 0, 1); + renderBulletStandard(Tessellator.instance, 0xAAD2E5, 0xffffff, bullet.beamLength, true); + + GL11.glPopMatrix(); + RenderArcFurnace.fullbright(false); + }; public static BiConsumer RENDER_LASER_RED = (bullet, interp) -> { renderStandardLaser(bullet, interp, 0x80, 0x15, 0x15); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java index 7f8bfa5a9..86905b000 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java @@ -5,6 +5,7 @@ import java.util.function.BiFunction; import java.util.function.Consumer; import com.hbm.entity.projectile.EntityBulletBeamBase; +import com.hbm.entity.projectile.EntityCoin; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -14,7 +15,9 @@ import com.hbm.items.weapon.sedna.Receiver; import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.impl.ItemGunNI4NI; import com.hbm.items.weapon.sedna.mags.MagazineBelt; +import com.hbm.items.weapon.sedna.mags.MagazineInfinite; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; import com.hbm.main.MainRegistry; import com.hbm.render.anim.BusAnimation; @@ -22,11 +25,13 @@ import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.util.DamageResistanceHandler.DamageClass; +import com.hbm.util.Vec3NT; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; @@ -41,6 +46,8 @@ public class XFactoryAccelerator { public static BulletConfig coil_tungsten; public static BulletConfig coil_ferrouranium; + public static BulletConfig ni4ni_arc; + public static Consumer LAMBDA_UPDATE_TUNGSTEN = (entity) -> {breakInPath(entity, 1.25F); }; public static Consumer LAMBDA_UPDATE_FERRO = (entity) -> { breakInPath(entity, 2.5F); }; @@ -89,6 +96,9 @@ public class XFactoryAccelerator { .setOnUpdate(LAMBDA_UPDATE_TUNGSTEN); coil_ferrouranium = new BulletConfig().setItem(EnumAmmo.COIL_FERROURANIUM).setVel(7.5F).setLife(50).setDoesPenetrate(true).setDamageFalloffByPen(false).setSpectral(true) .setOnUpdate(LAMBDA_UPDATE_FERRO); + + ni4ni_arc = new BulletConfig().setupDamageClass(DamageClass.PHYSICAL).setBeam().setLife(5).setThresholdNegation(10F).setArmorPiercing(0.2F).setRenderRotations(false).setDoesPenetrate(false) + .setOnBeamImpact(BulletConfig.LAMBDA_BEAM_HIT); tauChargeMag.addConfigs(tau_uranium_charge); @@ -118,6 +128,18 @@ public class XFactoryAccelerator { .setupStandardConfiguration() .anim(LAMBDA_COILGUN_ANIMS).orchestra(Orchestras.ORCHESTRA_COILGUN) ).setUnlocalizedName("gun_coilgun"); + + ModItems.gun_n_i_4_n_i = new ItemGunNI4NI(WeaponQuality.SPECIAL, new GunConfig() + .dura(0).draw(5).inspect(39).crosshair(Crosshair.CIRCLE) + .rec(new Receiver(0) + .dmg(35F).delay(10).sound("hbm:weapon.coilgunShoot", 1.0F, 1.0F) + .mag(new MagazineInfinite(ni4ni_arc)) + .offset(0.75, -0.0625, -0.1875D) + .setupStandardFire().fire(Lego.LAMBDA_NOWEAR_FIRE)) + .setupStandardConfiguration() + .ps(LAMBDA_NI4NI_SECONDARY_PRESS) + .anim(LAMBDA_NI4NI_ANIMS).orchestra(Orchestras.ORCHESTRA_COILGUN) + ).setUnlocalizedName("gun_n_i_4_n_i"); } public static BiConsumer LAMBDA_TAU_PRIMARY_RELEASE = (stack, ctx) -> { @@ -163,6 +185,27 @@ public class XFactoryAccelerator { } }; + public static BiConsumer LAMBDA_NI4NI_SECONDARY_PRESS = (stack, ctx) -> { + if(ctx.getPlayer() == null) return; + EntityPlayer player = ctx.getPlayer(); + + if(ItemGunNI4NI.getCoinCount(stack) > 0) { + Vec3NT vec = new Vec3NT(player.getLookVec()).multiply(0.8D); + EntityCoin coin = new EntityCoin(player.worldObj); + coin.setPosition(player.posX, player.posY + player.getEyeHeight() - coin.yOffset - 0.125, player.posZ); + coin.motionX = vec.xCoord; + coin.motionY = vec.yCoord + 0.5; + coin.motionZ = vec.zCoord; + coin.rotationYaw = player.rotationYaw; + coin.setThrower(player); + player.worldObj.spawnEntityInWorld(coin); + + player.worldObj.playSoundAtEntity(player, "random.orb", 1.0F, 1F + player.getRNG().nextFloat() * 0.25F); + + ItemGunNI4NI.setCoinCount(stack, ItemGunNI4NI.getCoinCount(stack) - 1); + } + }; + public static BiConsumer LAMBDA_RECOIL_TAU = (stack, ctx) -> { }; public static BiConsumer LAMBDA_RECOIL_COILGUN = (stack, ctx) -> { @@ -196,4 +239,20 @@ public class XFactoryAccelerator { if(type == AnimType.RELOAD) return new BusAnimation().addBus("RELOAD", new BusAnimationSequence().addPos(1, 0, 0, 250).addPos(1, 0, 0, 500).addPos(0, 0, 0, 250)); return null; }; + + @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_NI4NI_ANIMS = (stack, type) -> { + switch(type) { + case EQUIP: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(-360 * 2, 0, 0, 500)); + case CYCLE: + boolean aiming = ItemGunBaseNT.getIsAiming(stack); + return new BusAnimation() + .addBus("RECOIL", new BusAnimationSequence().addPos(aiming ? -5 : -30, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 150, IType.SIN_FULL)) + .addBus("DRUM", new BusAnimationSequence().hold(50).addPos(0, 0, 120, 300, IType.SIN_FULL)); + case INSPECT: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(-360 * 3, 0, 0, 750).hold(100).addPos(0, 0, 0, 750)); + } + + return null; + }; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java new file mode 100644 index 000000000..71619f721 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java @@ -0,0 +1,110 @@ +package com.hbm.items.weapon.sedna.impl; + +import java.util.List; + +import com.hbm.items.ICustomizable; +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.util.ChatBuilder; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemGunNI4NI extends ItemGunBaseNT implements ICustomizable { + + public ItemGunNI4NI(WeaponQuality quality, GunConfig... cfg) { + super(quality, cfg); + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isHeld) { + super.onUpdate(stack, world, entity, slot, isHeld); + + if(!world.isRemote) { + if(this.getCoinCount(stack) < 4) { + this.setCoinCharge(stack, this.getCoinCharge(stack) + 1); + + if(this.getCoinCharge(stack) >= 80) { + this.setCoinCharge(stack, 0); + int newCount = this.getCoinCount(stack) + 1; + this.setCoinCount(stack, newCount); + + if(isHeld) { + world.playSoundAtEntity(entity, "hbm:item.techBoop", 1.0F, 1.25F + newCount * 0.125F); + } + } + } + } + } + + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add("Now, don't get the wrong idea."); + list.add("I " + EnumChatFormatting.RED + "fucking hate " + EnumChatFormatting.GRAY + "this game."); + list.add("I didn't do this for you, I did it for sea."); + super.addInformation(stack, player, list, ext); + } + + @Override + public void customize(EntityPlayer player, ItemStack stack, String... args) { + + if(args.length == 0) { + resetColors(stack); + player.addChatComponentMessage(ChatBuilder.start("Colors reset!").color(EnumChatFormatting.GREEN).flush()); + return; + } + + if(args.length != 3) { + resetColors(stack); + player.addChatComponentMessage(ChatBuilder.start("Requires three hexadecimal colors!").color(EnumChatFormatting.RED).flush()); + return; + } + + try { + int dark = Integer.parseInt(args[0], 16); + int light = Integer.parseInt(args[1], 16); + int grip = Integer.parseInt(args[2], 16); + + if(dark < 0 || dark > 0xffffff || light < 0 || light > 0xffffff || grip < 0 || grip > 0xffffff) { + player.addChatComponentMessage(ChatBuilder.start("Colors must range from 0 to FFFFFF!").color(EnumChatFormatting.RED).flush()); + return; + } + + setColors(stack, dark, light, grip); + player.addChatComponentMessage(ChatBuilder.start("Colors set!").color(EnumChatFormatting.GREEN).flush()); + + } catch(Throwable ex) { + player.addChatComponentMessage(ChatBuilder.start(ex.getLocalizedMessage()).color(EnumChatFormatting.RED).flush()); + } + } + + public static void resetColors(ItemStack stack) { + if(!stack.hasTagCompound()) return; + stack.stackTagCompound.removeTag("colors"); + } + + public static void setColors(ItemStack stack, int dark, int light, int grip) { + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setIntArray("colors", new int[] {dark, light, grip}); + } + + public static int[] getColors(ItemStack stack) { + if(!stack.hasTagCompound() || !stack.stackTagCompound.hasKey("colors")) return null; + int[] colors = stack.stackTagCompound.getIntArray("colors"); + if(colors.length != 3) return null; + return colors; + } + + public static final String KEY_COIN_COUNT = "coincount"; + public static final String KEY_COIN_CHARGE = "coincharge"; + public static int getCoinCount(ItemStack stack) { return getValueInt(stack, KEY_COIN_COUNT); } + public static void setCoinCount(ItemStack stack, int value) { setValueInt(stack, KEY_COIN_COUNT, value); } + public static int getCoinCharge(ItemStack stack) { return getValueInt(stack, KEY_COIN_CHARGE); } + public static void setCoinCharge(ItemStack stack, int value) { setValueInt(stack, KEY_COIN_CHARGE, value); } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java new file mode 100644 index 000000000..263d4134b --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java @@ -0,0 +1,39 @@ +package com.hbm.items.weapon.sedna.mags; + +import com.hbm.items.ModItems; +import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.particle.SpentCasing; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class MagazineInfinite implements IMagazine { + + public BulletConfig type; + + public MagazineInfinite(BulletConfig type) { + this.type = type; + } + + @Override + public Object getType(ItemStack stack, IInventory inventory) { + return this.type; + } + + @Override public void setType(ItemStack stack, Object type) { } + @Override public int getCapacity(ItemStack stack) { return 9999; } + @Override public int getAmount(ItemStack stack, IInventory inventory) { return 9999; } + @Override public void setAmount(ItemStack stack, int amount) { } + @Override public void useUpAmmo(ItemStack stack, IInventory inventory, int amount) { } + @Override public boolean canReload(ItemStack stack, IInventory inventory) { return false; } + @Override public void initNewType(ItemStack stack, IInventory inventory) { } + @Override public void reloadAction(ItemStack stack, IInventory inventory) { } + @Override public ItemStack getIconForHUD(ItemStack stack, EntityPlayer player) { return new ItemStack(ModItems.nothing); } + @Override public String reportAmmoStateForHUD(ItemStack stack, EntityPlayer player) { return "∞"; } + @Override public SpentCasing getCasing(ItemStack stack, IInventory inventory) { return this.type.casing; } + @Override public void setAmountBeforeReload(ItemStack stack, int amount) { } + @Override public int getAmountBeforeReload(ItemStack stack) { return 9999; } + @Override public void setAmountAfterReload(ItemStack stack, int amount) { } + @Override public int getAmountAfterReload(ItemStack stack) { return 9999; } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index ef36a2084..711e5cbd6 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -619,6 +619,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryRocket.class, new RenderArtilleryRocket()); RenderingRegistry.registerEntityRenderingHandler(EntityCog.class, new RenderCog()); RenderingRegistry.registerEntityRenderingHandler(EntitySawblade.class, new RenderSawblade()); + RenderingRegistry.registerEntityRenderingHandler(EntityCoin.class, new RenderCoin()); RenderingRegistry.registerEntityRenderingHandler(EntityChemical.class, new RenderChemical()); RenderingRegistry.registerEntityRenderingHandler(EntityMist.class, new RenderMist()); RenderingRegistry.registerEntityRenderingHandler(EntityFireLingering.class, new RenderMist()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index bc109ad26..8f51419f4 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -907,6 +907,7 @@ public class ResourceManager { public static final IModelCustom aberrator = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/aberrator.obj")).asVBO(); public static final IModelCustom mas36 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/mas36.obj")).asVBO(); public static final IModelCustom charge_thrower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/charge_thrower.obj")).asVBO(); + public static final IModelCustom n_i_4_n_i = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/n_i_4_n_i.obj")).asVBO(); public static final HashMap spas_12_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/spas12.json")); public static final HashMap congolake_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/congolake.json")); @@ -1044,6 +1045,8 @@ public class ResourceManager { public static final ResourceLocation charge_thrower_hook_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_hook.png"); public static final ResourceLocation charge_thrower_mortar_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_mortar.png"); public static final ResourceLocation charge_thrower_rocket_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_rocket.png"); + public static final ResourceLocation n_i_4_n_i_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/n_i_4_n_i.png"); + public static final ResourceLocation n_i_4_n_i_greyscale_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/n_i_4_n_i_greyscale.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java b/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java new file mode 100644 index 000000000..9948c3573 --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java @@ -0,0 +1,39 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.render.loader.HFRWavefrontObject; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IModelCustom; + +public class RenderCoin extends Render { + + public static final IModelCustom coin = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/chip.obj")).asVBO(); + public static final ResourceLocation coin_tex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/chip_gold.png"); + + @Override + public void doRender(Entity coin, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + GL11.glRotatef(coin.prevRotationYaw + (coin.rotationYaw - coin.prevRotationYaw) * f1 - 90.0F, 0.0F, -1.0F, 0.0F); + GL11.glRotated((coin.ticksExisted + f1) * 45, 0, 0, 1); + + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); + + this.bindEntityTexture(coin); + this.coin.renderAll(); + + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return coin_tex; + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java new file mode 100644 index 000000000..ce4f8a846 --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java @@ -0,0 +1,189 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.impl.ItemGunNI4NI; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; +import com.hbm.render.tileentity.RenderArcFurnace; +import com.hbm.util.ColorUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; + +public class ItemRenderNI4NI extends ItemRenderWeaponBase { + + @Override + protected float getTurnMagnitude(ItemStack stack) { return ItemGunBaseNT.getIsAiming(stack) ? 2.5F : -0.25F; } + + @Override + public float getViewFOV(ItemStack stack, float fov) { + float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; + return fov * (1 - aimingProgress * 0.33F); + } + + @Override + public void setupFirstPerson(ItemStack stack) { + GL11.glTranslated(0, 0, 1); + + float offset = 0.8F; + standardAimingTransform(stack, + -1.0F * offset, -1F * offset, 1F * offset, + 0, -5 / 8D, 0.125); + } + + @Override + public void renderFirstPerson(ItemStack stack) { + + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + + int[] color = ItemGunNI4NI.getColors(stack); + int dark = 0xffffff; + int light = 0xffffff; + int grip = 0xffffff; + if(color != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_greyscale_tex); + dark = color[0]; + light = color[1]; + grip = color[2]; + } else { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_tex); + } + + double scale = 0.3125D; + GL11.glScaled(scale, scale, scale); + + double[] equip = HbmAnimations.getRelevantTransformation("EQUIP"); + double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL"); + double[] drum = HbmAnimations.getRelevantTransformation("DRUM"); + + GL11.glTranslated(0, 0, -2.25); + GL11.glRotated(equip[0], 1, 0, 0); + GL11.glTranslated(0, 0, 2.25); + + GL11.glTranslated(0, -1, -6); + GL11.glRotated(recoil[0], 1, 0, 0); + GL11.glTranslated(0, 1, 6); + + GL11.glShadeModel(GL11.GL_SMOOTH); + + GL11.glPushMatrix(); + + GL11.glColor3f(ColorUtil.fr(dark), ColorUtil.fg(dark), ColorUtil.fb(dark)); + ResourceManager.n_i_4_n_i.renderPart("FrameDark"); + + GL11.glColor3f(ColorUtil.fr(grip), ColorUtil.fg(grip), ColorUtil.fb(grip)); + ResourceManager.n_i_4_n_i.renderPart("Grip"); + + GL11.glColor3f(ColorUtil.fr(light), ColorUtil.fg(light), ColorUtil.fb(light)); + ResourceManager.n_i_4_n_i.renderPart("FrameLight"); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 1.1875D, 0); + GL11.glRotated(drum[2], 0, 0, 1); + GL11.glTranslated(0, -1.1875D, 0); + ResourceManager.n_i_4_n_i.renderPart("Cylinder"); + RenderArcFurnace.fullbright(true); + GL11.glColor3f(1F, 1F, 1F); + ResourceManager.n_i_4_n_i.renderPart("CylinderHighlights"); + RenderArcFurnace.fullbright(false); + GL11.glPopMatrix(); + + RenderArcFurnace.fullbright(true); + ResourceManager.n_i_4_n_i.renderPart("Barrel"); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(0F, 1F, 0F); + int coinCount = ItemGunNI4NI.getCoinCount(stack); + if(coinCount > 3) ResourceManager.n_i_4_n_i.renderPart("Coin1"); + if(coinCount > 2) ResourceManager.n_i_4_n_i.renderPart("Coin2"); + if(coinCount > 1) ResourceManager.n_i_4_n_i.renderPart("Coin3"); + if(coinCount > 0) ResourceManager.n_i_4_n_i.renderPart("Coin4"); + GL11.glEnable(GL11.GL_TEXTURE_2D); + + RenderArcFurnace.fullbright(false); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0.75, 4); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + GL11.glScaled(0.125, 0.125, 0.125); + this.renderLaserFlash(gun.lastShot[0], 75, 7.5, 0xFFFFFF); + GL11.glPopMatrix(); + + GL11.glPopMatrix(); + } + + @Override + public void setupThirdPerson(ItemStack stack) { + super.setupThirdPerson(stack); + GL11.glTranslated(0, 0.25, 3); + double scale = 1.5D; + GL11.glScaled(scale, scale, scale); + } + + @Override + public void setupInv(ItemStack stack) { + super.setupInv(stack); + double scale = 2.5D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(0, 0, 0); + } + + @Override + public void setupModTable(ItemStack stack) { + double scale = -15D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(90, 0, 1, 0); + GL11.glTranslated(0, -0.5, 0); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type) { + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glAlphaFunc(GL11.GL_GREATER, 0F); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + int[] color = ItemGunNI4NI.getColors(stack); + int dark = 0xffffff; + int light = 0xffffff; + int grip = 0xffffff; + if(color != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_greyscale_tex); + dark = color[0]; + light = color[1]; + grip = color[2]; + } else { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_tex); + } + + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glColor3f(ColorUtil.fr(light), ColorUtil.fg(light), ColorUtil.fb(light)); + ResourceManager.n_i_4_n_i.renderPart("FrameLight"); + ResourceManager.n_i_4_n_i.renderPart("Cylinder"); + GL11.glColor3f(ColorUtil.fr(grip), ColorUtil.fg(grip), ColorUtil.fb(grip)); + ResourceManager.n_i_4_n_i.renderPart("Grip"); + GL11.glColor3f(ColorUtil.fr(dark), ColorUtil.fg(dark), ColorUtil.fb(dark)); + ResourceManager.n_i_4_n_i.renderPart("FrameDark"); + GL11.glColor3f(1F, 1F, 1F); + RenderArcFurnace.fullbright(true); + ResourceManager.n_i_4_n_i.renderPart("CylinderHighlights"); + ResourceManager.n_i_4_n_i.renderPart("Barrel"); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(0F, 1F, 0F); + ResourceManager.n_i_4_n_i.renderPart("Coin1"); + ResourceManager.n_i_4_n_i.renderPart("Coin2"); + ResourceManager.n_i_4_n_i.renderPart("Coin3"); + ResourceManager.n_i_4_n_i.renderPart("Coin4"); + GL11.glColor3f(1F, 1F, 1F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + RenderArcFurnace.fullbright(false); + GL11.glShadeModel(GL11.GL_FLAT); + } +} diff --git a/src/main/java/com/hbm/util/ColorUtil.java b/src/main/java/com/hbm/util/ColorUtil.java index c863c5d02..28b76c6ab 100644 --- a/src/main/java/com/hbm/util/ColorUtil.java +++ b/src/main/java/com/hbm/util/ColorUtil.java @@ -70,6 +70,30 @@ public class ColorUtil { return 0xFFFFFF; } } + + public static int ir(int color) { + return (color & 0xff0000) >> 16; + } + + public static int ig(int color) { + return (color & 0x00ff00) >> 8; + } + + public static int ib(int color) { + return (color & 0x0000ff) >> 0; + } + + public static float fr(int color) { + return ir(color) / 255F; + } + + public static float fg(int color) { + return ig(color) / 255F; + } + + public static float fb(int color) { + return ib(color) / 255F; + } @SideOnly(Side.CLIENT) public static int getMedianBrightnessColorFromStack(ItemStack stack) { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 037898b56..b59ad8b12 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2167,6 +2167,7 @@ item.gun_minigun.name=Minigun item.gun_minigun_dual.name=Doppelete Miniguns item.gun_minigun_lacunae.name=Lacunae item.gun_missile_launcher.name=Raketenwerfer +item.gun_n_i_4_n_i.name=N I 4 N I item.gun_pepperbox.name=Bündelrevolver item.gun_panzerschreck.name=Panzerschreck item.gun_quadro.name=Vierfachraketenwerfer diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c84185573..a5f161efb 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3009,6 +3009,7 @@ item.gun_minigun.name=Minigun item.gun_minigun_dual.name=Dual Miniguns item.gun_minigun_lacunae.name=Lacunae item.gun_missile_launcher.name=Missile Launcher +item.gun_n_i_4_n_i.name=N I 4 N I item.gun_pepperbox.name=Pepperbox item.gun_panzerschreck.name=Panzerschreck item.gun_quadro.name=Quad Rocket Launcher diff --git a/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj b/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj new file mode 100644 index 000000000..3970858be --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj @@ -0,0 +1,2082 @@ +# Blender v2.79 (sub 0) OBJ File: 'n_i_4_n_i.blend' +# www.blender.org +o Barrel +v -0.187500 0.051777 3.937500 +v 0.187500 0.051777 3.937500 +v -0.187500 1.448223 3.937500 +v 0.187500 1.448223 3.937500 +v -0.135723 0.000000 3.937500 +v 0.135723 0.000000 3.937500 +v -0.135723 1.500000 3.937500 +v 0.135723 1.500000 3.937500 +vt 0.000000 0.283342 +vt 0.003261 0.276923 +vt 0.029348 0.276923 +vt 0.032609 0.283342 +vt 0.032609 0.455120 +vt 0.029348 0.461538 +vt 0.003261 0.461538 +vt 0.000000 0.455120 +vn 0.0000 0.0000 1.0000 +s off +f 1/1/1 5/2/1 6/3/1 +f 6/3/1 2/4/1 1/1/1 +f 2/4/1 4/5/1 1/1/1 +f 4/5/1 8/6/1 7/7/1 +f 7/7/1 3/8/1 4/5/1 +f 3/8/1 1/1/1 4/5/1 +o Coin4 +v -0.093750 1.637782 -2.619801 +v -0.143468 1.652344 -2.605239 +v -0.164062 1.687500 -2.570082 +v -0.143468 1.722656 -2.534926 +v -0.093750 1.737218 -2.520364 +v -0.044032 1.722656 -2.534926 +v -0.023438 1.687500 -2.570082 +v -0.044032 1.652344 -2.605239 +vt 0.603153 0.499831 +vt 0.456926 0.499831 +vt 0.603153 0.000168 +vt 0.353527 0.353482 +vt 0.353528 0.146514 +vt 0.456926 0.000168 +vt 0.706551 0.146516 +vt 0.706551 0.353483 +vn -0.0000 0.7071 -0.7071 +s off +f 16/9/2 9/10/2 13/11/2 +f 9/10/2 10/12/2 13/11/2 +f 10/12/2 11/13/2 13/11/2 +f 11/13/2 12/14/2 13/11/2 +f 13/11/2 14/15/2 15/16/2 +f 15/16/2 16/9/2 13/11/2 +o Coin3 +v 0.093750 1.637782 -2.619801 +v 0.044032 1.652344 -2.605239 +v 0.023438 1.687500 -2.570082 +v 0.044032 1.722656 -2.534926 +v 0.093750 1.737218 -2.520364 +v 0.143468 1.722656 -2.534926 +v 0.164062 1.687500 -2.570082 +v 0.143468 1.652344 -2.605239 +vt 0.249793 0.999831 +vt 0.103566 0.999831 +vt 0.249793 0.500168 +vt 0.000168 0.853484 +vt 0.000168 0.646516 +vt 0.103566 0.500168 +vt 0.353191 0.646516 +vt 0.353191 0.853484 +vn -0.0000 0.7071 -0.7071 +s off +f 24/17/3 17/18/3 21/19/3 +f 17/18/3 18/20/3 21/19/3 +f 18/20/3 19/21/3 21/19/3 +f 19/21/3 20/22/3 21/19/3 +f 21/19/3 22/23/3 23/24/3 +f 23/24/3 24/17/3 21/19/3 +o Coin2 +v -0.093750 1.770364 -2.487219 +v -0.143468 1.784926 -2.472656 +v -0.164062 1.820082 -2.437500 +v -0.143468 1.855239 -2.402344 +v -0.093750 1.869801 -2.387782 +v -0.044032 1.855239 -2.402344 +v -0.023438 1.820082 -2.437500 +v -0.044032 1.784926 -2.472656 +vt 0.353191 0.353483 +vt 0.249794 0.499832 +vt 0.103566 0.000168 +vt 0.103566 0.499832 +vt 0.000168 0.353484 +vt 0.000168 0.146517 +vt 0.249794 0.000168 +vt 0.353191 0.146516 +vn 0.0000 0.7071 -0.7071 +s off +f 32/25/4 25/26/4 29/27/4 +f 25/26/4 26/28/4 27/29/4 +f 27/29/4 28/30/4 25/26/4 +f 28/30/4 29/27/4 25/26/4 +f 29/27/4 30/31/4 31/32/4 +f 31/32/4 32/25/4 29/27/4 +o Coin1 +v 0.093750 1.770364 -2.487219 +v 0.044032 1.784926 -2.472656 +v 0.023438 1.820082 -2.437500 +v 0.044032 1.855239 -2.402344 +v 0.093750 1.869801 -2.387782 +v 0.143468 1.855239 -2.402344 +v 0.164062 1.820082 -2.437500 +v 0.143468 1.784926 -2.472656 +vt 0.706549 0.853483 +vt 0.603152 0.999832 +vt 0.456925 0.500169 +vt 0.456925 0.999831 +vt 0.353527 0.853484 +vt 0.353527 0.646516 +vt 0.603152 0.500168 +vt 0.706550 0.646517 +vn 0.0000 0.7071 -0.7071 +s off +f 40/33/5 33/34/5 37/35/5 +f 33/34/5 34/36/5 37/35/5 +f 34/36/5 35/37/5 37/35/5 +f 35/37/5 36/38/5 37/35/5 +f 37/35/5 38/39/5 39/40/5 +f 39/40/5 40/33/5 37/35/5 +o Grip +v -0.312500 0.500000 -2.000000 +v 0.312500 0.500000 -2.000000 +v -0.312500 1.250000 -3.125000 +v 0.312500 1.250000 -3.125000 +v -0.156250 1.250000 -3.375000 +v 0.156250 1.250000 -3.375000 +v -0.156250 1.000000 -3.375000 +v 0.156250 1.000000 -3.375000 +v -0.187500 0.625000 -3.000000 +v 0.187500 0.625000 -3.000000 +v -0.187500 0.250000 -1.750000 +v 0.187500 0.250000 -1.750000 +v -0.187500 -1.250000 -2.500000 +v 0.187500 -1.250000 -2.500000 +v -0.187500 -2.000000 -2.500000 +v 0.187500 -2.000000 -2.500000 +v -0.187500 -1.687500 -4.000000 +v 0.187500 -1.687500 -4.000000 +v 0.312500 -1.125000 -2.875000 +v 0.312500 -1.625000 -2.875000 +v 0.312500 -1.500000 -3.625000 +v 0.312500 0.375000 -2.750000 +v -0.312500 -1.125000 -2.875000 +v -0.312500 -1.625000 -2.875000 +v -0.312500 -1.500000 -3.625000 +v -0.312500 0.375000 -2.750000 +vt 0.788043 0.446154 +vt 0.885870 0.523077 +vt 0.788043 0.523077 +vt 0.885870 0.446154 +vt 0.907609 0.503846 +vt 0.964674 0.446154 +vt 0.991848 0.415385 +vt 0.991848 0.446154 +vt 0.964674 0.415385 +vt 0.994565 0.369231 +vt 0.766304 0.461538 +vt 0.733696 0.323077 +vt 0.766304 0.138462 +vt 0.766304 0.323077 +vt 0.733696 0.138462 +vt 0.766304 0.046154 +vt 0.831522 0.000000 +vt 0.961957 0.046154 +vt 0.831522 0.046154 +vt 0.961957 0.369231 +vt 0.994565 0.084615 +vt 0.961957 0.084615 +vt 0.864130 0.092308 +vt 0.929348 0.107692 +vt 0.864130 0.146154 +vt 0.788043 0.353846 +vt 0.864130 0.092308 +vt 0.831522 0.138462 +vt 0.961957 0.084615 +vt 0.929348 0.107692 +vt 0.875000 0.369231 +vt 0.853261 0.338462 +vt 0.956522 0.338462 +vt 0.875000 0.369231 +vt 0.853261 0.338462 +vt 1.000000 0.338462 +vt 0.831522 0.138462 +vt 0.864130 0.146154 +vt 0.766304 0.323077 +vt 0.788043 0.353846 +vt 0.885870 0.446154 +vt 0.907609 0.415385 +vt 0.907609 0.446154 +vt 0.907609 0.415385 +vt 0.907609 0.446154 +vt 0.907609 0.465385 +vt 0.766304 0.507692 +vt 0.733696 0.046154 +vt 0.961957 0.000000 +vt 0.831522 0.046154 +vn 0.0000 0.8321 0.5547 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.4472 0.8944 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.9790 -0.2040 +vn 0.0000 0.3969 -0.9179 +vn -0.8920 -0.4460 -0.0743 +vn 0.9381 -0.1642 0.3049 +vn 0.9487 0.0000 0.3162 +vn 0.9186 -0.3868 -0.0806 +vn 0.9360 0.1489 -0.3191 +vn 1.0000 0.0000 0.0000 +vn -0.9360 0.1489 -0.3191 +vn -0.9487 0.0000 0.3162 +vn -0.9381 -0.1642 0.3049 +vn -1.0000 0.0000 0.0000 +vn 0.8480 0.0000 -0.5300 +vn 0.9029 -0.1693 -0.3950 +vn -0.9029 -0.1693 -0.3950 +vn -0.8480 0.0000 -0.5300 +vn -0.9186 -0.3868 -0.0806 +vn 0.9526 -0.1361 0.2722 +vn 0.8920 -0.4460 -0.0743 +vn 0.9073 0.1669 -0.3859 +vn -0.9073 0.1669 -0.3859 +vn -0.9526 -0.1361 0.2722 +s off +f 42/41/6 43/42/6 41/43/6 +f 44/44/7 45/45/7 43/42/7 +f 46/46/8 47/47/8 45/48/8 +f 48/49/9 49/50/9 47/47/9 +f 41/43/10 52/51/10 42/41/10 +f 51/52/11 54/53/11 52/54/11 +f 53/55/12 56/56/12 54/53/12 +f 55/57/13 58/58/13 56/59/13 +f 50/60/14 57/61/14 49/50/14 +f 57/62/15 64/63/15 65/64/15 +f 52/54/16 59/65/16 42/66/16 +f 60/67/17 54/68/17 56/59/17 +f 58/69/18 60/67/18 56/59/18 +f 61/70/19 50/71/19 62/72/19 +f 60/67/20 61/70/20 59/65/20 +f 59/65/20 62/72/20 42/66/20 +f 50/60/9 48/49/9 62/73/9 +f 42/66/20 62/72/20 44/44/20 +f 49/74/21 65/64/21 66/75/21 +f 47/47/9 49/50/9 66/76/9 +f 64/63/22 53/77/22 63/78/22 +f 63/78/23 51/79/23 41/80/23 +f 64/63/24 63/78/24 65/64/24 +f 63/78/24 66/75/24 65/64/24 +f 41/80/24 43/81/24 66/75/24 +f 44/44/25 48/82/25 46/83/25 +f 44/44/26 62/72/26 48/82/26 +f 66/75/27 43/81/27 47/84/27 +f 47/84/28 43/81/28 45/85/28 +f 42/41/6 44/44/6 43/42/6 +f 44/44/7 46/86/7 45/45/7 +f 46/46/8 48/49/8 47/47/8 +f 48/49/9 50/60/9 49/50/9 +f 41/43/10 51/87/10 52/51/10 +f 51/52/11 53/55/11 54/53/11 +f 53/55/12 55/88/12 56/56/12 +f 55/57/13 57/89/13 58/58/13 +f 50/60/14 58/69/14 57/61/14 +f 57/62/29 55/90/29 64/63/29 +f 52/54/30 54/68/30 59/65/30 +f 60/67/17 59/65/17 54/68/17 +f 58/69/31 61/70/31 60/67/31 +f 61/70/32 58/69/32 50/71/32 +f 59/65/20 61/70/20 62/72/20 +f 49/74/33 57/62/33 65/64/33 +f 64/63/22 55/90/22 53/77/22 +f 63/78/34 53/77/34 51/79/34 +f 63/78/24 41/80/24 66/75/24 +o FrameLight +v -0.437500 0.500000 -0.250000 +v -0.375000 1.000000 -0.250000 +v 0.437500 0.875000 -0.250000 +v 0.437500 0.500000 -0.250000 +v 0.375000 1.000000 -0.250000 +v -0.437500 0.875000 2.500000 +v -0.437500 0.500000 2.500000 +v -0.375000 1.500000 -0.250000 +v 0.375000 1.500000 -0.250000 +v -0.187500 1.687500 -0.250000 +v 0.187500 1.687500 -0.250000 +v -0.375000 1.500000 3.250000 +v -0.375000 1.375000 3.250000 +v -0.375000 1.375000 2.875000 +v -0.375000 1.000000 2.500000 +v 0.187500 1.625000 3.250000 +v -0.187500 1.625000 3.250000 +v 0.312500 1.500000 3.250000 +v -0.312500 1.500000 3.250000 +v 0.437500 0.875000 2.500000 +v 0.437500 0.500000 2.500000 +v 0.375000 1.500000 3.250000 +v 0.375000 1.375000 3.250000 +v 0.375000 1.375000 2.875000 +v 0.375000 1.000000 2.500000 +v -0.187500 1.687500 3.250000 +v 0.187500 1.687500 3.250000 +v 0.312500 1.375000 3.250000 +v -0.312500 1.375000 3.250000 +v 0.312500 1.375000 2.875000 +v -0.312500 1.375000 2.875000 +v 0.312500 1.000000 2.500000 +v -0.312500 1.000000 2.500000 +v 0.312500 0.375000 2.500000 +v -0.312500 0.375000 2.500000 +v 0.312500 0.375000 -0.250000 +v 0.125000 0.125000 -0.750000 +v -0.125000 0.125000 -0.750000 +v 0.125000 -0.375000 -0.750000 +v -0.125000 -0.375000 -0.750000 +v 0.125000 -0.375000 -2.125000 +v -0.125000 -0.375000 -2.125000 +v 0.125000 -0.250000 -2.125000 +v -0.125000 -0.250000 -2.125000 +v 0.125000 -0.250000 -1.000000 +v -0.125000 -0.250000 -1.000000 +v 0.125000 0.125000 -0.875000 +v -0.125000 0.125000 -0.875000 +v 0.000000 1.500000 -2.625000 +v -0.132583 1.445083 -2.625000 +v -0.187500 1.312500 -2.625000 +v -0.132583 1.179917 -2.625000 +v 0.000000 1.125000 -2.625000 +v 0.132583 1.179917 -2.625000 +v 0.187500 1.312500 -2.625000 +v 0.132583 1.445083 -2.625000 +v 0.000000 1.500000 -3.125000 +v -0.132583 1.445083 -3.125000 +v -0.187500 1.312500 -3.125000 +v -0.132583 1.179917 -3.125000 +v 0.000000 1.125000 -3.125000 +v 0.132583 1.179917 -3.125000 +v 0.187500 1.312500 -3.125000 +v 0.132583 1.445083 -3.125000 +v 0.000000 1.453125 -3.125000 +v -0.099437 1.411937 -3.125000 +v -0.140625 1.312500 -3.125000 +v -0.099437 1.213063 -3.125000 +v 0.000000 1.171875 -3.125000 +v 0.099437 1.213063 -3.125000 +v 0.140625 1.312500 -3.125000 +v 0.099437 1.411937 -3.125000 +v -0.099437 1.411937 -3.250000 +v 0.000000 1.453125 -3.250000 +v -0.140625 1.312500 -3.250000 +v -0.099437 1.213063 -3.250000 +v 0.000000 1.171875 -3.250000 +v 0.099437 1.213063 -3.250000 +v 0.140625 1.312500 -3.250000 +v 0.099437 1.411937 -3.250000 +v -0.250000 1.864277 -2.260723 +v 0.250000 1.864277 -2.260723 +v -0.250000 1.510723 -2.614277 +v 0.250000 1.510723 -2.614277 +v -0.250000 1.554917 -2.658471 +v -0.250000 1.908471 -2.304918 +v 0.250000 1.908471 -2.304918 +v 0.250000 1.554917 -2.658471 +v 0.125000 -0.187500 -1.625000 +v -0.125000 -0.187500 -1.625000 +v 0.125000 -0.187500 -1.750000 +v -0.125000 -0.187500 -1.750000 +v 0.125000 -0.062500 -1.687500 +v -0.125000 -0.062500 -1.687500 +v 0.125000 -0.062500 -1.812500 +v -0.125000 -0.062500 -1.812500 +v 0.125000 0.125000 -1.687500 +v -0.125000 0.125000 -1.687500 +v 0.125000 0.125000 -1.812500 +v -0.125000 0.125000 -1.812500 +v 0.062500 -0.062500 -1.812500 +v -0.062500 -0.062500 -1.812500 +v 0.062500 -0.062500 -1.937500 +v -0.062500 -0.062500 -1.937500 +v 0.062500 0.125000 -1.812500 +v -0.062500 0.125000 -1.812500 +v -0.312500 0.375000 -0.250000 +v -0.437500 0.875000 -0.250000 +vt 0.516304 0.346154 +vt 0.277174 0.323077 +vt 0.516304 0.323077 +vt 0.277174 0.392308 +vt 0.271739 0.407692 +vt 0.266304 0.407692 +vt 0.277174 0.653846 +vt 0.516304 0.700000 +vt 0.277174 0.700000 +vt 0.277174 0.638462 +vt 0.516304 0.653846 +vt 0.277174 0.346154 +vt 0.516304 0.392308 +vt 0.195652 0.569231 +vt 0.206522 0.546154 +vt 0.211957 0.546154 +vt 0.184783 0.569231 +vt 0.195652 0.561538 +vt 0.152174 0.561538 +vt 0.184783 0.561538 +vt 0.152174 0.569231 +vt 0.119565 0.561538 +vt 0.516304 0.576923 +vt 0.244565 0.592308 +vt 0.195652 0.484615 +vt 0.184783 0.476923 +vt 0.195652 0.476923 +vt 0.586957 0.469231 +vt 0.630435 0.484615 +vt 0.630435 0.561538 +vt 0.119565 0.476923 +vt 0.152174 0.484615 +vt 0.119565 0.484615 +vt 0.206522 0.500000 +vt 0.266304 0.638462 +vt 0.271739 0.638462 +vt 0.152174 0.476923 +vt 0.184783 0.484615 +vt 0.516304 0.723077 +vt 0.277174 0.723077 +vt 0.211957 0.500000 +vt 0.043478 0.876923 +vt 0.000000 0.907692 +vt 0.000000 0.876923 +vt 0.163043 0.876923 +vt 0.043478 0.907692 +vt 0.032609 1.000000 +vt 0.130435 0.969231 +vt 0.130435 1.000000 +vt -0.000000 1.000000 +vt 0.032609 0.969231 +vt 0.065217 0.861538 +vt 0.163043 0.861538 +vt 0.043478 0.815385 +vt 0.163043 0.907692 +vt 0.065217 0.923077 +vt 0.043478 0.969231 +vt 0.054348 0.969231 +vt 0.951314 0.546154 +vt 0.967391 0.523398 +vt 0.983469 0.546154 +vt 0.980467 0.573800 +vt 0.983633 0.584615 +vt 0.962020 0.584615 +vt 0.913043 0.515385 +vt 0.956522 0.453846 +vt 0.956522 0.515385 +vt 0.956522 0.446154 +vt 0.913043 0.453846 +vt 0.913043 0.446154 +vt 0.913043 0.523077 +vt 0.956522 0.523077 +vt 0.907609 0.453846 +vt 0.907609 0.515385 +vt 0.961957 0.453846 +vt 0.711957 0.630769 +vt 0.733696 0.646154 +vt 0.711957 0.646154 +vt 0.744565 0.669231 +vt 0.733696 0.692308 +vt 0.733696 0.669231 +vt 0.744565 0.646154 +vt 0.766304 0.646154 +vt 0.777174 0.669231 +vt 0.766304 0.669231 +vt 0.722826 0.715385 +vt 0.711957 0.730769 +vt 0.711957 0.715385 +vt 0.766304 0.692308 +vt 0.722826 0.730769 +vt 0.711957 0.753846 +vt 0.711957 0.692308 +vt 0.516304 0.546154 +vt 0.211957 0.469231 +vt 0.516304 0.500000 +vt 0.244565 0.453846 +vt 0.277174 0.407692 +vt 0.516304 0.469231 +vt 0.516304 0.407692 +vt 0.211957 0.576923 +vt 0.266304 0.330769 +vt 0.516304 0.638462 +vt 0.119565 0.569231 +vt 0.211957 0.592308 +vt 0.576087 0.569231 +vt 0.532609 0.569231 +vt 0.576087 0.476923 +vt 0.532609 0.476923 +vt 0.586957 0.576923 +vt 0.619565 0.469231 +vt 0.619565 0.576923 +vt 0.266304 0.715385 +vt -0.000000 0.969231 +vt 0.054348 0.815385 +vt 0.163043 0.923077 +vt 0.978760 0.562245 +vt 0.967391 0.568910 +vt 0.956023 0.562245 +vt 0.956023 0.530063 +vt 0.978760 0.530063 +vt 0.980467 0.595431 +vt 0.972826 0.599910 +vt 0.965185 0.595431 +vt 0.965185 0.573800 +vt 0.972826 0.569320 +vt 0.961957 0.515385 +vt 0.733696 0.630769 +vt 0.744565 0.692308 +vt 0.777174 0.646154 +vt 0.777174 0.692308 +vt 0.211957 0.453846 +vt 0.951087 0.584615 +vt 0.907609 0.600000 +vt 0.907609 0.584615 +vt 0.951087 0.569231 +vt 0.907609 0.569231 +vt 0.951087 0.538462 +vt 0.907609 0.553846 +vt 0.907609 0.538462 +vt 0.951087 0.630769 +vt 0.907609 0.646154 +vt 0.907609 0.630769 +vt 0.951087 0.600000 +vt 0.907609 0.615385 +vt 0.951087 0.553846 +vt 0.951087 0.523077 +vt 0.907609 0.523077 +vt 0.951087 0.615385 +vt 0.983696 0.569231 +vt 0.994565 0.584615 +vt 0.983696 0.584615 +vt 0.983696 0.538462 +vt 0.994565 0.553846 +vt 0.983696 0.553846 +vt 0.983696 0.630769 +vt 0.994565 0.646154 +vt 0.983696 0.646154 +vt 0.983696 0.600000 +vt 0.994565 0.615385 +vt 0.983696 0.615385 +vt 0.994565 0.569231 +vt 0.983696 0.523077 +vt 0.994565 0.538462 +vt 0.994565 0.630769 +vt 0.994565 0.600000 +vt 0.711957 0.669231 +vt 0.711957 0.692308 +vt 0.951087 0.646154 +vt 0.994565 0.523077 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn -0.8944 0.4472 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 -1.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.3162 -0.9487 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.7071 0.7071 0.0000 +vn 0.8944 0.4472 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 -0.4472 -0.8944 +vn 0.0000 -0.2298 -0.9732 +vn 0.0000 0.4472 0.8944 +vn 0.0000 0.2298 0.9732 +s off +f 70/91/35 100/92/35 102/93/35 +f 86/94/36 91/95/36 98/96/36 +f 72/97/37 67/98/37 73/99/37 +f 81/100/38 174/101/38 72/97/38 +f 87/102/39 69/103/39 86/94/39 +f 78/104/36 83/105/36 92/106/36 +f 79/107/36 85/108/36 78/104/36 +f 79/107/40 97/109/40 95/110/40 +f 80/111/41 99/112/41 97/109/41 +f 74/113/37 81/100/37 80/114/37 +f 84/115/36 89/116/36 88/117/36 +f 69/118/42 102/119/42 173/120/42 +f 91/121/41 96/122/41 98/123/41 +f 82/124/36 92/106/36 83/105/36 +f 99/125/36 81/126/36 72/97/36 +f 90/127/40 94/128/40 96/122/40 +f 73/99/43 173/129/43 101/130/43 +f 82/124/36 88/117/36 93/131/36 +f 106/132/36 103/133/36 104/134/36 +f 108/135/40 105/136/40 106/132/40 +f 112/137/44 109/138/44 110/139/44 +f 114/140/45 111/141/45 112/137/45 +f 108/135/37 112/142/37 110/143/37 +f 104/144/37 112/142/37 106/132/37 +f 107/145/39 111/146/39 105/136/39 +f 103/147/39 111/146/39 113/148/39 +f 129/149/42 127/150/42 125/151/42 +f 142/152/42 141/153/42 145/154/42 +f 153/155/46 151/156/46 152/157/46 +f 149/158/47 154/159/47 150/160/47 +f 148/161/48 152/157/48 147/162/48 +f 150/163/39 153/155/39 148/164/39 +f 149/165/37 152/157/37 151/156/37 +f 158/166/40 155/167/40 156/168/40 +f 161/169/39 163/170/39 159/171/39 +f 157/172/39 159/171/39 155/167/39 +f 158/173/37 160/174/37 162/175/37 +f 170/176/40 167/177/40 168/178/40 +f 160/174/37 166/179/37 162/175/37 +f 169/180/39 171/181/39 167/177/39 +f 170/176/37 168/178/37 172/182/37 +f 93/131/44 76/183/44 92/106/44 +f 88/184/49 77/185/49 93/131/49 +f 90/186/39 91/187/39 75/188/39 +f 86/94/50 71/189/50 91/187/50 +f 92/106/51 74/113/51 78/190/51 +f 70/91/35 87/102/35 100/92/35 +f 98/96/36 100/191/36 87/102/36 +f 87/102/36 86/94/36 98/96/36 +f 72/97/37 174/101/37 67/98/37 +f 81/100/38 68/192/38 174/101/38 +f 87/102/39 70/91/39 69/103/39 +f 78/104/36 85/108/36 83/105/36 +f 79/107/36 95/110/36 85/108/36 +f 79/107/40 80/111/40 97/109/40 +f 80/111/41 81/193/41 99/112/41 +f 79/194/37 78/190/37 80/114/37 +f 78/190/37 74/113/37 80/114/37 +f 74/113/37 68/192/37 81/100/37 +f 84/115/36 94/128/36 89/116/36 +f 68/195/42 74/196/42 71/197/42 +f 74/196/42 76/183/42 75/198/42 +f 71/197/42 74/196/42 75/198/42 +f 76/183/42 77/185/42 75/198/42 +f 71/197/42 69/118/42 174/199/42 +f 69/118/42 70/200/42 102/119/42 +f 67/201/42 174/199/42 173/120/42 +f 174/199/42 68/195/42 71/197/42 +f 173/120/42 174/199/42 69/118/42 +f 91/121/41 90/127/41 96/122/41 +f 82/124/36 93/131/36 92/106/36 +f 72/97/36 73/99/36 101/202/36 +f 101/202/36 99/125/36 72/97/36 +f 90/127/40 89/116/40 94/128/40 +f 73/99/43 67/98/43 173/129/43 +f 82/124/36 84/115/36 88/117/36 +f 106/132/36 105/136/36 103/133/36 +f 108/135/40 107/145/40 105/136/40 +f 112/137/44 111/141/44 109/138/44 +f 114/140/45 113/203/45 111/141/45 +f 108/135/37 106/132/37 112/142/37 +f 104/144/37 114/204/37 112/142/37 +f 107/145/39 109/205/39 111/146/39 +f 103/147/39 105/136/39 111/146/39 +f 125/151/42 124/206/42 123/207/42 +f 123/207/42 130/208/42 129/149/42 +f 129/149/42 128/209/42 127/150/42 +f 127/150/42 126/210/42 125/151/42 +f 125/151/42 123/207/42 129/149/42 +f 141/153/42 139/211/42 145/154/42 +f 139/211/42 140/212/42 145/154/42 +f 140/212/42 146/213/42 145/154/42 +f 145/154/42 144/214/42 143/215/42 +f 143/215/42 142/152/42 145/154/42 +f 153/155/46 154/159/46 151/156/46 +f 149/158/47 151/156/47 154/159/47 +f 148/161/48 153/155/48 152/157/48 +f 150/163/39 154/159/39 153/155/39 +f 149/165/37 147/216/37 152/157/37 +f 158/166/40 157/217/40 155/167/40 +f 161/169/39 165/218/39 163/170/39 +f 157/172/39 161/169/39 159/171/39 +f 158/173/37 156/219/37 160/174/37 +f 170/176/40 169/180/40 167/177/40 +f 160/174/37 164/220/37 166/179/37 +f 93/131/44 77/185/44 76/183/44 +f 88/184/49 75/188/49 77/185/49 +f 71/189/39 75/188/39 91/187/39 +f 75/188/39 88/184/39 90/186/39 +f 88/184/39 89/221/39 90/186/39 +f 86/94/50 69/103/50 71/189/50 +f 92/106/51 76/183/51 74/113/51 +s 1 +f 123/222/44 116/223/51 115/224/44 +f 130/225/49 115/224/44 122/226/49 +f 128/227/35 121/228/39 120/229/35 +f 126/230/43 119/231/40 118/232/43 +f 124/233/51 117/234/37 116/223/51 +f 129/235/39 122/226/49 121/228/39 +f 127/236/40 120/229/35 119/237/40 +f 125/238/37 118/232/43 117/234/37 +f 138/239/49 140/240/44 131/241/44 +f 136/242/35 145/243/39 137/244/39 +f 134/245/43 143/246/40 135/247/40 +f 132/248/51 141/249/37 133/250/37 +f 137/244/39 146/251/49 138/239/49 +f 135/252/40 144/253/35 136/242/35 +f 133/250/37 142/254/43 134/245/43 +f 131/241/44 139/255/51 132/248/51 +f 158/173/52 161/169/53 157/172/52 +f 155/167/54 160/256/55 156/168/54 +f 162/175/53 165/218/42 161/169/53 +f 159/171/55 164/257/36 160/256/55 +f 123/222/44 124/233/51 116/223/51 +f 130/225/49 123/222/44 115/224/44 +f 128/227/35 129/235/39 121/228/39 +f 126/230/43 127/258/40 119/231/40 +f 124/233/51 125/238/37 117/234/37 +f 129/235/39 130/225/49 122/226/49 +f 127/236/40 128/227/35 120/229/35 +f 125/238/37 126/230/43 118/232/43 +f 138/239/49 146/251/49 140/240/44 +f 136/242/35 144/253/35 145/243/39 +f 134/245/43 142/254/43 143/246/40 +f 132/248/51 139/255/51 141/249/37 +f 137/244/39 145/243/39 146/251/49 +f 135/252/40 143/259/40 144/253/35 +f 133/250/37 141/249/37 142/254/43 +f 131/241/44 140/240/44 139/255/51 +f 158/173/52 162/175/53 161/169/53 +f 155/167/54 159/171/55 160/256/55 +f 162/175/53 166/179/42 165/218/42 +f 159/171/55 163/170/36 164/257/36 +o Cylinder +v 0.000000 1.750000 -0.500000 +v -0.281250 1.674639 -0.500000 +v -0.487139 1.468750 -0.500000 +v -0.562500 1.187500 -0.500000 +v -0.487139 0.906250 -0.500000 +v -0.281250 0.700361 -0.500000 +v 0.000000 0.625000 -0.500000 +v 0.281250 0.700361 -0.500000 +v 0.487139 0.906250 -0.500000 +v 0.562500 1.187500 -0.500000 +v 0.487139 1.468750 -0.500000 +v 0.281250 1.674639 -0.500000 +v 0.000000 1.750000 -2.000000 +v -0.281250 1.674639 -2.000000 +v -0.487139 1.468750 -2.000000 +v -0.562500 1.187500 -2.000000 +v -0.487139 0.906250 -2.000000 +v -0.281250 0.700361 -2.000000 +v 0.000000 0.625000 -2.000000 +v 0.281250 0.700361 -2.000000 +v 0.487139 0.906250 -2.000000 +v 0.562500 1.187500 -2.000000 +v 0.487139 1.468750 -2.000000 +v 0.281250 1.674639 -2.000000 +v 0.000000 1.625000 -0.375000 +v -0.218750 1.566386 -0.375000 +v -0.378886 1.406250 -0.375000 +v -0.437500 1.187500 -0.375000 +v -0.378886 0.968750 -0.375000 +v -0.218750 0.808614 -0.375000 +v 0.000000 0.750000 -0.375000 +v 0.218750 0.808614 -0.375000 +v 0.378886 0.968750 -0.375000 +v 0.437500 1.187500 -0.375000 +v 0.378886 1.406250 -0.375000 +v 0.218750 1.566386 -0.375000 +v 0.000000 1.187500 -2.000000 +vt 0.663043 0.269231 +vt 0.711957 0.269231 +vt 0.663043 0.307692 +vt 0.663043 0.192308 +vt 0.711957 0.192308 +vt 0.663043 0.230769 +vt 0.663043 0.115385 +vt 0.711957 0.115385 +vt 0.663043 0.153846 +vt 0.663043 0.038462 +vt 0.711957 0.038462 +vt 0.663043 0.076923 +vt 0.663043 0.423077 +vt 0.711957 0.423077 +vt 0.663043 0.461538 +vt 0.663043 0.346154 +vt 0.711957 0.346154 +vt 0.663043 0.384615 +vt 0.663043 -0.000000 +vt 0.532609 0.230769 +vt 0.532609 0.192308 +vt 0.532609 0.307692 +vt 0.532609 0.269231 +vt 0.532609 0.115385 +vt 0.532609 0.076923 +vt 0.532609 0.461538 +vt 0.532609 0.423077 +vt 0.532609 0.346154 +vt 0.532609 0.153846 +vt 0.532609 0.038462 +vt 0.532609 0.000000 +vt 0.532609 0.384615 +vt 0.516304 0.146154 +vt 0.516304 0.115385 +vt 0.516304 0.161538 +vt 0.516304 0.192308 +vt 0.516304 0.238462 +vt 0.516304 0.269231 +vt 0.516304 0.315385 +vt 0.516304 0.346154 +vt 0.516304 0.392308 +vt 0.516304 0.423077 +vt 0.516304 0.007692 +vt 0.516304 0.038462 +vt 0.516304 0.084615 +vt 0.516304 0.223077 +vt 0.516304 0.300000 +vt 0.516304 0.376923 +vt 0.516304 0.453846 +vt 0.516304 0.069231 +vn 0.0000 -0.0000 -1.0000 +vn 0.5000 0.8660 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.5000 0.8660 0.0000 +vn -0.8660 0.5000 0.0000 +vn 0.8660 -0.5000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -0.5000 -0.8660 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.8660 0.5000 0.0000 +vn 0.5000 -0.8660 0.0000 +vn -0.8660 -0.5000 0.0000 +vn 0.7071 -0.0000 0.7071 +vn 0.6124 0.3536 0.7071 +vn 0.3536 0.6124 0.7071 +vn 0.0000 0.7071 0.7071 +vn -0.3536 0.6124 0.7071 +vn -0.6124 0.3536 0.7071 +vn -0.7071 -0.0000 0.7071 +vn -0.6124 -0.3536 0.7071 +vn -0.3536 -0.6124 0.7071 +vn -0.0000 -0.7071 0.7071 +vn 0.3536 -0.6124 0.7071 +vn 0.6124 -0.3536 0.7071 +s off +f 188/260/56 211/261/56 189/262/56 +f 198/263/56 211/264/56 187/265/56 +f 196/266/56 211/267/56 197/268/56 +f 194/269/56 211/270/56 195/271/56 +f 192/272/56 211/273/56 193/274/56 +f 190/275/56 211/276/56 191/277/56 +f 188/260/56 187/265/56 211/261/56 +f 198/263/56 197/268/56 211/264/56 +f 196/266/56 195/271/56 211/267/56 +f 194/269/56 193/278/56 211/270/56 +f 192/272/56 191/277/56 211/273/56 +f 190/275/56 189/262/56 211/276/56 +s 1 +f 198/263/57 175/279/58 186/280/57 +f 188/260/59 177/281/60 176/282/59 +f 195/271/61 184/283/62 183/284/61 +f 192/272/63 181/285/64 180/286/63 +f 189/262/60 178/287/65 177/281/60 +f 196/266/62 185/288/66 184/283/62 +f 193/278/64 182/289/67 181/290/64 +f 190/275/65 179/291/68 178/287/65 +f 197/268/66 186/280/57 185/288/66 +f 187/265/58 176/282/59 175/279/58 +f 194/269/67 183/284/61 182/289/67 +f 191/277/68 180/286/63 179/291/68 +f 184/283/69 209/292/70 208/293/69 +f 186/280/71 209/294/70 185/288/70 +f 175/279/72 210/295/71 186/280/71 +f 176/282/73 199/296/72 175/279/72 +f 177/281/74 200/297/73 176/282/73 +f 178/287/75 201/298/74 177/281/74 +f 179/291/76 202/299/75 178/287/75 +f 180/286/77 203/300/76 179/291/76 +f 181/285/78 204/301/77 180/286/77 +f 182/289/79 205/302/78 181/290/78 +f 183/284/80 206/303/79 182/289/79 +f 183/284/80 208/293/69 207/304/80 +f 198/263/57 187/265/58 175/279/58 +f 188/260/59 189/262/60 177/281/60 +f 195/271/61 196/266/62 184/283/62 +f 192/272/63 193/274/64 181/285/64 +f 189/262/60 190/275/65 178/287/65 +f 196/266/62 197/268/66 185/288/66 +f 193/278/64 194/269/67 182/289/67 +f 190/275/65 191/277/68 179/291/68 +f 197/268/66 198/263/57 186/280/57 +f 187/265/58 188/260/59 176/282/59 +f 194/269/67 195/271/61 183/284/61 +f 191/277/68 192/272/63 180/286/63 +f 184/283/69 185/288/70 209/292/70 +f 186/280/71 210/295/71 209/294/70 +f 175/279/72 199/305/72 210/295/71 +f 176/282/73 200/297/73 199/296/72 +f 177/281/74 201/306/74 200/297/73 +f 178/287/75 202/299/75 201/298/74 +f 179/291/76 203/307/76 202/299/75 +f 180/286/77 204/301/77 203/300/76 +f 181/285/78 205/308/78 204/301/77 +f 182/289/79 206/303/79 205/302/78 +f 183/284/80 207/309/80 206/303/79 +f 183/284/80 184/283/69 208/293/69 +o CylinderHighlights +v 0.375000 1.281250 -2.031250 +v 0.308709 1.253791 -2.031250 +v 0.281250 1.187500 -2.031250 +v 0.308709 1.121209 -2.031250 +v 0.375000 1.093750 -2.031250 +v 0.441291 1.121209 -2.031250 +v 0.468750 1.187500 -2.031250 +v 0.441291 1.253791 -2.031250 +v 0.278055 0.838476 -2.031250 +v 0.234375 0.781550 -2.031250 +v 0.163236 0.772185 -2.031250 +v 0.106310 0.815865 -2.031250 +v 0.096944 0.887005 -2.031250 +v 0.140625 0.943930 -2.031250 +v 0.211764 0.953296 -2.031250 +v 0.268690 0.909615 -2.031250 +v -0.441291 1.121209 -2.031250 +v -0.468750 1.187500 -2.031250 +v -0.441291 1.253791 -2.031250 +v -0.375000 1.281250 -2.031250 +v -0.308709 1.253791 -2.031250 +v -0.281250 1.187500 -2.031250 +v -0.308709 1.121209 -2.031250 +v -0.375000 1.093750 -2.031250 +v -0.278055 1.536524 -2.031250 +v -0.234375 1.593450 -2.031250 +v -0.163236 1.602815 -2.031250 +v -0.106310 1.559135 -2.031250 +v -0.096944 1.487995 -2.031250 +v -0.140625 1.431070 -2.031250 +v -0.211764 1.421704 -2.031250 +v -0.268690 1.465385 -2.031250 +v -0.163236 0.772185 -2.031250 +v -0.234375 0.781551 -2.031250 +v -0.278056 0.838476 -2.031250 +v -0.268690 0.909616 -2.031250 +v -0.211764 0.953296 -2.031250 +v -0.140625 0.943931 -2.031250 +v -0.096945 0.887005 -2.031250 +v -0.106310 0.815866 -2.031250 +v 0.163236 1.602815 -2.031250 +v 0.234375 1.593449 -2.031250 +v 0.278056 1.536524 -2.031250 +v 0.268690 1.465384 -2.031250 +v 0.211764 1.421704 -2.031250 +v 0.140625 1.431069 -2.031250 +v 0.096945 1.487995 -2.031250 +v 0.106310 1.559134 -2.031250 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.228181 0.603846 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.220109 0.592421 +vt 0.225817 0.595767 +vt 0.228181 0.603846 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vn 0.0000 0.0000 -1.0000 +s off +f 218/310/81 216/311/81 214/312/81 +f 221/313/81 223/314/81 225/315/81 +f 229/316/81 231/317/81 233/318/81 +f 243/319/81 237/320/81 239/321/81 +f 249/322/81 251/323/81 245/324/81 +f 259/325/81 253/326/81 255/327/81 +f 214/312/81 213/328/81 212/329/81 +f 212/329/81 219/330/81 218/310/81 +f 218/310/81 217/331/81 216/311/81 +f 216/311/81 215/332/81 214/312/81 +f 214/312/81 212/329/81 218/310/81 +f 225/315/81 226/333/81 227/334/81 +f 227/334/81 220/335/81 221/313/81 +f 221/313/81 222/336/81 223/314/81 +f 223/314/81 224/337/81 225/315/81 +f 225/315/81 227/334/81 221/313/81 +f 233/318/81 234/338/81 235/339/81 +f 235/339/81 228/340/81 229/316/81 +f 229/316/81 230/341/81 231/317/81 +f 231/317/81 232/342/81 233/318/81 +f 233/318/81 235/339/81 229/316/81 +f 241/343/81 242/344/81 243/319/81 +f 243/319/81 236/345/81 237/320/81 +f 237/320/81 238/346/81 239/321/81 +f 239/321/81 240/347/81 241/343/81 +f 241/343/81 243/319/81 239/321/81 +f 249/322/81 250/348/81 251/323/81 +f 251/323/81 244/349/81 245/324/81 +f 245/324/81 246/350/81 247/351/81 +f 247/351/81 248/352/81 245/324/81 +f 248/352/81 249/322/81 245/324/81 +f 257/353/81 258/354/81 259/325/81 +f 259/325/81 252/355/81 253/326/81 +f 253/326/81 254/356/81 255/327/81 +f 255/327/81 256/357/81 257/353/81 +f 257/353/81 259/325/81 255/327/81 +o FrameDark +v -0.187500 0.051777 3.937500 +v 0.187500 0.051777 3.937500 +v -0.312500 0.000000 -0.500000 +v 0.312500 0.000000 -0.500000 +v -0.187500 1.448223 3.937500 +v 0.187500 1.448223 3.937500 +v -0.187500 -0.125000 -0.500000 +v -0.135723 0.000000 3.937500 +v 0.135723 0.000000 3.937500 +v 0.187500 -0.125000 -0.500000 +v -0.312500 0.375000 -0.250000 +v 0.312500 0.375000 -0.250000 +v -0.312500 0.375000 2.500000 +v 0.312500 0.375000 2.500000 +v -0.312500 1.000000 2.500000 +v 0.312500 1.000000 2.500000 +v -0.312500 1.375000 2.875000 +v 0.312500 1.375000 2.875000 +v -0.312500 1.375000 3.250000 +v 0.312500 1.375000 3.250000 +v -0.135723 1.500000 3.937500 +v 0.135723 1.500000 3.937500 +v 0.437500 0.875000 0.562500 +v 0.437500 0.875000 0.437500 +v -0.312500 1.500000 3.250000 +v 0.312500 1.500000 3.250000 +v -0.187500 1.625000 3.250000 +v 0.187500 1.625000 3.250000 +v 0.437500 0.500000 0.437500 +v 0.437500 0.500000 0.562500 +v -0.312500 0.375000 -0.500000 +v 0.312500 0.375000 -0.500000 +v -0.187500 1.625000 4.000000 +v 0.187500 1.625000 4.000000 +v -0.187500 2.000000 4.000000 +v 0.187500 2.000000 4.000000 +v -0.187500 1.625000 3.250000 +v 0.187500 1.625000 3.250000 +v -0.187500 2.000000 3.500000 +v 0.187500 2.000000 3.500000 +v 0.312500 1.500000 4.000000 +v 0.312500 0.000000 4.000000 +v -0.312500 0.000000 4.000000 +v -0.312500 1.500000 4.000000 +v -0.187500 -0.125000 4.000000 +v 0.187500 -0.125000 4.000000 +v -0.187500 1.625000 4.000000 +v 0.187500 1.625000 4.000000 +v 0.250000 1.474112 4.062500 +v 0.250000 0.025888 4.062500 +v -0.250000 0.025888 4.062500 +v -0.250000 1.474112 4.062500 +v -0.161612 -0.062500 4.062500 +v 0.161612 -0.062500 4.062500 +v -0.161612 1.562500 4.062500 +v 0.161612 1.562500 4.062500 +v 0.312500 0.000000 3.125000 +v 0.312500 0.375000 3.125000 +v 0.312500 0.000000 2.812500 +v 0.312500 0.375000 2.750000 +v -0.312500 0.000000 2.812500 +v 0.312500 0.187500 2.375000 +v -0.375000 0.000000 3.062500 +v 0.312500 0.187500 0.750000 +v 0.312500 0.000000 0.625000 +v 0.312500 0.187500 0.625000 +v 0.312500 0.375000 0.562500 +v 0.312500 0.375000 0.437500 +v 0.375000 1.000000 0.562500 +v 0.375000 1.000000 0.437500 +v 0.375000 1.500000 0.562500 +v 0.375000 1.500000 0.437500 +v 0.187500 1.687500 0.562500 +v 0.187500 1.687500 0.437500 +v -0.437500 0.875000 0.562500 +v -0.437500 0.875000 0.437500 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 0.562500 +v -0.312500 0.000000 3.125000 +v -0.312500 0.375000 3.125000 +v -0.187500 -0.125000 2.812500 +v -0.312500 0.375000 2.750000 +v 0.187500 -0.125000 2.812500 +v -0.312500 0.187500 2.375000 +v -0.375000 0.000000 2.812500 +v -0.312500 0.187500 0.750000 +v -0.312500 0.000000 0.625000 +v -0.312500 0.187500 0.625000 +v -0.312500 0.375000 0.562500 +v -0.312500 0.375000 0.437500 +v -0.375000 1.000000 0.562500 +v -0.375000 1.000000 0.437500 +v -0.375000 1.500000 0.562500 +v -0.375000 1.500000 0.437500 +v -0.187500 1.687500 0.562500 +v -0.187500 1.687500 0.437500 +v 0.187500 1.750000 0.562500 +v 0.187500 1.750000 0.437500 +v -0.187500 1.750000 0.562500 +v -0.187500 1.750000 0.437500 +v 0.500000 0.875000 0.562500 +v 0.500000 0.875000 0.437500 +v 0.500000 0.500000 0.437500 +v 0.500000 0.500000 0.562500 +v 0.375000 0.000000 3.125000 +v 0.375000 0.375000 3.125000 +v 0.187500 -0.125000 3.062500 +v 0.375000 0.375000 2.750000 +v -0.187500 -0.125000 3.062500 +v 0.375000 0.187500 2.375000 +v 0.375000 0.000000 3.062500 +v 0.375000 0.187500 0.750000 +v 0.375000 0.000000 0.625000 +v 0.375000 0.187500 0.625000 +v 0.375000 0.375000 0.562500 +v 0.375000 0.375000 0.437500 +v 0.437500 1.000000 0.562500 +v 0.437500 1.000000 0.437500 +v 0.437500 1.500000 0.562500 +v 0.437500 1.500000 0.437500 +v -0.500000 0.875000 0.562500 +v -0.500000 0.875000 0.437500 +v -0.500000 0.500000 0.437500 +v -0.500000 0.500000 0.562500 +v -0.375000 0.000000 3.125000 +v -0.375000 0.375000 3.125000 +v -0.312500 0.000000 3.062500 +v -0.375000 0.375000 2.750000 +v 0.312500 0.000000 3.062500 +v -0.375000 0.187500 2.375000 +v 0.375000 0.000000 2.812500 +v -0.375000 0.187500 0.750000 +v -0.375000 0.000000 0.625000 +v -0.375000 0.187500 0.625000 +v -0.375000 0.375000 0.562500 +v -0.375000 0.375000 0.437500 +v -0.437500 1.000000 0.562500 +v -0.437500 1.000000 0.437500 +v -0.437500 1.500000 0.562500 +v -0.437500 1.500000 0.437500 +v -0.187500 -0.187500 2.812500 +v 0.187500 -0.187500 2.812500 +v 0.187500 -0.187500 3.062500 +v -0.187500 -0.187500 3.062500 +v -0.187500 -0.250000 2.812500 +v -0.187500 -0.250000 3.062500 +v 0.187500 -0.250000 3.062500 +v 0.187500 -0.250000 2.812500 +v -0.250000 1.750000 -0.250000 +v 0.250000 1.750000 -0.250000 +v -0.437500 1.375000 -0.250000 +v 0.437500 1.375000 -0.250000 +v -0.437500 0.750000 -0.250000 +v 0.437500 0.750000 -0.250000 +v -0.250000 0.375000 -0.250000 +v 0.250000 0.375000 -0.250000 +v 0.250000 1.750000 -0.375000 +v -0.250000 1.750000 -0.375000 +v 0.437500 1.375000 -0.375000 +v -0.437500 1.375000 -0.375000 +v 0.437500 0.750000 -0.375000 +v -0.437500 0.750000 -0.375000 +v -0.250000 0.375000 -0.375000 +v 0.250000 0.375000 -0.375000 +v -0.250000 0.375000 -0.375000 +v 0.250000 0.375000 -0.375000 +v -0.250000 0.625000 -0.375000 +v 0.250000 0.625000 -0.375000 +v 0.250000 0.375000 -2.000000 +v -0.250000 0.375000 -2.000000 +v 0.250000 0.625000 -2.000000 +v -0.250000 0.625000 -2.000000 +v 0.125000 0.125000 -0.375000 +v -0.125000 0.125000 -0.375000 +v 0.125000 0.125000 -2.000000 +v -0.125000 0.125000 -2.000000 +v 0.187500 -0.125000 -0.500000 +v -0.187500 -0.125000 -0.500000 +v 0.187500 -0.125000 1.500000 +v -0.187500 -0.125000 1.500000 +v 0.187500 -0.312500 -0.750000 +v -0.187500 -0.312500 -0.750000 +v 0.187500 -0.312500 1.125000 +v -0.187500 -0.312500 1.125000 +v 0.187500 0.250000 -0.500000 +v -0.187500 0.250000 -0.500000 +v 0.187500 0.250000 -0.750000 +v -0.187500 0.250000 -0.750000 +v -0.250000 1.875000 -2.000000 +v 0.250000 1.875000 -2.000000 +v -0.437500 1.500000 -2.000000 +v 0.437500 1.500000 -2.000000 +v -0.437500 0.875000 -2.000000 +v 0.437500 0.875000 -2.000000 +v -0.250000 0.500000 -2.000000 +v 0.250000 0.500000 -2.000000 +v 0.250000 1.875000 -2.125000 +v -0.250000 1.875000 -2.125000 +v 0.437500 1.500000 -2.125000 +v -0.437500 1.500000 -2.125000 +v 0.437500 0.875000 -2.125000 +v -0.437500 0.875000 -2.125000 +v -0.250000 0.500000 -2.125000 +v 0.250000 0.500000 -2.125000 +v -0.187500 1.750000 0.562500 +v 0.187500 1.750000 0.562500 +v -0.187500 1.750000 -2.000000 +v 0.187500 1.750000 -2.000000 +v -0.187500 1.875000 -2.000000 +v -0.187500 1.875000 0.312500 +v 0.187500 1.875000 0.312500 +v 0.187500 1.875000 -2.000000 +v 0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.250000 +v 0.187500 2.000000 -2.125000 +v 0.187500 2.000000 -2.250000 +v 0.125000 2.000000 -2.125000 +v 0.125000 2.000000 -2.250000 +v 0.125000 1.875000 -2.125000 +v 0.125000 1.875000 -2.250000 +v -0.250000 1.875000 -2.125000 +v -0.250000 1.875000 -2.250000 +v -0.187500 2.000000 -2.125000 +v -0.187500 2.000000 -2.250000 +v -0.125000 2.000000 -2.125000 +v -0.125000 2.000000 -2.250000 +v -0.125000 1.875000 -2.125000 +v -0.125000 1.875000 -2.250000 +v -0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.250000 +v -0.250000 1.875000 -2.250000 +v 0.250000 1.500000 -2.625000 +v -0.250000 1.500000 -2.625000 +v 0.250000 1.375000 -3.125000 +v -0.250000 1.375000 -3.125000 +v 0.250000 1.250000 -3.125000 +v -0.250000 1.250000 -3.125000 +v 0.187500 1.500000 -2.625000 +v 0.187500 1.375000 -3.125000 +v 0.187500 1.250000 -3.125000 +v -0.187500 1.500000 -2.625000 +v -0.187500 1.375000 -3.125000 +v -0.187500 1.250000 -3.125000 +v 0.187500 1.250000 -2.625000 +v -0.187500 1.250000 -2.625000 +v 0.250000 0.562500 -2.125000 +v -0.250000 0.562500 -2.125000 +v 0.437500 1.375000 -2.000000 +v 0.312500 1.250000 -2.000000 +v 0.312500 1.125000 -2.000000 +v 0.437500 1.000000 -2.000000 +v 0.437500 1.375000 -2.125000 +v 0.312500 1.250000 -2.125000 +v 0.312500 1.125000 -2.125000 +v 0.437500 1.000000 -2.125000 +vt 0.445652 0.207692 +vt 0.054348 0.253846 +vt 0.054348 0.207692 +vt 0.054348 0.276923 +vt 0.445652 0.253846 +vt 0.445652 0.276923 +vt 0.445652 0.184615 +vt 0.054348 0.184615 +vt 0.054348 0.461538 +vt 0.119565 0.484615 +vt 0.054348 0.484615 +vt 0.054348 0.530769 +vt 0.119565 0.553846 +vt 0.054348 0.553846 +vt 0.119565 0.530769 +vt 0.510870 0.269231 +vt 0.489130 0.192308 +vt 0.510870 0.192308 +vt 0.184783 0.323077 +vt 0.119565 0.446154 +vt 0.119565 0.015385 +vt 0.184783 0.061538 +vt 0.184783 0.138462 +vt 0.032609 0.600000 +vt 0.000000 0.646154 +vt -0.000000 0.600000 +vt 0.076087 0.646154 +vt 0.032609 0.692308 +vt 0.032609 0.646154 +vt 0.032609 0.553846 +vt 0.076087 0.600000 +vt 0.108696 0.646154 +vt 0.728261 0.261538 +vt 0.733696 0.215385 +vt 0.733696 0.261538 +vt 0.717391 0.215385 +vt 0.711957 0.261538 +vt 0.711957 0.215385 +vt 0.293478 0.007692 +vt 0.288043 0.053846 +vt 0.288043 0.007692 +vt 0.717391 -0.000000 +vt 0.711957 0.023077 +vt 0.711957 0.000000 +vt 0.728261 0.169231 +vt 0.733696 0.107692 +vt 0.733696 0.169231 +vt 0.717391 0.023077 +vt 0.711957 0.046154 +vt 0.358696 0.030769 +vt 0.500000 0.038462 +vt 0.358696 0.038462 +vt 0.717391 0.107692 +vt 0.711957 0.169231 +vt 0.711957 0.107692 +vt 0.293478 0.053846 +vt 0.326087 0.061538 +vt 0.293478 0.061538 +vt 0.728261 -0.000000 +vt 0.717391 0.046154 +vt 0.711957 0.092308 +vt 0.510870 0.030769 +vt 0.516304 0.007692 +vt 0.516304 0.030769 +vt 0.733696 0.046154 +vt 0.728261 0.023077 +vt 0.733696 0.023077 +vt 0.293478 0.115385 +vt 0.326087 0.069231 +vt 0.358696 0.092308 +vt 0.728261 0.092308 +vt 0.733696 0.092308 +vt 0.326087 0.053846 +vt 0.358696 0.061538 +vt 0.728261 0.107692 +vt 0.728261 0.476923 +vt 0.733696 0.453846 +vt 0.733696 0.476923 +vt 0.717391 0.169231 +vt 0.711957 0.207692 +vt 0.711957 0.176923 +vt 0.733696 0.207692 +vt 0.733696 0.176923 +vt 0.510870 0.007692 +vt 0.293478 0.000000 +vt 0.510870 -0.000000 +vt 0.717391 0.453846 +vt 0.711957 0.476923 +vt 0.711957 0.453846 +vt 0.711957 0.430769 +vt 0.728261 0.430769 +vt 0.733696 0.384615 +vt 0.733696 0.430769 +vt 0.358696 0.069231 +vt 0.326087 0.061538 +vt 0.358696 0.061538 +vt 0.728261 0.369231 +vt 0.733696 0.369231 +vt 0.293478 0.123077 +vt 0.510870 0.115385 +vt 0.510870 0.123077 +vt 0.717391 0.369231 +vt 0.711957 0.384615 +vt 0.711957 0.369231 +vt 0.728261 0.453846 +vt 0.293478 0.069231 +vt 0.288043 0.115385 +vt 0.288043 0.069231 +vt 0.733696 0.307692 +vt 0.717391 0.384615 +vt 0.500000 0.092308 +vt 0.358696 0.084615 +vt 0.500000 0.084615 +vt 0.717391 0.307692 +vt 0.711957 0.307692 +vt 0.293478 0.061538 +vt 0.516304 0.092308 +vt 0.516304 0.115385 +vt 0.711957 0.269231 +vt 0.711957 0.300000 +vt 0.728261 0.307692 +vt 0.733696 0.269231 +vt 0.733696 0.300000 +vt 0.728261 0.384615 +vt 0.717391 0.261538 +vt 0.728261 0.215385 +vt 0.717391 0.092308 +vt 0.728261 0.046154 +vt 0.679348 0.523077 +vt 0.701087 0.492308 +vt 0.701087 0.523077 +vt 0.706522 0.484615 +vt 0.706522 0.476923 +vt 0.739130 0.476923 +vt 0.684783 0.484615 +vt 0.695652 0.484615 +vt 0.684783 0.530769 +vt 0.695652 0.530769 +vt 0.760870 0.484615 +vt 0.744565 0.492308 +vt 0.750000 0.484615 +vt 0.744565 0.523077 +vt 0.760870 0.530769 +vt 0.750000 0.530769 +vt 0.766304 0.492308 +vt 0.739130 0.492308 +vt 0.706522 0.523077 +vt 0.706522 0.492308 +vt 0.739130 0.530769 +vt 0.739130 0.538462 +vt 0.706522 0.538462 +vt 0.222826 0.861538 +vt 0.282609 0.907692 +vt 0.239130 0.907692 +vt 0.239130 0.738462 +vt 0.298913 0.784615 +vt 0.222826 0.784615 +vt 0.298913 0.861538 +vt 0.326087 0.907692 +vt 0.385870 0.861538 +vt 0.369565 0.907692 +vt 0.309783 0.784615 +vt 0.369565 0.738462 +vt 0.385870 0.784615 +vt 0.309783 0.861538 +vt 0.326087 0.923077 +vt 0.369565 0.923077 +vt 0.396739 0.907692 +vt 0.396739 0.861538 +vt 0.396739 0.784615 +vt 0.298913 0.738462 +vt 0.309783 0.907692 +vt 0.298913 0.907692 +vt 0.369565 0.723077 +vt 0.326087 0.738462 +vt 0.326087 0.723077 +vt 0.385870 0.738462 +vt 0.396739 0.738462 +vt 0.570652 0.730769 +vt 0.711957 0.761538 +vt 0.570652 0.761538 +vt 0.570652 0.638462 +vt 0.711957 0.607692 +vt 0.711957 0.638462 +vt 0.711957 0.669231 +vt 0.570652 0.669231 +vt 0.711957 0.730769 +vt 0.570652 0.576923 +vt 0.570652 0.607692 +vt 0.570652 0.792308 +vt 0.766304 0.861538 +vt 0.603261 0.815385 +vt 0.766304 0.815385 +vt 0.570652 0.815385 +vt 0.603261 0.861538 +vt 0.570652 0.861538 +vt 0.744565 0.792308 +vt 0.570652 0.792308 +vt 0.815217 0.861538 +vt 0.744565 0.884615 +vt 0.766304 0.746154 +vt 0.766304 0.930769 +vt 0.744565 0.930769 +vt 0.396739 0.861538 +vt 0.456522 0.907692 +vt 0.413043 0.907692 +vt 0.413043 0.738462 +vt 0.472826 0.784615 +vt 0.396739 0.784615 +vt 0.461957 0.815385 +vt 0.461957 0.830769 +vt 0.500000 0.907692 +vt 0.559783 0.861538 +vt 0.543478 0.907692 +vt 0.483696 0.784615 +vt 0.543478 0.738462 +vt 0.559783 0.784615 +vt 0.494565 0.830769 +vt 0.494565 0.815385 +vt 0.500000 0.923077 +vt 0.543478 0.923077 +vt 0.570652 0.907692 +vt 0.570652 0.861538 +vt 0.570652 0.784615 +vt 0.472826 0.738462 +vt 0.472826 0.861538 +vt 0.483696 0.907692 +vt 0.472826 0.907692 +vt 0.543478 0.723077 +vt 0.500000 0.738462 +vt 0.500000 0.723077 +vt 0.483696 0.800000 +vt 0.472826 0.800000 +vt 0.559783 0.738462 +vt 0.570652 0.738462 +vt 0.222826 0.692308 +vt -0.000000 0.738462 +vt -0.000000 0.692308 +vt 0.021739 0.753846 +vt 0.222826 0.800000 +vt 0.021739 0.800000 +vt 0.222826 0.738462 +vt 0.222826 0.815385 +vt 0.000000 0.753846 +vt 0.000000 0.800000 +vt 0.804348 0.646154 +vt 0.793478 0.630769 +vt 0.804348 0.630769 +vt 0.804348 0.653846 +vt 0.793478 0.646154 +vt 0.804348 0.669231 +vt 0.793478 0.653846 +vt 0.782609 0.653846 +vt 0.782609 0.638462 +vt 0.815217 0.653846 +vt 0.793478 0.707692 +vt 0.804348 0.692308 +vt 0.804348 0.707692 +vt 0.793478 0.692308 +vt 0.804348 0.684615 +vt 0.793478 0.684615 +vt 0.804348 0.669231 +vt 0.782609 0.684615 +vt 0.782609 0.700000 +vt 0.815217 0.684615 +vt 0.815217 0.700000 +vt 0.815110 0.687200 +vt 0.826087 0.746154 +vt 0.815217 0.746154 +vt 0.858696 0.692308 +vt 0.902174 0.684615 +vt 0.902174 0.692308 +vt 0.907609 0.607692 +vt 0.902174 0.623077 +vt 0.902174 0.607692 +vt 0.902174 0.738462 +vt 0.858696 0.746154 +vt 0.858696 0.738462 +vt 0.902174 0.807692 +vt 0.907609 0.823077 +vt 0.902174 0.823077 +vt 0.826087 0.684615 +vt 0.815217 0.600000 +vt 0.771739 0.553846 +vt 0.815217 0.553846 +vt 0.771739 0.600000 +vt 0.815217 0.615385 +vt 0.771739 0.630769 +vt 0.750000 0.553846 +vt 0.750000 0.600000 +vt 0.815217 0.538462 +vt 0.771739 0.523077 +vt 0.858696 0.638462 +vt 0.858696 0.792308 +vt 0.815217 0.907692 +vt 0.472826 0.846154 +vt 0.483696 0.861538 +vt 0.472826 0.830769 +vt 0.483696 0.846154 +vt 0.472826 0.815385 +vt 0.483696 0.830769 +vt 0.483696 0.815385 +vt 0.456522 0.269231 +vt 0.733696 -0.000000 +vt 0.119565 0.461538 +vt 0.489130 0.269231 +vt 0.445652 0.323077 +vt 0.423913 0.323077 +vt 0.184783 0.400000 +vt 0.152174 0.446154 +vt 0.054348 0.000000 +vt 0.119565 -0.000000 +vt 0.152174 0.015385 +vt 0.445652 0.138462 +vt 0.423913 0.138462 +vt 0.097826 0.692308 +vt 0.097826 0.553846 +vt 0.108696 0.600000 +vt 0.500000 0.030769 +vt 0.510870 0.092308 +vt 0.358696 0.053846 +vt 0.717391 0.476923 +vt 0.717391 0.430769 +vt 0.679348 0.492308 +vt 0.739130 0.484615 +vt 0.766304 0.523077 +vt 0.739130 0.523077 +vt 0.706522 0.530769 +vt 0.282609 0.738462 +vt 0.385870 0.907692 +vt 0.309783 0.738462 +vt 0.711957 0.576923 +vt 0.711957 0.792308 +vt 0.815217 0.815385 +vt 0.570652 0.884615 +vt 0.744565 0.746154 +vt 0.456522 0.738462 +vt 0.559783 0.907692 +vt 0.483696 0.738462 +vt 0.222826 0.753846 +vt -0.000000 0.815385 +vt 0.793478 0.669231 +vt 0.815217 0.638462 +vt 0.793478 0.669231 +vt 0.858696 0.684615 +vt 0.907609 0.623077 +vt 0.902174 0.746154 +vt 0.907609 0.807692 +vt 0.815217 0.523077 +vt 0.456522 0.192308 +vt 0.043478 0.276923 +vt 0.043478 0.461538 +vt 0.043478 -0.000000 +vt 0.043478 0.184615 +vt 0.043478 0.253846 +vt 0.043478 0.207692 +vt 0.043478 0.484615 +vt 0.043478 0.530769 +vt 0.043478 0.553846 +vt 0.032609 0.276923 +vt 0.032609 0.461538 +vt 0.032609 0.000000 +vt 0.032609 0.184615 +vt 0.032609 0.207692 +vt 0.032609 0.253846 +vt 0.032609 0.530769 +vt 0.032609 0.553846 +vt 0.032609 0.484615 +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 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.5547 -0.8321 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 -0.7071 -0.7071 +vn -0.8944 0.4472 0.0000 +vn 0.8944 0.4472 0.0000 +vn 0.8944 -0.4472 0.0000 +vn -0.8944 -0.4472 0.0000 +vn 0.0000 -0.8944 0.4472 +vn 0.0000 0.8944 0.4472 +vn 0.0000 0.9701 -0.2425 +vn 0.0000 0.7071 -0.7071 +vn 0.6269 -0.2597 0.7345 +vn 0.6269 0.2597 0.7345 +vn -0.6269 0.2597 0.7345 +vn -0.6269 -0.2597 0.7345 +vn 0.2597 -0.6269 0.7345 +vn -0.2597 -0.6269 0.7345 +vn 0.2597 0.6269 0.7345 +vn -0.2597 0.6269 0.7345 +vn -0.8125 0.3366 0.4760 +vn -0.8125 -0.3366 0.4760 +vn 0.8125 -0.3366 0.4760 +vn 0.8125 0.3366 0.4760 +vn 0.3366 0.8125 0.4760 +vn -0.3366 0.8125 0.4760 +vn 0.3366 -0.8125 0.4760 +vn -0.3366 -0.8125 0.4760 +s off +f 266/358/82 305/359/82 304/360/82 +f 301/361/83 269/362/83 263/363/83 +f 262/364/84 304/360/84 302/365/84 +f 300/366/85 287/367/85 307/368/85 +f 306/369/86 284/370/86 303/371/86 +f 307/368/87 286/372/87 306/369/87 +f 271/373/87 290/374/87 270/375/87 +f 273/376/88 279/377/88 301/361/88 +f 278/378/89 274/379/89 272/380/89 +f 295/381/90 292/382/90 293/383/90 +f 298/384/89 292/385/89 294/386/89 +f 293/387/88 299/388/88 295/381/88 +f 299/388/87 294/386/87 295/381/87 +f 299/388/91 296/389/91 298/384/91 +f 359/390/92 333/391/92 355/392/92 +f 356/393/90 354/394/90 332/395/90 +f 364/396/90 317/397/90 316/398/90 +f 371/399/93 326/400/93 323/401/93 +f 379/402/92 329/403/92 331/404/92 +f 374/405/90 289/406/90 326/400/90 +f 369/407/87 323/408/87 321/409/87 +f 376/410/90 330/411/90 328/412/90 +f 365/413/87 319/414/87 317/415/87 +f 373/416/88 374/405/88 371/399/88 +f 363/417/90 282/418/90 289/406/90 +f 373/419/92 324/420/92 325/421/92 +f 288/422/92 375/423/92 327/424/92 +f 384/425/89 387/426/89 389/427/89 +f 361/428/92 288/422/92 283/429/92 +f 367/430/94 321/431/94 319/414/94 +f 377/432/92 283/429/92 329/403/92 +f 364/396/88 369/407/88 367/430/88 +f 282/418/90 376/410/90 328/412/90 +f 393/433/95 349/434/95 347/435/95 +f 378/436/90 332/437/90 330/438/90 +f 333/439/92 379/402/92 331/440/92 +f 372/441/82 316/442/82 324/443/82 +f 394/444/93 345/445/93 348/446/93 +f 337/447/90 394/444/90 348/446/90 +f 382/448/92 335/449/92 336/450/92 +f 389/451/94 341/452/94 343/453/94 +f 335/449/92 397/454/92 351/455/92 +f 338/456/82 392/457/82 346/458/82 +f 396/459/90 334/460/90 350/461/90 +f 395/462/92 336/450/92 349/434/92 +f 385/463/90 338/464/90 339/465/90 +f 397/454/92 353/466/92 351/455/92 +f 380/467/90 337/447/90 334/460/90 +f 391/468/87 343/469/87 345/470/87 +f 398/471/90 350/461/90 352/472/90 +f 387/426/87 339/473/87 341/452/87 +f 392/457/92 347/474/92 346/475/92 +f 354/476/90 398/471/90 352/477/90 +f 399/478/92 355/479/92 353/480/92 +f 394/444/84 382/448/84 395/462/84 +f 382/448/89 380/467/89 381/481/89 +f 381/481/96 396/459/96 397/454/96 +f 399/478/89 396/459/89 398/471/89 +f 398/471/86 359/390/86 399/478/86 +f 356/393/87 359/390/87 358/482/87 +f 356/393/85 379/402/85 357/483/85 +f 379/402/88 376/410/88 377/432/88 +f 360/484/97 377/432/97 376/410/97 +f 362/485/88 360/484/88 363/417/88 +f 363/417/83 375/423/83 362/485/83 +f 393/433/89 394/444/89 395/462/89 +f 322/486/84 400/487/84 403/488/84 +f 400/489/92 340/490/92 342/491/92 +f 400/487/92 320/492/92 340/493/92 +f 386/494/90 403/488/90 368/495/90 +f 318/496/92 401/497/92 342/498/92 +f 402/499/90 388/500/90 366/501/90 +f 390/502/83 402/499/83 401/497/83 +f 407/503/82 405/504/82 404/505/82 +f 400/487/89 405/504/89 403/488/89 +f 402/499/88 407/503/88 401/497/88 +f 402/506/90 366/507/90 368/508/90 +f 410/509/90 409/510/90 408/511/90 +f 414/512/90 413/513/90 412/514/90 +f 412/514/90 411/515/90 410/509/90 +f 416/516/92 419/517/92 417/518/92 +f 420/519/92 422/520/92 421/521/92 +f 418/522/92 421/521/92 419/517/92 +f 409/523/87 417/518/87 408/524/87 +f 408/525/96 419/517/96 410/526/96 +f 410/526/89 421/521/89 412/527/89 +f 415/528/98 420/519/98 413/513/98 +f 411/515/97 416/529/97 409/530/97 +f 414/531/82 423/532/82 415/533/82 +f 413/513/88 418/522/88 411/515/88 +f 412/527/99 422/534/99 414/535/99 +f 426/536/89 429/537/89 424/538/89 +f 425/539/98 434/540/98 428/541/98 +f 425/539/88 430/542/88 427/543/88 +f 427/543/87 431/544/87 426/536/87 +f 433/545/82 434/540/82 432/546/82 +f 429/537/99 433/547/99 424/538/99 +f 440/548/82 443/549/82 441/550/82 +f 439/551/100 442/552/100 438/553/100 +f 437/554/89 443/549/89 439/555/89 +f 441/550/92 446/556/92 440/548/92 +f 436/557/88 442/552/88 440/548/88 +f 437/554/89 447/558/89 441/550/89 +f 436/557/88 446/559/88 444/560/88 +f 450/561/90 449/562/90 448/563/90 +f 454/564/90 453/565/90 452/566/90 +f 452/566/90 510/567/90 509/568/90 +f 456/569/92 459/570/92 457/571/92 +f 460/572/92 462/573/92 461/574/92 +f 513/575/92 514/576/92 461/574/92 +f 449/577/87 457/571/87 448/578/87 +f 448/579/96 459/570/96 450/580/96 +f 450/580/89 461/574/89 452/581/89 +f 455/582/98 460/572/98 453/565/98 +f 451/583/97 456/584/97 449/585/97 +f 454/586/82 463/587/82 455/588/82 +f 453/565/88 515/589/88 511/590/88 +f 452/581/99 462/591/99 454/592/99 +f 466/593/82 465/594/82 464/595/82 +f 470/596/87 468/597/87 469/598/87 +f 467/599/88 470/596/88 465/594/88 +f 466/600/89 469/598/89 468/597/89 +f 465/601/101 469/598/101 464/602/101 +f 475/603/97 472/604/97 473/605/97 +f 477/606/87 474/607/87 475/603/87 +f 479/608/89 476/609/89 477/606/89 +f 474/607/90 478/610/90 472/611/90 +f 475/603/92 479/612/92 477/606/92 +f 480/613/96 483/614/96 481/615/96 +f 482/616/87 485/617/87 483/614/87 +f 484/618/88 487/619/88 485/617/88 +f 486/620/90 482/616/90 480/621/90 +f 483/614/92 487/622/92 481/623/92 +f 489/624/87 491/625/87 488/626/87 +f 498/627/102 494/628/102 499/629/102 +f 500/630/92 494/631/92 496/632/92 +f 502/633/102 493/634/102 501/635/102 +f 495/636/92 503/637/92 497/638/92 +f 490/639/103 498/627/103 501/635/103 +f 503/640/87 504/641/87 500/642/87 +f 505/643/88 502/644/88 501/645/88 +f 498/646/92 505/643/92 501/647/92 +f 499/648/89 504/641/89 498/649/89 +f 496/632/88 494/631/88 492/650/88 +f 493/651/89 497/638/89 507/652/89 +f 508/653/88 458/654/88 451/583/88 +f 509/655/83 512/656/83 508/653/83 +f 510/657/88 513/658/88 509/655/88 +f 511/590/85 514/659/85 510/657/85 +f 290/374/92 263/660/92 266/358/92 +f 375/423/95 325/661/95 327/424/95 +f 266/358/82 269/362/82 305/359/82 +f 301/361/83 305/359/83 269/362/83 +f 262/364/84 266/358/84 304/360/84 +f 300/366/85 285/662/85 287/367/85 +f 306/369/86 286/372/86 284/370/86 +f 307/368/87 287/367/87 286/372/87 +f 271/373/87 291/663/87 290/374/87 +f 301/361/88 263/363/88 273/376/88 +f 263/363/88 291/664/88 271/665/88 +f 271/665/88 273/376/88 263/363/88 +f 285/662/88 300/366/88 279/377/88 +f 300/366/88 301/361/88 279/377/88 +f 275/666/88 277/667/88 279/377/88 +f 273/376/88 275/666/88 279/377/88 +f 302/365/89 303/668/89 278/378/89 +f 303/668/89 284/669/89 278/378/89 +f 278/378/89 276/670/89 274/379/89 +f 290/671/89 262/364/89 270/672/89 +f 262/364/89 302/365/89 272/380/89 +f 270/672/89 262/364/89 272/380/89 +f 302/365/89 278/378/89 272/380/89 +f 295/381/90 294/386/90 292/382/90 +f 298/384/89 296/673/89 292/385/89 +f 293/387/88 297/674/88 299/388/88 +f 299/388/87 298/384/87 294/386/87 +f 299/388/91 297/675/91 296/389/91 +f 359/390/92 357/483/92 333/391/92 +f 356/393/90 358/482/90 354/394/90 +f 364/396/90 365/413/90 317/397/90 +f 371/399/93 374/405/93 326/400/93 +f 379/402/92 377/432/92 329/403/92 +f 374/405/90 363/417/90 289/406/90 +f 369/407/87 371/676/87 323/408/87 +f 376/410/90 378/436/90 330/411/90 +f 365/413/87 367/430/87 319/414/87 +f 373/416/88 375/423/88 374/405/88 +f 363/417/90 360/484/90 282/418/90 +f 373/419/92 372/441/92 324/420/92 +f 288/422/92 362/485/92 375/423/92 +f 384/425/89 385/463/89 387/426/89 +f 389/427/89 391/468/89 392/457/89 +f 391/468/89 393/677/89 392/457/89 +f 389/427/89 392/457/89 384/425/89 +f 361/428/92 362/485/92 288/422/92 +f 367/430/94 369/678/94 321/431/94 +f 377/432/92 361/428/92 283/429/92 +f 364/396/88 372/441/88 369/407/88 +f 372/441/88 373/419/88 371/676/88 +f 371/676/88 369/407/88 372/441/88 +f 367/430/88 365/413/88 364/396/88 +f 282/418/90 360/484/90 376/410/90 +f 393/433/95 395/462/95 349/434/95 +f 378/436/90 356/393/90 332/437/90 +f 333/439/92 357/483/92 379/402/92 +f 372/441/82 364/396/82 316/442/82 +f 394/444/93 391/679/93 345/445/93 +f 337/447/90 383/680/90 394/444/90 +f 382/448/92 381/481/92 335/449/92 +f 389/451/94 387/426/94 341/452/94 +f 335/449/92 381/481/92 397/454/92 +f 338/456/82 384/425/82 392/457/82 +f 396/459/90 380/467/90 334/460/90 +f 395/462/92 382/448/92 336/450/92 +f 385/463/90 384/425/90 338/464/90 +f 397/454/92 399/478/92 353/466/92 +f 380/467/90 383/680/90 337/447/90 +f 391/468/87 389/427/87 343/469/87 +f 398/471/90 396/459/90 350/461/90 +f 387/426/87 385/463/87 339/473/87 +f 392/457/92 393/677/92 347/474/92 +f 354/476/90 358/482/90 398/471/90 +f 399/478/92 359/390/92 355/479/92 +f 394/444/84 383/680/84 382/448/84 +f 382/448/89 383/680/89 380/467/89 +f 381/481/96 380/467/96 396/459/96 +f 399/478/89 397/454/89 396/459/89 +f 398/471/86 358/482/86 359/390/86 +f 356/393/87 357/483/87 359/390/87 +f 356/393/85 378/436/85 379/402/85 +f 379/402/88 378/436/88 376/410/88 +f 360/484/97 361/428/97 377/432/97 +f 362/485/88 361/428/88 360/484/88 +f 363/417/83 374/405/83 375/423/83 +f 393/433/89 391/679/89 394/444/89 +f 322/486/84 344/681/84 400/487/84 +f 342/491/92 401/682/92 400/489/92 +f 401/682/92 407/503/92 400/489/92 +f 407/503/92 404/505/92 400/489/92 +f 400/487/92 344/681/92 320/492/92 +f 386/494/90 322/486/90 403/488/90 +f 318/496/92 390/502/92 401/497/92 +f 402/499/90 370/683/90 388/500/90 +f 390/502/83 370/683/83 402/499/83 +f 407/503/82 406/684/82 405/504/82 +f 400/487/89 404/505/89 405/504/89 +f 402/499/88 406/684/88 407/503/88 +f 368/508/90 403/685/90 402/506/90 +f 403/685/90 405/504/90 402/506/90 +f 405/504/90 406/684/90 402/506/90 +f 410/509/90 411/515/90 409/510/90 +f 414/512/90 415/686/90 413/513/90 +f 412/514/90 413/513/90 411/515/90 +f 416/516/92 418/522/92 419/517/92 +f 420/519/92 423/532/92 422/520/92 +f 418/522/92 420/519/92 421/521/92 +f 409/523/87 416/516/87 417/518/87 +f 408/525/96 417/687/96 419/517/96 +f 410/526/89 419/517/89 421/521/89 +f 415/528/98 423/688/98 420/519/98 +f 411/515/97 418/522/97 416/529/97 +f 414/531/82 422/520/82 423/532/82 +f 413/513/88 420/519/88 418/522/88 +f 412/527/99 421/521/99 422/534/99 +f 426/536/89 431/544/89 429/537/89 +f 425/539/98 432/546/98 434/540/98 +f 425/539/88 428/541/88 430/542/88 +f 427/543/87 430/542/87 431/544/87 +f 433/545/82 435/689/82 434/540/82 +f 429/537/99 435/690/99 433/547/99 +f 440/548/82 442/552/82 443/549/82 +f 439/551/100 443/549/100 442/552/100 +f 437/554/89 441/550/89 443/549/89 +f 441/550/92 447/691/92 446/556/92 +f 436/557/88 438/692/88 442/552/88 +f 437/554/89 445/693/89 447/558/89 +f 436/557/88 440/548/88 446/559/88 +f 450/561/90 451/583/90 449/562/90 +f 454/564/90 455/694/90 453/565/90 +f 451/583/90 450/561/90 509/568/90 +f 450/561/90 452/566/90 509/568/90 +f 452/566/90 453/565/90 510/567/90 +f 453/565/90 511/590/90 510/567/90 +f 508/653/90 451/583/90 509/568/90 +f 456/569/92 458/654/92 459/570/92 +f 460/572/92 463/587/92 462/573/92 +f 461/574/92 459/570/92 513/575/92 +f 459/570/92 458/654/92 513/575/92 +f 458/654/92 512/656/92 513/575/92 +f 514/576/92 515/589/92 460/572/92 +f 514/576/92 460/572/92 461/574/92 +f 449/577/87 456/569/87 457/571/87 +f 448/579/96 457/695/96 459/570/96 +f 450/580/89 459/570/89 461/574/89 +f 455/582/98 463/696/98 460/572/98 +f 451/583/97 458/654/97 456/584/97 +f 454/586/82 462/573/82 463/587/82 +f 453/565/88 460/572/88 515/589/88 +f 452/581/99 461/574/99 462/591/99 +f 466/593/82 467/599/82 465/594/82 +f 470/596/87 471/697/87 468/597/87 +f 467/599/88 471/697/88 470/596/88 +f 466/600/89 464/698/89 469/598/89 +f 465/601/101 470/596/101 469/598/101 +f 475/603/97 474/607/97 472/604/97 +f 477/606/87 476/609/87 474/607/87 +f 479/608/89 478/699/89 476/609/89 +f 474/607/90 476/609/90 478/610/90 +f 475/603/92 473/700/92 479/612/92 +f 480/613/96 482/616/96 483/614/96 +f 482/616/87 484/618/87 485/617/87 +f 484/618/88 486/701/88 487/619/88 +f 486/620/90 484/618/90 482/616/90 +f 483/614/92 485/617/92 487/622/92 +f 489/624/87 490/639/87 491/625/87 +f 498/627/102 492/702/102 494/628/102 +f 500/630/92 499/703/92 494/631/92 +f 502/633/102 495/704/102 493/634/102 +f 495/636/92 502/705/92 503/637/92 +f 493/634/103 491/625/103 501/635/103 +f 491/625/103 490/639/103 501/635/103 +f 490/639/103 492/702/103 498/627/103 +f 503/640/87 505/643/87 504/641/87 +f 505/643/88 503/640/88 502/644/88 +f 498/646/92 504/641/92 505/643/92 +f 499/648/89 500/642/89 504/641/89 +f 490/639/88 489/624/88 492/650/88 +f 489/624/88 506/706/88 492/650/88 +f 506/706/88 496/632/88 492/650/88 +f 488/626/89 491/625/89 493/651/89 +f 493/651/89 495/636/89 497/638/89 +f 507/652/89 488/626/89 493/651/89 +f 508/653/88 512/656/88 458/654/88 +f 509/655/83 513/658/83 512/656/83 +f 510/657/88 514/659/88 513/658/88 +f 511/590/85 515/589/85 514/659/85 +f 266/358/92 262/707/92 290/374/92 +f 290/374/92 291/663/92 263/660/92 +f 263/660/92 269/362/92 266/358/92 +f 375/423/95 373/416/95 325/661/95 +s 1 +f 309/708/104 300/366/105 308/709/105 +f 311/710/106 302/365/107 310/711/107 +f 313/712/108 304/360/109 305/359/108 +f 312/713/109 302/365/107 304/360/109 +f 309/708/104 305/359/108 301/361/104 +f 315/714/110 306/369/111 314/715/111 +f 314/715/111 303/371/106 311/716/106 +f 308/709/105 307/368/110 315/714/110 +f 261/717/112 308/709/113 265/718/113 +f 264/719/114 310/711/115 260/720/115 +f 267/721/116 313/712/117 268/722/117 +f 260/720/115 312/713/116 267/721/116 +f 268/722/117 309/708/112 261/717/112 +f 280/723/118 315/714/119 314/715/118 +f 264/724/114 314/715/118 311/716/114 +f 265/718/113 315/714/119 281/725/119 +f 309/708/104 301/361/104 300/366/105 +f 311/710/106 303/668/106 302/365/107 +f 313/712/108 312/713/109 304/360/109 +f 312/713/109 310/711/107 302/365/107 +f 309/708/104 313/712/108 305/359/108 +f 315/714/110 307/368/110 306/369/111 +f 314/715/111 306/369/111 303/371/106 +f 308/709/105 300/366/105 307/368/110 +f 261/717/112 309/708/112 308/709/113 +f 264/719/114 311/710/114 310/711/115 +f 267/721/116 312/713/116 313/712/117 +f 260/720/115 310/711/115 312/713/116 +f 268/722/117 313/712/117 309/708/112 +f 280/723/118 281/725/119 315/714/119 +f 264/724/114 280/723/118 314/715/118 +f 265/718/113 308/709/113 315/714/119 diff --git a/src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png b/src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..d70ec8952d0e8e1359c5752c89a2bb0370bcc58e GIT binary patch literal 1817 zcmV+!2j=*RP)qi^Yw5CNLnlw#n z)1)tLV*1vHCVlszeQa8r^ufgRrS?Is#*bRtVpVJrP_TfA2&{-~5Lgj*@6Nrq59=h2Y=ggbYPj#?n^M1K;^-v}y(2nQ0+g;K zC|!~I9fR8g+WHx~2KC6=P89Vq7ijBe`1)ncxkNj$V(BehJh|S{oXwQesl< zenmDmIb+~dn`X)V83TL|(|?L0M1UYO@oPsAmwOokTI_8t9=ZVxkN*z^xNtp)3;zaj z-)BO%kPwAY2{1NkU^ZaJJtsJQMT5((U|X%2IKd^rkLUd88PO5Y=J$6VX8b0G#&uMe z#5SvENXPW7iH0>)$bkx%$xGY>OwgVWgc6^=k=V*m^7GBRIxau<-YVR4_u7kgP=R~N__To$@6%r3*GvpQ_It*F zzq&Nc2Kdq#A&Jo8^8sAB!9N>eCm?3MOYv+?`k`jBWtyN>qIOrqg;~ zyv72+TMc#$-_zlp7L!ym2Kd5f0dd+?3DAE>$JJX5^%d5JA|!leyA(85r!RedlJnix zkI;lw8U;&<&{&WRgjm0d<1*PdYoK#LN1sQ>=!6l;2hs&0p&0PN>rTs8Z15-2e^?y1CPbtt)W#c|8NLqmJPxvwT#9p1wfrqKD5OYwHwCOGfcb`HSzNe$5 zD+u2#Ujdc007c6d$33@q+QgZ54F^v6apat_t`PMK)!3F5os zehiGpPNQRy^iawRRoJNfYwa-M_*1lupt30W<8w=MnU|HA0EC1NI8%+ouAp&U8Z*JN zLN%eQu<}9`pY3*GeQD}0Hgp51Tt!e@o<;#Su2zxlQsRo>uq$XMJNHoxc|>FI1yO&dEM!N2Z@U9K>TIx4!0lA9tuFQy?t0lCxlE-rO0$|z&jQHAY^NeO-MeH zvb#YZ{=U7mUh-f3-M9Q}QKK{mvi}>3}H_!bNhj7qx@~88wCJH4<^5M!xViat_>Mb0AK?CM@d8*G6)GE;QLLC0jEy_Tec+rO#X5) zee)nxfY~|V(xt?o`Q+$c^nY`RzjF?R3Xsm{M3E7oeLqYdBii?eqCbxS?fYSF`a;f5 zKy}G8AiICUSZEe_Uo9nd2c%bnBR|MZ zgro}~n~VUm4UkPn0NDn}CL@4s17wpCK(+z0$p|3Z0NMNpWTAx+uN`!=00000NkvXX Hu0mjfly^)+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png b/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2844eee414e007ed9aa81bf13bb9993e6aaef6 GIT binary patch literal 3361 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png b/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png new file mode 100644 index 0000000000000000000000000000000000000000..5d544cf1e183cd0c423a5dcae6969519960d7b4a GIT binary patch literal 3346 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 literal 0 HcmV?d00001