From 22aefff48d5839e7de10fd0f8e8ca377236f36d1 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Tue, 6 May 2025 23:18:28 +0200 Subject: [PATCH 01/16] 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: Fri, 9 May 2025 19:38:11 +0200 Subject: [PATCH 02/16] whos getting the best head: A. Alvin B. Theodore C. Simon (Secret option) Me --- .../java/com/hbm/config/StructureConfig.java | 12 ++-- .../java/com/hbm/itempool/ItemPoolsPile.java | 44 +++++++++++--- .../java/com/hbm/main/StructureManager.java | 11 ++++ src/main/java/com/hbm/util/LootGenerator.java | 17 +++++- .../com/hbm/world/gen/NTMWorldGenerator.java | 59 +++++++++++++++++-- 5 files changed, 124 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/hbm/config/StructureConfig.java b/src/main/java/com/hbm/config/StructureConfig.java index 2f6bb9bf9..5ce4c6d51 100644 --- a/src/main/java/com/hbm/config/StructureConfig.java +++ b/src/main/java/com/hbm/config/StructureConfig.java @@ -10,8 +10,8 @@ public class StructureConfig { public static int enableStructures = 2; - public static int structureMinChunks = 8; - public static int structureMaxChunks = 24; + public static int structureMinChunks = 4; + public static int structureMaxChunks = 12; public static double lootAmountFactor = 1D; @@ -25,15 +25,15 @@ public class StructureConfig { enableStructures = CommonConfig.parseStructureFlag(unparsedStructureFlag); - structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 8); - structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 24); + structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 4); + structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 16); lootAmountFactor = CommonConfig.createConfigDouble(config, CATEGORY_STRUCTURES, "5.03_lootAmountFactor", "General factor for loot spawns. Applies to spawned IInventories, not loot blocks.", 1D); debugStructures = CommonConfig.createConfigBool(config, CATEGORY_STRUCTURES, "5.04_debugStructures", "If enabled, special structure blocks like jigsaw blocks will not be transformed after generating", false); - structureMinChunks = CommonConfig.setDef(structureMinChunks, 8); - structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 24); + structureMinChunks = CommonConfig.setDef(structureMinChunks, 4); + structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 12); if(structureMinChunks > structureMaxChunks) { MainRegistry.logger.error("Fatal error config: Minimum value has been set higher than the maximum value!"); diff --git a/src/main/java/com/hbm/itempool/ItemPoolsPile.java b/src/main/java/com/hbm/itempool/ItemPoolsPile.java index ad2a7f3ae..0a4378211 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsPile.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsPile.java @@ -21,9 +21,10 @@ public class ItemPoolsPile { public static final String POOL_PILE_MAKESHIFT_PLATES = "POOL_PILE_MAKESHIFT_PLATES"; public static final String POOL_PILE_MAKESHIFT_WIRE = "POOL_PILE_MAKESHIFT_WIRE"; public static final String POOL_PILE_NUKE_STORAGE = "POOL_PILE_NUKE_STORAGE"; - + public static final String POOL_PILE_OF_GARBAGE = "POOL_PILE_OF_GARBAGE"; + public static void init() { - + //items found in glyphid hives new ItemPool(POOL_PILE_HIVE) {{ this.pool = new WeightedRandomChestContent[] { @@ -56,7 +57,7 @@ public class ItemPoolsPile { weighted(Items.experience_bottle, 0, 1, 3, 5), }; }}; - + //items found in glyphid bone piles new ItemPool(POOL_PILE_BONES) {{ this.pool = new WeightedRandomChestContent[] { @@ -65,7 +66,7 @@ public class ItemPoolsPile { weighted(ModItems.biomass, 0, 1, 1, 2) }; }}; - + //bottlecap stashess new ItemPool(POOL_PILE_CAPS) {{ this.pool = new WeightedRandomChestContent[] { @@ -74,7 +75,7 @@ public class ItemPoolsPile { weighted(ModItems.cap_sparkle, 0, 4, 4, 1), }; }}; - + //medicine stashes new ItemPool(POOL_PILE_MED_SYRINGE) {{ this.pool = new WeightedRandomChestContent[] { @@ -91,13 +92,13 @@ public class ItemPoolsPile { weighted(ModItems.siox, 0, 1, 1, 5), }; }}; - + //makeshift gun new ItemPool(POOL_PILE_MAKESHIFT_GUN) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.gun_maresleg, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_WRENCH) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.wrench, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_PLATES) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.plate_steel, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_WIRE) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.wire_fine, Mats.MAT_ALUMINIUM.id, 1, 1, 10) }; }}; - + new ItemPool(POOL_PILE_NUKE_STORAGE) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.ammo_standard, EnumAmmo.NUKE_STANDARD.ordinal(), 1, 1, 50), @@ -106,5 +107,34 @@ public class ItemPoolsPile { }; }}; + + new ItemPool(POOL_PILE_OF_GARBAGE) {{ + this.pool = new WeightedRandomChestContent[] { + weighted(ModItems.pipe, 2600, 0, 2, 20), + weighted(ModItems.scrap, 0, 1, 5, 20), + weighted(ModItems.wire_fine, 8200, 1, 2, 20), + weighted(ModItems.dust, 0, 1, 3, 40), + weighted(ModItems.dust_tiny, 0, 1, 7, 40), + weighted(ModItems.powder_cement, 0, 1, 6, 40), + weighted(ModItems.nugget_lead, 0, 0, 3, 20), + weighted(ModItems.wire_fine, 0, 0, 3, 20), + weighted(ModItems.powder_ash, 0, 0, 1, 15), + weighted(ModItems.plate_lead, 0, 0, 1, 15), + weighted(Items.string, 0, 0, 1, 15), + weighted(ModItems.bolt, 8200, 0, 2, 15), + weighted(ModItems.pin, 0, 0, 2, 15), + weighted(ModItems.cap_nuka, 0, 0, 8, 15), + weighted(ModItems.plate_iron, 0, 0, 2, 15), + weighted(ModItems.fallout, 0, 0, 2, 15), + weighted(ModItems.coil_tungsten, 0, 0, 2, 15), + weighted(ModItems.can_empty, 0, 0, 1, 15), + weighted(ModItems.ingot_asbestos, 0, 0, 1, 15), + weighted(ModItems.syringe_metal_empty, 0, 0, 1, 15), + weighted(ModItems.syringe_empty, 0, 0, 1, 15), + weighted(ModItems.pipe_lead, 0, 0, 1, 5), + weighted(ModItems.motor, 0, 0, 1, 5), + weighted(ModItems.canned_conserve, 2, 0, 1, 5), + }; + }}; } } diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 5c3f93090..c9f840b76 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -62,6 +62,17 @@ public class StructureManager { 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 ntmruinsA = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsA.nbt")); + public static final NBTStructure ntmruinsB = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsB.nbt")); + public static final NBTStructure ntmruinsC = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsC.nbt")); + public static final NBTStructure ntmruinsD = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsD.nbt")); + public static final NBTStructure ntmruinsE = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsE.nbt")); + public static final NBTStructure ntmruinsF = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsF.nbt")); + public static final NBTStructure ntmruinsG = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsG.nbt")); + public static final NBTStructure ntmruinsH = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsH.nbt")); + public static final NBTStructure ntmruinsI = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsI.nbt")); + public static final NBTStructure ntmruinsJ = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsJ.nbt")); + public static final NBTStructure spire = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/spire.nbt")); // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index b14306b9e..586ff6295 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -28,6 +28,7 @@ public class LootGenerator { public static final String LOOT_BONES = "LOOT_BONES"; public static final String LOOT_GLYPHID_HIVE = "LOOT_GLYPHID_HIVE"; public static final String LOOT_METEOR = "LOOT_METEOR"; + public static final String LOOT_SHIT = "LOOT_SHIT"; public static void applyLoot(World world, int x, int y, int z, String name) { switch(name) { @@ -40,6 +41,7 @@ public class LootGenerator { case LOOT_BONES: lootBones(world, x, y, z); case LOOT_GLYPHID_HIVE: lootGlyphidHive(world, x, y, z); case LOOT_METEOR: lootBookMeteor(world, x, y, z); + case LOOT_SHIT: lootShit(world, x, y, z); default: lootBones(world, x, y, z); break; } } @@ -55,6 +57,7 @@ public class LootGenerator { LOOT_BONES, LOOT_GLYPHID_HIVE, LOOT_METEOR, + LOOT_SHIT, }; } @@ -211,4 +214,16 @@ public class LootGenerator { } } -} \ No newline at end of file + public static void lootShit(World world, int x, int y, int z) { + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + + int limit = world.rand.nextInt(3) + 3; + for(int i = 0; i < limit; i++) { + addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_OF_GARBAGE), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); + } + } + } +} diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index bb1c7b3d3..cbbf13197 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -46,7 +46,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()); @@ -102,8 +102,7 @@ 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; structure = new JigsawPiece("dish", StructureManager.dish, -10); @@ -112,8 +111,58 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); - NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsA", StructureManager.ntmruinsA, -1) {{conformToTerrain = true;}}; + spawnWeight = 20; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsB", StructureManager.ntmruinsB, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsC", StructureManager.ntmruinsC, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsD", StructureManager.ntmruinsD, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsE", StructureManager.ntmruinsE, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsF", StructureManager.ntmruinsF, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsG", StructureManager.ntmruinsG, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsH", StructureManager.ntmruinsH, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsI", StructureManager.ntmruinsI, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsJ", StructureManager.ntmruinsJ, -1) {{conformToTerrain = true;}}; + spawnWeight = 35; + }}); + + NBTStructure.registerNullWeight(0, 4, oceanBiomes::contains); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); From f69a1d887617f8d47de4ddd152785e783257f1ed Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Sun, 11 May 2025 16:49:47 +0200 Subject: [PATCH 03/16] AAAAAAAAAAAAAAAAAAAAAA --- src/main/java/com/hbm/main/StructureManager.java | 2 ++ .../com/hbm/world/gen/NTMWorldGenerator.java | 13 ++++++++----- .../assets/hbm/structures/forest_post.nbt | Bin 0 -> 5642 bytes 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/forest_post.nbt diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 5c3f93090..ca0cf2ad2 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -62,6 +62,8 @@ public class StructureManager { 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 forest_post = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/forest_post.nbt")); + public static final NBTStructure spire = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/spire.nbt")); // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.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..37b634229 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -46,7 +46,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()); @@ -102,8 +102,6 @@ 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; structure = new JigsawPiece("dish", StructureManager.dish, -10); @@ -112,8 +110,13 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); - NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> biome == BiomeGenBase.forest; + structure = new JigsawPiece("forest_post", StructureManager.forest_post, -9); + 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/forest_post.nbt b/src/main/resources/assets/hbm/structures/forest_post.nbt new file mode 100644 index 0000000000000000000000000000000000000000..dea57e75e23afce9545d4fa99f08e1ee5bdf2b33 GIT binary patch literal 5642 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 Date: Mon, 30 Jun 2025 17:38:36 +0200 Subject: [PATCH 04/16] sdsa --- .../java/com/hbm/blocks/machine/Charger.java | 32 +++++++++++------- .../java/com/hbm/main/StructureManager.java | 1 + .../com/hbm/world/gen/NTMWorldGenerator.java | 14 +++++--- .../assets/hbm/structures/laboratory.nbt | Bin 0 -> 8333 bytes 4 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/laboratory.nbt diff --git a/src/main/java/com/hbm/blocks/machine/Charger.java b/src/main/java/com/hbm/blocks/machine/Charger.java index 4ae72544b..5b17ddcc9 100644 --- a/src/main/java/com/hbm/blocks/machine/Charger.java +++ b/src/main/java/com/hbm/blocks/machine/Charger.java @@ -1,6 +1,7 @@ package com.hbm.blocks.machine; import com.hbm.tileentity.machine.TileEntityCharger; +import com.hbm.world.gen.INBTTransformable; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -12,8 +13,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class Charger extends BlockContainer { - +public class Charger extends BlockContainer implements INBTTransformable { + public Charger(Material mat) { super(mat); } @@ -22,17 +23,17 @@ public class Charger extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCharger(); } - + @Override public int getRenderType(){ return -1; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; @@ -40,9 +41,9 @@ public class Charger extends BlockContainer { @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); } @@ -60,13 +61,13 @@ public class Charger extends BlockContainer { @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { float f = 0.0625F; - + switch(world.getBlockMetadata(x, y, z)) { - case 2: this.setBlockBounds(5 * f, 0.25F, 12 * f, 11 * f, 0.75F, 1F); break; - case 3: this.setBlockBounds(5 * f, 0.25F, 0F, 11 * f, 0.75F, 4 * f); break; - case 4: this.setBlockBounds(12 * f, 0.25F, 5 * f, 1F, 0.75F, 11 * f); break; - case 5: this.setBlockBounds(0F, 0.25F, 5 * f, 4 * f, 0.75F, 11 * f); break; - default: this.setBlockBounds(5 * f, 0.25F, 5 * f, 11 * f, 0.75F, 11 * f); break; + case 2: this.setBlockBounds(5 * f, 0.25F, 12 * f, 11 * f, 0.75F, 1F); break; + case 3: this.setBlockBounds(5 * f, 0.25F, 0F, 11 * f, 0.75F, 4 * f); break; + case 4: this.setBlockBounds(12 * f, 0.25F, 5 * f, 1F, 0.75F, 11 * f); break; + case 5: this.setBlockBounds(0F, 0.25F, 5 * f, 4 * f, 0.75F, 11 * f); break; + default: this.setBlockBounds(5 * f, 0.25F, 5 * f, 11 * f, 0.75F, 11 * f); break; } } @@ -75,4 +76,9 @@ public class Charger extends BlockContainer { this.setBlockBoundsBasedOnState(world, x, y, z); return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); } + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } } diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 5c3f93090..09a0d1890 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -61,6 +61,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 laboratory = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/laboratory.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..c30ef4ed6 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -46,7 +46,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()); @@ -102,8 +102,6 @@ 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; structure = new JigsawPiece("dish", StructureManager.dish, -10); @@ -112,8 +110,16 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> biome == BiomeGenBase.plains; + structure = new JigsawPiece("laboratory", StructureManager.laboratory, -10); + minHeight = 53; + maxHeight = 65; + spawnWeight = 8; + }}); + NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); + 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/laboratory.nbt b/src/main/resources/assets/hbm/structures/laboratory.nbt new file mode 100644 index 0000000000000000000000000000000000000000..da6452881a1199668386eba548bef49b8c1ad679 GIT binary patch literal 8333 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 literal 0 HcmV?d00001 From e5b29e3352caf7e79ac3853b0c84244ad060f6c8 Mon Sep 17 00:00:00 2001 From: George Paton Date: Wed, 27 Aug 2025 13:12:01 +1000 Subject: [PATCH 05/16] 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 06/16] 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 b98c8c3f98c45d9fa44321af319571431493ba9c Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 15:12:47 +0200 Subject: [PATCH 07/16] sdsa --- .../assets/hbm/structures/ntmruinsA.nbt | Bin 0 -> 2328 bytes .../assets/hbm/structures/ntmruinsB.nbt | Bin 0 -> 2166 bytes .../assets/hbm/structures/ntmruinsC.nbt | Bin 0 -> 2204 bytes .../assets/hbm/structures/ntmruinsD.nbt | Bin 0 -> 1976 bytes .../assets/hbm/structures/ntmruinsE.nbt | Bin 0 -> 1675 bytes .../assets/hbm/structures/ntmruinsF.nbt | Bin 0 -> 806 bytes .../assets/hbm/structures/ntmruinsG.nbt | Bin 0 -> 529 bytes .../assets/hbm/structures/ntmruinsH.nbt | Bin 0 -> 753 bytes .../assets/hbm/structures/ntmruinsI.nbt | Bin 0 -> 597 bytes .../assets/hbm/structures/ntmruinsJ.nbt | Bin 0 -> 1327 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsA.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsB.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsC.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsD.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsE.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsF.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsG.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsH.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsI.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsJ.nbt diff --git a/src/main/resources/assets/hbm/structures/ntmruinsA.nbt b/src/main/resources/assets/hbm/structures/ntmruinsA.nbt new file mode 100644 index 0000000000000000000000000000000000000000..100fab771e210d83f85bba2c4f5e3a3ec237090b GIT binary patch literal 2328 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/structures/ntmruinsE.nbt b/src/main/resources/assets/hbm/structures/ntmruinsE.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8a367816551123059e6256d83fb52e28eeb95301 GIT binary patch literal 1675 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/structures/ntmruinsI.nbt b/src/main/resources/assets/hbm/structures/ntmruinsI.nbt new file mode 100644 index 0000000000000000000000000000000000000000..d85d370d1240918894961e1cdf99430d045aab6d GIT binary patch literal 597 zcmV-b0;>HViwFP!000000IinWj?*v@hNrQeLzm-L0xp2Pf=jfp2%&ulv~Lh4snJ?Z z;>tEi%hThub+EiX1npMxMXPUS{`qI(bPZ4emh2Bj05F|GAEHlLK}ko&6r&QRPX&3~ z^KK{C`pdTp(4I>ZWIhD~B2}a4DZ*t|`eYWf3NXlGvH*iE1_c;mG1y^Nrvny40*tLW z4=}doBEaAUjIFs0F!=(ei1>Wy$2OoN9JW1w1A2EV;Hg^Pi$VZ*AWkA9}{}q znfmm&GxgPSXZlQ6Lu0G-PaXd?s%bhUWNZr?#d>5JRXs(%tv6sZX^bBJg{vyD{3^$D3*UJE78-5;O^2kuIX90Y@r!GBm@;P=n7=}b1 zM&j|%)nk}cE!RWWAL8lV?JM`pebRHr6di7wo~pTxVt@QPz2-M-Sl-$C|yMGtze&ABx z1;W2SLgDwJ!mZ#tIws>U5@Smy_+RN)kF+tL=R64dN(3MBhTm;D9(XZ=g19!DNr&78|B7C;1czIog;_uM<83uAH>qorR4~Yo zfb998HPIQ2og0~lv31TpOgw-|h(2J_0rN1O!Pq(%9%gJYV+Ru`z5o*|8U`YES6uSk zeN0C38Bap?9PMK_0~kAh&OA&ofCv>rF9o zRyhml9oJgYJNG?IsxXmQOZGu93Gra!@P&*W4D$t;kn9-@J9jY57hsq#z%XBc$w=J* zWBWqhR}+UXT=Pg@xc0310!*yvEPdgdN7G08Le|V=|F0dptl?nn*yVi#j264}myfYy zf8b%*_npMyFX^4s9N)*}T>{LA)C4fhUtn0@0mJV6U|5X;!}13VtE*sGT?NDZ1;+00 z4?WD8a$bQr3wh@Uqn(BHvX9ZuLV8)&1Td`Dfzi%FdfCUY@42Zt_OdH>&C6hzm%-Sv z%lj&rl=wY0J1<9yPlxzj_EV`(W_BMt4`naN%yCWl*u$_q1jEh(3_A-j>@2{rdkYxW zQ^2r11jFv4V2T0rjFow$-!D9jrnBaEFs$~1VYL?wyB~tFb(TFBjHYuSbe8_g%(35H zacO=Bqs1=$?pjN`8|P;C84;i6=GcQihTVI?Fnz$V+yKM$0b}bU`vn-*m%*@ixnP(F z!LavrxjFWitn*-49RtI13=Dg342Jm&411>s#@0~YH^A5$K5{U!=gPhVCQ|k+J$PXX z6Ru`mXu@T+GFu{CPXF9lBU+Z-)NDfwo4Wh{?|*(BnRNNv_4T5>>SKx4b-gh8PcL7- zp8WE|kFPTmZ~ro4?!TQaUv$-?{Q9b#*ONtEcbN&QEAw#k%k5uN-cA0PuCBKK)z8^A z)tfhE<2nji5*`btFvsmwzLo&P+9??J>H-Xt84R;B7&)8enIm?o&$&ZGc^2o6c{a?r>dNJ->7wio%ctwz zkDGM*tT4r^re2rL=8wJEzW$A#ZA#tG(`9KMAL`n?Ud@}bD<|!;uV8PDHuAzTaxtB$ z;~w;7xturC>+VI>)T_yC+O(cQ-y8;ge!SSMspdCq$!}SZ>uRx>HlC4}@3ro2s80@~ zcY_Xd^x@BM`i7%T@YFZKtf_Cx)uhjaYJhrQ`lg}dpXuXw+fY?};!Coj8#v_{zB~E& zZ`b|87x=Pn+jpnyHZbhdH~y89c|$Yj{pPvd&m+$~YU-RO;pH6#@cho_IW3;&cU=)~ lud|0ctGe`wF24M~dk; Date: Wed, 27 Aug 2025 15:28:38 +0200 Subject: [PATCH 08/16] labubu funk --- src/main/java/com/hbm/lib/HbmWorld.java | 4 +- .../com/hbm/world/gen/MapGenNTMFeatures.java | 46 +++++----- .../hbm/world/gen/component/RuinFeatures.java | 88 +++++++++---------- 3 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index ed4ca9208..9e5f03161 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -40,8 +40,8 @@ public class HbmWorld { private static void registerNTMFeatures() { CivilianFeatures.registerComponents(); OfficeFeatures.registerComponents(); - RuinFeatures.registerComponents(); +// RuinFeatures.registerComponents(); BunkerComponents.registerComponents(); MapGenStructureIO.func_143031_a(SiloComponent.class, "NTMSiloComponent"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java index 20f380ed9..96641134f 100644 --- a/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java @@ -15,10 +15,10 @@ import com.hbm.world.gen.component.CivilianFeatures.NTMLab2; import com.hbm.world.gen.component.CivilianFeatures.RuralHouse1; import com.hbm.world.gen.component.OfficeFeatures.LargeOffice; import com.hbm.world.gen.component.OfficeFeatures.LargeOfficeCorner; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin1; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin2; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin3; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin4; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin1; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin2; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin3; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin4; import com.hbm.world.gen.component.SiloComponent; import net.minecraft.world.World; @@ -124,26 +124,26 @@ public class MapGenNTMFeatures extends MapGenStructure { */ //TODO: Do something about this so it's nice-looking and easily readable. Plus, test compatibility against mods like BoP - if(rand.nextInt(3) == 0) { //Empty Ruin Structures - switch(rand.nextInt(4)) { - case 0: - NTMRuin1 ruin1 = new NTMRuin1(rand, i, j); - this.components.add(ruin1); - break; - case 1: - NTMRuin2 ruin2 = new NTMRuin2(rand, i, j); - this.components.add(ruin2); - break; - case 2: - NTMRuin3 ruin3 = new NTMRuin3(rand, i, j); - this.components.add(ruin3); - break; - case 3: - NTMRuin4 ruin4 = new NTMRuin4(rand, i, j); - this.components.add(ruin4); - } +// if(rand.nextInt(3) == 0) { //Empty Ruin Structures +// switch(rand.nextInt(4)) { +// case 0: +// NTMRuin1 ruin1 = new NTMRuin1(rand, i, j); +// this.components.add(ruin1); +// break; +// case 1: +// NTMRuin2 ruin2 = new NTMRuin2(rand, i, j); +// this.components.add(ruin2); +// break; +// case 2: +// NTMRuin3 ruin3 = new NTMRuin3(rand, i, j); +// this.components.add(ruin3); +// break; +// case 3: +// NTMRuin4 ruin4 = new NTMRuin4(rand, i, j); +// this.components.add(ruin4); +// } - } else if(biome.heightVariation <= 0.25F && rand.nextInt(10) == 0) { //for now our only restriction is kinda-flat biomes. that and chance might change idk + if(biome.heightVariation <= 0.25F && rand.nextInt(10) == 0) { //for now our only restriction is kinda-flat biomes. that and chance might change idk SiloComponent silo = new SiloComponent(rand, i, j); this.components.add(silo); } else if(biome.temperature >= 1.0 && biome.rainfall == 0 && !(biome instanceof BiomeGenMesa)) { //Desert & Savannah diff --git a/src/main/java/com/hbm/world/gen/component/RuinFeatures.java b/src/main/java/com/hbm/world/gen/component/RuinFeatures.java index 9204e7b0e..0e59878d5 100644 --- a/src/main/java/com/hbm/world/gen/component/RuinFeatures.java +++ b/src/main/java/com/hbm/world/gen/component/RuinFeatures.java @@ -8,42 +8,42 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraft.world.gen.structure.StructureBoundingBox; - +// Idk what i should do with these if you read this bob do whatever since it's not used anywhere public class RuinFeatures { - + public static void registerComponents() { MapGenStructureIO.func_143031_a(NTMRuin1.class, "NTMRuin1"); MapGenStructureIO.func_143031_a(NTMRuin2.class, "NTMRuin2"); MapGenStructureIO.func_143031_a(NTMRuin3.class, "NTMRuin3"); MapGenStructureIO.func_143031_a(NTMRuin4.class, "NTMRuin4"); } - + public static class NTMRuin1 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin1() { super(); } - + public NTMRuin1(Random rand, int minX, int minZ) { super(rand, minX, 64, minZ, 8, 6, 10); } @Override public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - + //System.out.println(this.coordBaseMode); if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 8, 10, -1, box); - + int pillarMetaWE = this.getPillarMeta(4); int pillarMetaNS = this.getPillarMeta(8); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 6, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.fillWithMetadataBlocks(world, box, 1, 3, 0, 3, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); this.fillWithBlocks(world, box, 4, 0, 0, 4, 6 - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); @@ -83,39 +83,39 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 8, 0, 6, 8, 0, 6, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 8, 0, 10 - 2, 8, 1, 10 - 1, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 8, 2, 10 - 1, 8, 2, 10 - 1, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, 8 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin2 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin2() { super(); } - + public NTMRuin2(Random rand, int minX, int minZ) { super(rand, minX, 64, minZ, 7, 5, 10); } @Override public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - + //System.out.println(this.coordBaseMode); if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 7, 10, -1, box); - + int pillarMetaWE = this.getPillarMeta(4); int pillarMetaNS = this.getPillarMeta(8); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.fillWithMetadataBlocks(world, box, 1, 3, 0, 7 - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); this.fillWithBlocks(world, box, 7, 0, 0, 7, 5, 0, ModBlocks.concrete_pillar, Blocks.air, false); @@ -146,40 +146,40 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 7, 0, 6, 7, 0, 10 - 1, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 7, 1, 6, 7, 1, 7, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 7, 1, 10 - 1, 7, 2, 10 - 1, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, 7 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin3 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin3() { super(); } - + public NTMRuin3(Random rand, int minX, int minZ) { super(rand, minX, 64, minZ, 8, 3, 10); } @Override public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - + //System.out.println(this.coordBaseMode); if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 0, 10, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 8, 0, 8, 10, -1, box); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, 8, 0, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 4, 8, 4, -1, box); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.fillWithBlocks(world, box, 8, 0, 0, 8, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 8 - 1, 0, 0, false, rand, RandomConcreteBricks); @@ -202,44 +202,44 @@ public class RuinFeatures { this.fillWithBlocks(world, box, 4, 0, 4, 4, 2, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Center Wall this.fillWithRandomizedBlocks(world, box, 3, 0, 4, 3, 1, 4, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 5, 0, 4, 8 - 1, 1, 4, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, 8 - 1, 0, 3, Blocks.gravel, Blocks.air, false); this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 5, 8 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin4 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin4() { super(); } - + public NTMRuin4(Random rand, int minX, int minZ) { super(rand, minX, 64, minZ, 10, 2, 11); } @Override public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - + //System.out.println(this.coordBaseMode); if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 0, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 10, 5, 10, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 0, 5, 4, -1, box); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 11, 10 - 1, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, 4, 0, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 5, 10 - 1, 5, -1, box); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 1 this.fillWithBlocks(world, box, 5, 0, 0, 5, 2, 0, ModBlocks.concrete_pillar, Blocks.air, false); this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 4, 0, 0, false, rand, RandomConcreteBricks); @@ -263,12 +263,12 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, 11 - 1, false, rand, RandomConcreteBricks); //Left Wall this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 1, 1, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 1, 7, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, 4, 0, 5, Blocks.gravel, Blocks.air, false); this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 6, 10 - 1, 0, 11 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + } From 76b51ebca951dea6788350c75c049f06b1f30dd4 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 16:04:30 +0200 Subject: [PATCH 09/16] 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 9a7f991092121b6e3b5055a08687c7bb4284956b Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 17:16:07 +0200 Subject: [PATCH 10/16] resolve hopefully i hope --- .../java/com/hbm/world/gen/NTMWorldGenerator.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 049428707..d4109655a 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -103,8 +103,6 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 8; }}); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); //why the fuck did this change - NBTStructure.registerStructure(0, new SpawnCondition("dish") {{ canSpawn = biome -> biome == BiomeGenBase.plains; structure = new JigsawPiece("dish", StructureManager.dish, -10); @@ -113,8 +111,16 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); + NBTStructure.registerStructure(0, new SpawnCondition("labolatory") {{ + canSpawn = biome -> biome == BiomeGenBase.plains; + structure = new JigsawPiece("laboratory", StructureManager.laboratory, -10); + minHeight = 53; + maxHeight = 65; + spawnWeight = 8; + }}); + NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); + NBTStructure.registerNullWeight(0, 4, oceanBiomes::contains); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); From 848ac39463735dcf6a5e24a11dc2ad66aedec76f Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 17:24:58 +0200 Subject: [PATCH 11/16] 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 66971b3310cbca7ca98d20baa7475338338f376d Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 17:36:40 +0200 Subject: [PATCH 12/16] SIX @SEVEN --- src/main/java/com/hbm/util/LootGenerator.java | 14 +++++ .../com/hbm/world/gen/NTMWorldGenerator.java | 51 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index cee32e713..a91ec0e3a 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -29,6 +29,7 @@ public class LootGenerator { public static final String LOOT_GLYPHID_HIVE = "LOOT_GLYPHID_HIVE"; public static final String LOOT_METEOR = "LOOT_METEOR"; public static final String LOOT_FLAREGUN = "LOOT_FLAREGUN"; + public static final String LOOT_SHIT = "LOOT_SHIT"; public static void applyLoot(World world, int x, int y, int z, String name) { switch(name) { @@ -42,6 +43,7 @@ public class LootGenerator { case LOOT_GLYPHID_HIVE: lootGlyphidHive(world, x, y, z); case LOOT_METEOR: lootBookMeteor(world, x, y, z); case LOOT_FLAREGUN: lootFlareGun(world, x, y, z); + case LOOT_SHIT: lootShit(world, x, y, z); default: lootBones(world, x, y, z); break; } } @@ -233,4 +235,16 @@ public class LootGenerator { 0.25, k * 0.03125, 0.125); } } + public static void lootShit(World world, int x, int y, int z) { + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + + int limit = world.rand.nextInt(3) + 3; + for(int i = 0; i < limit; i++) { + addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_OF_GARBAGE), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); + } + } + } } diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 049428707..3fcb7e903 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -113,6 +113,57 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin1") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsA", StructureManager.ntmruinsA, -1) {{conformToTerrain = true;}}; + spawnWeight = 20; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin2") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsB", StructureManager.ntmruinsB, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin3") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsC", StructureManager.ntmruinsC, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin4") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsD", StructureManager.ntmruinsD, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin5") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsE", StructureManager.ntmruinsE, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin6") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsF", StructureManager.ntmruinsF, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin7") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsG", StructureManager.ntmruinsG, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin8") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsH", StructureManager.ntmruinsH, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin9") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsI", StructureManager.ntmruinsI, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin10") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsJ", StructureManager.ntmruinsJ, -1) {{conformToTerrain = true;}}; + spawnWeight = 35; + }}); + 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 13/16] 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 14/16] 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 15/16] 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 16/16] 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 zcmV+t4ej!YP)&ube=7RO&NI`36BOxA6QEQ0J|#ljvp(jj2X+;R%cA%=i2 z%ih8smtjuB+~(%Ri}tXPQ*J}>l7l+?4=5LdAjobf0m*+w?ZH!asZ~{7)m^{)eIUf$ zR;%06w_m?{-};d)77GFv8IQ-A&G$zT8NI!|J>S=WAlCSe?+ZW>n`DF#t0_vBWtgHM z-l!EHA%tu;8vp><-`_{EB2j@U3X(J^a3pE81ioIct>)_pVj7I#NYeCtUjPz5ALjF| zC->9oG@4?Aw!lrLDZVN)Uv94Num9?*yx%_<88iyg*H^b=J>C~hQk1jv836z|eRbmX+Iz7@XEyTjsEdZN zA0G>&VGhex31{as;#1_&R8dr;pXjx*A0H#5VGaOy(VRwf*F+V;>!Kfh4I2g7V|0&~ zy_bvgzk6T6@v{k3#X*JBhUKdMT1-H%)mJpHJ=uD_CN^#YoqpnH=QE=7rLqF$ZL6?c zm0MqqkMmQgC~OG52`V{wHE##t|4p{3t)j%(U%VPc>Au*{UlqEmC~OKJ(OkO@jy($9 z<12p^q5DLw!Zttw>_+ow8ktC1jE4DEBh=P;P~eu(ZCrL0+m#kAfn$22#&T6|HN>7y zr&(egAW4t@#kSx+>wz%{8g^ANg`~O`7K7)hB}Q??I*NVM?HF>CuY~<$`#`_GqUf zr-E)HZkAAt9@Fsp-wz6OWGw=oJkFCyM|_N0>c!Cin3kSYzhvIuG#KQ{h6^u3`aXZ` z_!^S86~VvxUGDPSN__o%S69}p96UNW%s$NLgqkk8eXQv@N5kCf`E`y76`$ixqpE|e zL^d{hR$s63w5lG%Zu>ZY?D!r`-DAi9ef?bexCSM3A{y_*d~|TA97RP=q|fuaV6j*b zQ}emAH?z+%r9Ik0j-^9Tn+SJx)!ar7<@~nciM(k|nrfd;G2B_06022YW*3=%&oy7cNW#7%E3*-6IYkc-xZRo zgI`=+kbb|f^x8lF>5ts~w%06T&yVXD*(ZqzesOUTe42&$Aqjy4xQo0g)9?2|^$A$z z%gr?ju|1bmiqh}*qnrgGBy`iJ5A!);t0JL^yeFy}=(OBjwu%wE(Ak4&pxA6Su(!8& zKLIP<-rL&~&M&!K-A$VzD+ktj0;crTI)ca0mj$s04Ukl@)olRJMo*iAecP~IVKkIS z!w_L-_2P|iaz*P#CW;%8!H#P3asI{;Jhq4uGcN4?<*F2V18t#G+4+d%LV>G17DI{N zw6sMVKS*bw5miw{^>9|??0##5jsYI-xXVxF z&H&dKKo`>tx^uR(+d2ZR2FR-5udYgS(?*CMC$TglWsfn$9+#iWt?f3$>#BlZu1a$= zTUB?cL~oq|v~Bp70C^2>;3s$izht|sQFKMzRWXHlj_UEDbOGKHcvak@LC9Y}@2+5A zgV*o|{s4c0*YE~@ffrl9>x#I$1}$zpolY|osi&|nib`SLcDd&#cmXtmv!J-$b9O!> zwx1+a+`3~@tE+Fbg$Ak7Q#T0Nc1`oI|Gj|U_WSSyEZ~O)-2V|>6L%^T|A;WLI2Ef2 zC4s+tU(|l6w$l{s{(46YIe1f=Mr|G+KYrZV*Sa^M%_xq}Wao3M8hx!JIB!izfaX&VEEWqA z%NJ#WE}2xe7J_9(T@|?aB!mzs3OH*xy+Io%ihk*-rzpIfu`R9w!{7e?59y8h{AjYZ z-6U$)^+f^L6*S%E_C*N=wr>d%H$Il{W(iW@l++`5NH?&^8drT1^Bi!K6%rMApJ&hl zN9@4s$)__w_|d^(Ru!~pp)8x?R_Q&80!O5-wdi-JuTHW#6ZPkUCxB?bjOnjWjq!M# z@hT-0nrF-23kBXm+IEy{BHAYJKbcJK_lY9)dc7txk)yzo;1LYmf%SS_du)&b?^12p z2Wx;skq1EaaQdmmKwAi>iarmt5?LnR*g#Ri;3lyqa1*NpbOn_g+IDBFr_*Uhr+}bKt@v6i$RyeVce&JHNJfZny7W|2 zMMWRI{|M@g-xlw>XMwz(Z`n57_cS%hvn zOzrsDWNVve?3fgKTduFS-BP-JczBqpq-NFQDTjxL_IeY_zMQl389|XhaQtjyY#NTi zAcuGFi=Fou1u7FlZ^L{(CuLb0c`x4kcrkiL!yH9!iFfY{PEKFc9_M=L5m%)~Z%(FZ zk(;_M#6B+T=w7XQ6!`-@m$*sVQrE~7LF?e!C)B`(uw^OEd_E^e1WxllHkVZ0XF}w$ z4srWmQE+o+O4Hn2rIAT-m3!-oTc-h==Q#ja%)uY>z6bHD?gI#C9y=fKb7o5Y+%#2G z8=0XB8=zTrMij+^>`kc4?d>h}`+amip}vvnvRdL>+yIFP90`l2xwfggI*T!Z^9G%& z?nBJs!pW2olDGjdf_o=sCzHiz7g|w@lIJ-JJOpBQGDGPf&a0-Nz!Sr@lW9ua^ZA^# zNmHn}>CaT;NeNuky%w=UD3M!6>!rK_9&$eRQLDPo6tNEo7!2~Ae@z$-b9nN2`=3fK zubZMY5qDXZ(vqI(vf^|)HPf5$>Z*j%aC>1Y)qN(2d3aomPG+4DsfgLMp)5;y`SK-{ zWeG)5Z2itA!K5fAMsDAHUBk`S`nfV}(4?!uhxwd@>}1YnGg1{|UDsBbkc*-a9%qYS z1m0!4-XtM7nLHu04L@1*Zrj+bVk8Ggx`j-DRLEsn?g%;0b7!duC71|~n8CM`2_TQq zETV{RGK!wIh{^3ovKGw%&r=pwF39Gyj+)v-N~$?DrQ-u(^M4ieJ7f_^Vj)O z*v?Vd5DXueP9`sktBP5*(b*PEQ4AuRNWQuno$Y1NeWEJnI$@iL;+Ucs;_Q4zWNAj- zn8;YiWLBeiQ!(2DBe-W`bTaGE6|>D$1qJSzkey6bR4Xb?Ec~`<3JN?iLU1y9__FZP z$wZ8x5@m~`*y+n6b3Q3;y5(X7PmBu!i=)5|vRsvo zM46hCse^3`zgFPrWUBFWI?c|`XGB(SZo7P+3chETl|^wA7QQYR!3~naqD{6iVc|DP zQ_#r_gjk(S9-=62%EH$HQxwmn=w$LRC1%|yjwy;~QgAYP@S=Fzfe=kVfhR_&P9~40 zqwjU1I69e#HDn^BLY_<}JMJdW@oY*k5!^)ytqX+eWb$Y;`d*b_1m4vWTS`tQ4^c&> zt#z-Org&eY2kEYp>7vnTY>giJKf4}}%063|m?_I9ww_qNoy@lASobPXJeU;4Bvjm^ zVGeIEiu?V~k0ze3XqV7$Ko_{M?voTaOG-|r3Z_Qi*DVE}w7@B{ zFSzM6#cg1P+Z891hYRaIX@S$Zv3Vl)A#8x{=^{d(UDhV9M&BC~_~oZ^X9YFYeYT*H zo2Du}v8OgaNlZ?rDKVd%h#Tz5MsOdO~F}@r+yzmw{7~=olG5qUFo>Z8a>NZY25Un)2PWBk|9OxE;^aE zRyMBUHAS%@ZuY(D|FmJtHZp075|YqOVA9EyHQsdK)v0GQb4FK?jZB;3X3sGi=Jyej zjbc@yyCSt4N(Gzqp48z*;4Z`susxoXMsk|hvK_!&^5y25RBtxXb)@WMy26^kWgn>P zuCcOf@!hMj%TA^XtO-1X{@u@yCc$>LqIA{CbVagta5@PO>zamCjy!#JVkIRA(aAJ5 c{HzK82kN#+4H!Phi2wiq07*qoM6N<$g2v8w3jhEB literal 0 HcmV?d00001