From 4f6edf12a521bffea6b75b5189b64dfa378dde3f Mon Sep 17 00:00:00 2001 From: Toshayo Date: Wed, 27 Jul 2022 21:27:29 +0200 Subject: [PATCH 001/111] Change access modifier to satellite registration to allow custom satellites. --- .../com/hbm/saveddata/satellites/Satellite.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/saveddata/satellites/Satellite.java b/src/main/java/com/hbm/saveddata/satellites/Satellite.java index c552b802c..70c65e0ac 100644 --- a/src/main/java/com/hbm/saveddata/satellites/Satellite.java +++ b/src/main/java/com/hbm/saveddata/satellites/Satellite.java @@ -50,11 +50,17 @@ public abstract class Satellite { registerSatellite(SatelliteLunarMiner.class, ModItems.sat_lunar_miner); registerSatellite(SatelliteHorizons.class, ModItems.sat_gerald); } - - private static void registerSatellite(Class sat, Item item) { - satellites.add(sat); - itemToClass.put(item, sat); + /** + * Register satellite. + * @param sat - Satellite class + * @param item - Satellite item (which will be placed in a rocket) + */ + public static void registerSatellite(Class sat, Item item) { + if(!itemToClass.containsKey(item) && !itemToClass.containsValue(sat)) { + satellites.add(sat); + itemToClass.put(item, sat); + } } public static void orbit(World world, int id, int freq, double x, double y, double z) { From ba2565733db565c1082aa5c7b4ac7d7559650c1d Mon Sep 17 00:00:00 2001 From: Toshayo Date: Thu, 28 Jul 2022 09:40:47 +0200 Subject: [PATCH 002/111] =?UTF-8?q?Add=20comments=20to=20config=20entries?= =?UTF-8?q?=20(instead=20of=20having=20those=20in=20pinned=20discord=20mes?= =?UTF-8?q?sages=20=C2=AF\=5F(=E3=83=84)=5F/=C2=AF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hbm/config/GeneralConfig.java | 42 +++++++++---------- src/main/java/com/hbm/config/ToolConfig.java | 20 ++++----- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 44c05fa3c..21aa4c875 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -53,27 +53,27 @@ public class GeneralConfig { public static void loadFromConfig(Configuration config) { final String CATEGORY_GENERAL = CommonConfig.CATEGORY_GENERAL; - enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false).getBoolean(false); - enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false).getBoolean(false); - enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false).getBoolean(false); - enableDungeons = config.get(CATEGORY_GENERAL, "1.03_enableDungeonSpawn", true).getBoolean(true); - enableMDOres = config.get(CATEGORY_GENERAL, "1.04_enableOresInModdedDimensions", true).getBoolean(true); - enableMines = config.get(CATEGORY_GENERAL, "1.05_enableLandmineSpawn", true).getBoolean(true); - enableRad = config.get(CATEGORY_GENERAL, "1.06_enableRadHotspotSpawn", true).getBoolean(true); - enableNITAN = config.get(CATEGORY_GENERAL, "1.07_enableNITANChestSpawn", true).getBoolean(true); - enableNukeClouds = config.get(CATEGORY_GENERAL, "1.08_enableMushroomClouds", true).getBoolean(true); - enableBomberShortMode = config.get(CATEGORY_GENERAL, "1.14_enableBomberShortMode", false).getBoolean(false); - enableVaults = config.get(CATEGORY_GENERAL, "1.15_enableVaultSpawn", true).getBoolean(true); - enableCataclysm = config.get(CATEGORY_GENERAL, "1.17_enableCataclysm", false).getBoolean(false); - enableExtendedLogging = config.get(CATEGORY_GENERAL, "1.18_enableExtendedLogging", false).getBoolean(false); - enableHardcoreTaint = config.get(CATEGORY_GENERAL, "1.19_enableHardcoreTaint", false).getBoolean(false); - enableGuns = config.get(CATEGORY_GENERAL, "1.20_enableGuns", true).getBoolean(true); - enableVirus = config.get(CATEGORY_GENERAL, "1.21_enableVirus", false).getBoolean(false); - enableCrosshairs = config.get(CATEGORY_GENERAL, "1.22_enableCrosshairs", true).getBoolean(true); - enableReflectorCompat = config.get(CATEGORY_GENERAL, "1.24_enableReflectorCompat", false).getBoolean(false); - enableRenderDistCheck = config.get(CATEGORY_GENERAL, "1.25_enableRenderDistCheck", true).getBoolean(true); - enableCustomDashKeybind = config.get(CATEGORY_GENERAL, "1.26_enableCustomDashKeybind", false).getBoolean(false); - enableReEval = config.get(CATEGORY_GENERAL, "1.27_enableReEval", true).getBoolean(true); + enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false, "Enable debugging mode").getBoolean(false); + enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false, "Allows mycelium to spread").getBoolean(false); + enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false, "Enables plutonium ore generation in the nether").getBoolean(false); + enableDungeons = config.get(CATEGORY_GENERAL, "1.03_enableDungeonSpawn", true, "Allows custom generation like meteor dungeons and whatnot to spawn").getBoolean(true); + enableMDOres = config.get(CATEGORY_GENERAL, "1.04_enableOresInModdedDimensions", true, "Allows NTM ores to generate in modded dimensions").getBoolean(true); + enableMines = config.get(CATEGORY_GENERAL, "1.05_enableLandmineSpawn", true, "Allows landmines to generate").getBoolean(true); + enableRad = config.get(CATEGORY_GENERAL, "1.06_enableRadHotspotSpawn", true, "Allows radiation hotspots to generate").getBoolean(true); + enableNITAN = config.get(CATEGORY_GENERAL, "1.07_enableNITANChestSpawn", true, "Allows chests to spawn at specific coordinates full of powders").getBoolean(true); + enableNukeClouds = config.get(CATEGORY_GENERAL, "1.08_enableMushroomClouds", true, "Allow these green clouds after nuke explosions").getBoolean(true); + enableBomberShortMode = config.get(CATEGORY_GENERAL, "1.14_enableBomberShortMode", false, "Has bomber planes spawn in closer to the target for use with smaller render distances").getBoolean(false); + enableVaults = config.get(CATEGORY_GENERAL, "1.15_enableVaultSpawn", true, "Allows vaults to spawn").getBoolean(true); + enableCataclysm = config.get(CATEGORY_GENERAL, "1.17_enableCataclysm", false, "Causes satellites to fall whenever a mob dies").getBoolean(false); + enableExtendedLogging = config.get(CATEGORY_GENERAL, "1.18_enableExtendedLogging", false, "Allows logs about nuke, grenade explosions, detonators activated, missiles launched, etc.").getBoolean(false); + enableHardcoreTaint = config.get(CATEGORY_GENERAL, "1.19_enableHardcoreTaint", false, "Allows tainted mobs to spread taint").getBoolean(false); + enableGuns = config.get(CATEGORY_GENERAL, "1.20_enableGuns", true, "Allows guns to be obtainable").getBoolean(true); + enableVirus = config.get(CATEGORY_GENERAL, "1.21_enableVirus", false, "Allows virus blocks to spread").getBoolean(false); + enableCrosshairs = config.get(CATEGORY_GENERAL, "1.22_enableCrosshairs", true, "Shows custom crosshairs when an NTM gun is being held").getBoolean(true); + enableReflectorCompat = config.get(CATEGORY_GENERAL, "1.24_enableReflectorCompat", false, "Enable old reflector oredict name (\"plateDenseLead\") instead of new \"plateTungCar\"").getBoolean(false); + enableRenderDistCheck = config.get(CATEGORY_GENERAL, "1.25_enableRenderDistCheck", true, "Check invalid render distances (over 16, without OptiFine) and fix it").getBoolean(true); + enableCustomDashKeybind = config.get(CATEGORY_GENERAL, "1.26_enableCustomDashKeybind", false, "Enable custom dash keybind instead of shift").getBoolean(false); + enableReEval = config.get(CATEGORY_GENERAL, "1.27_enableReEval", true, "Allows re-evaluating power networks on link remove instead of destroying and recreating").getBoolean(true); hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.27_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); diff --git a/src/main/java/com/hbm/config/ToolConfig.java b/src/main/java/com/hbm/config/ToolConfig.java index fd03a0fe7..16ffc3216 100644 --- a/src/main/java/com/hbm/config/ToolConfig.java +++ b/src/main/java/com/hbm/config/ToolConfig.java @@ -26,15 +26,15 @@ public class ToolConfig { recursiveStone = CommonConfig.createConfigBool(config, CATEGORY_TOOLS, "11.01_recursionStone", "Determines whether veinminer can break stone", false); recursiveNetherrack = CommonConfig.createConfigBool(config, CATEGORY_TOOLS, "11.02_recursionNetherrack", "Determines whether veinminer can break netherrack", false); - abilityHammer = config.get(CATEGORY_TOOLS, "11.03_hammerAbility", true).getBoolean(true); - abilityVein = config.get(CATEGORY_TOOLS, "11.04_abilityVein", true).getBoolean(true); - abilityLuck = config.get(CATEGORY_TOOLS, "11.05_abilityLuck", true).getBoolean(true); - abilitySilk = config.get(CATEGORY_TOOLS, "11.06_abilitySilk", true).getBoolean(true); - abilityFurnace = config.get(CATEGORY_TOOLS, "11.07_abilityFurnace", true).getBoolean(true); - abilityShredder = config.get(CATEGORY_TOOLS, "11.08_abilityShredder", true).getBoolean(true); - abilityCentrifuge = config.get(CATEGORY_TOOLS, "11.09_abilityCentrifuge", true).getBoolean(true); - abilityCrystallizer = config.get(CATEGORY_TOOLS, "11.10_abilityCrystallizer", true).getBoolean(true); - abilityMercury = config.get(CATEGORY_TOOLS, "11.11_abilityMercury", true).getBoolean(true); - abilityExplosion = config.get(CATEGORY_TOOLS, "11.12_abilityExplosion", true).getBoolean(true); + abilityHammer = config.get(CATEGORY_TOOLS, "11.03_hammerAbility", true, "Allows AoE ability").getBoolean(true); + abilityVein = config.get(CATEGORY_TOOLS, "11.04_abilityVein", true, "Allows veinminer ability").getBoolean(true); + abilityLuck = config.get(CATEGORY_TOOLS, "11.05_abilityLuck", true, "Allow luck (fortune) ability").getBoolean(true); + abilitySilk = config.get(CATEGORY_TOOLS, "11.06_abilitySilk", true, "Allow silk touch ability").getBoolean(true); + abilityFurnace = config.get(CATEGORY_TOOLS, "11.07_abilityFurnace", true, "Allow auto-smelter ability").getBoolean(true); + abilityShredder = config.get(CATEGORY_TOOLS, "11.08_abilityShredder", true, "Allow auto-shredder ability").getBoolean(true); + abilityCentrifuge = config.get(CATEGORY_TOOLS, "11.09_abilityCentrifuge", true, "Allow auto-centrifuge ability").getBoolean(true); + abilityCrystallizer = config.get(CATEGORY_TOOLS, "11.10_abilityCrystallizer", true, "Allow auto-crystallizer ability").getBoolean(true); + abilityMercury = config.get(CATEGORY_TOOLS, "11.11_abilityMercury", true, "Allow mercury touch ability (digging redstone gives mercury)").getBoolean(true); + abilityExplosion = config.get(CATEGORY_TOOLS, "11.12_abilityExplosion", true, "Allow explosion ability").getBoolean(true); } } From 98d48dd0dc0a30ba7178d1a1ab0c1cad90523b5f Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Mon, 1 Aug 2022 00:27:16 +0300 Subject: [PATCH 003/111] Updated ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 061933f81..cf2010635 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -3437,7 +3437,7 @@ item.gun_folly.name=Прототип Дигамма "Причуда" item.gun_darter.name=Дротиковый пистолет item.gun_mymy.name=Ньетес item.gun_ar15.name="Джош" -item.gun_glass_cannon.name=Стелянная пушка +item.gun_glass_cannon.name=Стеклянная пушка item.gun_revolver_iron_ammo.name=Пуля item.gun_revolver_ammo.name=Свинцовая пуля @@ -3858,7 +3858,7 @@ item.euphemium_plate.name=Эвфемиевый нагрудник item.euphemium_legs.name=Эвфемиевые поножи item.euphemium_boots.name=Эвфемиевые ботинки -item.schrabidium_helmet.name=Шрабидиевый щлем +item.schrabidium_helmet.name=Шрабидиевый шлем item.schrabidium_plate.name=Шрабидиевый нагрудник item.schrabidium_legs.name=Шрабидиевые поножи item.schrabidium_boots.name=Шрабидиевые ботинки @@ -4109,8 +4109,8 @@ item.hazmat_legs.name=Защитные поножи item.hazmat_boots.name=Защитные ботинки item.hazmat_helmet_red.name=Улучшенный защитный шлем item.hazmat_plate_red.name=Улучшенный защитный нагрудник -item.hazmat_legs_red.name=Улучшенный защитные поножи -item.hazmat_boots_red.name=Улучшенный защитные ботинки +item.hazmat_legs_red.name=Улучшенные защитные поножи +item.hazmat_boots_red.name=Улучшенные защитные ботинки item.hazmat_helmet_grey.name=Высокоэффективный защитный шлем item.hazmat_plate_grey.name=Высокоэффективный защитный нагрудник item.hazmat_legs_grey.name=Высокоэффективные защитные поножи @@ -4314,7 +4314,7 @@ item.desh_sword.name=Меч из рабочего сплава item.desh_pickaxe.name=Кирка из рабочего сплава item.desh_axe.name=Топор из рабочего сплава item.desh_shovel.name=Лопата из рабочего сплава -item.desh_hoe.name=Мотыга из рабочего рплава +item.desh_hoe.name=Мотыга из рабочего сплава item.cobalt_sword.name=Кобальтовый меч item.cobalt_pickaxe.name=Кобальтовая кирка item.cobalt_axe.name=Кобальтовый топор From a9d7f9ca20bf4c3813d1d0ffe5780996eb03e457 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 12 Aug 2022 11:50:02 +0200 Subject: [PATCH 004/111] merged blast furnace recipe handling, BF explosion crash fix, textures --- .../com/hbm/explosion/ExplosionBalefire.java | 11 +- .../com/hbm/explosion/ExplosionChaos.java | 2 + .../com/hbm/handler/imc/IMCBlastFurnace.java | 81 ++++ .../nei/AlloyFurnaceRecipeHandler.java | 144 +++--- .../recipes/BlastFurnaceRecipes.java | 171 +++++++ .../hbm/inventory/recipes/MachineRecipes.java | 435 +----------------- src/main/java/com/hbm/main/MainRegistry.java | 3 +- .../machine/TileEntityDiFurnace.java | 211 ++++----- .../machine/TileEntityDiFurnaceRTG.java | 6 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../textures/blocks/conveyor_curve_left.png | Bin 0 -> 642 bytes .../blocks/conveyor_double_curve_left.png | Bin 0 -> 805 bytes .../textures/blocks/crane_boxer_side_down.png | Bin 462 -> 495 bytes .../textures/blocks/crane_boxer_side_up.png | Bin 463 -> 498 bytes .../hbm/textures/blocks/crane_boxer_top.png | Bin 426 -> 459 bytes .../textures/blocks/crane_teleporter_side.png | Bin 0 -> 515 bytes .../textures/blocks/crane_teleporter_top.png | Bin 0 -> 662 bytes .../blocks/crane_unboxer_side_down.png | Bin 475 -> 527 bytes .../textures/blocks/crane_unboxer_side_up.png | Bin 483 -> 527 bytes .../hbm/textures/blocks/crane_unboxer_top.png | Bin 444 -> 493 bytes .../textures/blocks/crate_entangled_side.png | Bin 230 -> 0 bytes .../textures/blocks/crate_entangled_top.png | Bin 302 -> 0 bytes 22 files changed, 438 insertions(+), 628 deletions(-) create mode 100644 src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java create mode 100644 src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_teleporter_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_teleporter_top.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/crate_entangled_side.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/crate_entangled_top.png diff --git a/src/main/java/com/hbm/explosion/ExplosionBalefire.java b/src/main/java/com/hbm/explosion/ExplosionBalefire.java index 73acb4de8..9df326909 100644 --- a/src/main/java/com/hbm/explosion/ExplosionBalefire.java +++ b/src/main/java/com/hbm/explosion/ExplosionBalefire.java @@ -45,7 +45,7 @@ public class ExplosionBalefire lastposZ = nbt.getInteger(name + "lastposZ"); radius = nbt.getInteger(name + "radius"); radius2 = nbt.getInteger(name + "radius2"); - n = nbt.getInteger(name + "n"); + n = Math.max(nbt.getInteger(name + "n"), 1); //prevents invalid read operation nlimit = nbt.getInteger(name + "nlimit"); shell = nbt.getInteger(name + "shell"); leg = nbt.getInteger(name + "leg"); @@ -66,11 +66,16 @@ public class ExplosionBalefire this.nlimit = this.radius2 * 4; } - public boolean update() - { + public boolean update() { + + if(n == 0) return true; + breakColumn(this.lastposX, this.lastposZ); this.shell = (int) Math.floor((Math.sqrt(n) + 1) / 2); int shell2 = this.shell * 2; + + if(shell2 == 0) return true; + this.leg = (int) Math.floor((this.n - (shell2 - 1) * (shell2 - 1)) / shell2); this.element = (this.n - (shell2 - 1) * (shell2 - 1)) - shell2 * this.leg - this.shell + 1; this.lastposX = this.leg == 0 ? this.shell : this.leg == 1 ? -this.element : this.leg == 2 ? -this.shell : this.element; diff --git a/src/main/java/com/hbm/explosion/ExplosionChaos.java b/src/main/java/com/hbm/explosion/ExplosionChaos.java index 6f9ceaaa1..31067b6c8 100644 --- a/src/main/java/com/hbm/explosion/ExplosionChaos.java +++ b/src/main/java/com/hbm/explosion/ExplosionChaos.java @@ -19,6 +19,7 @@ import com.hbm.entity.projectile.EntityRainbow; import com.hbm.entity.projectile.EntityRocket; import com.hbm.entity.projectile.EntityRubble; import com.hbm.entity.projectile.EntitySchrab; +import com.hbm.interfaces.Spaghetti; import com.hbm.lib.ModDamageSource; import com.hbm.potion.HbmPotion; import com.hbm.util.ArmorRegistry; @@ -42,6 +43,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Spaghetti("no") public class ExplosionChaos { private final static Random random = new Random(); diff --git a/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java b/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java new file mode 100644 index 000000000..7a99d4349 --- /dev/null +++ b/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java @@ -0,0 +1,81 @@ +package com.hbm.handler.imc; + +import java.util.ArrayList; + +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.util.Tuple.Triplet; + +import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +/** + * @author UFFR + */ + +public class IMCBlastFurnace extends IMCHandler { + public static final ArrayList> buffer = new ArrayList<>(); + + @Override + public void process(IMCMessage message) { + + final NBTTagCompound data = message.getNBTValue(); + final NBTTagCompound outputData = data.getCompoundTag("output"); + final ItemStack output = ItemStack.loadItemStackFromNBT(outputData); + + if(output == null) { + printError(message, "Output stack could not be read!"); + return; + } + + final Object input1; + final Object input2; + + switch(data.getString("inputType1")) { + case "ore": + input1 = data.getString("input1"); + break; + + case "orelist": + final NBTTagList list = data.getTagList("input1", 8); + final ArrayList ores = new ArrayList(list.tagCount()); + for(int i = 0; i < list.tagCount(); i++) + ores.add(list.getStringTagAt(i)); + input1 = ores; + break; + + case "itemstack": + input1 = new ComparableStack(ItemStack.loadItemStackFromNBT(data.getCompoundTag("input1"))); + break; + + default: + printError(message, "Unhandled input type!"); + return; + } + + switch(data.getString("inputType2")) { + case "ore": + input2 = data.getString("input2"); + break; + + case "orelist": + final NBTTagList list = data.getTagList("input2", 9); + final ArrayList ores = new ArrayList(list.tagCount()); + for(int i = 0; i < list.tagCount(); i++) + ores.add(list.getStringTagAt(i)); + input2 = ores; + break; + + case "itemstack": + input2 = new ComparableStack(ItemStack.loadItemStackFromNBT(data.getCompoundTag("input2"))); + break; + + default: + printError(message, "Unhandled input type!"); + return; + } + + buffer.add(new Triplet(input1, input2, output)); + } +} diff --git a/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java index f52b39083..c7514eb9b 100644 --- a/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java @@ -5,8 +5,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import com.hbm.inventory.gui.GUITestDiFurnace; +import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.inventory.recipes.MachineRecipes; import codechicken.nei.NEIServerUtils; @@ -17,48 +19,44 @@ import net.minecraft.item.ItemStack; public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { - public static ArrayList fuels; + public static ArrayList fuels; - public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe - { - PositionedStack input1; + public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { + PositionedStack input1; PositionedStack input2; - PositionedStack result; - - public SmeltingSet(ItemStack input1, ItemStack input2, ItemStack result) { - input1.stackSize = 1; - input2.stackSize = 1; - this.input1 = new PositionedStack(input1, 75, 7); - this.input2 = new PositionedStack(input2, 75, 43); - this.result = new PositionedStack(result, 129, 25); - } + PositionedStack result; - @Override + public SmeltingSet(List list, List list2, ItemStack result) { + this.input1 = new PositionedStack(list, 75, 7); + this.input2 = new PositionedStack(list2, 75, 43); + this.result = new PositionedStack(result, 129, 25); + } + + @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 48, Arrays.asList(new PositionedStack[] {input1, input2})); - } + return getCycledIngredients(cycleticks / 48, Arrays.asList(new PositionedStack[] { input1, input2 })); + } - @Override + @Override public PositionedStack getOtherStack() { - return fuels.get((cycleticks / 48) % fuels.size()).stack; - } + return fuels.get((cycleticks / 48) % fuels.size()).stack; + } - @Override + @Override public PositionedStack getResult() { - return result; - } - } + return result; + } + } - public static class Fuel - { - public Fuel(ItemStack ingred) { - - this.stack = new PositionedStack(ingred, 3, 25, false); - } + public static class Fuel { + public Fuel(ItemStack ingred) { + + this.stack = new PositionedStack(ingred, 3, 25, false); + } + + public PositionedStack stack; + } - public PositionedStack stack; - } - @Override public String getRecipeName() { return "Blast Furnace"; @@ -68,13 +66,13 @@ public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { public String getGuiTexture() { return GUITestDiFurnace.texture.toString(); } - + @Override public void loadCraftingRecipes(String outputId, Object... results) { - if ((outputId.equals("alloysmelting")) && getClass() == AlloyFurnaceRecipeHandler.class) { - Map recipes = MachineRecipes.instance().getAlloyRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey()[0], (ItemStack)recipe.getKey()[1], (ItemStack)recipe.getValue())); + if((outputId.equals("alloysmelting")) && getClass() == AlloyFurnaceRecipeHandler.class) { + Map[], ItemStack> recipes = BlastFurnaceRecipes.getRecipesForNEI(); + for(Entry[], ItemStack> recipe : recipes.entrySet()) { + this.arecipes.add(new SmeltingSet(recipe.getKey()[0], recipe.getKey()[1], recipe.getValue())); } } else { super.loadCraftingRecipes(outputId, results); @@ -83,16 +81,16 @@ public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { @Override public void loadCraftingRecipes(ItemStack result) { - Map recipes = MachineRecipes.instance().getAlloyRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - if (NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue(), result)) - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey()[0], (ItemStack)recipe.getKey()[1], (ItemStack)recipe.getValue())); + Map[], ItemStack> recipes = BlastFurnaceRecipes.getRecipesForNEI(); + for(Entry[], ItemStack> recipe : recipes.entrySet()) { + if(NEIServerUtils.areStacksSameType(recipe.getValue(), result)) + this.arecipes.add(new SmeltingSet(recipe.getKey()[0], recipe.getKey()[1], recipe.getValue())); } } @Override public void loadUsageRecipes(String inputId, Object... ingredients) { - if ((inputId.equals("alloysmelting")) && getClass() == AlloyFurnaceRecipeHandler.class) { + if((inputId.equals("alloysmelting")) && getClass() == AlloyFurnaceRecipeHandler.class) { loadCraftingRecipes("alloysmelting", new Object[0]); } else { super.loadUsageRecipes(inputId, ingredients); @@ -101,41 +99,43 @@ public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { @Override public void loadUsageRecipes(ItemStack ingredient) { - Map recipes = MachineRecipes.instance().getAlloyRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - if (NEIServerUtils.areStacksSameType(ingredient, (ItemStack)recipe.getKey()[0]) || NEIServerUtils.areStacksSameType(ingredient, (ItemStack)recipe.getKey()[1])) - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey()[0], (ItemStack)recipe.getKey()[1], (ItemStack)recipe.getValue())); + Map[], ItemStack> recipes = BlastFurnaceRecipes.getRecipesForNEI(); + for(Entry[], ItemStack> recipe : recipes.entrySet()) { + List combined = new ArrayList(); + combined.addAll(recipe.getKey()[0]); + combined.addAll(recipe.getKey()[1]); + for(ItemStack combinedStack : combined) + if(NEIServerUtils.areStacksSameType(ingredient, combinedStack) || NEIServerUtils.areStacksSameType(ingredient, combinedStack)) + this.arecipes.add(new SmeltingSet(recipe.getKey()[0], recipe.getKey()[1], recipe.getValue())); } } - @Override - public Class getGuiClass() { - return GUITestDiFurnace.class; - } - - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(96, 25, 24, 18), "alloysmelting")); - } + @Override + public Class getGuiClass() { + return GUITestDiFurnace.class; + } - @Override - public void drawExtras(int recipe) { - drawProgressBar(57, 26, 176, 0, 14, 14, 48, 7); - - drawProgressBar(96, 24, 176, 14, 24, 16, 48, 0); + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(96, 25, 24, 18), "alloysmelting")); + } - drawProgressBar(39, 7, 201, 0, 16, 52, 480, 7); - } + @Override + public void drawExtras(int recipe) { + drawProgressBar(57, 26, 176, 0, 14, 14, 48, 7); - @Override - public TemplateRecipeHandler newInstance() { - if (fuels == null || fuels.isEmpty()) - fuels = new ArrayList(); - for(ItemStack i : MachineRecipes.instance().getAlloyFuels()) - { - fuels.add(new Fuel(i)); - } - return super.newInstance(); - } + drawProgressBar(96, 24, 176, 14, 24, 16, 48, 0); + drawProgressBar(39, 7, 201, 0, 16, 52, 480, 7); + } + + @Override + public TemplateRecipeHandler newInstance() { + if(fuels == null || fuels.isEmpty()) + fuels = new ArrayList(); + for(ItemStack i : MachineRecipes.instance().getAlloyFuels()) { + fuels.add(new Fuel(i)); + } + return super.newInstance(); + } } diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java new file mode 100644 index 000000000..3921cbfae --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java @@ -0,0 +1,171 @@ +package com.hbm.inventory.recipes; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.CheckForNull; + +import static com.hbm.inventory.OreDictManager.*; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.GeneralConfig; +import com.hbm.handler.imc.IMCBlastFurnace; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.items.ModItems; +import com.hbm.main.MainRegistry; +import com.hbm.util.Tuple.Triplet; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * Magic! + * + * @author UFFR + */ +public class BlastFurnaceRecipes { + + private static final ArrayList> blastFurnaceRecipes = new ArrayList>(); + private static final ArrayList hiddenRecipes = new ArrayList(); + + private static void addRecipe(Object in1, Object in2, ItemStack out) { + blastFurnaceRecipes.add(new Triplet(in1, in2, out)); + } + + static { + addRecipe(IRON, COAL, new ItemStack(ModItems.ingot_steel, 2)); + addRecipe(IRON, ANY_COKE, new ItemStack(ModItems.ingot_steel, 2)); + addRecipe(CU, REDSTONE, new ItemStack(ModItems.ingot_red_copper, 2)); + addRecipe(STEEL, MINGRADE, new ItemStack(ModItems.ingot_advanced_alloy, 2)); + addRecipe(W, COAL, new ItemStack(ModItems.neutron_reflector, 2)); + addRecipe(W, ANY_COKE, new ItemStack(ModItems.neutron_reflector, 2)); + addRecipe(ModItems.canister_fuel, "slimeball", new ItemStack(ModItems.canister_napalm)); + addRecipe(STEEL, CO, new ItemStack(ModItems.ingot_dura_steel, 2)); + addRecipe(STEEL, W, new ItemStack(ModItems.ingot_dura_steel, 2)); + addRecipe(STEEL, U238, new ItemStack(ModItems.ingot_ferrouranium)); + addRecipe(W, SA326.nugget(), new ItemStack(ModItems.ingot_magnetized_tungsten)); + addRecipe(STEEL, TC99.nugget(), new ItemStack(ModItems.ingot_tcalloy)); + addRecipe(GOLD.plate(), ModItems.plate_mixed, new ItemStack(ModItems.plate_paa, 2)); + addRecipe(BIGMT, ModItems.powder_meteorite, new ItemStack(ModItems.ingot_starmetal, 2)); + addRecipe(CO, ModBlocks.block_meteor, new ItemStack(ModItems.ingot_meteorite)); + addRecipe(ModItems.meteorite_sword_hardened, CO, new ItemStack(ModItems.meteorite_sword_alloyed)); + addRecipe(ModBlocks.block_meteor, CO, new ItemStack(ModItems.ingot_meteorite)); + + if(GeneralConfig.enableLBSMSimpleChemsitry) + addRecipe(ModItems.canister_empty, COAL, new ItemStack(ModItems.canister_oil)); + + if(!IMCBlastFurnace.buffer.isEmpty()) { + blastFurnaceRecipes.addAll(IMCBlastFurnace.buffer); + MainRegistry.logger.info("Fetched " + IMCBlastFurnace.buffer.size() + " IMC blast furnace recipes!"); + IMCBlastFurnace.buffer.clear(); + } + + hiddenRecipes.add(new ItemStack(ModItems.meteorite_sword_alloyed)); + } + + @CheckForNull + public static ItemStack getOutput(ItemStack in1, ItemStack in2) { + for(Triplet recipe : blastFurnaceRecipes) { + final AStack[] recipeItem1 = getRecipeStacks(recipe.getX()); + final AStack[] recipeItem2 = getRecipeStacks(recipe.getY()); + + if((doStacksMatch(recipeItem1, in1) && doStacksMatch(recipeItem2, in2)) || (doStacksMatch(recipeItem2, in1) && doStacksMatch(recipeItem1, in2))) + return recipe.getZ().copy(); + else + continue; + } + return null; + } + + private static boolean doStacksMatch(AStack[] recipe, ItemStack in) { + boolean flag = false; + byte i = 0; + while(!flag && i < recipe.length) { + flag = recipe[i].matchesRecipe(in, true); + i++; + } + return flag; + } + + private static AStack[] getRecipeStacks(Object in) { + final AStack[] recipeItem1; + if(in instanceof DictFrame) { + DictFrame recipeItem = (DictFrame) in; + recipeItem1 = new AStack[] { new OreDictStack(recipeItem.ingot()), new OreDictStack(recipeItem.dust()), new OreDictStack(recipeItem.plate()), new OreDictStack(recipeItem.gem()) }; + } else if(in instanceof AStack) + recipeItem1 = new AStack[] { (AStack) in }; + else if(in instanceof String) + recipeItem1 = new AStack[] { new OreDictStack((String) in) }; + else if(in instanceof Block) + recipeItem1 = new AStack[] { new ComparableStack((Block) in) }; + else if(in instanceof List) { + List oreList = (List) in; + recipeItem1 = new AStack[oreList.size()]; + for(int i = 0; i < oreList.size(); i++) + recipeItem1[i] = new OreDictStack((String) oreList.get(i)); + } else + recipeItem1 = new AStack[] { new ComparableStack((Item) in) }; + + return recipeItem1; + } + + public static Map[], ItemStack> getRecipesForNEI() { + final HashMap[], ItemStack> recipes = new HashMap<>(); + + for(Triplet recipe : blastFurnaceRecipes) { + if(!hiddenRecipes.contains(recipe.getZ())) { + final ItemStack nothing = new ItemStack(ModItems.nothing).setStackDisplayName("If you're reading this, an error has occured! Check the console."); + final List in1 = new ArrayList(); + final List in2 = new ArrayList(); + in1.add(nothing); + in2.add(nothing); + + for(AStack stack : getRecipeStacks(recipe.getX())) { + if(stack.extractForNEI().isEmpty()) + continue; + else { + in1.remove(nothing); + in1.addAll(stack.extractForNEI()); + break; + } + } + if(in1.contains(nothing)) { + MainRegistry.logger.error("Blast furnace cannot compile recipes for NEI: apparent nonexistent item #1 in recipe for item: " + recipe.getZ().getDisplayName()); + } + for(AStack stack : getRecipeStacks(recipe.getY())) { + if(stack.extractForNEI().isEmpty()) { + continue; + } else { + in2.remove(nothing); + in2.addAll(stack.extractForNEI()); + break; + } + } + if(in2.contains(nothing)) { + MainRegistry.logger.error("Blast furnace cannot compile recipes for NEI: apparent nonexistent item #2 in recipe for item: " + recipe.getZ().getDisplayName()); + } + + final List[] inputs = new List[2]; + inputs[0] = in1; + inputs[1] = in2; + recipes.put(inputs, recipe.getZ()); + } + } + return ImmutableMap.copyOf(recipes); + } + + public static List> getRecipes() { + + final List> subRecipes = new ArrayList<>(); + for(Triplet recipe : blastFurnaceRecipes) + subRecipes.add(new Triplet(getRecipeStacks(recipe.getX()), getRecipeStacks(recipe.getY()), recipe.getZ())); + return ImmutableList.copyOf(subRecipes); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java index 39268a32f..6cfbc51ae 100644 --- a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java @@ -2,22 +2,14 @@ package com.hbm.inventory.recipes; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.config.GeneralConfig; import com.hbm.interfaces.Spaghetti; import com.hbm.inventory.FluidContainer; import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; -import com.hbm.items.weapon.ItemGunBase; -import com.hbm.main.MainRegistry; -import com.hbm.util.EnchantmentUtil; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -26,138 +18,12 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; //TODO: clean this shit up -@Spaghetti("everything") +@Spaghetti("i cannot sleep well at night knowing that this class still exists") public class MachineRecipes { - public MachineRecipes() { - - } - public static MachineRecipes instance() { return new MachineRecipes(); } - - public static ItemStack getFurnaceProcessingResult(ItemStack item, ItemStack item2) { - return getFurnaceOutput(item, item2); - } - - @Spaghetti("i am an affront to god and i desire to be cremated") - public static ItemStack getFurnaceOutput(ItemStack item, ItemStack item2) { - - if(item == null || item2 == null) - return null; - - if (GeneralConfig.enableDebugMode) { - if (item.getItem() == Items.iron_ingot && item2.getItem() == Items.quartz - || item.getItem() == Items.quartz && item2.getItem() == Items.iron_ingot) { - return new ItemStack(ModBlocks.test_render, 1); - } - } - - if (mODE(item, new String[] {"ingotTungsten", "dustTungsten"}) && mODE(item2, "gemCoal") - || mODE(item, "gemCoal") && mODE(item2, new String[] {"ingotTungsten", "dustTungsten"})) { - return new ItemStack(ModItems.neutron_reflector, 2); - } - - if (mODE(item, new String[] {"ingotIron", "dustIron"}) && mODE(item2, new String[] {"gemCoal", "dustCoal"}) - || mODE(item, new String[] {"gemCoal", "dustCoal"}) && mODE(item2, new String[] {"ingotIron", "dustIron"})) { - return new ItemStack(ModItems.ingot_steel, 2); - } - - if (mODE(item, new String[] {"ingotCopper", "dustCopper"}) && item2.getItem() == Items.redstone - || item.getItem() == Items.redstone && mODE(item2, new String[] {"ingotCopper", "dustCopper"})) { - return new ItemStack(ModItems.ingot_red_copper, 2); - } - - if (item.getItem() == ModItems.canister_full && item.getItemDamage() == Fluids.DIESEL.getID() && item2.getItem() == Items.slime_ball - || item.getItem() == Items.slime_ball && item2.getItem() == ModItems.canister_full && item2.getItemDamage() == Fluids.DIESEL.getID()) { - return new ItemStack(ModItems.canister_napalm, 1); - } - - if (mODE(item, new String[] {"ingotMingrade", "dustMingrade"}) && mODE(item2, new String[] {"ingotSteel", "dustSteel"}) - || mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, new String[] {"ingotMingrade", "dustMingrade"})) { - return new ItemStack(ModItems.ingot_advanced_alloy, 2); - } - - if (mODE(item, new String[] {"ingotTungsten", "dustTungsten"}) && mODE(item2, "nuggetSchrabidium") - || mODE(item, "nuggetSchrabidium") && mODE(item2, new String[] {"ingotTungsten", "dustTungsten"})) { - return new ItemStack(ModItems.ingot_magnetized_tungsten, 1); - } - - if (mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, new String[] {"nuggetTechnetium99", "tinyTc99"}) - || mODE(item, new String[] {"nuggetTechnetium99", "tinyTc99"}) && mODE(item2, new String[] {"ingotSteel", "dustSteel"})) { - return new ItemStack(ModItems.ingot_tcalloy, 1); - } - - if (item.getItem() == ModItems.plate_mixed && mODE(item2, "plateGold") - || mODE(item, "plateGold") && item2.getItem() == ModItems.plate_mixed) { - return new ItemStack(ModItems.plate_paa, 2); - } - - if (mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, new String[] {"ingotTungsten", "dustTungsten"}) - || mODE(item, new String[] {"ingotTungsten", "dustTungsten"}) && mODE(item2, new String[] {"ingotSteel", "dustSteel"})) { - return new ItemStack(ModItems.ingot_dura_steel, 2); - } - - if (mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, new String[] {"ingotCobalt", "dustCobalt"}) - || mODE(item, new String[] {"ingotCobalt", "dustCobalt"}) && mODE(item2, new String[] {"ingotSteel", "dustSteel"})) { - return new ItemStack(ModItems.ingot_dura_steel, 2); - } - - if (mODE(item, new String[] {"ingotSaturnite", "dustSaturnite"}) && item2.getItem() == ModItems.powder_meteorite - || item.getItem() == ModItems.powder_meteorite && mODE(item2, new String[] {"ingotSaturnite", "dustSaturnite"})) { - return new ItemStack(ModItems.ingot_starmetal, 2); - } - - if(GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleAlloy) { - if(mODE(item, new String[] { "gemCoal", "dustCoal" }) && item2.getItem() == ModItems.canister_empty - || item.getItem() == ModItems.canister_empty && mODE(item2, new String[] { "gemCoal", "dustCoal" })) { - return new ItemStack(ModItems.canister_full, 1, Fluids.OIL.getID()); - } - - if(item.getItem() == Item.getItemFromBlock(ModBlocks.block_meteor_cobble) && mODE(item2, new String[] { "ingotSteel", "dustSteel" }) - || mODE(item, new String[] { "ingotSteel", "dustSteel" }) && item2.getItem() == Item.getItemFromBlock(ModBlocks.block_meteor_cobble)) { - return new ItemStack(ModItems.ingot_meteorite); - } - } - - if (item.getItem() == Item.getItemFromBlock(ModBlocks.block_meteor) && mODE(item2, new String[] {"ingotCobalt", "dustCobalt"}) - || mODE(item, new String[] {"ingotCobalt", "dustCobalt"}) && item2.getItem() == Item.getItemFromBlock(ModBlocks.block_meteor)) { - return new ItemStack(ModItems.ingot_meteorite); - } - - if (mODE(item, "ingotUranium238") && mODE(item2, new String[] {"ingotSteel", "dustSteel"}) - || mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, "ingotUranium238")) { - return new ItemStack(ModItems.ingot_ferrouranium, 2); - } - - if (item.getItem() == ModItems.meteorite_sword_hardened && mODE(item2, new String[] {"ingotCobalt", "dustCobalt"}) - || mODE(item, new String[] {"ingotCobalt", "dustCobalt"}) && item2.getItem() == ModItems.meteorite_sword_hardened) { - return new ItemStack(ModItems.meteorite_sword_alloyed, 1); - } - - if(item.getItem() instanceof ItemGunBase && item2.getItem() == Items.enchanted_book) { - - ItemStack result = item.copy(); - - Map mapright = EnchantmentHelper.getEnchantments(item2); - Iterator itr = mapright.keySet().iterator(); - - while (itr.hasNext()) { - - int i = ((Integer)itr.next()).intValue(); - int j = ((Integer)mapright.get(Integer.valueOf(i))).intValue(); - Enchantment e = Enchantment.enchantmentsList[i]; - - EnchantmentUtil.removeEnchantment(result, e); - EnchantmentUtil.addEnchantment(result, e, j); - } - - return result; - } - - return null; - } //return: FluidType, amount produced, amount required, heat required (°C * 100) public static Object[] getBoilerOutput(FluidType type) { @@ -402,54 +268,6 @@ public class MachineRecipes { return null; } - public Map getAlloyRecipes() { - Map recipes = new HashMap(); - - if (GeneralConfig.enableDebugMode) { - recipes.put(new ItemStack[] { new ItemStack(Items.iron_ingot), new ItemStack(Items.quartz) }, - new ItemStack(Item.getItemFromBlock(ModBlocks.test_render))); - } - try { - recipes.put(new ItemStack[] { new ItemStack(Items.iron_ingot), new ItemStack(Items.coal) }, - getFurnaceOutput(new ItemStack(Items.iron_ingot), new ItemStack(Items.coal)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_tungsten), new ItemStack(Items.coal) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_tungsten), new ItemStack(Items.coal)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_copper), new ItemStack(Items.redstone) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_copper), new ItemStack(Items.redstone)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_red_copper), new ItemStack(ModItems.ingot_steel) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_red_copper), new ItemStack(ModItems.ingot_steel)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.canister_full, 1, Fluids.DIESEL.getID()), new ItemStack(Items.slime_ball) }, - getFurnaceOutput(new ItemStack(ModItems.canister_full, 1, Fluids.DIESEL.getID()), new ItemStack(Items.slime_ball)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_tungsten), new ItemStack(ModItems.nugget_schrabidium) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_tungsten), new ItemStack(ModItems.nugget_schrabidium)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.plate_mixed), new ItemStack(ModItems.plate_gold) }, - getFurnaceOutput(new ItemStack(ModItems.plate_mixed), new ItemStack(ModItems.plate_gold)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_tungsten) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_tungsten)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_cobalt) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_cobalt)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_saturnite), new ItemStack(ModItems.powder_meteorite) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_saturnite), new ItemStack(ModItems.powder_meteorite)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.nugget_technetium) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.nugget_technetium)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_cobalt), new ItemStack(ModBlocks.block_meteor) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_cobalt), new ItemStack(ModBlocks.block_meteor)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_u238) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_u238)).copy()); - - if(GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleAlloy) { - recipes.put(new ItemStack[] { new ItemStack(ModItems.canister_empty), new ItemStack(Items.coal) }, - getFurnaceOutput(new ItemStack(ModItems.canister_empty), new ItemStack(Items.coal)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModBlocks.block_meteor_cobble), new ItemStack(ModItems.ingot_steel) }, - getFurnaceOutput(new ItemStack(ModBlocks.block_meteor_cobble), new ItemStack(ModItems.ingot_steel)).copy()); - } - - } catch (Exception x) { - MainRegistry.logger.error("Unable to register alloy recipes for NEI!"); - } - return recipes; - } - public ArrayList getAlloyFuels() { ArrayList fuels = new ArrayList(); fuels.add(new ItemStack(Items.coal)); @@ -465,20 +283,8 @@ public class MachineRecipes { fuels.add(new ItemStack(ModItems.powder_coal)); return fuels; } - - public ArrayList getCentrifugeFuels() { - ArrayList fuels = new ArrayList(); - fuels.add(new ItemStack(Items.coal)); - fuels.add(new ItemStack(Item.getItemFromBlock(Blocks.coal_block))); - fuels.add(new ItemStack(Items.lava_bucket)); - fuels.add(new ItemStack(Items.redstone)); - fuels.add(new ItemStack(Item.getItemFromBlock(Blocks.redstone_block))); - fuels.add(new ItemStack(Item.getItemFromBlock(Blocks.netherrack))); - fuels.add(new ItemStack(Items.blaze_rod)); - fuels.add(new ItemStack(Items.blaze_powder)); - return fuels; - } + @Spaghetti("why did i do this?") public Map getCyclotronRecipes() { Map recipes = new HashMap(); Item part = ModItems.part_lithium; @@ -796,240 +602,9 @@ public class MachineRecipes { return recipes; } - //keep this - //like in a museum or something - //this is a testament of my incompetence - //look at it - //look at how horrifying it is - //children, never do this - /*public class ShredderRecipe { - - public ItemStack input; - public ItemStack output; - - public void registerEverythingImSrs() { - - String[] names = OreDictionary.getOreNames(); - List stacks = new ArrayList(); - - for(int i = 0; i < names.length; i++) { - stacks.addAll(OreDictionary.getOres(names[i])); - } - - for(int i = 0; i < stacks.size(); i++) { - - int[] ids = OreDictionary.getOreIDs(stacks.get(i)); - - List oreNames = new ArrayList(); - - for(int j = 0; j < ids.length; j++) { - oreNames.add(OreDictionary.getOreName(ids[j])); - } - - theWholeThing.add(new DictCouple(stacks.get(i), oreNames)); - } - - MainRegistry.logger.info("Added " + theWholeThing.size() + " elements from the Ore Dict!"); - } - - public boolean doesExist(ItemStack stack) { - - for(DictCouple dic : theWholeThing) { - if(dic.item.getItem() == stack.getItem() && dic.item.getItemDamage() == stack.getItemDamage()) - return true; - } - - return false; - } - - public void addRecipes() { - - // Not very efficient, I know, but at least it works AND it's - // somewhat smart! - - for(int i = 0; i < theWholeThing.size(); i++) - { - for(int j = 0; j < theWholeThing.get(i).list.size(); j++) - { - String s = theWholeThing.get(i).list.get(j); - - if (s.length() > 5 && s.substring(0, 5).equals("ingot")) { - ItemStack stack = canFindDustByName(s.substring(5)); - if (stack != null) { - setRecipe(theWholeThing.get(i).item, stack); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } else if (s.length() > 3 && s.substring(0, 3).equals("ore")) { - ItemStack stack = canFindDustByName(s.substring(3)); - if (stack != null) { - setRecipe(theWholeThing.get(i).item, new ItemStack(stack.getItem(), 2, stack.getItemDamage())); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } else if (s.length() > 5 && s.substring(0, 5).equals("block")) { - ItemStack stack = canFindDustByName(s.substring(5)); - if (stack != null) { - setRecipe(theWholeThing.get(i).item, new ItemStack(stack.getItem(), 9, stack.getItemDamage())); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } else if (s.length() > 3 && s.substring(0, 3).equals("gem")) { - ItemStack stack = canFindDustByName(s.substring(3)); - if (stack != null) { - setRecipe(theWholeThing.get(i).item, new ItemStack(stack.getItem(), 1, stack.getItemDamage())); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } else if (s.length() > 4 && s.substring(0, 4).equals("dust")) { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.dust)); - } else if (s.length() > 6 && s.substring(0, 6).equals("powder")) { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.dust)); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } - - if(theWholeThing.get(i).list.isEmpty()) - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - if(!theWholeThing.get(i).list.isEmpty() && theWholeThing.get(i).list.get(0).equals("Unknown")) - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - - MainRegistry.logger.info("Added " + recipesShredder.size() + " in total."); - MainRegistry.logger.info("Added " + dustCount + " ore dust recipes."); - } - - public ItemStack canFindDustByName(String s) { - - for(DictCouple d : theWholeThing) - { - for(String s1 : d.list) - { - if(s1.length() > 4 && s1.substring(0, 4).equals("dust") && s1.substring(4).equals(s)) - { - dustCount++; - return d.item; - } - } - } - - return null; - } - - public void setRecipe(ItemStack inp, ItemStack outp) { - ShredderRecipe recipe = new ShredderRecipe(); - - recipe.input = inp; - recipe.output = outp; - - recipesShredder.add(recipe); - } - - public void overridePreSetRecipe(ItemStack inp, ItemStack outp) { - - boolean flag = false; - - for(int i = 0; i < recipesShredder.size(); i++) - { - if(recipesShredder.get(i) != null && - recipesShredder.get(i).input != null && - recipesShredder.get(i).output != null && - inp != null && - outp != null && - recipesShredder.get(i).input.getItem() == inp.getItem() && - recipesShredder.get(i).input.getItemDamage() == inp.getItemDamage()) { - recipesShredder.get(i).output = outp; - flag = true; - } - } - - if(!flag) { - ShredderRecipe rec = new ShredderRecipe(); - rec.input = inp; - rec.output = outp; - recipesShredder.add(rec); - } - } - - public void removeDuplicates() { - List newList = new ArrayList(); - - for(ShredderRecipe piv : recipesShredder) - { - boolean flag = false; - - if(newList.size() == 0) - { - newList.add(piv); - } else { - for(ShredderRecipe rec : newList) { - if(piv != null && rec != null && piv.input != null && rec.input != null && rec.input.getItem() != null && piv.input.getItem() != null && rec.input.getItemDamage() == piv.input.getItemDamage() && rec.input.getItem() == piv.input.getItem()) - flag = true; - if(piv == null || rec == null || piv.input == null || rec.input == null) - flag = true; - } - } - - if(!flag) - { - newList.add(piv); - } - } - } - - public void PrintRecipes() { - - MainRegistry.logger.debug("TWT: " + theWholeThing.size() + ", REC: " + recipesShredder.size()); - } - } - - public static class DictCouple { - - public ItemStack item; - public List list; - - public DictCouple(ItemStack item, List list) { - this.item = item; - this.list = list; - } - - public static List findWithStack(ItemStack stack) { - for(DictCouple couple : theWholeThing) { - if(couple.item == stack); - return couple.list; - } - - return null; - } - } - - public static List recipesShredder = new ArrayList(); - public static List theWholeThing = new ArrayList(); - public static int dustCount = 0; - - public static ItemStack getShredderResult(ItemStack stack) { - for(ShredderRecipe rec : recipesShredder) - { - if(stack != null && - rec.input.getItem() == stack.getItem() && - rec.input.getItemDamage() == stack.getItemDamage()) - return rec.output.copy(); - } - - return new ItemStack(ModItems.scrap); - } - - public Map getShredderRecipes() { - Map recipes = new HashMap(); - - for(int i = 0; i < MachineRecipes.recipesShredder.size(); i++) { - if(MachineRecipes.recipesShredder.get(i) != null && MachineRecipes.recipesShredder.get(i).output.getItem() != ModItems.scrap) - recipes.put(MachineRecipes.recipesShredder.get(i).input, getShredderResult(MachineRecipes.recipesShredder.get(i).input)); - } - - return recipes; - }*/ + /* + * this is the smoldering crater where once the 2016 shredder recipe code was + */ public Map getCMBRecipes() { Map recipes = new HashMap(); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index e3320f138..29902a05c 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -48,7 +48,6 @@ import com.hbm.entity.EntityMappings; import com.hbm.entity.grenade.*; import com.hbm.entity.logic.*; import com.hbm.entity.mob.siege.*; -import com.hbm.entity.qic.EntitySPV; import com.hbm.handler.*; import com.hbm.handler.imc.*; import com.hbm.handler.radiation.ChunkRadiationManager; @@ -83,7 +82,6 @@ import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; @@ -744,6 +742,7 @@ public class MainRegistry { BobmazonOfferFactory.init(); OreDictManager.registerOres(); + IMCHandler.registerHandler("blastfurnace", new IMCBlastFurnace()); IMCHandler.registerHandler("crystallizer", new IMCCrystallizer()); IMCHandler.registerHandler("centrifuge", new IMCCentrifuge()); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java index 279812b36..1117c9c65 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.machine.MachineDiFurnace; -import com.hbm.inventory.recipes.MachineRecipes; +import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRTGPellet; import com.hbm.util.RTGUtil; @@ -19,18 +19,18 @@ import net.minecraft.tileentity.TileEntity; public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { private ItemStack slots[]; - + public int dualCookTime; public int dualPower; public static final int maxPower = 12800; public static final int processingSpeed = 400; - - private static final int[] slots_top = new int[] {0}; - private static final int[] slots_bottom = new int[] {3}; - private static final int[] slots_side = new int[] {1}; - + + private static final int[] slots_top = new int[] { 0 }; + private static final int[] slots_bottom = new int[] { 3 }; + private static final int[] slots_side = new int[] { 1 }; + private String customName; - + public TileEntityDiFurnace() { slots = new ItemStack[4]; } @@ -47,21 +47,19 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { @Override public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { + if(slots[i] != null) { ItemStack itemStack = slots[i]; slots[i] = null; return itemStack; } else { - return null; + return null; } } @Override public void setInventorySlotContents(int i, ItemStack itemStack) { slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { + if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { itemStack.stackSize = getInventoryStackLimit(); } } @@ -75,7 +73,7 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { public boolean hasCustomInventoryName() { return this.customName != null && this.customName.length() > 0; } - + public void setCustomName(String name) { this.customName = name; } @@ -87,41 +85,42 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { @Override public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { + if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; + } else { + return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64; } } - - //You scrubs aren't needed for anything (right now) + + // You scrubs aren't needed for anything (right now) @Override - public void openInventory() {} + public void openInventory() { + } + @Override - public void closeInventory() {} + public void closeInventory() { + } @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - if(i == 3) - { + if(i == 3) { return false; } - + return true; } - + public boolean hasItemPower(ItemStack itemStack) { return getItemPower(itemStack) > 0; } - + + //TODO: replace this terribleness private static int getItemPower(ItemStack itemStack) { - if(itemStack == null) - { + if(itemStack == null) { return 0; - }else{ + } else { Item item = itemStack.getItem(); - + if(item == Items.coal) return 200; if(item == Item.getItemFromBlock(Blocks.coal_block)) return 2000; if(item == Items.lava_bucket) return 12800; @@ -133,78 +132,70 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { if(item == ModItems.briquette_lignite) return 200; if(item == ModItems.coke) return 400; if(item == ModItems.solid_fuel) return 400; - + return 0; } } - + @Override public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { + if(slots[i] != null) { + if(slots[i].stackSize <= j) { ItemStack itemStack = slots[i]; slots[i] = null; return itemStack; } ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { + if(slots[i].stackSize == 0) { slots[i] = null; } - + return itemStack1; } else { return null; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList list = nbt.getTagList("items", 10); - + this.dualPower = nbt.getInteger("powerTime"); this.dualCookTime = nbt.getShort("cookTime"); slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { + + for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { + if(b0 >= 0 && b0 < slots.length) { slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); } } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("powerTime", dualPower); nbt.setShort("cookTime", (short) dualCookTime); NBTTagList list = new NBTTagList(); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { + + for(int i = 0; i < slots.length; i++) { + if(slots[i] != null) { NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); + nbt1.setByte("slot", (byte) i); slots[i].writeToNBT(nbt1); list.appendTag(nbt1); } } nbt.setTag("items", list); } - + @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) - { - return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side); - } + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side); + } @Override public boolean canInsertItem(int i, ItemStack itemStack, int j) { @@ -215,107 +206,97 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { public boolean canExtractItem(int i, ItemStack itemStack, int j) { return true; } - + public int getDiFurnaceProgressScaled(int i) { return (dualCookTime * i) / processingSpeed; } - + public int getPowerRemainingScaled(int i) { return (dualPower * i) / maxPower; } - + public boolean canProcess() { - if(slots[0] == null || slots[1] == null) - { + if(slots[0] == null || slots[1] == null) { return false; } - ItemStack itemStack = MachineRecipes.getFurnaceProcessingResult(slots[0], slots[1]); - if(itemStack == null) - { + ItemStack itemStack = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); + if(itemStack == null) { return false; } - - if(slots[3] == null) - { + + if(slots[3] == null) { return true; } - + if(!slots[3].isItemEqual(itemStack)) { return false; } - + if(slots[3].stackSize < getInventoryStackLimit() && slots[3].stackSize < slots[3].getMaxStackSize()) { return true; - }else{ + } else { return slots[3].stackSize < itemStack.getMaxStackSize(); } } - + private void processItem() { if(canProcess()) { - ItemStack itemStack = MachineRecipes.getFurnaceProcessingResult(slots[0], slots[1]); - - if(slots[3] == null) - { + ItemStack itemStack = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); + + if(slots[3] == null) { slots[3] = itemStack.copy(); - }else if(slots[3].isItemEqual(itemStack)) { + } else if(slots[3].isItemEqual(itemStack)) { slots[3].stackSize += itemStack.stackSize; } - - for(int i = 0; i < 2; i++) - { - if(slots[i].stackSize <= 0) - { + + for(int i = 0; i < 2; i++) { + if(slots[i].stackSize <= 0) { slots[i] = new ItemStack(slots[i].getItem().setFull3D()); - }else{ + } else { slots[i].stackSize--; } - if(slots[i].stackSize <= 0) - { + if(slots[i].stackSize <= 0) { slots[i] = null; } } } } - + public boolean hasPower() { return dualPower > 0; } - + public boolean isProcessing() { return this.dualCookTime > 0; } - + @Override public void updateEntity() { this.hasPower(); boolean flag1 = false; - - if(hasPower() && isProcessing()) - { + + if(hasPower() && isProcessing()) { this.dualPower = this.dualPower - 1; - - if(this.dualPower < 0) - { + + if(this.dualPower < 0) { this.dualPower = 0; } } - if (this.hasItemPower(this.slots[2]) - && this.dualPower <= (TileEntityDiFurnace.maxPower - TileEntityDiFurnace.getItemPower(this.slots[2]))) { + if(this.hasItemPower(this.slots[2]) && this.dualPower <= (TileEntityDiFurnace.maxPower - TileEntityDiFurnace.getItemPower(this.slots[2]))) { this.dualPower += getItemPower(this.slots[2]); - if (this.slots[2] != null) { + if(this.slots[2] != null) { flag1 = true; this.slots[2].stackSize--; - if (this.slots[2].stackSize == 0) { + if(this.slots[2].stackSize == 0) { this.slots[2] = this.slots[2].getItem().getContainerItem(this.slots[2]); } } } - if (hasPower() && canProcess()) { + if(hasPower() && canProcess()) { dualCookTime++; - if (this.dualCookTime == TileEntityDiFurnace.processingSpeed) { + if(this.dualCookTime == TileEntityDiFurnace.processingSpeed) { this.dualCookTime = 0; this.processItem(); flag1 = true; @@ -324,30 +305,26 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { dualCookTime = 0; } - if(!worldObj.isRemote) - { + if(!worldObj.isRemote) { boolean trigger = true; - - if(hasPower() && canProcess() && this.dualCookTime == 0) - { + + if(hasPower() && canProcess() && this.dualCookTime == 0) { trigger = false; } - if (this.slots[2] != null && (this.slots[2].getItem() instanceof ItemRTGPellet)) { + if(this.slots[2] != null && (this.slots[2].getItem() instanceof ItemRTGPellet)) { this.dualPower += RTGUtil.updateRTGs(slots, new int[] { 2 }); if(this.dualPower > maxPower) this.dualPower = maxPower; } - - if(trigger) - { - flag1 = true; - MachineDiFurnace.updateBlockState(this.dualCookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); - } + + if(trigger) { + flag1 = true; + MachineDiFurnace.updateBlockState(this.dualCookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } } - - if(flag1) - { + + if(flag1) { this.markDirty(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java index 595b46434..7a1a8dbe4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.machine.MachineDiFurnaceRTG; -import com.hbm.inventory.recipes.MachineRecipes; +import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.util.RTGUtil; import com.hbm.tileentity.TileEntityMachineBase; @@ -25,7 +25,7 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase if ((slots[0] == null || slots[1] == null) && !hasPower()) return false; - ItemStack recipeResult = MachineRecipes.getFurnaceProcessingResult(slots[0], slots[1]); + ItemStack recipeResult = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); if (recipeResult == null) return false; else if (slots[2] == null) @@ -73,7 +73,7 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase private void processItem() { if(canProcess()) { - ItemStack recipeOut = MachineRecipes.getFurnaceProcessingResult(slots[0], slots[1]); + ItemStack recipeOut = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); if(slots[2] == null) slots[2] = recipeOut.copy(); else if(slots[2].isItemEqual(recipeOut)) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 1dfb75ba8..bbc9e0c21 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -423,7 +423,7 @@ container.bombMulti=Multi Purpose Bomb container.centrifuge=Centrifuge container.chemplant=Chemical Plant container.compactLauncher=Compact Launch Pad -container.craneExtractor=Conveyor Extractor +container.craneExtractor=Conveyor Ejector container.craneInserter=Conveyor Inserter container.crateDesh=Desh Crate container.crateIron=Iron Crate diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png new file mode 100644 index 0000000000000000000000000000000000000000..b643de4276a4cecba4fc102f8d8d73a16aebd413 GIT binary patch literal 642 zcmV-|0)737P)Zv2o)t5Jev~E`Vid9IaC)##L~sOSoa+7AUviz%^W|4iG6l zge-#{-~wuC5CRCm@}I$IAP$J#kKKO2qHo!BEIi? z6!Sb&nmgwh2YCO4L--&>Ztk4J7y~R39B6>G77<~dXHIX+%O3P$7-ni7?yRVez*>tj zhIyXXR8AjJ1UZB|$59neL32*w-(N>}Bp-o>y@xCZxy30CZt5V#wxaL*4G$X*w8C;Z z$GG8OZ|59Dgw9X+?#O!18fpsR^Or}v^up7tFb?S)W288MJG4MVJbuED!!rD|jG8$t zqcg_%Fvl8gu+}mTaK2m%sa6Z%tGsX8xd!o3ucchl0u5Wm1RB~|!%h{Mh)^UkSKh^T zhH`oDN?I!HYDvrGoRl0$)&;wFcZ$~oK4`t}-UqFCEGE|?l;5=OA$ptN(6gS~T(k>p?;@Y)zHSUEUf1V1@` z{mJ`+9Dc?hwE6;_6Z(S|Er2gQczTVFu|^xTPHv254YK|~v8N4jOE)=`T#;1?O4u9C z9~^OG6>n!n%`Ls_P-<^!5!t>#cg`&i&32N5($2daw0vwpz=8VyR)3%o92PxT{s_-G cg;X8<2S?DA(kD^F?f?J)07*qoM6N<$f;E~N&;S4c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3063b9e348be675e6c06a79a5bd654342b3354 GIT binary patch literal 805 zcmV+=1KRwFP)d295JjIH1M4P$fW3grEl1D+%-m*gA^A8dbAqK0V3BgUYu!JH!&ykG*_SADAh6E;pO2ukz{^P4WiF~HGOg@-X( z4;3u&oWh{6VApsCN8{;vetlbs&^#GV3ujDW0N*wzg18Szl7l zEGWwotu;;Uq`vVBajfOOrSIA~C#F<~fs&d9zHC2Cz{%Sf<8+WSK&K)*Ts3cB0x7B( zkQb5BH4Gw~#6Uz=rTp~KbuBgg+H~j-_}z6-!|SC3pd0ePKlb!}&*$eSyWNiWpYOb0 zI<_y-*($l`*~LmbE2XR#NZis7w=>N1JS;3@u;1_7-EJ3no}Mv@!5^(>c^*};h5?S} z#WSWb*!ZV-4E)`1NUaw`Z)f`gpC8W=jgUVJz_ql+^~mOtS>QK++aLI&7-QJx%mP^P z2RR^mz~TrruK5C=TW;PU_6SJ~fl&q)m4z66WmW#Nn|4B)%|;89=Tb7Ft+$Si=HPO7Ptb7q6r ziI?(2^I-11F%r_+Y`F6W-fSPPn%3#$HVY>C(X6~Ta{NJ4W0g|D8z`lMQ%hnHD|GII zqiAaE(r1p3RVkmIRqzEq3iNnWZaaH_pp>G$>b!Q2AF${TavVzhu@Rp!iNWEj*LhB0 j@O1j1ZB`se%Ax!Nq0{~wl?U#r00000NkvXXu0mjfnOS(o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_down.png b/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_down.png index a1dae746267af8aaf7d75abdff6292b359722b32..2a32ab7d94281ad2f3db4dbb66642b071649582f 100644 GIT binary patch delta 453 zcmV;$0XqK91MdTnG=HW^L_t(Ijir*YY8ycihQBpNIURN-wn^dI!C-<4le|odlvbxA z?+{l`Y`=q3n7n`+V+f=Ou^=G?R0)A}cY7-2Mcf_Hjf>T-?xYlf3=Dh!?%Y4~|GTQ+ z?+gDCy8zv8x3MWA7-J~Q5)nabjmWx>Qi?c^nM@{*0Kgc7h=2HuqKMwv83(|p>uW}% z5h8+8$`j>z?g-}dIRHgbFr7~Q6jcm|L!u}`YuzC563Vhy>g(zR3XpcY&Ef%&jGY&& zqF+#!uzTc4iXRRK#}1G0;On3=_V+XS^AiD=_PfhEo<4tD1I`1GG=GIjL_t(Ijir&jN<%Re$A1y2w-=pCQ5?F9A4mtmhtSPc+`AQ5 zZFik~0iU4w0xm9sgC7M&oD~YS?a+qHO|XeWns{&PAb8-AbCQ!^&iO~w>vhXNY#yLm zt>!kZwPDT1-h>czyIne+jspPndcAPL`@!)s72y2rEbIv(0)I#;%TyP>zfWOrRfDj@StZeRc)Mx-unG~L$oCJ|`A}XbFv-$Y4 z*$l5VCoq4O1qi?vi$#(rz^2TtO^RN@7?@vo7xlBtqb-+z+`wJiL*Ewc*9#V$%SY$g ze0cwpcW<#DH!c>nTFsV9CA8K#k){R9j_0))3mWw} O00000CX|yXRb~ z#bP1+M-2gHvstGp;xvshhzL;>`5u5$3S$iG_1Xylq-lzXcz zpp^1LRaG$n*lxD~)OAf&RU}Em@p9=8zC1i+GMP|SRR`XJwU*s(hqV^1HC6J7cdwrl zh9dxqqK1#BJbCqoG)?_w9f39gUOan5w6{+X1OS|0tnNKG04U3{^C1jJM0@*O<=2#D z2|yT*{FKepPk+!3uSq)y0wUllzb5K!s6n3Rw-(wfDvJ7!NYm?=pP*mo7prcFy^HP$ zD5d;Q^YGv;T5H}P9T5W`PEI=B+aV5{eKx+7QfRF)#&m3DS%$S15$OmhK*r-S#ScJA z29KSX{SDT_@W6@GKOGOAI-Xp@*Hshjp9k{y7Xl9XcR`0X-+sI0<};F9x_337&t*ED yQrC4S%zm&9Z!Cxio6W|Bm}MDxp5MEsf7K02L|HQCa+%Qp0000bR|B7-PLwm z-S-)M0ioanxN#%6@TZ`N+bR@l+eHn-B-n|Im~^ItAb8=B+~nqP&$$uxdfo7kC;(Ke z)y$zW#;@tU3n2u9!GM0hZwUZ~!=ZoRaMEbd11{Qae@Dalu~G| zIcYR};Zd`RQYr^8AxRRZ()y^9 zm8E5ZAON6q)%7x5Enp?YahxFu!y=WXWj^F5aU25>hDCqxy7e8*n+FgC0Ttjweo~p6 zkb{(RCLukdD1Xv9k|@%IxnGd#U_Lrm-K>ef)Oi9SgfCd#I=~pi>Dd`Q;JnrH=H*Ou z^Zf1CIaz5B(gXr9rBaFL5il_e>pw*=kR(vpun+Z<&4X>5zhA>`*O9(1ny+UJSjY#9 zbUwM8<%1i{`?cMRTCHZvGQEJcoxDk4(aRJlP85Jgle zxj^WN1QIP*ph+82<^WuQBFnxSSfPDjI|W&@j}(zIl4W~5^Lze(MvO)y%|EOGFc=I< zPOY`si|5>g5O|)4<2WY(fFKA=LcToD1HiUz;}b#{pd?970DrsP4uCXGQAz>ex-Qe% zj1BOwyt1;BE(HdW@kp->gC)oNn5JNVJw zl$uvljEkb^On;%+A^^*>umL~XV^^DButv4VhI0kva7arZ)c}MLrNLRQ)@2cY;);R; zG?FAKaqIW{^sb)peV>={m<{kYpChG2N?8-TMj@ZTd2(Nk^#uF3@N2a=ytoj zP9~?MB;j~GQWe|)WLZXWm%%N#u$UvnqC~+OOG!vXsx{`%d))(Zo(MD_vbrL4>v?n1AsJD@b$sj<(>UO zr8EG@vdku`-fyojXg6DgVFP#d7gVo5#jvm9)SK}z!Z4x z_q{3Arf_WQTvXp8Qd=ZTP!t7aS$YM}alBKt-P)LIxFslx0;N<<$uSj&`w{@GRx6Su dsX6=?`~c4lK~gSlXY2p~002ovPDHLkV1lzYvLFBe diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_side.png b/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_side.png new file mode 100644 index 0000000000000000000000000000000000000000..8c92452dd05cd7f702a6cc094c721d189681f15c GIT binary patch literal 515 zcmV+e0{s1nP)g^iWAXJuujkS@I^ij9>v z+FOX|rSMPi)CgBdPTXv?KgecC0vA@vZf@sUj62!6YXlz*Gw;p&ee>STs9vup{D*A; zbUGa`C?amIuPakZp|xf*nOFe8Y<O5n(!=dcZIY5fPM9E}rMP1uU0K0E(i(7=zZD zd(UoqRmJ@ik|gl}u7xyB$@83|C=e0uKfeXQWiGkI?=mD!QwL}^n;U>JhPzL10MLJO z=m{S`dJTYy4I;vemp$0s=FPPa3#GRcJ`ujtYBmrRW;T;Ftd+-W&x2Xt3f$O?) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_top.png b/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_top.png new file mode 100644 index 0000000000000000000000000000000000000000..51d9daf32484ed30864900966c05192514582c54 GIT binary patch literal 662 zcmV;H0%`q;P)FAykG&;lu{XV;l^qojl4_|E7>#GD!SeLGCfy0@V3<>h_e_xtcZ zpXYgF`FvjSABqF?^z<|Zl~U2Fl)`mg5{X1~9*f0r90%LB!vp|(dwVFQ5JE)8R4Rqz zINUuu!H@0*YPA}!>yk>P0PsAI7J!3;0|2(Sw`qNO#F>fT_W{Be zNGXw0Mm1*Wgj?r8YmLep&rM-!I;Lr|v$GT3Zvi+yK1NE(Far(qUlof*#&c6FZR)JA zuQQSzP zOPe~?YBe-kUSvK!sV52ICjrNCc$6$)YC4u>F_InQ+s{utwWhhvb!J%%TRhWCsZ?ra zpp>Gmt&Q@PkCAq4gU)H8L0AYg6AB||R&<#L(RiUR~efbaVenD+K|*1A7XF)9EU whSBuFq?FM<4zRz!&*9-=Q|8^>UH(OX0GzB>V(5tZH~;_u07*qoM6N<$f@4uMiU0rr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_down.png b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_down.png index 37835aa95cc678391108db19c54f0baa51519cf9..1ca9e8f4db894e097c5aaf9f4bf091ae5f1aebcb 100644 GIT binary patch delta 485 zcmV1CIodG=IiPL_t(Ijir$>YZO5g$A5E#xOZrEt_K!^m4pM8D=h4UfW+3; zGL2q$-$E-zzkr>BmUe=~La~S%h)Co>I2Vqc?5=QGj@@Nwsr^Y9yU9;Qc5*FPg7q-nbHppND7te)q&y}G0N z?1YI;#{piy-LoccS^e(w&r>hA07@x*-{-<`8-Q1L?z^Ic=O5X8^0+m>GcnI|nm%Z) z3B!;p4<9(d?PpJk?lYm|pn~#=zRpLW+H>y{lFSJMd|b z$7AXD`xHgdGV^a^Yb_$~E0ZL#CdP40nx?0^ b{IB=}8SOo3@9Ocs00000NkvXXu0mjf4%qIa delta 433 zcmV;i0Z#sp1lt3UG=GvwL_t(Ijir&lOIuMC$3Is>e0k^;0^-nJN<|}dD2Q_wH}~$@ zLf5w0+y6n_bu3*9qC-Q6vu|lt_nLr%7Y^@y&pYRPzvp{Z zqtS3Y;}ig@)oQNjoRe=h4@W6Qzu%|V>v;lz;czGeA-*2Gqkr@Q_C9}-no>%Lj4_^I zGMNC7rYY9ixf_i!3khTeYb~?c3~Mca+Q$IIaZ#H7-hN>^O#xVYwJ(?D2tok7-dd-! zvdRT50BUbG066(}IoG=ckR*u|8h=HR5Clcx-<*kA$HT61T!fm(r$2u$9L^CarEt!P%ja)DN>k^k#rB8y zIRnK+V@z(hknbKggf7dwhp?~?v;z|1v_rK%1XFgZ;dfk=FWzsawnJW3evDx*)tBuEFZ{lb)LTkOy b<)_X)WSuyNk;YjU00000NkvXXu0mjf+Gf$6 diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_up.png b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_up.png index 6609e9ae9a72024ce26fbc18ca4e5677d9443f12..0c0396c5bfa1b89540925768ddb69bb4d83c8f5d 100644 GIT binary patch delta 485 zcmVR%(e-LB2c^OXn27#{$S4(<_d?{LWofG3al05~}vQ&kmJ zRr%ZoK%VDbAb$v&gxfn@W!Js~S1kyd)OGE<^&PC62heJ@2-mi9m0f#ojPbcymaRr` zST0L1;@~=RckA#StmEW#Ob|5TmF4d~{kZkKg(!vd=cw`Qqb>>-R`}X1~>7Fpy5CLs^y^X8vug<09f$IiJt1iD{aWW!bGR b{|kQrHUCZuQ`t|?00000NkvXXu0mjfuEg_W delta 441 zcmV;q0Y?6h1mgpcG=G{&L_t(Ijir*mOPfI$$3GV&O-nNG3tVKzSg#yW3ZfW}g69 z-P#S8WeB_hysEBISt-%Q5xjf70l>*==Sgl3AWhQ{Op-j6l@bFv4I`v!3P6(NGu?&` zV&MP^g#wjmD}Mty4St*}rF0z_V?yz4rUQwG@5uj)5ju!*a@rwD@^Ik%FW;^g7H0^A z5Lj!2%8t~DxV-*`#M+F2K}5gLf4w>&^LT7T1RwxgEEbvl0BlNb<00t^jDe+1SEzqF zzp(B6+csQuJZblZ{qqY8&g6Gzu|K(d^!s12w{3S8^)hV>#=;`_00000NkvXXu0mjfIyldI diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_top.png b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_top.png index 5bed3b0052d5587ab34023acd77179500aab7fd2..6fafd3b25fbe3a3fb6a9cec826ff3b9b36e5e2ba 100644 GIT binary patch delta 451 zcmV;!0X+V^1MLHlG=HQ?L_t(Ijir(?i_}0A$A5Dy%M$L2T^Ix_u@S-ISWq~73qOK3 zHp2DW`w0~8K7hT|HMSmDD2R=4SP2J$D48UiW-pwXBr{`?o9D(@2>xN1%$qkq{_nl0 z)oK;^4^04;%jF;#LXds?J4z`$N z)8M@aAj>k&kB<5I4IaIDNt&i30Kg7__a5gQ#u&0J!x+Q)(Xk}GdhitQJ;oTk_jvEA z>v{-?%YJ`H^W#0Yo*W2Z|JecN^J_x>k;P&`*LC7_0#MgAAp{BD+rN(9-Qx=%0C;%+ zHUKB5XE^6@&VNbn&UUv$2qeiAy}L(IU5JBdH%X>=?Nqhker9PhaJ6tY4aFttCRV)?B;OkE|#PxN72! zyN{)LBfy^}WLY-&3*&uRmV-%+N@&{_=bSv4&*$8H@jRRm0#;eNt^>vmp8&LNOVcz1 tCn1EZGJc=q9!DvFvMi~pYSiI>(J$(UNE@%-iI4yQ002ovPDHLkV1o3P*RB8n delta 402 zcmV;D0d4;61H1!}G=FnRL_t(Ijir*kO9Md=#eXYD2uD&z#Lh}Yl#oJ*osA%f|AAQA zr%Tk%e?+WfVI8oGosu$@AVMS`OQmGjfUnQ@BnJH zTINt|ZQt&aL8aVNC^PO>EAsAP`#=1 zIeP?PefQMnT7n=5?4JP+s+&|wW%{H9Cx<%#v^%|wTHAtalJ6I&l*)|cmuovuxjgEm{;m$1zEgWD54LT4=4Ai@7~pHrxY< wok}4gvHYI1$5*cU*zPoQ z#VbvNV;l|fjoE5FJl|`7cgX+V{Q9%;2Yp#lkrj7W_D08VZ85^25$@wjjlX3;eWIKWKoG#(Gi|Z aAJ~pg3_Q*~Ay)+GPzFy|KbLh*2~7aq)>6m- diff --git a/src/main/resources/assets/hbm/textures/blocks/crate_entangled_top.png b/src/main/resources/assets/hbm/textures/blocks/crate_entangled_top.png deleted file mode 100644 index dc1866989d671954007b1d182626b6f1587663f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmV+}0nz@6P)8*^A9!h?k zfK=KiA%VkZKidi^r5yfHnwt;~GbFAD?3{d<iw*R1C3o8Jx)CUc|%<(mi_@ zOamOEZL-aNf^^T%2g0;-C>8nJ`0Hh=^1xBO0ff$6`{arMw*UYD07*qoM6N<$f;~2R A;{X5v From a9ea9a4b1f3de9d53d4a2bec2303cb1d845b6abf Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 15 Aug 2022 15:57:18 +0200 Subject: [PATCH 005/111] the ferocious sorter --- src/main/java/api/hbm/block/IToolable.java | 3 +- src/main/java/com/hbm/blocks/ModBlocks.java | 11 +- .../hbm/blocks/machine/MachineStirling.java | 10 +- .../com/hbm/blocks/network/BlockConveyor.java | 153 +------------ .../hbm/blocks/network/BlockConveyorBase.java | 157 ++++++++++++++ .../blocks/network/BlockConveyorBendable.java | 112 ++++++++++ .../blocks/network/BlockConveyorChute.java | 4 +- .../blocks/network/BlockConveyorClassic.java | 154 +++++++++++++ .../blocks/network/BlockConveyorDouble.java | 4 +- .../hbm/blocks/network/BlockConveyorLift.java | 4 +- .../blocks/network/BlockConveyorTriple.java | 4 +- .../com/hbm/blocks/network/CraneRouter.java | 204 ++++++++++++++++++ .../hbm/entity/item/EntityMovingPackage.java | 32 +++ .../com/hbm/entity/projectile/EntityCog.java | 26 ++- .../java/com/hbm/handler/ToolAbility.java | 14 +- .../java/com/hbm/hazard/HazardRegistry.java | 4 + .../container/ContainerCraneRouter.java | 86 ++++++++ .../container/ContainerMachineOilWell.java | 12 +- .../com/hbm/inventory/gui/GUICraneBoxer.java | 5 - .../com/hbm/inventory/gui/GUICraneRouter.java | 132 ++++++++++++ .../inventory/recipes/anvil/AnvilRecipes.java | 11 +- src/main/java/com/hbm/items/ModItems.java | 5 +- .../java/com/hbm/items/machine/ItemGear.java | 31 +++ .../java/com/hbm/items/tool/IItemAbility.java | 116 ++++++++++ .../java/com/hbm/items/tool/ItemTooling.java | 3 +- .../com/hbm/items/tool/ItemToolingWeapon.java | 57 +++++ src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 4 +- .../java/com/hbm/main/CraftingManager.java | 4 +- .../java/com/hbm/main/ResourceManager.java | 1 + .../com/hbm/module/ModulePatternMatcher.java | 2 + .../com/hbm/render/block/RenderConveyor.java | 38 ++-- .../render/entity/projectile/RenderCog.java | 9 +- .../hbm/render/item/ItemRenderLibrary.java | 6 +- .../tileentity/IItemRendererProvider.java | 5 + .../hbm/render/tileentity/RenderStirling.java | 20 +- .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityStirling.java | 15 +- .../network/TileEntityCraneRouter.java | 129 +++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 9 + src/main/resources/assets/hbm/lang/en_US.lang | 9 + .../blocks/conveyor_curve_left.png.mcmeta | 3 + .../textures/blocks/conveyor_curve_right.png | Bin 0 -> 681 bytes .../blocks/conveyor_curve_right.png.mcmeta | 3 + .../conveyor_double_curve_left.png.mcmeta | 3 + .../blocks/conveyor_double_curve_right.png | Bin 0 -> 758 bytes .../conveyor_double_curve_right.png.mcmeta | 3 + .../hbm/textures/blocks/conveyor_triple.png | Bin 286 -> 237 bytes .../blocks/conveyor_triple_curve_left.png | Bin 0 -> 810 bytes .../conveyor_triple_curve_left.png.mcmeta | 3 + .../blocks/conveyor_triple_curve_right.png | Bin 0 -> 763 bytes .../conveyor_triple_curve_right.png.mcmeta | 3 + .../textures/blocks/crane_router_overlay.png | Bin 0 -> 126 bytes .../hbm/textures/items/wrench_archineer.png | Bin 0 -> 287 bytes .../textures/items/wrench_archineer_hd.png | Bin 0 -> 517 bytes src/main/resources/mcmod.info | 2 +- 56 files changed, 1407 insertions(+), 221 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/BlockConveyorBase.java create mode 100644 src/main/java/com/hbm/blocks/network/BlockConveyorBendable.java create mode 100644 src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java create mode 100644 src/main/java/com/hbm/blocks/network/CraneRouter.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerCraneRouter.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUICraneRouter.java create mode 100644 src/main/java/com/hbm/items/machine/ItemGear.java create mode 100644 src/main/java/com/hbm/items/tool/ItemToolingWeapon.java create mode 100644 src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_right.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_right.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_router_overlay.png create mode 100644 src/main/resources/assets/hbm/textures/items/wrench_archineer.png create mode 100644 src/main/resources/assets/hbm/textures/items/wrench_archineer_hd.png diff --git a/src/main/java/api/hbm/block/IToolable.java b/src/main/java/api/hbm/block/IToolable.java index 47dfd0f82..093e924b4 100644 --- a/src/main/java/api/hbm/block/IToolable.java +++ b/src/main/java/api/hbm/block/IToolable.java @@ -10,6 +10,7 @@ public interface IToolable { public static enum ToolType { SCREWDRIVER, HAND_DRILL, - DEFUSER + DEFUSER, + WRENCH } } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index c9369b375..93a41aba1 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -631,6 +631,7 @@ public class ModBlocks { public static Block furnace_iron; public static Block furnace_steel; public static Block machine_stirling; + public static Block machine_stirling_steel; public static Block machine_difurnace_off; public static Block machine_difurnace_on; @@ -756,12 +757,14 @@ public class ModBlocks { public static Block fluid_duct_box; public static Block conveyor; + //public static Block conveyor_classic; public static Block conveyor_double; public static Block conveyor_triple; public static Block conveyor_chute; public static Block conveyor_lift; public static Block crane_extractor; public static Block crane_inserter; + public static Block crane_router; public static Block crane_boxer; public static Block crane_unboxer; @@ -1802,6 +1805,7 @@ public class ModBlocks { furnace_iron = new FurnaceIron().setBlockName("furnace_iron").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); furnace_steel = new FurnaceSteel().setBlockName("furnace_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_stirling = new MachineStirling().setBlockName("machine_stirling").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_stirling_steel = new MachineStirling().setBlockName("machine_stirling_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); @@ -1921,12 +1925,14 @@ public class ModBlocks { fluid_duct_box = new FluidDuctBox(Material.iron).setBlockName("fluid_duct_box").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fluid_duct_box"); conveyor = new BlockConveyor().setBlockName("conveyor").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); + //conveyor_classic = new BlockConveyorClassic().setBlockName("conveyor_classic").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); conveyor_double = new BlockConveyorDouble().setBlockName("conveyor_double").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor_double"); conveyor_triple = new BlockConveyorTriple().setBlockName("conveyor_triple").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor_triple"); conveyor_chute = new BlockConveyorChute().setBlockName("conveyor_chute").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); conveyor_lift = new BlockConveyorLift().setBlockName("conveyor_lift").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); crane_extractor = new CraneExtractor().setBlockName("crane_extractor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); crane_inserter = new CraneInserter().setBlockName("crane_inserter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + crane_router = new CraneRouter().setBlockName("crane_router").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); crane_boxer = new CraneBoxer().setBlockName("crane_boxer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); crane_unboxer = new CraneUnboxer().setBlockName("crane_unboxer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -2858,7 +2864,7 @@ public class ModBlocks { GameRegistry.registerBlock(turret_fritz, turret_fritz.getUnlocalizedName()); GameRegistry.registerBlock(turret_brandon, turret_brandon.getUnlocalizedName()); GameRegistry.registerBlock(turret_arty, turret_arty.getUnlocalizedName()); - GameRegistry.registerBlock(turret_himars, turret_himars.getUnlocalizedName()); + //GameRegistry.registerBlock(turret_himars, turret_himars.getUnlocalizedName()); //Wall-mounted Explosives GameRegistry.registerBlock(charge_dynamite, ItemBlockBase.class, charge_dynamite.getUnlocalizedName()); @@ -2984,6 +2990,7 @@ public class ModBlocks { register(furnace_iron); register(furnace_steel); register(machine_stirling); + register(machine_stirling_steel); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_rtg_off, machine_difurnace_rtg_off.getUnlocalizedName()); @@ -3098,9 +3105,11 @@ public class ModBlocks { GameRegistry.registerBlock(crane_extractor, crane_extractor.getUnlocalizedName()); GameRegistry.registerBlock(crane_inserter, crane_inserter.getUnlocalizedName()); + GameRegistry.registerBlock(crane_router, crane_router.getUnlocalizedName()); GameRegistry.registerBlock(crane_boxer, crane_boxer.getUnlocalizedName()); GameRegistry.registerBlock(crane_unboxer, crane_unboxer.getUnlocalizedName()); GameRegistry.registerBlock(conveyor, conveyor.getUnlocalizedName()); + //GameRegistry.registerBlock(conveyor_classic, conveyor_classic.getUnlocalizedName()); GameRegistry.registerBlock(conveyor_double, conveyor_double.getUnlocalizedName()); GameRegistry.registerBlock(conveyor_triple, conveyor_triple.getUnlocalizedName()); GameRegistry.registerBlock(conveyor_chute, conveyor_chute.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/MachineStirling.java b/src/main/java/com/hbm/blocks/machine/MachineStirling.java index aaab916fa..800b7f361 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineStirling.java +++ b/src/main/java/com/hbm/blocks/machine/MachineStirling.java @@ -78,8 +78,9 @@ public class MachineStirling extends BlockDummyable implements ILookOverlay, ITo return false; TileEntityStirling stirling = (TileEntityStirling)world.getTileEntity(pos[0], pos[1], pos[2]); + int meta = stirling.getGeatMeta(); - if(!stirling.hasCog && player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.gear_large) { + if(!stirling.hasCog && player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.gear_large && player.getHeldItem().getItemDamage() == meta) { player.getHeldItem().stackSize--; stirling.hasCog = true; stirling.markDirty(); @@ -155,20 +156,21 @@ public class MachineStirling extends BlockDummyable implements ILookOverlay, ITo return; TileEntityStirling stirling = (TileEntityStirling) te; + int maxHeat = stirling.maxHeat(); List text = new ArrayList(); text.add(stirling.heat + "TU/t"); text.add((stirling.hasCog ? stirling.powerBuffer : 0) + "HE/t"); - double percent = (double) stirling.heat / 300D; + double percent = (double) stirling.heat / (double) maxHeat; int color = ((int) (0xFF - 0xFF * percent)) << 16 | ((int)(0xFF * percent) << 8); if(percent > 1D) color = 0xff0000; - text.add("&[" + color + "&]" + ((stirling.heat * 1000 / 300) / 10D) + "%"); + text.add("&[" + color + "&]" + ((stirling.heat * 1000 / maxHeat) / 10D) + "%"); - if(stirling.heat > 300) { + if(stirling.heat > maxHeat) { text.add("&[" + (BobMathUtil.getBlink() ? 0xff0000 : 0xffff00) + "&]! ! ! OVERSPEED ! ! !"); } diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyor.java b/src/main/java/com/hbm/blocks/network/BlockConveyor.java index b4e6afad0..eb22da046 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyor.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyor.java @@ -1,157 +1,8 @@ package com.hbm.blocks.network; -import com.hbm.entity.item.EntityMovingItem; -import com.hbm.lib.RefStrings; - -import api.hbm.conveyor.IConveyorBelt; -import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class BlockConveyor extends Block implements IConveyorBelt { - - @SideOnly(Side.CLIENT) - protected IIcon sideIcon; +public class BlockConveyor extends BlockConveyorBendable { public BlockConveyor() { - super(Material.iron); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - super.registerBlockIcons(iconRegister); - this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int metadata) { - - if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) - return this.sideIcon; - if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) - return this.sideIcon; - - return super.getIcon(side, metadata); - } - - @Override - public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { - - ForgeDirection dir = getTravelDirection(world, x, y, z, itemPos, speed); - //snapping point - Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); - //snapping point + speed - Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord - dir.offsetY * speed, snap.zCoord - dir.offsetZ * speed); - //delta to get to that point - Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); - double len = motion.lengthVector(); - //the effective destination towards "dest" after taking speed into consideration - Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); - return ret; - } - - public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { - return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); - } - - @Override - public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { - - ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); - - itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); - itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); - - double posX = x + 0.5; - double posZ = z + 0.5; - - if(dir.offsetX != 0) { - posX = itemPos.xCoord; - } - if(dir.offsetZ != 0) { - posZ = itemPos.zCoord; - } - - return Vec3.createVectorHelper(posX, y + 0.25, posZ); - } - - @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { - - if(!world.isRemote) { - - if(entity instanceof EntityItem && entity.ticksExisted > 10 && !entity.isDead) { - - EntityMovingItem item = new EntityMovingItem(world); - item.setItemStack(((EntityItem) entity).getEntityItem().copy()); - Vec3 pos = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); - Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, pos); - item.setPositionAndRotation(snap.xCoord, snap.yCoord, snap.zCoord, 0, 0); - world.spawnEntityInWorld(item); - - entity.setDead(); - } - } - } - - public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - - @Override - public int getRenderType() { - return renderID; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.25, z + 1); - } - - @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); - } - if(i == 1) { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - if(i == 2) { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 3) { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } + super(); } } diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java b/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java new file mode 100644 index 000000000..66ade2dda --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java @@ -0,0 +1,157 @@ +package com.hbm.blocks.network; + +import com.hbm.entity.item.EntityMovingItem; +import com.hbm.lib.RefStrings; + +import api.hbm.conveyor.IConveyorBelt; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class BlockConveyorBase extends Block implements IConveyorBelt { + + @SideOnly(Side.CLIENT) + protected IIcon sideIcon; + + public BlockConveyorBase() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + + if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) + return this.sideIcon; + if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) + return this.sideIcon; + + return super.getIcon(side, metadata); + } + + @Override + public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { + + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); + //snapping point + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + //snapping point + speed + Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord - dir.offsetY * speed, snap.zCoord - dir.offsetZ * speed); + //delta to get to that point + Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); + double len = motion.lengthVector(); + //the effective destination towards "dest" after taking speed into consideration + Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); + return ret; + } + + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { + return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + } + + @Override + public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { + + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); + + itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); + itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); + + double posX = x + 0.5; + double posZ = z + 0.5; + + if(dir.offsetX != 0) { + posX = itemPos.xCoord; + } + if(dir.offsetZ != 0) { + posZ = itemPos.zCoord; + } + + return Vec3.createVectorHelper(posX, y + 0.25, posZ); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + + if(!world.isRemote) { + + if(entity instanceof EntityItem && entity.ticksExisted > 10 && !entity.isDead) { + + EntityMovingItem item = new EntityMovingItem(world); + item.setItemStack(((EntityItem) entity).getEntityItem().copy()); + Vec3 pos = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, pos); + item.setPositionAndRotation(snap.xCoord, snap.yCoord, snap.zCoord, 0, 0); + world.spawnEntityInWorld(item); + + entity.setDead(); + } + } + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.25, z + 1); + } + + @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); + } + if(i == 1) { + world.setBlockMetadataWithNotify(x, y, z, 5, 2); + } + if(i == 2) { + world.setBlockMetadataWithNotify(x, y, z, 3, 2); + } + if(i == 3) { + world.setBlockMetadataWithNotify(x, y, z, 4, 2); + } + } +} diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorBendable.java b/src/main/java/com/hbm/blocks/network/BlockConveyorBendable.java new file mode 100644 index 000000000..201a6432a --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorBendable.java @@ -0,0 +1,112 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class BlockConveyorBendable extends BlockConveyorBase implements IToolable { + + @SideOnly(Side.CLIENT) protected IIcon curveLeft; + @SideOnly(Side.CLIENT) protected IIcon curveRight; + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.curveLeft = iconRegister.registerIcon(this.getTextureName() + "_curve_left"); + this.curveRight = iconRegister.registerIcon(this.getTextureName() + "_curve_right"); + } + + protected int getPathDirection(int meta) { + + if(meta >= 6 && meta <= 9) return 1; + if(meta >= 10 && meta <= 13) return 2; + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + + int dir = getPathDirection(metadata); + + if(dir > 0 && side > 1) + return this.sideIcon; + + if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) + return this.sideIcon; + if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) + return this.sideIcon; + + if(dir == 1) return this.curveLeft; + if(dir == 2) return this.curveRight; + + return super.getIcon(side, metadata); + } + + @Override + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { + + int meta = world.getBlockMetadata(x, y, z); + int dir = getPathDirection(meta); + meta -= dir * 4; + + ForgeDirection primary = ForgeDirection.getOrientation(meta); + + if(dir > 0) { + dir--; + double ix = x + 0.5; + double iz = z + 0.5; + ForgeDirection secondary = primary.getRotation(ForgeDirection.UP); + + ix -= -primary.offsetX * 0.5 + secondary.offsetX * (0.5 - dir); + iz -= -primary.offsetZ * 0.5 + secondary.offsetZ * (0.5 - dir); + + double dX = Math.abs(itemPos.xCoord - ix); + double dZ = Math.abs(itemPos.zCoord - iz); + + if(dX + dZ >= 1) { + + if(dir == 0) + return secondary.getOpposite(); + else + return secondary; + } + } + + return primary; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) + return false; + int meta = world.getBlockMetadata(x, y, z); + int newMeta = meta; + + int dir = getPathDirection(meta); + + if(!player.isSneaking()) { + if(meta > 9) meta -= 8; + if(meta > 5) meta -= 4; + newMeta = ForgeDirection.getOrientation(meta).getRotation(ForgeDirection.UP).ordinal() + dir * 4; + } else { + + if(dir < 2) + newMeta += 4; + else + newMeta -= 8; + } + + world.setBlockMetadataWithNotify(x, y, z, newMeta, 3); + + return true; + } +} diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorChute.java b/src/main/java/com/hbm/blocks/network/BlockConveyorChute.java index 9f55eed3e..e61ff37f0 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorChute.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorChute.java @@ -12,7 +12,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyorChute extends BlockConveyor { +public class BlockConveyorChute extends BlockConveyorBase { @Override public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { @@ -28,7 +28,7 @@ public class BlockConveyorChute extends BlockConveyor { } @Override - public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { Block below = world.getBlock(x, y - 1, z); if(below instanceof IConveyorBelt || below instanceof IEnterableBlock || itemPos.yCoord > y + 0.25) { diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java b/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java new file mode 100644 index 000000000..04c9052a4 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java @@ -0,0 +1,154 @@ +package com.hbm.blocks.network; + +import com.hbm.entity.item.EntityMovingItem; +import com.hbm.lib.RefStrings; + +import api.hbm.conveyor.IConveyorBelt; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockConveyorClassic extends Block implements IConveyorBelt { + + @SideOnly(Side.CLIENT) + protected IIcon sideIcon; + + public BlockConveyorClassic() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + + if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) + return this.sideIcon; + if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) + return this.sideIcon; + + return super.getIcon(side, metadata); + } + + @Override + public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { + + ForgeDirection dir = getTravelDirection(world, x, y, z, itemPos, speed); + //snapping point + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + //snapping point + speed + Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord - dir.offsetY * speed, snap.zCoord - dir.offsetZ * speed); + //delta to get to that point + Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); + double len = motion.lengthVector(); + //the effective destination towards "dest" after taking speed into consideration + Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); + return ret; + } + + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { + return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + } + + @Override + public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { + + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + + itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); + itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); + + double posX = x + 0.5; + double posZ = z + 0.5; + + if(dir.offsetX != 0) { + posX = itemPos.xCoord; + } + if(dir.offsetZ != 0) { + posZ = itemPos.zCoord; + } + + return Vec3.createVectorHelper(posX, y + 0.25, posZ); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + + if(!world.isRemote) { + + if(entity instanceof EntityItem && entity.ticksExisted > 10 && !entity.isDead) { + + EntityMovingItem item = new EntityMovingItem(world); + item.setItemStack(((EntityItem) entity).getEntityItem().copy()); + Vec3 pos = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, pos); + item.setPositionAndRotation(snap.xCoord, snap.yCoord, snap.zCoord, 0, 0); + world.spawnEntityInWorld(item); + + entity.setDead(); + } + } + } + + @Override + public int getRenderType() { + return BlockConveyorBase.renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.25, z + 1); + } + + @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); + } + if(i == 1) { + world.setBlockMetadataWithNotify(x, y, z, 5, 2); + } + if(i == 2) { + world.setBlockMetadataWithNotify(x, y, z, 3, 2); + } + if(i == 3) { + world.setBlockMetadataWithNotify(x, y, z, 4, 2); + } + } +} diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorDouble.java b/src/main/java/com/hbm/blocks/network/BlockConveyorDouble.java index b83cb95cb..b81e237b6 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorDouble.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorDouble.java @@ -5,12 +5,12 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyorDouble extends BlockConveyor { +public class BlockConveyorDouble extends BlockConveyorBendable { @Override public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { - ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java b/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java index 6bea6da24..574e28634 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java @@ -10,10 +10,10 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyorLift extends BlockConveyor { +public class BlockConveyorLift extends BlockConveyorBase { @Override - public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorTriple.java b/src/main/java/com/hbm/blocks/network/BlockConveyorTriple.java index 06327a90d..69ed40980 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorTriple.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorTriple.java @@ -5,12 +5,12 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyorTriple extends BlockConveyor { +public class BlockConveyorTriple extends BlockConveyorBendable { @Override public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { - ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); diff --git a/src/main/java/com/hbm/blocks/network/CraneRouter.java b/src/main/java/com/hbm/blocks/network/CraneRouter.java new file mode 100644 index 000000000..06dc1769f --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/CraneRouter.java @@ -0,0 +1,204 @@ +package com.hbm.blocks.network; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.entity.item.EntityMovingItem; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.module.ModulePatternMatcher; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.network.TileEntityCraneRouter; + +import api.hbm.conveyor.IConveyorBelt; +import api.hbm.conveyor.IConveyorItem; +import api.hbm.conveyor.IConveyorPackage; +import api.hbm.conveyor.IEnterableBlock; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnterableBlock { + + @SideOnly(Side.CLIENT) protected IIcon iconOverlay; + + public CraneRouter() { + super(Material.iron); + this.setBlockTextureName(RefStrings.MODID + ":crane_in"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityCraneRouter(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconOverlay = iconRegister.registerIcon(RefStrings.MODID + ":crane_router_overlay"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return RenderBlockMultipass.currentPass == 0 ? this.blockIcon : this.iconOverlay; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } else { + return false; + } + } + + @Override + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess world, int x, int y, int z) { + + if(RenderBlockMultipass.currentPass == 0) + return 0xffffff; + + switch(RenderBlockMultipass.currentPass - 1) { + case 0: return 0xff0000; + case 1: return 0xff8000; + case 2: return 0xffff00; + case 3: return 0x00ff00; + case 4: return 0x0080ff; + case 5: return 0x8000ff; + default: return 0xffffff; + } + } + + @Override + public int getRenderType(){ + return IBlockMultiPass.getRenderType(); + } + + /* + * arg arg arg spongeboy me bob i have fooled the system that only allows one tint per pass by disabling all rendered sides except one and rendering multiple passes arg arg arg + */ + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + + if(RenderBlockMultipass.currentPass == 0) + return true; + + return side == RenderBlockMultipass.currentPass - 1; + } + + @Override + public int getPasses() { + return 7; + } + + @Override + public boolean canItemEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { + return true; + } + + @Override + public void onItemEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { + TileEntityCraneRouter router = (TileEntityCraneRouter) world.getTileEntity(x, y, z); + ItemStack stack = entity.getItemStack(); + + List validDirs = new ArrayList(); + + //check filters for all sides + for(int side = 0; side < 6; side++) { + + ModulePatternMatcher matcher = router.patterns[side]; + int mode = router.modes[side]; + + //if the side is disabled or wildcard, skip + if(mode == router.MODE_NONE || mode == router.MODE_WILDCARD) + continue; + + boolean matchesFilter = false; + + for(int slot = 0; slot < 5; slot++) { + ItemStack filter = router.slots[side * 5 + slot]; + + if(filter == null) + continue; + + //the filter kicks in so long as one entry matches + if(matcher.isValidForFilter(filter, slot, stack)) { + matchesFilter = true; + break; + } + } + + //add dir if matches with whitelist on or doesn't match with blacklist on + if((mode == router.MODE_WHITELIST && matchesFilter) || (mode == router.MODE_BLACKLIST && !matchesFilter)) { + validDirs.add(ForgeDirection.getOrientation(side)); + } + } + + //if no valid dirs have yet been found, use wildcard + if(validDirs.isEmpty()) { + for(int side = 0; side < 6; side++) { + if(router.modes[side] == router.MODE_WILDCARD) { + validDirs.add(ForgeDirection.getOrientation(side)); + } + } + } + + if(validDirs.isEmpty()) { + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + return; + } + + int i = world.rand.nextInt(validDirs.size()); + sendOnRoute(world, x, y, z, entity, validDirs.get(i)); + } + + protected void sendOnRoute(World world, int x, int y, int z, IConveyorItem item, ForgeDirection dir) { + + IConveyorBelt belt = null; + Block block = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); + + if(block instanceof IConveyorBelt) { + belt = (IConveyorBelt) block; + } + + if(belt != null) { + EntityMovingItem moving = new EntityMovingItem(world); + Vec3 pos = Vec3.createVectorHelper(x + 0.5 + dir.offsetX * 0.55, y + 0.5 + dir.offsetY * 0.55, z + 0.5 + dir.offsetZ * 0.55); + Vec3 snap = belt.getClosestSnappingPosition(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, pos); + moving.setPosition(snap.xCoord, snap.yCoord, snap.zCoord); + moving.setItemStack(item.getItemStack()); + world.spawnEntityInWorld(moving); + } else { + world.spawnEntityInWorld(new EntityItem(world, x + 0.5 + dir.offsetX * 0.55, y + 0.5 + dir.offsetY * 0.55, z + 0.5 + dir.offsetZ * 0.55, item.getItemStack())); + } + } + + @Override + public boolean canPackageEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorPackage entity) { + return false; + } + + @Override + public void onPackageEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorPackage entity) { } +} diff --git a/src/main/java/com/hbm/entity/item/EntityMovingPackage.java b/src/main/java/com/hbm/entity/item/EntityMovingPackage.java index 210b3ad5f..adbf4a5b6 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingPackage.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingPackage.java @@ -6,9 +6,11 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.conveyor.IConveyorPackage; import api.hbm.conveyor.IEnterableBlock; import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.DamageSource; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -33,6 +35,36 @@ public class EntityMovingPackage extends EntityMovingConveyorObject implements I return contents; } + @Override + public boolean interactFirst(EntityPlayer player) { + + if(!worldObj.isRemote) { + + for(ItemStack stack : contents) { + if(!player.inventory.addItemStackToInventory(stack.copy())) { + worldObj.spawnEntityInWorld(new EntityItem(worldObj, posX, posY + 0.125, posZ, stack)); + } + } + + this.setDead(); + } + + return false; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + + if(!worldObj.isRemote) { + this.setDead(); + + for(ItemStack stack : contents) { + worldObj.spawnEntityInWorld(new EntityItem(worldObj, posX, posY + 0.125, posZ, stack)); + } + } + return true; + } + @Override public void enterBlock(IEnterableBlock enterable, BlockPos pos, ForgeDirection dir) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityCog.java b/src/main/java/com/hbm/entity/projectile/EntityCog.java index 9019f4c45..d58d542ac 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityCog.java +++ b/src/main/java/com/hbm/entity/projectile/EntityCog.java @@ -49,6 +49,7 @@ public class EntityCog extends EntityThrowableNT { protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(10, new Integer(0)); + this.dataWatcher.addObject(11, new Integer(0)); } public EntityCog setOrientation(int rot) { @@ -56,16 +57,25 @@ public class EntityCog extends EntityThrowableNT { return this; } + public EntityCog setMeta(int meta) { + this.dataWatcher.updateObject(11, meta); + return this; + } + public int getOrientation() { return this.dataWatcher.getWatchableObjectInt(10); } + + public int getMeta() { + return this.dataWatcher.getWatchableObjectInt(11); + } @Override public boolean interactFirst(EntityPlayer player) { if(!worldObj.isRemote) { - if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.gear_large))) + if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.gear_large, 1, this.getMeta()))) this.setDead(); player.inventoryContainer.detectAndSendChanges(); @@ -187,4 +197,18 @@ public class EntityCog extends EntityThrowableNT { protected int groundDespawn() { return 0; } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setInteger("rot", this.getOrientation()); + nbt.setInteger("meta", this.getMeta()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + this.setOrientation(nbt.getInteger("rot")); + this.setMeta(nbt.getInteger("meta")); + } } diff --git a/src/main/java/com/hbm/handler/ToolAbility.java b/src/main/java/com/hbm/handler/ToolAbility.java index 77eb41b7d..8097de9cd 100644 --- a/src/main/java/com/hbm/handler/ToolAbility.java +++ b/src/main/java/com/hbm/handler/ToolAbility.java @@ -202,7 +202,7 @@ public abstract class ToolAbility { @Override public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { - //if the tool is already enchanted, do nothing + /*//if the tool is already enchanted, do nothing if(EnchantmentHelper.getSilkTouchModifier(player) || player.getHeldItem() == null) return; @@ -214,7 +214,9 @@ public abstract class ToolAbility { EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player); + player.getHeldItem().damageItem(1, player);*/ + + tool.breakBlockSpecial(world, x, y, z, block, meta, player, 0, true); } @Override @@ -249,7 +251,7 @@ public abstract class ToolAbility { @Override public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { - //if the tool is already enchanted, do nothing + /*//if the tool is already enchanted, do nothing if(EnchantmentHelper.getFortuneModifier(player) > 0 || player.getHeldItem() == null) return; @@ -261,7 +263,11 @@ public abstract class ToolAbility { EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player); + player.getHeldItem().damageItem(1, player);*/ + + + + tool.breakBlockSpecial(world, x, y, z, block, meta, player, luck, false); } @Override diff --git a/src/main/java/com/hbm/hazard/HazardRegistry.java b/src/main/java/com/hbm/hazard/HazardRegistry.java index 9bca608eb..b09ca07a9 100644 --- a/src/main/java/com/hbm/hazard/HazardRegistry.java +++ b/src/main/java/com/hbm/hazard/HazardRegistry.java @@ -180,6 +180,10 @@ public class HazardRegistry { HazardSystem.register(egg_balefire_shard, makeData(RADIATION, bf * nugget)); HazardSystem.register(egg_balefire, makeData(RADIATION, bf * ingot)); + HazardSystem.register(solid_fuel_bf, makeData(RADIATION, 1000)); //roughly the amount of the balefire shard diluted in 250mB of rocket fuel + HazardSystem.register(solid_fuel_presto_bf, makeData(RADIATION, 2000)); + HazardSystem.register(solid_fuel_presto_triplet_bf, makeData(RADIATION, 6000)); + HazardSystem.register(nuclear_waste_long, makeData(RADIATION, 5F)); HazardSystem.register(nuclear_waste_long_tiny, makeData(RADIATION, 0.5F)); HazardSystem.register(nuclear_waste_short, makeData().addEntry(RADIATION, 30F).addEntry(HOT, 5F)); diff --git a/src/main/java/com/hbm/inventory/container/ContainerCraneRouter.java b/src/main/java/com/hbm/inventory/container/ContainerCraneRouter.java new file mode 100644 index 000000000..2ef4b9ba0 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerCraneRouter.java @@ -0,0 +1,86 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotPattern; +import com.hbm.tileentity.network.TileEntityCraneRouter; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerCraneRouter extends Container { + + private TileEntityCraneRouter router; + + public ContainerCraneRouter(InventoryPlayer invPlayer, TileEntityCraneRouter router) { + this.router = router; + + for(int j = 0; j < 2; j++) { + for(int i = 0; i < 3; i++) { + for(int k = 0; k < 5; k++) { + this.addSlotToContainer(new SlotPattern(router, k + j * 15 + i * 5, 34 + k * 18 + j * 98, 17 + i * 26)); + } + } + } + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 47 + j * 18, 119 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 47 + i * 18, 177)); + } + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + //L/R: 0 + //M3: 3 + //SHIFT: 1 + //DRAG: 5 + + if(index < 0 || index >= 30) { + return super.slotClick(index, button, mode, player); + } + + Slot slot = this.getSlot(index); + + ItemStack ret = null; + ItemStack held = player.inventory.getItemStack(); + + if(slot.getHasStack()) + ret = slot.getStack().copy(); + + if(button == 1 && mode == 0 && slot.getHasStack()) { + router.nextMode(index); + return ret; + + } else { + + slot.putStack(held != null ? held.copy() : null); + + if(slot.getHasStack()) { + slot.getStack().stackSize = 1; + } + + slot.onSlotChanged(); + router.initPattern(slot.getStack(), index); + + return ret; + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + return null; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return router.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java b/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java index de6d70b11..fb5047708 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java @@ -53,16 +53,22 @@ public class ContainerMachineOilWell extends Container { ItemStack var5 = var4.getStack(); var3 = var5.copy(); - if(par2 <= 5) { - if(!this.mergeItemStack(var5, 6, this.inventorySlots.size(), true)) { + if(par2 <= 7) { + if(!this.mergeItemStack(var5, 8, this.inventorySlots.size(), true)) { return null; } - } else if(!this.mergeItemStack(var5, 0, 2, false)) { + } else { if(var5.getItem() instanceof ItemMachineUpgrade) { if(!this.mergeItemStack(var5, 5, 8, true)) { return null; } + } else { + if(!this.mergeItemStack(var5, 0, 2, false)) { + if(!this.mergeItemStack(var5, 3, 4, false)) { + return null; + } + } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java b/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java index 276f606b9..e2faf5fa4 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java @@ -27,11 +27,6 @@ public class GUICraneBoxer extends GuiInfoContainer { this.xSize = 176; this.ySize = 185; } - - @Override - public void drawScreen(int x, int y, float interp) { - super.drawScreen(x, y, interp); - } @Override protected void mouseClicked(int x, int y, int i) { diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java b/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java new file mode 100644 index 000000000..f378237df --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java @@ -0,0 +1,132 @@ +package com.hbm.inventory.gui; + +import java.util.Arrays; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerCraneRouter; +import com.hbm.lib.RefStrings; +import com.hbm.module.ModulePatternMatcher; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.network.TileEntityCraneRouter; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUICraneRouter extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crane_router.png"); + private TileEntityCraneRouter router; + + public GUICraneRouter(InventoryPlayer invPlayer, TileEntityCraneRouter tedf) { + super(new ContainerCraneRouter(invPlayer, tedf)); + router = tedf; + + this.xSize = 256; + this.ySize = 201; + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + for(int j = 0; j < 2; j++) { + for(int k = 0; k < 3; k++) { + + if(guiLeft + 7 + j * 222 <= x && guiLeft + 7 + j * 222 + 18 > x && guiTop + 16 + k * 26 < y && guiTop + 16 + k * 26 + 18 >= y) { + + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("toggle", j * 3 + k); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, router.xCoord, router.yCoord, router.zCoord)); + } + } + } + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + for(int j = 0; j < 2; j++) { + for(int k = 0; k < 3; k++) { + + if(guiLeft + 7 + j * 222 <= x && guiLeft + 7 + j * 222 + 18 > x && guiTop + 16 + k * 26 < y && guiTop + 16 + k * 26 + 18 >= y) { + + String[] text = new String[2]; + int index = j * 3 + k; + + switch(router.modes[index]) { + case 0: text = new String[] { "OFF" }; break; + case 1: text[0] = "WHITELIST"; text[1] = "Route if filter matches"; break; + case 2: text[0] = "BLACKLIST"; text[1] = "Route if filter doesn't match"; break; + case 3: text[0] = "WILDCARD"; text[1] = "Route if no other route is valid"; break; + } + + this.func_146283_a(Arrays.asList(text), x, y); + } + } + } + + if(this.mc.thePlayer.inventory.getItemStack() == null) { + for(int i = 0; i < 30; ++i) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); + ModulePatternMatcher matcher = router.patterns[i / 5]; + int index = i % 5; + + if(this.isMouseOverSlot(slot, x, y) && matcher.modes[index] != null) { + + String label = EnumChatFormatting.YELLOW + ""; + + switch(matcher.modes[index]) { + case "exact": label += "Item and meta match"; break; + case "wildcard": label += "Item matches"; break; + default: label += "Ore dict key matches: " + matcher.modes[index]; break; + } + + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label}), x, y - 30); + } + } + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.router.hasCustomInventoryName() ? this.router.getInventoryName() : I18n.format(this.router.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8 + 39, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, 256, 93); + drawTexturedModalRect(guiLeft + 39, guiTop + 93, 39, 93, 176, 108); + + for(int j = 0; j < 2; j++) { + for(int k = 0; k < 3; k++) { + int index = j * 3 + k; + int mode = router.modes[index]; + drawTexturedModalRect(guiLeft + 7 + j * 222, guiTop + 16 + k * 26, 238, 93 + mode * 18, 18, 18); + } + } + + if(Keyboard.isKeyDown(Keyboard.KEY_LMENU)) + for(int i = 0; i < this.inventorySlots.inventorySlots.size(); i++) { + Slot s = this.inventorySlots.getSlot(i); + + this.fontRendererObj.drawStringWithShadow(i + "", guiLeft + s.xDisplayPosition + 2, guiTop + s.yDisplayPosition, 0xffffff); + this.fontRendererObj.drawStringWithShadow(s.getSlotIndex() + "", guiLeft + s.xDisplayPosition + 2, guiTop + s.yDisplayPosition + 8, 0xff8080); + } + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 2d7f13c6f..8780d34ae 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -202,9 +202,18 @@ public class AnvilRecipes { new OreDictStack(STEEL.plate(), 6), new OreDictStack(CU.ingot(), 8), new ComparableStack(ModItems.coil_copper, 4), - new ComparableStack(ModItems.gear_large, 1) + new ComparableStack(ModItems.gear_large, 1, 0) }, new AnvilOutput(new ItemStack(ModBlocks.machine_stirling))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(STEEL.plate(), 16), + new OreDictStack(BE.ingot(), 6), + new OreDictStack(CU.ingot(), 8), + new ComparableStack(ModItems.coil_gold, 16), + new ComparableStack(ModItems.gear_large, 1, 1) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_stirling_steel))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 6), diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 644d22bb5..e478948b5 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1917,6 +1917,7 @@ public class ModItems { public static Item screwdriver_desh; public static Item hand_drill; public static Item hand_drill_desh; + public static Item wrench_archineer; public static Item chemistry_set; public static Item chemistry_set_boron; public static Item overfuse; @@ -3064,7 +3065,7 @@ public class ModItems { deuterium_filter = new Item().setUnlocalizedName("deuterium_filter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":deuterium_filter"); parts_legendary = new ItemEnumMulti(EnumLegendaryType.class, false, true).setUnlocalizedName("parts_legendary").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":parts_legendary"); - gear_large = new Item().setUnlocalizedName("gear_large").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gear_large"); + gear_large = new ItemGear().setUnlocalizedName("gear_large").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gear_large"); cap_aluminium = new Item().setUnlocalizedName("cap_aluminium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":cap_aluminium"); hull_small_steel = new Item().setUnlocalizedName("hull_small_steel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":hull_small_steel"); @@ -4665,6 +4666,7 @@ public class ModItems { screwdriver_desh = new ItemTooling(ToolType.SCREWDRIVER, 0).setUnlocalizedName("screwdriver_desh"); hand_drill = new ItemTooling(ToolType.HAND_DRILL, 100).setUnlocalizedName("hand_drill"); hand_drill_desh = new ItemTooling(ToolType.HAND_DRILL, 0).setUnlocalizedName("hand_drill_desh"); + wrench_archineer = new ItemToolingWeapon(ToolType.WRENCH, 1000, 12F).setUnlocalizedName("wrench_archineer").setTextureName(RefStrings.MODID + ":wrench_archineer_hd"); chemistry_set = new ItemCraftingDegradation(100).setUnlocalizedName("chemistry_set"); chemistry_set_boron = new ItemCraftingDegradation(0).setUnlocalizedName("chemistry_set_boron"); overfuse = new ItemCustomLore().setUnlocalizedName("overfuse").setMaxStackSize(1).setFull3D().setTextureName(RefStrings.MODID + ":overfuse"); @@ -7625,6 +7627,7 @@ public class ModItems { GameRegistry.registerItem(balefire_and_steel, balefire_and_steel.getUnlocalizedName()); GameRegistry.registerItem(crowbar, crowbar.getUnlocalizedName()); GameRegistry.registerItem(wrench, wrench.getUnlocalizedName()); + GameRegistry.registerItem(wrench_archineer, wrench_archineer.getUnlocalizedName()); GameRegistry.registerItem(wrench_flipped, wrench_flipped.getUnlocalizedName()); GameRegistry.registerItem(memespoon, memespoon.getUnlocalizedName()); GameRegistry.registerItem(saw, saw.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemGear.java b/src/main/java/com/hbm/items/machine/ItemGear.java new file mode 100644 index 000000000..63c32b7ed --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemGear.java @@ -0,0 +1,31 @@ +package com.hbm.items.machine; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemGear extends Item { + + public ItemGear() { + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + for(int i = 0; i < 2; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return this.getUnlocalizedName() + (stack.getItemDamage() == 1 ? "_steel" : ""); + } + +} diff --git a/src/main/java/com/hbm/items/tool/IItemAbility.java b/src/main/java/com/hbm/items/tool/IItemAbility.java index 00f5cefab..ff738c923 100644 --- a/src/main/java/com/hbm/items/tool/IItemAbility.java +++ b/src/main/java/com/hbm/items/tool/IItemAbility.java @@ -1,15 +1,22 @@ package com.hbm.items.tool; +import java.util.ArrayList; + import net.minecraft.block.Block; import net.minecraft.client.Minecraft; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.network.play.client.C07PacketPlayerDigging; import net.minecraft.network.play.server.S23PacketBlockChange; +import net.minecraft.stats.StatList; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.world.BlockEvent; public interface IItemAbility { @@ -86,4 +93,113 @@ public interface IItemAbility { Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C07PacketPlayerDigging(2, x, y, z, Minecraft.getMinecraft().objectMouseOver.sideHit)); } } + + public default void breakBlockSpecial(World world, int x, int y, int z, Block block, int meta, EntityPlayer playerEntity, int fortune, boolean silkTouch) { + + if(world.isAirBlock(x, y, z)) + return; + + if(!(playerEntity instanceof EntityPlayerMP)) + return; + + EntityPlayerMP player = (EntityPlayerMP) playerEntity; + + if(!ForgeHooks.canHarvestBlock(block, player, meta)) + return; + + BlockEvent.BreakEvent event = ForgeHooks.onBlockBreakEvent(world, player.theItemInWorldManager.getGameType(), player, x, y, z); + if(event.isCanceled()) + return; + + if(player.capabilities.isCreativeMode) { + block.onBlockHarvested(world, x, y, z, meta, player); + if(block.removedByPlayer(world, player, x, y, z, false)) + block.onBlockDestroyedByPlayer(world, x, y, z, meta); + + if(!world.isRemote) { + player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world)); + } + return; + } + + player.getCurrentEquippedItem().func_150999_a(world, block, x, y, z, player); + + if(!world.isRemote) { + + block.onBlockHarvested(world, x, y, z, meta, player); + + if(block.removedByPlayer(world, player, x, y, z, true)) { + block.onBlockDestroyedByPlayer(world, x, y, z, meta); + harvestBlock(world, player, x, y, z, block, meta, fortune, silkTouch); + if(!silkTouch) block.dropXpOnBlockBreak(world, x, y, z, event.getExpToDrop()); + } + + player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world)); + + } else { + world.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(block) + (meta << 12)); + if(block.removedByPlayer(world, player, x, y, z, true)) { + block.onBlockDestroyedByPlayer(world, x, y, z, meta); + } + ItemStack itemstack = player.getCurrentEquippedItem(); + if(itemstack != null) { + itemstack.func_150999_a(world, block, x, y, z, player); + + if(itemstack.stackSize == 0) { + player.destroyCurrentEquippedItem(); + } + } + + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C07PacketPlayerDigging(2, x, y, z, Minecraft.getMinecraft().objectMouseOver.sideHit)); + } + } + + public default void harvestBlock(World world, EntityPlayer player, int x, int y, int z, Block block, int meta, int fortune, boolean silkTouch) { + + player.addStat(StatList.mineBlockStatArray[block.getIdFromBlock(block)], 1); + player.addExhaustion(0.025F); + + if(block.canSilkHarvest(world, player, x, y, z, meta) && silkTouch) { + ArrayList items = new ArrayList(); + //block.createStackedBlock(meta); + + /// createStackedBlock /// + int j = 0; + Item item = Item.getItemFromBlock(block); + if(item != null && item.getHasSubtypes()) { + j = meta; + } + ItemStack itemstack = new ItemStack(item, 1, j); + /// createStackedBlock /// + + if(itemstack != null) { + items.add(itemstack); + } + + ForgeEventFactory.fireBlockHarvesting(items, world, block, x, y, z, meta, 0, 1.0f, true, player); + for(ItemStack is : items) { + dropBlockAsItem(world, x, y, z, is); + } + } else { + //block.harvesters.set(player); + block.dropBlockAsItem(world, x, y, z, meta, fortune); + //block.harvesters.set(null); + } + } + + public default void dropBlockAsItem(World world, int x, int y, int z, ItemStack stack) { + if(!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops") && !world.restoringBlockSnapshots) { + /*if(captureDrops.get()) { + capturedDrops.get().add(stack); + return; + }*/ + float f = 0.7F; + double d0 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + double d1 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + double d2 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + EntityItem entityitem = new EntityItem(world, (double) x + d0, (double) y + d1, (double) z + d2, stack); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + } + } } diff --git a/src/main/java/com/hbm/items/tool/ItemTooling.java b/src/main/java/com/hbm/items/tool/ItemTooling.java index 8131a076a..f0c4119da 100644 --- a/src/main/java/com/hbm/items/tool/ItemTooling.java +++ b/src/main/java/com/hbm/items/tool/ItemTooling.java @@ -6,13 +6,12 @@ import api.hbm.block.IToolable; import api.hbm.block.IToolable.ToolType; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class ItemTooling extends ItemCraftingDegradation { - ToolType type; + protected ToolType type; public ItemTooling(ToolType type, int durability) { super(durability); diff --git a/src/main/java/com/hbm/items/tool/ItemToolingWeapon.java b/src/main/java/com/hbm/items/tool/ItemToolingWeapon.java new file mode 100644 index 000000000..58e5e2cd6 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemToolingWeapon.java @@ -0,0 +1,57 @@ +package com.hbm.items.tool; + +import com.google.common.collect.Multimap; +import com.hbm.items.ModItems; + +import api.hbm.block.IToolable.ToolType; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class ItemToolingWeapon extends ItemTooling { + + protected float damage = 0; + + public ItemToolingWeapon(ToolType type, int durability, float damage) { + super(type, durability); + this.damage = damage; + } + + @Override + public boolean hitEntity(ItemStack stack, EntityLivingBase entity, EntityLivingBase player) { + + World world = player.worldObj; + + if(this == ModItems.wrench) { + + Vec3 vec = player.getLookVec(); + + double dX = vec.xCoord * 0.5; + double dY = vec.yCoord * 0.5; + double dZ = vec.zCoord * 0.5; + + entity.motionX += dX; + entity.motionY += dY; + entity.motionZ += dZ; + world.playSoundAtEntity(entity, "random.anvil_land", 3.0F, 0.75F); + } + + return false; + } + + @Override + public Multimap getAttributeModifiers(ItemStack stack) { + + Multimap multimap = super.getAttributeModifiers(stack); + multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", damage, 0)); + + if(this == ModItems.wrench) { + multimap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Wrench modifier", -0.1, 1)); + } + + return multimap; + } +} diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 34aaffcb1..7734a8c20 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4312)"; + public static final String VERSION = "1.0.27 BETA (4327)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 87d1d7dde..d2bbe7c7e 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -340,7 +340,9 @@ public class ClientProxy extends ServerProxy { Object renderer = iterator.next(); if(renderer instanceof IItemRendererProvider) { IItemRendererProvider prov = (IItemRendererProvider) renderer; - MinecraftForgeClient.registerItemRenderer(prov.getItemForRenderer(), prov.getRenderer()); + for(Item item : prov.getItemsForRenderer()) { + MinecraftForgeClient.registerItemRenderer(item, prov.getRenderer()); + } } } diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 87b8ca254..34f8aea09 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -940,6 +940,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.crane_boxer), new Object[] { "WWW", "WPW", "CCC", 'W', KEY_PLANKS, 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'C', ModBlocks.conveyor }); addRecipeAuto(new ItemStack(ModBlocks.crane_unboxer), new Object[] { "WWW", "WPW", "CCC", 'W', KEY_STICK, 'P', Items.shears, 'C', ModBlocks.conveyor }); + addRecipeAuto(new ItemStack(ModBlocks.crane_router), new Object[] { "PIP", "ICI", "PIP", 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'I', ModItems.plate_polymer, 'C', ModItems.circuit_copper }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER1), new Object[] { ModItems.ingot_chainsteel, ASBESTOS.ingot(), ModItems.gem_alexandrite }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER1, 3), new Object[] { DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER2) }); @@ -947,7 +948,8 @@ public class CraftingManager { addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER2, 3), new Object[] { DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER3) }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER3), new Object[] { ModItems.ingot_chainsteel, ModItems.ingot_smore, ModItems.gem_alexandrite, ModItems.gem_alexandrite, ModItems.gem_alexandrite }); - addRecipeAuto(new ItemStack(ModItems.gear_large, 1), new Object[] { "III", "ICI", "III", 'I', IRON.plate(), 'C', CU.ingot()}); + addRecipeAuto(new ItemStack(ModItems.gear_large, 1, 0), new Object[] { "III", "ICI", "III", 'I', IRON.plate(), 'C', CU.ingot()}); + addRecipeAuto(new ItemStack(ModItems.gear_large, 1, 1), new Object[] { "III", "ICI", "III", 'I', STEEL.plate(), 'C', TI.ingot()}); addShapelessAuto(new ItemStack(ModItems.upgrade_5g), new Object[] { ModItems.upgrade_template, ModItems.gem_alexandrite }); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index f0d4128a2..9778ad070 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -382,6 +382,7 @@ public class ResourceManager { //Heat Engines public static final ResourceLocation stirling_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling.png"); + public static final ResourceLocation stirling_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling_steel.png"); //Furnaces public static final ResourceLocation furnace_iron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_iron.png"); diff --git a/src/main/java/com/hbm/module/ModulePatternMatcher.java b/src/main/java/com/hbm/module/ModulePatternMatcher.java index bde47b864..5a5d4e514 100644 --- a/src/main/java/com/hbm/module/ModulePatternMatcher.java +++ b/src/main/java/com/hbm/module/ModulePatternMatcher.java @@ -133,6 +133,8 @@ public class ModulePatternMatcher { for(int i = 0; i < modes.length; i++) { if(nbt.hasKey("mode" + i)) { modes[i] = nbt.getString("mode" + i); + } else { + modes[i] = null; } } } diff --git a/src/main/java/com/hbm/render/block/RenderConveyor.java b/src/main/java/com/hbm/render/block/RenderConveyor.java index 72922766a..c3f876c3c 100644 --- a/src/main/java/com/hbm/render/block/RenderConveyor.java +++ b/src/main/java/com/hbm/render/block/RenderConveyor.java @@ -23,27 +23,10 @@ public class RenderConveyor implements ISimpleBlockRenderingHandler { renderer.setRenderBounds( 0D, 0D, 0D, 1D, 0.25D, 1D); meta = 2; - - if(meta == 2) { - renderer.uvRotateTop = 3; - renderer.uvRotateBottom = 0; - renderer.uvRotateWest = 3; - } - if(meta == 3) { - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 3; - renderer.uvRotateEast = 3; - } - if(meta == 4) { - renderer.uvRotateTop = 1; - renderer.uvRotateBottom = 1; - renderer.uvRotateSouth = 3; - } - if(meta == 5) { - renderer.uvRotateTop = 2; - renderer.uvRotateBottom = 2; - renderer.uvRotateNorth = 3; - } + + renderer.uvRotateTop = 3; + renderer.uvRotateBottom = 0; + renderer.uvRotateWest = 3; tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); @@ -88,26 +71,31 @@ public class RenderConveyor implements ISimpleBlockRenderingHandler { tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); tessellator.setColorOpaque_F(1, 1, 1); + + boolean bent = meta > 5; + + if(meta > 9) meta -= 8; + if(meta > 5) meta -= 4; if(meta == 2) { renderer.uvRotateTop = 3; renderer.uvRotateBottom = 0; - renderer.uvRotateWest = 3; + if(!bent) renderer.uvRotateWest = 3; } if(meta == 3) { renderer.uvRotateTop = 0; renderer.uvRotateBottom = 3; - renderer.uvRotateEast = 3; + if(!bent) renderer.uvRotateEast = 3; } if(meta == 4) { renderer.uvRotateTop = 1; renderer.uvRotateBottom = 1; - renderer.uvRotateSouth = 3; + if(!bent) renderer.uvRotateSouth = 3; } if(meta == 5) { renderer.uvRotateTop = 2; renderer.uvRotateBottom = 2; - renderer.uvRotateNorth = 3; + if(!bent) renderer.uvRotateNorth = 3; } renderer.setRenderBounds((double) 0, 0.0D, (double) 0, (double) 1, 0.25D, (double) 1); diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderCog.java b/src/main/java/com/hbm/render/entity/projectile/RenderCog.java index bc2edc193..39e98038e 100644 --- a/src/main/java/com/hbm/render/entity/projectile/RenderCog.java +++ b/src/main/java/com/hbm/render/entity/projectile/RenderCog.java @@ -15,7 +15,7 @@ public class RenderCog extends Render { GL11.glPushMatrix(); GL11.glTranslated(x, y, z); - + int orientation = cog.getDataWatcher().getWatchableObjectInt(10); switch(orientation % 6) { case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; @@ -42,6 +42,11 @@ public class RenderCog extends Render { @Override protected ResourceLocation getEntityTexture(Entity entity) { - return ResourceManager.stirling_tex; + int meta = entity.getDataWatcher().getWatchableObjectInt(11); + + if(meta == 0) + return ResourceManager.stirling_tex; + else + return ResourceManager.stirling_steel_tex; } } diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index dab7c2a35..5a7d42d3a 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -1352,7 +1352,11 @@ public class ItemRenderLibrary { } public void renderCommonWithStack(ItemStack item) { GL11.glTranslated(0, 0, -0.875); - bindTexture(ResourceManager.stirling_tex); + + if(item.getItemDamage() == 0) + bindTexture(ResourceManager.stirling_tex); + else + bindTexture(ResourceManager.stirling_steel_tex); ResourceManager.stirling.renderPart("Cog"); }}); diff --git a/src/main/java/com/hbm/render/tileentity/IItemRendererProvider.java b/src/main/java/com/hbm/render/tileentity/IItemRendererProvider.java index f4fab219a..00396c683 100644 --- a/src/main/java/com/hbm/render/tileentity/IItemRendererProvider.java +++ b/src/main/java/com/hbm/render/tileentity/IItemRendererProvider.java @@ -6,5 +6,10 @@ import net.minecraftforge.client.IItemRenderer; public interface IItemRendererProvider { public Item getItemForRenderer(); + + public default Item[] getItemsForRenderer() { + return new Item[] { this.getItemForRenderer() }; + } + public IItemRenderer getRenderer(); } diff --git a/src/main/java/com/hbm/render/tileentity/RenderStirling.java b/src/main/java/com/hbm/render/tileentity/RenderStirling.java index c45420249..b241459e9 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderStirling.java +++ b/src/main/java/com/hbm/render/tileentity/RenderStirling.java @@ -33,14 +33,18 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe TileEntityStirling stirling = (TileEntityStirling) tile; float rot = stirling.lastSpin + (stirling.spin - stirling.lastSpin) * interp; - renderCommon(rot, stirling.hasCog); + renderCommon(rot, stirling.hasCog, stirling.getGeatMeta()); GL11.glPopMatrix(); } - private void renderCommon(float rot, boolean hasCog) { + private void renderCommon(float rot, boolean hasCog, int type) { - bindTexture(ResourceManager.stirling_tex); + if(type == 0) + bindTexture(ResourceManager.stirling_tex); + else + bindTexture(ResourceManager.stirling_steel_tex); + ResourceManager.stirling.renderPart("Base"); if(hasCog) { @@ -68,6 +72,14 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe return Item.getItemFromBlock(ModBlocks.machine_stirling); } + @Override + public Item[] getItemsForRenderer() { + return new Item[] { + Item.getItemFromBlock(ModBlocks.machine_stirling), + Item.getItemFromBlock(ModBlocks.machine_stirling_steel) + }; + } + @Override public IItemRenderer getRenderer() { return new ItemRenderBase( ) { @@ -78,7 +90,7 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe public void renderCommonWithStack(ItemStack item) { GL11.glRotatef(90, 0F, 1F, 0F); boolean cog = item.getItemDamage() != 1; - RenderStirling.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1F : 0, cog); + RenderStirling.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1F : 0, cog, item.getItem() == Item.getItemFromBlock(ModBlocks.machine_stirling) ? 0 : 1); }}; } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 9642a6399..c1c42a6fe 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -325,6 +325,7 @@ public class TileMappings { put(TileEntityCraneExtractor.class, "tileentity_extractor"); put(TileEntityCraneBoxer.class, "tileentity_boxer"); put(TileEntityCraneUnboxer.class, "tileentity_unboxer"); + put(TileEntityCraneRouter.class, "tileentity_router"); } private static void put(Class clazz, String... names) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java index 29578af85..46b71f6bc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityCog; import com.hbm.lib.Library; import com.hbm.tileentity.INBTPacketReceiver; @@ -42,7 +43,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack if(warnCooldown > 0) warnCooldown--; - if(heat > 300) { + if(heat > maxHeat()) { this.overspeed++; @@ -57,7 +58,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack int orientation = this.getBlockMetadata() - BlockDummyable.offset; ForgeDirection dir = ForgeDirection.getOrientation(orientation); - EntityCog cog = new EntityCog(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation); + EntityCog cog = new EntityCog(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation).setMeta(this.getGeatMeta()); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); cog.motionX = rot.offsetX; @@ -96,7 +97,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack this.heat = 0; } else { - float momentum = powerBuffer * 50F / 300F; + float momentum = powerBuffer * 50F / ((float) maxHeat()); this.lastSpin = this.spin; this.spin += momentum; @@ -108,6 +109,14 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack } } + public int getGeatMeta() { + return this.getBlockType() == ModBlocks.machine_stirling ? 0 : 1; + } + + public int maxHeat() { + return this.getBlockType() == ModBlocks.machine_stirling ? 300 : 1500; + } + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X), diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java new file mode 100644 index 000000000..68db57165 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java @@ -0,0 +1,129 @@ +package com.hbm.tileentity.network; + +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.container.ContainerCraneRouter; +import com.hbm.inventory.gui.GUICraneRouter; +import com.hbm.module.ModulePatternMatcher; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class TileEntityCraneRouter extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { + + public ModulePatternMatcher[] patterns = new ModulePatternMatcher[6]; //why did i make six matchers??? + public int[] modes = new int[6]; + public static final int MODE_NONE = 0; + public static final int MODE_WHITELIST = 1; + public static final int MODE_BLACKLIST = 2; + public static final int MODE_WILDCARD = 3; + + public TileEntityCraneRouter() { + super(5 * 6); + + for(int i = 0; i < patterns.length; i++) { + patterns[i] = new ModulePatternMatcher(5); + } + } + + @Override + public String getName() { + return "container.craneRouter"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + NBTTagCompound data = new NBTTagCompound(); + for(int i = 0; i < patterns.length; i++) { + NBTTagCompound compound = new NBTTagCompound(); + patterns[i].writeToNBT(compound); + data.setTag("pattern" + i, compound); + } + data.setIntArray("modes", this.modes); + this.networkPack(data, 15); + } + } + + @Override + public void networkUnpack(NBTTagCompound data) { + for(int i = 0; i < patterns.length; i++) { + NBTTagCompound compound = data.getCompoundTag("pattern" + i); + patterns[i].readFromNBT(compound); + } + this.modes = data.getIntArray("modes"); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerCraneRouter(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUICraneRouter(player.inventory, this); + } + + public void nextMode(int index) { + + int matcher = index / 5; + int mIndex = index % 5; + + this.patterns[matcher].nextMode(worldObj, slots[index], mIndex); + } + + public void initPattern(ItemStack stack, int index) { + + int matcher = index / 5; + int mIndex = index % 5; + + this.patterns[matcher].initPatternSmart(worldObj, stack, mIndex); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + for(int i = 0; i < patterns.length; i++) { + NBTTagCompound compound = nbt.getCompoundTag("pattern" + i); + patterns[i].readFromNBT(compound); + } + this.modes = nbt.getIntArray("modes"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + for(int i = 0; i < patterns.length; i++) { + NBTTagCompound compound = new NBTTagCompound(); + patterns[i].writeToNBT(compound); + nbt.setTag("pattern" + i, compound); + } + nbt.setIntArray("modes", this.modes); + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return Vec3.createVectorHelper(xCoord - player.posX, yCoord - player.posY, zCoord - player.posZ).lengthVector() < 20; + } + + @Override + public void receiveControl(NBTTagCompound data) { + int i = data.getInteger("toggle"); + modes[i]++; + if(modes[i] > 3) + modes [i] = 0; + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 098a6cc35..2f10c0958 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -233,8 +233,11 @@ container.bombMulti=Mehrzweckbombe container.centrifuge=Zentrifuge container.chemplant=Chemiewerk container.compactLauncher=Kompakt-Startrampe +container.craneBoxer=Förderband-Verpacker container.craneExtractor=Förderband-Auswerfer container.craneInserter=Förderband-Einsetzer +container.craneRouter=Förderband-Sortierer +container.craneUnboxer=Förderband-Entpacker container.crateDesh=Deshkiste container.crateIron=Eisenkiste container.crateSteel=Stahlkiste @@ -1454,6 +1457,7 @@ item.gas_mask_mono.name=Halbmaske item.gas_mask_olde.name=Ledergasmaske item.gas_petroleum.name=Petroleumgastank item.gear_large.name=Großes Zahnrad +item.gear_large_steel.name=Großes Stahlzahnrad item.geiger_counter.name=Mobiler Geigerzähler item.gem_alexandrite.name=Alexandrit item.gem_tantalium.name=Tantal-Polykristall @@ -3168,8 +3172,11 @@ tile.conveyor_double.name=Zweispuriges Förderband tile.conveyor_lift.name=Kettenaufzug tile.conveyor_triple.name=Dreispuriges Förderband tile.corium_block.name=Corium +tile.crane_boxer.name=Förderband-Verpacker tile.crane_extractor.name=Förderband-Auswerfer tile.crane_inserter.name=Förderband-Einsetzer +tile.crane_router.name=Förderband-Sortierer +tile.crane_unboxer.name=Förderband-Entpacker tile.crashed_bomb.name=Blindgänger tile.crate.name=Vorratskiste tile.crate_ammo.name=Sternenmetallkiste @@ -3462,6 +3469,8 @@ tile.machine_spp_bottom.name=NPE-Potentialgenerator (Unterteil) tile.machine_spp_top.name=NPE-Potentialgenerator (Oberteil) tile.machine_stirling.name=Stirlingmotor tile.machine_stirling.desc=Erzeugt Energie aus Wärme. Benötigt externe Hitzequelle.$Wärmestransferrate: T*0.1 TU/t$Maximalaufnahme: 300 TU/t$Effizienz: 50%% +tile.machine_stirling_steel.name=Schwerer Stirlingmotor +tile.machine_stirling_steel.desc=Erzeugt Energie aus Wärme. Benötigt externe Hitzequelle.$Verwendet ein schwereres Zahnrad und verträgt höhere Temparaturen.$Wärmestransferrate: T*0.1 TU/t$Maximalaufnahme: 1500 TU/t$Effizienz: 50%% tile.machine_storage_drum.name=Atommüll-Lagertrommel tile.machine_telelinker.name=Geschütz-Telemetrie-Manager tile.machine_teleporter.name=Teleporter diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index bbc9e0c21..8aa4b70a9 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -423,8 +423,11 @@ container.bombMulti=Multi Purpose Bomb container.centrifuge=Centrifuge container.chemplant=Chemical Plant container.compactLauncher=Compact Launch Pad +container.craneBoxer=Conveyor Boxer container.craneExtractor=Conveyor Ejector container.craneInserter=Conveyor Inserter +container.craneRouter=Conveyor Router +container.craneUnboxer=Conveyor Unboxer container.crateDesh=Desh Crate container.crateIron=Iron Crate container.crateSteel=Steel Crate @@ -1718,6 +1721,7 @@ item.gas_mask_mono.name=Half Mask item.gas_mask_olde.name=Leather Gas Mask item.gas_petroleum.name=Petroleum Gas Tank item.gear_large.name=Large Gear +item.gear_large_steel.name=Large Steel Gear item.geiger_counter.name=Handheld Geiger Counter item.gem_alexandrite.name=Alexandrite item.gem_tantalium.name=Tantalium Polycrystal @@ -3607,8 +3611,11 @@ tile.conveyor_double.name=Double-Lane Conveyor Belt tile.conveyor_lift.name=Conveyor Chain Lift tile.conveyor_triple.name=Triple-Lane Conveyor Belt tile.corium_block.name=Corium +tile.crane_boxer.name=Conveyor Boxer tile.crane_extractor.name=Conveyor Ejector tile.crane_inserter.name=Conveyor Inserter +tile.crane_router.name=Conveyor Sorter +tile.crane_unboxer.name=Conveyor Unboxer tile.crashed_bomb.name=Dud tile.crate.name=Supply Crate tile.crate_ammo.name=Starmetal Crate @@ -3904,6 +3911,8 @@ tile.machine_spp_bottom.name=ZPE Potential Generator (Bottom) tile.machine_spp_top.name=ZPE Potential Generator (Top) tile.machine_stirling.name=Stirling Engine tile.machine_stirling.desc=Turns heat into energy. Requires external heat source.$Heat transfer rate: T*0.1 TU/t$Max intake: 300 TU/t$Efficiency: 50%% +tile.machine_stirling_steel.name=Heavy Stirling Engine +tile.machine_stirling_steel.desc=Turns heat into energy. Requires external heat source.$Uses a much heavier gear to support higher temperatures.$Heat transfer rate: T*0.1 TU/t$Max intake: 1500 TU/t$Efficiency: 50%% tile.machine_storage_drum.name=Nuclear Waste Disposal Drum tile.machine_telelinker.name=Turret Telemetry Linker tile.machine_teleporter.name=Teleporter diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png.mcmeta new file mode 100644 index 000000000..df9cfce6e --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": { } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png new file mode 100644 index 0000000000000000000000000000000000000000..ae86f3266c8195116b1fea7836663d64cabc5bb7 GIT binary patch literal 681 zcmV;a0#^NrP)H`4;VKY9KnSs_gu^d8 z%s*VO*AxB%e_mS{V=&J%x~_v#3Qg0Xu4{MlJkNKztH7@UK(vxrQ~<1fP30|2vgI6;vN5Ji&O!)`+IVC>h_*3jSLQq_=aNcRmS&7`zL)CZJC55h5Qaak7l;}I1h#RRE-uH=0m41O9wA4ueVmlJf!w(< z%p*8eR2oR*CSVFaOv#c(DH%YJMnlu{`2XPuzyel8X59%7)?eGoUAcOJd&&L;B7#zi zAlK`4RDTf>0JPQ^W1=CIXZnjVhTX}%6cOsWW{N})lu{_ATAl<+-R|l!2ZyDOt|_Ic z>lzE}Dz|WV^7oD&JxIL(*j8@$AAf}X2{t0V`l~U9Gq90%qIL%M@DR>u4pJ{fgkV1# zg9SbohHZ7%2XpZCcg^0%`3xt6Ip}&Ygp&dXNjAww!R5j~r*>mZ^rYp%SPq78vS^xS zM+HAWedc<-a=YCq%aY66h41HvrfKNf*XuQPUGuAHcy<3^;=iPF&(EWMTS4KIJi8b8 zyK5*@dO)fdB4R%lhW*KvDyIjedZcrg%DFwERmMIlkBRf3y6+l1dDa6`J?7xB)U5@f zAHaA|u-2C(y{xYeBV`xp#kQducAjm~{InM~)^ zYQ^z*WW8PknK|g%wbl_QlUrKX{(|2H?q`58CjLPD0WxGSM8q27dOZxobx4mP6h1b{ zn+t;8nh&~1drnVi(fOa|19${WPEQytV@T{+5(lAd;ptou^oN!f5*6NM&j+a&K~gex z=YpVTLwN`%*>oPl$s{@}r8pjstX3<^vgCHV<>w&SyEvIm=YSK}P>gv%S@6KGez05q z(|l0)&9cVYKD`hT8{!RhhWwrop&aTw%y(un;b;I+yrLhxR^2DPy z&(~Mry`;cfP;SL=ZtDBrf221*)_&5HIf2bu@{0qj#%YcQl^Is+wxk^oKOuQpf%lt{ t#?lbaIdS|9&nlPcD6hRK9|93KtYAJA0%U-C?b(A#!@ytr`%dZ@Iccvq$*|JdnjWpl7N2m9@c5Wb%7 diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png new file mode 100644 index 0000000000000000000000000000000000000000..81857523b7183047aa74137897a30db524548e5c GIT binary patch literal 810 zcmV+_1J(SAP)Zv5V9|7{z~kyTYLeDUYkRJgmOGf55R#bIpOR!hs44HkLxN ze}WLK7Qs%z=9+CRE{7o3?O0p5)fusg&5>>_GRc~~$?jy=G{byFX1+J?y?Fy*M8s?} z0;We|3;?qj075%%nvZ*k2t5%oK@gDVIliOT8o~%>6ZYu%X{}L80hBxF)WU3nh?GA% zo5Q#Voj^;BQA!!5lp!%jL`@G|Ar{N0PXh2Zx$ilQLPGO{lp8OU_h z1ZicSj(ZSB$n`lI2!f#gnTV_hF-_C5=P5F)X`HX?%$+>Io^x<>xv}3?3|uGSJCIGI<06nFY>EZ=J5Rj&6P4CWruuAVi zdU|o2#%=R-a*N*HAks!N>`aAZo24F{OPa2APh4rKPO}(TCps z#j782mSrsN49OmUVDaDyS(dT*{N9V+1DTG{m4wHo>sG$+LvKh-iD(!tW!pi{1NG@q z(?BgyzGCVRhr_ri3a+lM5RvY3PERkq4Ybu%efxFR*f}4RobKiYP+zp$=L1Xc|Bw&5 zv|v>Upbt-KTk{7kjF$PpdV}8%>`E><59IpXnG33Unx<>%-9I=ui1+vRDT;#C(TCmx zeRxv-&ci^vcl|q{fUqIzX-m*DbrXOb&~VW`GD$z*jCPa%qEZ+&($2Y z-Sa^hna*Bdg$29h155Ai^TDjj2X`NC&IN1YZ?}BlqOv|bY0m{7@z*aO*aub>tYB$r zJLd!HTiJ0-dr?`g&r1nUN9AQ<=f3prXUEUt#zV`>7Cdifb#vJ?&@~S%r=|V-*w{wS oB@;aj)M;sazl;eZuYO&%zlNqVZh)fAP5=M^07*qoM6N<$f|`GeA^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png.mcmeta new file mode 100644 index 000000000..df9cfce6e --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": { } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png new file mode 100644 index 0000000000000000000000000000000000000000..148987fd227a1a0a0ffd7d54b84588a8b6e74200 GIT binary patch literal 763 zcmV5wTip z$SnY@mTpa#LGc8zq#3Mk5D}6jp(u*r^+-ejP)eb-CiZa^>qzVHoA`X}|v%R?v5D!+cm($u|b3RA! zRgl|1U#os&U(SDBDP={()=W&2r2gViuFcqEW6TmDd3vNQON=p?Z(kV7O{Y^fn+@i} z527omb7=;PiNj#57KlhiWr%B_M(hNo;(txs2u(POp>5Z5(n;Gi+ox-rzO6Wzww)k) z4Ak>I0PC|$WOqlX(7u$ks|WXga|?^fL7^QaQi#wVq;gH$*)`kwEoSzf?RJZKeZh8q zdstB1S*y8GVdGod>u7j8`<6~K_vSWIP%40%LL1%A^6D3x&4%f8%IWE8AO;KzZIq;S z;PS8hL7LU{1cEi8rg8{v|D!)>PG{eRp|a*Rp!Nrq9>n>Bu6BkXq3tJ+w^V5{TGhF zi`ZZLgF%O~cM*O*729&yX%L#zanM?`RuB+s}i6oaca2 tDqhmO&}yw&pIwf-aFk_;liV}8wF jzrLfxVCJIr&zj#IG3r{Twd)E$(1#43u6{1-oD!Mj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/wrench_archineer_hd.png b/src/main/resources/assets/hbm/textures/items/wrench_archineer_hd.png new file mode 100644 index 0000000000000000000000000000000000000000..958caa4ff6b70797d9e3d80dce22e879159702d0 GIT binary patch literal 517 zcmV+g0{Z=lP)A##AcAnk(kXP-Ayc64#m?d)IID}eii3YZhTum4d4rMJR0T)6bgwSyL@jmi?s|_ePfRu7<@`vh9EOL2!4Ge>iOD=MGg2-dVmVh~v zBo87FNMHv5g2?0L{vaN9O~F-LRs_uY0fZ0(5)aj#_~rf}4kC}^qkY`1ReJ(ziiHp< zCB;HGAYmqdjUH(=8-T@Apw52Tt@9;LSd-V(+9kb^D*0>lNYwa7O3B5=dB$o3Ww*{< zn8k4%zQl=cqSh|;Bv){-)PT7I#X`tknC0;Fj83Pcn}FZr31~Q2*a6?K#O6{3k;h)? zlbfqc9LLdMmD+^EoDHbt?$#=;W`j<5L#I>AH|qCbZh`)zXFk_yW+nmOuf*==G63zj z^_k%?!wx98$mS5)++1*&vH=qg@buiB3qF-V67Y!yl7depkR<$1fu!MM1=4_z6i5p` zR3J_GfI!;t9)U%`wZNj_0GUO?q3_QqZMYuauf+W?lxfWm4on~GXcp1k00000NkvXX Hu0mjfQugns literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 882779243..7b308e431 100755 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "hbm", "name": "Hbm's Nuclear Tech", "description": "A mod that adds weapons, nuclear themed stuff and machines", - "version":"1.0.27_X4312", + "version":"1.0.27_X4327", "mcversion": "1.7.10", "url": "", "updateUrl": "", From 8bbbe7340f012128a597918d852ce7dd2ee503d7 Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Mon, 15 Aug 2022 17:52:08 +0300 Subject: [PATCH 006/111] Updated ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index cf2010635..202e1b66f 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -337,6 +337,13 @@ rbmk.heat=Температура компонента: %s rbmk.boiler.water=Вода: %s / %s rbmk.boiler.steam=Пар: %s / %s rbmk.boiler.type=Сжатие: %s +rbmk.console.assign=Назначить стержни к экрану #%s +rbmk.console.none=Выкл. +rbmk.console.col_temp=Средняя температура стержня +rbmk.console.rod_extraction=Среднее извлечение регулирующих стержней +rbmk.console.fuel_depletion=Среднее топливное обеднение +rbmk.console.fuel_poison=Среднее ксеноновое отравление +rbmk.console.fuel_temp=Средняя температура топлива rbmk.control.level=%s rbmk.control.red=§cКрасная группа rbmk.control.yellow=§eЖёлтая группа @@ -348,6 +355,11 @@ rbmk.rod.depletion=Обеднение: %s rbmk.rod.xenon=Ксеноновое отравление: %s rbmk.rod.coreTemp=Температура стержня: %s rbmk.rod.skinTemp=Температура оболочки стержня: %s / %s +rbmk.screen.core=Core: %s +rbmk.screen.depletion=Depl: %s +rbmk.screen.rod=Control: %s +rbmk.screen.temp=Temp: %s +rbmk.screen.xenon=Xenon: %s hbm.key=NTM Hotkeys hbm.key.calculator=Калькулятор @@ -1598,6 +1610,12 @@ container.craneExtractor=Конвейерный извлекатель container.craneInserter=Конвейерный вставщик tile.crane_extractor.name=Конвейерный извлекатель tile.crane_inserter.name=Конвейерный вставщик +container.craneBoxer=Конвейерный упаковщик +container.craneRouter=Конвейерный сортировщик +container.craneUnboxer=Конвейерный распаковщик +tile.crane_boxer.name=Конвейерный упаковщик +tile.crane_router.name=Конвейерный сортировщик +tile.crane_unboxer.name=Конвейерный распаковщик tile.conveyor_chute.name=Конвейерный желоб tile.conveyor_double.name=Двухполосная конвейер tile.conveyor_lift.name=Конвейерный цепной лифт @@ -1612,6 +1630,8 @@ tile.heater_oilburner.name=Жидкостный бойлер tile.heater_oilburner.desc=Производит тепло, сжигая жидкое топливо. tile.machine_stirling.name=Генератор Стирлинга tile.machine_stirling.desc=Превращает тепло в энергию. Требует внешний источник тепла.$Скорость теплопередачи: T*0.1 TU/t$Максимальное потребление: 300 TU/t$Эффективность: 50%% +tile.machine_stirling_steel.name=Укреплённый генератор Стирлинга +tile.machine_stirling_steel.desc=Превращает тепло в энергию. Требует внешний источник тепла.$Использует более тяжёлую шестерню, чтобы выдерживать высокие температуры.$Скорость теплопередачи: T*0.1 TU/t$Максимальное потребление: 1500 TU/t$Эффективность: 50%% container.hadron=Ускоритель частиц tile.hadron_access.name=Терминал доступа ускорителя частиц @@ -3813,6 +3833,7 @@ item.generator_front.name=Перед генератора item.blade_tungsten.name=Усиленная вольфрамом лопасть item.turbine_tungsten.name=Усиленные лопасти турбовентилятора item.gear_large.name=Большая шестерня +item.gear_large_steel.name=Большая стальная шестерня item.combine_scrap.name=Металлолом Альянса item.chopper_head.name=Кабина Вертолета-охотника From 5977c27b7a65e1192515e1b73e6bbb8096dca4d5 Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Mon, 15 Aug 2022 17:57:36 +0300 Subject: [PATCH 007/111] Updated ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 202e1b66f..c6e8b4044 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -319,19 +319,19 @@ turret.off=OFF turret.on=ON turret.players=Target Players: %s -battery.mode.buffer=Input/Output Mode -battery.mode.input=Input Mode -battery.mode.off=OffW -battery.mode.output=Output Mode -battery.priority.high=Charge Priority: High -battery.priority.high.desc=Emergency buffers that$always need to be full -battery.priority.low=Charge Priority: Low -battery.priority.low.desc=Most use-cases where surplus$energy needs to be stored without$affecting machine performance -battery.priority.normal=Charge Priority: Normal -battery.priority.normal.desc=Smaller power grids where$priority doesn't matter -battery.priority.recommended=Recommended for: -battery.redstone.off=Redstone OFF -battery.redstone.on=Redstone ON +battery.mode.buffer=Буферный режим +battery.mode.input=Зарядка +battery.mode.off=Отключено +battery.mode.output=Разрядка +battery.priority.high=Приоритет: Высший +battery.priority.high.desc=Аварийные буферы, которые$всегда должны быть полными +battery.priority.low=Приоритет: Низкий +battery.priority.low.desc=Большинство случаев использования, когда$избыточная энергия должна храниться без$влияния на производительность машины +battery.priority.normal=Приоритет: Обычный +battery.priority.normal.desc=Небольшие электросети, где приоритет$не имеет значения +battery.priority.recommended=Рекомендуется для: +battery.redstone.off=Редстоун выключен +battery.redstone.on=Редстоун включен rbmk.heat=Температура компонента: %s rbmk.boiler.water=Вода: %s / %s From ea16e518dc6fabe2ea4a39b37732993e73e5f728 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 16 Aug 2022 11:28:34 +0200 Subject: [PATCH 008/111] rewrote the entire fluid trait system ow --- .../com/hbm/blocks/machine/MachineDiesel.java | 2 +- .../blocks/machine/MachineSeleniumEngine.java | 2 +- .../hbm/blocks/machine/MachineTurbofan.java | 2 +- .../com/hbm/inventory/fluid/FluidType.java | 75 ++++++-- .../java/com/hbm/inventory/fluid/Fluids.java | 174 +++++++++--------- .../FT_Combustible.java} | 13 +- .../inventory/fluid/trait/FT_Corrosive.java | 32 ++++ .../inventory/fluid/trait/FT_Flammable.java | 15 ++ .../FT_VentRadiation.java} | 13 +- .../hbm/inventory/fluid/trait/FluidTrait.java | 17 ++ .../fluid/trait/FluidTraitSimple.java | 44 +++++ .../hbm/inventory/fluid/types/Antimatter.java | 12 -- .../inventory/fluid/types/CombustibleGas.java | 11 -- .../inventory/fluid/types/FlammableGas.java | 11 -- .../fluid/types/FlammableOilGas.java | 11 -- .../fluid/types/FluidTypeFlammable.java | 39 ---- .../com/hbm/inventory/fluid/types/Fuel.java | 11 -- .../com/hbm/inventory/fluid/types/Gas.java | 12 -- .../com/hbm/inventory/fluid/types/Oil.java | 11 -- .../inventory/fluid/types/Petrochemical.java | 12 -- .../inventory/fluid/types/RadioactiveGas.java | 11 -- .../fluid/types/RadioactiveLiquid.java | 11 -- .../hbm/inventory/gui/GUIMachineGasFlare.java | 4 +- .../com/hbm/inventory/gui/GUIOilburner.java | 8 +- .../machine/TileEntityHeaterOilburner.java | 6 +- .../machine/TileEntityMachineDiesel.java | 8 +- .../machine/TileEntityMachineIGenerator.java | 4 +- .../TileEntityMachineSeleniumEngine.java | 8 +- .../machine/TileEntityMachineTurbofan.java | 8 +- .../oil/TileEntityMachineGasFlare.java | 19 +- .../machine/storage/TileEntityBarrel.java | 4 +- .../storage/TileEntityMachineFluidTank.java | 4 +- 32 files changed, 306 insertions(+), 308 deletions(-) rename src/main/java/com/hbm/inventory/fluid/{types/FluidTypeCombustible.java => trait/FT_Combustible.java} (73%) create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java rename src/main/java/com/hbm/inventory/fluid/{types/RadioactiveFluid.java => trait/FT_VentRadiation.java} (50%) create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/Antimatter.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/CombustibleGas.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/FlammableGas.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/FlammableOilGas.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/FluidTypeFlammable.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/Fuel.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/Gas.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/Oil.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/Petrochemical.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/RadioactiveGas.java delete mode 100644 src/main/java/com/hbm/inventory/fluid/types/RadioactiveLiquid.java diff --git a/src/main/java/com/hbm/blocks/machine/MachineDiesel.java b/src/main/java/com/hbm/blocks/machine/MachineDiesel.java index ecc409fa8..a08b4b6d1 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineDiesel.java +++ b/src/main/java/com/hbm/blocks/machine/MachineDiesel.java @@ -5,7 +5,7 @@ import java.util.Random; import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineDiesel; diff --git a/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java b/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java index 54fab6acb..d7191f58b 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java @@ -5,7 +5,7 @@ import java.util.Random; import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineSeleniumEngine; diff --git a/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java b/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java index c7da8fe6c..f84d206df 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java @@ -7,7 +7,7 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandler; import com.hbm.interfaces.IMultiblock; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityDummy; diff --git a/src/main/java/com/hbm/inventory/fluid/FluidType.java b/src/main/java/com/hbm/inventory/fluid/FluidType.java index f56402f22..d206d5271 100644 --- a/src/main/java/com/hbm/inventory/fluid/FluidType.java +++ b/src/main/java/com/hbm/inventory/fluid/FluidType.java @@ -2,14 +2,23 @@ package com.hbm.inventory.fluid; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map.Entry; + +import org.lwjgl.input.Keyboard; + import java.util.Set; import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.trait.*; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.*; import com.hbm.lib.RefStrings; import com.hbm.render.util.EnumSymbol; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; @@ -37,6 +46,7 @@ public class FluidType { public static final double DEFAULT_HEATCAP = 0.01D; public static final double DEFAULT_COMPRESSION = 1D; + // v v v this entire system is a pain in the ass to work with. i'd much rather define state transitions and heat values manually. /** How hot this fluid is. Simple enough. */ public int temperature = ROOM_TEMPERATURE; /** How much heat energy each mB requires to be heated by 1°C. Total heat energy = heatCap * delta-T. */ @@ -45,7 +55,8 @@ public class FluidType { public double compression = DEFAULT_COMPRESSION; public Set containers = new HashSet(); - public List traits = new ArrayList(); + private HashMap, FluidTrait> traits = new HashMap(); + //public List enumTraits = new ArrayList(); private ResourceLocation texture; @@ -91,9 +102,22 @@ public class FluidType { return this; } - public FluidType addTraits(FluidTrait... traits) { - Collections.addAll(this.traits, traits); + /*public FluidType addTraits(EnumFluidTrait... traits) { + Collections.addAll(this.enumTraits, traits); return this; + }*/ + + public FluidType addTraits(FluidTrait... traits) { + for(FluidTrait trait : traits) this.traits.put(trait.getClass(), trait); + return this; + } + + public boolean hasTrait(Class trait) { + return this.traits.containsKey(trait); + } + + public T getTrait(Class trait) { //generics, yeah! + return (T) this.traits.get(trait); } public int getID() { @@ -125,19 +149,19 @@ public class FluidType { return this.temperature >= 100; } public boolean isCorrosive() { - return this.traits.contains(FluidTrait.CORROSIVE) || this.traits.contains(FluidTrait.CORROSIVE_2); + return this.traits.containsKey(FT_Corrosive.class); } public boolean isAntimatter() { - return this.traits.contains(FluidTrait.AMAT); + return this.traits.containsKey(FT_Amat.class); } public boolean hasNoContainer() { - return this.traits.contains(FluidTrait.NO_CONTAINER); + return this.traits.containsKey(FT_NoContainer.class); } public boolean hasNoID() { - return this.traits.contains(FluidTrait.NO_ID); + return this.traits.containsKey(FT_NoID.class); } public boolean needsLeadContainer() { - return this.traits.contains(FluidTrait.LEAD_CONTAINER); + return this.traits.containsKey(FT_LeadContainer.class); } /** @@ -165,19 +189,39 @@ public class FluidType { public void onFluidRelease(World world, int x, int y, int z, FluidTank tank, int overflowAmount) { } //public void onFluidTransmit(FluidNetwork net) { } + @SideOnly(Side.CLIENT) public void addInfo(List info) { if(temperature != ROOM_TEMPERATURE) { if(temperature < 0) info.add(EnumChatFormatting.BLUE + "" + temperature + "°C"); if(temperature > 0) info.add(EnumChatFormatting.RED + "" + temperature + "°C"); } - if(isAntimatter()) info.add(EnumChatFormatting.DARK_RED + "Antimatter"); + /*if(isAntimatter()) info.add(EnumChatFormatting.DARK_RED + "Antimatter"); - if(traits.contains(FluidTrait.CORROSIVE_2)) info.add(EnumChatFormatting.GOLD + "Strongly Corrosive"); - else if(traits.contains(FluidTrait.CORROSIVE)) info.add(EnumChatFormatting.YELLOW + "Corrosive"); + if(enumTraits.contains(EnumFluidTrait.CORROSIVE_2)) info.add(EnumChatFormatting.GOLD + "Strongly Corrosive"); + else if(enumTraits.contains(EnumFluidTrait.CORROSIVE)) info.add(EnumChatFormatting.YELLOW + "Corrosive"); - if(traits.contains(FluidTrait.NO_CONTAINER)) info.add(EnumChatFormatting.RED + "Cannot be stored in any universal tank"); - if(traits.contains(FluidTrait.LEAD_CONTAINER)) info.add(EnumChatFormatting.YELLOW + "Requires hazardous material tank to hold"); + if(enumTraits.contains(EnumFluidTrait.NO_CONTAINER)) info.add(EnumChatFormatting.RED + "Cannot be stored in any universal tank"); + if(enumTraits.contains(EnumFluidTrait.LEAD_CONTAINER)) info.add(EnumChatFormatting.YELLOW + "Requires hazardous material tank to hold");*/ + + List hidden = new ArrayList(); + + for(Entry, FluidTrait> entry : this.traits.entrySet()) { + entry.getValue().addInfo(info); + entry.getValue().addInfoHidden(hidden); + } + + if(!hidden.isEmpty()) { + + if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { + info.addAll(hidden); + } else { + + info.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC +"Hold <" + + EnumChatFormatting.YELLOW + "" + EnumChatFormatting.ITALIC + "LSHIFT" + + EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC + "> to display more info"); + } + } /*info.add(""); info.add(EnumChatFormatting.RED + "[DEBUG]"); @@ -190,7 +234,8 @@ public class FluidType { /** * Metadata for describing how the fluid acts, like being corrosive, not having fluid IDs or being only stored in certain containers. */ - public static enum FluidTrait { + /*@Deprecated + public static enum EnumFluidTrait { LIQUID, GASEOUS, PETROCHEMICAL, @@ -200,7 +245,7 @@ public class FluidType { NO_CONTAINER, LEAD_CONTAINER, NO_ID; - } + }*/ public static enum ExtContainer { CANISTER diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 7592f4a0e..810df8eba 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -5,9 +5,9 @@ import java.util.HashMap; import java.util.List; import com.hbm.inventory.fluid.FluidType.ExtContainer; -import com.hbm.inventory.fluid.FluidType.FluidTrait; -import com.hbm.inventory.fluid.types.*; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.*; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.*; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.render.util.EnumSymbol; public class Fluids { @@ -95,6 +95,16 @@ public class Fluids { private static final HashMap idMapping = new HashMap(); private static final HashMap nameMapping = new HashMap(); protected static final List metaOrder = new ArrayList(); + + public static final FT_Liquid LIQUID = new FT_Liquid(); + public static final FT_Gaseous_ART EVAP = new FT_Gaseous_ART(); + public static final FT_Gaseous GASEOUS = new FT_Gaseous(); + public static final FT_Plasma PLASMA = new FT_Plasma(); + public static final FT_Amat ANTI = new FT_Amat(); + public static final FT_LeadContainer LEADCON = new FT_LeadContainer(); + public static final FT_NoContainer NOCON = new FT_NoContainer(); + public static final FT_NoID NOID = new FT_NoID(); + public static final FT_Delicious DELICIOUS = new FT_Delicious(); public static void init() { @@ -111,85 +121,85 @@ public class Fluids { * You may screw with metaOrder as much as you like, as long as you keep all fluids in the list exactly once. */ - NONE = new FluidType( "NONE", 0x888888, 0, 0, 0, EnumSymbol.NONE); - WATER = new FluidType( "WATER", 0x3333FF, 0, 0, 0, EnumSymbol.NONE); - STEAM = new Gas( "STEAM", 0xe5e5e5, 3, 0, 0, EnumSymbol.NONE).setTemp(100).setCompression(0.01D); - HOTSTEAM = new Gas( "HOTSTEAM", 0xE7D6D6, 4, 0, 0, EnumSymbol.NONE).setTemp(300).setCompression(0.1D); - SUPERHOTSTEAM = new Gas( "SUPERHOTSTEAM", 0xE7B7B7, 4, 0, 0, EnumSymbol.NONE).setTemp(450).setCompression(1D); - ULTRAHOTSTEAM = new Gas( "ULTRAHOTSTEAM", 0xE39393, 4, 0, 0, EnumSymbol.NONE).setTemp(600).setCompression(10D); - COOLANT = new FluidType( "COOLANT", 0xd8fcff, 1, 0, 0, EnumSymbol.NONE).setHeatCap(0.25D); - LAVA = new FluidType( "LAVA", 0xFF3300, 4, 0, 0, EnumSymbol.NOWATER).setTemp(1200); - DEUTERIUM = new CombustibleGas( "DEUTERIUM", 0x0000FF, 3, 4, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 10_000).setHeatEnergy(5_000); - TRITIUM = new CombustibleGas( "TRITIUM", 0x000099, 3, 4, 0, EnumSymbol.RADIATION).setCombustionEnergy(FuelGrade.HIGH, 10_000).setHeatEnergy(5_000); - OIL = new Oil( "OIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER); - HOTOIL = new Oil( "HOTOIL", 0x300900, 2, 3, 0, EnumSymbol.NONE).setTemp(350); - HEAVYOIL = new Oil( "HEAVYOIL", 0x141312, 2, 1, 0, EnumSymbol.NONE).addContainers(0x513F39, ExtContainer.CANISTER); - BITUMEN = new Petrochemical( "BITUMEN", 0x1f2426, 2, 0, 0, EnumSymbol.NONE).addContainers(0x5A5877, ExtContainer.CANISTER); - SMEAR = new Oil( "SMEAR", 0x190f01, 2, 1, 0, EnumSymbol.NONE).setHeatEnergy(50_000).addContainers(0x624F3B, ExtContainer.CANISTER); - HEATINGOIL = new Fuel( "HEATINGOIL", 0x211806, 2, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.LOW, 100_000).setHeatEnergy(150_000).addContainers(0x694235, ExtContainer.CANISTER); - RECLAIMED = new Fuel( "RECLAIMED", 0x332b22, 2, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.LOW, 200_000).setHeatEnergy(100_000).addContainers(0xF65723, ExtContainer.CANISTER); - PETROIL = new Fuel( "PETROIL", 0x44413d, 1, 3, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 300_000).setHeatEnergy(125_000).addContainers(0x2369F6, ExtContainer.CANISTER); - LUBRICANT = new Petrochemical( "LUBRICANT", 0x606060, 2, 1, 0, EnumSymbol.NONE).addContainers(0xF1CC05, ExtContainer.CANISTER); - NAPHTHA = new Oil( "NAPHTHA", 0x595744, 2, 1, 0, EnumSymbol.NONE).addContainers(0x5F6D44, ExtContainer.CANISTER); - DIESEL = new Fuel( "DIESEL", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 500_000).setHeatEnergy(200_000).addContainers(0xFF2C2C, ExtContainer.CANISTER); - LIGHTOIL = new Oil( "LIGHTOIL", 0x8c7451, 1, 2, 0, EnumSymbol.NONE).addContainers(0xB46B52, ExtContainer.CANISTER); - KEROSENE = new Fuel( "KEROSENE", 0xffa5d2, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.AERO, 1_250_000).setHeatEnergy(300_000).addContainers(0xFF377D, ExtContainer.CANISTER); - GAS = new FlammableOilGas( "GAS", 0xfffeed, 1, 4, 1, EnumSymbol.NONE).setHeatEnergy(10_000); - PETROLEUM = new FlammableOilGas( "PETROLEUM", 0x7cb7c9, 1, 4, 1, EnumSymbol.NONE).setHeatEnergy(25_000); - LPG = new Fuel( "LPG", 0x4747EA, 1, 3, 1, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 450_000).setHeatEnergy(200_000); - BIOGAS = new FlammableOilGas( "BIOGAS", 0xbfd37c, 1, 4, 1, EnumSymbol.NONE).setHeatEnergy(25_000); - BIOFUEL = new Fuel( "BIOFUEL", 0xeef274, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 400_000).setHeatEnergy(150_000).addContainers(0x9EB623, ExtContainer.CANISTER); - NITAN = new Fuel( "NITAN", 0x8018ad, 2, 4, 1, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 5_000_000).setHeatEnergy(2_000_000).addContainers(0x6B238C, ExtContainer.CANISTER); - UF6 = new RadioactiveGas( "UF6", 0xD1CEBE, 4, 0, 2, EnumSymbol.RADIATION).addTraits(FluidTrait.CORROSIVE); - PUF6 = new RadioactiveGas( "PUF6", 0x4C4C4C, 4, 0, 4, EnumSymbol.RADIATION).addTraits(FluidTrait.CORROSIVE); - SAS3 = new FluidType( "SAS3", 0x4ffffc, 5, 0, 4, EnumSymbol.RADIATION).addTraits(FluidTrait.CORROSIVE); - SCHRABIDIC = new FluidType( "SCHRABIDIC", 0x006B6B, 5, 0, 5, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE_2); - AMAT = new Antimatter( "AMAT", 0x010101, 5, 0, 5, EnumSymbol.ANTIMATTER); - ASCHRAB = new Antimatter( "ASCHRAB", 0xb50000, 5, 0, 5, EnumSymbol.ANTIMATTER); - ACID = new FluidType( "ACID", 0xfff7aa, 3, 0, 3, EnumSymbol.OXIDIZER).addTraits(FluidTrait.CORROSIVE); - WATZ = new FluidType( "WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE_2); - CRYOGEL = new FluidType( "CRYOGEL", 0x32ffff, 2, 0, 0, EnumSymbol.CROYGENIC).setTemp(-170); - HYDROGEN = new FluidTypeCombustible( "HYDROGEN", 0x4286f4, 3, 4, 0, EnumSymbol.CROYGENIC).setCombustionEnergy(FuelGrade.HIGH, 10_000).setHeatEnergy(5_000).addTraits(FluidTrait.LIQUID); - OXYGEN = new FluidType( "OXYGEN", 0x98bdf9, 3, 0, 0, EnumSymbol.CROYGENIC); - XENON = new Gas( "XENON", 0xba45e8, 0, 0, 0, EnumSymbol.ASPHYXIANT); - BALEFIRE = new FluidType( "BALEFIRE", 0x28e02e, 4, 4, 3, EnumSymbol.RADIATION).setTemp(1500).addTraits(FluidTrait.CORROSIVE); - MERCURY = new FluidType( "MERCURY", 0x808080, 2, 0, 0, EnumSymbol.NONE); - PAIN = new FluidType( "PAIN", 0x938541, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(FluidTrait.CORROSIVE); - WASTEFLUID = new RadioactiveLiquid( "WASTEFLUID", 0x544400, 2, 0, 1, EnumSymbol.RADIATION).setRadiation(0.5F).addTraits(FluidTrait.NO_CONTAINER); - WASTEGAS = new RadioactiveGas( "WASTEGAS", 0xB8B8B8, 2, 0, 1, EnumSymbol.RADIATION).setRadiation(0.5F).addTraits(FluidTrait.NO_CONTAINER); - GASOLINE = new Fuel( "GASOLINE", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 1_000_000).setHeatEnergy(400_000).addContainers(0x2F7747, ExtContainer.CANISTER); - COALGAS = new Fuel( "COALGAS", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 150_000).setHeatEnergy(75_000).addContainers(0x2E155F, ExtContainer.CANISTER); - SPENTSTEAM = new Gas( "SPENTSTEAM", 0x445772, 2, 0, 0, EnumSymbol.NONE).addTraits(FluidTrait.NO_CONTAINER).setCompression(1D); - FRACKSOL = new Petrochemical( "FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE).addContainers(0x4F887F, ExtContainer.CANISTER); - PLASMA_DT = new FluidType( "PLASMA_DT", 0xF7AFDE, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3250).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - PLASMA_HD = new FluidType( "PLASMA_HD", 0xF0ADF4, 0, 4, 0, EnumSymbol.RADIATION).setTemp(2500).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - PLASMA_HT = new FluidType( "PLASMA_HT", 0xD1ABF2, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3000).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - PLASMA_XM = new FluidType( "PLASMA_XM", 0xC6A5FF, 0, 4, 1, EnumSymbol.RADIATION).setTemp(4250).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - PLASMA_BF = new FluidType( "PLASMA_BF", 0xA7F1A3, 4, 5, 4, EnumSymbol.ANTIMATTER).setTemp(8500).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - CARBONDIOXIDE = new Gas( "CARBONDIOXIDE", 0x404040, 3, 0, 0, EnumSymbol.ASPHYXIANT); - PLASMA_DH3 = new FluidType( "PLASMA_DH3", 0xFF83AA, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3480).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - HELIUM3 = new Gas( "HELIUM3", 0xFCF0C4, 3, 4, 0, EnumSymbol.ASPHYXIANT); - DEATH = new FluidType( "DEATH", 0x717A88, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(FluidTrait.CORROSIVE_2, FluidTrait.LEAD_CONTAINER); - ETHANOL = new Fuel( "ETHANOL", 0xe0ffff, 2, 3, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 200_000).setHeatEnergy(75_000).addContainers(0xEAFFF3, ExtContainer.CANISTER); - HEAVYWATER = new FluidType( "HEAVYWATER", 0x00a0b0, 1, 0, 0, EnumSymbol.NONE); - CRACKOIL = new Oil( "CRACKOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE); - COALOIL = new Oil( "COALOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE); - HOTCRACKOIL = new Oil( "HOTCRACKOIL", 0x300900, 2, 3, 0, EnumSymbol.NONE).setTemp(350); - NAPHTHA_CRACK = new Oil( "NAPHTHA_CRACK", 0x595744, 2, 1, 0, EnumSymbol.NONE); - LIGHTOIL_CRACK = new Oil( "LIGHTOIL_CRACK", 0x8c7451, 1, 2, 0, EnumSymbol.NONE); - DIESEL_CRACK = new Fuel( "DIESEL_CRACK", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 450_000).setHeatEnergy(200_000); - AROMATICS = new Oil( "AROMATICS", 0x68A09A, 1, 4, 1, EnumSymbol.NONE); - UNSATURATEDS = new Oil( "UNSATURATEDS", 0x628FAE, 1, 4, 1, EnumSymbol.NONE); - SALIENT = new FluidType( "SALIENT", 0x457F2D, 0, 0, 0, EnumSymbol.NONE); - XPJUICE = new FluidType( "XPJUICE", 0xBBFF09, 0, 0, 0, EnumSymbol.NONE); - ENDERJUICE = new FluidType( "ENDERJUICE", 0x127766, 0, 0, 0, EnumSymbol.NONE); - PETROIL_LEADED = new Fuel( "PETROIL_LEADED", 0x44413d, 1, 3, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 450_000).setHeatEnergy(((FluidTypeFlammable)PETROIL).getHeatEnergy()).addContainers(0x2331F6, ExtContainer.CANISTER); - GASOLINE_LEADED = new Fuel( "GASOLINE_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 1_500_000).setHeatEnergy(((FluidTypeFlammable)GASOLINE).getHeatEnergy()).addContainers(0x2F775A, ExtContainer.CANISTER); - COALGAS_LEADED = new Fuel( "COALGAS_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 250_000).setHeatEnergy(((FluidTypeFlammable)COALGAS).getHeatEnergy()).addContainers(0x1E155F, ExtContainer.CANISTER); - SULFURIC_ACID = new FluidType( "SULFURIC_ACID", 0xB0AA64, 3, 0, 2, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE); - COOLANT_HOT = new FluidType( "COOLANT_HOT", 0x99525E, 1, 0, 0, EnumSymbol.NONE).setTemp(600).setHeatCap(COOLANT.heatCap); - MUG = new FluidType( "MUG", 0x4B2D28, 0, 0, 0, EnumSymbol.NONE).setHeatCap(1D); - MUG_HOT = new FluidType(78, "MUG_HOT", 0x6B2A20, 0, 0, 0, EnumSymbol.NONE).setHeatCap(MUG.heatCap).setTemp(500); + NONE = new FluidType("NONE", 0x888888, 0, 0, 0, EnumSymbol.NONE); + WATER = new FluidType("WATER", 0x3333FF, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); + STEAM = new FluidType("STEAM", 0xe5e5e5, 3, 0, 0, EnumSymbol.NONE).setTemp(100).setCompression(0.01D).addTraits(GASEOUS); + HOTSTEAM = new FluidType("HOTSTEAM", 0xE7D6D6, 4, 0, 0, EnumSymbol.NONE).setTemp(300).setCompression(0.1D).addTraits(GASEOUS); + SUPERHOTSTEAM = new FluidType("SUPERHOTSTEAM", 0xE7B7B7, 4, 0, 0, EnumSymbol.NONE).setTemp(450).setCompression(1D).addTraits(GASEOUS); + ULTRAHOTSTEAM = new FluidType("ULTRAHOTSTEAM", 0xE39393, 4, 0, 0, EnumSymbol.NONE).setTemp(600).setCompression(10D).addTraits(GASEOUS); + COOLANT = new FluidType("COOLANT", 0xd8fcff, 1, 0, 0, EnumSymbol.NONE).setHeatCap(0.25D).addTraits(LIQUID); + LAVA = new FluidType("LAVA", 0xFF3300, 4, 0, 0, EnumSymbol.NOWATER).setTemp(1200).addTraits(LIQUID); + DEUTERIUM = new FluidType("DEUTERIUM", 0x0000FF, 3, 4, 0, EnumSymbol.NONE).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), GASEOUS); + TRITIUM = new FluidType("TRITIUM", 0x000099, 3, 4, 0, EnumSymbol.RADIATION).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), GASEOUS, new FT_VentRadiation(0.001F)); + OIL = new FluidType("OIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); + HOTOIL = new FluidType("HOTOIL", 0x300900, 2, 3, 0, EnumSymbol.NONE).setTemp(350).addTraits(new FT_Flammable(10_000), LIQUID); + HEAVYOIL = new FluidType("HEAVYOIL", 0x141312, 2, 1, 0, EnumSymbol.NONE).addContainers(0x513F39, ExtContainer.CANISTER).addTraits(new FT_Flammable(50_000), new FT_Combustible(FuelGrade.LOW, 25_000), LIQUID); + BITUMEN = new FluidType("BITUMEN", 0x1f2426, 2, 0, 0, EnumSymbol.NONE).addContainers(0x5A5877, ExtContainer.CANISTER).addTraits(LIQUID); + SMEAR = new FluidType("SMEAR", 0x190f01, 2, 1, 0, EnumSymbol.NONE).addContainers(0x624F3B, ExtContainer.CANISTER).addTraits(new FT_Flammable(50_000), LIQUID); + HEATINGOIL = new FluidType("HEATINGOIL", 0x211806, 2, 2, 0, EnumSymbol.NONE).addContainers(0x694235, ExtContainer.CANISTER).addTraits(new FT_Flammable(150_000), new FT_Combustible(FuelGrade.LOW, 100_000), LIQUID); + RECLAIMED = new FluidType("RECLAIMED", 0x332b22, 2, 2, 0, EnumSymbol.NONE).addContainers(0xF65723, ExtContainer.CANISTER).addTraits(new FT_Flammable(100_000), new FT_Combustible(FuelGrade.LOW, 200_000), LIQUID); + PETROIL = new FluidType("PETROIL", 0x44413d, 1, 3, 0, EnumSymbol.NONE).addContainers(0x2369F6, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 300_000), LIQUID); + LUBRICANT = new FluidType("LUBRICANT", 0x606060, 2, 1, 0, EnumSymbol.NONE).addContainers(0xF1CC05, ExtContainer.CANISTER).addTraits(LIQUID); + NAPHTHA = new FluidType("NAPHTHA", 0x595744, 2, 1, 0, EnumSymbol.NONE).addContainers(0x5F6D44, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 200_000), LIQUID); + DIESEL = new FluidType("DIESEL", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF2C2C, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.HIGH, 500_000), LIQUID); + LIGHTOIL = new FluidType("LIGHTOIL", 0x8c7451, 1, 2, 0, EnumSymbol.NONE).addContainers(0xB46B52, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.MEDIUM, 500_000), LIQUID); + KEROSENE = new FluidType("KEROSENE", 0xffa5d2, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF377D, ExtContainer.CANISTER).addTraits(new FT_Flammable(300_000), new FT_Combustible(FuelGrade.AERO, 1_250_000)); + GAS = new FluidType("GAS", 0xfffeed, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(10_000), GASEOUS); + PETROLEUM = new FluidType("PETROLEUM", 0x7cb7c9, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(25_000), GASEOUS); + LPG = new FluidType("LPG", 0x4747EA, 1, 3, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.HIGH, 400_000), LIQUID); + BIOGAS = new FluidType("BIOGAS", 0xbfd37c, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(25_000), GASEOUS); + BIOFUEL = new FluidType("BIOFUEL", 0xeef274, 1, 2, 0, EnumSymbol.NONE).addContainers(0x9EB623, ExtContainer.CANISTER).addTraits(new FT_Flammable(150_000), new FT_Combustible(FuelGrade.HIGH, 400_000), LIQUID); + NITAN = new FluidType("NITAN", 0x8018ad, 2, 4, 1, EnumSymbol.NONE).addContainers(0x6B238C, ExtContainer.CANISTER).addTraits(new FT_Flammable(2_000_000), new FT_Combustible(FuelGrade.HIGH, 5_000_000), LIQUID); + UF6 = new FluidType("UF6", 0xD1CEBE, 4, 0, 2, EnumSymbol.RADIATION).addTraits(new FT_Corrosive(15), GASEOUS); + PUF6 = new FluidType("PUF6", 0x4C4C4C, 4, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_Corrosive(15), GASEOUS); + SAS3 = new FluidType("SAS3", 0x4ffffc, 5, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_Corrosive(30), LIQUID); + SCHRABIDIC = new FluidType("SCHRABIDIC", 0x006B6B, 5, 0, 5, EnumSymbol.ACID).addTraits(new FT_Corrosive(75), LIQUID); + AMAT = new FluidType("AMAT", 0x010101, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); + ASCHRAB = new FluidType("ASCHRAB", 0xb50000, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); + ACID = new FluidType("ACID", 0xfff7aa, 3, 0, 3, EnumSymbol.OXIDIZER).addTraits(new FT_Corrosive(40), LIQUID); + WATZ = new FluidType("WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(60), LIQUID); + CRYOGEL = new FluidType("CRYOGEL", 0x32ffff, 2, 0, 0, EnumSymbol.CROYGENIC).setTemp(-170).addTraits(LIQUID); + HYDROGEN = new FluidType("HYDROGEN", 0x4286f4, 3, 4, 0, EnumSymbol.CROYGENIC).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), LIQUID, EVAP); + OXYGEN = new FluidType("OXYGEN", 0x98bdf9, 3, 0, 0, EnumSymbol.CROYGENIC).addTraits(LIQUID, EVAP); + XENON = new FluidType("XENON", 0xba45e8, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + BALEFIRE = new FluidType("BALEFIRE", 0x28e02e, 4, 4, 3, EnumSymbol.RADIATION).setTemp(1500).addTraits(new FT_Corrosive(50), new FT_Flammable(1_000_000), new FT_Combustible(FuelGrade.HIGH, 2_500_000), LIQUID); + MERCURY = new FluidType("MERCURY", 0x808080, 2, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); + PAIN = new FluidType("PAIN", 0x938541, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(30)); + WASTEFLUID = new FluidType("WASTEFLUID", 0x544400, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON); + WASTEGAS = new FluidType("WASTEGAS", 0xB8B8B8, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON); + GASOLINE = new FluidType("GASOLINE", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2F7747, ExtContainer.CANISTER).addTraits(new FT_Flammable(400_000), new FT_Combustible(FuelGrade.HIGH, 1_000_000), LIQUID); + COALGAS = new FluidType("COALGAS", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2E155F, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.MEDIUM, 150_000), LIQUID); + SPENTSTEAM = new FluidType("SPENTSTEAM", 0x445772, 2, 0, 0, EnumSymbol.NONE).setCompression(1D).addTraits(NOCON); + FRACKSOL = new FluidType("FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addContainers(0x4F887F, ExtContainer.CANISTER).addTraits(new FT_Corrosive(15)); + PLASMA_DT = new FluidType("PLASMA_DT", 0xF7AFDE, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3250).addTraits(NOCON, NOID, PLASMA); + PLASMA_HD = new FluidType("PLASMA_HD", 0xF0ADF4, 0, 4, 0, EnumSymbol.RADIATION).setTemp(2500).addTraits(NOCON, NOID, PLASMA); + PLASMA_HT = new FluidType("PLASMA_HT", 0xD1ABF2, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3000).addTraits(NOCON, NOID, PLASMA); + PLASMA_XM = new FluidType("PLASMA_XM", 0xC6A5FF, 0, 4, 1, EnumSymbol.RADIATION).setTemp(4250).addTraits(NOCON, NOID, PLASMA); + PLASMA_BF = new FluidType("PLASMA_BF", 0xA7F1A3, 4, 5, 4, EnumSymbol.ANTIMATTER).setTemp(8500).addTraits(NOCON, NOID, PLASMA); + CARBONDIOXIDE = new FluidType("CARBONDIOXIDE", 0x404040, 3, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + PLASMA_DH3 = new FluidType("PLASMA_DH3", 0xFF83AA, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3480).addTraits(NOCON, NOID, PLASMA); + HELIUM3 = new FluidType("HELIUM3", 0xFCF0C4, 3, 4, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + DEATH = new FluidType("DEATH", 0x717A88, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(80), LEADCON, LIQUID); + ETHANOL = new FluidType("ETHANOL", 0xe0ffff, 2, 3, 0, EnumSymbol.NONE).addContainers(0xEAFFF3, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.HIGH, 200_000), LIQUID); + HEAVYWATER = new FluidType("HEAVYWATER", 0x00a0b0, 1, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); + CRACKOIL = new FluidType("CRACKOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); + COALOIL = new FluidType("COALOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); + HOTCRACKOIL = new FluidType("HOTCRACKOIL", 0x300900, 2, 3, 0, EnumSymbol.NONE).setTemp(350).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); + NAPHTHA_CRACK = new FluidType("NAPHTHA_CRACK", 0x595744, 2, 1, 0, EnumSymbol.NONE).addContainers(0x5F6D44, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 200_000), LIQUID); + LIGHTOIL_CRACK = new FluidType("LIGHTOIL_CRACK", 0x8c7451, 1, 2, 0, EnumSymbol.NONE).addContainers(0xB46B52, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.MEDIUM, 500_000), LIQUID); + DIESEL_CRACK = new FluidType("DIESEL_CRACK", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF2C2C, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.HIGH, 450_000), LIQUID); + AROMATICS = new FluidType("AROMATICS", 0x68A09A, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(25_000), LIQUID); + UNSATURATEDS = new FluidType("UNSATURATEDS", 0x628FAE, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(1_000_000), GASEOUS); //acetylene burns as hot as satan's asshole + SALIENT = new FluidType("SALIENT", 0x457F2D, 0, 0, 0, EnumSymbol.NONE).addTraits(DELICIOUS, LIQUID); + XPJUICE = new FluidType("XPJUICE", 0xBBFF09, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); + ENDERJUICE = new FluidType("ENDERJUICE", 0x127766, 0, 0, 0, EnumSymbol.NONE).addTraits(DELICIOUS, LIQUID); + PETROIL_LEADED = new FluidType("PETROIL_LEADED", 0x44413d, 1, 3, 0, EnumSymbol.NONE).addContainers(0x2331F6, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 450_000), LIQUID); + GASOLINE_LEADED = new FluidType("GASOLINE_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2F775A, ExtContainer.CANISTER).addTraits(new FT_Flammable(400_000), new FT_Combustible(FuelGrade.HIGH, 1_500_000), LIQUID); + COALGAS_LEADED = new FluidType("COALGAS_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x1E155F, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.MEDIUM, 250_000), LIQUID); + SULFURIC_ACID = new FluidType("SULFURIC_ACID", 0xB0AA64, 3, 0, 2, EnumSymbol.ACID).addTraits(new FT_Corrosive(50), LIQUID); + COOLANT_HOT = new FluidType("COOLANT_HOT", 0x99525E, 1, 0, 0, EnumSymbol.NONE).setTemp(600).setHeatCap(COOLANT.heatCap).addTraits(LIQUID); + MUG = new FluidType("MUG", 0x4B2D28, 0, 0, 0, EnumSymbol.NONE).setHeatCap(1D).addTraits(DELICIOUS, LIQUID); + MUG_HOT = new FluidType(78, "MUG_HOT", 0x6B2A20, 0, 0, 0, EnumSymbol.NONE).setHeatCap(MUG.heatCap).setTemp(500).addTraits(DELICIOUS, LIQUID); // ^ ^ ^ ^ ^ ^ ^ ^ diff --git a/src/main/java/com/hbm/inventory/fluid/types/FluidTypeCombustible.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java similarity index 73% rename from src/main/java/com/hbm/inventory/fluid/types/FluidTypeCombustible.java rename to src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java index 449d4b673..2c6480099 100644 --- a/src/main/java/com/hbm/inventory/fluid/types/FluidTypeCombustible.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java @@ -1,26 +1,19 @@ -package com.hbm.inventory.fluid.types; +package com.hbm.inventory.fluid.trait; import java.util.List; -import com.hbm.render.util.EnumSymbol; import com.hbm.util.BobMathUtil; import net.minecraft.util.EnumChatFormatting; -/** Because updating all the combustion engines and adding values by hand fucking sucks */ -public class FluidTypeCombustible extends FluidTypeFlammable { +public class FT_Combustible extends FluidTrait { protected FuelGrade fuelGrade; protected long combustionEnergy; - public FluidTypeCombustible(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - } - - public FluidTypeCombustible setCombustionEnergy(FuelGrade grade, long energy) { + public FT_Combustible(FuelGrade grade, long energy) { this.fuelGrade = grade; this.combustionEnergy = energy; - return this; } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java new file mode 100644 index 000000000..4e0354033 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java @@ -0,0 +1,32 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.List; + +import net.minecraft.util.EnumChatFormatting; + +public class FT_Corrosive extends FluidTrait { + + /* 0-100 */ + private int rating; + + public FT_Corrosive(int rating) { + this.rating = rating; + } + + public int getRating() { + return rating; + } + + public boolean isHighlyCorrosive() { + return rating > 50; + } + + @Override + public void addInfo(List info) { + + if(isHighlyCorrosive()) + info.add(EnumChatFormatting.GOLD + "[Strongly Corrosive]"); + else + info.add(EnumChatFormatting.YELLOW + "[Corrosive]"); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java new file mode 100644 index 000000000..9899fccf7 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java @@ -0,0 +1,15 @@ +package com.hbm.inventory.fluid.trait; + +public class FT_Flammable extends FluidTrait { + + /** How much heat energy (usually translates into HE 1:1) 1000mB hold */ + private long energy; + + public FT_Flammable(long energy) { + this.energy = energy; + } + + public long getHeatEnergy() { + return this.energy; + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveFluid.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java similarity index 50% rename from src/main/java/com/hbm/inventory/fluid/types/RadioactiveFluid.java rename to src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java index e8610c54e..9f0fbe476 100644 --- a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveFluid.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java @@ -1,23 +1,16 @@ -package com.hbm.inventory.fluid.types; +package com.hbm.inventory.fluid.trait; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.inventory.FluidTank; -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; import net.minecraft.world.World; -public class RadioactiveFluid extends FluidType { +public class FT_VentRadiation extends FluidTrait { float radPerMB = 0; - - public RadioactiveFluid(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - } - public RadioactiveFluid setRadiation(float rad) { + public FT_VentRadiation(float rad) { this.radPerMB = rad; - return this; } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java new file mode 100644 index 000000000..4b407b48e --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java @@ -0,0 +1,17 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.List; + +import com.hbm.inventory.FluidTank; + +import net.minecraft.world.World; + +public abstract class FluidTrait { + + /** Important information that should always be displayed */ + public void addInfo(List info) { } + /* General names of simple traits which are displayed when holding shift */ + public void addInfoHidden(List info) { } + + public void onFluidRelease(World world, int x, int y, int z, FluidTank tank, int overflowAmount) { } +} diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java new file mode 100644 index 000000000..8cceb5db3 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java @@ -0,0 +1,44 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.List; + +import net.minecraft.util.EnumChatFormatting; + +public class FluidTraitSimple { + + public static class FT_Gaseous extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.BLUE + "[Gaseous]"); + } + } + + public static class FT_Gaseous_ART extends FluidTrait { } //at room temperature, for cryogenic hydrogen for example + + public static class FT_Liquid extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.BLUE + "[Liquid]"); + } + } + + public static class FT_Plasma extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.LIGHT_PURPLE + "[Plasma]"); + } + } + + public static class FT_Amat extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.DARK_RED + "[Antimatter]"); + } + } + + public static class FT_LeadContainer extends FluidTrait { + @Override public void addInfo(List info) { + info.add(EnumChatFormatting.DARK_RED + "[Requires hazardous material tank to hold]"); + } + } + + public static class FT_NoID extends FluidTrait { } + public static class FT_NoContainer extends FluidTrait { } + public static class FT_Delicious extends FluidTrait { } +} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Antimatter.java b/src/main/java/com/hbm/inventory/fluid/types/Antimatter.java deleted file mode 100644 index a077efc53..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Antimatter.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; - -public class Antimatter extends FluidType { - - public Antimatter(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.AMAT); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/CombustibleGas.java b/src/main/java/com/hbm/inventory/fluid/types/CombustibleGas.java deleted file mode 100644 index b260f0fe1..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/CombustibleGas.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class CombustibleGas extends FluidTypeCombustible { - - public CombustibleGas(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.GASEOUS); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/FlammableGas.java b/src/main/java/com/hbm/inventory/fluid/types/FlammableGas.java deleted file mode 100644 index 0216a9029..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/FlammableGas.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class FlammableGas extends FluidTypeFlammable { - - public FlammableGas(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.GASEOUS); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/FlammableOilGas.java b/src/main/java/com/hbm/inventory/fluid/types/FlammableOilGas.java deleted file mode 100644 index d7909ffda..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/FlammableOilGas.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class FlammableOilGas extends FlammableGas { - - public FlammableOilGas(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.PETROCHEMICAL); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/FluidTypeFlammable.java b/src/main/java/com/hbm/inventory/fluid/types/FluidTypeFlammable.java deleted file mode 100644 index 37bf5e8e0..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/FluidTypeFlammable.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import java.util.List; - -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; -import com.hbm.util.BobMathUtil; - -import net.minecraft.util.EnumChatFormatting; - -/** If it burns, it needs to be an instance of this class. */ -public class FluidTypeFlammable extends FluidType { - - /** How much heat energy (usually translates into HE 1:1) 1000mB hold */ - protected long energy; - - public FluidTypeFlammable(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - } - - public FluidTypeFlammable setHeatEnergy(long energy) { - this.energy = energy; - return this; - } - - public long getHeatEnergy() { - return this.energy; - } - - @Override - public void addInfo(List info) { - super.addInfo(info); - - info.add(EnumChatFormatting.YELLOW + "[Flammable]"); - - if(energy > 0) - info.add(EnumChatFormatting.YELLOW + "Provides " + EnumChatFormatting.RED + "" + BobMathUtil.getShortNumber(energy) + "HE " + EnumChatFormatting.YELLOW + "per bucket"); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Fuel.java b/src/main/java/com/hbm/inventory/fluid/types/Fuel.java deleted file mode 100644 index d37c3fa20..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Fuel.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class Fuel extends FluidTypeCombustible { - - public Fuel(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.LIQUID, FluidTrait.PETROCHEMICAL); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Gas.java b/src/main/java/com/hbm/inventory/fluid/types/Gas.java deleted file mode 100644 index 103492c6a..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Gas.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; - -public class Gas extends FluidType { - - public Gas(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.GASEOUS); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Oil.java b/src/main/java/com/hbm/inventory/fluid/types/Oil.java deleted file mode 100644 index 915895d89..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Oil.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class Oil extends FluidTypeFlammable { - - public Oil(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.LIQUID, FluidTrait.PETROCHEMICAL); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Petrochemical.java b/src/main/java/com/hbm/inventory/fluid/types/Petrochemical.java deleted file mode 100644 index ec6258ae8..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Petrochemical.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; - -public class Petrochemical extends FluidType { - - public Petrochemical(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.LIQUID, FluidTrait.PETROCHEMICAL); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveGas.java b/src/main/java/com/hbm/inventory/fluid/types/RadioactiveGas.java deleted file mode 100644 index e3b29124b..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveGas.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class RadioactiveGas extends RadioactiveFluid { - - public RadioactiveGas(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.GASEOUS); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveLiquid.java b/src/main/java/com/hbm/inventory/fluid/types/RadioactiveLiquid.java deleted file mode 100644 index f867ab9f0..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveLiquid.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class RadioactiveLiquid extends RadioactiveFluid { - - public RadioactiveLiquid(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.LIQUID); - } -} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java b/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java index 06a29102d..abcc30b6e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java @@ -3,7 +3,7 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineGasFlare; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.lib.RefStrings; import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; @@ -79,7 +79,7 @@ public class GUIMachineGasFlare extends GuiInfoContainer { if(flare.isOn) drawTexturedModalRect(guiLeft + 79, guiTop + 15, 176, 0, 35, 10); if(flare.doesBurn) drawTexturedModalRect(guiLeft + 79, guiTop + 49, 176, 10, 35, 14); - if(flare.isOn && flare.doesBurn && flare.tank.getFill() > 0 && flare.tank.getTankType() instanceof FluidTypeFlammable) + if(flare.isOn && flare.doesBurn && flare.tank.getFill() > 0 && flare.tank.getTankType().hasTrait(FT_Flammable.class)) drawTexturedModalRect(guiLeft + 88, guiTop + 29, 176, 24, 18, 18); flare.tank.renderTank(guiLeft + 35, guiTop + 69, this.zLevel, 16, 52); diff --git a/src/main/java/com/hbm/inventory/gui/GUIOilburner.java b/src/main/java/com/hbm/inventory/gui/GUIOilburner.java index 1316841cf..222174de0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIOilburner.java +++ b/src/main/java/com/hbm/inventory/gui/GUIOilburner.java @@ -3,7 +3,7 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerOilburner; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.lib.RefStrings; import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; @@ -35,8 +35,8 @@ public class GUIOilburner extends GuiInfoContainer { this.drawCustomInfoStat(x, y, guiLeft + 116, guiTop + 17, 16, 52, x, y, new String[] { String.format("%,d", Math.min(diFurnace.heatEnergy, diFurnace.maxHeatEnergy)) + " / " + String.format("%,d", diFurnace.maxHeatEnergy) + "TU" }); - if(diFurnace.tank.getTankType() instanceof FluidTypeFlammable) { - this.drawCustomInfoStat(x, y, guiLeft + 79, guiTop + 34, 18, 18, x, y, new String[] { "10mB/t", (int)(((FluidTypeFlammable)diFurnace.tank.getTankType()).getHeatEnergy() / 1000) * 10 + "TU/t" }); + if(diFurnace.tank.getTankType().hasTrait(FT_Flammable.class)) { + this.drawCustomInfoStat(x, y, guiLeft + 79, guiTop + 34, 18, 18, x, y, new String[] { "10mB/t", (int)(diFurnace.tank.getTankType().getTrait(FT_Flammable.class).getHeatEnergy() / 1000) * 10 + "TU/t" }); } diFurnace.tank.renderTankInfo(this, x, y, guiLeft + 44, guiTop + 17, 16, 52); @@ -75,7 +75,7 @@ public class GUIOilburner extends GuiInfoContainer { if(diFurnace.isOn) { drawTexturedModalRect(guiLeft + 70, guiTop + 54, 210, 0, 35, 14); - if(diFurnace.tank.getFill() > 0 && diFurnace.tank.getTankType() instanceof FluidTypeFlammable) { + if(diFurnace.tank.getFill() > 0 && diFurnace.tank.getTankType().hasTrait(FT_Flammable.class)) { drawTexturedModalRect(guiLeft + 79, guiTop + 34, 176, 0, 18, 18); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java index fe444ae8c..3ef49d8d8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java @@ -6,7 +6,7 @@ import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerOilburner; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.inventory.gui.GUIOilburner; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -52,8 +52,8 @@ public class TileEntityHeaterOilburner extends TileEntityMachineBase implements if(this.isOn && this.heatEnergy < maxHeatEnergy) { - if(tank.getTankType() instanceof FluidTypeFlammable) { - FluidTypeFlammable type = (FluidTypeFlammable) tank.getTankType(); + if(tank.getTankType().hasTrait(FT_Flammable.class)) { + FT_Flammable type = tank.getTankType().getTrait(FT_Flammable.class); int burnRate = 10; int toBurn = Math.min(burnRate, tank.getFill()); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index ea8611233..3acdd525d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -8,8 +8,8 @@ import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeCombustible; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; @@ -152,8 +152,8 @@ public class TileEntityMachineDiesel extends TileEntityMachineBase implements IE public static long getHEFromFuel(FluidType type) { - if(type instanceof FluidTypeCombustible) { - FluidTypeCombustible fuel = (FluidTypeCombustible) type; + if(type.hasTrait(FT_Combustible.class)) { + FT_Combustible fuel = type.getTrait(FT_Combustible.class); FuelGrade grade = fuel.getGrade(); double efficiency = fuelEfficiency.containsKey(grade) ? fuelEfficiency.get(grade) : 0; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index 9baafe22e..e5e5aa1f0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -5,7 +5,7 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; @@ -211,7 +211,7 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement public int getPowerFromFuel() { FluidType type = tanks[1].getTankType(); - return type instanceof FluidTypeFlammable ? (int)(((FluidTypeFlammable) type).getHeatEnergy() / 1000L) : 0; + return type.hasTrait(FT_Flammable.class) ? (int)(type.getTrait(FT_Flammable.class).getHeatEnergy() / 1000L) : 0; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java index bac764a9f..069183b62 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java @@ -8,8 +8,8 @@ import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeCombustible; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; @@ -272,8 +272,8 @@ public class TileEntityMachineSeleniumEngine extends TileEntityLoadedBase implem public static long getHEFromFuel(FluidType type) { - if(type instanceof FluidTypeCombustible) { - FluidTypeCombustible fuel = (FluidTypeCombustible) type; + if(type.hasTrait(FT_Combustible.class)) { + FT_Combustible fuel = type.getTrait(FT_Combustible.class); FuelGrade grade = fuel.getGrade(); double efficiency = fuelEfficiency.containsKey(grade) ? fuelEfficiency.get(grade) : 0; return (long) (fuel.getCombustionEnergy() / 1000L * efficiency); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index 673c6cf69..ee9581f1b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -8,8 +8,8 @@ import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeCombustible; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.ModDamageSource; @@ -115,8 +115,8 @@ public class TileEntityMachineTurbofan extends TileEntityMachineBase implements long burn = 0; int amount = 1 + this.afterburner; - if(tank.getTankType() instanceof FluidTypeCombustible && ((FluidTypeCombustible) tank.getTankType()).getGrade() == FuelGrade.AERO) { - burn = ((FluidTypeCombustible) tank.getTankType()).getCombustionEnergy() / 1_000; + if(tank.getTankType().hasTrait(FT_Combustible.class) && tank.getTankType().getTrait(FT_Combustible.class).getGrade() == FuelGrade.AERO) { + burn = tank.getTankType().getTrait(FT_Combustible.class).getCombustionEnergy() / 1_000; } int toBurn = Math.min(amount, this.tank.getFill()); diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index 3a73f999f..e8622e6ac 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -9,8 +9,9 @@ import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.FluidType.FluidTrait; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.trait.FT_Flammable; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous_ART; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; @@ -111,9 +112,9 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements maxVent += maxVent * burn; maxBurn += maxBurn * burn; - if(!doesBurn || !(tank.getTankType() instanceof FluidTypeFlammable)) { + if(!doesBurn || !(tank.getTankType().hasTrait(FT_Flammable.class))) { - if(tank.getTankType().traits.contains(FluidTrait.GASEOUS)) { + if(tank.getTankType().hasTrait(FT_Gaseous.class) || tank.getTankType().hasTrait(FT_Gaseous_ART.class)) { int eject = Math.min(maxVent, tank.getFill()); tank.setFill(tank.getFill() - eject); tank.getTankType().onFluidRelease(this, tank, eject); @@ -123,15 +124,15 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements } } else { - if(tank.getTankType() instanceof FluidTypeFlammable) { + if(tank.getTankType().hasTrait(FT_Flammable.class)) { int eject = Math.min(maxBurn, tank.getFill()); tank.setFill(tank.getFill() - eject); int penalty = 2; - if(!tank.getTankType().traits.contains(FluidTrait.GASEOUS)) + if(!tank.getTankType().hasTrait(FT_Gaseous.class) && !tank.getTankType().hasTrait(FT_Gaseous_ART.class)) penalty = 10; - long powerProd = ((FluidTypeFlammable) tank.getTankType()).getHeatEnergy() * eject / 1_000; // divided by 1000 per mB + long powerProd = tank.getTankType().getTrait(FT_Flammable.class).getHeatEnergy() * eject / 1_000; // divided by 1000 per mB powerProd /= penalty; powerProd += powerProd * yield / 3; @@ -166,7 +167,7 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements if(isOn && tank.getFill() > 0) { - if((!doesBurn || !(tank.getTankType() instanceof FluidTypeFlammable)) && tank.getTankType().traits.contains(FluidTrait.GASEOUS)) { + if((!doesBurn || !(tank.getTankType().hasTrait(FT_Flammable.class))) && (tank.getTankType().hasTrait(FT_Gaseous.class) || tank.getTankType().hasTrait(FT_Gaseous_ART.class))) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); @@ -184,7 +185,7 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements } - if(doesBurn && tank.getTankType() instanceof FluidTypeFlammable && MainRegistry.proxy.me().getDistanceSq(xCoord, yCoord + 10, zCoord) <= 1024) { + if(doesBurn && tank.getTankType().hasTrait(FT_Flammable.class) && MainRegistry.proxy.me().getDistanceSq(xCoord, yCoord + 10, zCoord) <= 1024) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index e954e41d8..311df298f 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -8,7 +8,7 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.FluidType.FluidTrait; +import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.Library; import com.hbm.main.ModEventHandler; @@ -98,7 +98,7 @@ public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcc //for when you fill corrosive liquid into an iron tank if((b == ModBlocks.barrel_iron && tank.getTankType().isCorrosive()) || - (b == ModBlocks.barrel_steel && tank.getTankType().traits.contains(FluidTrait.CORROSIVE_2))) { + (b == ModBlocks.barrel_steel && tank.getTankType().hasTrait(FT_Corrosive.class) && tank.getTankType().getTrait(FT_Corrosive.class).getRating() > 50)) { ItemStack[] copy = this.slots.clone(); this.slots = new ItemStack[6]; worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.barrel_corroded); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index a59f7cbab..d7a4e2acb 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -8,7 +8,7 @@ import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.FluidType.FluidTrait; +import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; @@ -73,7 +73,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 5, true, true); } - if(tank.getTankType().traits.contains(FluidTrait.CORROSIVE_2)) { + if(tank.getTankType().hasTrait(FT_Corrosive.class) && tank.getTankType().getTrait(FT_Corrosive.class).isHighlyCorrosive()) { worldObj.func_147480_a(xCoord, yCoord, zCoord, false); } } From 776a203f8adf69bf4443fe77d59f60aca9712707 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 16 Aug 2022 16:40:17 +0200 Subject: [PATCH 009/111] centrifuge and cyclotron recipe configs also some torex tweaks --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../com/hbm/blocks/generic/BlockCrystal.java | 3 +- .../hbm/blocks/generic/BlockDragonProof.java | 17 ++ .../hbm/entity/effect/EntityNukeTorex.java | 32 ++- .../com/hbm/handler/imc/IMCCentrifuge.java | 6 +- .../handler/nei/CentrifugeRecipeHandler.java | 175 ++++++------ .../java/com/hbm/inventory/RecipesCommon.java | 1 - .../inventory/recipes/CentrifugeRecipes.java | 125 ++++++--- .../inventory/recipes/CyclotronRecipes.java | 260 ++++++++++-------- .../recipes/loader/SerializableRecipe.java | 9 +- src/main/java/com/hbm/main/MainRegistry.java | 4 - .../machine/TileEntityMachineMiniRTG.java | 5 - 12 files changed, 365 insertions(+), 274 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockDragonProof.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 93a41aba1..545cfe47f 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1424,7 +1424,7 @@ public class ModBlocks { ore_oil_sand = new BlockFalling(Material.sand).setBlockName("ore_oil_sand").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeSand).setHardness(0.5F).setResistance(1.0F).setBlockTextureName(RefStrings.MODID + ":ore_oil_sand_alt"); ore_bedrock_oil = new BlockGeneric(Material.rock).setBlockName("ore_bedrock_oil").setCreativeTab(MainRegistry.blockTab).setBlockUnbreakable().setResistance(1_000_000).setBlockTextureName(RefStrings.MODID + ":ore_bedrock_oil"); - ore_tikite = new BlockGeneric(Material.rock).setBlockName("ore_tikite").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_tikite_alt"); + ore_tikite = new BlockDragonProof(Material.rock).setBlockName("ore_tikite").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_tikite_alt"); crystal_power = new BlockCrystal(Material.glass).setBlockName("crystal_power").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(1.0F).setBlockTextureName(RefStrings.MODID + ":crystal_power"); crystal_energy = new BlockCrystal(Material.glass).setBlockName("crystal_energy").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(1.0F).setBlockTextureName(RefStrings.MODID + ":crystal_energy"); diff --git a/src/main/java/com/hbm/blocks/generic/BlockCrystal.java b/src/main/java/com/hbm/blocks/generic/BlockCrystal.java index a21365a07..0204d0f78 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockCrystal.java +++ b/src/main/java/com/hbm/blocks/generic/BlockCrystal.java @@ -1,11 +1,10 @@ package com.hbm.blocks.generic; import cpw.mods.fml.client.registry.RenderingRegistry; -import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; -public class BlockCrystal extends Block { +public class BlockCrystal extends BlockDragonProof { public BlockCrystal(Material mat) { super(mat); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDragonProof.java b/src/main/java/com/hbm/blocks/generic/BlockDragonProof.java new file mode 100644 index 000000000..91f2618a6 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockDragonProof.java @@ -0,0 +1,17 @@ +package com.hbm.blocks.generic; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.world.IBlockAccess; + +public class BlockDragonProof extends BlockGeneric { + + public BlockDragonProof(Material material) { + super(material); + } + + public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { + return !(entity instanceof EntityDragon); + } +} diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index 3ad54fc6e..5d3c29352 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -36,7 +36,8 @@ public class EntityNukeTorex extends Entity { public void onUpdate() { this.ticksExisted++; - int maxAge = 90 * 20; + double s = this.getScale(); + int maxAge = (int) (90 * 20 * s); if(worldObj.isRemote) { @@ -49,19 +50,21 @@ public class EntityNukeTorex extends Entity { for(int i = 0; i < toSpawn; i++) { double y = posY + rand.nextGaussian() - 3; //this.ticksExisted < 60 ? this.posY + this.coreHeight : posY + rand.nextGaussian() - 3; Cloudlet cloud = new Cloudlet(posX + rand.nextGaussian() * range, y, posZ + rand.nextGaussian() * range, (float)(rand.nextDouble() * 2D * Math.PI), 0); - cloud.setScale(1F + this.ticksExisted * 0.001F, 5F); + cloud.setScale(1F + this.ticksExisted * 0.001F * (float) s, 5F * (float) s); cloudlets.add(cloud); } } - int cloudCount = ticksExisted * 3; if(ticksExisted < 200) { + + int cloudCount = ticksExisted * 3; + for(int i = 0; i < cloudCount; i++) { Vec3 vec = Vec3.createVectorHelper((ticksExisted + rand.nextDouble()) * 2, 0, 0); float rot = (float) (Math.PI * 2 * rand.nextDouble()); vec.rotateAroundY(rot); this.cloudlets.add(new Cloudlet(vec.xCoord + posX, worldObj.getHeightValue((int) (vec.xCoord + posX) + 1, (int) (vec.zCoord + posZ)), vec.zCoord + posZ, rot, 0) - .setScale(5F, 2F) + .setScale(5F * (float) s, 2F * (float) s) .setMotion(0)); } } @@ -69,13 +72,12 @@ public class EntityNukeTorex extends Entity { for(Cloudlet cloud : cloudlets) { cloud.update(); } - - coreHeight += 0.15; - torusWidth += 0.05; + coreHeight += 0.15 * s; + torusWidth += 0.05 * s; rollerSize = torusWidth * 0.35; convectionHeight = coreHeight + rollerSize; - int maxHeat = 50; + int maxHeat = (int) (50 * s); heat = maxHeat - Math.pow((maxHeat * this.ticksExisted) / maxAge, 1); cloudlets.removeIf(x -> x.isDead); @@ -95,6 +97,20 @@ public class EntityNukeTorex extends Entity { return 1.0D; } + + public double getScale() { + return 1.0D; + } + + public double getSaturation() { + double d = (double) this.ticksExisted / (double) this.getMaxAge(); + return 1D - (d * d * d * d); + } + + public int getMaxAge() { + double s = this.getScale(); + return (int) (90 * 20 * s); + } public class Cloudlet { diff --git a/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java b/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java index 940ab24bd..24456f70f 100644 --- a/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java +++ b/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java @@ -3,6 +3,8 @@ package com.hbm.handler.imc; import java.util.HashMap; import com.hbm.inventory.RecipesCommon; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; import net.minecraft.item.ItemStack; @@ -10,7 +12,7 @@ import net.minecraft.nbt.NBTTagCompound; public class IMCCentrifuge extends IMCHandler { - public static HashMap buffer = new HashMap(); + public static HashMap buffer = new HashMap(); @Override public void process(IMCMessage message) { @@ -40,7 +42,7 @@ public class IMCCentrifuge extends IMCHandler { String dict = data.getString("oredict"); if(!dict.isEmpty()) { - buffer.put(dict, outs); + buffer.put(new OreDictStack(dict), outs); } else { this.printError(message, "Input stack could not be read!"); } diff --git a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java index 7a58813cd..d2558d5ea 100644 --- a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java @@ -19,55 +19,53 @@ import net.minecraft.item.ItemStack; public class CentrifugeRecipeHandler extends TemplateRecipeHandler { - public static ArrayList fuels; + public static ArrayList fuels; - public class RecipeSet extends TemplateRecipeHandler.CachedRecipe - { - PositionedStack input; - PositionedStack result1; - PositionedStack result2; - PositionedStack result3; - PositionedStack result4; - - public RecipeSet(Object input, ItemStack[] results) { - this.input = new PositionedStack(input, 21, 6); - this.result1 = new PositionedStack(results[0], 129, 6); - this.result2 = new PositionedStack(results[1], 147, 6); - this.result3 = new PositionedStack(results[2], 129, 42); - this.result4 = new PositionedStack(results[3], 147, 42); - } + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + PositionedStack input; + PositionedStack result1; + PositionedStack result2; + PositionedStack result3; + PositionedStack result4; - @Override + public RecipeSet(Object input, ItemStack[] results) { + this.input = new PositionedStack(input, 21, 6); + this.result1 = new PositionedStack(results[0], 129, 6); + this.result2 = new PositionedStack(results[1], 147, 6); + this.result3 = new PositionedStack(results[2], 129, 42); + this.result4 = new PositionedStack(results[3], 147, 42); + } + + @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 48, Arrays.asList(input)); - } + return getCycledIngredients(cycleticks / 48, Arrays.asList(input)); + } - @Override + @Override public List getOtherStacks() { - List stacks = new ArrayList(); - stacks.add(fuels.get((cycleticks / 48) % fuels.size()).stack); - stacks.add(result2); - stacks.add(result3); - stacks.add(result4); - return stacks; - } + List stacks = new ArrayList(); + stacks.add(fuels.get((cycleticks / 48) % fuels.size()).stack); + stacks.add(result2); + stacks.add(result3); + stacks.add(result4); + return stacks; + } - @Override + @Override public PositionedStack getResult() { - return result1; - } - } + return result1; + } + } - public static class Fuel - { - public Fuel(ItemStack ingred) { - - this.stack = new PositionedStack(ingred, 21, 42, false); - } + public static class Fuel { + public Fuel(ItemStack ingred) { + + this.stack = new PositionedStack(ingred, 21, 42, false); + } + + public PositionedStack stack; + } - public PositionedStack stack; - } - @Override public String getRecipeName() { return "Centrifuge"; @@ -78,33 +76,32 @@ public class CentrifugeRecipeHandler extends TemplateRecipeHandler { return GUIMachineCentrifuge.texture.toString(); } - @Override - public Class getGuiClass() { - return GUIMachineCentrifuge.class; - } + @Override + public Class getGuiClass() { + return GUIMachineCentrifuge.class; + } + + @Override + public TemplateRecipeHandler newInstance() { + if(fuels == null || fuels.isEmpty()) + fuels = new ArrayList(); + for(ItemStack i : MachineRecipes.instance().getBatteries()) { + fuels.add(new Fuel(i)); + } + return super.newInstance(); + } - @Override - public TemplateRecipeHandler newInstance() { - if (fuels == null || fuels.isEmpty()) - fuels = new ArrayList(); - for(ItemStack i : MachineRecipes.instance().getBatteries()) - { - fuels.add(new Fuel(i)); - } - return super.newInstance(); - } - @Override public void loadCraftingRecipes(String outputId, Object... results) { - - if ((outputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { + + if((outputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { Map recipes = CentrifugeRecipes.getRecipes(); - - for (Map.Entry recipe : recipes.entrySet()) { + + for(Map.Entry recipe : recipes.entrySet()) { this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); } - + } else { super.loadCraftingRecipes(outputId, results); } @@ -116,22 +113,20 @@ public class CentrifugeRecipeHandler extends TemplateRecipeHandler { Map recipes = CentrifugeRecipes.getRecipes(); for(Map.Entry recipe : recipes.entrySet()) { - - if(NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue()[0], result) || - NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue()[1], result) || - NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue()[2], result) || - NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue()[3], result)) + + if(NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[0], result) || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[1], result) + || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[2], result) || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[3], result)) this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); } } @Override public void loadUsageRecipes(String inputId, Object... ingredients) { - - if ((inputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { - + + if((inputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { + loadCraftingRecipes("centrifugeprocessing", new Object[0]); - + } else { super.loadUsageRecipes(inputId, ingredients); } @@ -142,37 +137,37 @@ public class CentrifugeRecipeHandler extends TemplateRecipeHandler { Map recipes = CentrifugeRecipes.getRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - + for(Map.Entry recipe : recipes.entrySet()) { + if(recipe.getKey() instanceof ItemStack) { - if (NEIServerUtils.areStacksSameType(ingredient, (ItemStack)recipe.getKey())) + if(NEIServerUtils.areStacksSameType(ingredient, (ItemStack) recipe.getKey())) this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); - - } else if (recipe.getKey() instanceof ArrayList) { - - for(Object o : (ArrayList)recipe.getKey()) { - ItemStack stack = (ItemStack)o; - if (NEIServerUtils.areStacksSameType(ingredient, stack)) + } else if(recipe.getKey() instanceof ArrayList) { + + for(Object o : (ArrayList) recipe.getKey()) { + ItemStack stack = (ItemStack) o; + + if(NEIServerUtils.areStacksSameType(ingredient, stack)) this.arecipes.add(new RecipeSet(stack, RecipesCommon.objectToStackArray(recipe.getValue()))); } } } } - @Override - public void drawExtras(int recipe) { - drawProgressBar(21, 24, 195, 55, 16, 16, 48, 7); - - drawProgressBar(56, 5, 176, 0, 54, 54, 48 * 3, 0); + @Override + public void drawExtras(int recipe) { + drawProgressBar(21, 24, 195, 55, 16, 16, 48, 7); - drawProgressBar(3, 6, 177, 55, 16, 52, 480, 7); - } - - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(56, 5, 54, 54), "centrifugeprocessing")); - } + drawProgressBar(56, 5, 176, 0, 54, 54, 48 * 3, 0); + + drawProgressBar(3, 6, 177, 55, 16, 52, 480, 7); + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(56, 5, 54, 54), "centrifugeprocessing")); + } } diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index 2dde250f4..fc219a3bf 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -155,7 +155,6 @@ public class RecipesCommon { } public ItemStack toStack() { - return new ItemStack(item, stacksize, meta); } diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index a48ff6e2f..136663cc5 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -1,15 +1,23 @@ package com.hbm.inventory.recipes; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.handler.imc.IMCCentrifuge; import com.hbm.inventory.RecipesCommon; +import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; @@ -18,11 +26,12 @@ import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class CentrifugeRecipes { +public class CentrifugeRecipes extends SerializableRecipe { - private static HashMap recipes = new HashMap(); - - public static void register() { + private static HashMap recipes = new HashMap(); + + @Override + public void registerDefaults() { boolean lbs = GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleCentrifuge; @@ -128,79 +137,79 @@ public class CentrifugeRecipes { new ItemStack(ModItems.dust, 1), new ItemStack(ModItems.dust, 1) }); - recipes.put("oreCoal", new ItemStack[] { + recipes.put(new OreDictStack("oreCoal"), new ItemStack[] { new ItemStack(ModItems.powder_coal, 2), new ItemStack(ModItems.powder_coal, 2), new ItemStack(ModItems.powder_coal, 2), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreLignite", new ItemStack[] { + recipes.put(new OreDictStack("oreLignite"), new ItemStack[] { new ItemStack(ModItems.powder_lignite, 2), new ItemStack(ModItems.powder_lignite, 2), new ItemStack(ModItems.powder_lignite, 2), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreIron", new ItemStack[] { + recipes.put(new OreDictStack("oreIron"), new ItemStack[] { new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreGold", new ItemStack[] { + recipes.put(new OreDictStack("oreGold"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_gold, 2) : new ItemStack(ModItems.powder_gold, 1), new ItemStack(ModItems.powder_gold, 1), lbs ? new ItemStack(ModItems.nugget_bismuth, 1) : new ItemStack(ModItems.powder_gold, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreDiamond", new ItemStack[] { + recipes.put(new OreDictStack("oreDiamond"), new ItemStack[] { new ItemStack(ModItems.powder_diamond, 1), new ItemStack(ModItems.powder_diamond, 1), new ItemStack(ModItems.powder_diamond, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreEmerald", new ItemStack[] { + recipes.put(new OreDictStack("oreEmerald"), new ItemStack[] { new ItemStack(ModItems.powder_emerald, 1), new ItemStack(ModItems.powder_emerald, 1), new ItemStack(ModItems.powder_emerald, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreTitanium", new ItemStack[] { + recipes.put(new OreDictStack("oreTitanium"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_titanium, 2) : new ItemStack(ModItems.powder_titanium, 1), lbs ? new ItemStack(ModItems.powder_titanium, 2) : new ItemStack(ModItems.powder_titanium, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreQuartz", new ItemStack[] { + recipes.put(new OreDictStack("oreQuartz"), new ItemStack[] { new ItemStack(ModItems.powder_quartz, 1), new ItemStack(ModItems.powder_quartz, 1), new ItemStack(ModItems.powder_lithium_tiny, 1), new ItemStack(Blocks.netherrack, 1) }); - recipes.put("oreTungsten", new ItemStack[] { + recipes.put(new OreDictStack("oreTungsten"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_tungsten, 2) : new ItemStack(ModItems.powder_tungsten, 1), new ItemStack(ModItems.powder_tungsten, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreCopper", new ItemStack[] { + recipes.put(new OreDictStack("oreCopper"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_copper, 2) : new ItemStack(ModItems.powder_copper, 1), new ItemStack(ModItems.powder_copper, 1), new ItemStack(ModItems.powder_gold, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreAluminum", new ItemStack[] { + recipes.put(new OreDictStack("oreAluminum"), new ItemStack[] { new ItemStack(ModItems.powder_aluminium, 1), new ItemStack(ModItems.powder_aluminium, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreLead", new ItemStack[] { + recipes.put(new OreDictStack("oreLead"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_lead, 2) : new ItemStack(ModItems.powder_lead, 1), lbs ? new ItemStack(ModItems.nugget_bismuth, 1) : new ItemStack(ModItems.powder_lead, 1), new ItemStack(ModItems.powder_gold, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreSchrabidium", new ItemStack[] { + recipes.put(new OreDictStack("oreSchrabidium"), new ItemStack[] { new ItemStack(ModItems.powder_schrabidium, 1), new ItemStack(ModItems.powder_schrabidium, 1), new ItemStack(ModItems.nugget_solinium, 1), @@ -212,31 +221,31 @@ public class CentrifugeRecipes { new ItemStack(ModItems.nugget_zirconium, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("orePlutonium", new ItemStack[] { + recipes.put(new OreDictStack("orePlutonium"), new ItemStack[] { new ItemStack(ModItems.powder_plutonium, 1), new ItemStack(ModItems.powder_plutonium, 1), new ItemStack(ModItems.nugget_polonium, 3), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreUranium", new ItemStack[] { + recipes.put(new OreDictStack("oreUranium"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_uranium, 2) : new ItemStack(ModItems.powder_uranium, 1), lbs ? new ItemStack(ModItems.nugget_technetium, 2) : new ItemStack(ModItems.powder_uranium, 1), lbs ? new ItemStack(ModItems.nugget_ra226, 2) : new ItemStack(ModItems.nugget_ra226, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreThorium", new ItemStack[] { + recipes.put(new OreDictStack("oreThorium"), new ItemStack[] { new ItemStack(ModItems.powder_thorium, 1), new ItemStack(ModItems.powder_thorium, 1), new ItemStack(ModItems.powder_uranium, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreBeryllium", new ItemStack[] { + recipes.put(new OreDictStack("oreBeryllium"), new ItemStack[] { new ItemStack(ModItems.powder_beryllium, 1), new ItemStack(ModItems.powder_beryllium, 1), new ItemStack(ModItems.powder_emerald, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreRedstone", new ItemStack[] { + recipes.put(new OreDictStack("oreRedstone"), new ItemStack[] { new ItemStack(Items.redstone, 3), new ItemStack(Items.redstone, 3), lbs ? new ItemStack(ModItems.ingot_mercury, 3) : new ItemStack(ModItems.ingot_mercury, 1), @@ -248,7 +257,7 @@ public class CentrifugeRecipes { new ItemStack(ModItems.powder_nitan_mix, 1), new ItemStack(Blocks.end_stone, 1) }); - recipes.put("oreLapis", new ItemStack[] { + recipes.put(new OreDictStack("oreLapis"), new ItemStack[] { new ItemStack(ModItems.powder_lapis, 3), new ItemStack(ModItems.powder_lapis, 3), new ItemStack(ModItems.powder_cobalt_tiny, 1), @@ -272,7 +281,7 @@ public class CentrifugeRecipes { new ItemStack(ModItems.ingot_phosphorus), new ItemStack(Blocks.netherrack) }); - recipes.put("oreCobalt", new ItemStack[] { + recipes.put(new OreDictStack("oreCobalt"), new ItemStack[] { new ItemStack(ModItems.powder_cobalt, 2), new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_copper, 1), @@ -290,7 +299,7 @@ public class CentrifugeRecipes { ItemStack qItem = quartz.get(0).copy(); qItem.stackSize = 2; - recipes.put("oreCertusQuartz", new ItemStack[] { + recipes.put(new OreDictStack("oreCertusQuartz"), new ItemStack[] { qItem.copy(), qItem.copy(), qItem.copy(), @@ -327,8 +336,10 @@ public class CentrifugeRecipes { recipes.put(new ComparableStack(ModItems.crystal_lithium), new ItemStack[] { new ItemStack(ModItems.powder_lithium, 2), new ItemStack(ModItems.powder_lithium, 2), new ItemStack(ModItems.powder_quartz, 1), new ItemStack(ModItems.fluorite, 1) }); recipes.put(new ComparableStack(ModItems.crystal_starmetal), new ItemStack[] { new ItemStack(ModItems.powder_dura_steel, 3), new ItemStack(ModItems.powder_cobalt, 3), new ItemStack(ModItems.powder_astatine, 2), new ItemStack(ModItems.ingot_mercury, 5) }); recipes.put(new ComparableStack(ModItems.crystal_cobalt), new ItemStack[] { new ItemStack(ModItems.powder_cobalt, 2), new ItemStack(ModItems.powder_iron, 3), new ItemStack(ModItems.powder_copper, 3), new ItemStack(ModItems.powder_lithium_tiny, 1) }); - - + } + + @Override + public void registerPost() { if(!IMCCentrifuge.buffer.isEmpty()) { recipes.putAll(IMCCentrifuge.buffer); @@ -342,7 +353,7 @@ public class CentrifugeRecipes { if(stack == null || stack.getItem() == null) return null; - ComparableStack comp = new ComparableStack(stack.getItem(), 1, stack.getItemDamage()); + ComparableStack comp = new ComparableStack(stack).makeSingular(); if(recipes.containsKey(comp)) return RecipesCommon.copyStackArray(recipes.get(comp)); @@ -350,8 +361,7 @@ public class CentrifugeRecipes { String[] dictKeys = comp.getDictKeys(); for(String key : dictKeys) { - - if(recipes.containsKey(key)) + if(recipes.containsKey(new OreDictStack(key))) return RecipesCommon.copyStackArray(recipes.get(key)); } @@ -362,16 +372,55 @@ public class CentrifugeRecipes { Map recipes = new HashMap(); - for(Entry entry : CentrifugeRecipes.recipes.entrySet()) { - - if(entry.getKey() instanceof String) { - List ingredients = OreDictionary.getOres((String)entry.getKey()); - recipes.put(ingredients, entry.getValue()); - } else { - recipes.put(((ComparableStack)entry.getKey()).toStack(), entry.getValue()); - } + for(Entry entry : CentrifugeRecipes.recipes.entrySet()) { + recipes.put(entry.getKey().extractForNEI(), entry.getValue()); } return recipes; } + + @Override + public String getFileName() { + return "hbmCentrifuge.json"; + } + + @Override + public Object getRecipeObject() { + return recipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonObject obj = (JsonObject) recipe; + AStack in = this.readAStack(obj.get("input").getAsJsonArray()); + ItemStack[] out = this.readItemStackArray((JsonArray) obj.get("output")); + this.recipes.put(in, out); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + try { + Entry entry = (Entry) recipe; + writer.name("input"); + this.writeAStack(entry.getKey(), writer); + writer.name("output").beginArray(); + for(ItemStack stack : entry.getValue()) { + this.writeItemStack(stack, writer); + } + writer.endArray(); + } catch(Exception ex) { + MainRegistry.logger.error(ex); + ex.printStackTrace(); + } + } + + @Override + public void deleteRecipes() { + recipes.clear(); + } + + @Override + public String getComment() { + return "Outputs have to be an array of four item stacks. The centrifuge can't handle recipes with a smaller output as of now."; + } } diff --git a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java index db41eb8e0..eb385d6cc 100644 --- a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java @@ -1,112 +1,111 @@ package com.hbm.inventory.recipes; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import com.hbm.main.MainRegistry; +import com.hbm.util.ItemStackUtil; +import com.hbm.util.Tuple.Pair; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -public class CyclotronRecipes { - - //i could have used classes for this, oh bother - private static HashMap lithium = new HashMap(); - private static HashMap beryllium = new HashMap(); - private static HashMap carbon = new HashMap(); - private static HashMap copper = new HashMap(); - private static HashMap plutonium = new HashMap(); - private static HashMap liAmat = new HashMap(); - private static HashMap beAmat = new HashMap(); - private static HashMap caAmat = new HashMap(); - private static HashMap coAmat = new HashMap(); - private static HashMap plAmat = new HashMap(); +public class CyclotronRecipes extends SerializableRecipe { - public static void register() { + public static HashMap, Pair> recipes = new HashMap(); + + @Override + public void registerDefaults() { /// LITHIUM START /// int liA = 50; - makeRecipe(lithium, liAmat, "dustLithium", new ItemStack(ModItems.powder_beryllium), liA); - makeRecipe(lithium, liAmat, "dustBeryllium", new ItemStack(ModItems.powder_boron), liA); - makeRecipe(lithium, liAmat, "dustBoron", new ItemStack(ModItems.powder_coal), liA); - makeRecipe(lithium, liAmat, "dustNetherQuartz", new ItemStack(ModItems.powder_fire), liA); - makeRecipe(lithium, liAmat, "dustPhosphorus", new ItemStack(ModItems.sulfur), liA); - makeRecipe(lithium, liAmat, "dustIron", new ItemStack(ModItems.powder_cobalt), liA); - makeRecipe(lithium, liAmat, new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_zirconium), liA); - makeRecipe(lithium, liAmat, "dustGold", new ItemStack(ModItems.ingot_mercury), liA); - makeRecipe(lithium, liAmat, "dustPolonium", new ItemStack(ModItems.powder_astatine), liA); - makeRecipe(lithium, liAmat, "dustLanthanium", new ItemStack(ModItems.powder_cerium), liA); - makeRecipe(lithium, liAmat, "dustActinium", new ItemStack(ModItems.powder_thorium), liA); - makeRecipe(lithium, liAmat, "dustUranium", new ItemStack(ModItems.powder_neptunium), liA); - makeRecipe(lithium, liAmat, "dustNeptunium", new ItemStack(ModItems.powder_plutonium), liA); - makeRecipe(lithium, liAmat, new ComparableStack(ModItems.powder_reiium), new ItemStack(ModItems.powder_weidanium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustLithium"), new ItemStack(ModItems.powder_beryllium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustBeryllium"), new ItemStack(ModItems.powder_boron), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustBoron"), new ItemStack(ModItems.powder_coal), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustNetherQuartz"), new ItemStack(ModItems.powder_fire), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustPhosphorus"), new ItemStack(ModItems.sulfur), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustIron"), new ItemStack(ModItems.powder_cobalt), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_zirconium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustGold"), new ItemStack(ModItems.ingot_mercury), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustPolonium"), new ItemStack(ModItems.powder_astatine), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustLanthanium"), new ItemStack(ModItems.powder_cerium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustActinium"), new ItemStack(ModItems.powder_thorium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustUranium"), new ItemStack(ModItems.powder_neptunium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustNeptunium"), new ItemStack(ModItems.powder_plutonium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new ComparableStack(ModItems.powder_reiium), new ItemStack(ModItems.powder_weidanium), liA); /// LITHIUM END /// /// BERYLLIUM START /// int beA = 25; - makeRecipe(beryllium, beAmat, "dustLithium", new ItemStack(ModItems.powder_boron), beA); - makeRecipe(beryllium, beAmat, "dustNetherQuartz", new ItemStack(ModItems.sulfur), beA); - makeRecipe(beryllium, beAmat, "dustTitanium", new ItemStack(ModItems.powder_iron), beA); - makeRecipe(beryllium, beAmat, "dustCobalt", new ItemStack(ModItems.powder_copper), beA); - makeRecipe(beryllium, beAmat, new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_niobium), beA); - makeRecipe(beryllium, beAmat, new ComparableStack(ModItems.powder_cerium), new ItemStack(ModItems.powder_neodymium), beA); - makeRecipe(beryllium, beAmat, "dustThorium", new ItemStack(ModItems.powder_uranium), beA); - makeRecipe(beryllium, beAmat, new ComparableStack(ModItems.powder_weidanium), new ItemStack(ModItems.powder_australium), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustLithium"), new ItemStack(ModItems.powder_boron), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustNetherQuartz"), new ItemStack(ModItems.sulfur), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustTitanium"), new ItemStack(ModItems.powder_iron), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustCobalt"), new ItemStack(ModItems.powder_copper), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_niobium), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new ComparableStack(ModItems.powder_cerium), new ItemStack(ModItems.powder_neodymium), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustThorium"), new ItemStack(ModItems.powder_uranium), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new ComparableStack(ModItems.powder_weidanium), new ItemStack(ModItems.powder_australium), beA); /// BERYLLIUM END /// /// CARBON START /// int caA = 10; - makeRecipe(carbon, caAmat, "dustBoron", new ItemStack(ModItems.powder_aluminium), caA); - makeRecipe(carbon, caAmat, "dustSulfur", new ItemStack(ModItems.powder_titanium), caA); - makeRecipe(carbon, caAmat, "dustTitanium", new ItemStack(ModItems.powder_cobalt), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_caesium), new ItemStack(ModItems.powder_lanthanium), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_neodymium), new ItemStack(ModItems.powder_gold), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.ingot_mercury), new ItemStack(ModItems.powder_polonium), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_lead), new ItemStack(ModItems.powder_ra226),caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_astatine), new ItemStack(ModItems.powder_actinium), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_australium), new ItemStack(ModItems.powder_verticium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new OreDictStack("dustBoron"), new ItemStack(ModItems.powder_aluminium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new OreDictStack("dustSulfur"), new ItemStack(ModItems.powder_titanium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new OreDictStack("dustTitanium"), new ItemStack(ModItems.powder_cobalt), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_caesium), new ItemStack(ModItems.powder_lanthanium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_neodymium), new ItemStack(ModItems.powder_gold), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.ingot_mercury), new ItemStack(ModItems.powder_polonium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_lead), new ItemStack(ModItems.powder_ra226),caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_astatine), new ItemStack(ModItems.powder_actinium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_australium), new ItemStack(ModItems.powder_verticium), caA); /// CARBON END /// /// COPPER START /// int coA = 15; - makeRecipe(copper, coAmat, "dustBeryllium", new ItemStack(ModItems.powder_quartz), coA); - makeRecipe(copper, coAmat, "dustCoal", new ItemStack(ModItems.powder_bromine), coA); - makeRecipe(copper, coAmat, "dustTitanium", new ItemStack(ModItems.powder_strontium), coA); - makeRecipe(copper, coAmat, "dustIron", new ItemStack(ModItems.powder_niobium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_bromine), new ItemStack(ModItems.powder_iodine), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_neodymium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_niobium), new ItemStack(ModItems.powder_caesium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_iodine), new ItemStack(ModItems.powder_polonium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_caesium), new ItemStack(ModItems.powder_actinium), coA); - makeRecipe(copper, coAmat, "dustGold", new ItemStack(ModItems.powder_uranium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_verticium), new ItemStack(ModItems.powder_unobtainium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustBeryllium"), new ItemStack(ModItems.powder_quartz), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustCoal"), new ItemStack(ModItems.powder_bromine), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustTitanium"), new ItemStack(ModItems.powder_strontium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustIron"), new ItemStack(ModItems.powder_niobium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_bromine), new ItemStack(ModItems.powder_iodine), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_neodymium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_niobium), new ItemStack(ModItems.powder_caesium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_iodine), new ItemStack(ModItems.powder_polonium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_caesium), new ItemStack(ModItems.powder_actinium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustGold"), new ItemStack(ModItems.powder_uranium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_verticium), new ItemStack(ModItems.powder_unobtainium), coA); /// COPPER END /// /// PLUTONIUM START /// int plA = 100; - makeRecipe(plutonium, plAmat, "dustPhosphorus", new ItemStack(ModItems.powder_tennessine), plA); - makeRecipe(plutonium, plAmat, "dustPlutonium", new ItemStack(ModItems.powder_tennessine), plA); - makeRecipe(plutonium, plAmat, new ComparableStack(ModItems.powder_tennessine), new ItemStack(ModItems.powder_reiium), plA); - makeRecipe(plutonium, plAmat, new ComparableStack(ModItems.pellet_charged), new ItemStack(ModItems.nugget_schrabidium), 1000); - makeRecipe(plutonium, plAmat, new ComparableStack(ModItems.powder_unobtainium), new ItemStack(ModItems.powder_daffergon), plA); - makeRecipe(plutonium, plAmat, new ComparableStack(ModItems.cell_antimatter), new ItemStack(ModItems.cell_anti_schrabidium), 0); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new OreDictStack("dustPhosphorus"), new ItemStack(ModItems.powder_tennessine), plA); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new OreDictStack("dustPlutonium"), new ItemStack(ModItems.powder_tennessine), plA); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new ComparableStack(ModItems.powder_tennessine), new ItemStack(ModItems.powder_reiium), plA); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new ComparableStack(ModItems.pellet_charged), new ItemStack(ModItems.nugget_schrabidium), 1000); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new ComparableStack(ModItems.powder_unobtainium), new ItemStack(ModItems.powder_daffergon), plA); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new ComparableStack(ModItems.cell_antimatter), new ItemStack(ModItems.cell_anti_schrabidium), 0); /// PLUTONIUM END /// ///TODO: fictional elements } - private static void makeRecipe(HashMap map, HashMap aMap, Object in, ItemStack out, int amat) { - map.put(in, out); - aMap.put(in, amat); + private static void makeRecipe(ComparableStack part, AStack in, ItemStack out, int amat) { + recipes.put(new Pair(part, in), new Pair(out, amat)); } public static Object[] getOutput(ItemStack stack, ItemStack box) { @@ -114,40 +113,22 @@ public class CyclotronRecipes { if(stack == null || stack.getItem() == null || box == null) return null; - HashMap pool = null; - HashMap aPool = null; + ComparableStack boxStack = new ComparableStack(box).makeSingular(); + ComparableStack comp = new ComparableStack(stack).makeSingular(); - if(box.getItem() == ModItems.part_lithium) { - pool = lithium; - aPool = liAmat; - } else if(box.getItem() == ModItems.part_beryllium) { - pool = beryllium; - aPool = beAmat; - } else if(box.getItem() == ModItems.part_carbon) { - pool = carbon; - aPool = caAmat; - } else if(box.getItem() == ModItems.part_copper) { - pool = copper; - aPool = coAmat; - } else if(box.getItem() == ModItems.part_plutonium) { - pool = plutonium; - aPool = plAmat; + Pair output = recipes.get(new Pair(boxStack, comp)); + + if(output != null) { + return new Object[] { output.getKey().copy(), output.getValue() }; } - if(pool == null) - return null; - - ComparableStack comp = new ComparableStack(stack.getItem(), 1, stack.getItemDamage()); - - if(pool.containsKey(comp)) - return new Object[] {pool.get(comp).copy(), aPool.get(comp)}; - - String[] dictKeys = comp.getDictKeys(); - - for(String key : dictKeys) { - - if(pool.containsKey(key)) - return new Object[] {pool.get(key).copy(), aPool.get(key)}; + for(String name : ItemStackUtil.getOreDictNames(stack)) { + OreDictStack ods = new OreDictStack(name); + output = recipes.get(new Pair(boxStack, comp)); + + if(output != null) { + return new Object[] { output.getKey().copy(), output.getValue() }; + } } return null; @@ -155,33 +136,68 @@ public class CyclotronRecipes { public static Map getRecipes() { - Map recipes = new HashMap(); - - addRecipes(recipes, lithium, ModItems.part_lithium); - addRecipes(recipes, beryllium, ModItems.part_beryllium); - addRecipes(recipes, carbon, ModItems.part_carbon); - addRecipes(recipes, copper, ModItems.part_copper); - addRecipes(recipes, plutonium, ModItems.part_plutonium); + Map map = new HashMap(); - return recipes; - } - - private static void addRecipes(Map recipes, HashMap map, Item part) { - - for(Entry entry : map.entrySet()) { + for(Entry, Pair> entry : recipes.entrySet()) { + List stack = entry.getKey().getValue().extractForNEI(); - if(entry.getKey() instanceof ComparableStack) { - - recipes.put(new ItemStack[] { new ItemStack(part), ((ComparableStack) entry.getKey()).toStack() }, entry.getValue()); - - } else if(entry.getKey() instanceof String) { - - List ores = OreDictionary.getOres((String) entry.getKey()); - - for(ItemStack ore : ores) { - recipes.put(new ItemStack[] { new ItemStack(part), ore }, entry.getValue()); - } + for(ItemStack ingredient : stack) { + map.put(new ItemStack[] { entry.getKey().getKey().toStack(), ingredient }, entry.getValue().getKey()); } } + + return map; + } + + @Override + public String getFileName() { + return "hbmCyclotron.json"; + } + + @Override + public Object getRecipeObject() { + return this.recipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonArray particle = ((JsonObject)recipe).get("particle").getAsJsonArray(); + JsonArray input = ((JsonObject)recipe).get("input").getAsJsonArray(); + JsonArray output = ((JsonObject)recipe).get("output").getAsJsonArray(); + int antimatter = ((JsonObject)recipe).get("antimatter").getAsInt(); + ItemStack partStack = this.readItemStack(particle); + AStack inStack = this.readAStack(input); + ItemStack outStack = this.readItemStack(output); + + this.recipes.put(new Pair(partStack, inStack), new Pair(outStack, antimatter)); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + try{ + Entry, Pair> rec = (Entry, Pair>) recipe; + + writer.name("particle"); + this.writeItemStack(rec.getKey().getKey().toStack(), writer); + writer.name("input"); + this.writeAStack(rec.getKey().getValue(), writer); + writer.name("output"); + this.writeItemStack(rec.getValue().getKey(), writer); + writer.name("antimatter").value(rec.getValue().getValue()); + + } catch(Exception ex) { + MainRegistry.logger.error(ex); + ex.printStackTrace(); + } + } + + @Override + public void deleteRecipes() { + this.recipes.clear(); + } + + @Override + public String getComment() { + return "The particle item, while being an input, has to be defined as an item stack without ore dictionary support."; } } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 06bafbfef..8e3c85a2f 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -27,6 +27,7 @@ import com.hbm.main.MainRegistry; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +//the anti-spaghetti. this class provides so much functionality and saves so much time, i just love you, SerializableRecipe <3 public abstract class SerializableRecipe { public static final Gson gson = new Gson(); @@ -38,6 +39,8 @@ public abstract class SerializableRecipe { public static void registerAllHandlers() { recipeHandlers.add(new ChemplantRecipes()); + recipeHandlers.add(new CentrifugeRecipes()); + recipeHandlers.add(new CyclotronRecipes()); recipeHandlers.add(new HadronRecipes()); recipeHandlers.add(new FuelPoolRecipes()); } @@ -67,6 +70,8 @@ public abstract class SerializableRecipe { MainRegistry.logger.info("Writing template file " + recTemplate.getName()); recipe.writeTemplateFile(recTemplate); } + + recipe.registerPost(); } MainRegistry.logger.info("Finished recipe init!"); @@ -89,7 +94,9 @@ public abstract class SerializableRecipe { public abstract void registerDefaults(); /** Deletes all existing recipes, currenly unused */ public abstract void deleteRecipes(); - + /** A routine called after registering all recipes, whether it's a template or not. Good for IMC functionality. */ + public void registerPost() { } + /** Returns a string to be printed as info at the top of the JSON file */ public String getComment() { return null; } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 29902a05c..0ca3b45af 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -769,13 +769,9 @@ public class MainRegistry { ShredderRecipes.registerShredder(); ShredderRecipes.registerOverrides(); CrystallizerRecipes.register(); - CentrifugeRecipes.register(); TileEntityNukeFurnace.registerFuels(); BreederRecipes.registerRecipes(); AssemblerRecipes.loadRecipes(); - //ChemplantRecipes.register(); moved to SerializableRecipe - CyclotronRecipes.register(); - //HadronRecipes.register(); moved to SerializableRecipe MagicRecipes.register(); SILEXRecipes.register(); AnvilRecipes.register(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java index a013fbc17..e9d41a607 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java @@ -1,14 +1,9 @@ package com.hbm.tileentity.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ModBlocks; -import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energy.IEnergyGenerator; -import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyGenerator { From 14450d36de4f78ae6bcf41eec0bec133ef0fab56 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 17 Aug 2022 16:20:27 +0200 Subject: [PATCH 010/111] gutted tool abilities, small fixes --- .../java/com/hbm/blocks/BlockDummyable.java | 1 - .../java/com/hbm/handler/ToolAbility.java | 33 +++-- .../container/ContainerCraneUnboxer.java | 30 +++++ .../inventory/recipes/CyclotronRecipes.java | 2 +- .../java/com/hbm/items/tool/IItemAbility.java | 116 ------------------ .../com/hbm/items/tool/ItemToolAbility.java | 7 +- 6 files changed, 53 insertions(+), 136 deletions(-) diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 7cd8d75d5..2e3534eac 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -12,7 +12,6 @@ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/handler/ToolAbility.java b/src/main/java/com/hbm/handler/ToolAbility.java index 8097de9cd..87bfcf558 100644 --- a/src/main/java/com/hbm/handler/ToolAbility.java +++ b/src/main/java/com/hbm/handler/ToolAbility.java @@ -14,12 +14,9 @@ import com.hbm.inventory.recipes.CrystallizerRecipes; import com.hbm.inventory.recipes.ShredderRecipes; import com.hbm.items.ModItems; import com.hbm.items.tool.IItemAbility; -import com.hbm.util.EnchantmentUtil; import net.minecraft.block.Block; import net.minecraft.client.resources.I18n; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -29,8 +26,10 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public abstract class ToolAbility { - - public abstract void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool); + + //how to potentially save this: cancel the event/operation so that ItemInWorldManager's harvest method falls short, then recreate it with a more sensible structure + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { } + public void onDigPost(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { } public abstract String getName(); public abstract String getFullName(); public abstract String getExtension(); @@ -47,7 +46,7 @@ public abstract class ToolAbility { private Set pos = new HashSet(); @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { Block b = world.getBlock(x, y, z); @@ -161,7 +160,7 @@ public abstract class ToolAbility { } @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { for(int a = x - range; a <= x + range; a++) { for(int b = y - range; b <= y + range; b++) { @@ -200,7 +199,7 @@ public abstract class ToolAbility { public static class SilkAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { /*//if the tool is already enchanted, do nothing if(EnchantmentHelper.getSilkTouchModifier(player) || player.getHeldItem() == null) @@ -216,7 +215,7 @@ public abstract class ToolAbility { world.setBlockToAir(x, y, z); player.getHeldItem().damageItem(1, player);*/ - tool.breakBlockSpecial(world, x, y, z, block, meta, player, 0, true); + //tool.breakBlockSpecial(world, x, y, z, block, meta, player, 0, true); //TODO: replace } @Override @@ -249,7 +248,7 @@ public abstract class ToolAbility { } @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { /*//if the tool is already enchanted, do nothing if(EnchantmentHelper.getFortuneModifier(player) > 0 || player.getHeldItem() == null) @@ -267,7 +266,7 @@ public abstract class ToolAbility { - tool.breakBlockSpecial(world, x, y, z, block, meta, player, luck, false); + //tool.breakBlockSpecial(world, x, y, z, block, meta, player, luck, false); //TODO: replace } @Override @@ -294,7 +293,7 @@ public abstract class ToolAbility { public static class SmelterAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { List drops = block.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0); @@ -340,7 +339,7 @@ public abstract class ToolAbility { public static class ShredderAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -380,7 +379,7 @@ public abstract class ToolAbility { public static class CentrifugeAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -424,7 +423,7 @@ public abstract class ToolAbility { public static class CrystallizerAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -464,7 +463,7 @@ public abstract class ToolAbility { public static class MercuryAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -514,7 +513,7 @@ public abstract class ToolAbility { } @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { ExplosionNT ex = new ExplosionNT(player.worldObj, player, x + 0.5, y + 0.5, z + 0.5, strength); ex.addAttrib(ExAttrib.ALLDROP); diff --git a/src/main/java/com/hbm/inventory/container/ContainerCraneUnboxer.java b/src/main/java/com/hbm/inventory/container/ContainerCraneUnboxer.java index 75f2bf242..56a0ad217 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCraneUnboxer.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCraneUnboxer.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; public class ContainerCraneUnboxer extends Container { @@ -36,6 +37,35 @@ public class ContainerCraneUnboxer extends Container { } } + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= unboxer.getSizeInventory() - 1) { + if(!this.mergeItemStack(var5, unboxer.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else if(!this.mergeItemStack(var5, 0, unboxer.getSizeInventory(), false)) { + return null; + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + + var4.onPickupFromSlot(p_82846_1_, var5); + } + + return var3; + } + @Override public boolean canInteractWith(EntityPlayer player) { return unboxer.isUseableByPlayer(player); diff --git a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java index eb385d6cc..538047e74 100644 --- a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java @@ -169,7 +169,7 @@ public class CyclotronRecipes extends SerializableRecipe { AStack inStack = this.readAStack(input); ItemStack outStack = this.readItemStack(output); - this.recipes.put(new Pair(partStack, inStack), new Pair(outStack, antimatter)); + this.recipes.put(new Pair(new ComparableStack(partStack), inStack), new Pair(outStack, antimatter)); } @Override diff --git a/src/main/java/com/hbm/items/tool/IItemAbility.java b/src/main/java/com/hbm/items/tool/IItemAbility.java index ff738c923..00f5cefab 100644 --- a/src/main/java/com/hbm/items/tool/IItemAbility.java +++ b/src/main/java/com/hbm/items/tool/IItemAbility.java @@ -1,22 +1,15 @@ package com.hbm.items.tool; -import java.util.ArrayList; - import net.minecraft.block.Block; import net.minecraft.client.Minecraft; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.network.play.client.C07PacketPlayerDigging; import net.minecraft.network.play.server.S23PacketBlockChange; -import net.minecraft.stats.StatList; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.world.BlockEvent; public interface IItemAbility { @@ -93,113 +86,4 @@ public interface IItemAbility { Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C07PacketPlayerDigging(2, x, y, z, Minecraft.getMinecraft().objectMouseOver.sideHit)); } } - - public default void breakBlockSpecial(World world, int x, int y, int z, Block block, int meta, EntityPlayer playerEntity, int fortune, boolean silkTouch) { - - if(world.isAirBlock(x, y, z)) - return; - - if(!(playerEntity instanceof EntityPlayerMP)) - return; - - EntityPlayerMP player = (EntityPlayerMP) playerEntity; - - if(!ForgeHooks.canHarvestBlock(block, player, meta)) - return; - - BlockEvent.BreakEvent event = ForgeHooks.onBlockBreakEvent(world, player.theItemInWorldManager.getGameType(), player, x, y, z); - if(event.isCanceled()) - return; - - if(player.capabilities.isCreativeMode) { - block.onBlockHarvested(world, x, y, z, meta, player); - if(block.removedByPlayer(world, player, x, y, z, false)) - block.onBlockDestroyedByPlayer(world, x, y, z, meta); - - if(!world.isRemote) { - player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world)); - } - return; - } - - player.getCurrentEquippedItem().func_150999_a(world, block, x, y, z, player); - - if(!world.isRemote) { - - block.onBlockHarvested(world, x, y, z, meta, player); - - if(block.removedByPlayer(world, player, x, y, z, true)) { - block.onBlockDestroyedByPlayer(world, x, y, z, meta); - harvestBlock(world, player, x, y, z, block, meta, fortune, silkTouch); - if(!silkTouch) block.dropXpOnBlockBreak(world, x, y, z, event.getExpToDrop()); - } - - player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world)); - - } else { - world.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(block) + (meta << 12)); - if(block.removedByPlayer(world, player, x, y, z, true)) { - block.onBlockDestroyedByPlayer(world, x, y, z, meta); - } - ItemStack itemstack = player.getCurrentEquippedItem(); - if(itemstack != null) { - itemstack.func_150999_a(world, block, x, y, z, player); - - if(itemstack.stackSize == 0) { - player.destroyCurrentEquippedItem(); - } - } - - Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C07PacketPlayerDigging(2, x, y, z, Minecraft.getMinecraft().objectMouseOver.sideHit)); - } - } - - public default void harvestBlock(World world, EntityPlayer player, int x, int y, int z, Block block, int meta, int fortune, boolean silkTouch) { - - player.addStat(StatList.mineBlockStatArray[block.getIdFromBlock(block)], 1); - player.addExhaustion(0.025F); - - if(block.canSilkHarvest(world, player, x, y, z, meta) && silkTouch) { - ArrayList items = new ArrayList(); - //block.createStackedBlock(meta); - - /// createStackedBlock /// - int j = 0; - Item item = Item.getItemFromBlock(block); - if(item != null && item.getHasSubtypes()) { - j = meta; - } - ItemStack itemstack = new ItemStack(item, 1, j); - /// createStackedBlock /// - - if(itemstack != null) { - items.add(itemstack); - } - - ForgeEventFactory.fireBlockHarvesting(items, world, block, x, y, z, meta, 0, 1.0f, true, player); - for(ItemStack is : items) { - dropBlockAsItem(world, x, y, z, is); - } - } else { - //block.harvesters.set(player); - block.dropBlockAsItem(world, x, y, z, meta, fortune); - //block.harvesters.set(null); - } - } - - public default void dropBlockAsItem(World world, int x, int y, int z, ItemStack stack) { - if(!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops") && !world.restoringBlockSnapshots) { - /*if(captureDrops.get()) { - capturedDrops.get().add(stack); - return; - }*/ - float f = 0.7F; - double d0 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - double d1 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - double d2 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - EntityItem entityitem = new EntityItem(world, (double) x + d0, (double) y + d1, (double) z + d2, stack); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - } - } } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index c6b7e4276..81e8d1a13 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -130,11 +130,16 @@ public class ItemToolAbility extends ItemTool implements IItemAbility, IDepthRoc int meta = world.getBlockMetadata(x, y, z); if(!world.isRemote && canHarvestBlock(block, stack) && this.getCurrentAbility(stack) != null && canOperate(stack)) - this.getCurrentAbility(stack).onDig(world, x, y, z, player, block, meta, this); + this.getCurrentAbility(stack).onDigPre(world, x, y, z, player, block, meta, this); return false; } + @Override + public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase player) { + return false; + } + @Override public float getDigSpeed(ItemStack stack, Block block, int meta) { From 8c4495741c0c79a8167cf162a8e07dea92701729 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 18 Aug 2022 11:02:54 +0200 Subject: [PATCH 011/111] new fillable item system, armor slots for mod table --- .../java/api/hbm/fluid/IFillableItem.java | 17 +++ .../api/hbm/fluid/IFluidStandardReceiver.java | 2 +- .../api/hbm/fluid/IFluidStandardSender.java | 2 +- .../hbm/fluid/IFluidStandardTransceiver.java | 2 +- .../hbm/blocks/machine/rbmk/RBMKHeatex.java | 2 +- .../hbm/interfaces/IPartiallyFillable.java | 1 + .../container/ContainerArmorTable.java | 37 ++++- .../com/hbm/inventory/fluid/FluidType.java | 2 +- .../fluid/tank/FluidLoaderFillableItem.java | 69 +++++++++ .../fluid/tank/FluidLoaderStandard.java | 90 ++++++++++++ .../fluid/tank/FluidLoadingHandler.java | 9 ++ .../inventory/{ => fluid/tank}/FluidTank.java | 139 ++++++++++++------ .../fluid/trait/FT_VentRadiation.java | 2 +- .../hbm/inventory/fluid/trait/FluidTrait.java | 2 +- .../com/hbm/inventory/gui/GUIAMSBase.java | 2 +- .../com/hbm/inventory/gui/GUIAMSEmitter.java | 2 +- .../com/hbm/inventory/gui/GUIAMSLimiter.java | 2 +- .../java/com/hbm/inventory/gui/GUIBarrel.java | 2 +- .../java/com/hbm/inventory/gui/GUICore.java | 2 +- .../com/hbm/inventory/gui/GUICoreEmitter.java | 2 +- .../hbm/inventory/gui/GUICoreInjector.java | 2 +- .../hbm/inventory/gui/GUICoreReceiver.java | 2 +- .../hbm/inventory/gui/GUICrystallizer.java | 2 +- .../com/hbm/inventory/gui/GUIFWatzCore.java | 2 +- .../com/hbm/inventory/gui/GUIIGenerator.java | 2 +- .../java/com/hbm/inventory/gui/GUIITER.java | 2 +- .../com/hbm/inventory/gui/GUILiquefactor.java | 2 +- .../hbm/inventory/gui/GUIMachineBoiler.java | 2 +- .../gui/GUIMachineBoilerElectric.java | 2 +- .../inventory/gui/GUIMachineCMBFactory.java | 2 +- .../com/hbm/inventory/gui/GUIMachineCoal.java | 2 +- .../gui/GUIMachineCompactLauncher.java | 2 +- .../inventory/gui/GUIMachineCyclotron.java | 2 +- .../hbm/inventory/gui/GUIMachineDiesel.java | 2 +- .../inventory/gui/GUIMachineFluidTank.java | 2 +- .../hbm/inventory/gui/GUIMachineGasCent.java | 2 +- .../inventory/gui/GUIMachineGenerator.java | 2 +- .../hbm/inventory/gui/GUIMachineInserter.java | 2 +- .../inventory/gui/GUIMachineLargeTurbine.java | 2 +- .../inventory/gui/GUIMachineLaunchTable.java | 2 +- .../hbm/inventory/gui/GUIMachineOilWell.java | 2 +- .../hbm/inventory/gui/GUIMachinePuF6Tank.java | 2 +- .../hbm/inventory/gui/GUIMachineRefinery.java | 2 +- .../hbm/inventory/gui/GUIMachineSelenium.java | 2 +- .../hbm/inventory/gui/GUIMachineTurbine.java | 2 +- .../hbm/inventory/gui/GUIMachineUF6Tank.java | 2 +- .../com/hbm/inventory/gui/GUIMiningLaser.java | 2 +- .../hbm/inventory/gui/GUIPlasmaHeater.java | 2 +- .../com/hbm/inventory/gui/GUIRadiolysis.java | 2 +- .../inventory/gui/GUIReactorMultiblock.java | 2 +- .../hbm/inventory/gui/GUISoyuzLauncher.java | 2 +- .../com/hbm/inventory/gui/GUITurretFritz.java | 2 +- .../com/hbm/inventory/gui/GUIWatzCore.java | 2 +- .../com/hbm/items/armor/ArmorFSBFueled.java | 44 ++++-- .../java/com/hbm/items/tool/ItemAnalyzer.java | 2 +- .../bomb/TileEntityCompactLauncher.java | 2 +- .../bomb/TileEntityLaunchTable.java | 2 +- .../tileentity/machine/TileEntityAMSBase.java | 2 +- .../machine/TileEntityAMSEmitter.java | 2 +- .../machine/TileEntityAMSLimiter.java | 2 +- .../tileentity/machine/TileEntityChungus.java | 2 +- .../machine/TileEntityCondenser.java | 2 +- .../tileentity/machine/TileEntityCore.java | 2 +- .../machine/TileEntityCoreEmitter.java | 2 +- .../machine/TileEntityCoreInjector.java | 2 +- .../machine/TileEntityCoreReceiver.java | 2 +- .../machine/TileEntityDeuteriumExtractor.java | 2 +- .../machine/TileEntityDeuteriumTower.java | 2 +- .../machine/TileEntityElectrolyser.java | 2 +- .../machine/TileEntityFWatzCore.java | 2 +- .../machine/TileEntityHeaterOilburner.java | 2 +- .../tileentity/machine/TileEntityITER.java | 2 +- .../machine/TileEntityMachineAssemfac.java | 2 +- .../machine/TileEntityMachineBoiler.java | 2 +- .../TileEntityMachineBoilerElectric.java | 2 +- .../machine/TileEntityMachineCMBFactory.java | 2 +- .../machine/TileEntityMachineChemfac.java | 2 +- .../machine/TileEntityMachineChemplant.java | 2 +- .../TileEntityMachineChemplantBase.java | 2 +- .../machine/TileEntityMachineCoal.java | 2 +- .../TileEntityMachineCrystallizer.java | 2 +- .../machine/TileEntityMachineCyclotron.java | 2 +- .../machine/TileEntityMachineDiesel.java | 2 +- .../machine/TileEntityMachineGasCent.java | 2 +- .../machine/TileEntityMachineGenerator.java | 2 +- .../machine/TileEntityMachineIGenerator.java | 2 +- .../machine/TileEntityMachineInserter.java | 2 +- .../TileEntityMachineLargeTurbine.java | 2 +- .../machine/TileEntityMachineMiningLaser.java | 2 +- .../TileEntityMachinePlasmaHeater.java | 2 +- .../machine/TileEntityMachineRadiolysis.java | 2 +- .../TileEntityMachineReactorLarge.java | 2 +- .../TileEntityMachineSeleniumEngine.java | 2 +- .../machine/TileEntityMachineTurbine.java | 2 +- .../machine/TileEntityMachineTurbofan.java | 2 +- .../machine/TileEntityReactorResearch.java | 2 +- .../machine/TileEntityReactorZirnox.java | 2 +- .../tileentity/machine/TileEntitySILEX.java | 2 +- .../machine/TileEntitySolarBoiler.java | 2 +- .../machine/TileEntitySoyuzLauncher.java | 2 +- .../machine/TileEntityStorageDrum.java | 2 +- .../machine/TileEntityTowerLarge.java | 2 +- .../machine/TileEntityTowerSmall.java | 2 +- .../machine/TileEntityWatzCore.java | 2 +- .../TileEntityMachineCatalyticCracker.java | 2 +- .../oil/TileEntityMachineFrackingTower.java | 2 +- .../oil/TileEntityMachineFractionTower.java | 2 +- .../oil/TileEntityMachineGasFlare.java | 2 +- .../oil/TileEntityMachineLiquefactor.java | 2 +- .../oil/TileEntityMachineRefinery.java | 2 +- .../oil/TileEntityMachineSolidifier.java | 2 +- .../machine/oil/TileEntityOilDrillBase.java | 2 +- .../machine/rbmk/TileEntityHeatex.java | 2 +- .../machine/rbmk/TileEntityRBMKBoiler.java | 2 +- .../machine/rbmk/TileEntityRBMKCooler.java | 2 +- .../machine/rbmk/TileEntityRBMKHeater.java | 2 +- .../machine/rbmk/TileEntityRBMKInlet.java | 2 +- .../machine/rbmk/TileEntityRBMKOutgasser.java | 2 +- .../machine/rbmk/TileEntityRBMKOutlet.java | 2 +- .../machine/storage/TileEntityBarrel.java | 2 +- .../storage/TileEntityMachineFluidTank.java | 2 +- .../storage/TileEntityMachinePuF6Tank.java | 2 +- .../storage/TileEntityMachineUF6Tank.java | 2 +- .../turret/TileEntityTurretFritz.java | 2 +- src/main/java/com/hbm/util/HeatUtil.java | 2 +- .../gui/machine/gui_armor_modifier.png | Bin 2894 -> 3019 bytes 126 files changed, 455 insertions(+), 185 deletions(-) create mode 100644 src/main/java/api/hbm/fluid/IFillableItem.java create mode 100644 src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java create mode 100644 src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java create mode 100644 src/main/java/com/hbm/inventory/fluid/tank/FluidLoadingHandler.java rename src/main/java/com/hbm/inventory/{ => fluid/tank}/FluidTank.java (78%) diff --git a/src/main/java/api/hbm/fluid/IFillableItem.java b/src/main/java/api/hbm/fluid/IFillableItem.java new file mode 100644 index 000000000..8818946ce --- /dev/null +++ b/src/main/java/api/hbm/fluid/IFillableItem.java @@ -0,0 +1,17 @@ +package api.hbm.fluid; + +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.item.ItemStack; + +public interface IFillableItem { + + /** Whether this stack can be filled with this type. Not particularly useful for normal operations */ + public boolean acceptsFluid(FluidType type, ItemStack stack); + /** Tries to fill the stack, returns the remainder that couldn't be added */ + public int tryFill(FluidType type, int amount, ItemStack stack); + /** Whether this stack can fill tiles with this type. Not particularly useful for normal operations */ + public boolean providesFluid(FluidType type, ItemStack stack); + /** Provides fluid with the maximum being the requested amount */ + public int tryEmpty(FluidType type, int amount, ItemStack stack); +} diff --git a/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java b/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java index 2d198d1f4..e60aca9cd 100644 --- a/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java +++ b/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java @@ -1,7 +1,7 @@ package api.hbm.fluid; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; /** * Uses default implementation to make the underlying interfaces easier to use for the most common fluid users. diff --git a/src/main/java/api/hbm/fluid/IFluidStandardSender.java b/src/main/java/api/hbm/fluid/IFluidStandardSender.java index 6f6ef8238..46baee9da 100644 --- a/src/main/java/api/hbm/fluid/IFluidStandardSender.java +++ b/src/main/java/api/hbm/fluid/IFluidStandardSender.java @@ -1,7 +1,7 @@ package api.hbm.fluid; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; /** * Uses default implementation to make the underlying interfaces easier to use for the most common fluid users. diff --git a/src/main/java/api/hbm/fluid/IFluidStandardTransceiver.java b/src/main/java/api/hbm/fluid/IFluidStandardTransceiver.java index c9a40221f..4cbe6b0a4 100644 --- a/src/main/java/api/hbm/fluid/IFluidStandardTransceiver.java +++ b/src/main/java/api/hbm/fluid/IFluidStandardTransceiver.java @@ -1,7 +1,7 @@ package api.hbm.fluid; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; /** * transceiver [trăn-sē′vər], noun diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java index a1a99bc8d..ebed34c7b 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.ILookOverlay; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.rbmk.TileEntityHeatex; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKHeater; diff --git a/src/main/java/com/hbm/interfaces/IPartiallyFillable.java b/src/main/java/com/hbm/interfaces/IPartiallyFillable.java index 57ebd39a4..f35f1df6a 100644 --- a/src/main/java/com/hbm/interfaces/IPartiallyFillable.java +++ b/src/main/java/com/hbm/interfaces/IPartiallyFillable.java @@ -4,6 +4,7 @@ import com.hbm.inventory.fluid.FluidType; import net.minecraft.item.ItemStack; +@Deprecated public interface IPartiallyFillable { public FluidType getType(ItemStack stack); diff --git a/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java b/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java index 44293e339..ab6baa31b 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java +++ b/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java @@ -3,6 +3,8 @@ package com.hbm.inventory.container; import com.hbm.handler.ArmorModHandler; import com.hbm.items.armor.ItemArmorMod; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -12,6 +14,7 @@ import net.minecraft.inventory.InventoryCraftResult; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; public class ContainerArmorTable extends Container { @@ -19,6 +22,7 @@ public class ContainerArmorTable extends Container { public IInventory armor = new InventoryCraftResult(); public ContainerArmorTable(InventoryPlayer inventory) { + EntityPlayer player = inventory.player; this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.helmet_only, 26, 27)); // helmet only this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.plate_only, 62, 27)); // chestplate only @@ -72,16 +76,35 @@ public class ContainerArmorTable extends Container { } }); - for(int i = 0; i < 3; i++) - { - for(int j = 0; j < 9; j++) - { + //player armor slots for easy accessibility + for(int i = 0; i < 4; ++i) { + final int k = i; + this.addSlotToContainer(new Slot(inventory, inventory.getSizeInventory() - 1 - i, -18, 36 + i * 18) { + + public int getSlotStackLimit() { + return 1; + } + + public boolean isItemValid(ItemStack stack) { + if(stack == null) + return false; + return stack.getItem().isValidArmor(stack, k, player); + } + + @SideOnly(Side.CLIENT) + public IIcon getBackgroundIconIndex() { + return ItemArmor.func_94602_b(k); + } + }); + } + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18 + 56)); } } - - for(int i = 0; i < 9; i++) - { + + for(int i = 0; i < 9; i++) { this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 142 + 56)); } diff --git a/src/main/java/com/hbm/inventory/fluid/FluidType.java b/src/main/java/com/hbm/inventory/fluid/FluidType.java index d206d5271..594444144 100644 --- a/src/main/java/com/hbm/inventory/fluid/FluidType.java +++ b/src/main/java/com/hbm/inventory/fluid/FluidType.java @@ -11,7 +11,7 @@ import org.lwjgl.input.Keyboard; import java.util.Set; -import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.*; import com.hbm.inventory.fluid.trait.FluidTraitSimple.*; import com.hbm.lib.RefStrings; diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java new file mode 100644 index 000000000..787abe844 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java @@ -0,0 +1,69 @@ +package com.hbm.inventory.fluid.tank; + +import com.hbm.handler.ArmorModHandler; +import com.hbm.inventory.fluid.FluidType; + +import api.hbm.fluid.IFillableItem; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; + +public class FluidLoaderFillableItem extends FluidLoadingHandler { + + @Override + public boolean fillItem(ItemStack[] slots, int in, int out, FluidTank tank) { + return fill(slots[in], tank); + } + + public boolean fill(ItemStack stack, FluidTank tank) { + + FluidType type = tank.getTankType(); + + if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { + for(ItemStack mod : ArmorModHandler.pryMods(stack)) { + + if(mod != null && mod.getItem() instanceof IFillableItem) { + fill(mod, tank); + } + } + } + + if(!(stack.getItem() instanceof IFillableItem)) return false; + + IFillableItem fillable = (IFillableItem) stack.getItem(); + + if(fillable.acceptsFluid(type, stack)) { + tank.setFill(fillable.tryFill(type, tank.getFill(), stack)); + } + + return true; + } + + @Override + public boolean emptyItem(ItemStack[] slots, int in, int out, FluidTank tank) { + return empty(slots[in], tank); + } + + public boolean empty(ItemStack stack, FluidTank tank) { + + FluidType type = tank.getTankType(); + + if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { + for(ItemStack mod : ArmorModHandler.pryMods(stack)) { + + if(mod != null && mod.getItem() instanceof IFillableItem) { + empty(mod, tank); + } + } + } + + if(!(stack.getItem() instanceof IFillableItem)) return false; + + IFillableItem fillable = (IFillableItem) stack.getItem(); + + if(fillable.providesFluid(type, stack)) { + tank.setFill(tank.getFill() + fillable.tryEmpty(type, tank.getMaxFill() - tank.getFill(), stack)); + } + + return tank.getFill() == tank.getMaxFill(); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java new file mode 100644 index 000000000..78a46441a --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java @@ -0,0 +1,90 @@ +package com.hbm.inventory.fluid.tank; + +import com.hbm.inventory.FluidContainerRegistry; +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.item.ItemStack; + +public class FluidLoaderStandard extends FluidLoadingHandler { + + @Override + public boolean fillItem(ItemStack[] slots, int in, int out, FluidTank tank) { + + if(slots[in] == null) + return true; + + FluidType type = tank.getTankType(); + ItemStack full = FluidContainerRegistry.getFullContainer(slots[in], type); + + if(slots[in] != null && tank.getFill() - FluidContainerRegistry.getFluidContent(full, type) >= 0) { + + ItemStack fullContainer = FluidContainerRegistry.getFullContainer(slots[in], type); + + if(slots[out] == null) { + + tank.setFill(tank.getFill() - FluidContainerRegistry.getFluidContent(full, type)); + slots[out] = full.copy(); + slots[in].stackSize--; + if(slots[in].stackSize <= 0) { + slots[in] = null; + } + + } else if(slots[out] != null && slots[out].getItem() == fullContainer.getItem() && slots[out].getItemDamage() == fullContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()) { + + tank.setFill(tank.getFill() - FluidContainerRegistry.getFluidContent(full, type)); + slots[in].stackSize--; + + if(slots[in].stackSize <= 0) { + slots[in] = null; + } + slots[out].stackSize++; + } + } + + return false; + } + + @Override + public boolean emptyItem(ItemStack[] slots, int in, int out, FluidTank tank) { + + if(slots[in] == null) + return true; + + FluidType type = tank.getTankType(); + int amount = FluidContainerRegistry.getFluidContent(slots[in], type); + + if(amount > 0 && tank.getFill() + amount <= tank.maxFluid) { + + ItemStack emptyContainer = FluidContainerRegistry.getEmptyContainer(slots[in]); + + if(slots[out] == null) { + + tank.setFill(tank.getFill() + amount); + slots[out] = emptyContainer; + + slots[in].stackSize--; + if(slots[in].stackSize <= 0) { + slots[in] = null; + } + + } else if(slots[out] != null && (emptyContainer == null || (slots[out].getItem() == emptyContainer.getItem() && slots[out].getItemDamage() == emptyContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()))) { + + tank.setFill(tank.getFill() + amount); + slots[in].stackSize--; + + if(slots[in].stackSize <= 0) { + slots[in] = null; + } + + if(emptyContainer != null) { + slots[out].stackSize++; + } + } + + return true; + } + + return false; + } + +} diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoadingHandler.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoadingHandler.java new file mode 100644 index 000000000..f07c803b9 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoadingHandler.java @@ -0,0 +1,9 @@ +package com.hbm.inventory.fluid.tank; + +import net.minecraft.item.ItemStack; + +public abstract class FluidLoadingHandler { + + public abstract boolean fillItem(ItemStack[] slots, int in, int out, FluidTank tank); + public abstract boolean emptyItem(ItemStack[] slots, int in, int out, FluidTank tank); +} diff --git a/src/main/java/com/hbm/inventory/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java similarity index 78% rename from src/main/java/com/hbm/inventory/FluidTank.java rename to src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index e426df201..efe0e61c4 100644 --- a/src/main/java/com/hbm/inventory/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -1,4 +1,4 @@ -package com.hbm.inventory; +package com.hbm.inventory.fluid.tank; import java.util.ArrayList; import java.util.List; @@ -7,6 +7,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.handler.ArmorModHandler; import com.hbm.interfaces.IPartiallyFillable; +import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.gui.GuiInfoContainer; @@ -16,6 +17,7 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.TEFluidPacket; +import api.hbm.fluid.IFillableItem; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; @@ -52,7 +54,6 @@ public class FluidTank { } public FluidType getTankType() { - return type; } @@ -158,60 +159,18 @@ public class FluidTank { ItemStack full = null; if(slots[in] != null) { - ItemStack partial = slots[in]; - - if(partial.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(partial)) { - - partial = ArmorModHandler.pryMods(partial)[ArmorModHandler.plate_only]; - - if(partial == null) - partial = slots[in]; - } - - if(partial.getItem() instanceof IPartiallyFillable) { - IPartiallyFillable fillable = (IPartiallyFillable)partial.getItem(); - int speed = fillable.getLoadSpeed(partial); - - if(fillable.getType(partial) == this.type && speed > 0) { - - int toLoad = Math.min(this.fluid, speed); - int fill = fillable.getFill(partial); - toLoad = Math.min(toLoad, fillable.getMaxFill(partial) - fill); - - if(toLoad > 0) { - this.fluid -= toLoad; - fillable.setFill(partial, fill + toLoad); - } - } - - if(slots[in].getItem() instanceof ItemArmor && partial.getItem() instanceof ItemArmorMod) { - ArmorModHandler.applyMod(slots[in], partial); - } - + if(this.handleFillableUnload(slots, in)) return; - } - if(slots[in].getItem() == ModItems.fluid_barrel_infinite) { - this.fluid = 0; + if(this.handleInfiniteUnload(slots, in)) return; - } - if(slots[in].getItem() == ModItems.inf_water && type == Fluids.WATER) { - this.fluid -= 50; - if(this.fluid < 0) - this.fluid = 0; + if(this.handleNewFillableUnload(slots[in])) return; - } - - if(slots[in].getItem() == ModItems.inf_water_mk2 && type == Fluids.WATER) { - this.fluid -= 500; - if(this.fluid < 0) - this.fluid = 0; - return; - } full = FluidContainerRegistry.getFullContainer(slots[in], type); } + if(full == null) return; @@ -232,6 +191,90 @@ public class FluidTank { } } } + + public boolean handleFillableUnload(ItemStack[] slots, int in) { + + ItemStack partial = slots[in]; + + if(partial.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(partial)) { + + partial = ArmorModHandler.pryMods(partial)[ArmorModHandler.plate_only]; + + if(partial == null) + partial = slots[in]; + } + + if(partial.getItem() instanceof IPartiallyFillable) { + IPartiallyFillable fillable = (IPartiallyFillable)partial.getItem(); + int speed = fillable.getLoadSpeed(partial); + + if(fillable.getType(partial) == this.type && speed > 0) { + + int toLoad = Math.min(this.fluid, speed); + int fill = fillable.getFill(partial); + toLoad = Math.min(toLoad, fillable.getMaxFill(partial) - fill); + + if(toLoad > 0) { + this.fluid -= toLoad; + fillable.setFill(partial, fill + toLoad); + } + } + + if(slots[in].getItem() instanceof ItemArmor && partial.getItem() instanceof ItemArmorMod) { + ArmorModHandler.applyMod(slots[in], partial); + } + + return true; + } + + return false; + } + + public boolean handleInfiniteUnload(ItemStack[] slots, int in) { + + if(slots[in].getItem() == ModItems.fluid_barrel_infinite) { + this.fluid = 0; + return true; + } + + if(slots[in].getItem() == ModItems.inf_water && type == Fluids.WATER) { + this.fluid -= 50; + if(this.fluid < 0) + this.fluid = 0; + return true; + } + + if(slots[in].getItem() == ModItems.inf_water_mk2 && type == Fluids.WATER) { + this.fluid -= 500; + if(this.fluid < 0) + this.fluid = 0; + return true; + } + + return false; + } + + public boolean handleNewFillableUnload(ItemStack stack) { + + if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { + for(ItemStack mod : ArmorModHandler.pryMods(stack)) { + + if(mod != null && mod.getItem() instanceof IFillableItem) { + handleNewFillableUnload(mod); + } + } + } + + if(!(stack.getItem() instanceof IFillableItem)) return false; + + IFillableItem fillable = (IFillableItem) stack.getItem(); + + if(fillable.acceptsFluid(getTankType(), stack)) { + this.setFill(fillable.tryFill(type, this.getFill(), stack)); + } + + return true; + } public boolean setType(int in, ItemStack[] slots) { return setType(in, in, slots); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java index 9f0fbe476..9126aea5d 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java @@ -1,7 +1,7 @@ package com.hbm.inventory.fluid.trait; import com.hbm.handler.radiation.ChunkRadiationManager; -import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java index 4b407b48e..128e945b0 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java @@ -2,7 +2,7 @@ package com.hbm.inventory.fluid.trait; import java.util.List; -import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/inventory/gui/GUIAMSBase.java b/src/main/java/com/hbm/inventory/gui/GUIAMSBase.java index 0e9ccc27e..35f522588 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAMSBase.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAMSBase.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerAMSBase; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityAMSBase; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIAMSEmitter.java b/src/main/java/com/hbm/inventory/gui/GUIAMSEmitter.java index 522a3da4e..036b610a4 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAMSEmitter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAMSEmitter.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerAMSEmitter; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityAMSEmitter; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIAMSLimiter.java b/src/main/java/com/hbm/inventory/gui/GUIAMSLimiter.java index c3717774b..6a6ff3757 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAMSLimiter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAMSLimiter.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerAMSLimiter; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityAMSLimiter; diff --git a/src/main/java/com/hbm/inventory/gui/GUIBarrel.java b/src/main/java/com/hbm/inventory/gui/GUIBarrel.java index e197a1d3b..4b52a4f29 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIBarrel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIBarrel.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerBarrel; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUICore.java b/src/main/java/com/hbm/inventory/gui/GUICore.java index 7e54f413a..f10382b55 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICore.java +++ b/src/main/java/com/hbm/inventory/gui/GUICore.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCore; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCore; diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java index f775e92c9..e9857b08a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java @@ -4,8 +4,8 @@ import org.apache.commons.lang3.math.NumberUtils; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCoreEmitter; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreInjector.java b/src/main/java/com/hbm/inventory/gui/GUICoreInjector.java index 74896f066..53de30586 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreInjector.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreInjector.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCoreInjector; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCoreInjector; diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreReceiver.java b/src/main/java/com/hbm/inventory/gui/GUICoreReceiver.java index e099104d9..bd849a217 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreReceiver.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreReceiver.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCoreReceiver; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCoreReceiver; import com.hbm.util.BobMathUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java b/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java index 0fa0b39bb..6f1a1d418 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCrystallizer; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineCrystallizer; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java b/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java index 3aa6b4939..92899dc15 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerFWatzCore; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFWatzCore; diff --git a/src/main/java/com/hbm/inventory/gui/GUIIGenerator.java b/src/main/java/com/hbm/inventory/gui/GUIIGenerator.java index ab2a46985..92515e83d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIIGenerator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIIGenerator.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerIGenerator; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineIGenerator; diff --git a/src/main/java/com/hbm/inventory/gui/GUIITER.java b/src/main/java/com/hbm/inventory/gui/GUIITER.java index 4bf14fce3..afce8ac71 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIITER.java +++ b/src/main/java/com/hbm/inventory/gui/GUIITER.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerITER; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUILiquefactor.java b/src/main/java/com/hbm/inventory/gui/GUILiquefactor.java index 102e5ac01..80757c69b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUILiquefactor.java +++ b/src/main/java/com/hbm/inventory/gui/GUILiquefactor.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerLiquefactor; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.oil.TileEntityMachineLiquefactor; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBoiler.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBoiler.java index 63228567a..0360424f2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBoiler.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBoiler.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineBoiler; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineBoiler; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBoilerElectric.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBoilerElectric.java index 2ee4be877..3fd16c846 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBoilerElectric.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBoilerElectric.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineBoilerElectric; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineBoilerElectric; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCMBFactory.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCMBFactory.java index f50281ce6..47369d642 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCMBFactory.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCMBFactory.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineCMBFactory; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineCMBFactory; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java index 0f63fb550..cf06316ed 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java @@ -7,8 +7,8 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineCoal; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineCoal; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCompactLauncher.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCompactLauncher.java index 00c096038..533f600c0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCompactLauncher.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCompactLauncher.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCompactLauncher; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.lib.RefStrings; import com.hbm.render.util.MissileMultipart; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java index 1937020a4..7488de6b0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineCyclotron; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java b/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java index 6ea316099..d1c34d7ad 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java @@ -7,10 +7,10 @@ import java.util.Map.Entry; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineDiesel; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineDiesel; import com.hbm.util.BobMathUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java b/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java index 5563d0a20..358322623 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineFluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineGasCent.java b/src/main/java/com/hbm/inventory/gui/GUIMachineGasCent.java index 8577cbbcd..b5b853cd7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineGasCent.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineGasCent.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineGasCent; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineGasCent; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineGenerator.java b/src/main/java/com/hbm/inventory/gui/GUIMachineGenerator.java index ed98ce875..486fbabdc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineGenerator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineGenerator.java @@ -7,8 +7,8 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerGenerator; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineGenerator; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineInserter.java b/src/main/java/com/hbm/inventory/gui/GUIMachineInserter.java index bc3a2e2aa..b3ab1c226 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineInserter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineInserter.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineInserter; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineInserter; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineLargeTurbine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineLargeTurbine.java index ab0299c1a..d0b12175a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineLargeTurbine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineLargeTurbine.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineLargeTurbine; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineLargeTurbine; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java b/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java index 9cdf56b0b..fbe7f393a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerLaunchTable; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.items.weapon.ItemMissile.PartSize; import com.hbm.lib.RefStrings; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java b/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java index cb978f349..facd91088 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineOilWell; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.oil.TileEntityOilDrillBase; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePuF6Tank.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePuF6Tank.java index e2831808a..b5d02932a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachinePuF6Tank.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePuF6Tank.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerPuF6Tank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.storage.TileEntityMachinePuF6Tank; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineRefinery.java b/src/main/java/com/hbm/inventory/gui/GUIMachineRefinery.java index e88f586eb..c0eb74cc4 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineRefinery.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineRefinery.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineRefinery; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java b/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java index 764c269f7..4a52718ec 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java @@ -6,10 +6,10 @@ import java.util.Map.Entry; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineSelenium; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineDiesel; import com.hbm.tileentity.machine.TileEntityMachineSeleniumEngine; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbine.java index d5ee1d33e..d4603404a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbine.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineTurbine; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineTurbine; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineUF6Tank.java b/src/main/java/com/hbm/inventory/gui/GUIMachineUF6Tank.java index f9bffb001..e9ae176dc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineUF6Tank.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineUF6Tank.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerUF6Tank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.storage.TileEntityMachineUF6Tank; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java b/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java index a8aab0b0a..d0d5194dc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMiningLaser; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIPlasmaHeater.java b/src/main/java/com/hbm/inventory/gui/GUIPlasmaHeater.java index 3397ec832..a292c9fc2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPlasmaHeater.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPlasmaHeater.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMicrowave; import com.hbm.inventory.container.ContainerPlasmaHeater; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIRadiolysis.java b/src/main/java/com/hbm/inventory/gui/GUIRadiolysis.java index c9b621ef1..1a1dfd1e2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRadiolysis.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRadiolysis.java @@ -4,8 +4,8 @@ import java.util.List; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerRadiolysis; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemRTGPellet; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineRadiolysis; diff --git a/src/main/java/com/hbm/inventory/gui/GUIReactorMultiblock.java b/src/main/java/com/hbm/inventory/gui/GUIReactorMultiblock.java index b5f36f45a..a12ad1119 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIReactorMultiblock.java +++ b/src/main/java/com/hbm/inventory/gui/GUIReactorMultiblock.java @@ -2,10 +2,10 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerReactorMultiblock; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java b/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java index 31ee4f315..d6f2ccda9 100644 --- a/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java +++ b/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerSoyuzLauncher; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretFritz.java b/src/main/java/com/hbm/inventory/gui/GUITurretFritz.java index 214431e27..7fb4700fa 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretFritz.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretFritz.java @@ -1,6 +1,6 @@ package com.hbm.inventory.gui; -import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.turret.TileEntityTurretBaseNT; import com.hbm.tileentity.turret.TileEntityTurretFritz; diff --git a/src/main/java/com/hbm/inventory/gui/GUIWatzCore.java b/src/main/java/com/hbm/inventory/gui/GUIWatzCore.java index 535427cda..2ed9d628d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIWatzCore.java +++ b/src/main/java/com/hbm/inventory/gui/GUIWatzCore.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerWatzCore; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityWatzCore; diff --git a/src/main/java/com/hbm/items/armor/ArmorFSBFueled.java b/src/main/java/com/hbm/items/armor/ArmorFSBFueled.java index 7c4a3d885..5f444165e 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSBFueled.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSBFueled.java @@ -2,11 +2,11 @@ package com.hbm.items.armor; import java.util.List; -import com.hbm.interfaces.IPartiallyFillable; import com.hbm.inventory.fluid.FluidType; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; +import api.hbm.fluid.IFillableItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; @@ -14,7 +14,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { +public class ArmorFSBFueled extends ArmorFSB implements IFillableItem { FluidType fuelType; public int maxFuel = 1; @@ -31,12 +31,6 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { this.maxFuel = maxFuel; } - @Override - public FluidType getType(ItemStack stack) { - return this.fuelType; - } - - @Override public int getFill(ItemStack stack) { if(stack.stackTagCompound == null) { stack.stackTagCompound = new NBTTagCompound(); @@ -47,7 +41,6 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { return stack.stackTagCompound.getInteger("fuel"); } - @Override public void setFill(ItemStack stack, int fill) { if(stack.stackTagCompound == null) { stack.stackTagCompound = new NBTTagCompound(); @@ -56,17 +49,14 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { stack.stackTagCompound.setInteger("fuel", fill); } - @Override public int getMaxFill(ItemStack stack) { return this.maxFuel; } - @Override public int getLoadSpeed(ItemStack stack) { return this.fillRate; } - @Override public int getUnloadSpeed(ItemStack stack) { return 0; } @@ -86,7 +76,7 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { super.onArmorTick(world, player, stack); - if(this.drain > 0 && ArmorFSB.hasFSBArmor(player) && !player.capabilities.isCreativeMode) { + if(this.drain > 0 && ArmorFSB.hasFSBArmor(player) && !player.capabilities.isCreativeMode && world.getTotalWorldTime() % 10 == 0) { this.setFill(stack, Math.max(this.getFill(stack) - this.drain, 0)); } } @@ -106,4 +96,32 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { public double getDurabilityForDisplay(ItemStack stack) { return 1 - (double) getFill(stack) / (double) getMaxFill(stack); } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return type == this.fuelType; + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + int toFill = Math.min(amount, this.fillRate); + toFill = Math.min(toFill, this.maxFuel - this.getFill(stack)); + this.setFill(stack, this.getFill(stack) + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return false; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + return 0; + } } diff --git a/src/main/java/com/hbm/items/tool/ItemAnalyzer.java b/src/main/java/com/hbm/items/tool/ItemAnalyzer.java index 64a7856f3..7fa9b84ff 100644 --- a/src/main/java/com/hbm/items/tool/ItemAnalyzer.java +++ b/src/main/java/com/hbm/items/tool/ItemAnalyzer.java @@ -4,7 +4,7 @@ import java.util.List; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidDuct; -import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.TileEntityLockableBase; import com.hbm.tileentity.network.TileEntityPylon; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index cbe1fac9c..4dcd051a4 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -7,9 +7,9 @@ import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.handler.MissileStruct; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.items.weapon.ItemMissile; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index a001e3748..ed6d1216d 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -7,9 +7,9 @@ import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.handler.MissileStruct; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.items.weapon.ItemMissile; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSBase.java index 21748df64..ac27f077c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSBase.java @@ -6,9 +6,9 @@ import java.util.Random; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCatalyst; import com.hbm.items.machine.ItemSatChip; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSEmitter.java index ce834f238..7a3107643 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSEmitter.java @@ -7,9 +7,9 @@ import java.util.Random; import com.hbm.explosion.ExplosionLarge; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSLimiter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSLimiter.java index 519396d26..817398684 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSLimiter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSLimiter.java @@ -5,9 +5,9 @@ import java.util.Random; import com.hbm.explosion.ExplosionLarge; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index 29634935e..e0acee51d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -7,9 +7,9 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.packet.NBTPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index 71df52462..986d3fc10 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -5,9 +5,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.ModEventHandler; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java index 1a38dbc3b..02ae5ab5c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java @@ -4,9 +4,9 @@ import java.util.List; import com.hbm.entity.effect.EntityCloudFleijaRainbow; import com.hbm.entity.logic.EntityNukeExplosionMK3; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCatalyst; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index a4b621ec0..f22952e22 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -3,9 +3,9 @@ package com.hbm.tileentity.machine; import java.util.List; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java index 82e1f9fac..7e592e2b8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.fluid.IFluidStandardReceiver; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java index 905e328b2..8d4edca9d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.List; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.block.ILaserable; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java index 1e9386e0a..66811bd7d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java @@ -5,9 +5,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumTower.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumTower.java index aaba4b26d..cdbb17d91 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumTower.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumTower.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.DirPos; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 0608cff46..ed9135251 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java index 629f746f7..8c6e3ebf3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java @@ -5,9 +5,9 @@ import java.util.Random; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IReactor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java index 3ef49d8d8..6844d9fbf 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java @@ -2,10 +2,10 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IControlReceiver; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerOilburner; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.inventory.gui.GUIOilburner; import com.hbm.tileentity.IGUIProvider; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 63f66db13..8d1a46769 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -10,9 +10,9 @@ import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.BreederRecipes; import com.hbm.inventory.recipes.FusionRecipes; import com.hbm.inventory.recipes.BreederRecipes.BreederRecipe; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java index 54411c4a3..fd7d5a514 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java @@ -7,10 +7,10 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.DirPos; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java index cb61bbd65..8924ebbea 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java @@ -8,9 +8,9 @@ import com.hbm.blocks.machine.MachineBoiler; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.packet.AuxGaugePacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java index 00dd1f73f..e58455769 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java @@ -8,9 +8,9 @@ import com.hbm.blocks.machine.MachineBoiler; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java index 932d78533..544eb884f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java index b64ef2345..d5dfb220d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java @@ -7,10 +7,10 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 7d6ac89fc..38fcb882e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -6,11 +6,11 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java index 032eff15c..83e1f78c3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java @@ -5,10 +5,10 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java index ddb8ca7c8..cdc84f728 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java @@ -13,9 +13,9 @@ import com.hbm.blocks.machine.MachineCoal; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.inventory.FluidContainerRegistry; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index 994332454..2165ed7ee 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.CrystallizerRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index c148caf89..c804d647c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -11,9 +11,9 @@ import com.hbm.explosion.ExplosionLarge; import com.hbm.explosion.ExplosionThermo; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.CyclotronRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index 3acdd525d..905d52a69 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -5,9 +5,9 @@ import java.util.HashMap; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.inventory.FluidContainerRegistry; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Combustible; import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index 6dcf61f47..b90d37d85 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -4,9 +4,9 @@ import java.util.HashMap; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.GasCentrifugeRecipes.PseudoFluidType; import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGenerator.java index 75753dd8c..c84b95db3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGenerator.java @@ -4,8 +4,8 @@ import java.util.Random; import com.hbm.blocks.machine.MachineGenerator; import com.hbm.explosion.ExplosionNukeGeneric; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFuelRod; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index e5e5aa1f0..5b833a10c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.items.ModItems; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineInserter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineInserter.java index 0b002b8d0..3d2756304 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineInserter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineInserter.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java index 16590a571..8bf45b2f1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java @@ -7,9 +7,9 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index a11f0a5c4..816395e8f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -8,10 +8,10 @@ import com.google.common.collect.Sets; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.CentrifugeRecipes; import com.hbm.inventory.recipes.CrystallizerRecipes; import com.hbm.inventory.recipes.ShredderRecipes; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java index 618e3a65c..ad902ff80 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java @@ -7,9 +7,9 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachineITER; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java index 054533238..76e67276d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java @@ -9,9 +9,9 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.RadiolysisRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRTGPellet; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorLarge.java index 9f40cf7fd..b10b12586 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorLarge.java @@ -11,9 +11,9 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFuelRod; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java index 069183b62..0f3e1f754 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java @@ -5,9 +5,9 @@ import java.util.HashMap; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.inventory.FluidContainerRegistry; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Combustible; import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index d21369773..278a6f02b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index ee9581f1b..f98b0de63 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -4,10 +4,10 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Combustible; import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java index c4f34a662..7b6d675be 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java @@ -11,8 +11,8 @@ import com.hbm.config.MobConfig; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPlateFuel; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index af1298e55..ad339c00b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -16,10 +16,10 @@ import com.hbm.interfaces.IControlReceiver; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemZirnoxBreedingRod; import com.hbm.items.machine.ItemZirnoxRod; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java index cdea9c8c2..5114e3130 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java @@ -5,10 +5,10 @@ import java.util.HashMap; import java.util.List; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.SILEXRecipes; import com.hbm.inventory.recipes.SILEXRecipes.SILEXRecipe; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java index 7db3ce4f4..e8b12ca17 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import api.hbm.fluid.IFluidStandardTransceiver; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java index 6407e568e..b4ca97203 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java @@ -7,9 +7,9 @@ import com.hbm.handler.MissileStruct; import com.hbm.entity.missile.EntitySoyuz; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java index 126b9055f..3e8f9c78b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java @@ -8,9 +8,9 @@ import com.hbm.hazard.HazardRegistry; import com.hbm.hazard.HazardSystem; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.special.ItemWasteLong; import com.hbm.items.special.ItemWasteShort; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java index f5a4b067b..2ee2f78ea 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java @@ -1,8 +1,8 @@ package com.hbm.tileentity.machine; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java index 525859f77..05849023a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java @@ -1,8 +1,8 @@ package com.hbm.tileentity.machine; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java index 65352de6c..ab752bc78 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java @@ -11,9 +11,9 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; import com.hbm.interfaces.IReactor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCapacitor; import com.hbm.items.special.WatzFuel; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java index 685e254a2..79b817c37 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java @@ -7,9 +7,9 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.RefineryRecipes; import com.hbm.lib.Library; import com.hbm.tileentity.INBTPacketReceiver; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java index 3ea155659..166307a3f 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine.oil; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.world.feature.OilSpot; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java index d25f42aef..65cb2fbea 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.RefineryRecipes; import com.hbm.lib.Library; import com.hbm.tileentity.INBTPacketReceiver; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index e8622e6ac..29ed47647 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -5,10 +5,10 @@ import java.util.List; import com.hbm.interfaces.IControlReceiver; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous; import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous_ART; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java index 366052a75..941d10cea 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java @@ -6,10 +6,10 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.LiquefactionRecipes; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java index 56c436a5d..4007ec868 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -8,9 +8,9 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.RefineryRecipes; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java index 36fda0b9a..bc5d3cd2f 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java @@ -1,10 +1,10 @@ package com.hbm.tileentity.machine.oil; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.SolidificationRecipes; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java index c89ca43c4..e3bb51550 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java @@ -7,10 +7,10 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java index 5a8eeed9e..dd5708018 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java @@ -5,9 +5,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 985666099..0412c865c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -8,9 +8,9 @@ import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.interfaces.IControlReceiver; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java index 65219f2f8..4e0bd6850 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java @@ -3,9 +3,9 @@ package com.hbm.tileentity.machine.rbmk; import java.util.List; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java index 44c0db5e1..f3b34b64b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java @@ -7,9 +7,9 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java index cb91c1deb..b3c7c0aa2 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java index 44d309f01..132d17c18 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java @@ -8,10 +8,10 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFluidIcon; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java index 63d3aee00..e8559b8d6 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 311df298f..2d68538a7 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -6,10 +6,10 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.ModEventHandler; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index d7a4e2acb..d349901e2 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -6,10 +6,10 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachinePuF6Tank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachinePuF6Tank.java index 1dfe5dc04..e9ba00d48 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachinePuF6Tank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachinePuF6Tank.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.machine.storage; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineUF6Tank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineUF6Tank.java index 9a1d5db6e..9fc7a4ba2 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineUF6Tank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineUF6Tank.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.machine.storage; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java index ceb242aac..484fa0ac2 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java @@ -7,9 +7,9 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/util/HeatUtil.java b/src/main/java/com/hbm/util/HeatUtil.java index 711d3bc6b..cf9434c45 100644 --- a/src/main/java/com/hbm/util/HeatUtil.java +++ b/src/main/java/com/hbm/util/HeatUtil.java @@ -1,7 +1,7 @@ package com.hbm.util; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; public class HeatUtil { diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_armor_modifier.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_armor_modifier.png index 1a9907bdfa8315994e17e1e138c608b06e4e7d10..2834d35692c00f5e8c4c9b7a9743de6cbf4eeebe 100644 GIT binary patch delta 2704 zcmX|@dpr~R8^^yJGEip_uDA9P3K@Fsp(WMQOG5S zblgU|z0Lgb>Ac*wOV(7IPDqf*coa-L)@gH+r}TkgbeSq00s zUtAa%gFv?*a;|hL^{xvO38r`KpbgR*+-vgO316LB9Hi&XZ9)vz+jOO{*Nl9$M7-@w zOSbshkNcf<76e1QEM!e3`gbwLPf%jqI^r@Fpl6Pc_{mr0@C^Ckbz8s{ieeI^ zoW3qD?!sdG`}?sN9SClN9>+n(B+DHRLOEcdM|6mM-*C>F34K}CAKC}HJb<|i3xIGbtk8#W*EU1a= zDE|O>hXE*7htOQ*G{{HPpw?Da%&?MBFV8CNM5E|MYH zjuJxG>PN!tr`Bjg%c7H_v&so%xAIbm55D^>X1D{A7$sAo0U5{DblOz@TwJ8Ps!Q~`CKNtCZa#kiFnWZ+1MU{qaqO1#bqsHP z<=fd_;pOWjT<0gB%%M__Z*#g-Esrm#3l#nr{CUfF^n~mw;CZrzpfc zpd+5ligmsrOXOBH>DEg5Xb8@8az+}ByZ6B7f_|n=L9~>}r`z6>z@D= zKbSL3&9U}& z#BT-%dY6&;627!*DDhk(=EEsj;~6V*Td8kMk6~-s>bf|e#ZPCOC3m>RLLy#ma=CIw z8~5UobMCBK(NK{PziNbYk;;To?$SesG*M?zA6gqr5aphwph-$By10)VM&DuV#d-Ys z^P82B8de=TR{MefS!d5SF#!>sSIP@x_(2(`T6R?F>vK7G{Y}n$reUFEpEArdvUFVk&%b)F7j6ENhoV_2n`UP+oA$Wuxxo zmLfSHZ3V4m*EL>j@HUwbdva3&rO8*ll)EUQZZsxfv(_XU|VglmK+ zdHhc`+aMIv%5t~bH>8nAH9{-rk`kkfx#0G%zWyPV!QF6E`tc{PLdou~_u}EBt7aMI z(A&7IdTXPY)H}n5qf?E9vI*<2CEryTX6=P+dU$&~o#$b+EJ}LxHdn1mN`l{>T}JtZ z6tR`uu53GCJNLtjz(c*A&(1+|2I8Z<(otfg&dlb+Mc+f&N>CW~)d+?2jNQnaEfUWR zp(NUL<16bCi#w~p28-Z{bZO@0ba_ETANRzogFq2 z@;?n=86FEj;b4MMaO=CG@41XvG4l6ZdoZ>87UEWKa`EXSP^~7oDHj=`q6?xP8h40+ zV*#|-FzdmZ0;o7dm2b|gc`ET>2-TDalk?9Yv<$epZ9J%etEO!3_`msI6a|WhzQD9z zc%-r0=Cfl11A_1m2ZLhq&CE-11wRYbiB?{qV>muB;5m=xENA4o1l&{&p{v^e8MGnP z`6m>(mv*%NXMFcj9jrHtgvAD=Zm)pZ;VtV;t6_`(jV@R}Ogj>Zv~>W^1N;9%8Az+9 z1nP-mD_}8rCt4qD?{RBzEY&M#UD9JuP{YLEwn%Akh_&B&fEU|(v=BHs+G~A!)mA8% zHy!mcX>G;iW%TjXOkzDP37?%w^q;;PwyfNCADaW)Oq+zq%q$w>LVwxJY+>M`lddM*&q2?InEC~yl|#A+Q+xuBOGn|3@!5wYotVw)|J@C8s>q?{_vQx0qY zuNZ+pCgTuU0oO#7OCE3O%}IxHf3bu7d!!y#a;A~6rpebbxwDSobrjvHMTdek0%<0R tQmwlZAS)#TDVn0ZE=@~*t2$-JDstcX{L^KJpREJQI%w}=S98GU@;_^|3}65N delta 2555 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 MTRY Date: Thu, 18 Aug 2022 16:16:14 +0200 Subject: [PATCH 012/111] made use of IFillableItem, persistent fluid tanks --- .../java/com/hbm/blocks/BlockDummyable.java | 2 + .../java/com/hbm/blocks/bomb/NukeMike.java | 20 +- .../hbm/blocks/machine/BlockFluidBarrel.java | 31 +++ .../blocks/machine/MachineBigAssTank9000.java | 9 + .../com/hbm/blocks/machine/MachineFENSU.java | 2 + .../hbm/blocks/machine/MachineFluidTank.java | 29 +++ .../java/com/hbm/config/GeneralConfig.java | 12 +- .../java/com/hbm/crafting/ToolRecipes.java | 8 +- .../hbm/inventory/fluid/tank/FluidTank.java | 194 ++++-------------- src/main/java/com/hbm/items/ModItems.java | 23 ++- .../java/com/hbm/items/armor/ArmorDiesel.java | 6 + .../hbm/items/tool/ItemToolAbilityFueled.java | 116 +++++++++++ .../hbm/items/tool/ItemToolAbilityPower.java | 153 +++++++------- .../com/hbm/tileentity/IPersistentNBT.java | 40 ++++ .../machine/storage/TileEntityBarrel.java | 18 +- .../storage/TileEntityMachineFluidTank.java | 18 +- 16 files changed, 407 insertions(+), 274 deletions(-) create mode 100644 src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java create mode 100644 src/main/java/com/hbm/tileentity/IPersistentNBT.java diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 2e3534eac..a8eecd64d 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -7,6 +7,7 @@ import java.util.Random; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.handler.ThreeInts; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -199,6 +200,7 @@ public abstract class BlockDummyable extends BlockContainer { int meta = getMetaForCore(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, (EntityPlayer) player, dir.ordinal() + offset); //lastCore = new BlockPos(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o); world.setBlock(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, this, meta, 3); + IPersistentNBT.restoreData(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, itemStack); fillSpace(world, x, y, z, dir, o); } y -= getHeightOffset(); diff --git a/src/main/java/com/hbm/blocks/bomb/NukeMike.java b/src/main/java/com/hbm/blocks/bomb/NukeMike.java index 458428a74..a1d1d846e 100644 --- a/src/main/java/com/hbm/blocks/bomb/NukeMike.java +++ b/src/main/java/com/hbm/blocks/bomb/NukeMike.java @@ -134,21 +134,11 @@ public class NukeMike extends BlockContainer implements IBomb { world.spawnEntityInWorld(EntityNukeExplosionMK4.statFac(world, BombConfig.mikeRadius, x + 0.5, y + 0.5, z + 0.5)); - if(GeneralConfig.enableNukeClouds) { - EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(world, 1000, r * 0.005F); - entity2.posX = x; - entity2.posY = y; - entity2.posZ = z; - world.spawnEntityInWorld(entity2); - } else { - EntityNukeCloudSmall entity2 = new EntityNukeCloudNoShroom(world, 1000); - entity2.posX = x; - entity2.posY = y - (r / 10); - entity2.posZ = z; - world.spawnEntityInWorld(entity2); - } - - // ExplosionNukeAdvanced.mush(world, x, y, z); + EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(world, 1000, r * 0.005F); + entity2.posX = x; + entity2.posY = y; + entity2.posZ = z; + world.spawnEntityInWorld(entity2); } return false; diff --git a/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java b/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java index 159b10303..8bea5bb4f 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java +++ b/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java @@ -1,9 +1,11 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityBarrel; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -11,11 +13,13 @@ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; @@ -125,4 +129,31 @@ public class BlockFluidBarrel extends BlockContainer { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + super.onBlockPlacedBy(world, x, y, z, player, stack); + IPersistentNBT.restoreData(world, x, y, z, stack); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { + + if(!player.capabilities.isCreativeMode) { + harvesters.set(player); + this.dropBlockAsItem(world, x, y, z, meta, 0); + harvesters.set(null); + } + } + + @Override + public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { + player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); + player.addExhaustion(0.025F); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java index 6f9d58b59..caa8d11c0 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java @@ -1,15 +1,19 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; + import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.storage.TileEntityMachineBAT9000; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -82,4 +86,9 @@ public class MachineBigAssTank9000 extends BlockDummyable { return true; } } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineFENSU.java b/src/main/java/com/hbm/blocks/machine/MachineFENSU.java index 6ba22f976..3860f2096 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFENSU.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFENSU.java @@ -7,6 +7,7 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityMachineBattery; import com.hbm.tileentity.machine.storage.TileEntityMachineFENSU; import com.hbm.util.BobMathUtil; @@ -15,6 +16,7 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; diff --git a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java index 6de4dd1a6..cfa8bbad1 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java @@ -1,11 +1,13 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandler; import com.hbm.interfaces.IMultiblock; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.storage.TileEntityMachineFluidTank; @@ -20,6 +22,7 @@ import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; @@ -257,6 +260,8 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { } else world.func_147480_a(x, y, z, true); } + + IPersistentNBT.restoreData(world, x, y, z, itemStack); } private final Random field_149933_a = new Random(); @@ -313,4 +318,28 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { + + if(!player.capabilities.isCreativeMode) { + harvesters.set(player); + this.dropBlockAsItem(world, x, y, z, meta, 0); + harvesters.set(null); + } + } + + /* + * Called after the block and TE are already gone, so this method is of no use to us. + */ + @Override + public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { + player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); + player.addExhaustion(0.025F); + } } diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 21aa4c875..484d01fc7 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -12,7 +12,6 @@ public class GeneralConfig { public static boolean enableMines = true; public static boolean enableRad = true; public static boolean enableNITAN = true; - public static boolean enableNukeClouds = true; public static boolean enableBomberShortMode = false; public static boolean enableVaults = true; public static boolean enableCataclysm = false; @@ -54,20 +53,19 @@ public class GeneralConfig { final String CATEGORY_GENERAL = CommonConfig.CATEGORY_GENERAL; enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false, "Enable debugging mode").getBoolean(false); - enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false, "Allows mycelium to spread").getBoolean(false); + enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false, "Allows glowing mycelium to spread").getBoolean(false); enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false, "Enables plutonium ore generation in the nether").getBoolean(false); - enableDungeons = config.get(CATEGORY_GENERAL, "1.03_enableDungeonSpawn", true, "Allows custom generation like meteor dungeons and whatnot to spawn").getBoolean(true); + enableDungeons = config.get(CATEGORY_GENERAL, "1.03_enableDungeonSpawn", true, "Allows structures and dungeons to spawn").getBoolean(true); enableMDOres = config.get(CATEGORY_GENERAL, "1.04_enableOresInModdedDimensions", true, "Allows NTM ores to generate in modded dimensions").getBoolean(true); enableMines = config.get(CATEGORY_GENERAL, "1.05_enableLandmineSpawn", true, "Allows landmines to generate").getBoolean(true); enableRad = config.get(CATEGORY_GENERAL, "1.06_enableRadHotspotSpawn", true, "Allows radiation hotspots to generate").getBoolean(true); enableNITAN = config.get(CATEGORY_GENERAL, "1.07_enableNITANChestSpawn", true, "Allows chests to spawn at specific coordinates full of powders").getBoolean(true); - enableNukeClouds = config.get(CATEGORY_GENERAL, "1.08_enableMushroomClouds", true, "Allow these green clouds after nuke explosions").getBoolean(true); enableBomberShortMode = config.get(CATEGORY_GENERAL, "1.14_enableBomberShortMode", false, "Has bomber planes spawn in closer to the target for use with smaller render distances").getBoolean(false); - enableVaults = config.get(CATEGORY_GENERAL, "1.15_enableVaultSpawn", true, "Allows vaults to spawn").getBoolean(true); + enableVaults = config.get(CATEGORY_GENERAL, "1.15_enableVaultSpawn", true, "Allows locked safes to spawn").getBoolean(true); enableCataclysm = config.get(CATEGORY_GENERAL, "1.17_enableCataclysm", false, "Causes satellites to fall whenever a mob dies").getBoolean(false); - enableExtendedLogging = config.get(CATEGORY_GENERAL, "1.18_enableExtendedLogging", false, "Allows logs about nuke, grenade explosions, detonators activated, missiles launched, etc.").getBoolean(false); + enableExtendedLogging = config.get(CATEGORY_GENERAL, "1.18_enableExtendedLogging", false, "Logs uses of the detonator, nuclear explosions, missile launches, grenades, etc.").getBoolean(false); enableHardcoreTaint = config.get(CATEGORY_GENERAL, "1.19_enableHardcoreTaint", false, "Allows tainted mobs to spread taint").getBoolean(false); - enableGuns = config.get(CATEGORY_GENERAL, "1.20_enableGuns", true, "Allows guns to be obtainable").getBoolean(true); + enableGuns = config.get(CATEGORY_GENERAL, "1.20_enableGuns", true, "Prevents new system guns to be fired").getBoolean(true); enableVirus = config.get(CATEGORY_GENERAL, "1.21_enableVirus", false, "Allows virus blocks to spread").getBoolean(false); enableCrosshairs = config.get(CATEGORY_GENERAL, "1.22_enableCrosshairs", true, "Shows custom crosshairs when an NTM gun is being held").getBoolean(true); enableReflectorCompat = config.get(CATEGORY_GENERAL, "1.24_enableReflectorCompat", false, "Enable old reflector oredict name (\"plateDenseLead\") instead of new \"plateTungCar\"").getBoolean(false); diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index b170fe58a..cce37dadf 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -78,13 +78,7 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.mese_pickaxe, 1), new Object[] { " SD", "APS", "FA ", 'S', ModItems.blades_desh, 'D', ModItems.powder_dineutronium, 'A', ModItems.plate_paa, 'P', ModItems.chlorophyte_pickaxe, 'F', ModItems.shimmer_handle }); //Chainsaws - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.DIESEL.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.DIESEL_CRACK.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.PETROIL.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.PETROIL_LEADED.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.GASOLINE.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.GASOLINE_LEADED.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.BIOFUEL.getDict(1000) }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', ModItems.canister_empty }); //Misc CraftingManager.addRecipeAuto(new ItemStack(ModItems.euphemium_stopper, 1), new Object[] { "I", "S", "S", 'I', EUPH.ingot(), 'S', KEY_STICK }); diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index efe0e61c4..074dfdd5e 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -5,30 +5,31 @@ import java.util.List; import org.lwjgl.opengl.GL11; -import com.hbm.handler.ArmorModHandler; -import com.hbm.interfaces.IPartiallyFillable; -import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.gui.GuiInfoContainer; import com.hbm.items.ModItems; -import com.hbm.items.armor.ItemArmorMod; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.TEFluidPacket; -import api.hbm.fluid.IFillableItem; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; public class FluidTank { + public static final List loadingHandlers = new ArrayList(); + + static { + loadingHandlers.add(new FluidLoaderStandard()); + loadingHandlers.add(new FluidLoaderFillableItem()); + } + FluidType type; int fluid; int maxFluid; @@ -94,143 +95,44 @@ public class FluidTank { //Fills tank from canisters public boolean loadTank(int in, int out, ItemStack[] slots) { - FluidType inType = Fluids.NONE; - if(slots[in] != null) { - - //TODO: add IPartiallyFillable case for unloading, useful for infinite tanks so they don't need to be hardcoded - - inType = FluidContainerRegistry.getFluidType(slots[in]); - - if(slots[in].getItem() == ModItems.fluid_barrel_infinite && type != Fluids.NONE) { - this.fluid = this.maxFluid; - return true; - } - - if(slots[in].getItem() == ModItems.inf_water && this.type == Fluids.WATER) { - this.fluid += 50; - if(this.fluid > this.maxFluid) - this.fluid = this.maxFluid; - return true; - } - - if(slots[in].getItem() == ModItems.inf_water_mk2 && this.type == Fluids.WATER) { - this.fluid += 500; - if(this.fluid > this.maxFluid) - this.fluid = this.maxFluid; - return true; - } - - if(FluidContainerRegistry.getFluidContent(slots[in], type) <= 0) - return false; - } else { + if(slots[in] == null) return false; - } - if(slots[in] != null && inType.getName().equals(type.getName()) && fluid + FluidContainerRegistry.getFluidContent(slots[in], type) <= maxFluid) { - - ItemStack emptyContainer = FluidContainerRegistry.getEmptyContainer(slots[in]); - - if(slots[out] == null) { - fluid += FluidContainerRegistry.getFluidContent(slots[in], type); - slots[out] = emptyContainer; - slots[in].stackSize--; - if(slots[in].stackSize <= 0) - slots[in] = null; - } else if(slots[out] != null && (emptyContainer == null || (slots[out].getItem() == emptyContainer.getItem() && slots[out].getItemDamage() == emptyContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()))) { - fluid += FluidContainerRegistry.getFluidContent(slots[in], type); - - if(emptyContainer != null) - slots[out].stackSize++; - - slots[in].stackSize--; - if(slots[in].stackSize <= 0) - slots[in] = null; - } - + if(slots[in].getItem() == ModItems.fluid_barrel_infinite && type != Fluids.NONE) { + this.fluid = this.maxFluid; + return true; + } + + if(slots[in].getItem() == ModItems.inf_water && this.type == Fluids.WATER) { + this.fluid += 50; + if(this.fluid > this.maxFluid) + this.fluid = this.maxFluid; + return true; + } + + if(slots[in].getItem() == ModItems.inf_water_mk2 && this.type == Fluids.WATER) { + this.fluid += 500; + if(this.fluid > this.maxFluid) + this.fluid = this.maxFluid; return true; } - return false; + int prev = this.getFill(); + + for(FluidLoadingHandler handler : loadingHandlers) { + if(handler.emptyItem(slots, in, out, this)) { + break; + } + } + + return this.getFill() > prev; } //Fills canisters from tank - public void unloadTank(int in, int out, ItemStack[] slots) { - - ItemStack full = null; - if(slots[in] != null) { - - if(this.handleFillableUnload(slots, in)) - return; - - if(this.handleInfiniteUnload(slots, in)) - return; - - if(this.handleNewFillableUnload(slots[in])) - return; - - full = FluidContainerRegistry.getFullContainer(slots[in], type); - } + public boolean unloadTank(int in, int out, ItemStack[] slots) { - if(full == null) - return; - - if(slots[in] != null && fluid - FluidContainerRegistry.getFluidContent(full, type) >= 0) { - ItemStack fullContainer = FluidContainerRegistry.getFullContainer(slots[in], type); - if(slots[out] == null) { - fluid -= FluidContainerRegistry.getFluidContent(full, type); - slots[out] = full.copy(); - slots[in].stackSize--; - if(slots[in].stackSize <= 0) - slots[in] = null; - } else if(slots[out] != null && slots[out].getItem() == fullContainer.getItem() && slots[out].getItemDamage() == fullContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()) { - fluid -= FluidContainerRegistry.getFluidContent(full, type); - slots[in].stackSize--; - if(slots[in].stackSize <= 0) - slots[in] = null; - slots[out].stackSize++; - } - } - } - - public boolean handleFillableUnload(ItemStack[] slots, int in) { - - ItemStack partial = slots[in]; - - if(partial.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(partial)) { - - partial = ArmorModHandler.pryMods(partial)[ArmorModHandler.plate_only]; - - if(partial == null) - partial = slots[in]; - } - - if(partial.getItem() instanceof IPartiallyFillable) { - IPartiallyFillable fillable = (IPartiallyFillable)partial.getItem(); - int speed = fillable.getLoadSpeed(partial); - - if(fillable.getType(partial) == this.type && speed > 0) { - - int toLoad = Math.min(this.fluid, speed); - int fill = fillable.getFill(partial); - toLoad = Math.min(toLoad, fillable.getMaxFill(partial) - fill); - - if(toLoad > 0) { - this.fluid -= toLoad; - fillable.setFill(partial, fill + toLoad); - } - } - - if(slots[in].getItem() instanceof ItemArmor && partial.getItem() instanceof ItemArmorMod) { - ArmorModHandler.applyMod(slots[in], partial); - } - - return true; - } - - return false; - } - - public boolean handleInfiniteUnload(ItemStack[] slots, int in) { + if(slots[in] == null) + return false; if(slots[in].getItem() == ModItems.fluid_barrel_infinite) { this.fluid = 0; @@ -251,29 +153,15 @@ public class FluidTank { return true; } - return false; - } - - public boolean handleNewFillableUnload(ItemStack stack) { + int prev = this.getFill(); - if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { - for(ItemStack mod : ArmorModHandler.pryMods(stack)) { - - if(mod != null && mod.getItem() instanceof IFillableItem) { - handleNewFillableUnload(mod); - } + for(FluidLoadingHandler handler : loadingHandlers) { + if(handler.fillItem(slots, in, out, this)) { + break; } } - if(!(stack.getItem() instanceof IFillableItem)) return false; - - IFillableItem fillable = (IFillableItem) stack.getItem(); - - if(fillable.acceptsFluid(getTankType(), stack)) { - this.setFill(fillable.tryFill(type, this.getFill(), stack)); - } - - return true; + return this.getFill() < prev; } public boolean setType(int in, ItemStack[] slots) { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index e478948b5..16bf83180 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -870,17 +870,17 @@ public class ModItems { public static Item canister_empty; public static Item canister_full; - public static Item canister_smear; - public static Item canister_canola; - public static Item canister_oil; - public static Item canister_fuel; - public static Item canister_kerosene; - public static Item canister_reoil; - public static Item canister_petroil; + @Deprecated public static Item canister_smear; + @Deprecated public static Item canister_canola; + @Deprecated public static Item canister_oil; + @Deprecated public static Item canister_fuel; + @Deprecated public static Item canister_kerosene; + @Deprecated public static Item canister_reoil; + @Deprecated public static Item canister_petroil; public static Item canister_napalm; - public static Item canister_gasoline; - public static Item canister_NITAN; - public static Item canister_fracksol; + @Deprecated public static Item canister_gasoline; + @Deprecated public static Item canister_NITAN; + @Deprecated public static Item canister_fracksol; public static Item canister_heavyoil; public static Item canister_bitumen; @@ -5180,7 +5180,8 @@ public class ModItems { jackt = new ModArmor(MainRegistry.aMatSteel, 7, 1).setUnlocalizedName("jackt").setTextureName(RefStrings.MODID + ":jackt"); jackt2 = new ModArmor(MainRegistry.aMatSteel, 7, 1).setUnlocalizedName("jackt2").setTextureName(RefStrings.MODID + ":jackt2"); - chainsaw = new ItemToolAbility(25, -0.05, MainRegistry.tMatChainsaw, EnumToolType.AXE) + chainsaw = new ItemToolAbilityFueled(25, -0.05, MainRegistry.tMatChainsaw, EnumToolType.AXE, 5000, 1, 250, + Fluids.DIESEL, Fluids.DIESEL_CRACK, Fluids.KEROSENE, Fluids.BIOFUEL, Fluids.GASOLINE, Fluids.GASOLINE_LEADED, Fluids.PETROIL, Fluids.PETROIL_LEADED, Fluids.COALGAS, Fluids.COALGAS_LEADED) .addBreakAbility(new ToolAbility.SilkAbility()) .addBreakAbility(new ToolAbility.RecursionAbility(5)) .addHitAbility(new WeaponAbility.ChainsawAbility(4)) diff --git a/src/main/java/com/hbm/items/armor/ArmorDiesel.java b/src/main/java/com/hbm/items/armor/ArmorDiesel.java index d3cb53dc4..fa133eaf6 100644 --- a/src/main/java/com/hbm/items/armor/ArmorDiesel.java +++ b/src/main/java/com/hbm/items/armor/ArmorDiesel.java @@ -4,6 +4,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.hbm.handler.ArmorModHandler; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; @@ -63,4 +64,9 @@ public class ArmorDiesel extends ArmorFSBFueled { PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return type == Fluids.DIESEL || type == Fluids.DIESEL_CRACK; + } } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java new file mode 100644 index 000000000..11cd40a3e --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java @@ -0,0 +1,116 @@ +package com.hbm.items.tool; + +import java.util.HashSet; +import java.util.List; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.util.I18nUtil; + +import api.hbm.fluid.IFillableItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; + +public class ItemToolAbilityFueled extends ItemToolAbility implements IFillableItem { + + protected int fillRate; + protected int consumption; + protected int maxFuel; + protected HashSet acceptedFuels = new HashSet(); + + public ItemToolAbilityFueled(float damage, double movement, ToolMaterial material, EnumToolType type, int maxFuel, int consumption, int fillRate, FluidType... acceptedFuels) { + super(damage, movement, material, type); + this.maxFuel = maxFuel; + this.consumption = consumption; + this.fillRate = fillRate; + this.setMaxDamage(1); + for(FluidType fuel : acceptedFuels) this.acceptedFuels.add(fuel); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + + list.add(EnumChatFormatting.GOLD + "Fuel: " + this.getFill(stack) + "/" + this.maxFuel + "mB"); + + for(FluidType type : acceptedFuels) { + list.add(EnumChatFormatting.YELLOW + "- " + I18nUtil.resolveKey(type.getUnlocalizedName())); + } + + super.addInformation(stack, player, list, ext); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return getFill(stack) < maxFuel; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return 1 - (double) getFill(stack) / (double) maxFuel; + } + + @Override + protected boolean canOperate(ItemStack stack) { + return getFill(stack) >= this.consumption; + } + + @Override + public void setDamage(ItemStack stack, int damage) { + this.setFill(stack, Math.max(this.getFill(stack) - damage * consumption, 0)); + } + + @Override + public boolean isDamageable() { + return true; + } + + public int getFill(ItemStack stack) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + setFill(stack, maxFuel); + return maxFuel; + } + + return stack.stackTagCompound.getInteger("fuel"); + } + + public void setFill(ItemStack stack, int fill) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setInteger("fuel", fill); + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return this.acceptedFuels.contains(type); + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + int toFill = Math.min(amount, this.fillRate); + toFill = Math.min(toFill, this.maxFuel - this.getFill(stack)); + this.setFill(stack, this.getFill(stack) + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return false; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + return amount; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java index 275184d0f..865d5d5af 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java @@ -26,94 +26,90 @@ public class ItemToolAbilityPower extends ItemToolAbility implements IBatteryIte } @Override - public void chargeBattery(ItemStack stack, long i) { - if(stack.getItem() instanceof ItemToolAbilityPower) { - if(stack.hasTagCompound()) { - stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") + i); - } else { - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setLong("charge", i); - } - } - } + public void chargeBattery(ItemStack stack, long i) { + if(stack.getItem() instanceof ItemToolAbilityPower) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") + i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", i); + } + } + } @Override - public void setCharge(ItemStack stack, long i) { - if(stack.getItem() instanceof ItemToolAbilityPower) { - if(stack.hasTagCompound()) { - stack.stackTagCompound.setLong("charge", i); - } else { - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setLong("charge", i); - } - } - } + public void setCharge(ItemStack stack, long i) { + if(stack.getItem() instanceof ItemToolAbilityPower) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", i); + } + } + } @Override - public void dischargeBattery(ItemStack stack, long i) { - if(stack.getItem() instanceof ItemToolAbilityPower) { - if(stack.hasTagCompound()) { - stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") - i); - } else { - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setLong("charge", this.maxPower - i); - } - - if(stack.stackTagCompound.getLong("charge") < 0) - stack.stackTagCompound.setLong("charge", 0); - } - } + public void dischargeBattery(ItemStack stack, long i) { + if(stack.getItem() instanceof ItemToolAbilityPower) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") - i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", this.maxPower - i); + } + + if(stack.stackTagCompound.getLong("charge") < 0) + stack.stackTagCompound.setLong("charge", 0); + } + } @Override - public long getCharge(ItemStack stack) { - if(stack.getItem() instanceof ItemToolAbilityPower) { - if(stack.hasTagCompound()) { - return stack.stackTagCompound.getLong("charge"); - } else { - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setLong("charge", ((ItemToolAbilityPower)stack.getItem()).maxPower); - return stack.stackTagCompound.getLong("charge"); - } - } - - return 0; - } - - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - - list.add("Charge: " + BobMathUtil.getShortNumber(getCharge(stack)) + " / " + BobMathUtil.getShortNumber(maxPower)); - - super.addInformation(stack, player, list, ext); - } + public long getCharge(ItemStack stack) { + if(stack.getItem() instanceof ItemToolAbilityPower) { + if(stack.hasTagCompound()) { + return stack.stackTagCompound.getLong("charge"); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", ((ItemToolAbilityPower) stack.getItem()).maxPower); + return stack.stackTagCompound.getLong("charge"); + } + } + + return 0; + } + + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + + list.add("Charge: " + BobMathUtil.getShortNumber(getCharge(stack)) + " / " + BobMathUtil.getShortNumber(maxPower)); + super.addInformation(stack, player, list, ext); + } @Override - public boolean showDurabilityBar(ItemStack stack) { - - return getCharge(stack) < maxPower; - } + public boolean showDurabilityBar(ItemStack stack) { + return getCharge(stack) < maxPower; + } @Override - public double getDurabilityForDisplay(ItemStack stack) { - - return 1 - (double)getCharge(stack) / (double)maxPower; - } + public double getDurabilityForDisplay(ItemStack stack) { + return 1 - (double) getCharge(stack) / (double) maxPower; + } @Override - protected boolean canOperate(ItemStack stack) { - - return getCharge(stack) >= this.consumption; - } + protected boolean canOperate(ItemStack stack) { + return getCharge(stack) >= this.consumption; + } @Override - public long getMaxCharge() { - return maxPower; - } + public long getMaxCharge() { + return maxPower; + } @Override - public long getChargeRate() { - return chargeRate; - } + public long getChargeRate() { + return chargeRate; + } @Override public long getDischargeRate() { @@ -121,13 +117,12 @@ public class ItemToolAbilityPower extends ItemToolAbility implements IBatteryIte } @Override - public void setDamage(ItemStack stack, int damage) - { - this.dischargeBattery(stack, damage * consumption); - } + public void setDamage(ItemStack stack, int damage) { + this.dischargeBattery(stack, damage * consumption); + } @Override - public boolean isDamageable() { - return true; - } + public boolean isDamageable() { + return true; + } } diff --git a/src/main/java/com/hbm/tileentity/IPersistentNBT.java b/src/main/java/com/hbm/tileentity/IPersistentNBT.java new file mode 100644 index 000000000..159ad3fc4 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/IPersistentNBT.java @@ -0,0 +1,40 @@ +package com.hbm.tileentity; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public interface IPersistentNBT { + + public void writeNBT(NBTTagCompound nbt); + public void readNBT(NBTTagCompound nbt); + + public default ArrayList getDrops(Block b) { + ArrayList list = new ArrayList(); + ItemStack stack = new ItemStack(b); + stack.stackTagCompound = new NBTTagCompound(); + writeNBT(stack.stackTagCompound); + list.add(stack); + return list; + } + + public static ArrayList getDrops(World world, int x, int y, int z, Block b) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof IPersistentNBT) { + return ((IPersistentNBT) tile).getDrops(b); + } + + return new ArrayList(); + } + + public static void restoreData(World world, int x, int y, int z, ItemStack stack) { + if(!stack.hasTagCompound()) return; + IPersistentNBT tile = (IPersistentNBT) world.getTileEntity(x, y, z); + tile.readNBT(stack.stackTagCompound); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 2d68538a7..47f5cb221 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -12,6 +12,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.fluid.IFluidStandardTransceiver; @@ -20,7 +21,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.EnumSkyBlock; -public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcceptor, IFluidSource, IFluidStandardTransceiver { +public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcceptor, IFluidSource, IFluidStandardTransceiver, IPersistentNBT { public FluidTank tank; public short mode = 0; @@ -220,4 +221,19 @@ public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcc public FluidTank[] getReceivingTanks() { return (mode == 0 || mode == 1) ? new FluidTank[] {tank} : new FluidTank[0]; } + + @Override + public void writeNBT(NBTTagCompound nbt) { + NBTTagCompound data = new NBTTagCompound(); + this.tank.writeToNBT(data, "tank"); + data.getShort("mode"); + nbt.setTag("persistent", data); + } + + @Override + public void readNBT(NBTTagCompound nbt) { + NBTTagCompound data = nbt.getCompoundTag("persistent"); + this.tank.readFromNBT(data, "tank"); + this.mode = data.getShort("nbt"); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index d349901e2..ee7acb06e 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -11,6 +11,7 @@ import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.fluid.IFluidUser; @@ -20,7 +21,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -public class TileEntityMachineFluidTank extends TileEntityMachineBase implements IFluidContainer, IFluidSource, IFluidAcceptor, IFluidUser { +public class TileEntityMachineFluidTank extends TileEntityMachineBase implements IFluidContainer, IFluidSource, IFluidAcceptor, IFluidUser, IPersistentNBT { public FluidTank tank; public short mode = 0; @@ -207,4 +208,19 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements return type == tank.getTankType() ? tank.getMaxFill() - tank.getFill() : 0; } + + @Override + public void writeNBT(NBTTagCompound nbt) { + NBTTagCompound data = new NBTTagCompound(); + this.tank.writeToNBT(data, "tank"); + data.setShort("mode", mode); + nbt.setTag("persistent", data); + } + + @Override + public void readNBT(NBTTagCompound nbt) { + NBTTagCompound data = nbt.getCompoundTag("persistent"); + this.tank.readFromNBT(data, "tank"); + this.mode = data.getShort("mode"); + } } From 9bdd738fdc90ac8770a9d7f68689e40c50fe4084 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 18 Aug 2022 20:33:27 +0200 Subject: [PATCH 013/111] it's to prevent you from healing how come every time i port some absolute garbage feature that people keep telling me is "good" and "justified" those very people start to scream, it's almost like it wasn't good to begin with --- .../container/ContainerArmorTable.java | 37 ++++++++++--------- .../fluid/tank/FluidLoaderFillableItem.java | 3 ++ .../fluid/tank/FluidLoaderStandard.java | 2 +- .../com/hbm/inventory/gui/GUIArmorTable.java | 16 ++++---- src/main/java/com/hbm/items/ModItems.java | 16 ++++---- .../java/com/hbm/items/armor/ItemModV1.java | 20 ++++++++++ .../com/hbm/items/tool/ItemToolAbility.java | 2 +- .../machine/rbmk/TileEntityRBMKConsole.java | 3 +- 8 files changed, 62 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java b/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java index ab6baa31b..f8da90d3d 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java +++ b/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java @@ -2,6 +2,7 @@ package com.hbm.inventory.container; import com.hbm.handler.ArmorModHandler; import com.hbm.items.armor.ItemArmorMod; +import com.hbm.util.InventoryUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,16 +25,16 @@ public class ContainerArmorTable extends Container { public ContainerArmorTable(InventoryPlayer inventory) { EntityPlayer player = inventory.player; - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.helmet_only, 26, 27)); // helmet only - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.plate_only, 62, 27)); // chestplate only - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.legs_only, 98, 27)); // leggins only - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.boots_only, 134, 45)); // boots only - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.servos, 134, 81)); //servos/frame - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.cladding, 98, 99)); //radiation cladding - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.kevlar, 62, 99)); //kevlar/sapi/(ERA? :) ) - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.extra, 26, 99)); //special parts + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.helmet_only, 26 + 22, 27)); // helmet only + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.plate_only, 62 + 22, 27)); // chestplate only + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.legs_only, 98 + 22, 27)); // leggins only + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.boots_only, 134 + 22, 45)); // boots only + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.servos, 134 + 22, 81)); //servos/frame + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.cladding, 98 + 22, 99)); //radiation cladding + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.kevlar, 62 + 22, 99)); //kevlar/sapi/(ERA? :) ) + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.extra, 26 + 22, 99)); //special parts - this.addSlotToContainer(new Slot(armor, 0, 44, 63) { + this.addSlotToContainer(new Slot(armor, 0, 44 + 22, 63) { @Override public boolean isItemValid(ItemStack stack) { @@ -79,7 +80,7 @@ public class ContainerArmorTable extends Container { //player armor slots for easy accessibility for(int i = 0; i < 4; ++i) { final int k = i; - this.addSlotToContainer(new Slot(inventory, inventory.getSizeInventory() - 1 - i, -18, 36 + i * 18) { + this.addSlotToContainer(new Slot(inventory, inventory.getSizeInventory() - 1 - i, -17 + 22, 36 + i * 18) { public int getSlotStackLimit() { return 1; @@ -100,12 +101,12 @@ public class ContainerArmorTable extends Container { for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18 + 56)); + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18 + 22, 84 + i * 18 + 56)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 142 + 56)); + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18 + 22, 142 + 56)); } this.onCraftMatrixChanged(this.upgrades); @@ -120,17 +121,17 @@ public class ContainerArmorTable extends Container { public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { ItemStack var3 = null; Slot var4 = (Slot) this.inventorySlots.get(par2); - + if(var4 != null && var4.getHasStack()) { ItemStack var5 = var4.getStack(); var3 = var5.copy(); if(par2 <= 8) { - if(!this.mergeItemStack(var5, 9, this.inventorySlots.size(), true)) { - return null; - } else { - var4.onPickupFromSlot(p_82846_1_, var5); - } + if(par2 != 8 || !InventoryUtil.mergeItemStack(this.inventorySlots, var5, 9, 13, false)) + if(!this.mergeItemStack(var5, 13, this.inventorySlots.size(), true)) + return null; + + var4.onPickupFromSlot(p_82846_1_, var5); } else { if(var5.getItem() instanceof ItemArmor) { diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java index 787abe844..8228afc44 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java @@ -16,6 +16,9 @@ public class FluidLoaderFillableItem extends FluidLoadingHandler { public boolean fill(ItemStack stack, FluidTank tank) { + if(stack == null) + return false; + FluidType type = tank.getTankType(); if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java index 78a46441a..d4c784396 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java @@ -16,7 +16,7 @@ public class FluidLoaderStandard extends FluidLoadingHandler { FluidType type = tank.getTankType(); ItemStack full = FluidContainerRegistry.getFullContainer(slots[in], type); - if(slots[in] != null && tank.getFill() - FluidContainerRegistry.getFluidContent(full, type) >= 0) { + if(full != null && slots[in] != null && tank.getFill() - FluidContainerRegistry.getFluidContent(full, type) >= 0) { ItemStack fullContainer = FluidContainerRegistry.getFullContainer(slots[in], type); diff --git a/src/main/java/com/hbm/inventory/gui/GUIArmorTable.java b/src/main/java/com/hbm/inventory/gui/GUIArmorTable.java index 3713846e4..e255586cf 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIArmorTable.java +++ b/src/main/java/com/hbm/inventory/gui/GUIArmorTable.java @@ -24,7 +24,7 @@ public class GUIArmorTable extends GuiInfoContainer { public GUIArmorTable(InventoryPlayer player) { super(new ContainerArmorTable(player)); - this.xSize = 176; + this.xSize = 176 + 22; this.ySize = 222; guiLeft = (this.width - this.xSize) / 2; @@ -62,8 +62,9 @@ public class GUIArmorTable extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer(int mX, int mY) { - this.fontRendererObj.drawString(I18n.format("container.armorTable"), 28, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + String name = I18n.format("container.armorTable"); + this.fontRendererObj.drawString(name, (this.xSize - 22) / 2 - this.fontRendererObj.getStringWidth(name) / 2 + 22, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8 + 22, this.ySize - 96 + 2, 4210752); } protected void drawGuiContainerBackgroundLayer(float inter, int mX, int mY) { @@ -71,20 +72,21 @@ public class GUIArmorTable extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(texture); - this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize); + this.drawTexturedModalRect(guiLeft + 22, guiTop, 0, 0, this.xSize - 22, this.ySize); + this.drawTexturedModalRect(guiLeft, guiTop + 31, 176, 96, 22, 100); ItemStack armor = this.inventorySlots.getSlot(8).getStack(); if(armor != null) { if(armor.getItem() instanceof ItemArmor) - this.drawTexturedModalRect(guiLeft + 41, guiTop + 60, 176, 74, 22, 22); + this.drawTexturedModalRect(guiLeft + 41 + 22, guiTop + 60, 176, 74, 22, 22); else - this.drawTexturedModalRect(guiLeft + 41, guiTop + 60, 176, 52, 22, 22); + this.drawTexturedModalRect(guiLeft + 41 + 22, guiTop + 60, 176, 52, 22, 22); } else { if(System.currentTimeMillis() % 1000 < 500) - this.drawTexturedModalRect(guiLeft + 41, guiTop + 60, 176, 52, 22, 22); + this.drawTexturedModalRect(guiLeft + 41 + 22, guiTop + 60, 176, 52, 22, 22); } for(int i = 0; i < 8; i++) { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 16bf83180..62873ca8e 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -5006,7 +5006,7 @@ public class ModItems { ArmorMaterial aMatDesh = EnumHelper.addArmorMaterial("HBM_DESH", 150, new int[] { 3, 8, 6, 3 }, 0); aMatDesh.customCraftingMaterial = ModItems.ingot_desh; - steamsuit_helmet = new ArmorDesh(aMatDesh, 2, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 360000, 500, 50, 1).setThreshold(5F).setMod(0.8F) + steamsuit_helmet = new ArmorDesh(aMatDesh, 2, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 64_000, 500, 50, 1).setThreshold(5F).setMod(0.8F) .setFireproof(true) .setHasHardLanding(true) .addEffect(new PotionEffect(Potion.digSpeed.id, 20, 4)) @@ -5015,22 +5015,22 @@ public class ModItems { .addResistance("fall", 0) .hides(EnumPlayerPart.HAT) .setUnlocalizedName("steamsuit_helmet").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_helmet"); - steamsuit_plate = new ArmorDesh(aMatDesh, 2, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 360000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_plate").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_plate"); - steamsuit_legs = new ArmorDesh(aMatDesh, 2, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", Fluids.STEAM, 360000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_legs"); - steamsuit_boots = new ArmorDesh(aMatDesh, 2, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 360000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_boots"); + steamsuit_plate = new ArmorDesh(aMatDesh, 2, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 64_000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_plate").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_plate"); + steamsuit_legs = new ArmorDesh(aMatDesh, 2, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", Fluids.STEAM, 64_000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_legs"); + steamsuit_boots = new ArmorDesh(aMatDesh, 2, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 64_000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_boots"); ArmorMaterial aMatDiesel = EnumHelper.addArmorMaterial("HBM_BNUUY", 150, new int[] { 3, 8, 6, 3 }, 0); aMatDiesel.customCraftingMaterial = ModItems.plate_copper; - dieselsuit_helmet = new ArmorDiesel(aMatDiesel, 2, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 360000, 500, 50, 1).setThreshold(2F).setMod(0.7F) + dieselsuit_helmet = new ArmorDiesel(aMatDiesel, 2, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 64_000, 500, 50, 1).setThreshold(2F).setMod(0.7F) .addEffect(new PotionEffect(Potion.moveSpeed.id, 20, 2)) .addEffect(new PotionEffect(Potion.jump.id, 20, 2)) .enableThermalSight(true) .enableVATS(true) .addResistance("fall", 0) .setUnlocalizedName("dieselsuit_helmet").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_helmet"); - dieselsuit_plate = new ArmorDiesel(aMatDiesel, 2, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 360000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_plate").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_plate"); - dieselsuit_legs = new ArmorDiesel(aMatDiesel, 2, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", Fluids.DIESEL, 360000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_legs"); - dieselsuit_boots = new ArmorDiesel(aMatDiesel, 2, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 360000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_boots"); + dieselsuit_plate = new ArmorDiesel(aMatDiesel, 2, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 64_000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_plate").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_plate"); + dieselsuit_legs = new ArmorDiesel(aMatDiesel, 2, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", Fluids.DIESEL, 64_000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_legs"); + dieselsuit_boots = new ArmorDiesel(aMatDiesel, 2, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 64_000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_boots"); ArmorMaterial aMatAJR = EnumHelper.addArmorMaterial("HBM_T45AJR", 150, new int[] { 3, 8, 6, 3 }, 100); aMatAJR.customCraftingMaterial = ModItems.plate_armor_ajr; diff --git a/src/main/java/com/hbm/items/armor/ItemModV1.java b/src/main/java/com/hbm/items/armor/ItemModV1.java index bb5d8a3a6..6d206fca6 100644 --- a/src/main/java/com/hbm/items/armor/ItemModV1.java +++ b/src/main/java/com/hbm/items/armor/ItemModV1.java @@ -7,15 +7,19 @@ import com.google.common.collect.Multimap; import com.hbm.handler.ArmorModHandler; import com.hbm.interfaces.IArmorModDash; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.ai.attributes.IAttributeInstance; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.event.entity.living.LivingHurtEvent; public class ItemModV1 extends ItemArmorMod implements IArmorModDash { private static final UUID speed = UUID.fromString("1d11e63e-28c4-4e14-b09f-fe0bd1be708f"); + public static final UUID its_to_prevent_you_from_healing = UUID.fromString("9b0ff87a-6103-482b-b515-19ef2e6721ce"); public ItemModV1() { super(ArmorModHandler.extra, false, true, false, false); @@ -44,4 +48,20 @@ public class ItemModV1 extends ItemArmorMod implements IArmorModDash { public int getDashes() { return 3; } + + @Override + public void modDamage(LivingHurtEvent event, ItemStack armor) { + + EntityLivingBase entity = event.entityLiving; + + IAttributeInstance attributeinstance = entity.getAttributeMap().getAttributeInstance(SharedMonsterAttributes.maxHealth); + + float health = entity.getMaxHealth(); + + try { + attributeinstance.removeModifier(attributeinstance.getModifier(its_to_prevent_you_from_healing)); + } catch(Exception ex) { } + + attributeinstance.applyModifier(new AttributeModifier(its_to_prevent_you_from_healing, "hakita what is this bullshit", -(entity.getMaxHealth() - health + event.ammount * 0.35), 0)); + } } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index 81e8d1a13..accb7ba63 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -137,7 +137,7 @@ public class ItemToolAbility extends ItemTool implements IItemAbility, IDepthRoc @Override public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase player) { - return false; + return super.onBlockDestroyed(stack, world, block, x, y, z, player); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index ac442c39a..5931e8a59 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -10,7 +10,6 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; import com.hbm.util.I18nUtil; -import com.hbm.util.Tuple.Triplet; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -135,7 +134,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon case FUEL_POISON: if(col.data.hasKey("xenon")) { count++; - value += col.data.getDouble("xenon") * 100D; + value += col.data.getDouble("xenon"); } break; case FUEL_TEMP: From 42c154fa6e2e155b70fafe38ced7287bec4d4ae1 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 18 Aug 2022 23:03:59 +0200 Subject: [PATCH 014/111] this glorified garden hose --- .../hbm/handler/guncfg/GunEnergyFactory.java | 20 + src/main/java/com/hbm/items/ModItems.java | 3 + .../com/hbm/items/weapon/ItemGunBase.java | 4 +- .../hbm/items/weapon/ItemGunChemthrower.java | 226 + src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 2 + .../weapon/ItemRenderWeaponChemthrower.java | 105 + .../hbm/render/util/RenderScreenOverlay.java | 8 +- .../assets/hbm/models/weapons/chemthrower.obj | 10366 ++++++++++++++++ .../textures/gui/storage/gui_crate_desh.png | Bin 1456 -> 1458 bytes .../textures/models/weapons/chemthrower.png | Bin 0 -> 3810 bytes 11 files changed, 10729 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java create mode 100644 src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java create mode 100644 src/main/resources/assets/hbm/models/weapons/chemthrower.obj create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/chemthrower.png diff --git a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java index f047cee32..7ebb1c831 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java @@ -29,6 +29,26 @@ import net.minecraft.potion.PotionEffect; public class GunEnergyFactory { + public static GunConfiguration getChemConfig() { + + GunConfiguration config = new GunConfiguration(); + config.rateOfFire = 1; + config.gunMode = GunConfiguration.MODE_NORMAL; + config.firingMode = GunConfiguration.FIRE_AUTO; + config.allowsInfinity = false; + config.ammoCap = 3_000; + config.durability = 30_000; + config.reloadType = GunConfiguration.RELOAD_FULL; + config.crosshair = Crosshair.CIRCLE; + + config.name = "Chemical Thrower"; + config.manufacturer = "Langford Research Laboratories"; + + config.config = new ArrayList(); + + return config; + } + public static GunConfiguration getEMPConfig() { GunConfiguration config = new GunConfiguration(); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 62873ca8e..12a1cb086 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1659,6 +1659,7 @@ public class ModItems { //public static Item gun_mirv_ammo; public static Item gun_bf; public static Item gun_bf_ammo; + public static Item gun_chemthrower; public static Item gun_mp40; //public static Item gun_mp40_ammo; public static Item gun_thompson; @@ -4403,6 +4404,7 @@ public class ModItems { gun_mirv = new ItemGunBase(GunFatmanFactory.getMIRVConfig()).setUnlocalizedName("gun_mirv").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_mirv"); gun_bf_ammo = new Item().setUnlocalizedName("gun_bf_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":gun_bf_ammo"); gun_bf = new ItemGunBase(GunFatmanFactory.getBELConfig()).setUnlocalizedName("gun_bf").setCreativeTab(null).setTextureName(RefStrings.MODID + ":gun_bf"); + gun_chemthrower = new ItemGunChemthrower().setUnlocalizedName("gun_chemthrower").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_fatman"); //gun_mp40_ammo = new Item().setUnlocalizedName("gun_mp40_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":gun_mp40_ammo"); gun_mp40 = new ItemGunBase(Gun9mmFactory.getMP40Config()).setUnlocalizedName("gun_mp40").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_mp40"); gun_thompson = new ItemGunBase(Gun9mmFactory.getThompsonConfig()).setUnlocalizedName("gun_thompson").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_thompson"); @@ -7214,6 +7216,7 @@ public class ModItems { GameRegistry.registerItem(gun_proto, gun_proto.getUnlocalizedName()); GameRegistry.registerItem(gun_mirv, gun_mirv.getUnlocalizedName()); GameRegistry.registerItem(gun_bf, gun_bf.getUnlocalizedName()); + GameRegistry.registerItem(gun_chemthrower, gun_chemthrower.getUnlocalizedName()); GameRegistry.registerItem(gun_mp40, gun_mp40.getUnlocalizedName()); GameRegistry.registerItem(gun_thompson, gun_thompson.getUnlocalizedName()); GameRegistry.registerItem(gun_uzi, gun_uzi.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/ItemGunBase.java b/src/main/java/com/hbm/items/weapon/ItemGunBase.java index 2c6946a9d..5966161ca 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunBase.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunBase.java @@ -786,7 +786,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD { int dura = ItemGunBase.getItemWear(stack) * 50 / gcfg.durability; - RenderScreenOverlay.renderAmmo(event.resolution, Minecraft.getMinecraft().ingameGUI, ammo, count, max, dura, showammo); + RenderScreenOverlay.renderAmmo(event.resolution, Minecraft.getMinecraft().ingameGUI, new ItemStack(ammo), count, max, dura, showammo); if(gun.altConfig != null && gun.altConfig.reloadType == GunConfiguration.RELOAD_NONE) { Item oldAmmo = ammo; @@ -794,7 +794,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD { if(ammo != oldAmmo) { count = ItemGunBase.getBeltSize(player, ammo); - RenderScreenOverlay.renderAmmoAlt(event.resolution, Minecraft.getMinecraft().ingameGUI, ammo, count); + RenderScreenOverlay.renderAmmoAlt(event.resolution, Minecraft.getMinecraft().ingameGUI, new ItemStack(ammo), count); } } } diff --git a/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java b/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java new file mode 100644 index 000000000..eea0f648a --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java @@ -0,0 +1,226 @@ +package com.hbm.items.weapon; + +import java.util.List; + +import com.hbm.config.GeneralConfig; +import com.hbm.handler.BulletConfigSyncingUtil; +import com.hbm.handler.BulletConfiguration; +import com.hbm.handler.GunConfiguration; +import com.hbm.handler.guncfg.GunEnergyFactory; +import com.hbm.interfaces.IHoldableWeapon; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.GunAnimationPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.render.anim.HbmAnimations.AnimType; +import com.hbm.render.util.RenderScreenOverlay; +import com.hbm.render.util.RenderScreenOverlay.Crosshair; + +import api.hbm.fluid.IFillableItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public class ItemGunChemthrower extends ItemGunBase implements IFillableItem { + + public ItemGunChemthrower() { + super(GunEnergyFactory.getChemConfig()); + } + + @Override + protected void fire(ItemStack stack, World world, EntityPlayer player) { + + System.out.println("nuts"); + + if(!hasAmmo(stack, player, true)) + return; + + int bullets = 1; + + for(int i = 0; i < bullets; i++) { + spawnProjectile(world, player, stack, 0); + } + + useUpAmmo(player, stack, true); + player.inventoryContainer.detectAndSendChanges(); + + int wear = (int) Math.ceil(10 / (1F + EnchantmentHelper.getEnchantmentLevel(Enchantment.unbreaking.effectId, stack))); + setItemWear(stack, getItemWear(stack) + wear); + + //world.playSoundAtEntity(player, mainConfig.firingSound, 1.0F, mainConfig.firingPitch); + } + + @Override + public boolean hasAmmo(ItemStack stack, EntityPlayer player, boolean main) { + return getMag(stack) >= 0 + this.getConsumption(stack); + } + + @Override + public void useUpAmmo(EntityPlayer player, ItemStack stack, boolean main) { + + if(!main && altConfig == null) + return; + + GunConfiguration config = mainConfig; + + if(!main) + config = altConfig; + + if(hasInfinity(stack, config)) + return; + + + if(config.reloadType != mainConfig.RELOAD_NONE) { + setMag(stack, getMag(stack) - this.getConsumption(stack)); + } else { + player.inventory.consumeInventoryItem(getBeltType(player, stack, main)); + } + } + + @Override + public boolean canReload(ItemStack stack, World world, EntityPlayer player) { + return false; + } + + protected void spawnProjectile(World world, EntityPlayer player, ItemStack stack, int config) { + + //spawn fluid projectile + + if(player instanceof EntityPlayerMP) + PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(AnimType.CYCLE.ordinal()), (EntityPlayerMP) player); + } + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + + list.add("Ammo: " + getMag(stack) + " / " + mainConfig.ammoCap + "mB"); + + list.add("Ammo Type: " + I18n.format(this.getFluidType(stack).getUnlocalizedName())); + + int dura = mainConfig.durability - getItemWear(stack); + + if(dura < 0) + dura = 0; + + list.add("Durability: " + dura + " / " + mainConfig.durability); + list.add(""); + list.add("Name: " + mainConfig.name); + list.add("Manufacturer: " + mainConfig.manufacturer); + + if(!mainConfig.comment.isEmpty()) { + list.add(""); + for(String s : mainConfig.comment) + list.add(EnumChatFormatting.ITALIC + s); + } + + if(GeneralConfig.enableExtendedLogging) { + list.add(""); + list.add("Type: " + getMagType(stack)); + list.add("Is Reloading: " + getIsReloading(stack)); + list.add("Reload Cycle: " + getReloadCycle(stack)); + list.add("RoF Cooldown: " + getDelay(stack)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void renderHUD(Pre event, ElementType type, EntityPlayer player, ItemStack stack) { + + ItemGunBase gun = ((ItemGunBase)stack.getItem()); + GunConfiguration gcfg = gun.mainConfig; + + if(type == ElementType.HOTBAR) { + + FluidType fluid = this.getFluidType(stack); + + ItemStack ammo = ItemFluidIcon.make(fluid, 1); + + int count = ItemGunBase.getMag(stack); + int max = gcfg.ammoCap; + boolean showammo = gcfg.showAmmo; + + int dura = ItemGunBase.getItemWear(stack) * 50 / gcfg.durability; + + RenderScreenOverlay.renderAmmo(event.resolution, Minecraft.getMinecraft().ingameGUI, ammo, count, max, dura, showammo); + } + + if(type == ElementType.CROSSHAIRS && GeneralConfig.enableCrosshairs) { + + event.setCanceled(true); + + if(!(gcfg.hasSights && player.isSneaking())) + RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, ((IHoldableWeapon)player.getHeldItem().getItem()).getCrosshair()); + else + RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, Crosshair.NONE); + } + } + + @Override + protected void reload2(ItemStack stack, World world, EntityPlayer player) { + this.setIsReloading(stack, false); + } + + public FluidType getFluidType(ItemStack stack) { + return Fluids.fromID(this.getMagType(stack)); + } + + public int getConsumption(ItemStack stack) { + return 3; + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return getFluidType(stack) == type || this.getMag(stack) == 0; + } + + public static final int transferSpeed = 50; + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + if(this.getMag(stack) == 0) + this.setMagType(stack, type.getID()); + + int fill = this.getMag(stack); + int req = this.mainConfig.ammoCap - fill; + + int toFill = Math.min(amount, req); + toFill = Math.min(toFill, transferSpeed); + + this.setMag(stack, fill + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return getFluidType(stack) == type; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + + int fill = this.getMag(stack); + int toUnload = Math.min(fill, amount); + toUnload = Math.min(toUnload, transferSpeed); + + this.setMag(stack, fill - toUnload); + + return toUnload; + } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index d2bbe7c7e..72809337b 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -491,6 +491,7 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.detonator_laser, new ItemRenderDetonatorLaser()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_spas12, new ItemRenderWeaponSpas12()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_glass_cannon, new ItemRenderWeaponGlass()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_chemthrower, new ItemRenderWeaponChemthrower()); //multitool MinecraftForgeClient.registerItemRenderer(ModItems.multitool_dig, new ItemRenderMultitool()); MinecraftForgeClient.registerItemRenderer(ModItems.multitool_silk, new ItemRenderMultitool()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 9778ad070..149248f01 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -684,6 +684,7 @@ public class ResourceManager { public static final IModelCustom nightmare_dark = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/nightmare_dark.obj")); public static final IModelCustom glass_cannon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/glass_cannon.obj")); public static final IModelCustom bio_revolver = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/bio_revolver.obj")); + public static final IModelCustom chemthrower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/chemthrower.obj")).asDisplayList(); public static final IModelCustom lance = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lance.obj")); @@ -761,6 +762,7 @@ public class ResourceManager { public static final ResourceLocation spas_12_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/spas-12.png"); public static final ResourceLocation glass_cannon_panel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/glass_cannon_panel.png"); public static final ResourceLocation bio_revolver_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/bio_revolver.png"); + public static final ResourceLocation chemthrower_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/chemthrower.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/item/weapon/ItemRenderWeaponChemthrower.java b/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java new file mode 100644 index 000000000..6cca2ee0b --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java @@ -0,0 +1,105 @@ +package com.hbm.render.item.weapon; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.ItemGunChemthrower; +import com.hbm.main.ResourceManager; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +public class ItemRenderWeaponChemthrower implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch(type) { + case EQUIPPED: + case EQUIPPED_FIRST_PERSON: + case ENTITY: + case INVENTORY: + return true; + default: return false; + } + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + + return type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + GL11.glPushMatrix(); + + GL11.glEnable(GL11.GL_CULL_FACE); + + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.chemthrower_tex); + + switch(type) { + + case EQUIPPED_FIRST_PERSON: + + double s0 = 0.25D; + GL11.glRotated(25, 0, 0, 1); + GL11.glTranslated(1.0, 0.0, 0.0); + GL11.glRotated(170, 0, 1, 0); + GL11.glScaled(s0, s0, s0); + + break; + + case EQUIPPED: + + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); + GL11.glRotatef(20F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(10, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(15F, 1.0F, 0.0F, 0.0F); + GL11.glTranslatef(4F, -2F, 5F); + + break; + + case ENTITY: + + double s1 = 0.1D; + GL11.glScaled(s1, s1, s1); + + break; + + case INVENTORY: + + GL11.glEnable(GL11.GL_LIGHTING); + + double s = 1.5D; + GL11.glTranslated(9, 9, 0); + GL11.glRotated(180, 1, 0, 0); + GL11.glRotated(45, 0, 0, -1); + GL11.glScaled(s, s, -s); + + break; + + default: break; + } + + ItemGunChemthrower chem = (ItemGunChemthrower) item.getItem(); + + GL11.glShadeModel(GL11.GL_SMOOTH); + + ResourceManager.chemthrower.renderPart("Gun"); + ResourceManager.chemthrower.renderPart("Hose"); + ResourceManager.chemthrower.renderPart("Nozzle"); + + GL11.glTranslated(0, 0.875, 1.75); + double d = (double) chem.getMag(item) / (double) chem.mainConfig.ammoCap; + GL11.glRotated(135 - d * 270, 1, 0, 0); + GL11.glTranslated(0, -0.875, -1.75); + + ResourceManager.chemthrower.renderPart("Gauge"); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/util/RenderScreenOverlay.java b/src/main/java/com/hbm/render/util/RenderScreenOverlay.java index 1816841ff..3b49e22d8 100644 --- a/src/main/java/com/hbm/render/util/RenderScreenOverlay.java +++ b/src/main/java/com/hbm/render/util/RenderScreenOverlay.java @@ -117,7 +117,7 @@ public class RenderScreenOverlay { Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - public static void renderAmmo(ScaledResolution resolution, Gui gui, Item ammo, int count, int max, int dura, boolean renderCount) { + public static void renderAmmo(ScaledResolution resolution, Gui gui, ItemStack ammo, int count, int max, int dura, boolean renderCount) { GL11.glPushMatrix(); @@ -138,7 +138,7 @@ public class RenderScreenOverlay { GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL12.GL_RESCALE_NORMAL); RenderHelper.enableGUIStandardItemLighting(); - itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), new ItemStack(ammo), pX, pZ); + itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), ammo, pX, pZ); RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL12.GL_RESCALE_NORMAL); @@ -146,7 +146,7 @@ public class RenderScreenOverlay { Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - public static void renderAmmoAlt(ScaledResolution resolution, Gui gui, Item ammo, int count) { + public static void renderAmmoAlt(ScaledResolution resolution, Gui gui, ItemStack ammo, int count) { GL11.glPushMatrix(); @@ -162,7 +162,7 @@ public class RenderScreenOverlay { GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL12.GL_RESCALE_NORMAL); RenderHelper.enableGUIStandardItemLighting(); - itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), new ItemStack(ammo), pX, pZ); + itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), ammo, pX, pZ); RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL12.GL_RESCALE_NORMAL); diff --git a/src/main/resources/assets/hbm/models/weapons/chemthrower.obj b/src/main/resources/assets/hbm/models/weapons/chemthrower.obj new file mode 100644 index 000000000..6951b0e8b --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/chemthrower.obj @@ -0,0 +1,10366 @@ +# Blender v2.79 (sub 0) OBJ File: 'chemthrower.blend' +# www.blender.org +o Gauge +v -0.812500 1.125000 1.750000 +v -0.812500 1.062500 1.718750 +v -0.812500 1.062500 1.781250 +v -0.812500 0.781250 1.718750 +v -0.812500 0.781250 1.781250 +v -0.812500 0.750000 1.687500 +v -0.812500 0.750000 1.812500 +v -0.812500 0.656250 1.687500 +v -0.812500 0.656250 1.812500 +v -0.781250 1.062500 1.718750 +v -0.781250 1.125000 1.750000 +v -0.781250 1.062500 1.781250 +v -0.781250 0.781250 1.718750 +v -0.781250 0.781250 1.781250 +v -0.781250 0.750000 1.687500 +v -0.781250 0.750000 1.812500 +v -0.781250 0.656250 1.687500 +v -0.781250 0.656250 1.812500 +vt 0.956522 0.427632 +vt 0.952569 0.434211 +vt 0.944664 0.434211 +vt 0.940711 0.427632 +vt 0.936759 0.434211 +vt 0.936759 0.427632 +vt 0.952569 0.506579 +vt 0.956522 0.434211 +vt 0.956522 0.506579 +vt 0.956522 0.407895 +vt 0.940711 0.401316 +vt 0.956522 0.401316 +vt 0.960474 0.407895 +vt 0.960474 0.427632 +vt 0.940711 0.506579 +vt 0.940711 0.434211 +vt 0.952569 0.519737 +vt 0.956522 0.519737 +vt 0.940711 0.407895 +vt 0.936759 0.407895 +vt 0.956522 0.434211 +vt 0.960474 0.434211 +vt 0.944664 0.506579 +vt 0.940711 0.519737 +vt 0.948617 0.519737 +vt 0.940711 0.434211 +vt 0.944664 0.519737 +vn 1.0000 -0.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.4472 -0.8944 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.4472 0.8944 +s off +f 15/1/1 13/2/1 14/3/1 +f 16/4/2 5/5/2 7/6/2 +f 10/7/3 4/8/3 2/9/3 +f 17/10/4 9/11/4 8/12/4 +f 15/1/3 8/13/3 6/14/3 +f 14/3/5 3/15/5 5/16/5 +f 11/17/6 2/9/6 1/18/6 +f 18/19/5 7/6/5 9/20/5 +f 13/21/7 6/14/7 4/22/7 +f 12/23/8 1/24/8 3/15/8 +f 12/23/1 10/7/1 11/25/1 +f 13/2/1 10/7/1 12/23/1 +f 14/3/1 16/4/1 15/1/1 +f 16/4/1 18/19/1 17/10/1 +f 13/2/1 12/23/1 14/3/1 +f 17/10/1 15/1/1 16/4/1 +f 16/4/2 14/26/2 5/5/2 +f 10/7/3 13/2/3 4/8/3 +f 17/10/4 18/19/4 9/11/4 +f 15/1/3 17/10/3 8/13/3 +f 14/3/5 12/23/5 3/15/5 +f 11/17/6 10/7/6 2/9/6 +f 18/19/5 16/4/5 7/6/5 +f 13/21/7 15/1/7 6/14/7 +f 12/23/8 11/27/8 1/24/8 +o Hose +v 3.636194 0.105520 1.124211 +v 3.431454 0.155037 1.151909 +v 3.374818 -0.029521 1.063205 +v 3.638785 0.003349 1.320623 +v 3.433896 0.048782 1.353090 +v 3.378546 -0.100682 1.223395 +v 3.583436 -0.146115 1.190928 +v 3.499617 -1.088292 0.865619 +v 3.294420 -1.078520 0.918903 +v 3.282859 -0.887307 0.833204 +v 3.488057 -0.897079 0.779921 +v 3.424359 -1.157790 0.631249 +v 3.221595 -1.144000 0.693171 +v 3.218235 -0.939250 0.636570 +v 3.420999 -0.953040 0.574649 +v 3.354418 -1.218511 0.415747 +v 3.151654 -1.204721 0.477669 +v 3.148294 -0.999971 0.421068 +v 3.351058 -1.013761 0.359147 +v 3.278193 -1.281636 0.183101 +v 3.078751 -1.266575 0.254083 +v 3.084637 -1.058287 0.222711 +v 3.284079 -1.073348 0.151728 +v 3.582730 -0.557112 1.391697 +v 3.373400 -0.555837 1.426606 +v 3.341904 -0.457226 1.245264 +v 3.551234 -0.458500 1.210355 +v 3.567073 -0.750126 1.240363 +v 3.356922 -0.757588 1.270663 +v 3.328674 -0.624428 1.107544 +v 3.538826 -0.616966 1.077243 +v 3.549878 -0.944667 1.080169 +v 3.340986 -0.945521 1.117642 +v 3.316982 -0.790103 0.978684 +v 3.525874 -0.789249 0.941211 +v 3.627329 -0.159071 1.443409 +v 3.421687 -0.123595 1.482787 +v 3.372809 -0.187485 1.293702 +v 3.578452 -0.222961 1.254324 +v 3.603014 -0.358402 1.464851 +v 3.395637 -0.338596 1.505368 +v 3.356417 -0.313269 1.301845 +v 3.563795 -0.333076 1.261328 +v 3.172221 -1.277496 -0.073578 +v 2.980067 -1.262438 0.015263 +v 3.006246 -1.054157 0.033612 +v 3.198400 -1.069215 -0.055229 +v 3.050292 -1.206096 -0.320498 +v 2.862106 -1.192312 -0.222860 +v 2.899330 -0.987577 -0.180018 +v 3.087517 -1.001361 -0.277656 +v 2.935870 -1.137106 -0.550774 +v 2.747684 -1.123321 -0.453135 +v 2.784908 -0.918586 -0.410293 +v 2.973094 -0.932371 -0.507932 +v 2.808083 -1.058682 -0.800750 +v 2.634602 -1.055277 -0.681434 +v 2.683850 -0.859030 -0.620868 +v 2.857332 -0.862434 -0.740184 +v 2.627134 -0.917498 -0.997121 +v 2.486886 -0.940009 -0.841662 +v 2.563307 -0.764951 -0.751544 +v 2.703555 -0.742439 -0.907003 +v 2.423224 -0.737106 -1.107039 +v 2.301505 -0.775153 -0.937114 +v 2.393075 -0.612796 -0.835169 +v 2.514794 -0.574749 -1.005094 +v 2.236154 -0.570833 -1.203811 +v 2.114434 -0.608880 -1.033886 +v 2.206005 -0.446523 -0.931941 +v 2.327724 -0.408477 -1.101866 +v 2.033221 -0.389803 -1.305461 +v 1.928881 -0.444018 -1.130191 +v 2.034797 -0.295007 -1.023835 +v 2.139136 -0.240792 -1.199104 +v 0.768002 0.897300 -0.902997 +v 0.769729 0.741081 -0.761747 +v 0.936046 0.831425 -0.665672 +v 0.934319 0.987643 -0.806922 +v 0.586922 1.034930 -0.691360 +v 0.605987 0.864148 -0.566430 +v 0.777991 0.949715 -0.475707 +v 0.758926 1.120497 -0.600637 +v 0.409624 1.167337 -0.480225 +v 0.444627 0.987386 -0.376602 +v 0.616153 1.073228 -0.285241 +v 0.581150 1.253179 -0.388864 +v 0.255900 1.232747 -0.255101 +v 0.321170 1.041185 -0.196884 +v 0.491789 1.127375 -0.104161 +v 0.426518 1.318937 -0.162378 +v -0.243118 1.089696 0.611090 +v -0.142188 0.902760 0.608758 +v 0.008606 0.982596 0.735347 +v -0.092324 1.169533 0.737679 +v -0.398558 0.998093 0.854647 +v -0.281298 0.828876 0.820545 +v -0.129019 0.910324 0.944245 +v -0.246279 1.079541 0.978347 +v -0.484899 0.840452 1.071465 +v -0.345375 0.716814 0.977688 +v -0.191071 0.802407 1.095962 +v -0.330596 0.926044 1.189738 +v -0.489997 0.641634 1.228992 +v -0.344539 0.545857 1.107312 +v -0.189696 0.633983 1.223048 +v -0.335154 0.729760 1.344728 +v -0.491858 0.458013 1.371299 +v -0.346400 0.362236 1.249619 +v -0.191557 0.450362 1.365355 +v -0.337015 0.546139 1.487035 +v -0.480968 0.237263 1.534873 +v -0.353568 0.194067 1.383075 +v -0.206169 0.303870 1.486394 +v -0.333570 0.347066 1.638193 +v -0.344535 0.032216 1.614572 +v -0.282839 0.082916 1.428124 +v -0.162528 0.231429 1.517159 +v -0.224224 0.180729 1.703606 +v -0.109536 -0.099468 1.574893 +v -0.149146 0.016430 1.414404 +v -0.033657 0.175379 1.493149 +v 0.005954 0.059481 1.653638 +v 0.027439 -0.147818 1.427059 +v -0.094405 -0.003112 1.356543 +v 0.043800 0.147879 1.410434 +v 0.165644 0.003173 1.480950 +v 1.807889 -0.170192 -1.324261 +v 1.737986 -0.257835 -1.145437 +v 1.872325 -0.136415 -1.036147 +v 1.942228 -0.048772 -1.214971 +v 1.591588 0.057490 -1.256966 +v 1.538742 -0.047411 -1.079934 +v 1.687160 0.059763 -0.972122 +v 1.740006 0.164665 -1.149155 +v 1.390855 0.269420 -1.191306 +v 1.338009 0.164519 -1.014274 +v 1.486427 0.271693 -0.906463 +v 1.539273 0.376595 -1.083495 +v 1.190122 0.481350 -1.125646 +v 1.137276 0.376449 -0.948614 +v 1.285694 0.483623 -0.840803 +v 1.338540 0.588525 -1.017835 +v 0.977027 0.705482 -1.053525 +v 0.942798 0.582204 -0.886224 +v 1.097323 0.683352 -0.781605 +v 1.131551 0.806630 -0.948905 +v 3.659060 0.000862 1.072935 +v 3.547982 0.176418 1.160236 +v 3.637631 0.058311 1.217889 +v 3.351951 0.075137 1.114481 +v 3.432854 0.106807 1.246779 +v 3.376540 -0.068978 1.147828 +v 3.581317 -0.117474 1.118938 +v 3.662333 -0.082741 1.247659 +v 3.550178 0.063431 1.369280 +v 3.636427 -0.066675 1.404950 +v 3.354999 -0.014591 1.296359 +v 3.431275 -0.025773 1.441530 +v 3.467154 -0.160764 1.174738 +v 3.378186 -0.136296 1.276492 +v 3.583339 -0.177199 1.239912 +v 3.545136 -0.995128 0.809449 +v 3.532326 -1.032816 0.982566 +v 3.399908 -1.131209 0.913686 +v 3.460659 -1.125235 0.743717 +v 3.324988 -1.027711 1.027578 +v 3.237340 -0.980471 0.889374 +v 3.257287 -1.112450 0.803479 +v 3.306216 -0.852215 0.914016 +v 3.382568 -0.844390 0.785138 +v 3.251877 -0.911084 0.739604 +v 3.513555 -0.857321 0.869004 +v 3.455249 -0.923870 0.679842 +v 3.473369 -1.058863 0.587469 +v 3.323817 -1.202083 0.676360 +v 3.389388 -1.188151 0.523498 +v 3.169224 -1.038178 0.680351 +v 3.186625 -1.174361 0.585420 +v 3.318777 -0.894958 0.591459 +v 3.183265 -0.969611 0.528819 +v 3.386028 -0.983401 0.466898 +v 3.403429 -1.119583 0.371967 +v 3.253876 -1.262803 0.460858 +v 3.317876 -1.249472 0.303710 +v 3.099283 -1.098898 0.464849 +v 3.115943 -1.235365 0.367897 +v 3.248836 -0.955678 0.375957 +v 3.114894 -1.029730 0.317603 +v 3.316828 -1.043838 0.253417 +v 3.330997 -1.181257 0.149669 +v 3.177001 -1.326178 0.226435 +v 3.231073 -1.296984 0.056483 +v 3.031833 -1.158666 0.256143 +v 3.035113 -1.281288 0.136461 +v 3.185829 -1.013745 0.179377 +v 3.050695 -1.071232 0.130133 +v 3.246655 -1.086928 0.050155 +v 3.619314 -0.508125 1.292299 +v 3.592019 -0.455955 1.449521 +v 3.485940 -0.581127 1.454487 +v 3.574598 -0.656845 1.314328 +v 3.383588 -0.445679 1.488136 +v 3.305320 -0.506213 1.344662 +v 3.364652 -0.662123 1.345781 +v 3.348536 -0.382662 1.292137 +v 3.438694 -0.433210 1.182474 +v 3.335592 -0.537600 1.178106 +v 3.556967 -0.392938 1.253522 +v 3.545538 -0.532322 1.146653 +v 3.605487 -0.681680 1.151228 +v 3.469059 -0.787147 1.296293 +v 3.559164 -0.843788 1.164183 +v 3.290260 -0.692873 1.196679 +v 3.349327 -0.849598 1.196276 +v 3.426688 -0.587407 1.051614 +v 3.322140 -0.710874 1.039197 +v 3.531977 -0.705064 1.007103 +v 3.590099 -0.866744 1.001322 +v 3.451433 -0.983948 1.133645 +v 3.276761 -0.868026 1.057531 +v 3.415427 -0.750822 0.925208 +v 3.654301 -0.199885 1.339022 +v 3.536728 -0.125361 1.510369 +v 3.615016 -0.260695 1.456532 +v 3.345838 -0.146671 1.398089 +v 3.408639 -0.232073 1.497265 +v 3.463411 -0.221195 1.226742 +v 3.364769 -0.248419 1.295372 +v 3.571146 -0.277040 1.254639 +v 3.635249 -0.350691 1.352960 +v 3.509130 -0.354831 1.535990 +v 3.324183 -0.320981 1.413736 +v 3.450301 -0.316841 1.230705 +v 3.233349 -1.177120 -0.086614 +v 3.069600 -1.322037 -0.033745 +v 3.109380 -1.241194 -0.201199 +v 2.945118 -1.154533 0.046648 +v 2.920202 -1.227091 -0.105760 +v 3.108867 -1.009616 -0.006221 +v 2.954665 -1.021469 -0.069042 +v 3.143843 -1.035572 -0.164481 +v 3.115951 -1.107175 -0.323487 +v 2.946893 -1.250388 -0.282390 +v 2.993081 -1.171601 -0.435636 +v 2.833672 -1.086498 -0.177029 +v 2.804895 -1.157816 -0.337998 +v 3.002730 -0.943285 -0.218127 +v 2.842119 -0.953082 -0.295156 +v 3.030305 -0.966866 -0.392794 +v 3.001529 -1.038184 -0.553762 +v 2.832471 -1.181397 -0.512665 +v 2.875318 -1.100252 -0.670836 +v 2.719249 -1.017508 -0.407305 +v 2.690808 -1.089063 -0.567779 +v 2.888308 -0.874295 -0.448402 +v 2.731038 -0.886450 -0.520506 +v 2.915548 -0.897639 -0.623564 +v 2.876078 -0.961409 -0.800296 +v 2.709031 -1.106042 -0.756233 +v 2.727558 -1.001421 -0.917262 +v 2.615856 -0.956303 -0.621322 +v 2.569738 -1.009686 -0.778071 +v 2.782903 -0.811670 -0.665385 +v 2.631791 -0.822979 -0.701256 +v 2.789611 -0.814714 -0.840446 +v 2.700406 -0.824341 -0.990927 +v 2.537905 -0.972518 -0.941920 +v 2.520969 -0.823772 -1.055367 +v 2.490035 -0.858108 -0.757738 +v 2.394618 -0.857935 -0.889058 +v 2.652536 -0.709930 -0.806745 +v 2.482401 -0.692403 -0.790070 +v 2.608752 -0.658240 -0.956379 +v 2.499439 -0.646416 -1.098548 +v 2.339472 -0.796719 -1.047563 +v 2.329689 -0.653970 -1.155425 +v 2.316861 -0.703486 -0.843661 +v 2.207970 -0.692016 -0.985500 +v 2.476828 -0.553184 -0.894646 +v 2.299540 -0.529660 -0.883555 +v 2.421259 -0.491613 -1.053480 +v 2.312368 -0.480143 -1.195320 +v 2.152401 -0.630445 -1.144335 +v 2.138653 -0.484007 -1.253417 +v 2.129790 -0.537213 -0.940433 +v 2.021279 -0.526096 -1.082155 +v 2.289757 -0.386911 -0.991417 +v 2.116435 -0.367076 -0.979108 +v 2.233809 -0.324987 -1.150369 +v 2.112263 -0.301744 -1.296100 +v 1.954572 -0.454164 -1.244416 +v 1.922189 -0.285954 -1.336793 +v 1.955754 -0.383066 -1.033196 +v 1.835149 -0.356610 -1.157963 +v 2.113445 -0.230647 -1.084880 +v 1.955342 -0.221169 -1.048667 +v 2.042383 -0.150513 -1.227497 +v 0.850729 0.981526 -0.890271 +v 0.868407 0.812520 -0.996247 +v 0.727287 0.796605 -0.856391 +v 0.674584 0.968533 -0.794469 +v 0.852476 0.671819 -0.840325 +v 0.853320 0.747199 -0.678398 +v 0.689314 0.801392 -0.665459 +v 1.013001 0.767251 -0.739438 +v 0.976762 0.932120 -0.712278 +v 0.859896 0.888152 -0.573399 +v 1.028932 0.907953 -0.895359 +v 0.845166 1.055293 -0.702409 +v 0.668158 1.120409 -0.677231 +v 0.553454 0.928148 -0.651576 +v 0.500206 1.100022 -0.588376 +v 0.696755 0.864236 -0.489836 +v 0.523255 0.926948 -0.468773 +v 0.811459 1.056498 -0.515492 +v 0.695139 1.012583 -0.377890 +v 0.672090 1.185658 -0.497494 +v 0.486636 1.255246 -0.460450 +v 0.384244 1.055902 -0.451254 +v 0.324936 1.217904 -0.368577 +v 0.539140 0.985319 -0.305015 +v 0.375474 1.030465 -0.286959 +v 0.641533 1.184664 -0.314212 +v 0.546535 1.116531 -0.194938 +v 0.495996 1.303969 -0.276556 +v 0.324891 1.323732 -0.223294 +v 0.245880 1.115419 -0.249173 +v 0.422797 1.036389 -0.135968 +v 0.501808 1.244703 -0.110089 +v -0.169789 1.130692 0.497876 +v -0.070228 0.943143 0.497768 +v 0.081810 1.023537 0.622334 +v -0.017750 1.211086 0.622442 +v -0.192953 1.176348 0.674968 +v -0.230351 0.976268 0.578277 +v -0.318611 1.046310 0.728536 +v -0.041558 0.895944 0.671470 +v -0.213598 0.863804 0.718262 +v -0.004160 1.096024 0.768160 +v -0.062433 0.944044 0.844128 +v -0.167446 1.126550 0.854403 +v -0.351734 1.081121 0.925023 +v -0.377998 0.893123 0.806671 +v -0.461230 0.933366 0.974074 +v -0.175843 0.827296 0.873869 +v -0.330239 0.784403 0.909167 +v -0.149579 1.015295 0.992221 +v -0.176711 0.867693 1.030066 +v -0.307703 1.016655 1.094972 +v -0.442629 0.914157 1.154046 +v -0.453713 0.757235 0.995008 +v -0.488257 0.737243 1.154034 +v -0.233342 0.728701 1.013381 +v -0.344282 0.634501 1.039329 +v -0.222258 0.885624 1.172418 +v -0.189574 0.721994 1.155700 +v -0.333549 0.824736 1.270404 +v -0.448940 0.709641 1.317280 +v -0.455979 0.571713 1.139218 +v -0.490928 0.549823 1.300146 +v -0.230753 0.565976 1.134760 +v -0.345469 0.454046 1.178465 +v -0.223714 0.703903 1.312822 +v -0.190626 0.542172 1.294201 +v -0.336085 0.637949 1.415882 +v -0.450801 0.526020 1.459587 +v -0.457840 0.388093 1.281525 +v -0.489601 0.356920 1.447769 +v -0.232614 0.382355 1.277067 +v -0.348657 0.274288 1.318559 +v -0.225575 0.520282 1.455129 +v -0.195675 0.367834 1.431191 +v -0.336619 0.450466 1.560401 +v -0.439119 0.302964 1.624482 +v -0.454118 0.188214 1.433144 +v -0.440950 0.121532 1.601008 +v -0.248018 0.238169 1.396785 +v -0.339004 0.128100 1.425488 +v -0.233020 0.352919 1.588123 +v -0.202100 0.258419 1.519028 +v -0.304045 0.251851 1.694548 +v -0.299803 0.093797 1.705701 +v -0.343765 0.020438 1.499089 +v -0.223478 -0.038759 1.598291 +v -0.207260 0.169847 1.426029 +v -0.210933 0.048899 1.416067 +v -0.163298 0.243207 1.632641 +v -0.101649 0.208537 1.501595 +v -0.114194 0.120879 1.683819 +v -0.041888 -0.048968 1.654388 +v -0.158213 -0.081256 1.474963 +v -0.020099 -0.139344 1.524457 +v -0.101304 0.124879 1.413654 +v -0.107097 -0.004303 1.401706 +v 0.015021 0.157167 1.593080 +v 0.021482 0.149359 1.470026 +v 0.108480 0.014317 1.592777 +v 0.127003 -0.108499 1.471634 +v -0.068034 -0.113213 1.378328 +v 0.051443 -0.140146 1.311562 +v -0.055764 0.108560 1.365860 +v -0.091833 0.008253 1.285659 +v 0.139273 0.113274 1.459165 +v 0.052292 0.158225 1.327227 +v 0.195568 0.009825 1.353130 +v 1.892534 -0.087572 -1.314322 +v 1.739353 -0.244369 -1.262171 +v 1.695847 -0.052413 -1.290205 +v 1.787680 -0.219035 -1.046086 +v 1.638736 -0.153000 -1.112725 +v 1.940861 -0.062238 -1.098236 +v 1.783634 -0.042264 -1.004544 +v 1.840745 0.058323 -1.182024 +v 1.679008 0.137303 -1.247318 +v 1.528061 -0.021754 -1.195403 +v 1.491222 0.163455 -1.224136 +v 1.599739 -0.020050 -0.981770 +v 1.438375 0.058553 -1.047104 +v 1.750687 0.139007 -1.033686 +v 1.586793 0.165728 -0.939293 +v 1.639639 0.270630 -1.116325 +v 1.478275 0.349233 -1.181658 +v 1.327328 0.190176 -1.129743 +v 1.290488 0.375386 -1.158476 +v 1.399006 0.191880 -0.916110 +v 1.237643 0.270484 -0.981444 +v 1.549954 0.350937 -0.968026 +v 1.386060 0.377658 -0.873633 +v 1.438906 0.482560 -1.050665 +v 1.277542 0.561163 -1.115999 +v 1.126595 0.402106 -1.064083 +v 1.086665 0.590366 -1.091201 +v 1.198273 0.403811 -0.850451 +v 1.038473 0.480870 -0.916602 +v 1.349221 0.562868 -0.902366 +v 1.188418 0.586538 -0.809588 +v 1.236609 0.696033 -0.984188 +v 1.062846 0.786876 -1.043040 +v 0.921282 0.618557 -0.996029 +v 1.011503 0.601959 -0.792090 +v 1.153068 0.770278 -0.839100 +v 3.661171 -0.132163 1.313286 +v 3.547123 -0.018593 1.464500 +v 3.353442 -0.070809 1.368156 +v 3.467491 -0.184378 1.216942 +v 3.574775 -0.946345 0.914532 +v 3.433350 -1.074137 1.033463 +v 3.263768 -0.938686 0.982050 +v 3.405193 -0.810894 0.863119 +v 3.626601 -0.427015 1.341868 +v 3.496567 -0.466571 1.517828 +v 3.313954 -0.411602 1.399790 +v 3.443989 -0.372046 1.223830 +v 3.287854 -1.195880 0.033325 +v 3.129198 -1.341650 0.098054 +v 2.993914 -1.172336 0.153292 +v 3.152571 -1.026566 0.088562 +v 2.798040 -0.906002 -0.913651 +v 2.633135 -1.052230 -0.866870 +v 2.561310 -0.918399 -0.704866 +v 2.726214 -0.772170 -0.751647 +v 2.004046 -0.200570 -1.326853 +v 1.848620 -0.355142 -1.274702 +v 1.873485 -0.306553 -1.058607 +v 2.028911 -0.151981 -1.110758 +v 0.397831 1.307796 -0.342971 +v 0.307440 1.102668 -0.350773 +v 0.473639 1.026639 -0.220544 +v 0.564030 1.231767 -0.212741 +v -0.417215 1.012251 1.050749 +v -0.434116 0.838062 0.911396 +v -0.220727 0.788807 0.953390 +v -0.203825 0.962997 1.092744 +v -0.397984 0.185049 1.691658 +v -0.424203 0.092236 1.489863 +v -0.245066 0.194901 1.428378 +v -0.218846 0.287714 1.630173 +v 0.065940 -0.096274 1.589305 +v -0.095743 -0.110239 1.446001 +v -0.064557 0.106288 1.405178 +v 0.097126 0.120253 1.548482 +v 0.952652 0.895412 -0.984783 +v 0.820310 0.718311 -0.943508 +v 0.928756 0.684360 -0.750901 +v 1.061098 0.861460 -0.792177 +v 3.660669 -0.041706 1.161191 +v 3.549321 0.126505 1.257072 +v 3.353503 0.031039 1.204526 +v 3.464850 -0.137172 1.108645 +v 3.508797 -1.027749 0.696839 +v 3.360325 -1.169184 0.789567 +v 3.203739 -1.008571 0.786482 +v 3.352210 -0.867136 0.693754 +v 3.438399 -1.089223 0.479718 +v 3.288846 -1.232443 0.568609 +v 3.134254 -1.068538 0.572600 +v 3.283806 -0.925318 0.483708 +v 3.367836 -1.150182 0.262517 +v 3.217172 -1.293827 0.348377 +v 3.064935 -1.129020 0.358797 +v 3.215599 -0.985375 0.272937 +v 3.612555 -0.593265 1.222627 +v 3.476890 -0.690615 1.371973 +v 3.297636 -0.601181 1.269806 +v 3.433300 -0.503831 1.120461 +v 3.598029 -0.772974 1.077620 +v 3.461042 -0.881374 1.219499 +v 3.283275 -0.781689 1.125760 +v 3.420262 -0.673288 0.983881 +v 3.644676 -0.276023 1.345402 +v 3.522795 -0.242298 1.527371 +v 3.335109 -0.233091 1.406502 +v 3.456990 -0.266816 1.224532 +v 3.173906 -1.141909 -0.206700 +v 3.006175 -1.285548 -0.162659 +v 2.890139 -1.120754 -0.063541 +v 3.057869 -0.977116 -0.107582 +v 3.058740 -1.072680 -0.438625 +v 2.889682 -1.215892 -0.397527 +v 2.776460 -1.052003 -0.292167 +v 2.945518 -0.908790 -0.333265 +v 2.941561 -1.001743 -0.672965 +v 2.773005 -1.145311 -0.631126 +v 2.664795 -0.984959 -0.518378 +v 2.833351 -0.841391 -0.560217 +v 2.596448 -0.732466 -1.047450 +v 2.435848 -0.882236 -0.996959 +v 2.406922 -0.783710 -0.797987 +v 2.567522 -0.633939 -0.848477 +v 2.405904 -0.563280 -1.146934 +v 2.245937 -0.713582 -1.095949 +v 2.223325 -0.620350 -0.892047 +v 2.383292 -0.470047 -0.943032 +v 2.215575 -0.393975 -1.244708 +v 2.056177 -0.544807 -1.193548 +v 2.039513 -0.457108 -0.987816 +v 2.198911 -0.306277 -1.038976 +v 0.756193 1.053698 -0.780692 +v 0.639304 0.863272 -0.752980 +v 0.778288 0.802987 -0.587177 +v 0.895177 0.993413 -0.614888 +v 0.580385 1.186108 -0.572836 +v 0.468759 0.992076 -0.551295 +v 0.614959 0.926497 -0.393431 +v 0.726585 1.120529 -0.414971 +v -0.118660 1.217776 0.560186 +v -0.158018 1.016819 0.466680 +v 0.030681 0.936453 0.560024 +v 0.070040 1.137410 0.653530 +v -0.269281 1.132057 0.794038 +v -0.303896 0.934998 0.691932 +v -0.111763 0.858297 0.778626 +v -0.077148 1.055357 0.880732 +v -0.446897 0.806675 1.240895 +v -0.454947 0.663999 1.067589 +v -0.230935 0.652562 1.068838 +v -0.222885 0.795238 1.242144 +v -0.449871 0.617831 1.388434 +v -0.456909 0.479903 1.210371 +v -0.231683 0.474165 1.205913 +v -0.224645 0.612092 1.383976 +v -0.448346 0.424351 1.536388 +v -0.457375 0.292218 1.355006 +v -0.236930 0.300403 1.342573 +v -0.227902 0.432536 1.523954 +v -0.171973 0.019145 1.686611 +v -0.244527 -0.034840 1.485797 +v -0.153155 0.150632 1.413275 +v -0.080601 0.204618 1.614089 +v 0.159325 -0.102261 1.338822 +v -0.056226 -0.103439 1.288218 +v -0.055590 0.120339 1.299967 +v 0.159961 0.121517 1.350570 +v 1.782573 0.028102 -1.280484 +v 1.631067 -0.130390 -1.228510 +v 1.696908 -0.122779 -1.014264 +v 1.848414 0.035713 -1.066238 +v 1.578642 0.243268 -1.214488 +v 1.427694 0.084211 -1.162573 +v 1.499373 0.085915 -0.948940 +v 1.650321 0.244972 -1.000856 +v 1.377909 0.455198 -1.148829 +v 1.226961 0.296141 -1.096913 +v 1.298640 0.297845 -0.883280 +v 1.449588 0.456903 -0.935196 +v 1.173685 0.670574 -1.081344 +v 1.025083 0.509201 -1.030655 +v 1.101398 0.506330 -0.819445 +v 1.250000 0.667703 -0.870135 +v -0.198370 1.075389 0.432724 +v 0.170365 1.169314 -0.213583 +v -0.142441 0.943850 0.445517 +v 0.226294 1.037776 -0.200790 +v -0.023875 0.889365 0.505244 +v 0.344860 0.983291 -0.141063 +v 0.087876 0.943850 0.576918 +v 0.456611 1.037776 -0.069388 +v 0.127348 1.075389 0.618555 +v 0.496083 1.169314 -0.027752 +v 0.071420 1.206927 0.605762 +v 0.440155 1.300853 -0.040545 +v -0.047147 1.261412 0.546035 +v 0.321588 1.355338 -0.100272 +v -0.158898 1.206927 0.474360 +v 0.209837 1.300853 -0.171947 +v 0.199561 1.004891 -0.220821 +v 0.129651 1.169314 -0.236811 +v 0.347769 0.936785 -0.146162 +v 0.487457 1.004891 -0.056568 +v 0.536798 1.169314 -0.004523 +v 0.466887 1.333738 -0.020514 +v 0.318679 1.401844 -0.095173 +v 0.178991 1.333738 -0.184766 +v 0.261017 1.020545 -0.328539 +v 0.191106 1.184969 -0.344529 +v 0.409225 0.952439 -0.253880 +v 0.548913 1.020545 -0.164286 +v 0.598253 1.184969 -0.112241 +v 0.528343 1.349392 -0.128232 +v 0.380135 1.417499 -0.202891 +v 0.240447 1.349392 -0.292484 +v -0.239084 1.075389 0.409495 +v -0.169174 0.910965 0.425486 +v -0.020966 0.842859 0.500145 +v 0.118722 0.910965 0.589738 +v 0.168063 1.075389 0.641783 +v 0.098152 1.239812 0.625793 +v -0.050056 1.307918 0.551134 +v -0.189744 1.239812 0.461541 +v -0.300540 1.059734 0.517213 +v -0.230630 0.895311 0.533204 +v -0.082421 0.827204 0.607863 +v 0.057267 0.895311 0.697456 +v 0.106607 1.059734 0.749501 +v 0.036696 1.224158 0.733511 +v -0.111512 1.292264 0.658852 +v -0.251200 1.224158 0.569258 +v -0.104048 1.238083 0.582708 +v -0.106962 1.235316 0.606286 +v -0.092269 1.234170 0.625124 +v -0.068576 1.235316 0.628186 +v -0.049762 1.238083 0.613680 +v -0.046848 1.240851 0.590102 +v -0.061541 1.241997 0.571265 +v -0.085234 1.240851 0.568202 +v -0.111806 1.362099 0.596305 +v -0.114720 1.359332 0.619883 +v -0.100027 1.358186 0.638721 +v -0.076334 1.359332 0.641783 +v -0.057520 1.362099 0.627277 +v -0.054606 1.364866 0.603699 +v -0.069299 1.366013 0.584862 +v -0.092992 1.364866 0.581799 +v -0.167738 1.323268 0.631279 +v -0.059165 1.323268 0.693223 +v 0.016630 1.370231 0.308126 +v 0.125202 1.370231 0.370069 +v 0.254696 1.556864 -0.109148 +v 0.363268 1.556864 -0.047205 +v 0.316152 1.572518 -0.216866 +v 0.424724 1.572518 -0.154923 +v 0.020509 1.308223 0.301327 +v 0.129081 1.308223 0.363271 +v 0.258574 1.494856 -0.115947 +v 0.367147 1.494856 -0.054003 +v -0.198370 1.075389 0.432724 +v 0.170365 1.169314 -0.213583 +v -0.142441 0.943850 0.445517 +v 0.226294 1.037776 -0.200790 +v -0.023875 0.889365 0.505244 +v 0.344860 0.983291 -0.141063 +v 0.087876 0.943850 0.576918 +v 0.456611 1.037776 -0.069388 +v 0.127348 1.075389 0.618555 +v 0.496083 1.169314 -0.027752 +v 0.071420 1.206927 0.605762 +v 0.440155 1.300853 -0.040545 +v -0.047147 1.261412 0.546035 +v 0.321588 1.355338 -0.100272 +v -0.158898 1.206927 0.474360 +v 0.209837 1.300853 -0.171947 +v 0.199561 1.004891 -0.220821 +v 0.129651 1.169314 -0.236811 +v 0.347769 0.936785 -0.146162 +v 0.487457 1.004891 -0.056568 +v 0.536798 1.169314 -0.004523 +v 0.466887 1.333738 -0.020514 +v 0.318679 1.401844 -0.095173 +v 0.178991 1.333738 -0.184766 +v 0.261017 1.020545 -0.328539 +v 0.191106 1.184969 -0.344529 +v 0.409225 0.952439 -0.253880 +v 0.548913 1.020545 -0.164286 +v 0.598253 1.184969 -0.112241 +v 0.528343 1.349392 -0.128232 +v 0.380135 1.417499 -0.202891 +v 0.240447 1.349392 -0.292484 +v -0.239084 1.075389 0.409495 +v -0.169174 0.910965 0.425486 +v -0.020966 0.842859 0.500145 +v 0.118722 0.910965 0.589738 +v 0.168063 1.075389 0.641783 +v 0.098152 1.239812 0.625793 +v -0.050056 1.307918 0.551134 +v -0.189744 1.239812 0.461541 +v -0.300540 1.059734 0.517213 +v -0.230630 0.895311 0.533204 +v -0.082421 0.827204 0.607863 +v 0.057267 0.895311 0.697456 +v 0.106607 1.059734 0.749501 +v 0.036696 1.224158 0.733511 +v -0.111512 1.292264 0.658852 +v -0.251200 1.224158 0.569258 +v -0.111806 1.362099 0.596305 +v -0.114720 1.359332 0.619883 +v -0.100027 1.358186 0.638721 +v -0.076334 1.359332 0.641783 +v -0.057520 1.362099 0.627277 +v -0.054606 1.364866 0.603699 +v -0.069299 1.366013 0.584862 +v -0.092992 1.364866 0.581799 +vt 0.225296 0.842105 +vt 0.229249 0.822368 +vt 0.229249 0.842105 +vt 0.177866 0.743421 +vt 0.173913 0.763158 +vt 0.173913 0.743421 +vt 0.225296 0.723684 +vt 0.229249 0.743421 +vt 0.225296 0.743421 +vt 0.225296 0.782895 +vt 0.229249 0.802632 +vt 0.225296 0.802632 +vt 0.225296 0.822368 +vt 0.225296 0.684211 +vt 0.229249 0.703947 +vt 0.225296 0.703947 +vt 0.229249 0.763158 +vt 0.225296 0.763158 +vt 0.229249 0.723684 +vt 0.229249 0.782895 +vt 0.252964 0.684553 +vt 0.268569 0.710526 +vt 0.252964 0.736500 +vt 0.177866 0.703947 +vt 0.173913 0.723684 +vt 0.173913 0.703947 +vt 0.177866 0.782895 +vt 0.177866 0.763158 +vt 0.177866 0.822368 +vt 0.173913 0.842105 +vt 0.173913 0.822368 +vt 0.177866 0.723684 +vt 0.173913 0.802632 +vt 0.173913 0.782895 +vt 0.177866 0.802632 +vt 0.177866 0.684211 +vt 0.173913 0.684211 +vt 0.139164 0.692160 +vt 0.161232 0.692160 +vt 0.161232 0.728892 +vt 0.724842 0.683746 +vt 0.721799 0.683746 +vt 0.719647 0.680164 +vt 0.743083 0.651316 +vt 0.782609 0.638158 +vt 0.782609 0.651316 +vt 0.782609 0.657895 +vt 0.790514 0.638158 +vt 0.782609 0.631579 +vt 0.790514 0.651316 +vt 0.719368 0.638158 +vt 0.719368 0.651316 +vt 0.743083 0.638158 +vt 0.743083 0.631579 +vt 0.743083 0.657895 +vt 0.229249 0.684211 +vt 0.263999 0.692160 +vt 0.263998 0.728892 +vt 0.241930 0.728892 +vt 0.237360 0.710526 +vt 0.241930 0.692160 +vt 0.177866 0.842105 +vt 0.139164 0.728892 +vt 0.134593 0.710526 +vt 0.150198 0.684553 +vt 0.165802 0.710526 +vt 0.150198 0.736499 +vt 0.719647 0.675099 +vt 0.721799 0.671518 +vt 0.724842 0.671518 +vt 0.726993 0.675099 +vt 0.726993 0.680164 +vt 0.229249 0.703947 +vt 0.237154 0.684211 +vt 0.237154 0.703947 +vt 0.229249 0.723684 +vt 0.237154 0.743421 +vt 0.229249 0.743421 +vt 0.229249 0.763158 +vt 0.237154 0.782895 +vt 0.229249 0.782895 +vt 0.229249 0.842105 +vt 0.237154 0.822368 +vt 0.237154 0.842105 +vt 0.237154 0.723684 +vt 0.225296 0.750000 +vt 0.177866 0.763158 +vt 0.177866 0.750000 +vt 0.225296 0.736842 +vt 0.177866 0.736842 +vt 0.225296 0.723684 +vt 0.177866 0.723684 +vt 0.177866 0.710526 +vt 0.177866 0.697368 +vt 0.225296 0.710526 +vt 0.225296 0.684211 +vt 0.177866 0.684211 +vt 0.177866 0.776316 +vt 0.225296 0.789474 +vt 0.177866 0.789474 +vt 0.225296 0.763158 +vt 0.513834 0.894737 +vt 0.529644 0.921053 +vt 0.513834 0.921053 +vt 0.529644 0.947368 +vt 0.513834 0.947368 +vt 0.513834 0.868421 +vt 0.529644 0.842105 +vt 0.529644 0.868421 +vt 0.529644 0.815789 +vt 0.513834 0.842105 +vt 0.513834 0.815789 +vt 0.545455 0.947368 +vt 0.545455 0.921053 +vt 0.529644 0.894737 +vt 0.545455 0.894737 +vt 0.561265 0.921053 +vt 0.561265 0.947368 +vt 0.545455 0.868421 +vt 0.545455 0.842105 +vt 0.561265 0.842105 +vt 0.561265 0.868421 +vt 0.545455 0.815789 +vt 0.545455 0.789474 +vt 0.561265 0.789474 +vt 0.561265 0.815789 +vt 0.545455 1.000000 +vt 0.529644 0.973684 +vt 0.545455 0.973684 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.735178 0.921053 +vt 0.719368 0.947368 +vt 0.719368 0.921053 +vt 0.735178 0.894737 +vt 0.750988 0.894737 +vt 0.750988 0.921053 +vt 0.735178 0.947368 +vt 0.719368 0.868421 +vt 0.735178 0.868421 +vt 0.719368 0.842105 +vt 0.735178 0.842105 +vt 0.750988 0.868421 +vt 0.719368 0.815789 +vt 0.735178 0.815789 +vt 0.719368 0.789474 +vt 0.735178 0.789474 +vt 0.750988 0.815789 +vt 0.750988 0.842105 +vt 0.735178 0.973684 +vt 0.719368 1.000000 +vt 0.719368 0.973684 +vt 0.750988 0.947368 +vt 0.750988 0.973684 +vt 0.735178 1.000000 +vt 0.766798 0.921053 +vt 0.766798 0.894737 +vt 0.513834 0.894737 +vt 0.529644 0.921053 +vt 0.513834 0.921053 +vt 0.513834 0.947368 +vt 0.766798 0.868421 +vt 0.766798 0.842105 +vt 0.513834 0.868421 +vt 0.529644 0.842105 +vt 0.529644 0.868421 +vt 0.766798 0.815789 +vt 0.750988 0.789474 +vt 0.766798 0.789474 +vt 0.513834 0.815789 +vt 0.529644 0.789474 +vt 0.529644 0.815789 +vt 0.513834 0.842105 +vt 0.766798 0.973684 +vt 0.750988 1.000000 +vt 0.766798 0.947368 +vt 0.529644 0.973684 +vt 0.513834 0.973684 +vt 0.513834 1.000000 +vt 0.545455 0.921053 +vt 0.529644 0.947368 +vt 0.545455 0.894737 +vt 0.561265 0.921053 +vt 0.561265 0.947368 +vt 0.545455 0.947368 +vt 0.545455 0.868421 +vt 0.529644 0.894737 +vt 0.545455 0.842105 +vt 0.561265 0.842105 +vt 0.561265 0.868421 +vt 0.545455 0.815789 +vt 0.545455 0.789474 +vt 0.561265 0.789474 +vt 0.561265 0.815789 +vt 0.545455 0.973684 +vt 0.529644 1.000000 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.545455 1.000000 +vt 0.577075 0.947368 +vt 0.577075 0.921053 +vt 0.561265 0.894737 +vt 0.577075 0.894737 +vt 0.592885 0.921053 +vt 0.592885 0.947368 +vt 0.577075 0.868421 +vt 0.577075 0.842105 +vt 0.592885 0.842105 +vt 0.592885 0.868421 +vt 0.577075 0.815789 +vt 0.577075 0.789474 +vt 0.592885 0.789474 +vt 0.592885 0.815789 +vt 0.577075 1.000000 +vt 0.577075 0.973684 +vt 0.592885 0.973684 +vt 0.592885 1.000000 +vt 0.640316 0.921053 +vt 0.624506 0.947368 +vt 0.624506 0.921053 +vt 0.640316 0.894737 +vt 0.656126 0.894737 +vt 0.656126 0.921053 +vt 0.640316 0.947368 +vt 0.624506 0.868421 +vt 0.640316 0.868421 +vt 0.624506 0.842105 +vt 0.640316 0.842105 +vt 0.656126 0.868421 +vt 0.624506 0.815789 +vt 0.640316 0.815789 +vt 0.624506 0.789474 +vt 0.640316 0.789474 +vt 0.656126 0.815789 +vt 0.656126 0.842105 +vt 0.640316 0.973684 +vt 0.624506 1.000000 +vt 0.624506 0.973684 +vt 0.656126 0.947368 +vt 0.656126 0.973684 +vt 0.640316 1.000000 +vt 0.671937 0.921053 +vt 0.671937 0.894737 +vt 0.687747 0.921053 +vt 0.687747 0.947368 +vt 0.671937 0.947368 +vt 0.671937 0.868421 +vt 0.671937 0.842105 +vt 0.687747 0.842105 +vt 0.687747 0.868421 +vt 0.671937 0.815789 +vt 0.656126 0.789474 +vt 0.671937 0.789474 +vt 0.687747 0.789474 +vt 0.687747 0.815789 +vt 0.671937 0.973684 +vt 0.656126 1.000000 +vt 0.687747 0.973684 +vt 0.687747 1.000000 +vt 0.671937 1.000000 +vt 0.703557 0.947368 +vt 0.703557 0.921053 +vt 0.687747 0.894737 +vt 0.703557 0.894737 +vt 0.703557 0.868421 +vt 0.703557 0.842105 +vt 0.703557 0.815789 +vt 0.703557 0.789474 +vt 0.703557 1.000000 +vt 0.703557 0.973684 +vt 0.577075 0.921053 +vt 0.577075 0.894737 +vt 0.592885 0.894737 +vt 0.592885 0.921053 +vt 0.577075 0.947368 +vt 0.577075 0.868421 +vt 0.577075 0.842105 +vt 0.592885 0.868421 +vt 0.577075 0.815789 +vt 0.577075 0.789474 +vt 0.592885 0.815789 +vt 0.592885 0.842105 +vt 0.577075 0.973684 +vt 0.592885 0.947368 +vt 0.592885 0.973684 +vt 0.577075 1.000000 +vt 0.608696 0.947368 +vt 0.608696 0.921053 +vt 0.608696 0.894737 +vt 0.608696 0.868421 +vt 0.608696 0.842105 +vt 0.608696 0.815789 +vt 0.608696 0.789474 +vt 0.608696 1.000000 +vt 0.608696 0.973684 +vt 0.608696 0.921053 +vt 0.608696 0.894737 +vt 0.624506 0.894737 +vt 0.624506 0.921053 +vt 0.608696 0.947368 +vt 0.608696 0.868421 +vt 0.608696 0.842105 +vt 0.624506 0.868421 +vt 0.608696 0.815789 +vt 0.608696 0.789474 +vt 0.624506 0.815789 +vt 0.624506 0.842105 +vt 0.608696 0.973684 +vt 0.624506 0.947368 +vt 0.624506 0.973684 +vt 0.608696 1.000000 +vt 0.640316 0.921053 +vt 0.640316 0.894737 +vt 0.656126 0.894737 +vt 0.656126 0.921053 +vt 0.640316 0.947368 +vt 0.640316 0.868421 +vt 0.640316 0.842105 +vt 0.656126 0.868421 +vt 0.640316 0.815789 +vt 0.624506 0.789474 +vt 0.640316 0.789474 +vt 0.656126 0.815789 +vt 0.640316 0.973684 +vt 0.624506 1.000000 +vt 0.656126 0.947368 +vt 0.656126 0.973684 +vt 0.656126 1.000000 +vt 0.640316 1.000000 +vt 0.671937 0.947368 +vt 0.671937 0.921053 +vt 0.671937 0.894737 +vt 0.687747 0.894737 +vt 0.687747 0.921053 +vt 0.687747 0.947368 +vt 0.671937 0.868421 +vt 0.671937 0.842105 +vt 0.687747 0.842105 +vt 0.687747 0.868421 +vt 0.671937 0.815789 +vt 0.656126 0.789474 +vt 0.671937 0.789474 +vt 0.687747 0.815789 +vt 0.671937 1.000000 +vt 0.671937 0.973684 +vt 0.687747 0.973684 +vt 0.687747 1.000000 +vt 0.703557 0.947368 +vt 0.703557 0.921053 +vt 0.703557 0.894737 +vt 0.719368 0.894737 +vt 0.719368 0.921053 +vt 0.719368 0.947368 +vt 0.703557 0.868421 +vt 0.703557 0.842105 +vt 0.719368 0.842105 +vt 0.719368 0.868421 +vt 0.703557 0.815789 +vt 0.687747 0.789474 +vt 0.703557 0.789474 +vt 0.719368 0.815789 +vt 0.703557 1.000000 +vt 0.703557 0.973684 +vt 0.719368 0.973684 +vt 0.719368 1.000000 +vt 0.735178 0.921053 +vt 0.735178 0.894737 +vt 0.750988 0.921053 +vt 0.735178 0.947368 +vt 0.735178 0.868421 +vt 0.735178 0.842105 +vt 0.750988 0.868421 +vt 0.750988 0.894737 +vt 0.735178 0.815789 +vt 0.735178 0.789474 +vt 0.750988 0.789474 +vt 0.750988 0.815789 +vt 0.750988 0.842105 +vt 0.735178 0.973684 +vt 0.750988 0.947368 +vt 0.750988 0.973684 +vt 0.735178 1.000000 +vt 0.766798 0.921053 +vt 0.766798 0.894737 +vt 0.513834 0.894737 +vt 0.529644 0.921053 +vt 0.513834 0.921053 +vt 0.513834 0.947368 +vt 0.766798 0.868421 +vt 0.766798 0.842105 +vt 0.513834 0.842105 +vt 0.529644 0.868421 +vt 0.513834 0.868421 +vt 0.529644 0.894737 +vt 0.766798 0.815789 +vt 0.766798 0.789474 +vt 0.513834 0.815789 +vt 0.529644 0.789474 +vt 0.529644 0.815789 +vt 0.766798 0.973684 +vt 0.750988 1.000000 +vt 0.766798 0.947368 +vt 0.513834 0.973684 +vt 0.529644 0.947368 +vt 0.529644 0.973684 +vt 0.529644 1.000000 +vt 0.513834 1.000000 +vt 0.545455 0.921053 +vt 0.545455 0.894737 +vt 0.561265 0.894737 +vt 0.561265 0.921053 +vt 0.561265 0.947368 +vt 0.545455 0.947368 +vt 0.545455 0.868421 +vt 0.545455 0.842105 +vt 0.561265 0.842105 +vt 0.561265 0.868421 +vt 0.545455 0.815789 +vt 0.529644 0.842105 +vt 0.545455 0.789474 +vt 0.561265 0.815789 +vt 0.545455 0.973684 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.545455 1.000000 +vt 0.577075 0.947368 +vt 0.577075 0.921053 +vt 0.577075 0.894737 +vt 0.592885 0.894737 +vt 0.592885 0.921053 +vt 0.592885 0.947368 +vt 0.577075 0.868421 +vt 0.577075 0.842105 +vt 0.592885 0.842105 +vt 0.592885 0.868421 +vt 0.577075 0.815789 +vt 0.561265 0.789474 +vt 0.577075 0.789474 +vt 0.592885 0.815789 +vt 0.577075 1.000000 +vt 0.577075 0.973684 +vt 0.592885 0.973684 +vt 0.592885 1.000000 +vt 0.766798 0.947368 +vt 0.750988 0.921053 +vt 0.766798 0.921053 +vt 0.750988 0.894737 +vt 0.766798 0.894737 +vt 0.513834 0.894737 +vt 0.529644 0.921053 +vt 0.513834 0.921053 +vt 0.529644 0.947368 +vt 0.513834 0.947368 +vt 0.750988 0.868421 +vt 0.766798 0.868421 +vt 0.750988 0.842105 +vt 0.766798 0.842105 +vt 0.513834 0.842105 +vt 0.529644 0.868421 +vt 0.513834 0.868421 +vt 0.529644 0.894737 +vt 0.766798 0.815789 +vt 0.750988 0.815789 +vt 0.766798 0.789474 +vt 0.513834 0.815789 +vt 0.529644 0.789474 +vt 0.529644 0.815789 +vt 0.766798 0.973684 +vt 0.750988 1.000000 +vt 0.750988 0.973684 +vt 0.513834 0.973684 +vt 0.529644 0.973684 +vt 0.513834 1.000000 +vt 0.545455 0.947368 +vt 0.545455 0.921053 +vt 0.545455 0.894737 +vt 0.561265 0.894737 +vt 0.561265 0.921053 +vt 0.545455 0.868421 +vt 0.529644 0.842105 +vt 0.545455 0.842105 +vt 0.561265 0.842105 +vt 0.561265 0.868421 +vt 0.545455 0.815789 +vt 0.545455 0.789474 +vt 0.561265 0.815789 +vt 0.545455 0.973684 +vt 0.529644 1.000000 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.545455 1.000000 +vt 0.577075 0.921053 +vt 0.561265 0.947368 +vt 0.577075 0.894737 +vt 0.592885 0.894737 +vt 0.592885 0.921053 +vt 0.577075 0.947368 +vt 0.577075 0.868421 +vt 0.577075 0.842105 +vt 0.592885 0.842105 +vt 0.592885 0.868421 +vt 0.577075 0.815789 +vt 0.561265 0.789474 +vt 0.577075 0.789474 +vt 0.592885 0.815789 +vt 0.577075 1.000000 +vt 0.577075 0.973684 +vt 0.592885 0.973684 +vt 0.592885 1.000000 +vt 0.608696 0.947368 +vt 0.608696 0.921053 +vt 0.608696 0.894737 +vt 0.608696 0.868421 +vt 0.608696 0.842105 +vt 0.608696 0.815789 +vt 0.608696 0.789474 +vt 0.608696 0.973684 +vt 0.529644 0.868421 +vt 0.513834 0.842105 +vt 0.529644 0.842105 +vt 0.513834 0.815789 +vt 0.529644 0.815789 +vt 0.545455 0.815789 +vt 0.545455 0.842105 +vt 0.513834 0.789474 +vt 0.529644 0.789474 +vt 0.513834 1.000000 +vt 0.529644 0.973684 +vt 0.529644 1.000000 +vt 0.545455 0.973684 +vt 0.545455 1.000000 +vt 0.545455 0.789474 +vt 0.529644 0.947368 +vt 0.513834 0.973684 +vt 0.513834 0.947368 +vt 0.529644 0.921053 +vt 0.545455 0.947368 +vt 0.577075 0.894737 +vt 0.513834 0.921053 +vt 0.513834 0.894737 +vt 0.529644 0.894737 +vt 0.513834 0.868421 +vt 0.545455 0.894737 +vt 0.545455 0.921053 +vt 0.561265 0.842105 +vt 0.545455 0.868421 +vt 0.561265 0.815789 +vt 0.577075 0.815789 +vt 0.577075 0.842105 +vt 0.561265 0.868421 +vt 0.561265 0.789474 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.577075 0.973684 +vt 0.577075 1.000000 +vt 0.577075 0.789474 +vt 0.561265 0.947368 +vt 0.561265 0.921053 +vt 0.577075 0.947368 +vt 0.561265 0.894737 +vt 0.577075 0.894737 +vt 0.577075 0.921053 +vt 0.592885 0.868421 +vt 0.592885 0.842105 +vt 0.592885 0.815789 +vt 0.608696 0.842105 +vt 0.608696 0.868421 +vt 0.592885 0.789474 +vt 0.592885 1.000000 +vt 0.592885 0.973684 +vt 0.608696 1.000000 +vt 0.608696 0.815789 +vt 0.592885 0.947368 +vt 0.592885 0.921053 +vt 0.608696 0.921053 +vt 0.608696 0.947368 +vt 0.592885 0.894737 +vt 0.608696 0.894737 +vt 0.624506 0.868421 +vt 0.624506 0.842105 +vt 0.624506 0.815789 +vt 0.640316 0.815789 +vt 0.640316 0.842105 +vt 0.608696 0.789474 +vt 0.624506 0.789474 +vt 0.624506 1.000000 +vt 0.608696 0.973684 +vt 0.624506 0.973684 +vt 0.640316 1.000000 +vt 0.640316 0.789474 +vt 0.624506 0.947368 +vt 0.624506 0.921053 +vt 0.640316 0.947368 +vt 0.624506 0.894737 +vt 0.640316 0.894737 +vt 0.656126 0.868421 +vt 0.656126 0.842105 +vt 0.656126 0.815789 +vt 0.671937 0.815789 +vt 0.671937 0.842105 +vt 0.656126 0.789474 +vt 0.656126 0.973684 +vt 0.656126 1.000000 +vt 0.671937 0.973684 +vt 0.671937 1.000000 +vt 0.671937 0.789474 +vt 0.656126 0.947368 +vt 0.640316 0.921053 +vt 0.656126 0.921053 +vt 0.671937 0.947368 +vt 0.656126 0.894737 +vt 0.671937 0.894737 +vt 0.671937 0.921053 +vt 0.687747 0.842105 +vt 0.671937 0.868421 +vt 0.687747 0.815789 +vt 0.703557 0.815789 +vt 0.703557 0.842105 +vt 0.687747 0.868421 +vt 0.687747 0.789474 +vt 0.687747 0.973684 +vt 0.687747 1.000000 +vt 0.703557 0.973684 +vt 0.703557 1.000000 +vt 0.703557 0.789474 +vt 0.687747 0.947368 +vt 0.687747 0.921053 +vt 0.703557 0.947368 +vt 0.687747 0.894737 +vt 0.703557 0.894737 +vt 0.703557 0.921053 +vt 0.719368 0.868421 +vt 0.719368 0.842105 +vt 0.719368 0.815789 +vt 0.735178 0.842105 +vt 0.719368 0.789474 +vt 0.719368 1.000000 +vt 0.719368 0.973684 +vt 0.735178 1.000000 +vt 0.735178 0.815789 +vt 0.719368 0.947368 +vt 0.719368 0.921053 +vt 0.735178 0.921053 +vt 0.735178 0.947368 +vt 0.735178 0.973684 +vt 0.719368 0.894737 +vt 0.735178 0.868421 +vt 0.735178 0.894737 +vt 0.750988 0.842105 +vt 0.750988 0.815789 +vt 0.766798 0.815789 +vt 0.766798 0.842105 +vt 0.750988 0.868421 +vt 0.750988 0.789474 +vt 0.735178 0.789474 +vt 0.750988 0.973684 +vt 0.750988 1.000000 +vt 0.766798 0.973684 +vt 0.766798 1.000000 +vt 0.766798 0.789474 +vt 0.750988 0.947368 +vt 0.750988 0.921053 +vt 0.766798 0.947368 +vt 0.750988 0.894737 +vt 0.766798 0.894737 +vt 0.766798 0.921053 +vt 0.529644 0.868421 +vt 0.513834 0.842105 +vt 0.529644 0.842105 +vt 0.513834 0.815789 +vt 0.529644 0.815789 +vt 0.545455 0.842105 +vt 0.545455 0.868421 +vt 0.513834 0.789474 +vt 0.529644 0.789474 +vt 0.529644 1.000000 +vt 0.513834 0.973684 +vt 0.529644 0.973684 +vt 0.545455 1.000000 +vt 0.545455 0.815789 +vt 0.529644 0.947368 +vt 0.513834 0.947368 +vt 0.529644 0.921053 +vt 0.545455 0.921053 +vt 0.545455 0.947368 +vt 0.529644 0.894737 +vt 0.513834 0.921053 +vt 0.513834 0.894737 +vt 0.545455 0.894737 +vt 0.608696 0.921053 +vt 0.608696 0.894737 +vt 0.624506 0.921053 +vt 0.608696 0.947368 +vt 0.608696 0.868421 +vt 0.608696 0.842105 +vt 0.624506 0.868421 +vt 0.624506 0.894737 +vt 0.608696 0.815789 +vt 0.608696 0.789474 +vt 0.624506 0.789474 +vt 0.624506 0.815789 +vt 0.624506 0.842105 +vt 0.608696 0.973684 +vt 0.624506 0.947368 +vt 0.624506 0.973684 +vt 0.608696 1.000000 +vt 0.640316 0.921053 +vt 0.640316 0.894737 +vt 0.656126 0.921053 +vt 0.640316 0.947368 +vt 0.640316 0.868421 +vt 0.640316 0.842105 +vt 0.656126 0.868421 +vt 0.640316 0.815789 +vt 0.640316 0.789474 +vt 0.656126 0.789474 +vt 0.656126 0.815789 +vt 0.656126 0.842105 +vt 0.640316 0.973684 +vt 0.624506 1.000000 +vt 0.656126 0.973684 +vt 0.640316 1.000000 +vt 0.671937 0.921053 +vt 0.656126 0.947368 +vt 0.656126 0.894737 +vt 0.671937 0.894737 +vt 0.687747 0.894737 +vt 0.687747 0.921053 +vt 0.671937 0.947368 +vt 0.671937 0.868421 +vt 0.671937 0.842105 +vt 0.687747 0.842105 +vt 0.687747 0.868421 +vt 0.671937 0.815789 +vt 0.671937 0.789474 +vt 0.687747 0.789474 +vt 0.687747 0.815789 +vt 0.671937 1.000000 +vt 0.671937 0.973684 +vt 0.687747 0.973684 +vt 0.687747 1.000000 +vt 0.703557 0.921053 +vt 0.687747 0.947368 +vt 0.703557 0.894737 +vt 0.719368 0.894737 +vt 0.719368 0.921053 +vt 0.703557 0.947368 +vt 0.703557 0.868421 +vt 0.703557 0.842105 +vt 0.719368 0.842105 +vt 0.719368 0.868421 +vt 0.703557 0.815789 +vt 0.703557 0.789474 +vt 0.719368 0.815789 +vt 0.703557 1.000000 +vt 0.703557 0.973684 +vt 0.719368 0.973684 +vt 0.719368 1.000000 +vt 0.735178 0.921053 +vt 0.719368 0.947368 +vt 0.735178 0.894737 +vt 0.735178 0.947368 +vt 0.735178 0.868421 +vt 0.735178 0.842105 +vt 0.735178 0.815789 +vt 0.719368 0.789474 +vt 0.735178 0.789474 +vt 0.735178 1.000000 +vt 0.735178 0.973684 +vt 0.739130 0.657895 +vt 0.743083 0.671053 +vt 0.739130 0.671053 +vt 0.731225 0.657895 +vt 0.735178 0.671053 +vt 0.731225 0.671053 +vt 0.727273 0.657895 +vt 0.723320 0.671053 +vt 0.723320 0.657895 +vt 0.747036 0.657895 +vt 0.743083 0.657895 +vt 0.735178 0.657895 +vt 0.727273 0.671053 +vt 0.719368 0.657895 +vt 0.719368 0.671053 +vt 0.750988 0.671053 +vt 0.747036 0.671053 +vt 0.229249 0.802632 +vt 0.229249 0.822368 +vt 0.237154 0.802632 +vt 0.237154 0.763158 +vt 0.173913 0.743421 +vt 0.166008 0.723684 +vt 0.173913 0.723684 +vt 0.173913 0.684211 +vt 0.166008 0.703947 +vt 0.166008 0.684211 +vt 0.173913 0.802632 +vt 0.166008 0.822368 +vt 0.166008 0.802632 +vt 0.173913 0.782895 +vt 0.166008 0.782895 +vt 0.173913 0.763158 +vt 0.166008 0.743421 +vt 0.173913 0.703947 +vt 0.173913 0.842105 +vt 0.173913 0.822368 +vt 0.166008 0.763158 +vt 0.229249 0.684211 +vt 0.225296 0.697368 +vt 0.225296 0.776316 +vt 0.561265 0.894737 +vt 0.529644 0.789474 +vt 0.529644 1.000000 +vt 0.719368 0.894737 +vt 0.513834 0.789474 +vt 0.766798 1.000000 +vt 0.592885 0.894737 +vt 0.624506 0.894737 +vt 0.592885 0.789474 +vt 0.592885 1.000000 +vt 0.656126 0.842105 +vt 0.719368 0.789474 +vt 0.513834 0.789474 +vt 0.766798 1.000000 +vt 0.592885 0.789474 +vt 0.750988 0.947368 +vt 0.750988 0.789474 +vt 0.513834 0.789474 +vt 0.766798 1.000000 +vt 0.592885 0.947368 +vt 0.592885 0.789474 +vt 0.608696 1.000000 +vt 0.577075 0.921053 +vt 0.577075 0.868421 +vt 0.640316 0.868421 +vt 0.640316 0.973684 +vt 0.703557 0.868421 +vt 0.766798 0.868421 +vt 0.513834 0.868421 +vt 0.513834 1.000000 +vt 0.545455 0.973684 +vt 0.545455 0.789474 +vt 0.656126 1.000000 +vt 0.750988 0.657895 +vt 0.166008 0.842105 +vn -0.4916 -0.1252 0.8617 +vn 0.4916 0.1252 -0.8617 +vn -0.0621 0.9921 0.1088 +vn -0.1794 0.9321 0.3145 +vn -0.8686 0.0000 -0.4955 +vn 0.8686 -0.0000 0.4955 +vn 0.6580 -0.7015 0.2735 +vn 0.0620 -0.9921 -0.1088 +vn 0.5703 0.7015 0.4273 +vn -0.0620 0.9921 0.1088 +vn -0.6580 0.7015 -0.2735 +vn -0.5703 -0.7015 -0.4273 +vn 0.2655 0.8600 0.4358 +vn 0.8657 0.4493 0.2207 +vn 0.8682 0.4489 0.2113 +vn 0.9930 -0.1019 -0.0596 +vn 0.9811 0.1805 0.0692 +vn -0.4891 0.7755 0.3993 +vn -0.9641 0.2296 0.1335 +vn -0.4841 0.7725 0.4108 +vn -0.9103 -0.3897 -0.1396 +vn -0.9638 0.2317 0.1318 +vn -0.9810 -0.1824 -0.0651 +vn 0.9687 -0.2124 -0.1283 +vn 0.8547 0.4277 0.2942 +vn 0.2648 0.8521 0.4515 +vn 0.2610 0.7895 0.5554 +vn 0.8394 0.2824 0.4643 +vn 0.9817 -0.1527 -0.1132 +vn -0.4675 0.7314 0.4964 +vn -0.9560 0.2478 0.1569 +vn -0.9432 0.2402 0.2295 +vn -0.4678 0.5455 0.6954 +vn -0.8657 -0.4447 -0.2296 +vn -0.2656 -0.8788 -0.3965 +vn -0.2741 -0.5813 -0.7661 +vn -0.8870 -0.2391 -0.3951 +vn 0.4645 -0.8205 -0.3332 +vn 0.4825 -0.7771 -0.4040 +vn 0.5373 -0.5375 -0.6499 +vn 0.7016 -0.7096 0.0641 +vn 0.9803 -0.0645 -0.1864 +vn 0.7452 -0.6214 0.2419 +vn 0.0509 -0.9357 0.3492 +vn 0.0219 -0.9604 0.2777 +vn 0.6868 -0.7268 -0.0063 +vn 0.9620 -0.0786 -0.2615 +vn -0.6019 -0.5911 0.5369 +vn -0.6386 -0.6355 0.4339 +vn -0.9719 -0.0111 0.2350 +vn -0.9594 0.0422 0.2786 +vn -0.6606 -0.6366 0.3977 +vn -0.7668 0.6018 -0.2232 +vn -0.7019 0.7117 -0.0260 +vn -0.0768 0.8368 -0.5420 +vn -0.0257 0.9495 -0.3126 +vn -0.6793 0.7332 0.0300 +vn -0.9534 0.0692 0.2936 +vn 0.6598 0.6207 -0.4235 +vn 0.6468 0.5549 -0.5231 +vn 0.9551 -0.0651 -0.2891 +vn 0.6622 0.6403 -0.3893 +vn 0.6863 -0.7271 -0.0149 +vn 0.0174 -0.9629 0.2693 +vn 0.6860 -0.7273 -0.0177 +vn 0.9545 -0.0649 -0.2909 +vn -0.6631 -0.6357 0.3952 +vn -0.9541 0.0659 0.2920 +vn -0.9544 0.0649 0.2915 +vn -0.6637 -0.6355 0.3945 +vn -0.6846 0.7286 0.0208 +vn -0.0120 0.9684 -0.2491 +vn -0.0149 0.9648 -0.2623 +vn -0.0158 0.9637 -0.2664 +vn -0.6860 0.7273 0.0177 +vn 0.6635 0.6365 -0.3931 +vn 0.6637 0.6355 -0.3945 +vn 0.6851 -0.7282 -0.0193 +vn 0.9544 -0.0649 -0.2915 +vn 0.0156 -0.9643 0.2642 +vn 0.6820 -0.7309 -0.0241 +vn 0.9538 -0.0662 -0.2929 +vn 0.9543 -0.0652 -0.2918 +vn -0.6636 -0.6359 0.3940 +vn 0.0158 -0.9637 0.2664 +vn -0.9546 0.0653 0.2907 +vn -0.9552 0.0667 0.2883 +vn -0.6631 -0.6373 0.3925 +vn -0.6866 0.7269 0.0152 +vn -0.0169 0.9630 -0.2690 +vn -0.0207 0.9607 -0.2769 +vn -0.6878 0.7258 0.0072 +vn 0.6630 0.6357 -0.3952 +vn 0.6607 0.6369 -0.3974 +vn 0.9458 -0.0907 -0.3118 +vn 0.6558 -0.7501 -0.0850 +vn 0.0149 -0.9661 0.2576 +vn -0.0010 -0.9819 0.1892 +vn 0.5891 -0.7678 -0.2517 +vn 0.9181 -0.1128 -0.3799 +vn -0.6637 -0.6546 0.3618 +vn -0.9471 0.0531 0.3165 +vn -0.9237 0.0399 0.3811 +vn -0.6894 -0.6700 0.2752 +vn -0.6720 0.7373 0.0687 +vn 0.0066 0.9758 -0.2183 +vn 0.0902 0.9957 -0.0213 +vn -0.6056 0.7515 0.2617 +vn 0.6792 0.6347 -0.3684 +vn 0.7194 0.6321 -0.2878 +vn 0.7844 -0.3903 0.4820 +vn 0.9896 -0.0551 -0.1328 +vn 0.7863 -0.2751 0.5531 +vn 0.1310 -0.5481 0.8261 +vn 0.1314 -0.6126 0.7794 +vn 0.7913 -0.4159 0.4482 +vn 0.9899 0.0173 -0.1409 +vn -0.5631 -0.2182 0.7970 +vn -0.5870 -0.4071 0.6997 +vn -0.9731 0.0176 0.2298 +vn -0.9847 -0.0305 0.1712 +vn -0.6005 -0.4591 0.6547 +vn -0.8253 0.2652 -0.4986 +vn -0.7949 0.3995 -0.4566 +vn -0.1742 0.3632 -0.9153 +vn -0.1353 0.6117 -0.7794 +vn -0.7888 0.4282 -0.4408 +vn -0.9889 -0.0333 0.1449 +vn 0.6012 0.4494 -0.6608 +vn 0.6005 0.2244 -0.7675 +vn 0.9888 0.0412 -0.1436 +vn 0.6024 0.4859 -0.6332 +vn 0.7924 -0.4202 0.4421 +vn 0.1329 -0.6258 0.7686 +vn 0.7905 -0.4285 0.4375 +vn 0.9891 0.0327 -0.1434 +vn 0.9891 0.0360 -0.1429 +vn -0.6040 -0.4665 0.6461 +vn -0.9892 -0.0349 0.1420 +vn -0.9898 -0.0355 0.1378 +vn -0.6034 -0.4720 0.6427 +vn -0.7925 0.4180 -0.4440 +vn -0.1291 0.6473 -0.7512 +vn -0.1328 0.6282 -0.7666 +vn -0.1358 0.6122 -0.7790 +vn -0.7922 0.4082 -0.4536 +vn 0.6043 0.4713 -0.6424 +vn 0.6014 0.4655 -0.6493 +vn 0.9898 0.0007 -0.1426 +vn 0.7786 -0.4886 0.3937 +vn 0.1343 -0.6370 0.7591 +vn 0.1339 -0.6978 0.7037 +vn -0.5943 -0.5091 0.6225 +vn -0.9850 -0.0317 0.1693 +vn -0.7914 0.4555 -0.4076 +vn -0.1244 0.6657 -0.7358 +vn 0.6143 0.4892 -0.6190 +vn 0.8256 0.0596 0.5611 +vn 0.2199 0.2434 0.9446 +vn 0.2029 0.0812 0.9758 +vn 0.8248 -0.0418 0.5638 +vn 0.9757 -0.1482 -0.1611 +vn -0.4996 0.2789 0.8201 +vn -0.9595 0.1633 0.2296 +vn -0.5271 0.1499 0.8365 +vn -0.8408 0.0024 -0.5413 +vn -0.2095 -0.0773 -0.9747 +vn -0.8168 0.0734 -0.5722 +vn -0.9702 0.1405 0.1973 +vn 0.5356 -0.1947 -0.8217 +vn 0.9688 -0.1391 -0.2050 +vn 0.5266 -0.1196 -0.8417 +vn 0.9796 -0.1122 -0.1663 +vn 0.8089 -0.1155 0.5765 +vn 0.1799 -0.0637 0.9816 +vn -0.5388 0.0279 0.8419 +vn -0.9673 0.1075 0.2297 +vn -0.8318 0.1115 -0.5438 +vn -0.2024 0.0245 -0.9790 +vn 0.5553 -0.0638 -0.8292 +vn 0.5236 -0.7476 -0.4085 +vn -0.1387 -0.9797 -0.1448 +vn -0.1702 -0.9658 -0.1956 +vn 0.5037 -0.7306 -0.4610 +vn 0.8925 -0.0869 -0.4426 +vn -0.7307 -0.6522 0.2014 +vn -0.8956 0.0564 0.4413 +vn -0.7486 -0.6372 0.1832 +vn -0.5215 0.7359 0.4319 +vn 0.1613 0.9732 0.1637 +vn -0.4970 0.7261 0.4751 +vn -0.8843 0.0666 0.4621 +vn 0.7439 0.6359 -0.2053 +vn 0.8863 -0.0661 -0.4582 +vn 0.7501 0.6368 -0.1786 +vn 0.5029 -0.7280 -0.4659 +vn -0.1740 -0.9642 -0.2001 +vn -0.1752 -0.9637 -0.2016 +vn 0.5024 -0.7273 -0.4675 +vn 0.8859 -0.0652 -0.4593 +vn -0.7499 -0.6358 0.1826 +vn -0.8854 0.0652 0.4602 +vn -0.7502 -0.6355 0.1823 +vn -0.5012 0.7269 0.4694 +vn 0.1785 0.9610 0.2111 +vn 0.1761 0.9630 0.2040 +vn -0.5024 0.7273 0.4675 +vn 0.7503 0.6357 -0.1815 +vn 0.8857 -0.0649 -0.4595 +vn 0.7502 0.6355 -0.1823 +vn 0.1752 0.9637 0.2016 +vn 0.8847 -0.0652 -0.4616 +vn 0.5011 -0.7262 -0.4705 +vn -0.1751 -0.9633 -0.2033 +vn -0.1749 -0.9622 -0.2086 +vn 0.4974 -0.7231 -0.4792 +vn 0.8813 -0.0662 -0.4679 +vn -0.7506 -0.6351 0.1822 +vn -0.8869 0.0664 0.4572 +vn -0.8902 0.0719 0.4499 +vn -0.7519 -0.6336 0.1820 +vn -0.5043 0.7283 0.4638 +vn 0.1734 0.9643 0.2002 +vn -0.5106 0.7314 0.4521 +vn 0.7501 0.6356 -0.1825 +vn 0.7496 0.6360 -0.1833 +vn 0.1672 0.9662 0.1961 +vn 0.8463 -0.0607 -0.5292 +vn 0.4581 -0.6955 -0.5536 +vn -0.1843 -0.9465 -0.2649 +vn -0.2599 -0.8816 -0.3940 +vn 0.3271 -0.5986 -0.7313 +vn 0.7374 0.0052 -0.6754 +vn -0.7398 -0.6479 0.1816 +vn -0.8656 0.0410 0.4991 +vn -0.7563 -0.0638 0.6510 +vn -0.7207 -0.6685 0.1834 +vn -0.4760 0.7114 0.5170 +vn 0.2060 0.9507 0.2316 +vn -0.3210 0.6036 0.7298 +vn 0.7541 0.6259 -0.1989 +vn 0.7432 0.6266 -0.2344 +vn 0.3191 0.8840 0.3415 +vn 0.1719 -0.4723 -0.8645 +vn -0.3752 -0.7977 -0.4722 +vn 0.1103 -0.4212 -0.9002 +vn 0.6178 0.1176 -0.7775 +vn -0.7132 -0.6685 0.2107 +vn -0.6106 -0.1575 0.7761 +vn -0.7090 -0.6671 0.2287 +vn -0.4247 -0.7674 -0.4802 +vn -0.1395 0.4490 0.8826 +vn 0.4094 0.7918 0.4531 +vn 0.4344 0.7579 0.4867 +vn -0.0884 0.4022 0.9113 +vn -0.5628 -0.1834 0.8060 +vn 0.7184 0.6539 -0.2375 +vn 0.5773 0.1708 -0.7984 +vn 0.7107 0.6663 -0.2256 +vn 0.1028 -0.4157 -0.9037 +vn -0.4295 -0.7649 -0.4799 +vn 0.1003 -0.4137 -0.9048 +vn 0.5740 0.1770 -0.7994 +vn -0.7096 -0.6670 0.2268 +vn -0.5705 -0.1802 0.8013 +vn -0.7099 -0.6670 0.2262 +vn -0.4310 -0.7642 -0.4798 +vn -0.0974 0.4110 0.9064 +vn 0.4320 0.7626 0.4814 +vn 0.4310 0.7642 0.4798 +vn -0.1003 0.4137 0.9048 +vn 0.7100 0.6669 -0.2261 +vn 0.5729 0.1791 -0.7998 +vn 0.7099 0.6670 -0.2262 +vn 0.0987 -0.4120 -0.9058 +vn -0.4314 -0.7634 -0.4807 +vn -0.4329 -0.7607 -0.4836 +vn 0.0938 -0.4070 -0.9086 +vn 0.5670 0.1810 -0.8035 +vn 0.5715 0.1796 -0.8007 +vn -0.7101 -0.6667 0.2264 +vn -0.5741 -0.1773 0.7993 +vn -0.5777 -0.1713 0.7981 +vn -0.7108 -0.6657 0.2272 +vn -0.1026 0.4157 0.9037 +vn -0.5729 -0.1791 0.7998 +vn 0.4294 0.7651 0.4798 +vn -0.1098 0.4215 0.9001 +vn 0.7097 0.6671 -0.2262 +vn 0.7093 0.6676 -0.2264 +vn 0.4245 0.7676 0.4802 +vn 0.5158 0.2107 -0.8304 +vn 0.0375 -0.3538 -0.9346 +vn -0.4601 -0.7239 -0.5141 +vn -0.5575 -0.6221 -0.5496 +vn -0.1160 -0.2076 -0.9713 +vn 0.3875 0.3196 -0.8647 +vn -0.7038 -0.6769 0.2154 +vn -0.5424 -0.2196 0.8108 +vn -0.4182 -0.3568 0.8353 +vn -0.6923 -0.6923 0.2036 +vn -0.0562 0.3752 0.9252 +vn 0.4692 0.7395 0.4827 +vn 0.1230 0.2094 0.9700 +vn 0.7051 0.6659 -0.2436 +vn 0.6848 0.6801 -0.2618 +vn 0.5855 0.6440 0.4924 +vn -0.0507 0.7650 -0.6419 +vn -0.4729 0.1650 -0.8655 +vn -0.5887 0.2591 -0.7657 +vn -0.7522 -0.4228 -0.5053 +vn -0.7969 -0.3980 -0.4545 +vn -0.6308 0.2828 -0.7225 +vn -0.0867 0.7998 -0.5940 +vn -0.5987 -0.7834 0.1665 +vn -0.5311 -0.8378 0.1266 +vn -0.0855 -0.6712 0.7363 +vn 0.0551 -0.7820 0.6208 +vn -0.5054 -0.8553 0.1138 +vn -0.8087 -0.4028 -0.4285 +vn 0.6076 -0.2579 0.7512 +vn 0.4884 -0.1436 0.8607 +vn 0.7966 0.4246 0.4303 +vn 0.8111 0.3999 0.4269 +vn 0.6397 -0.2891 0.7121 +vn 0.5198 0.8414 -0.1478 +vn 0.7579 0.4732 0.4491 +vn 0.5744 0.7912 -0.2100 +vn 0.5090 0.8528 -0.1165 +vn -0.0900 0.8037 -0.5882 +vn -0.6350 0.2840 -0.7184 +vn -0.8095 -0.4028 -0.4270 +vn -0.8101 -0.4031 -0.4258 +vn -0.6368 0.2873 -0.7155 +vn -0.5088 -0.8531 0.1149 +vn 0.0964 -0.8076 0.5817 +vn 0.0899 -0.8037 0.5881 +vn 0.0838 -0.7995 0.5948 +vn -0.5105 -0.8515 0.1197 +vn 0.6360 -0.2846 0.7173 +vn 0.8098 0.4021 0.4271 +vn 0.6315 -0.2838 0.7215 +vn 0.5083 0.8536 -0.1140 +vn 0.5051 0.8556 -0.1128 +vn 0.8091 0.4026 0.4281 +vn -0.6549 0.3121 -0.6883 +vn -0.0940 0.8072 -0.5827 +vn -0.8104 -0.3915 -0.4358 +vn -0.8131 -0.3718 -0.4478 +vn -0.7223 0.3588 -0.5912 +vn -0.1278 0.8315 -0.5405 +vn -0.4922 -0.8658 0.0898 +vn 0.1122 -0.8199 0.5614 +vn 0.2261 -0.8837 0.4097 +vn -0.4224 -0.9060 -0.0280 +vn 0.6550 -0.2939 0.6961 +vn 0.8067 0.4156 0.4202 +vn 0.7371 -0.3221 0.5941 +vn 0.4744 0.8757 -0.0894 +vn 0.3933 0.9194 0.0082 +vn 0.7967 0.4380 0.4165 +vn -0.2953 0.9072 -0.2995 +vn -0.7749 0.3620 -0.5181 +vn -0.8046 -0.4010 -0.4380 +vn -0.3527 -0.9301 -0.1028 +vn 0.3033 -0.9086 0.2871 +vn 0.7808 -0.3571 0.5126 +vn 0.8019 0.4112 0.4335 +vn 0.3523 0.9312 0.0930 +vn -0.4770 0.8788 0.0138 +vn -0.8372 0.3595 -0.4122 +vn -0.8388 0.3565 -0.4114 +vn -0.7111 -0.3725 -0.5962 +vn -0.7096 -0.3761 -0.5958 +vn -0.7103 -0.3771 -0.5943 +vn -0.8417 0.3582 -0.4039 +vn -0.1655 -0.8875 -0.4300 +vn -0.1661 -0.8888 -0.4271 +vn 0.4725 -0.8813 -0.0071 +vn 0.4642 -0.8857 0.0069 +vn -0.1659 -0.8929 -0.4185 +vn 0.8359 -0.3582 0.4158 +vn 0.4776 -0.8785 -0.0096 +vn 0.8384 -0.3535 0.4149 +vn 0.7098 0.3753 0.5961 +vn 0.8299 -0.3653 0.4217 +vn 0.1648 0.8879 0.4295 +vn 0.7084 0.3792 0.5953 +vn 0.1664 0.8883 0.4280 +vn -0.4722 0.8813 0.0123 +vn 0.1585 0.8876 0.4324 +vn 0.7098 0.3727 0.5977 +vn -0.8719 0.3479 -0.3446 +vn -0.4837 0.8749 0.0228 +vn -0.7244 -0.3600 -0.5878 +vn -0.7552 -0.3491 -0.5547 +vn -0.9487 0.2602 -0.1796 +vn -0.5278 0.8444 0.0914 +vn -0.1483 -0.8758 -0.4592 +vn 0.4957 -0.8673 -0.0450 +vn 0.6141 -0.7353 -0.2868 +vn -0.1002 -0.7846 -0.6119 +vn 0.8584 -0.3440 0.3805 +vn 0.7032 0.3937 0.5919 +vn 0.9507 -0.2223 0.2163 +vn 0.1182 0.8745 0.4703 +vn 0.0406 0.7970 0.6026 +vn 0.6884 0.4292 0.5847 +vn -0.6800 0.5472 0.4880 +vn -0.9934 0.1115 -0.0266 +vn -0.7478 -0.3915 -0.5361 +vn -0.9991 0.0375 0.0170 +vn -0.6851 0.4650 0.5607 +vn -0.0423 -0.6548 -0.7546 +vn 0.6806 -0.5067 -0.5292 +vn -0.0244 -0.6026 -0.7976 +vn -0.7280 -0.4136 -0.5466 +vn 0.9972 -0.0705 0.0257 +vn 0.7093 0.4219 0.5646 +vn 0.7309 0.4154 0.5414 +vn 0.9992 -0.0163 -0.0347 +vn 0.0130 0.6734 0.7391 +vn 0.0264 0.6185 0.7853 +vn -0.6848 0.4545 0.5697 +vn -0.9994 0.0282 0.0189 +vn -0.7287 -0.4145 -0.5452 +vn -0.7288 -0.4148 -0.5447 +vn -0.9995 0.0255 0.0198 +vn -0.0301 -0.6097 -0.7920 +vn 0.6852 -0.4287 -0.5888 +vn 0.6848 -0.4456 -0.5766 +vn -0.0312 -0.6120 -0.7902 +vn 0.9995 -0.0229 -0.0230 +vn 0.7293 0.4150 0.5440 +vn 0.9995 -0.0255 -0.0198 +vn 0.0303 0.6136 0.7890 +vn 0.0312 0.6120 0.7902 +vn -0.6867 0.4401 0.5785 +vn -0.9994 0.0179 0.0288 +vn -0.7299 -0.4163 -0.5422 +vn -0.7328 -0.4216 -0.5341 +vn -0.9984 -0.0017 0.0553 +vn -0.0282 -0.6156 -0.7875 +vn 0.6858 -0.4632 -0.5613 +vn 0.6891 -0.5061 -0.5186 +vn -0.0129 -0.6271 -0.7788 +vn 0.9991 -0.0390 -0.0112 +vn 0.7288 0.4148 0.5447 +vn 0.7313 0.4094 0.5455 +vn 0.9958 -0.0899 0.0159 +vn 0.0298 0.6104 0.7915 +vn 0.0229 0.6043 0.7964 +vn 0.7407 0.3906 0.5466 +vn -0.9825 -0.1087 0.1509 +vn -0.6917 0.4107 0.5939 +vn -0.7530 -0.4528 -0.4774 +vn -0.7086 -0.6106 -0.3535 +vn -0.8361 -0.4394 0.3282 +vn -0.6890 0.2843 0.6666 +vn -0.0245 -0.5875 -0.8088 +vn 0.6887 -0.4704 -0.5518 +vn 0.4799 -0.0367 -0.8765 +vn -0.1535 -0.4451 -0.8822 +vn 0.9985 -0.0482 -0.0234 +vn 0.7230 0.4403 0.5324 +vn 0.8540 0.4602 -0.2428 +vn -0.0044 0.5554 0.8316 +vn 0.0376 0.3820 0.9234 +vn 0.6050 0.6047 0.5180 +vn -0.2487 -0.3490 0.9035 +vn -0.5467 -0.7410 0.3898 +vn -0.5463 -0.7568 -0.3588 +vn -0.4011 -0.8368 0.3725 +vn -0.2394 -0.2747 -0.9312 +vn 0.0732 0.4201 -0.9045 +vn -0.2200 -0.2451 -0.9442 +vn -0.4700 -0.7794 -0.4143 +vn 0.3885 0.8495 -0.3569 +vn 0.5102 0.7459 0.4281 +vn 0.4612 0.7902 0.4035 +vn 0.3180 0.8755 -0.3637 +vn 0.0778 0.4295 -0.8997 +vn 0.2102 0.2405 0.9476 +vn -0.0629 -0.4365 0.8975 +vn 0.3063 0.2086 0.9288 +vn -0.2922 -0.8827 0.3681 +vn -0.5014 -0.7756 -0.3833 +vn -0.5630 -0.7828 -0.2649 +vn -0.0751 -0.9666 0.2448 +vn 0.1160 -0.5033 0.8563 +vn -0.2717 -0.2300 -0.9344 +vn 0.1034 0.4159 -0.9035 +vn -0.3900 0.7035 -0.5941 +vn -0.7457 -0.1077 -0.6575 +vn 0.3325 0.8768 -0.3473 +vn 0.5153 0.7382 0.4353 +vn 0.1775 0.9721 -0.1532 +vn 0.4318 0.1335 0.8920 +vn 0.7356 0.0013 0.6774 +vn 0.6502 0.6531 0.3882 +vn 0.6657 -0.6971 0.2662 +vn 0.0329 -0.9992 0.0196 +vn -0.6672 -0.7173 -0.2007 +vn 0.0178 -0.9976 -0.0667 +vn 0.6999 -0.7030 0.1258 +vn -0.9878 0.0183 -0.1548 +vn -0.7176 0.6964 -0.0016 +vn -0.9993 0.0291 -0.0247 +vn -0.7288 -0.6677 -0.1520 +vn -0.0155 0.9987 0.0482 +vn 0.7048 0.6701 0.2328 +vn 0.6751 0.7134 0.1876 +vn -0.0780 0.9883 0.1313 +vn 0.9379 -0.0417 0.3445 +vn 0.9756 -0.0203 0.2187 +vn -0.2620 -0.0627 -0.9630 +vn -0.6601 -0.5308 -0.5314 +vn -0.3115 -0.0135 -0.9501 +vn 0.2793 0.4423 -0.8522 +vn -0.6771 -0.7020 0.2205 +vn -0.2819 -0.4691 0.8369 +vn -0.6687 -0.7066 0.2315 +vn -0.6951 -0.5063 -0.5104 +vn 0.2850 0.0428 0.9575 +vn 0.6774 0.5343 0.5056 +vn 0.7017 0.4987 0.5089 +vn 0.3255 -0.0010 0.9455 +vn -0.2415 -0.4978 0.8330 +vn 0.6706 0.7003 -0.2446 +vn 0.2508 0.4881 -0.8359 +vn 0.6704 0.7053 -0.2304 +vn -0.3164 -0.0091 -0.9485 +vn -0.6977 -0.5049 -0.5081 +vn -0.3181 -0.0075 -0.9480 +vn 0.2493 0.4924 -0.8339 +vn -0.6696 -0.7060 0.2306 +vn -0.2470 -0.4949 0.8331 +vn -0.6699 -0.7058 0.2304 +vn 0.3200 0.0055 0.9474 +vn 0.6994 0.5031 0.5076 +vn 0.6986 0.5044 0.5074 +vn 0.3181 0.0075 0.9480 +vn -0.2487 -0.4937 0.8332 +vn 0.6700 0.7057 -0.2303 +vn 0.6699 0.7058 -0.2304 +vn 0.2487 0.4937 -0.8332 +vn -0.6986 -0.5044 -0.5074 +vn -0.3188 -0.0061 -0.9478 +vn -0.6988 -0.5041 -0.5075 +vn -0.6994 -0.5030 -0.5077 +vn -0.3207 -0.0013 -0.9471 +vn 0.2472 0.4949 -0.8330 +vn -0.6702 -0.7053 0.2310 +vn -0.2502 -0.4920 0.8339 +vn -0.2543 -0.4863 0.8359 +vn -0.6709 -0.7037 0.2337 +vn 0.3165 0.0088 0.9485 +vn 0.6981 0.5046 0.5080 +vn 0.3111 0.0119 0.9503 +vn 0.6695 0.7061 -0.2305 +vn 0.6680 0.7072 -0.2317 +vn 0.6966 0.5048 0.5098 +vn -0.3579 0.0473 -0.9326 +vn 0.2426 0.4982 -0.8325 +vn -0.7094 -0.4786 -0.5173 +vn 0.1932 0.5415 -0.8181 +vn -0.6540 -0.7248 0.2162 +vn -0.2184 -0.5309 0.8188 +vn 0.3524 -0.0244 0.9355 +vn 0.7149 0.4989 0.4899 +vn 0.6424 0.7291 -0.2361 +vn 0.9618 0.0885 -0.2589 +vn 0.2665 -0.0885 0.9597 +vn -0.9618 -0.0885 0.2589 +vn -0.2665 0.0885 -0.9597 +vn 0.2474 0.5604 0.7904 +vn -0.2563 -0.9131 -0.3170 +vn 0.1060 -0.8373 0.5363 +vn -0.0628 -0.9979 0.0141 +vn 0.1465 -0.3357 0.9305 +vn -0.1932 -0.0117 -0.9811 +vn -0.8857 0.0649 0.4595 +vn 0.0652 0.6598 -0.7486 +vn -0.2282 0.8864 -0.4028 +vn -0.6260 0.7237 0.2903 +vn -0.6847 0.4508 0.5727 +vn 0.6847 -0.4508 -0.5727 +vn -0.5499 -0.0533 0.8335 +vn 0.4528 -0.6374 0.6235 +vn -0.7418 0.6605 0.1161 +s off +f 614/28/9 625/29/9 627/30/9 +f 619/31/10 647/32/10 646/33/10 +f 618/34/9 630/35/9 620/36/9 +f 624/37/9 626/38/9 610/39/9 +f 610/39/9 625/29/9 612/40/9 +f 614/41/9 628/42/9 616/43/9 +f 620/36/9 631/44/9 622/45/9 +f 616/43/9 629/46/9 618/34/9 +f 622/45/9 632/47/9 624/37/9 +f 635/48/10 634/49/10 639/50/10 +f 615/51/10 645/52/10 644/53/10 +f 623/54/10 647/32/10 621/55/10 +f 611/56/10 643/57/10 642/58/10 +f 617/59/10 646/33/10 645/52/10 +f 623/54/10 641/60/10 648/61/10 +f 611/56/10 641/60/10 609/62/10 +f 613/63/10 644/53/10 643/64/10 +f 650/65/9 652/66/9 654/67/9 +f 739/68/11 740/69/11 733/70/11 +f 675/71/12 678/72/12 677/73/12 +f 683/74/13 675/71/13 677/73/13 +f 680/75/11 677/73/11 678/72/11 +f 680/75/14 678/72/14 684/76/14 +f 677/73/13 679/77/13 683/74/13 +f 674/78/11 675/71/11 673/79/11 +f 676/80/14 674/78/14 682/81/14 +f 673/79/13 675/71/13 681/82/13 +f 676/80/14 684/76/14 678/72/14 +f 614/28/9 612/40/9 625/29/9 +f 619/31/10 621/55/10 647/32/10 +f 618/34/9 629/46/9 630/35/9 +f 624/37/9 632/47/9 626/38/9 +f 610/39/9 626/38/9 625/29/9 +f 614/41/9 627/83/9 628/42/9 +f 620/36/9 630/35/9 631/44/9 +f 616/43/9 628/42/9 629/46/9 +f 622/45/9 631/44/9 632/47/9 +f 635/48/10 633/84/10 634/49/10 +f 634/49/10 640/85/10 639/50/10 +f 639/50/10 638/86/10 635/48/10 +f 638/86/10 637/87/10 635/48/10 +f 637/87/10 636/88/10 635/48/10 +f 615/51/10 617/59/10 645/52/10 +f 623/54/10 648/61/10 647/32/10 +f 611/56/10 613/89/10 643/57/10 +f 617/59/10 619/31/10 646/33/10 +f 623/54/10 609/62/10 641/60/10 +f 611/56/10 642/58/10 641/60/10 +f 613/63/10 615/51/10 644/53/10 +f 656/90/9 649/91/9 650/65/9 +f 650/65/9 651/92/9 652/66/9 +f 652/66/9 653/93/9 654/67/9 +f 654/67/9 655/94/9 656/90/9 +f 656/90/9 650/65/9 654/67/9 +f 733/70/11 734/95/11 735/96/11 +f 735/96/11 736/97/11 733/70/11 +f 736/97/11 737/98/11 733/70/11 +f 737/98/11 738/99/11 733/70/11 +f 738/99/11 739/68/11 733/70/11 +f 675/71/12 676/80/12 678/72/12 +f 683/74/13 681/82/13 675/71/13 +f 680/75/11 679/77/11 677/73/11 +f 674/78/11 676/80/11 675/71/11 +f 676/80/14 682/81/14 684/76/14 +s 1 +f 704/100/15 711/101/16 712/102/15 +f 705/103/14 714/104/17 706/105/17 +f 707/106/18 716/107/19 708/108/19 +f 703/109/16 709/110/20 711/111/16 +f 705/103/14 712/102/15 713/112/14 +f 700/113/19 685/114/13 699/115/19 +f 698/116/18 699/115/19 697/117/18 +f 696/118/17 697/117/18 695/119/17 +f 693/120/14 696/118/17 695/119/17 +f 691/121/15 694/122/14 693/120/14 +f 690/123/16 691/121/15 689/124/16 +f 687/125/20 690/126/16 689/127/16 +f 686/128/13 687/125/20 685/114/13 +f 167/129/21 168/130/22 19/131/23 +f 19/131/23 505/132/24 166/133/25 +f 20/134/26 507/135/27 170/136/28 +f 170/136/28 167/129/21 20/134/26 +f 171/137/29 169/138/30 21/139/31 +f 173/140/32 168/130/22 22/141/33 +f 22/141/33 506/142/34 174/143/35 +f 174/143/35 175/144/36 22/141/33 +f 22/141/33 461/145/37 173/140/32 +f 23/146/38 506/142/34 170/136/28 +f 170/136/28 176/147/39 23/146/38 +f 23/146/38 463/148/40 177/149/41 +f 177/149/41 174/143/35 23/146/38 +f 24/150/42 507/135/27 171/137/29 +f 171/137/29 178/151/43 24/150/42 +f 24/150/42 464/152/44 179/153/45 +f 179/153/45 176/147/39 24/150/42 +f 178/154/43 172/155/46 25/156/47 +f 25/156/47 505/132/24 173/140/32 +f 173/140/32 180/157/48 25/156/47 +f 25/156/47 464/158/44 178/154/43 +f 26/159/49 465/160/50 182/161/51 +f 182/161/51 183/162/52 26/159/49 +f 26/159/49 510/163/53 184/164/54 +f 184/164/54 181/165/55 26/159/49 +f 183/162/52 185/166/56 27/167/57 +f 27/167/57 467/168/58 186/169/59 +f 186/169/59 187/170/60 27/167/57 +f 27/167/57 510/163/53 183/162/52 +f 186/169/59 188/171/61 28/172/62 +f 28/172/62 468/173/63 189/174/64 +f 189/174/64 190/175/65 28/172/62 +f 28/172/62 511/176/66 186/169/59 +f 29/177/67 468/178/63 191/179/68 +f 191/179/68 181/165/55 29/177/67 +f 29/177/67 509/180/69 192/181/70 +f 192/181/70 189/182/64 29/177/67 +f 30/183/71 509/180/69 184/164/54 +f 184/164/54 194/184/72 30/183/71 +f 194/185/72 195/186/73 30/187/71 +f 195/186/73 193/188/74 30/187/71 +f 194/184/72 187/170/60 31/189/75 +f 31/189/75 511/176/66 196/190/76 +f 31/191/75 515/192/77 197/193/78 +f 197/193/78 194/185/72 31/191/75 +f 196/190/76 190/175/65 32/194/79 +f 32/194/79 512/195/80 198/196/81 +f 32/197/79 516/198/82 199/199/83 +f 32/197/79 515/192/77 196/200/76 +f 33/201/84 512/202/80 192/181/70 +f 192/181/70 193/203/74 33/201/84 +f 193/188/74 200/204/85 33/205/84 +f 200/204/85 198/206/81 33/205/84 +f 34/207/86 513/208/87 195/186/73 +f 195/186/73 202/209/88 34/207/86 +f 202/209/88 203/210/89 34/207/86 +f 34/207/86 517/211/90 201/212/91 +f 35/213/92 514/214/93 197/193/78 +f 35/213/92 515/192/77 204/215/94 +f 35/213/92 519/216/95 205/217/96 +f 205/217/96 202/209/88 35/213/92 +f 36/218/97 515/192/77 199/199/83 +f 199/199/83 206/219/98 36/218/97 +f 36/218/97 520/220/99 207/221/100 +f 207/221/100 204/215/94 36/218/97 +f 37/222/101 516/223/82 200/204/85 +f 200/204/85 201/212/91 37/222/101 +f 201/212/91 208/224/102 37/222/101 +f 37/222/101 520/225/99 206/226/98 +f 209/227/103 203/210/89 38/228/104 +f 38/228/104 518/229/105 210/230/106 +f 210/230/106 211/231/107 38/228/104 +f 38/228/104 473/232/108 209/227/103 +f 39/233/109 518/229/105 205/217/96 +f 205/217/96 212/234/110 39/233/109 +f 39/233/109 475/235/111 213/236/112 +f 213/236/112 210/230/106 39/233/109 +f 40/237/113 519/216/95 207/221/100 +f 207/221/100 214/238/114 40/237/113 +f 40/237/113 476/239/115 215/240/116 +f 215/240/116 212/234/110 40/237/113 +f 214/241/114 208/224/102 41/242/117 +f 41/242/117 517/211/90 209/227/103 +f 209/227/103 216/243/118 41/242/117 +f 41/242/117 476/244/115 214/241/114 +f 42/245/119 469/246/120 218/247/121 +f 218/247/121 219/248/122 42/245/119 +f 42/245/119 522/249/123 220/250/124 +f 220/250/124 217/251/125 42/245/119 +f 219/248/122 221/252/126 43/253/127 +f 43/253/127 471/254/128 222/255/129 +f 222/255/129 223/256/130 43/253/127 +f 43/253/127 522/249/123 219/248/122 +f 222/255/129 224/257/131 44/258/132 +f 44/258/132 472/259/133 225/260/134 +f 225/260/134 226/261/135 44/258/132 +f 44/258/132 523/262/136 222/255/129 +f 45/263/137 472/264/133 227/265/138 +f 227/265/138 217/251/125 45/263/137 +f 45/263/137 521/266/139 228/267/140 +f 228/267/140 225/268/134 45/263/137 +f 46/269/141 521/266/139 220/250/124 +f 220/250/124 230/270/142 46/269/141 +f 230/270/142 231/271/143 46/269/141 +f 46/269/141 525/272/144 229/273/145 +f 230/270/142 223/256/130 47/274/146 +f 47/274/146 523/262/136 232/275/147 +f 47/274/146 527/276/148 233/277/149 +f 233/277/149 230/270/142 47/274/146 +f 232/275/147 226/261/135 48/278/150 +f 48/278/150 524/279/151 234/280/152 +f 48/278/150 528/281/153 235/282/154 +f 235/282/154 232/275/147 48/278/150 +f 49/283/155 524/284/151 228/267/140 +f 228/267/140 229/273/145 49/283/155 +f 229/273/145 236/285/156 49/283/155 +f 49/283/155 528/286/153 234/287/152 +f 237/288/157 231/271/143 50/289/158 +f 50/289/158 526/290/159 238/291/160 +f 238/291/160 182/161/51 50/289/158 +f 50/289/158 465/160/50 237/288/157 +f 51/292/161 526/290/159 233/277/149 +f 233/277/149 239/293/162 51/292/161 +f 51/292/161 467/168/58 185/166/56 +f 185/166/56 238/291/160 51/292/161 +f 52/294/163 527/276/148 235/282/154 +f 235/282/154 240/295/164 52/294/163 +f 52/294/163 468/173/63 188/171/61 +f 188/171/61 239/293/162 52/294/163 +f 240/296/164 236/285/156 53/297/165 +f 53/297/165 525/272/144 237/288/157 +f 237/288/157 191/179/68 53/297/165 +f 53/297/165 468/178/63 240/296/164 +f 54/298/166 461/145/37 175/144/36 +f 175/144/36 242/299/167 54/298/166 +f 54/298/166 530/300/168 243/301/169 +f 243/301/169 241/302/170 54/298/166 +f 242/299/167 177/149/41 55/303/171 +f 55/303/171 463/148/40 244/304/172 +f 244/304/172 245/305/173 55/303/171 +f 55/303/171 530/300/168 242/299/167 +f 244/304/172 179/153/45 56/306/174 +f 56/306/174 464/152/44 246/307/175 +f 246/307/175 247/308/176 56/306/174 +f 56/306/174 531/309/177 244/304/172 +f 57/310/178 464/158/44 180/157/48 +f 180/157/48 241/302/170 57/310/178 +f 57/310/178 529/311/179 248/312/180 +f 248/312/180 246/313/175 57/310/178 +f 249/314/181 243/301/169 58/315/182 +f 58/315/182 530/300/168 250/316/183 +f 250/316/183 218/247/121 58/315/182 +f 58/315/182 469/246/120 249/314/181 +f 59/317/184 530/300/168 245/305/173 +f 245/305/173 251/318/185 59/317/184 +f 59/317/184 471/254/128 221/252/126 +f 221/252/126 250/316/183 59/317/184 +f 60/319/186 531/309/177 247/308/176 +f 247/308/176 252/320/187 60/319/186 +f 60/319/186 472/259/133 224/257/131 +f 224/257/131 251/318/185 60/319/186 +f 252/321/187 248/312/180 61/322/188 +f 61/322/188 529/311/179 249/314/181 +f 249/314/181 227/265/138 61/322/188 +f 61/322/188 472/264/133 252/321/187 +f 62/323/189 473/232/108 211/231/107 +f 211/231/107 254/324/190 62/323/189 +f 62/323/189 534/325/191 255/326/192 +f 255/326/192 253/327/193 62/323/189 +f 254/324/190 213/236/112 63/328/194 +f 63/328/194 475/235/111 256/329/195 +f 256/329/195 257/330/196 63/328/194 +f 63/328/194 534/325/191 254/324/190 +f 256/329/195 215/240/116 64/331/197 +f 64/331/197 476/239/115 258/332/198 +f 258/332/198 259/333/199 64/331/197 +f 64/331/197 535/334/200 256/329/195 +f 65/335/201 476/244/115 216/243/118 +f 216/243/118 253/327/193 65/335/201 +f 65/335/201 533/336/202 260/337/203 +f 260/337/203 258/338/198 65/335/201 +f 66/339/204 533/336/202 255/326/192 +f 255/326/192 262/340/205 66/339/204 +f 66/339/204 538/341/206 263/342/207 +f 263/342/207 261/343/208 66/339/204 +f 262/340/205 257/330/196 67/344/209 +f 67/344/209 535/334/200 264/345/210 +f 264/345/210 265/346/211 67/344/209 +f 67/344/209 538/341/206 262/340/205 +f 264/345/210 259/333/199 68/347/212 +f 68/347/212 536/348/213 266/349/214 +f 266/349/214 267/350/215 68/347/212 +f 267/350/215 264/345/210 68/347/212 +f 69/351/216 536/352/213 260/337/203 +f 260/337/203 261/343/208 69/351/216 +f 69/351/216 537/353/217 268/354/218 +f 69/351/216 540/355/219 266/356/214 +f 269/357/220 263/342/207 70/358/221 +f 263/342/207 270/359/222 70/358/221 +f 70/358/221 542/360/223 271/361/224 +f 70/358/221 541/362/225 269/357/220 +f 270/359/222 265/346/211 71/363/226 +f 265/346/211 272/364/227 71/363/226 +f 71/363/226 543/365/228 273/366/229 +f 273/366/229 270/359/222 71/363/226 +f 272/364/227 267/350/215 72/367/230 +f 72/367/230 540/368/219 274/369/231 +f 274/369/231 275/370/232 72/367/230 +f 275/370/232 272/364/227 72/367/230 +f 274/371/231 268/354/218 73/372/233 +f 268/354/218 269/357/220 73/372/233 +f 269/357/220 276/373/234 73/372/233 +f 73/372/233 544/374/235 274/371/231 +f 277/375/236 271/361/224 74/376/237 +f 271/361/224 278/377/238 74/376/237 +f 74/376/237 478/378/239 279/379/240 +f 74/376/237 477/380/241 277/375/236 +f 75/381/242 542/360/223 273/366/229 +f 273/366/229 280/382/243 75/381/242 +f 75/381/242 479/383/244 281/384/245 +f 281/384/245 278/377/238 75/381/242 +f 76/385/246 543/365/228 275/370/232 +f 76/385/246 544/386/235 282/387/247 +f 282/387/247 283/388/248 76/385/246 +f 283/388/248 280/382/243 76/385/246 +f 282/389/247 276/373/234 77/390/249 +f 77/390/249 541/362/225 277/375/236 +f 277/375/236 284/391/250 77/390/249 +f 77/390/249 480/392/251 282/389/247 +f 78/393/252 477/380/241 279/379/240 +f 78/393/252 478/378/239 286/394/253 +f 286/394/253 287/395/254 78/393/252 +f 287/395/254 285/396/255 78/393/252 +f 286/394/253 281/384/245 79/397/256 +f 79/397/256 479/383/244 288/398/257 +f 288/398/257 289/399/258 79/397/256 +f 79/397/256 546/400/259 286/394/253 +f 288/398/257 283/388/248 80/401/260 +f 283/388/248 290/402/261 80/401/260 +f 80/401/260 548/403/262 291/404/263 +f 80/401/260 547/405/264 288/398/257 +f 81/406/265 480/392/251 284/391/250 +f 284/391/250 285/396/255 81/406/265 +f 81/406/265 545/407/266 292/408/267 +f 292/408/267 290/409/261 81/406/265 +f 82/410/268 545/407/266 287/395/254 +f 82/410/268 546/400/259 294/411/269 +f 294/412/269 295/413/270 82/414/268 +f 295/413/270 293/415/271 82/414/268 +f 294/411/269 289/399/258 83/416/272 +f 83/416/272 547/405/264 296/417/273 +f 296/418/273 297/419/274 83/420/272 +f 83/420/272 550/421/275 294/412/269 +f 296/417/273 291/404/263 84/422/276 +f 291/404/263 298/423/277 84/422/276 +f 84/424/276 552/425/278 299/426/279 +f 299/426/279 296/418/273 84/424/276 +f 85/427/280 548/428/262 292/408/267 +f 292/408/267 293/429/271 85/427/280 +f 85/430/280 549/431/281 300/432/282 +f 85/430/280 552/433/278 298/434/277 +f 86/435/283 549/431/281 295/413/270 +f 86/435/283 550/421/275 302/436/284 +f 86/435/283 554/437/285 303/438/286 +f 86/435/283 553/439/287 301/440/288 +f 302/436/284 297/419/274 87/441/289 +f 297/419/274 304/442/290 87/441/289 +f 87/441/289 555/443/291 305/444/292 +f 305/444/292 302/436/284 87/441/289 +f 88/445/293 551/446/294 299/426/279 +f 299/426/279 306/447/295 88/445/293 +f 306/447/295 307/448/296 88/445/293 +f 307/448/296 304/442/290 88/445/293 +f 89/449/297 552/433/278 300/432/282 +f 89/449/297 549/431/281 301/440/288 +f 301/440/288 308/450/298 89/449/297 +f 89/449/297 556/451/299 306/452/295 +f 309/453/300 303/438/286 90/454/301 +f 303/438/286 310/455/302 90/454/301 +f 90/454/301 482/456/303 311/457/304 +f 90/454/301 481/458/305 309/453/300 +f 91/459/306 554/437/285 305/444/292 +f 305/444/292 312/460/307 91/459/306 +f 91/459/306 483/461/308 313/462/309 +f 313/462/309 310/455/302 91/459/306 +f 92/463/310 555/443/291 307/448/296 +f 92/463/310 556/464/299 314/465/311 +f 314/465/311 315/466/312 92/463/310 +f 315/466/312 312/460/307 92/463/310 +f 314/467/311 308/450/298 93/468/313 +f 93/468/313 553/439/287 309/453/300 +f 309/453/300 316/469/314 93/468/313 +f 93/468/313 484/470/315 314/467/311 +f 317/471/316 318/472/317 94/473/318 +f 94/473/318 502/474/319 319/475/320 +f 319/476/320 320/477/321 94/478/318 +f 94/478/318 557/479/322 317/480/316 +f 319/475/320 321/481/323 95/482/324 +f 95/482/324 503/483/325 322/484/326 +f 322/485/326 323/486/327 95/487/324 +f 95/487/324 558/488/328 319/476/320 +f 96/489/329 503/483/325 324/490/330 +f 324/490/330 325/491/331 96/489/329 +f 96/492/329 560/493/332 326/494/333 +f 326/494/333 322/485/326 96/492/329 +f 97/495/334 504/496/335 327/497/336 +f 327/497/336 317/471/316 97/495/334 +f 97/498/334 557/479/322 328/499/337 +f 328/499/337 325/500/331 97/498/334 +f 329/501/338 320/477/321 98/502/339 +f 98/502/339 558/488/328 330/503/340 +f 98/502/339 562/504/341 331/505/342 +f 331/505/342 329/501/338 98/502/339 +f 330/503/340 323/486/327 99/506/343 +f 99/506/343 559/507/344 332/508/345 +f 99/506/343 563/509/346 333/510/347 +f 333/510/347 330/503/340 99/506/343 +f 100/511/348 559/507/344 326/494/333 +f 326/494/333 334/512/349 100/511/348 +f 334/512/349 335/513/350 100/511/348 +f 100/511/348 563/509/346 332/508/345 +f 101/514/351 560/515/332 328/499/337 +f 328/499/337 329/501/338 101/514/351 +f 329/501/338 336/516/352 101/514/351 +f 101/514/351 564/517/353 334/518/349 +f 102/519/354 561/520/355 331/505/342 +f 331/505/342 338/521/356 102/519/354 +f 102/519/354 486/522/357 339/523/358 +f 339/523/358 337/524/359 102/519/354 +f 103/525/360 562/504/341 333/510/347 +f 333/510/347 340/526/361 103/525/360 +f 103/525/360 487/527/362 341/528/363 +f 341/528/363 338/521/356 103/525/360 +f 340/526/361 335/513/350 104/529/364 +f 104/529/364 564/530/353 342/531/365 +f 342/531/365 343/532/366 104/529/364 +f 104/529/364 487/527/362 340/526/361 +f 342/533/365 336/516/352 105/534/367 +f 105/534/367 561/520/355 337/524/359 +f 337/524/359 344/535/368 105/534/367 +f 105/534/367 488/536/369 342/533/365 +f 345/537/370 339/523/358 106/538/371 +f 106/538/371 486/522/357 346/539/372 +f 346/539/372 341/528/363 107/540/373 +f 107/540/373 487/527/362 347/541/374 +f 108/542/375 487/527/362 343/532/366 +f 343/532/366 348/543/376 108/542/375 +f 109/544/377 488/536/369 344/535/368 +f 344/535/368 345/537/370 109/544/377 +f 353/545/378 349/546/379 110/547/380 +f 110/547/380 566/548/381 354/549/382 +f 110/547/380 570/550/383 355/551/384 +f 355/551/384 353/545/378 110/547/380 +f 354/549/382 350/552/385 111/553/386 +f 350/554/385 356/555/387 111/556/386 +f 111/556/386 571/557/388 357/558/389 +f 357/559/389 354/549/382 111/553/386 +f 112/560/390 567/561/391 351/562/392 +f 351/562/392 358/563/393 112/560/390 +f 358/563/393 359/564/394 112/560/390 +f 112/560/390 571/557/388 356/555/387 +f 113/565/395 568/566/396 352/567/397 +f 113/568/395 565/569/398 353/545/378 +f 353/545/378 360/570/399 113/568/395 +f 113/568/395 572/571/400 358/563/393 +f 114/572/401 569/573/402 355/551/384 +f 355/551/384 362/574/403 114/572/401 +f 114/572/401 490/575/404 363/576/405 +f 363/576/405 361/577/406 114/572/401 +f 115/578/407 570/550/383 357/559/389 +f 357/558/389 364/579/408 115/580/407 +f 115/580/407 491/581/409 365/582/410 +f 365/583/410 362/574/403 115/578/407 +f 364/579/408 359/564/394 116/584/411 +f 116/584/411 572/571/400 366/585/412 +f 366/585/412 367/586/413 116/584/411 +f 116/584/411 491/581/409 364/579/408 +f 366/585/412 360/570/399 117/587/414 +f 117/587/414 569/573/402 361/577/406 +f 361/577/406 368/588/415 117/587/414 +f 117/587/414 492/589/416 366/585/412 +f 369/590/417 363/576/405 118/591/418 +f 118/591/418 490/575/404 370/592/419 +f 370/592/419 371/593/420 118/591/418 +f 118/591/418 573/594/421 369/590/417 +f 370/592/419 365/583/410 119/595/422 +f 119/596/422 491/581/409 372/597/423 +f 372/597/423 373/598/424 119/596/422 +f 119/595/422 574/599/425 370/592/419 +f 120/600/426 491/581/409 367/586/413 +f 367/586/413 374/601/427 120/600/426 +f 120/600/426 576/602/428 375/603/429 +f 375/603/429 372/597/423 120/600/426 +f 121/604/430 492/589/416 368/588/415 +f 368/588/415 369/590/417 121/604/430 +f 121/604/430 573/594/421 376/605/431 +f 376/605/431 374/601/427 121/604/430 +f 377/606/432 371/593/420 122/607/433 +f 122/607/433 574/599/425 378/608/434 +f 122/607/433 578/609/435 379/610/436 +f 379/610/436 377/606/432 122/607/433 +f 378/608/434 373/611/424 123/612/437 +f 123/613/437 575/614/438 380/615/439 +f 380/615/439 381/616/440 123/613/437 +f 381/617/440 378/608/434 123/612/437 +f 124/618/441 575/614/438 375/603/429 +f 375/603/429 382/619/442 124/618/441 +f 382/619/442 383/620/443 124/618/441 +f 383/620/443 380/615/439 124/618/441 +f 125/621/444 576/602/428 376/605/431 +f 376/605/431 377/606/432 125/621/444 +f 377/606/432 384/622/445 125/621/444 +f 384/622/445 382/619/442 125/621/444 +f 385/623/446 379/610/436 126/624/447 +f 379/610/436 386/625/448 126/624/447 +f 126/624/447 582/626/449 387/627/450 +f 387/627/450 385/623/446 126/624/447 +f 386/625/448 381/617/440 127/628/451 +f 381/616/440 388/629/452 127/630/451 +f 127/630/451 583/631/453 389/632/454 +f 389/633/454 386/625/448 127/628/451 +f 388/629/452 383/620/443 128/634/455 +f 128/634/455 580/635/456 390/636/457 +f 390/636/457 391/637/458 128/634/455 +f 128/634/455 583/631/453 388/629/452 +f 390/636/457 384/622/445 129/638/459 +f 384/622/445 385/623/446 129/638/459 +f 385/623/446 392/639/460 129/638/459 +f 129/638/459 584/640/461 390/636/457 +f 130/641/462 581/642/463 387/627/450 +f 387/627/450 394/643/464 130/641/462 +f 130/641/462 494/644/465 395/645/466 +f 395/645/466 393/646/467 130/641/462 +f 131/647/468 582/626/449 389/633/454 +f 389/632/454 396/648/469 131/649/468 +f 131/649/468 495/650/470 397/651/471 +f 397/652/471 394/643/464 131/647/468 +f 396/648/469 391/637/458 132/653/472 +f 132/653/472 584/640/461 398/654/473 +f 398/654/473 399/655/474 132/653/472 +f 132/653/472 495/650/470 396/648/469 +f 398/654/473 392/639/460 133/656/475 +f 133/656/475 581/642/463 393/646/467 +f 393/646/467 400/657/476 133/656/475 +f 133/656/475 496/658/477 398/654/473 +f 401/659/478 395/645/466 134/660/479 +f 134/660/479 494/644/465 402/661/480 +f 402/661/480 403/662/481 134/660/479 +f 403/662/481 401/659/478 134/660/479 +f 402/661/480 397/652/471 135/663/482 +f 135/664/482 495/650/470 404/665/483 +f 404/665/483 405/666/484 135/664/482 +f 135/663/482 586/667/485 402/661/480 +f 136/668/486 495/650/470 399/655/474 +f 399/655/474 406/669/487 136/668/486 +f 136/668/486 588/670/488 407/671/489 +f 136/668/486 587/672/490 404/665/483 +f 137/673/491 496/658/477 400/657/476 +f 400/657/476 401/659/478 137/673/491 +f 137/673/491 585/674/492 408/675/493 +f 408/675/493 406/669/487 137/673/491 +f 138/676/494 585/674/492 403/662/481 +f 403/662/481 410/677/495 138/676/494 +f 138/676/494 498/678/496 411/679/497 +f 411/679/497 409/680/498 138/676/494 +f 139/681/499 586/667/485 405/682/484 +f 405/666/484 412/683/500 139/684/499 +f 139/684/499 499/685/501 413/686/502 +f 413/687/502 410/677/495 139/681/499 +f 412/683/500 407/671/489 140/688/503 +f 140/688/503 588/670/488 414/689/504 +f 414/689/504 415/690/505 140/688/503 +f 140/688/503 499/685/501 412/683/500 +f 414/689/504 408/675/493 141/691/506 +f 141/691/506 585/674/492 409/680/498 +f 409/680/498 416/692/507 141/691/506 +f 141/691/506 500/693/508 414/689/504 +f 417/694/509 411/695/497 142/696/510 +f 142/696/510 498/697/496 418/698/511 +f 418/698/511 419/699/512 142/696/510 +f 142/696/510 589/700/513 417/694/509 +f 418/698/511 413/701/502 143/702/514 +f 143/703/514 499/704/501 420/705/515 +f 420/705/515 421/706/516 143/703/514 +f 143/702/514 590/707/517 418/698/511 +f 144/708/518 499/704/501 415/709/505 +f 415/709/505 422/710/519 144/708/518 +f 144/708/518 592/711/520 423/712/521 +f 423/712/521 420/705/515 144/708/518 +f 145/713/522 500/714/508 416/715/507 +f 416/715/507 417/694/509 145/713/522 +f 145/713/522 589/700/513 424/716/523 +f 424/716/523 422/710/519 145/713/522 +f 146/717/524 481/458/305 311/457/304 +f 146/717/524 482/456/303 426/718/525 +f 426/718/525 427/719/526 146/717/524 +f 427/719/526 425/720/527 146/717/524 +f 426/718/525 313/462/309 147/721/528 +f 147/721/528 483/461/308 428/722/529 +f 428/722/529 429/723/530 147/721/528 +f 147/721/528 594/724/531 426/718/525 +f 428/722/529 315/466/312 148/725/532 +f 315/466/312 430/726/533 148/725/532 +f 148/725/532 596/727/534 431/728/535 +f 148/725/532 595/729/536 428/722/529 +f 149/730/537 484/470/315 316/469/314 +f 316/469/314 425/720/527 149/730/537 +f 149/730/537 593/731/538 432/732/539 +f 432/732/539 430/733/533 149/730/537 +f 150/734/540 593/731/538 427/719/526 +f 150/734/540 594/724/531 434/735/541 +f 434/735/541 435/736/542 150/734/540 +f 435/736/542 433/737/543 150/734/540 +f 434/735/541 429/723/530 151/738/544 +f 151/738/544 595/729/536 436/739/545 +f 436/739/545 437/740/546 151/738/544 +f 437/740/546 434/735/541 151/738/544 +f 436/739/545 431/728/535 152/741/547 +f 431/728/535 438/742/548 152/741/547 +f 152/741/547 600/743/549 439/744/550 +f 152/741/547 599/745/551 436/739/545 +f 153/746/552 596/747/534 432/732/539 +f 432/732/539 433/737/543 153/746/552 +f 433/737/543 440/748/553 153/746/552 +f 440/748/553 438/749/548 153/746/552 +f 154/750/542 597/751/554 435/736/542 +f 154/750/542 598/752/555 442/753/555 +f 154/750/542 602/754/555 443/755/542 +f 443/755/542 441/756/554 154/750/542 +f 155/757/546 598/752/555 437/740/546 +f 155/757/546 599/745/551 444/758/551 +f 155/757/546 603/759/551 445/760/546 +f 445/760/546 442/753/555 155/757/546 +f 444/758/551 439/744/550 156/761/550 +f 439/744/550 446/762/549 156/761/550 +f 156/761/550 604/763/549 447/764/550 +f 156/761/550 603/759/551 444/758/551 +f 446/765/549 440/748/553 157/766/553 +f 157/766/553 597/751/554 441/756/554 +f 441/756/554 448/767/553 157/766/553 +f 157/766/553 604/768/549 446/765/549 +f 158/769/556 601/770/554 443/755/542 +f 443/755/542 450/771/557 158/769/556 +f 158/769/556 606/772/558 451/773/559 +f 451/773/559 449/774/560 158/769/556 +f 159/775/561 602/754/555 445/760/546 +f 445/760/546 452/776/562 159/775/561 +f 159/775/561 607/777/563 453/778/564 +f 453/778/564 450/771/557 159/775/561 +f 452/776/562 447/764/550 160/779/565 +f 160/779/565 604/763/549 454/780/566 +f 454/780/566 455/781/567 160/779/565 +f 160/779/565 607/777/563 452/776/562 +f 454/782/566 448/767/553 161/783/568 +f 448/767/553 449/774/560 161/783/568 +f 449/774/560 456/784/569 161/783/568 +f 161/783/568 608/785/570 454/782/566 +f 162/786/571 605/787/572 451/773/559 +f 451/773/559 458/788/573 162/786/571 +f 162/786/571 502/474/319 318/472/317 +f 318/472/317 457/789/574 162/786/571 +f 163/790/575 606/772/558 453/778/564 +f 453/778/564 459/791/576 163/790/575 +f 163/790/575 503/483/325 321/481/323 +f 321/481/323 458/788/573 163/790/575 +f 459/791/576 455/781/567 164/792/577 +f 164/792/577 608/793/570 460/794/578 +f 460/794/578 324/490/330 164/792/577 +f 164/792/577 503/483/325 459/791/576 +f 460/795/578 456/784/569 165/796/579 +f 165/796/579 605/787/572 457/789/574 +f 457/789/574 327/497/336 165/796/579 +f 165/796/579 504/496/335 460/795/578 +f 662/797/580 671/798/10 670/799/580 +f 660/800/581 669/801/14 668/802/581 +f 659/803/9 666/804/582 658/805/582 +f 664/806/583 671/798/10 663/807/10 +f 661/808/14 670/799/580 669/801/14 +f 659/803/9 668/802/581 667/809/9 +f 657/810/13 666/804/582 665/811/13 +f 664/806/583 665/812/13 672/813/583 +f 702/814/13 709/110/20 701/815/20 +f 708/108/19 710/816/13 702/814/13 +f 707/106/18 714/104/17 715/817/18 +f 722/818/17 729/819/14 721/820/14 +f 719/821/16 728/822/15 727/823/16 +f 717/824/13 726/825/20 725/826/13 +f 724/827/19 725/826/13 732/828/19 +f 723/829/18 730/830/17 722/818/17 +f 721/820/14 728/822/15 720/831/15 +f 719/832/16 726/825/20 718/833/20 +f 724/827/19 731/834/18 723/829/18 +f 704/100/15 703/835/16 711/101/16 +f 705/103/14 713/112/14 714/104/17 +f 707/106/18 715/817/18 716/107/19 +f 703/109/16 701/815/20 709/110/20 +f 705/103/14 704/100/15 712/102/15 +f 700/113/19 686/128/13 685/114/13 +f 698/116/18 700/113/19 699/115/19 +f 696/118/17 698/116/18 697/117/18 +f 693/120/14 694/122/14 696/118/17 +f 691/121/15 692/836/15 694/122/14 +f 690/123/16 692/836/15 691/121/15 +f 687/125/20 688/837/20 690/126/16 +f 686/128/13 688/837/20 687/125/20 +f 167/129/21 506/142/34 168/130/22 +f 19/131/23 168/130/22 505/132/24 +f 20/134/26 169/138/30 507/135/27 +f 170/136/28 506/142/34 167/129/21 +f 171/137/29 507/135/27 169/138/30 +f 173/140/32 505/132/24 168/130/22 +f 22/141/33 168/130/22 506/142/34 +f 174/143/35 462/838/584 175/144/36 +f 22/141/33 175/144/36 461/145/37 +f 23/146/38 174/143/35 506/142/34 +f 170/136/28 507/135/27 176/147/39 +f 23/146/38 176/147/39 463/148/40 +f 177/149/41 462/838/584 174/143/35 +f 24/150/42 176/147/39 507/135/27 +f 171/137/29 508/839/585 178/151/43 +f 24/150/42 178/151/43 464/152/44 +f 179/153/45 463/148/40 176/147/39 +f 178/154/43 508/840/585 172/155/46 +f 25/156/47 172/155/46 505/132/24 +f 173/140/32 461/145/37 180/157/48 +f 25/156/47 180/157/48 464/158/44 +f 26/159/49 181/165/55 465/160/50 +f 182/161/51 466/841/586 183/162/52 +f 26/159/49 183/162/52 510/163/53 +f 184/164/54 509/180/69 181/165/55 +f 183/162/52 466/841/586 185/166/56 +f 27/167/57 185/166/56 467/168/58 +f 186/169/59 511/176/66 187/170/60 +f 27/167/57 187/170/60 510/163/53 +f 186/169/59 467/168/58 188/171/61 +f 28/172/62 188/171/61 468/173/63 +f 189/174/64 512/195/80 190/175/65 +f 28/172/62 190/175/65 511/176/66 +f 29/177/67 189/182/64 468/178/63 +f 191/179/68 465/160/50 181/165/55 +f 29/177/67 181/165/55 509/180/69 +f 192/181/70 512/202/80 189/182/64 +f 30/183/71 193/203/74 509/180/69 +f 184/164/54 510/163/53 194/184/72 +f 194/185/72 514/214/93 195/186/73 +f 195/186/73 513/208/87 193/188/74 +f 194/184/72 510/163/53 187/170/60 +f 31/189/75 187/170/60 511/176/66 +f 31/191/75 196/200/76 515/192/77 +f 197/193/78 514/214/93 194/185/72 +f 196/190/76 511/176/66 190/175/65 +f 32/194/79 190/175/65 512/195/80 +f 32/197/79 198/842/81 516/198/82 +f 32/197/79 199/199/83 515/192/77 +f 33/201/84 198/843/81 512/202/80 +f 192/181/70 509/180/69 193/203/74 +f 193/188/74 513/208/87 200/204/85 +f 200/204/85 516/223/82 198/206/81 +f 34/207/86 201/212/91 513/208/87 +f 195/186/73 514/214/93 202/209/88 +f 202/209/88 518/229/105 203/210/89 +f 34/207/86 203/210/89 517/211/90 +f 35/213/92 202/209/88 514/214/93 +f 35/213/92 197/193/78 515/192/77 +f 35/213/92 204/215/94 519/216/95 +f 205/217/96 518/229/105 202/209/88 +f 36/218/97 204/215/94 515/192/77 +f 199/199/83 516/198/82 206/219/98 +f 36/218/97 206/219/98 520/220/99 +f 207/221/100 519/216/95 204/215/94 +f 37/222/101 206/226/98 516/223/82 +f 200/204/85 513/208/87 201/212/91 +f 201/212/91 517/211/90 208/224/102 +f 37/222/101 208/224/102 520/225/99 +f 209/227/103 517/211/90 203/210/89 +f 38/228/104 203/210/89 518/229/105 +f 210/230/106 474/844/587 211/231/107 +f 38/228/104 211/231/107 473/232/108 +f 39/233/109 210/230/106 518/229/105 +f 205/217/96 519/216/95 212/234/110 +f 39/233/109 212/234/110 475/235/111 +f 213/236/112 474/844/587 210/230/106 +f 40/237/113 212/234/110 519/216/95 +f 207/221/100 520/220/99 214/238/114 +f 40/237/113 214/238/114 476/239/115 +f 215/240/116 475/235/111 212/234/110 +f 214/241/114 520/225/99 208/224/102 +f 41/242/117 208/224/102 517/211/90 +f 209/227/103 473/232/108 216/243/118 +f 41/242/117 216/243/118 476/244/115 +f 42/245/119 217/251/125 469/246/120 +f 218/247/121 470/845/588 219/248/122 +f 42/245/119 219/248/122 522/249/123 +f 220/250/124 521/266/139 217/251/125 +f 219/248/122 470/845/588 221/252/126 +f 43/253/127 221/252/126 471/254/128 +f 222/255/129 523/262/136 223/256/130 +f 43/253/127 223/256/130 522/249/123 +f 222/255/129 471/254/128 224/257/131 +f 44/258/132 224/257/131 472/259/133 +f 225/260/134 524/279/151 226/261/135 +f 44/258/132 226/261/135 523/262/136 +f 45/263/137 225/268/134 472/264/133 +f 227/265/138 469/246/120 217/251/125 +f 45/263/137 217/251/125 521/266/139 +f 228/267/140 524/284/151 225/268/134 +f 46/269/141 229/273/145 521/266/139 +f 220/250/124 522/249/123 230/270/142 +f 230/270/142 526/290/159 231/271/143 +f 46/269/141 231/271/143 525/272/144 +f 230/270/142 522/249/123 223/256/130 +f 47/274/146 223/256/130 523/262/136 +f 47/274/146 232/275/147 527/276/148 +f 233/277/149 526/290/159 230/270/142 +f 232/275/147 523/262/136 226/261/135 +f 48/278/150 226/261/135 524/279/151 +f 48/278/150 234/280/152 528/281/153 +f 235/282/154 527/276/148 232/275/147 +f 49/283/155 234/287/152 524/284/151 +f 228/267/140 521/266/139 229/273/145 +f 229/273/145 525/272/144 236/285/156 +f 49/283/155 236/285/156 528/286/153 +f 237/288/157 525/272/144 231/271/143 +f 50/289/158 231/271/143 526/290/159 +f 238/291/160 466/841/586 182/161/51 +f 50/289/158 182/161/51 465/160/50 +f 51/292/161 238/291/160 526/290/159 +f 233/277/149 527/276/148 239/293/162 +f 51/292/161 239/293/162 467/168/58 +f 185/166/56 466/841/586 238/291/160 +f 52/294/163 239/293/162 527/276/148 +f 235/282/154 528/281/153 240/295/164 +f 52/294/163 240/295/164 468/173/63 +f 188/171/61 467/168/58 239/293/162 +f 240/296/164 528/286/153 236/285/156 +f 53/297/165 236/285/156 525/272/144 +f 237/288/157 465/160/50 191/179/68 +f 53/297/165 191/179/68 468/178/63 +f 54/298/166 241/302/170 461/145/37 +f 175/144/36 462/838/584 242/299/167 +f 54/298/166 242/299/167 530/300/168 +f 243/301/169 529/311/179 241/302/170 +f 242/299/167 462/838/584 177/149/41 +f 55/303/171 177/149/41 463/148/40 +f 244/304/172 531/309/177 245/305/173 +f 55/303/171 245/305/173 530/300/168 +f 244/304/172 463/148/40 179/153/45 +f 56/306/174 179/153/45 464/152/44 +f 246/307/175 532/846/589 247/308/176 +f 56/306/174 247/308/176 531/309/177 +f 57/310/178 246/313/175 464/158/44 +f 180/157/48 461/145/37 241/302/170 +f 57/310/178 241/302/170 529/311/179 +f 248/312/180 532/847/589 246/313/175 +f 249/314/181 529/311/179 243/301/169 +f 58/315/182 243/301/169 530/300/168 +f 250/316/183 470/845/588 218/247/121 +f 58/315/182 218/247/121 469/246/120 +f 59/317/184 250/316/183 530/300/168 +f 245/305/173 531/309/177 251/318/185 +f 59/317/184 251/318/185 471/254/128 +f 221/252/126 470/845/588 250/316/183 +f 60/319/186 251/318/185 531/309/177 +f 247/308/176 532/846/589 252/320/187 +f 60/319/186 252/320/187 472/259/133 +f 224/257/131 471/254/128 251/318/185 +f 252/321/187 532/847/589 248/312/180 +f 61/322/188 248/312/180 529/311/179 +f 249/314/181 469/246/120 227/265/138 +f 61/322/188 227/265/138 472/264/133 +f 62/323/189 253/327/193 473/232/108 +f 211/231/107 474/844/587 254/324/190 +f 62/323/189 254/324/190 534/325/191 +f 255/326/192 533/336/202 253/327/193 +f 254/324/190 474/844/587 213/236/112 +f 63/328/194 213/236/112 475/235/111 +f 256/329/195 535/334/200 257/330/196 +f 63/328/194 257/330/196 534/325/191 +f 256/329/195 475/235/111 215/240/116 +f 64/331/197 215/240/116 476/239/115 +f 258/332/198 536/348/213 259/333/199 +f 64/331/197 259/333/199 535/334/200 +f 65/335/201 258/338/198 476/244/115 +f 216/243/118 473/232/108 253/327/193 +f 65/335/201 253/327/193 533/336/202 +f 260/337/203 536/352/213 258/338/198 +f 66/339/204 261/343/208 533/336/202 +f 255/326/192 534/325/191 262/340/205 +f 66/339/204 262/340/205 538/341/206 +f 263/342/207 537/353/217 261/343/208 +f 262/340/205 534/325/191 257/330/196 +f 67/344/209 257/330/196 535/334/200 +f 264/345/210 539/848/590 265/346/211 +f 67/344/209 265/346/211 538/341/206 +f 264/345/210 535/334/200 259/333/199 +f 68/347/212 259/333/199 536/348/213 +f 266/349/214 540/368/219 267/350/215 +f 267/350/215 539/848/590 264/345/210 +f 69/351/216 266/356/214 536/352/213 +f 260/337/203 533/336/202 261/343/208 +f 69/351/216 261/343/208 537/353/217 +f 69/351/216 268/354/218 540/355/219 +f 269/357/220 537/353/217 263/342/207 +f 263/342/207 538/341/206 270/359/222 +f 70/358/221 270/359/222 542/360/223 +f 70/358/221 271/361/224 541/362/225 +f 270/359/222 538/341/206 265/346/211 +f 265/346/211 539/848/590 272/364/227 +f 71/363/226 272/364/227 543/365/228 +f 273/366/229 542/360/223 270/359/222 +f 272/364/227 539/848/590 267/350/215 +f 72/367/230 267/350/215 540/368/219 +f 274/369/231 544/386/235 275/370/232 +f 275/370/232 543/365/228 272/364/227 +f 274/371/231 540/355/219 268/354/218 +f 268/354/218 537/353/217 269/357/220 +f 269/357/220 541/362/225 276/373/234 +f 73/372/233 276/373/234 544/374/235 +f 277/375/236 541/362/225 271/361/224 +f 271/361/224 542/360/223 278/377/238 +f 74/376/237 278/377/238 478/378/239 +f 74/376/237 279/379/240 477/380/241 +f 75/381/242 278/377/238 542/360/223 +f 273/366/229 543/365/228 280/382/243 +f 75/381/242 280/382/243 479/383/244 +f 281/384/245 478/378/239 278/377/238 +f 76/385/246 280/382/243 543/365/228 +f 76/385/246 275/370/232 544/386/235 +f 282/387/247 480/849/251 283/388/248 +f 283/388/248 479/383/244 280/382/243 +f 282/389/247 544/374/235 276/373/234 +f 77/390/249 276/373/234 541/362/225 +f 277/375/236 477/380/241 284/391/250 +f 77/390/249 284/391/250 480/392/251 +f 78/393/252 285/396/255 477/380/241 +f 78/393/252 279/379/240 478/378/239 +f 286/394/253 546/400/259 287/395/254 +f 287/395/254 545/407/266 285/396/255 +f 286/394/253 478/378/239 281/384/245 +f 79/397/256 281/384/245 479/383/244 +f 288/398/257 547/405/264 289/399/258 +f 79/397/256 289/399/258 546/400/259 +f 288/398/257 479/383/244 283/388/248 +f 283/388/248 480/849/251 290/402/261 +f 80/401/260 290/402/261 548/403/262 +f 80/401/260 291/404/263 547/405/264 +f 81/406/265 290/409/261 480/392/251 +f 284/391/250 477/380/241 285/396/255 +f 81/406/265 285/396/255 545/407/266 +f 292/408/267 548/428/262 290/409/261 +f 82/410/268 293/429/271 545/407/266 +f 82/410/268 287/395/254 546/400/259 +f 294/412/269 550/421/275 295/413/270 +f 295/413/270 549/431/281 293/415/271 +f 294/411/269 546/400/259 289/399/258 +f 83/416/272 289/399/258 547/405/264 +f 296/418/273 551/446/294 297/419/274 +f 83/420/272 297/419/274 550/421/275 +f 296/417/273 547/405/264 291/404/263 +f 291/404/263 548/403/262 298/423/277 +f 84/424/276 298/850/277 552/425/278 +f 299/426/279 551/446/294 296/418/273 +f 85/427/280 298/851/277 548/428/262 +f 292/408/267 545/407/266 293/429/271 +f 85/430/280 293/415/271 549/431/281 +f 85/430/280 300/432/282 552/433/278 +f 86/435/283 301/440/288 549/431/281 +f 86/435/283 295/413/270 550/421/275 +f 86/435/283 302/436/284 554/437/285 +f 86/435/283 303/438/286 553/439/287 +f 302/436/284 550/421/275 297/419/274 +f 297/419/274 551/446/294 304/442/290 +f 87/441/289 304/442/290 555/443/291 +f 305/444/292 554/437/285 302/436/284 +f 88/445/293 304/442/290 551/446/294 +f 299/426/279 552/425/278 306/447/295 +f 306/447/295 556/464/299 307/448/296 +f 307/448/296 555/443/291 304/442/290 +f 89/449/297 306/452/295 552/433/278 +f 89/449/297 300/432/282 549/431/281 +f 301/440/288 553/439/287 308/450/298 +f 89/449/297 308/450/298 556/451/299 +f 309/453/300 553/439/287 303/438/286 +f 303/438/286 554/437/285 310/455/302 +f 90/454/301 310/455/302 482/456/303 +f 90/454/301 311/457/304 481/458/305 +f 91/459/306 310/455/302 554/437/285 +f 305/444/292 555/443/291 312/460/307 +f 91/459/306 312/460/307 483/461/308 +f 313/462/309 482/456/303 310/455/302 +f 92/463/310 312/460/307 555/443/291 +f 92/463/310 307/448/296 556/464/299 +f 314/465/311 484/852/315 315/466/312 +f 315/466/312 483/461/308 312/460/307 +f 314/467/311 556/451/299 308/450/298 +f 93/468/313 308/450/298 553/439/287 +f 309/453/300 481/458/305 316/469/314 +f 93/468/313 316/469/314 484/470/315 +f 317/471/316 501/853/591 318/472/317 +f 94/473/318 318/472/317 502/474/319 +f 319/476/320 558/488/328 320/477/321 +f 94/478/318 320/477/321 557/479/322 +f 319/475/320 502/474/319 321/481/323 +f 95/482/324 321/481/323 503/483/325 +f 322/485/326 559/507/344 323/486/327 +f 95/487/324 323/486/327 558/488/328 +f 96/489/329 322/484/326 503/483/325 +f 324/490/330 504/854/335 325/491/331 +f 96/492/329 325/855/331 560/493/332 +f 326/494/333 559/507/344 322/485/326 +f 97/495/334 325/856/331 504/496/335 +f 327/497/336 501/853/591 317/471/316 +f 97/498/334 317/480/316 557/479/322 +f 328/499/337 560/515/332 325/500/331 +f 329/501/338 557/479/322 320/477/321 +f 98/502/339 320/477/321 558/488/328 +f 98/502/339 330/503/340 562/504/341 +f 331/505/342 561/520/355 329/501/338 +f 330/503/340 558/488/328 323/486/327 +f 99/506/343 323/486/327 559/507/344 +f 99/506/343 332/508/345 563/509/346 +f 333/510/347 562/504/341 330/503/340 +f 100/511/348 332/508/345 559/507/344 +f 326/494/333 560/493/332 334/512/349 +f 334/512/349 564/530/353 335/513/350 +f 100/511/348 335/513/350 563/509/346 +f 101/514/351 334/518/349 560/515/332 +f 328/499/337 557/479/322 329/501/338 +f 329/501/338 561/520/355 336/516/352 +f 101/514/351 336/516/352 564/517/353 +f 102/519/354 337/524/359 561/520/355 +f 331/505/342 562/504/341 338/521/356 +f 102/519/354 338/521/356 486/522/357 +f 339/523/358 485/857/592 337/524/359 +f 103/525/360 338/521/356 562/504/341 +f 333/510/347 563/509/346 340/526/361 +f 103/525/360 340/526/361 487/527/362 +f 341/528/363 486/522/357 338/521/356 +f 340/526/361 563/509/346 335/513/350 +f 104/529/364 335/513/350 564/530/353 +f 342/531/365 488/858/369 343/532/366 +f 104/529/364 343/532/366 487/527/362 +f 342/533/365 564/517/353 336/516/352 +f 105/534/367 336/516/352 561/520/355 +f 337/524/359 485/857/592 344/535/368 +f 105/534/367 344/535/368 488/536/369 +f 345/537/370 485/857/592 339/523/358 +f 106/538/371 339/523/358 486/522/357 +f 346/539/372 486/522/357 341/528/363 +f 107/540/373 341/528/363 487/527/362 +f 108/542/375 347/541/374 487/527/362 +f 343/532/366 488/858/369 348/543/376 +f 109/544/377 348/859/376 488/536/369 +f 344/535/368 485/857/592 345/537/370 +f 353/545/378 565/569/398 349/546/379 +f 110/547/380 349/546/379 566/548/381 +f 110/547/380 354/549/382 570/550/383 +f 355/551/384 569/573/402 353/545/378 +f 354/549/382 566/548/381 350/552/385 +f 350/554/385 567/561/391 356/555/387 +f 111/556/386 356/555/387 571/557/388 +f 357/559/389 570/550/383 354/549/382 +f 112/560/390 356/555/387 567/561/391 +f 351/562/392 568/566/396 358/563/393 +f 358/563/393 572/571/400 359/564/394 +f 112/560/390 359/564/394 571/557/388 +f 113/565/395 358/860/393 568/566/396 +f 113/568/395 352/567/397 565/569/398 +f 353/545/378 569/573/402 360/570/399 +f 113/568/395 360/570/399 572/571/400 +f 114/572/401 361/577/406 569/573/402 +f 355/551/384 570/550/383 362/574/403 +f 114/572/401 362/574/403 490/575/404 +f 363/576/405 489/861/593 361/577/406 +f 115/578/407 362/574/403 570/550/383 +f 357/558/389 571/557/388 364/579/408 +f 115/580/407 364/579/408 491/581/409 +f 365/583/410 490/575/404 362/574/403 +f 364/579/408 571/557/388 359/564/394 +f 116/584/411 359/564/394 572/571/400 +f 366/585/412 492/589/416 367/586/413 +f 116/584/411 367/586/413 491/581/409 +f 366/585/412 572/571/400 360/570/399 +f 117/587/414 360/570/399 569/573/402 +f 361/577/406 489/861/593 368/588/415 +f 117/587/414 368/588/415 492/589/416 +f 369/590/417 489/861/593 363/576/405 +f 118/591/418 363/576/405 490/575/404 +f 370/592/419 574/599/425 371/593/420 +f 118/591/418 371/593/420 573/594/421 +f 370/592/419 490/575/404 365/583/410 +f 119/596/422 365/582/410 491/581/409 +f 372/597/423 575/614/438 373/598/424 +f 119/595/422 373/611/424 574/599/425 +f 120/600/426 372/597/423 491/581/409 +f 367/586/413 492/589/416 374/601/427 +f 120/600/426 374/601/427 576/602/428 +f 375/603/429 575/614/438 372/597/423 +f 121/604/430 374/601/427 492/589/416 +f 368/588/415 489/861/593 369/590/417 +f 121/604/430 369/590/417 573/594/421 +f 376/605/431 576/602/428 374/601/427 +f 377/606/432 573/594/421 371/593/420 +f 122/607/433 371/593/420 574/599/425 +f 122/607/433 378/608/434 578/609/435 +f 379/610/436 577/862/594 377/606/432 +f 378/608/434 574/599/425 373/611/424 +f 123/613/437 373/598/424 575/614/438 +f 380/615/439 579/863/595 381/616/440 +f 381/617/440 578/609/435 378/608/434 +f 124/618/441 380/615/439 575/614/438 +f 375/603/429 576/602/428 382/619/442 +f 382/619/442 580/635/456 383/620/443 +f 383/620/443 579/863/595 380/615/439 +f 125/621/444 382/619/442 576/602/428 +f 376/605/431 573/594/421 377/606/432 +f 377/606/432 577/862/594 384/622/445 +f 384/622/445 580/635/456 382/619/442 +f 385/623/446 577/862/594 379/610/436 +f 379/610/436 578/609/435 386/625/448 +f 126/624/447 386/625/448 582/626/449 +f 387/627/450 581/642/463 385/623/446 +f 386/625/448 578/609/435 381/617/440 +f 381/616/440 579/863/595 388/629/452 +f 127/630/451 388/629/452 583/631/453 +f 389/633/454 582/626/449 386/625/448 +f 388/629/452 579/863/595 383/620/443 +f 128/634/455 383/620/443 580/635/456 +f 390/636/457 584/640/461 391/637/458 +f 128/634/455 391/637/458 583/631/453 +f 390/636/457 580/635/456 384/622/445 +f 384/622/445 577/862/594 385/623/446 +f 385/623/446 581/642/463 392/639/460 +f 129/638/459 392/639/460 584/640/461 +f 130/641/462 393/646/467 581/642/463 +f 387/627/450 582/626/449 394/643/464 +f 130/641/462 394/643/464 494/644/465 +f 395/645/466 493/864/596 393/646/467 +f 131/647/468 394/643/464 582/626/449 +f 389/632/454 583/631/453 396/648/469 +f 131/649/468 396/648/469 495/650/470 +f 397/652/471 494/644/465 394/643/464 +f 396/648/469 583/631/453 391/637/458 +f 132/653/472 391/637/458 584/640/461 +f 398/654/473 496/658/477 399/655/474 +f 132/653/472 399/655/474 495/650/470 +f 398/654/473 584/640/461 392/639/460 +f 133/656/475 392/639/460 581/642/463 +f 393/646/467 493/864/596 400/657/476 +f 133/656/475 400/657/476 496/658/477 +f 401/659/478 493/864/596 395/645/466 +f 134/660/479 395/645/466 494/644/465 +f 402/661/480 586/667/485 403/662/481 +f 403/662/481 585/674/492 401/659/478 +f 402/661/480 494/644/465 397/652/471 +f 135/664/482 397/651/471 495/650/470 +f 404/665/483 587/672/490 405/666/484 +f 135/663/482 405/682/484 586/667/485 +f 136/668/486 404/665/483 495/650/470 +f 399/655/474 496/658/477 406/669/487 +f 136/668/486 406/669/487 588/670/488 +f 136/668/486 407/671/489 587/672/490 +f 137/673/491 406/669/487 496/658/477 +f 400/657/476 493/864/596 401/659/478 +f 137/673/491 401/659/478 585/674/492 +f 408/675/493 588/670/488 406/669/487 +f 138/676/494 409/680/498 585/674/492 +f 403/662/481 586/667/485 410/677/495 +f 138/676/494 410/677/495 498/678/496 +f 411/679/497 497/865/597 409/680/498 +f 139/681/499 410/677/495 586/667/485 +f 405/666/484 587/672/490 412/683/500 +f 139/684/499 412/683/500 499/685/501 +f 413/687/502 498/678/496 410/677/495 +f 412/683/500 587/672/490 407/671/489 +f 140/688/503 407/671/489 588/670/488 +f 414/689/504 500/693/508 415/690/505 +f 140/688/503 415/690/505 499/685/501 +f 414/689/504 588/670/488 408/675/493 +f 141/691/506 408/675/493 585/674/492 +f 409/680/498 497/865/597 416/692/507 +f 141/691/506 416/692/507 500/693/508 +f 417/694/509 497/866/597 411/695/497 +f 142/696/510 411/695/497 498/697/496 +f 418/698/511 590/707/517 419/699/512 +f 142/696/510 419/699/512 589/700/513 +f 418/698/511 498/697/496 413/701/502 +f 143/703/514 413/867/502 499/704/501 +f 420/705/515 591/868/598 421/706/516 +f 143/702/514 421/869/516 590/707/517 +f 144/708/518 420/705/515 499/704/501 +f 415/709/505 500/714/508 422/710/519 +f 144/708/518 422/710/519 592/711/520 +f 423/712/521 591/868/598 420/705/515 +f 145/713/522 422/710/519 500/714/508 +f 416/715/507 497/866/597 417/694/509 +f 145/713/522 417/694/509 589/700/513 +f 424/716/523 592/711/520 422/710/519 +f 146/717/524 425/720/527 481/458/305 +f 146/717/524 311/457/304 482/456/303 +f 426/718/525 594/724/531 427/719/526 +f 427/719/526 593/731/538 425/720/527 +f 426/718/525 482/456/303 313/462/309 +f 147/721/528 313/462/309 483/461/308 +f 428/722/529 595/729/536 429/723/530 +f 147/721/528 429/723/530 594/724/531 +f 428/722/529 483/461/308 315/466/312 +f 315/466/312 484/852/315 430/726/533 +f 148/725/532 430/726/533 596/727/534 +f 148/725/532 431/728/535 595/729/536 +f 149/730/537 430/733/533 484/470/315 +f 316/469/314 481/458/305 425/720/527 +f 149/730/537 425/720/527 593/731/538 +f 432/732/539 596/747/534 430/733/533 +f 150/734/540 433/737/543 593/731/538 +f 150/734/540 427/719/526 594/724/531 +f 434/735/541 598/752/555 435/736/542 +f 435/736/542 597/751/554 433/737/543 +f 434/735/541 594/724/531 429/723/530 +f 151/738/544 429/723/530 595/729/536 +f 436/739/545 599/745/551 437/740/546 +f 437/740/546 598/752/555 434/735/541 +f 436/739/545 595/729/536 431/728/535 +f 431/728/535 596/727/534 438/742/548 +f 152/741/547 438/742/548 600/743/549 +f 152/741/547 439/744/550 599/745/551 +f 153/746/552 438/749/548 596/747/534 +f 432/732/539 593/731/538 433/737/543 +f 433/737/543 597/751/554 440/748/553 +f 440/748/553 600/870/549 438/749/548 +f 154/750/542 441/756/554 597/751/554 +f 154/750/542 435/736/542 598/752/555 +f 154/750/542 442/753/555 602/754/555 +f 443/755/542 601/770/554 441/756/554 +f 155/757/546 442/753/555 598/752/555 +f 155/757/546 437/740/546 599/745/551 +f 155/757/546 444/758/551 603/759/551 +f 445/760/546 602/754/555 442/753/555 +f 444/758/551 599/745/551 439/744/550 +f 439/744/550 600/743/549 446/762/549 +f 156/761/550 446/762/549 604/763/549 +f 156/761/550 447/764/550 603/759/551 +f 446/765/549 600/870/549 440/748/553 +f 157/766/553 440/748/553 597/751/554 +f 441/756/554 601/770/554 448/767/553 +f 157/766/553 448/767/553 604/768/549 +f 158/769/556 449/774/560 601/770/554 +f 443/755/542 602/754/555 450/771/557 +f 158/769/556 450/771/557 606/772/558 +f 451/773/559 605/787/572 449/774/560 +f 159/775/561 450/771/557 602/754/555 +f 445/760/546 603/759/551 452/776/562 +f 159/775/561 452/776/562 607/777/563 +f 453/778/564 606/772/558 450/771/557 +f 452/776/562 603/759/551 447/764/550 +f 160/779/565 447/764/550 604/763/549 +f 454/780/566 608/793/570 455/781/567 +f 160/779/565 455/781/567 607/777/563 +f 454/782/566 604/768/549 448/767/553 +f 448/767/553 601/770/554 449/774/560 +f 449/774/560 605/787/572 456/784/569 +f 161/783/568 456/784/569 608/785/570 +f 162/786/571 457/789/574 605/787/572 +f 451/773/559 606/772/558 458/788/573 +f 162/786/571 458/788/573 502/474/319 +f 318/472/317 501/853/591 457/789/574 +f 163/790/575 458/788/573 606/772/558 +f 453/778/564 607/777/563 459/791/576 +f 163/790/575 459/791/576 503/483/325 +f 321/481/323 502/474/319 458/788/573 +f 459/791/576 607/777/563 455/781/567 +f 164/792/577 455/781/567 608/793/570 +f 460/794/578 504/854/335 324/490/330 +f 164/792/577 324/490/330 503/483/325 +f 460/795/578 608/785/570 456/784/569 +f 165/796/579 456/784/569 605/787/572 +f 457/789/574 501/853/591 327/497/336 +f 165/796/579 327/497/336 504/496/335 +f 662/797/580 663/807/10 671/798/10 +f 660/800/581 661/808/14 669/801/14 +f 659/803/9 667/809/9 666/804/582 +f 664/806/583 672/813/583 671/798/10 +f 661/808/14 662/797/580 670/799/580 +f 659/803/9 660/800/581 668/802/581 +f 657/810/13 658/805/582 666/804/582 +f 664/806/583 657/871/13 665/812/13 +f 702/814/13 710/816/13 709/110/20 +f 708/108/19 716/107/19 710/816/13 +f 707/106/18 706/105/17 714/104/17 +f 722/818/17 730/830/17 729/819/14 +f 719/821/16 720/831/15 728/822/15 +f 717/824/13 718/833/20 726/825/20 +f 724/827/19 717/824/13 725/826/13 +f 723/829/18 731/834/18 730/830/17 +f 721/820/14 729/819/14 728/822/15 +f 719/832/16 727/872/16 726/825/20 +f 724/827/19 732/828/19 731/834/18 +o Nozzle +v -6.250000 0.933709 -0.066291 +v -6.250000 1.000001 -0.093750 +v -6.187500 1.000001 -0.187500 +v -4.687500 1.000001 -0.187500 +v -6.187500 0.867418 -0.132583 +v -4.687500 0.867418 -0.132583 +v -6.187500 0.812501 0.000000 +v -4.687500 0.812501 0.000000 +v -6.187500 0.867418 0.132583 +v -4.687500 0.867418 0.132583 +v -6.187500 1.000001 0.187500 +v -4.687500 1.000001 0.187500 +v -6.187500 1.132583 0.132582 +v -4.687500 1.132583 0.132582 +v -6.187500 1.187501 -0.000000 +v -4.687500 1.187501 -0.000000 +v -6.187500 1.132583 -0.132582 +v -4.687500 1.132583 -0.132582 +v -6.250000 0.906251 0.000000 +v -6.250000 0.933709 0.066291 +v -6.250000 1.000001 0.093750 +v -6.250000 1.066292 0.066291 +v -6.250000 1.093751 -0.000000 +v -6.250000 1.066292 -0.066291 +v -4.625000 0.933709 -0.066291 +v -4.625000 1.000001 -0.093750 +v -4.625000 0.906251 0.000000 +v -4.625000 0.933709 0.066291 +v -4.625000 1.000001 0.093750 +v -4.625000 1.066292 0.066291 +v -4.625000 1.093751 0.000000 +v -4.625000 1.066292 -0.066291 +v -6.312500 1.066292 -0.066291 +v -6.312500 1.000001 -0.093750 +v -6.312500 1.093751 -0.000000 +v -6.312500 1.066292 0.066291 +v -6.312500 1.000001 0.093750 +v -6.312500 0.933709 0.066291 +v -6.312500 0.906251 -0.000000 +v -6.312500 0.933709 -0.066291 +v -4.562500 0.933709 -0.066291 +v -4.562500 1.000001 -0.093750 +v -4.562500 0.906251 0.000000 +v -4.562500 0.933709 0.066291 +v -4.562500 1.000001 0.093750 +v -4.562500 1.066292 0.066291 +v -4.562500 1.093751 0.000000 +v -4.562500 1.066292 -0.066291 +v -4.336167 0.044194 0.913833 +v -4.304917 0.062500 0.945083 +v -6.437500 0.062500 1.000000 +v -4.437500 0.062500 1.000000 +v -6.437500 0.044194 0.955806 +v -4.437500 0.044194 0.955806 +v -6.437500 0.000000 0.937500 +v -4.437500 0.000000 0.937500 +v -6.437500 -0.044194 0.955806 +v -4.437500 -0.044194 0.955806 +v -6.437500 -0.062500 1.000000 +v -4.437500 -0.062500 1.000000 +v -6.437500 -0.044194 1.044194 +v -4.437500 -0.044194 1.044194 +v -6.437500 0.000000 1.062500 +v -4.437500 0.000000 1.062500 +v -6.437500 0.044194 1.044194 +v -4.437500 0.044194 1.044194 +v -4.349112 0.000000 0.900889 +v -4.336167 -0.044194 0.913833 +v -4.304917 -0.062500 0.945083 +v -4.273667 -0.044194 0.976333 +v -4.260723 0.000000 0.989277 +v -4.273667 0.044194 0.976333 +v -4.294194 0.044194 0.812500 +v -4.250000 0.062500 0.812500 +v -4.312500 0.000000 0.812500 +v -4.294194 -0.044194 0.812500 +v -4.250000 -0.062500 0.812500 +v -4.205806 -0.044194 0.812500 +v -4.187500 0.000000 0.812500 +v -4.205806 0.044194 0.812500 +v -4.294194 0.044194 0.562500 +v -4.250000 0.062500 0.562500 +v -4.312500 0.000000 0.562500 +v -4.294194 -0.044194 0.562500 +v -4.250000 -0.062500 0.562500 +v -4.205806 -0.044194 0.562500 +v -4.187500 0.000000 0.562500 +v -4.205806 0.044194 0.562500 +v -4.338388 0.088389 0.437500 +v -4.250000 0.125000 0.437500 +v -4.375000 0.000000 0.437500 +v -4.338388 -0.088388 0.437500 +v -4.250000 -0.125000 0.437500 +v -4.161612 -0.088388 0.437500 +v -4.125000 0.000000 0.437500 +v -4.161612 0.088389 0.437500 +v -4.338388 0.088389 0.562500 +v -4.250000 0.125000 0.562500 +v -4.375000 0.000000 0.562500 +v -4.338388 -0.088388 0.562500 +v -4.250000 -0.125000 0.562500 +v -4.161612 -0.088388 0.562500 +v -4.125000 0.000000 0.562500 +v -4.161612 0.088389 0.562500 +v -6.570083 0.062500 0.945083 +v -6.538833 0.044194 0.913833 +v -6.525888 0.000000 0.900889 +v -6.538833 -0.044194 0.913833 +v -6.570083 -0.062500 0.945083 +v -6.601333 -0.044194 0.976333 +v -6.614277 0.000000 0.989277 +v -6.601333 0.044194 0.976333 +v -6.746859 0.062500 0.768306 +v -6.715609 0.044194 0.737056 +v -6.702665 0.000000 0.724112 +v -6.715609 -0.044194 0.737056 +v -6.746859 -0.062500 0.768306 +v -6.778109 -0.044194 0.799556 +v -6.791053 0.000000 0.812500 +v -6.778109 0.044194 0.799556 +v -6.746859 0.093750 0.768306 +v -6.699984 0.066291 0.721431 +v -6.680568 0.000000 0.702015 +v -6.699984 -0.066291 0.721431 +v -6.746859 -0.093750 0.768306 +v -6.793734 -0.066291 0.815181 +v -6.813150 0.000000 0.834597 +v -6.793734 0.066291 0.815181 +v -6.835247 0.093750 0.679918 +v -6.788372 0.066291 0.633043 +v -6.768956 0.000000 0.613626 +v -6.788372 -0.066291 0.633043 +v -6.835247 -0.093750 0.679918 +v -6.882122 -0.066291 0.726792 +v -6.901539 0.000000 0.746209 +v -6.882122 0.066291 0.726792 +v -6.250000 0.066292 0.933709 +v -6.250000 0.093750 1.000001 +v -6.187500 0.187500 1.000001 +v -4.687500 0.187500 1.000001 +v -6.187500 0.132583 0.867418 +v -4.687500 0.132583 0.867418 +v -6.187500 0.000000 0.812501 +v -4.687500 0.000000 0.812501 +v -6.187500 -0.132582 0.867418 +v -4.687500 -0.132582 0.867418 +v -6.187500 -0.187500 1.000001 +v -4.687500 -0.187500 1.000001 +v -6.187500 -0.132582 1.132583 +v -4.687500 -0.132582 1.132583 +v -6.187500 0.000000 1.187501 +v -4.687500 0.000000 1.187501 +v -6.187500 0.132583 1.132583 +v -4.687500 0.132583 1.132583 +v -6.250000 0.000000 0.906251 +v -6.250000 -0.066291 0.933710 +v -6.250000 -0.093750 1.000001 +v -6.250000 -0.066291 1.066292 +v -6.250000 0.000000 1.093751 +v -6.250000 0.066292 1.066292 +v -4.625000 0.066292 0.933710 +v -4.625000 0.093750 1.000001 +v -4.625000 0.000000 0.906251 +v -4.625000 -0.066291 0.933710 +v -4.625000 -0.093750 1.000001 +v -4.625000 -0.066291 1.066292 +v -4.625000 0.000000 1.093751 +v -4.625000 0.066291 1.066292 +v -6.312500 0.066292 1.066292 +v -6.312500 0.093750 1.000001 +v -6.312500 0.000000 1.093751 +v -6.312500 -0.066291 1.066292 +v -6.312500 -0.093750 1.000001 +v -6.312500 -0.066291 0.933710 +v -6.312500 0.000000 0.906251 +v -6.312500 0.066292 0.933710 +v -4.562500 0.066292 0.933709 +v -4.562500 0.093750 1.000001 +v -4.562500 0.000000 0.906251 +v -4.562500 -0.066291 0.933709 +v -4.562500 -0.093750 1.000001 +v -4.562500 -0.066291 1.066292 +v -4.562500 0.000000 1.093751 +v -4.562500 0.066292 1.066292 +v -6.250000 0.933709 -0.066291 +v -6.250000 1.000001 -0.093750 +v -6.187500 1.000001 -0.187500 +v -4.687500 1.000001 -0.187500 +v -6.187500 0.867418 -0.132583 +v -4.687500 0.867418 -0.132583 +v -6.187500 0.812501 0.000000 +v -4.687500 0.812501 0.000000 +v -6.187500 0.867418 0.132583 +v -4.687500 0.867418 0.132583 +v -6.187500 1.000001 0.187500 +v -4.687500 1.000001 0.187500 +v -6.187500 1.132583 0.132582 +v -4.687500 1.132583 0.132582 +v -6.187500 1.187501 -0.000000 +v -4.687500 1.187501 -0.000000 +v -6.187500 1.132583 -0.132582 +v -4.687500 1.132583 -0.132582 +v -6.250000 0.906251 0.000000 +v -6.250000 0.933709 0.066291 +v -6.250000 1.000001 0.093750 +v -6.250000 1.066292 0.066291 +v -6.250000 1.093751 -0.000000 +v -6.250000 1.066292 -0.066291 +v -4.625000 0.933709 -0.066291 +v -4.625000 1.000001 -0.093750 +v -4.625000 0.906251 0.000000 +v -4.625000 0.933709 0.066291 +v -4.625000 1.000001 0.093750 +v -4.625000 1.066292 0.066291 +v -4.625000 1.093751 0.000000 +v -4.625000 1.066292 -0.066291 +v -6.312500 1.066292 -0.066291 +v -6.312500 1.000001 -0.093750 +v -6.312500 1.093751 -0.000000 +v -6.312500 1.066292 0.066291 +v -6.312500 1.000001 0.093750 +v -6.312500 0.933709 0.066291 +v -6.312500 0.906251 -0.000000 +v -6.312500 0.933709 -0.066291 +v -4.562500 0.933709 -0.066291 +v -4.562500 1.000001 -0.093750 +v -4.562500 0.906251 0.000000 +v -4.562500 0.933709 0.066291 +v -4.562500 1.000001 0.093750 +v -4.562500 1.066292 0.066291 +v -4.562500 1.093751 0.000000 +v -4.562500 1.066292 -0.066291 +v -6.250000 0.066292 0.933709 +v -6.250000 0.093750 1.000001 +v -6.187500 0.187500 1.000001 +v -4.687500 0.187500 1.000001 +v -6.187500 0.132583 0.867418 +v -4.687500 0.132583 0.867418 +v -6.187500 0.000000 0.812501 +v -4.687500 0.000000 0.812501 +v -6.187500 -0.132582 0.867418 +v -4.687500 -0.132582 0.867418 +v -6.187500 -0.187500 1.000001 +v -4.687500 -0.187500 1.000001 +v -6.187500 -0.132582 1.132583 +v -4.687500 -0.132582 1.132583 +v -6.187500 0.000000 1.187501 +v -4.687500 0.000000 1.187501 +v -6.187500 0.132583 1.132583 +v -4.687500 0.132583 1.132583 +v -6.250000 0.000000 0.906251 +v -6.250000 -0.066291 0.933710 +v -6.250000 -0.093750 1.000001 +v -6.250000 -0.066291 1.066292 +v -6.250000 0.000000 1.093751 +v -6.250000 0.066292 1.066292 +v -4.625000 0.066292 0.933710 +v -4.625000 0.093750 1.000001 +v -4.625000 0.000000 0.906251 +v -4.625000 -0.066291 0.933710 +v -4.625000 -0.093750 1.000001 +v -4.625000 -0.066291 1.066292 +v -4.625000 0.000000 1.093751 +v -4.625000 0.066291 1.066292 +v -6.312500 0.066292 1.066292 +v -6.312500 0.093750 1.000001 +v -6.312500 0.000000 1.093751 +v -6.312500 -0.066291 1.066292 +v -6.312500 -0.093750 1.000001 +v -6.312500 -0.066291 0.933710 +v -6.312500 0.000000 0.906251 +v -6.312500 0.066292 0.933710 +v -4.562500 0.066292 0.933709 +v -4.562500 0.093750 1.000001 +v -4.562500 0.000000 0.906251 +v -4.562500 -0.066291 0.933709 +v -4.562500 -0.093750 1.000001 +v -4.562500 -0.066291 1.066292 +v -4.562500 0.000000 1.093751 +v -4.562500 0.066292 1.066292 +v -6.746859 0.062500 0.768306 +v -6.715609 0.044194 0.737056 +v -6.702665 0.000000 0.724112 +v -6.715609 -0.044194 0.737056 +v -6.746859 -0.062500 0.768306 +v -6.778109 -0.044194 0.799556 +v -6.791053 0.000000 0.812500 +v -6.778109 0.044194 0.799556 +v -6.746859 0.093750 0.768306 +v -6.699984 0.066291 0.721431 +v -6.680568 0.000000 0.702015 +v -6.699984 -0.066291 0.721431 +v -6.746859 -0.093750 0.768306 +v -6.793734 -0.066291 0.815181 +v -6.813150 0.000000 0.834597 +v -6.793734 0.066291 0.815181 +v -6.835247 0.093750 0.679918 +v -6.788372 0.066291 0.633043 +v -6.768956 0.000000 0.613626 +v -6.788372 -0.066291 0.633043 +v -6.835247 -0.093750 0.679918 +v -6.882122 -0.066291 0.726792 +v -6.901539 0.000000 0.746209 +v -6.882122 0.066291 0.726792 +v -4.338388 0.088389 0.562500 +v -4.250000 0.125000 0.562500 +v -4.375000 0.000000 0.562500 +v -4.338388 -0.088388 0.562500 +v -4.250000 -0.125000 0.562500 +v -4.161612 -0.088388 0.562500 +v -4.125000 0.000000 0.562500 +v -4.161612 0.088389 0.562500 +vt 0.411238 0.697368 +vt 0.418973 0.684493 +vt 0.426708 0.697368 +vt 0.405138 0.703796 +vt 0.399301 0.694079 +vt 0.405138 0.684363 +vt 0.274703 0.703644 +vt 0.270640 0.700842 +vt 0.278767 0.687315 +vt 0.239289 0.634604 +vt 0.239289 0.648291 +vt 0.231066 0.648291 +vt 0.252964 0.638158 +vt 0.249012 0.644737 +vt 0.249012 0.638158 +vt 0.252964 0.651316 +vt 0.249012 0.657895 +vt 0.249012 0.651316 +vt 0.252964 0.671053 +vt 0.249012 0.664474 +vt 0.252964 0.664474 +vt 0.252964 0.677632 +vt 0.249012 0.671053 +vt 0.249012 0.631579 +vt 0.252964 0.631579 +vt 0.252964 0.644737 +vt 0.252964 0.657895 +vt 0.252964 0.684211 +vt 0.249012 0.677632 +vt 0.274703 0.703644 +vt 0.270640 0.700842 +vt 0.278767 0.687315 +vt 0.405138 0.703796 +vt 0.399301 0.694079 +vt 0.405138 0.684363 +vt 0.424442 0.706472 +vt 0.418973 0.710243 +vt 0.413503 0.706472 +vt 0.413503 0.688264 +vt 0.424442 0.688264 +vt 0.409266 0.687209 +vt 0.410976 0.694079 +vt 0.409266 0.700950 +vt 0.401010 0.700950 +vt 0.401010 0.687209 +vt 0.268957 0.694079 +vt 0.270640 0.687315 +vt 0.274703 0.684514 +vt 0.280450 0.694079 +vt 0.278767 0.700842 +vt 0.229363 0.641447 +vt 0.231066 0.634604 +vt 0.235178 0.631769 +vt 0.240992 0.641447 +vt 0.235178 0.651126 +vt 0.249012 0.684211 +vt 0.268957 0.694079 +vt 0.270640 0.687315 +vt 0.274703 0.684514 +vt 0.280450 0.694079 +vt 0.278767 0.700842 +vt 0.409266 0.687209 +vt 0.410976 0.694079 +vt 0.409266 0.700950 +vt 0.401010 0.700950 +vt 0.401010 0.687209 +vt 0.387352 0.710526 +vt 0.395257 0.717105 +vt 0.387352 0.723684 +vt 0.292490 0.710526 +vt 0.284585 0.717105 +vt 0.284585 0.710526 +vt 0.387352 0.710526 +vt 0.395257 0.697368 +vt 0.395257 0.703947 +vt 0.292490 0.763158 +vt 0.284585 0.769737 +vt 0.284585 0.763158 +vt 0.387352 0.789474 +vt 0.395257 0.776316 +vt 0.395257 0.782895 +vt 0.292490 0.776316 +vt 0.284585 0.782895 +vt 0.284585 0.776316 +vt 0.395257 0.717105 +vt 0.387352 0.723684 +vt 0.387352 0.736842 +vt 0.395257 0.723684 +vt 0.395257 0.730263 +vt 0.292490 0.763158 +vt 0.284585 0.750000 +vt 0.292490 0.750000 +vt 0.292490 0.723684 +vt 0.284585 0.730263 +vt 0.284585 0.723684 +vt 0.387352 0.763158 +vt 0.395257 0.750000 +vt 0.395257 0.756579 +vt 0.395257 0.769737 +vt 0.387352 0.776316 +vt 0.292490 0.684211 +vt 0.284585 0.690789 +vt 0.284585 0.684211 +vt 0.284585 0.736842 +vt 0.292490 0.736842 +vt 0.387352 0.684211 +vt 0.395257 0.690789 +vt 0.387352 0.697368 +vt 0.292490 0.710526 +vt 0.284585 0.697368 +vt 0.292490 0.697368 +vt 0.395257 0.743421 +vt 0.387352 0.750000 +vt 0.284585 0.717105 +vt 0.284585 0.710526 +vt 0.395257 0.703947 +vt 0.292490 0.776316 +vt 0.284585 0.763158 +vt 0.387352 0.789474 +vt 0.395257 0.776316 +vt 0.395257 0.782895 +vt 0.292490 0.789474 +vt 0.284585 0.776316 +vt 0.387352 0.763158 +vt 0.292490 0.776316 +vt 0.292490 0.763158 +vt 0.387352 0.776316 +vt 0.292490 0.789474 +vt 0.387352 0.684211 +vt 0.292490 0.697368 +vt 0.292490 0.684211 +vt 0.387352 0.697368 +vt 0.292490 0.710526 +vt 0.387352 0.710526 +vt 0.292490 0.723684 +vt 0.395257 0.717105 +vt 0.399209 0.723684 +vt 0.395257 0.723684 +vt 0.387352 0.723684 +vt 0.292490 0.736842 +vt 0.284585 0.690789 +vt 0.280632 0.684211 +vt 0.284585 0.684211 +vt 0.387352 0.736842 +vt 0.292490 0.750000 +vt 0.387352 0.750000 +vt 0.284585 0.723684 +vt 0.280632 0.717105 +vt 0.284585 0.717105 +vt 0.284585 0.710526 +vt 0.280632 0.703947 +vt 0.284585 0.703947 +vt 0.284585 0.736842 +vt 0.280632 0.730263 +vt 0.284585 0.730263 +vt 0.280632 0.710526 +vt 0.280632 0.697368 +vt 0.284585 0.697368 +vt 0.280632 0.723684 +vt 0.280632 0.690789 +vt 0.395257 0.703947 +vt 0.399209 0.710526 +vt 0.395257 0.710526 +vt 0.395257 0.690789 +vt 0.399209 0.697368 +vt 0.395257 0.697368 +vt 0.395257 0.730263 +vt 0.399209 0.736842 +vt 0.395257 0.736842 +vt 0.399209 0.717105 +vt 0.399209 0.703947 +vt 0.395257 0.684211 +vt 0.399209 0.690789 +vt 0.399209 0.730263 +vt 0.411067 0.657895 +vt 0.418972 0.664474 +vt 0.411067 0.664474 +vt 0.411067 0.671053 +vt 0.403162 0.677632 +vt 0.403162 0.671053 +vt 0.276680 0.677632 +vt 0.276680 0.671053 +vt 0.403162 0.664474 +vt 0.276680 0.684211 +vt 0.411067 0.644737 +vt 0.418972 0.651316 +vt 0.411067 0.651316 +vt 0.403162 0.657895 +vt 0.403162 0.631579 +vt 0.276680 0.638158 +vt 0.276680 0.631579 +vt 0.418972 0.644737 +vt 0.411067 0.638158 +vt 0.418972 0.638158 +vt 0.403162 0.651316 +vt 0.403162 0.638158 +vt 0.276680 0.644737 +vt 0.411067 0.631579 +vt 0.418972 0.631579 +vt 0.403162 0.644737 +vt 0.276680 0.651316 +vt 0.418972 0.677632 +vt 0.411067 0.684211 +vt 0.411067 0.677632 +vt 0.276680 0.657895 +vt 0.403162 0.684211 +vt 0.276680 0.664474 +vt 0.418972 0.671053 +vt 0.268775 0.677632 +vt 0.434783 0.657895 +vt 0.418972 0.657895 +vt 0.434783 0.684211 +vt 0.418972 0.684211 +vt 0.434783 0.638158 +vt 0.434783 0.664474 +vt 0.434783 0.644737 +vt 0.434783 0.671053 +vt 0.434783 0.677632 +vt 0.434783 0.651316 +vt 0.434783 0.684211 +vt 0.426877 0.697368 +vt 0.426877 0.684211 +vt 0.434783 0.776316 +vt 0.426877 0.763158 +vt 0.434783 0.763158 +vt 0.434783 0.750000 +vt 0.426877 0.736842 +vt 0.434783 0.736842 +vt 0.434783 0.723684 +vt 0.426877 0.710526 +vt 0.434783 0.710526 +vt 0.434783 0.697368 +vt 0.426877 0.789474 +vt 0.426877 0.776316 +vt 0.426877 0.750000 +vt 0.426877 0.723684 +vt 0.268775 0.657895 +vt 0.252964 0.664474 +vt 0.252964 0.657895 +vt 0.268775 0.684211 +vt 0.268775 0.638158 +vt 0.268775 0.644737 +vt 0.268775 0.651316 +vt 0.268775 0.664474 +vt 0.268775 0.671053 +vt 0.252964 0.651316 +vt 0.252964 0.644737 +vt 0.268775 0.631579 +vt 0.252964 0.638158 +vt 0.252964 0.631579 +vt 0.252964 0.671053 +vt 0.252964 0.677632 +vt 0.249012 0.664474 +vt 0.241107 0.671053 +vt 0.241107 0.664474 +vt 0.249012 0.657895 +vt 0.241107 0.651316 +vt 0.249012 0.651316 +vt 0.249012 0.644737 +vt 0.241107 0.638158 +vt 0.249012 0.638158 +vt 0.249012 0.684211 +vt 0.241107 0.677632 +vt 0.249012 0.677632 +vt 0.241107 0.657895 +vt 0.241107 0.644737 +vt 0.249012 0.631579 +vt 0.241107 0.631579 +vt 0.249012 0.671053 +vt 0.387352 0.763158 +vt 0.292490 0.776316 +vt 0.292490 0.763158 +vt 0.387352 0.776316 +vt 0.292490 0.789474 +vt 0.387352 0.684211 +vt 0.292490 0.697368 +vt 0.292490 0.684211 +vt 0.387352 0.697368 +vt 0.292490 0.710526 +vt 0.387352 0.710526 +vt 0.292490 0.723684 +vt 0.395257 0.717105 +vt 0.399209 0.723684 +vt 0.395257 0.723684 +vt 0.387352 0.723684 +vt 0.292490 0.736842 +vt 0.284585 0.684211 +vt 0.280632 0.690789 +vt 0.280632 0.684211 +vt 0.387352 0.736842 +vt 0.292490 0.750000 +vt 0.387352 0.750000 +vt 0.284585 0.717105 +vt 0.280632 0.723684 +vt 0.280632 0.717105 +vt 0.284585 0.710526 +vt 0.280632 0.703947 +vt 0.284585 0.703947 +vt 0.284585 0.730263 +vt 0.280632 0.736842 +vt 0.280632 0.730263 +vt 0.280632 0.710526 +vt 0.280632 0.697368 +vt 0.284585 0.697368 +vt 0.284585 0.723684 +vt 0.284585 0.690789 +vt 0.395257 0.703947 +vt 0.399209 0.710526 +vt 0.395257 0.710526 +vt 0.395257 0.690789 +vt 0.399209 0.697368 +vt 0.395257 0.697368 +vt 0.395257 0.730263 +vt 0.399209 0.736842 +vt 0.395257 0.736842 +vt 0.399209 0.717105 +vt 0.399209 0.703947 +vt 0.395257 0.684211 +vt 0.399209 0.690789 +vt 0.399209 0.730263 +vt 0.387352 0.736842 +vt 0.395257 0.743421 +vt 0.387352 0.750000 +vt 0.284585 0.697368 +vt 0.292490 0.697368 +vt 0.387352 0.697368 +vt 0.395257 0.684211 +vt 0.395257 0.690789 +vt 0.292490 0.736842 +vt 0.284585 0.743421 +vt 0.284585 0.736842 +vt 0.284585 0.684211 +vt 0.292490 0.684211 +vt 0.387352 0.763158 +vt 0.395257 0.769737 +vt 0.387352 0.776316 +vt 0.395257 0.750000 +vt 0.395257 0.756579 +vt 0.284585 0.723684 +vt 0.292490 0.723684 +vt 0.284585 0.750000 +vt 0.292490 0.750000 +vt 0.395257 0.723684 +vt 0.395257 0.730263 +vt 0.395257 0.710526 +vt 0.292490 0.789474 +vt 0.395257 0.710526 +vt 0.284585 0.756579 +vt 0.395257 0.763158 +vt 0.284585 0.743421 +vt 0.395257 0.684211 +vt 0.284585 0.703947 +vt 0.395257 0.736842 +vt 0.395257 0.697368 +vt 0.284585 0.769737 +vt 0.284585 0.782895 +vt 0.387352 0.789474 +vt 0.280632 0.736842 +vt 0.399209 0.684211 +vt 0.434783 0.631579 +vt 0.434783 0.789474 +vt 0.252964 0.684211 +vt 0.241107 0.684211 +vt 0.387352 0.789474 +vt 0.284585 0.736842 +vt 0.399209 0.684211 +vt 0.395257 0.736842 +vt 0.284585 0.703947 +vt 0.387352 0.684211 +vt 0.284585 0.690789 +vt 0.395257 0.763158 +vt 0.284585 0.730263 +vt 0.284585 0.756579 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.8320 0.0000 0.5547 +vn 0.8320 0.3922 0.3922 +vn -0.8320 -0.5547 0.0000 +vn -0.8320 -0.3922 0.3922 +vn 0.8320 -0.5547 0.0000 +vn 0.8320 -0.3922 -0.3922 +vn -0.8320 0.5547 0.0000 +vn -0.8320 0.3922 -0.3922 +vn 0.8320 0.0000 -0.5547 +vn 0.8320 0.3922 -0.3922 +vn -0.8320 0.0000 -0.5547 +vn 0.8320 -0.3922 0.3922 +vn 0.8320 0.5547 0.0000 +vn -0.8320 0.3922 0.3922 +vn -0.8320 0.0000 0.5547 +vn -0.8320 -0.3922 -0.3922 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 1.0000 0.0000 +vn 0.7194 0.6794 0.1447 +vn 0.5293 0.6630 0.5293 +vn 0.0670 0.9955 0.0670 +vn -0.1363 0.7263 -0.6737 +vn 0.0196 0.9987 0.0473 +vn 0.1363 0.7263 -0.6737 +vn -0.0196 0.9987 0.0473 +vn 0.1447 0.6794 0.7194 +vn 0.2048 0.0000 -0.9788 +vn 0.0670 -0.9955 0.0670 +vn 0.7194 -0.6794 0.1447 +vn 0.5293 -0.6630 0.5293 +vn 0.1866 0.0000 0.9824 +vn -0.2048 0.0000 -0.9788 +vn 0.1363 -0.7263 -0.6737 +vn 0.0473 -0.9987 0.0196 +vn -0.4617 -0.7573 -0.4617 +vn -0.6737 -0.7263 -0.1363 +vn 0.1447 -0.6794 0.7194 +vn -0.1363 -0.7263 -0.6737 +vn -0.0196 -0.9987 0.0473 +vn -0.9788 0.0000 -0.2048 +vn 0.0196 -0.9987 0.0473 +vn -0.1447 -0.6794 0.7194 +vn -0.6737 0.7263 -0.1363 +vn -0.4617 0.7573 -0.4617 +vn -0.1866 0.0000 0.9824 +vn -0.1447 0.6794 0.7194 +vn 0.0473 0.9987 0.0196 +vn 0.3800 0.7263 -0.5727 +vn 0.9824 0.0000 0.1866 +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.5628 0.0000 0.8266 +vn -0.5000 0.7071 0.5000 +vn -0.7071 0.0000 0.7071 +vn 0.5472 0.0000 -0.8369 +vn 0.3800 -0.7263 -0.5727 +vn -0.4063 -0.6794 0.6110 +vn -0.4063 0.6794 0.6110 +vn -0.5000 -0.7071 0.5000 +vn 0.5000 -0.7071 -0.5000 +vn 0.7071 0.0000 -0.7071 +vn 0.5000 0.7071 -0.5000 +s off +f 1049/873/599 1051/874/599 1046/875/599 +f 971/876/600 969/877/600 967/878/600 +f 959/879/601 957/880/601 962/881/601 +f 1040/882/602 1042/883/602 1044/884/602 +f 1024/885/603 1033/886/603 1032/887/603 +f 1026/888/603 1035/889/603 1034/890/603 +f 1021/891/603 1036/892/603 1028/893/603 +f 1022/894/603 1029/895/603 1021/891/603 +f 1024/885/603 1031/896/603 1023/897/603 +f 1025/898/603 1034/890/603 1033/886/603 +f 1028/893/603 1035/889/603 1027/899/603 +f 1023/900/603 1030/901/603 1022/894/603 +f 1007/902/601 1005/903/601 1010/904/601 +f 1019/905/600 1017/906/600 1015/907/600 +f 1046/875/599 1045/908/599 1047/909/599 +f 1047/909/599 1048/910/599 1049/873/599 +f 1049/873/599 1050/911/599 1051/874/599 +f 1051/874/599 1052/912/599 1046/875/599 +f 1046/875/599 1047/909/599 1049/873/599 +f 967/878/600 965/913/600 966/914/600 +f 966/914/600 972/915/600 971/876/600 +f 971/876/600 970/916/600 969/877/600 +f 969/877/600 968/917/600 967/878/600 +f 967/878/600 966/914/600 971/876/600 +f 957/880/601 958/918/601 964/919/601 +f 964/919/601 963/920/601 957/880/601 +f 963/920/601 962/881/601 957/880/601 +f 962/881/601 961/921/601 960/922/601 +f 960/922/601 959/879/601 962/881/601 +f 1044/884/602 1037/923/602 1038/924/602 +f 1038/924/602 1039/925/602 1044/884/602 +f 1039/925/602 1040/882/602 1044/884/602 +f 1040/882/602 1041/926/602 1042/883/602 +f 1042/883/602 1043/927/602 1044/884/602 +f 1024/885/603 1025/898/603 1033/886/603 +f 1026/888/603 1027/899/603 1035/889/603 +f 1021/891/603 1029/895/603 1036/892/603 +f 1022/894/603 1030/901/603 1029/895/603 +f 1024/885/603 1032/887/603 1031/896/603 +f 1025/898/603 1026/888/603 1034/890/603 +f 1028/893/603 1036/892/603 1035/889/603 +f 1023/900/603 1031/928/603 1030/901/603 +f 1005/903/601 1006/929/601 1012/930/601 +f 1012/930/601 1011/931/601 1005/903/601 +f 1011/931/601 1010/904/601 1005/903/601 +f 1010/904/601 1009/932/601 1008/933/601 +f 1008/933/601 1007/902/601 1010/904/601 +f 1015/907/600 1013/934/600 1014/935/600 +f 1014/935/600 1020/936/600 1019/905/600 +f 1019/905/600 1018/937/600 1017/906/600 +f 1017/906/600 1016/938/600 1015/907/600 +f 1015/907/600 1014/935/600 1019/905/600 +s 1 +f 936/939/604 954/940/605 938/941/605 +f 983/942/606 994/943/607 993/944/606 +f 984/945/608 1000/946/609 1001/947/608 +f 975/948/610 973/949/611 974/950/610 +f 980/951/612 997/952/613 999/953/612 +f 977/954/611 991/955/614 973/956/611 +f 984/945/608 1002/957/615 986/958/615 +f 940/959/616 954/960/605 955/961/616 +f 927/962/614 948/963/611 941/964/611 +f 937/965/617 947/966/610 946/967/617 +f 928/968/612 956/969/613 950/970/612 +f 928/968/612 949/971/609 930/972/609 +f 931/973/606 944/974/607 943/975/606 +f 941/964/611 947/976/610 939/977/610 +f 932/978/608 952/979/615 934/980/615 +f 935/981/618 944/982/607 933/983/607 +f 940/959/616 956/984/613 942/985/613 +f 935/981/618 946/986/617 945/987/618 +f 934/980/615 953/988/604 936/939/604 +f 929/989/619 926/990/614 927/962/614 +f 932/991/608 949/992/609 951/993/608 +f 931/994/606 925/995/619 929/989/619 +f 744/996/620 745/997/621 743/998/620 +f 746/999/621 747/1000/622 745/997/621 +f 748/1001/622 749/1002/623 747/1003/622 +f 750/1004/623 751/1005/599 749/1002/623 +f 752/1006/599 753/1007/624 751/1005/599 +f 772/1008/625 782/1009/620 766/1010/620 +f 754/1011/624 755/1012/626 753/1007/624 +f 760/1013/623 779/1014/622 759/1015/622 +f 756/1016/626 757/1017/625 755/1012/626 +f 758/1018/625 743/998/620 757/1017/625 +f 742/1019/620 773/1020/625 764/1021/625 +f 763/1022/626 776/1023/624 762/1024/624 +f 759/1025/622 780/1026/621 741/1027/621 +f 764/1021/625 775/1028/626 763/1022/626 +f 762/1024/624 777/1029/599 761/1030/599 +f 741/1027/621 774/1031/620 742/1019/620 +f 761/1030/599 778/1032/623 760/1013/623 +f 770/1033/624 787/1034/626 771/1035/626 +f 768/1036/623 785/1037/599 769/1038/599 +f 765/1039/621 783/1040/622 767/1041/622 +f 771/1035/626 788/1042/625 772/1008/625 +f 769/1038/599 786/1043/624 770/1033/624 +f 767/1044/622 784/1045/623 768/1036/623 +f 766/1010/620 781/1046/621 765/1039/621 +f 811/1047/603 820/1048/627 812/1049/628 +f 790/1050/629 794/1051/630 792/1052/631 +f 792/1052/631 793/1053/632 791/1054/633 +f 820/1048/627 790/1050/629 812/1049/628 +f 790/1050/629 806/1055/634 812/1049/628 +f 794/1051/630 795/1056/635 793/1053/632 +f 809/1057/636 818/1058/637 810/1059/638 +f 812/1049/628 804/1060/639 811/1047/603 +f 796/1061/640 797/1062/641 795/1063/635 +f 817/1064/642 808/1065/643 816/1066/644 +f 811/1047/603 802/1067/645 810/1059/638 +f 798/1068/646 799/1069/647 797/1062/641 +f 816/1066/644 807/1070/602 815/1071/648 +f 809/1057/636 802/1067/645 800/1072/649 +f 800/1072/649 801/1073/650 799/1069/647 +f 813/1074/651 807/1075/602 789/1076/652 +f 807/1070/602 798/1068/646 796/1061/640 +f 802/1067/645 803/1077/653 801/1073/650 +f 808/1065/643 800/1072/649 798/1068/646 +f 789/1076/652 796/1078/640 794/1051/630 +f 804/1060/639 805/1079/654 803/1077/653 +f 818/1058/637 811/1047/603 810/1059/638 +f 813/1074/651 790/1050/629 814/1080/655 +f 806/1055/634 791/1054/633 805/1079/654 +f 846/1081/656 791/1054/633 793/1053/632 +f 818/1058/637 827/1082/600 819/1083/657 +f 813/1074/651 823/1084/601 815/1085/648 +f 815/1071/648 824/1086/658 816/1066/644 +f 819/1083/657 828/1087/659 820/1048/627 +f 816/1066/644 825/1088/622 817/1064/642 +f 820/1048/627 822/1089/626 814/1080/655 +f 814/1080/655 821/1090/660 813/1074/651 +f 817/1064/642 826/1091/661 818/1058/637 +f 835/1092/600 844/1093/659 843/1094/600 +f 834/1095/661 841/1096/622 833/1097/622 +f 832/1098/658 839/1099/601 831/1100/601 +f 829/1101/660 838/1102/626 830/1103/626 +f 830/1103/626 844/1093/659 836/1104/659 +f 834/1095/661 843/1105/600 842/1106/661 +f 833/1097/622 840/1107/658 832/1098/658 +f 831/1100/601 837/1108/660 829/1101/660 +f 851/1109/662 860/1110/663 859/1111/664 +f 847/1112/665 793/1053/632 795/1056/635 +f 848/1113/666 795/1063/635 797/1062/641 +f 849/1114/647 797/1062/641 799/1069/647 +f 850/1115/667 799/1069/647 801/1073/650 +f 851/1109/662 801/1073/650 803/1077/653 +f 852/1116/668 803/1077/653 805/1079/654 +f 845/1117/633 805/1079/654 791/1054/633 +f 849/1114/647 858/1118/669 857/1119/622 +f 847/1120/665 856/1121/670 855/1122/671 +f 846/1081/656 853/1123/626 845/1117/633 +f 852/1116/668 853/1123/626 860/1110/663 +f 850/1115/667 859/1111/664 858/1118/669 +f 848/1113/666 857/1119/622 856/1121/670 +f 847/1112/665 854/1124/672 846/1081/656 +f 868/1125/663 869/1126/626 876/1127/663 +f 867/1128/664 874/1129/669 866/1130/669 +f 865/1131/622 872/1132/670 864/1133/670 +f 863/1134/671 870/1135/672 862/1136/672 +f 867/1128/664 876/1127/663 875/1137/664 +f 866/1130/669 873/1138/622 865/1131/622 +f 863/1139/671 872/1132/670 871/1140/671 +f 862/1136/672 869/1126/626 861/1141/626 +f 880/1142/626 881/1143/625 879/1144/626 +f 882/1145/625 883/1146/620 881/1143/625 +f 884/1147/620 885/1148/621 883/1149/620 +f 886/1150/621 887/1151/622 885/1148/621 +f 888/1152/622 889/1153/623 887/1151/622 +f 908/1154/624 918/1155/626 902/1156/626 +f 890/1157/623 891/1158/599 889/1153/623 +f 895/1159/620 914/1160/621 915/1161/620 +f 892/1162/599 893/1163/624 891/1158/599 +f 894/1164/624 879/1144/626 893/1163/624 +f 900/1165/624 910/1166/626 909/1167/624 +f 899/1168/599 912/1169/623 898/1170/623 +f 877/1171/625 915/1172/620 916/1173/625 +f 900/1165/624 911/1174/599 899/1168/599 +f 898/1170/623 913/1175/622 897/1176/622 +f 878/1177/626 916/1173/625 910/1166/626 +f 897/1176/622 914/1160/621 896/1178/621 +f 906/1179/623 923/1180/599 907/1181/599 +f 904/1182/621 921/1183/622 905/1184/622 +f 901/1185/625 919/1186/620 903/1187/620 +f 908/1154/624 923/1180/599 924/1188/624 +f 906/1179/623 921/1183/622 922/1189/623 +f 903/1190/620 920/1191/621 904/1182/621 +f 901/1185/625 918/1155/626 917/1192/625 +f 988/1193/604 1004/1194/605 990/1195/605 +f 983/942/606 992/1196/619 981/1197/619 +f 982/1198/609 999/1199/612 1000/1200/609 +f 987/1201/618 996/1202/617 995/1203/618 +f 981/1197/619 991/1204/614 979/1205/614 +f 976/1206/616 997/1207/613 978/1208/613 +f 976/1206/616 1004/1209/605 998/1210/616 +f 987/1201/618 994/1211/607 985/1212/607 +f 975/948/610 996/1213/617 989/1214/617 +f 988/1193/604 1002/1215/615 1003/1216/604 +f 936/939/604 953/1217/604 954/940/605 +f 983/942/606 985/1212/607 994/943/607 +f 984/945/608 982/1198/609 1000/946/609 +f 975/948/610 977/954/611 973/949/611 +f 980/951/612 978/1208/613 997/952/613 +f 977/954/611 979/1218/614 991/955/614 +f 984/945/608 1001/1219/608 1002/957/615 +f 940/959/616 938/941/605 954/960/605 +f 927/962/614 926/1220/614 948/963/611 +f 937/965/617 939/977/610 947/966/610 +f 928/968/612 942/985/613 956/969/613 +f 928/968/612 950/1221/612 949/971/609 +f 931/973/606 933/983/607 944/974/607 +f 941/964/611 948/1222/611 947/976/610 +f 932/978/608 951/1223/608 952/979/615 +f 935/981/618 945/1224/618 944/982/607 +f 940/959/616 955/1225/616 956/984/613 +f 935/981/618 937/965/617 946/986/617 +f 934/980/615 952/1226/615 953/988/604 +f 929/989/619 925/1227/619 926/990/614 +f 932/991/608 930/972/609 949/992/609 +f 931/994/606 943/1228/606 925/995/619 +f 744/996/620 746/999/621 745/997/621 +f 746/999/621 748/1229/622 747/1000/622 +f 748/1001/622 750/1004/623 749/1002/623 +f 750/1004/623 752/1006/599 751/1005/599 +f 752/1006/599 754/1011/624 753/1007/624 +f 772/1008/625 788/1042/625 782/1009/620 +f 754/1011/624 756/1016/626 755/1012/626 +f 760/1013/623 778/1032/623 779/1014/622 +f 756/1016/626 758/1018/625 757/1017/625 +f 758/1018/625 744/996/620 743/998/620 +f 742/1019/620 774/1031/620 773/1020/625 +f 763/1022/626 775/1028/626 776/1023/624 +f 759/1025/622 779/1230/622 780/1026/621 +f 764/1021/625 773/1020/625 775/1028/626 +f 762/1024/624 776/1023/624 777/1029/599 +f 741/1027/621 780/1026/621 774/1031/620 +f 761/1030/599 777/1029/599 778/1032/623 +f 770/1033/624 786/1043/624 787/1034/626 +f 768/1036/623 784/1045/623 785/1037/599 +f 765/1039/621 781/1046/621 783/1040/622 +f 771/1035/626 787/1034/626 788/1042/625 +f 769/1038/599 785/1037/599 786/1043/624 +f 767/1044/622 783/1231/622 784/1045/623 +f 766/1010/620 782/1009/620 781/1046/621 +f 811/1047/603 819/1083/657 820/1048/627 +f 790/1050/629 789/1076/652 794/1051/630 +f 792/1052/631 794/1051/630 793/1053/632 +f 820/1048/627 814/1080/655 790/1050/629 +f 790/1050/629 792/1052/631 806/1055/634 +f 794/1051/630 796/1078/640 795/1056/635 +f 809/1057/636 817/1064/642 818/1058/637 +f 812/1049/628 806/1055/634 804/1060/639 +f 796/1061/640 798/1068/646 797/1062/641 +f 817/1064/642 809/1057/636 808/1065/643 +f 811/1047/603 804/1060/639 802/1067/645 +f 798/1068/646 800/1072/649 799/1069/647 +f 816/1066/644 808/1065/643 807/1070/602 +f 809/1057/636 810/1059/638 802/1067/645 +f 800/1072/649 802/1067/645 801/1073/650 +f 813/1074/651 815/1085/648 807/1075/602 +f 807/1070/602 808/1065/643 798/1068/646 +f 802/1067/645 804/1060/639 803/1077/653 +f 808/1065/643 809/1057/636 800/1072/649 +f 789/1076/652 807/1075/602 796/1078/640 +f 804/1060/639 806/1055/634 805/1079/654 +f 818/1058/637 819/1083/657 811/1047/603 +f 813/1074/651 789/1076/652 790/1050/629 +f 806/1055/634 792/1052/631 791/1054/633 +f 846/1081/656 845/1117/633 791/1054/633 +f 818/1058/637 826/1091/661 827/1082/600 +f 813/1074/651 821/1090/660 823/1084/601 +f 815/1071/648 823/1232/601 824/1086/658 +f 819/1083/657 827/1082/600 828/1087/659 +f 816/1066/644 824/1086/658 825/1088/622 +f 820/1048/627 828/1087/659 822/1089/626 +f 814/1080/655 822/1089/626 821/1090/660 +f 817/1064/642 825/1088/622 826/1091/661 +f 835/1092/600 836/1104/659 844/1093/659 +f 834/1095/661 842/1106/661 841/1096/622 +f 832/1098/658 840/1107/658 839/1099/601 +f 829/1101/660 837/1108/660 838/1102/626 +f 830/1103/626 838/1102/626 844/1093/659 +f 834/1095/661 835/1233/600 843/1105/600 +f 833/1097/622 841/1096/622 840/1107/658 +f 831/1100/601 839/1099/601 837/1108/660 +f 851/1109/662 852/1116/668 860/1110/663 +f 847/1112/665 846/1081/656 793/1053/632 +f 848/1113/666 847/1120/665 795/1063/635 +f 849/1114/647 848/1113/666 797/1062/641 +f 850/1115/667 849/1114/647 799/1069/647 +f 851/1109/662 850/1115/667 801/1073/650 +f 852/1116/668 851/1109/662 803/1077/653 +f 845/1117/633 852/1116/668 805/1079/654 +f 849/1114/647 850/1115/667 858/1118/669 +f 847/1120/665 848/1113/666 856/1121/670 +f 846/1081/656 854/1124/672 853/1123/626 +f 852/1116/668 845/1117/633 853/1123/626 +f 850/1115/667 851/1109/662 859/1111/664 +f 848/1113/666 849/1114/647 857/1119/622 +f 847/1112/665 855/1234/671 854/1124/672 +f 868/1125/663 861/1141/626 869/1126/626 +f 867/1128/664 875/1137/664 874/1129/669 +f 865/1131/622 873/1138/622 872/1132/670 +f 863/1134/671 871/1235/671 870/1135/672 +f 867/1128/664 868/1125/663 876/1127/663 +f 866/1130/669 874/1129/669 873/1138/622 +f 863/1139/671 864/1133/670 872/1132/670 +f 862/1136/672 870/1135/672 869/1126/626 +f 880/1142/626 882/1145/625 881/1143/625 +f 882/1145/625 884/1236/620 883/1146/620 +f 884/1147/620 886/1150/621 885/1148/621 +f 886/1150/621 888/1152/622 887/1151/622 +f 888/1152/622 890/1157/623 889/1153/623 +f 908/1154/624 924/1188/624 918/1155/626 +f 890/1157/623 892/1162/599 891/1158/599 +f 895/1159/620 896/1178/621 914/1160/621 +f 892/1162/599 894/1164/624 893/1163/624 +f 894/1164/624 880/1142/626 879/1144/626 +f 900/1165/624 878/1177/626 910/1166/626 +f 899/1168/599 911/1174/599 912/1169/623 +f 877/1171/625 895/1237/620 915/1172/620 +f 900/1165/624 909/1167/624 911/1174/599 +f 898/1170/623 912/1169/623 913/1175/622 +f 878/1177/626 877/1171/625 916/1173/625 +f 897/1176/622 913/1175/622 914/1160/621 +f 906/1179/623 922/1189/623 923/1180/599 +f 904/1182/621 920/1191/621 921/1183/622 +f 901/1185/625 917/1192/625 919/1186/620 +f 908/1154/624 907/1181/599 923/1180/599 +f 906/1179/623 905/1184/622 921/1183/622 +f 903/1190/620 919/1238/620 920/1191/621 +f 901/1185/625 902/1156/626 918/1155/626 +f 988/1193/604 1003/1239/604 1004/1194/605 +f 983/942/606 993/1240/606 992/1196/619 +f 982/1198/609 980/1241/612 999/1199/612 +f 987/1201/618 989/1214/617 996/1202/617 +f 981/1197/619 992/1242/619 991/1204/614 +f 976/1206/616 998/1243/616 997/1207/613 +f 976/1206/616 990/1195/605 1004/1209/605 +f 987/1201/618 995/1244/618 994/1211/607 +f 975/948/610 974/1245/610 996/1213/617 +f 988/1193/604 986/958/615 1002/1215/615 +o Gun +v -0.500000 0.000000 -1.000000 +v 4.000000 0.000000 -1.000000 +v -0.500000 -0.382683 -0.923879 +v 4.000000 -0.382683 -0.923879 +v -0.500000 -0.707107 -0.707107 +v 4.000000 -0.707107 -0.707107 +v -0.500000 -0.923879 -0.382683 +v 4.000000 -0.923879 -0.382683 +v -0.500000 -1.000000 0.000000 +v 4.000000 -1.000000 0.000000 +v -0.500000 -0.923879 0.382683 +v 4.000000 -0.923879 0.382683 +v -0.500000 -0.707107 0.707107 +v 4.000000 -0.707107 0.707107 +v -0.500000 -0.382683 0.923879 +v 4.000000 -0.382683 0.923879 +v -0.500000 0.000000 1.000000 +v 4.000000 -0.000000 1.000000 +v -0.500000 0.382683 0.923880 +v 4.000000 0.382683 0.923880 +v -0.500000 0.707107 0.707107 +v 4.000000 0.707107 0.707107 +v -0.500000 0.923880 0.382684 +v 4.000000 0.923880 0.382684 +v -0.500000 1.000000 -0.000000 +v 4.000000 1.000000 -0.000000 +v -0.500000 0.923880 -0.382684 +v 4.000000 0.923880 -0.382684 +v -0.500000 0.707107 -0.707107 +v 4.000000 0.707107 -0.707107 +v -0.500000 0.382683 -0.923880 +v 4.000000 0.382683 -0.923880 +v 4.125000 -0.334848 -0.808394 +v 4.125000 0.000000 -0.875000 +v 4.125000 -0.618718 -0.618718 +v 4.125000 -0.808394 -0.334848 +v 4.125000 -0.875000 0.000000 +v 4.125000 -0.808394 0.334848 +v 4.125000 -0.618718 0.618718 +v 4.125000 -0.334848 0.808394 +v 4.125000 -0.000000 0.875000 +v 4.125000 0.334848 0.808395 +v 4.125000 0.618718 0.618719 +v 4.125000 0.808395 0.334848 +v 4.125000 0.875000 -0.000000 +v 4.125000 0.808395 -0.334848 +v 4.125000 0.618718 -0.618719 +v 4.125000 0.334848 -0.808395 +v 4.250000 -0.191342 -0.461940 +v 4.250000 0.000000 -0.500000 +v 4.250000 -0.353553 -0.353553 +v 4.250000 -0.461940 -0.191342 +v 4.250000 -0.500000 0.000000 +v 4.250000 -0.461940 0.191342 +v 4.250000 -0.353553 0.353553 +v 4.250000 -0.191342 0.461940 +v 4.250000 -0.000000 0.500000 +v 4.250000 0.191342 0.461940 +v 4.250000 0.353553 0.353553 +v 4.250000 0.461940 0.191342 +v 4.250000 0.500000 -0.000000 +v 4.250000 0.461940 -0.191342 +v 4.250000 0.353553 -0.353554 +v 4.250000 0.191342 -0.461940 +v 3.687500 0.324759 1.125000 +v 3.824760 0.187500 1.125000 +v 3.875000 -0.000000 1.125000 +v 3.824759 -0.187500 1.125000 +v 3.687500 -0.324760 1.125000 +v 3.500000 -0.375000 1.125000 +v 3.312500 -0.324760 1.125000 +v 3.175241 -0.187500 1.125000 +v 3.125000 -0.000000 1.125000 +v 3.175241 0.187500 1.125000 +v 3.312500 0.324759 1.125000 +v 3.500000 0.375000 1.125000 +v 3.625000 0.216506 1.125000 +v 3.716506 0.125000 1.125000 +v 3.750000 -0.000000 1.125000 +v 3.716506 -0.125000 1.125000 +v 3.625000 -0.216506 1.125000 +v 3.500000 -0.250000 1.125000 +v 3.375000 -0.216506 1.125000 +v 3.283494 -0.125000 1.125000 +v 3.250000 -0.000000 1.125000 +v 3.283494 0.125000 1.125000 +v 3.375000 0.216506 1.125000 +v 3.500000 0.250000 1.125000 +v 4.742188 -0.088388 -0.088388 +v 4.742188 -0.125000 -0.000000 +v 4.742188 -0.088388 0.088388 +v 4.742188 -0.000000 0.125000 +v 4.742188 0.088388 0.088388 +v 4.742188 0.125000 -0.000000 +v 4.742188 0.088388 -0.088388 +v 4.742188 -0.000000 -0.125000 +v 4.492188 -0.000000 -0.125000 +v 4.492188 0.088388 -0.088388 +v 4.492188 0.125000 -0.000000 +v 4.492188 0.088388 0.088388 +v 4.492188 -0.000000 0.125000 +v 4.492188 -0.088388 0.088388 +v 4.492188 -0.125000 -0.000000 +v 4.492188 -0.088388 -0.088388 +v 4.742188 -0.000000 -0.125000 +v 4.742188 0.088388 -0.088388 +v 4.742188 0.125000 -0.000000 +v 4.742188 0.088388 0.088388 +v 4.742188 -0.000000 0.125000 +v 4.742188 -0.088388 0.088388 +v 4.742188 -0.125000 -0.000000 +v 4.742188 -0.088388 -0.088388 +v 4.554688 -0.000000 0.265165 +v 4.554688 -0.265165 -0.000000 +v 4.554688 0.265165 0.000000 +v 4.554688 -0.000000 -0.265165 +v 4.679688 0.265165 0.000000 +v 4.679688 -0.000000 0.265165 +v 4.679688 -0.265165 -0.000000 +v 4.679688 -0.000000 -0.265165 +v 5.054688 -0.265165 -0.000000 +v 5.054688 -0.000000 -0.265165 +v 5.054688 -0.883883 -0.618718 +v 5.054688 -0.618718 -0.883883 +v 4.929688 -0.883883 -0.618718 +v 4.929688 -0.618718 -0.883883 +v 4.929688 -0.353553 -0.088388 +v 4.929688 -0.088388 -0.353553 +v 4.679688 -0.353553 -0.088388 +v 4.679688 -0.088388 -0.353553 +v 5.054688 -0.928078 -0.751301 +v 5.054688 -0.751301 -0.928078 +v 4.929688 -0.928078 -0.751301 +v 4.929688 -0.751301 -0.928078 +v -1.000000 0.382683 -0.923880 +v -1.000000 0.707107 -0.707107 +v -1.000000 0.923880 -0.382684 +v -1.000000 1.000000 -0.000000 +v -1.000000 0.923880 0.382684 +v -1.000000 0.707107 0.707107 +v -1.000000 0.382683 0.923880 +v -1.000000 0.000000 1.000000 +v -1.000000 -0.382683 0.923879 +v -1.000000 -0.707107 0.707107 +v -1.000000 -0.923879 0.382683 +v -1.000000 -1.000000 0.000000 +v -1.000000 -0.923879 -0.382683 +v -1.000000 -0.707107 -0.707107 +v -1.000000 -0.382683 -0.923879 +v -1.000000 0.000000 -1.000000 +v -4.000000 0.143506 -0.346455 +v -4.000000 0.265165 -0.265165 +v -4.000000 0.346455 -0.143506 +v -4.000000 0.375000 -0.000000 +v -4.000000 0.346455 0.143506 +v -4.000000 0.265165 0.265165 +v -4.000000 0.143506 0.346455 +v -4.000000 0.000000 0.375000 +v -4.000000 -0.143506 0.346455 +v -4.000000 -0.265165 0.265165 +v -4.000000 -0.346455 0.143506 +v -4.000000 -0.375000 0.000000 +v -4.000000 -0.346455 -0.143506 +v -4.000000 -0.265165 -0.265165 +v -4.000000 -0.143506 -0.346455 +v -4.000000 0.000000 -0.375000 +v -1.500000 0.000000 -1.000000 +v -1.500000 -0.382683 -0.923879 +v -1.500000 -0.707107 -0.707107 +v -1.500000 -0.923879 -0.382683 +v -1.500000 -1.000000 0.000000 +v -1.500000 -0.923879 0.382683 +v -1.500000 -0.707107 0.707107 +v -1.500000 -0.382683 0.923879 +v -1.500000 0.000000 1.000000 +v -1.500000 0.382683 0.923880 +v -1.500000 0.707107 0.707107 +v -1.500000 0.923880 0.382684 +v -1.500000 1.000000 -0.000000 +v -1.500000 0.923880 -0.382684 +v -1.500000 0.707107 -0.707107 +v -1.500000 0.382683 -0.923880 +v -4.000000 0.000000 -0.375000 +v -4.000000 -0.143506 -0.346455 +v -4.000000 -0.265165 -0.265165 +v -4.000000 -0.346455 -0.143506 +v -4.000000 -0.375000 0.000000 +v -4.000000 -0.346455 0.143506 +v -4.000000 -0.265165 0.265165 +v -4.000000 -0.143506 0.346455 +v -4.000000 0.000000 0.375000 +v -4.000000 0.143506 0.346455 +v -4.000000 0.265165 0.265165 +v -4.000000 0.346455 0.143506 +v -4.000000 0.375000 -0.000000 +v -4.000000 0.346455 -0.143506 +v -4.000000 0.265165 -0.265165 +v -4.000000 0.143506 -0.346455 +v -4.000000 0.000000 -0.500000 +v -4.000000 -0.191342 -0.461940 +v -4.000000 -0.353553 -0.353553 +v -4.000000 -0.461940 -0.191342 +v -4.000000 -0.500000 0.000000 +v -4.000000 -0.461940 0.191342 +v -4.000000 -0.353553 0.353553 +v -4.000000 -0.191342 0.461940 +v -4.000000 0.000000 0.500000 +v -4.000000 0.191342 0.461940 +v -4.000000 0.353553 0.353553 +v -4.000000 0.461940 0.191342 +v -4.000000 0.500000 -0.000000 +v -4.000000 0.461940 -0.191342 +v -4.000000 0.353553 -0.353553 +v -4.000000 0.191342 -0.461940 +v -1.000000 -0.250000 1.031250 +v -1.000000 0.250000 1.031250 +v -1.500000 -0.250000 1.031250 +v -1.500000 0.250000 1.031250 +v -4.000000 -0.250000 0.406250 +v -4.000000 0.250000 0.406250 +v -1.000000 -1.031250 -0.250000 +v -1.000000 -1.031250 0.250000 +v -1.500000 -1.031250 -0.250000 +v -1.500000 -1.031250 0.250000 +v -4.000000 -0.406250 -0.250000 +v -4.000000 -0.406250 0.250000 +v -1.000000 0.250000 -1.031250 +v -1.000000 -0.250000 -1.031250 +v -1.500000 0.250000 -1.031250 +v -1.500000 -0.250000 -1.031250 +v -4.000000 0.250000 -0.406250 +v -4.000000 -0.250000 -0.406250 +v -1.000000 1.031250 0.250000 +v -1.000000 1.031250 -0.250000 +v -1.500000 1.031250 0.250000 +v -1.500000 1.031250 -0.250000 +v -4.000000 0.406250 0.250000 +v -4.000000 0.406250 -0.250000 +v -4.500000 0.000000 -0.500000 +v -4.500000 -0.191342 -0.461940 +v -4.500000 -0.353553 -0.353553 +v -4.500000 -0.461940 -0.191342 +v -4.500000 -0.500000 0.000000 +v -4.500000 -0.461940 0.191342 +v -4.500000 -0.353553 0.353553 +v -4.500000 -0.191342 0.461940 +v -4.500000 0.000000 0.500000 +v -4.500000 0.191342 0.461940 +v -4.500000 0.353553 0.353553 +v -4.500000 0.461940 0.191342 +v -4.500000 0.500000 -0.000000 +v -4.500000 0.461940 -0.191342 +v -4.500000 0.353553 -0.353553 +v -4.500000 0.191342 -0.461940 +v -4.500000 0.000000 -0.375000 +v -4.500000 -0.143506 -0.346455 +v -4.500000 -0.265165 -0.265165 +v -4.500000 -0.346455 -0.143506 +v -4.500000 -0.375000 0.000000 +v -4.500000 -0.346455 0.143506 +v -4.500000 -0.265165 0.265165 +v -4.500000 -0.143506 0.346455 +v -4.500000 0.000000 0.375000 +v -4.500000 0.143506 0.346455 +v -4.500000 0.265165 0.265165 +v -4.500000 0.346455 0.143506 +v -4.500000 0.375000 -0.000000 +v -4.500000 0.346455 -0.143506 +v -4.500000 0.265165 -0.265165 +v -4.500000 0.143506 -0.346455 +v -5.500000 0.000000 -0.375000 +v -5.500000 -0.143506 -0.346455 +v -5.500000 -0.265165 -0.265165 +v -5.500000 -0.346455 -0.143506 +v -5.500000 -0.375000 0.000000 +v -5.500000 -0.346455 0.143506 +v -5.500000 -0.265165 0.265165 +v -5.500000 -0.143506 0.346455 +v -5.500000 0.000000 0.375000 +v -5.500000 0.143506 0.346455 +v -5.500000 0.265165 0.265165 +v -5.500000 0.346455 0.143506 +v -5.500000 0.375000 -0.000000 +v -5.500000 0.346455 -0.143506 +v -5.500000 0.265165 -0.265165 +v -5.500000 0.143506 -0.346455 +v -5.750000 0.000000 -0.500000 +v -5.750000 -0.191342 -0.461940 +v -5.750000 -0.353553 -0.353553 +v -5.750000 -0.461940 -0.191342 +v -5.750000 -0.500000 0.000000 +v -5.750000 -0.461940 0.191342 +v -5.750000 -0.353553 0.353553 +v -5.750000 -0.191342 0.461940 +v -5.750000 0.000000 0.500000 +v -5.750000 0.191342 0.461940 +v -5.750000 0.353553 0.353553 +v -5.750000 0.461940 0.191342 +v -5.750000 0.500000 -0.000000 +v -5.750000 0.461940 -0.191342 +v -5.750000 0.353553 -0.353553 +v -5.750000 0.191342 -0.461940 +v -6.250000 0.000000 -0.500000 +v -6.250000 -0.191342 -0.461940 +v -6.250000 -0.353553 -0.353553 +v -6.250000 -0.461940 -0.191342 +v -6.250000 -0.500000 0.000000 +v -6.250000 -0.461940 0.191342 +v -6.250000 -0.353553 0.353553 +v -6.250000 -0.191342 0.461940 +v -6.250000 0.000000 0.500000 +v -6.250000 0.191342 0.461940 +v -6.250000 0.353553 0.353553 +v -6.250000 0.461940 0.191342 +v -6.250000 0.500000 -0.000000 +v -6.250000 0.461940 -0.191342 +v -6.250000 0.353553 -0.353553 +v -6.250000 0.191342 -0.461940 +v -6.250000 0.000000 -0.375000 +v -6.250000 -0.143506 -0.346455 +v -6.250000 -0.265165 -0.265165 +v -6.250000 -0.346455 -0.143506 +v -6.250000 -0.375000 0.000000 +v -6.250000 -0.346455 0.143506 +v -6.250000 -0.265165 0.265165 +v -6.250000 -0.143506 0.346455 +v -6.250000 0.000000 0.375000 +v -6.250000 0.143506 0.346455 +v -6.250000 0.265165 0.265165 +v -6.250000 0.346455 0.143506 +v -6.250000 0.375000 -0.000000 +v -6.250000 0.346455 -0.143506 +v -6.250000 0.265165 -0.265165 +v -6.250000 0.143506 -0.346455 +v -5.750000 0.000000 -0.375000 +v -5.750000 -0.143506 -0.346455 +v -5.750000 -0.265165 -0.265165 +v -5.750000 -0.346455 -0.143506 +v -5.750000 -0.375000 0.000000 +v -5.750000 -0.346455 0.143507 +v -5.750000 -0.265165 0.265165 +v -5.750000 -0.143506 0.346455 +v -5.750000 0.000000 0.375000 +v -5.750000 0.143506 0.346455 +v -5.750000 0.265165 0.265165 +v -5.750000 0.346455 0.143507 +v -5.750000 0.375000 0.000000 +v -5.750000 0.346455 -0.143506 +v -5.750000 0.265165 -0.265165 +v -5.750000 0.143506 -0.346455 +v 0.000000 0.375000 1.125000 +v -0.187500 0.324760 1.125000 +v -0.324759 0.187500 1.125000 +v -0.375000 0.000000 1.125000 +v -0.324759 -0.187500 1.125000 +v -0.187500 -0.324759 1.125000 +v 0.000000 -0.375000 1.125000 +v 0.187500 -0.324760 1.125000 +v 0.324760 -0.187500 1.125000 +v 0.375000 -0.000000 1.125000 +v 0.324760 0.187500 1.125000 +v 0.187500 0.324759 1.125000 +v 0.000000 0.375000 1.375000 +v -0.187500 0.324760 1.375000 +v -0.324759 0.187500 1.375000 +v -0.375000 0.000000 1.375000 +v -0.324759 -0.187500 1.375000 +v -0.187500 -0.324759 1.375000 +v 0.000000 -0.375000 1.375000 +v 0.187500 -0.324760 1.375000 +v 0.324760 -0.187500 1.375000 +v 0.375000 -0.000000 1.375000 +v 0.324760 0.187500 1.375000 +v 0.187500 0.324759 1.375000 +v 0.000000 0.500000 1.125000 +v -0.250000 0.433013 1.125000 +v -0.433012 0.250000 1.125000 +v -0.500000 0.000000 1.125000 +v -0.433012 -0.250000 1.125000 +v -0.250000 -0.433013 1.125000 +v 0.000000 -0.500000 1.125000 +v 0.250000 -0.433013 1.125000 +v 0.433013 -0.250000 1.125000 +v 0.500000 -0.000000 1.125000 +v 0.433013 0.250000 1.125000 +v 0.250001 0.433013 1.125000 +v 0.000000 0.500000 0.750000 +v -0.250000 0.433013 0.750000 +v -0.433012 0.250000 0.750000 +v -0.500000 0.000000 0.750000 +v -0.433012 -0.250000 0.750000 +v -0.250000 -0.433013 0.750000 +v 0.000000 -0.500000 0.750000 +v 0.250000 -0.433013 0.750000 +v 0.433013 -0.250000 0.750000 +v 0.500000 -0.000000 0.750000 +v 0.433013 0.250000 0.750000 +v 0.250001 0.433013 0.750000 +v 0.250000 0.433013 -0.750000 +v 0.433013 0.250000 -0.750000 +v 0.500000 -0.000000 -0.750000 +v 0.433013 -0.250000 -0.750000 +v 0.250000 -0.433013 -0.750000 +v 0.000000 -0.500000 -0.750000 +v -0.250000 -0.433013 -0.750000 +v -0.433012 -0.250000 -0.750000 +v -0.500000 0.000000 -0.750000 +v -0.433012 0.250000 -0.750000 +v -0.250000 0.433013 -0.750000 +v 0.000000 0.500000 -0.750000 +v 0.250000 0.433013 -1.125000 +v 0.433013 0.250000 -1.125000 +v 0.500000 -0.000000 -1.125000 +v 0.433013 -0.250000 -1.125000 +v 0.250000 -0.433013 -1.125000 +v 0.000000 -0.500000 -1.125000 +v -0.250000 -0.433013 -1.125000 +v -0.433012 -0.250000 -1.125000 +v -0.500000 0.000000 -1.125000 +v -0.433012 0.250000 -1.125000 +v -0.250000 0.433013 -1.125000 +v 0.000000 0.500000 -1.125000 +v 0.187500 0.324759 -1.375000 +v 0.324760 0.187500 -1.375000 +v 0.375000 -0.000000 -1.375000 +v 0.324760 -0.187500 -1.375000 +v 0.187500 -0.324760 -1.375000 +v 0.000000 -0.375000 -1.375000 +v -0.187500 -0.324759 -1.375000 +v -0.324759 -0.187500 -1.375000 +v -0.375000 0.000000 -1.375000 +v -0.324759 0.187500 -1.375000 +v -0.187500 0.324760 -1.375000 +v 0.000000 0.375000 -1.375000 +v 0.187500 0.324759 -1.125000 +v 0.324760 0.187500 -1.125000 +v 0.375000 -0.000000 -1.125000 +v 0.324760 -0.187500 -1.125000 +v 0.187500 -0.324760 -1.125000 +v 0.000000 -0.375000 -1.125000 +v -0.187500 -0.324759 -1.125000 +v -0.324759 -0.187500 -1.125000 +v -0.375000 0.000000 -1.125000 +v -0.324759 0.187500 -1.125000 +v -0.187500 0.324760 -1.125000 +v 0.000000 0.375000 -1.125000 +v 0.000000 2.250000 -1.125000 +v 0.000000 2.250000 1.125000 +v 0.125000 2.216507 -1.125000 +v 0.125000 2.216507 1.125000 +v 0.216507 2.125000 -1.125000 +v 0.216507 2.125000 1.125000 +v 0.250000 2.000000 -1.125000 +v 0.250000 2.000000 1.125000 +v 0.216507 1.875000 -1.125000 +v 0.216507 1.875000 1.125000 +v 0.125000 1.783494 -1.125000 +v 0.125000 1.783494 1.125000 +v 0.000000 1.750000 -1.125000 +v 0.000000 1.750000 1.125000 +v -0.125000 1.783494 -1.125000 +v -0.125000 1.783494 1.125000 +v -0.216506 1.875000 -1.125000 +v -0.216506 1.875000 1.125000 +v -0.250000 2.000000 -1.125000 +v -0.250000 2.000000 1.125000 +v -0.216506 2.125000 -1.125000 +v -0.216506 2.125000 1.125000 +v -0.125000 2.216506 -1.125000 +v -0.125000 2.216506 1.125000 +v 0.000000 2.187500 1.125000 +v 0.093750 2.162380 1.125000 +v 0.162380 2.093750 1.125000 +v 0.187500 2.000000 1.125000 +v -0.187500 2.000000 1.125000 +v -0.162380 2.093750 1.125000 +v -0.093750 2.162380 1.125000 +v 0.187500 0.250000 1.125000 +v -0.187500 0.250000 1.125000 +v 0.093750 2.162380 1.250000 +v 0.000000 2.187500 1.250000 +v 0.162380 2.093750 1.250000 +v 0.187500 2.000000 1.250000 +v -0.162380 2.093750 1.250000 +v -0.187500 2.000000 1.250000 +v -0.093750 2.162380 1.250000 +v 0.187500 0.250000 1.250000 +v -0.187500 0.250000 1.250000 +v -0.187500 0.250000 -1.125000 +v 0.187500 0.250000 -1.125000 +v -0.093750 2.162380 -1.125000 +v -0.187500 2.000000 -1.125000 +v -0.162380 2.093750 -1.125000 +v 0.187500 2.000000 -1.125000 +v 0.162380 2.093750 -1.125000 +v 0.000000 2.187500 -1.125000 +v 0.093750 2.162380 -1.125000 +v -0.187500 0.250000 -1.250000 +v 0.187500 0.250000 -1.250000 +v -0.093750 2.162380 -1.250000 +v -0.162380 2.093750 -1.250000 +v -0.187500 2.000000 -1.250000 +v 0.187500 2.000000 -1.250000 +v 0.162380 2.093750 -1.250000 +v 0.093750 2.162380 -1.250000 +v 0.000000 2.187500 -1.250000 +v -4.336167 0.913833 -0.044194 +v -4.304917 0.945083 -0.062500 +v -6.437500 1.000000 -0.062500 +v -4.437500 1.000000 -0.062500 +v -6.437500 0.955806 -0.044194 +v -4.437500 0.955806 -0.044194 +v -6.437500 0.937500 0.000000 +v -4.437500 0.937500 0.000000 +v -6.437500 0.955806 0.044194 +v -4.437500 0.955806 0.044194 +v -6.437500 1.000000 0.062500 +v -4.437500 1.000000 0.062500 +v -6.437500 1.044194 0.044194 +v -4.437500 1.044194 0.044194 +v -6.437500 1.062500 0.000000 +v -4.437500 1.062500 0.000000 +v -6.437500 1.044194 -0.044194 +v -4.437500 1.044194 -0.044194 +v -4.349112 0.900888 0.000000 +v -4.336167 0.913833 0.044194 +v -4.304917 0.945083 0.062500 +v -4.273667 0.976333 0.044194 +v -4.260723 0.989277 0.000000 +v -4.273667 0.976333 -0.044194 +v -4.294194 0.812500 -0.044194 +v -4.250000 0.812500 -0.062500 +v -4.312500 0.812500 0.000000 +v -4.294194 0.812500 0.044194 +v -4.250000 0.812500 0.062500 +v -4.205806 0.812500 0.044194 +v -4.187500 0.812500 0.000000 +v -4.205806 0.812500 -0.044194 +v -4.294194 0.562500 -0.044194 +v -4.250000 0.562500 -0.062500 +v -4.312500 0.562500 0.000000 +v -4.294194 0.562500 0.044194 +v -4.250000 0.562500 0.062500 +v -4.205806 0.562500 0.044194 +v -4.187500 0.562500 0.000000 +v -4.205806 0.562500 -0.044194 +v -4.338388 0.437500 -0.088388 +v -4.250000 0.437500 -0.125000 +v -4.375000 0.437500 0.000000 +v -4.338388 0.437500 0.088388 +v -4.250000 0.437500 0.125000 +v -4.161612 0.437500 0.088388 +v -4.125000 0.437500 -0.000000 +v -4.161612 0.437500 -0.088388 +v -4.338388 0.562500 -0.088388 +v -4.250000 0.562500 -0.125000 +v -4.375000 0.562500 0.000000 +v -4.338388 0.562500 0.088388 +v -4.250000 0.562500 0.125000 +v -4.161612 0.562500 0.088388 +v -4.125000 0.562500 -0.000000 +v -4.161612 0.562500 -0.088388 +v -6.570083 0.945083 -0.062500 +v -6.538833 0.913833 -0.044194 +v -6.525888 0.900888 0.000000 +v -6.538833 0.913833 0.044194 +v -6.570083 0.945083 0.062500 +v -6.601333 0.976333 0.044194 +v -6.614277 0.989277 0.000000 +v -6.601333 0.976333 -0.044194 +v -6.746859 0.768306 -0.062500 +v -6.715609 0.737056 -0.044194 +v -6.702665 0.724112 0.000000 +v -6.715609 0.737056 0.044195 +v -6.746859 0.768306 0.062500 +v -6.778109 0.799556 0.044195 +v -6.791053 0.812500 0.000000 +v -6.778109 0.799556 -0.044194 +v -6.746859 0.768306 -0.093750 +v -6.699984 0.721431 -0.066291 +v -6.680568 0.702015 0.000000 +v -6.699984 0.721431 0.066292 +v -6.746859 0.768306 0.093750 +v -6.793734 0.815181 0.066292 +v -6.813150 0.834597 0.000000 +v -6.793734 0.815181 -0.066291 +v -6.835247 0.679917 -0.093750 +v -6.788372 0.633042 -0.066291 +v -6.768956 0.613626 0.000000 +v -6.788372 0.633042 0.066292 +v -6.835247 0.679917 0.093750 +v -6.882122 0.726792 0.066292 +v -6.901539 0.746209 0.000000 +v -6.882122 0.726792 -0.066291 +v 1.500000 1.060660 0.530330 +v 1.312500 1.025135 0.565856 +v 1.175241 0.928078 0.662913 +v 1.125000 0.795495 0.795495 +v 1.175241 0.662913 0.928078 +v 1.312500 0.565856 1.025135 +v 1.500000 0.530330 1.060660 +v 1.687500 0.565856 1.025135 +v 1.824760 0.662913 0.928078 +v 1.875000 0.795495 0.795495 +v 1.824760 0.928078 0.662913 +v 1.687500 1.025135 0.565856 +v 1.500000 1.237437 0.707107 +v 1.312500 1.201912 0.742632 +v 1.175241 1.104854 0.839689 +v 1.125000 0.972272 0.972272 +v 1.175241 0.839689 1.104854 +v 1.312500 0.742632 1.201912 +v 1.500000 0.707107 1.237437 +v 1.687500 0.742632 1.201912 +v 1.824760 0.839689 1.104855 +v 1.875000 0.972272 0.972272 +v 1.824760 1.104854 0.839690 +v 1.687500 1.201911 0.742632 +v 1.500000 1.149049 0.441942 +v 1.250000 1.101681 0.489309 +v 1.066988 0.972272 0.618719 +v 1.000000 0.795495 0.795495 +v 1.066988 0.618719 0.972272 +v 1.250000 0.489309 1.101681 +v 1.500000 0.441942 1.149049 +v 1.750000 0.489309 1.101681 +v 1.933013 0.618719 0.972272 +v 2.000000 0.795495 0.795495 +v 1.933013 0.972272 0.618719 +v 1.750000 1.101681 0.489309 +v 1.500000 0.883884 0.176777 +v 1.250000 0.836517 0.224144 +v 1.066988 0.707107 0.353554 +v 1.000000 0.530330 0.530330 +v 1.066988 0.353554 0.707107 +v 1.250000 0.224144 0.836516 +v 1.500000 0.176777 0.883884 +v 1.750000 0.224144 0.836516 +v 1.933013 0.353554 0.707107 +v 2.000000 0.530330 0.530330 +v 1.933013 0.707107 0.353554 +v 1.750000 0.836516 0.224144 +v 1.548529 1.100337 0.844207 +v 1.367418 1.066022 0.878522 +v 1.318889 0.937957 1.006587 +v 1.451472 0.844207 1.100337 +v 1.632583 0.878522 1.066022 +v 1.681111 1.006587 0.937957 +v 1.548529 1.188725 0.932596 +v 1.367418 1.154410 0.966910 +v 1.318889 1.026345 1.094975 +v 1.451472 0.932595 1.188725 +v 1.632583 0.966910 1.154410 +v 1.681111 1.094975 1.026345 +v 1.524265 1.124693 0.996628 +v 1.475736 1.124693 0.996628 +v 1.433709 1.107535 1.013785 +v 1.409445 1.077818 1.043503 +v 1.409445 1.043503 1.077818 +v 1.433709 1.013785 1.107535 +v 1.475736 0.996628 1.124693 +v 1.524265 0.996628 1.124693 +v 1.566292 1.013785 1.107535 +v 1.590556 1.043503 1.077818 +v 1.590556 1.077818 1.043503 +v 1.566292 1.107535 1.013785 +v 1.516177 1.103348 1.017972 +v 1.483824 1.103348 1.017972 +v 1.455806 1.091910 1.029410 +v 1.439630 1.072098 1.049222 +v 1.439630 1.049222 1.072099 +v 1.455806 1.029410 1.091910 +v 1.483824 1.017972 1.103349 +v 1.516177 1.017972 1.103349 +v 1.544195 1.029410 1.091910 +v 1.560371 1.049222 1.072099 +v 1.560371 1.072098 1.049222 +v 1.544195 1.091910 1.029410 +v 1.391682 1.130054 0.814490 +v 1.310801 0.916613 1.027931 +v 1.443384 0.822863 1.121681 +v 1.624495 0.857178 1.087366 +v 1.705376 1.070619 0.873925 +v 1.793764 0.962366 0.982178 +v 1.238589 1.067554 0.876990 +v 1.729059 0.791613 1.152931 +v 1.173884 0.896801 1.047743 +v 1.515596 0.740551 1.203993 +v 1.322643 0.777110 1.167434 +v 1.483243 0.655175 1.289369 +v 1.290291 0.691733 1.252811 +v 0.821181 -0.499694 2.400044 +v 1.062663 -0.545448 2.445798 +v 1.274114 0.695578 1.204772 +v 1.515596 0.649824 1.250525 +v 0.945095 -0.935730 2.880275 +v 1.025976 -0.722289 2.666833 +v 0.893393 -0.628539 2.573083 +v 0.712282 -0.662854 2.607398 +v 0.631401 -0.876295 2.820839 +v 0.543013 -0.768042 2.712586 +v 1.098188 -0.873230 2.817774 +v 0.607718 -0.597289 2.541833 +v 1.162892 -0.702477 2.647021 +v 0.821181 -0.546227 2.490771 +v 1.014134 -0.582786 2.527330 +v 0.853533 -0.460851 2.405395 +v 1.046486 -0.497409 2.441953 +v 1.310801 1.005001 1.116319 +v 1.391682 1.218443 0.902878 +v 1.443384 0.911251 1.210069 +v 1.624495 0.945566 1.175755 +v 1.705376 1.159008 0.962313 +v 1.793764 1.050755 1.070566 +v 1.238589 1.155943 0.965378 +v 1.729059 0.880001 1.241319 +v 1.173884 0.985190 1.136131 +v 1.515596 0.828940 1.292381 +v 1.322643 0.865498 1.255823 +v 1.483243 0.743563 1.377758 +v 1.290291 0.780122 1.341199 +v 1.025976 -0.633901 2.755221 +v 0.945095 -0.847342 2.968663 +v 0.893393 -0.540151 2.661471 +v 0.712282 -0.574466 2.695786 +v 0.631401 -0.787907 2.909228 +v 0.543013 -0.679654 2.800974 +v 1.098188 -0.784842 2.906163 +v 0.607718 -0.508900 2.630221 +v 1.162892 -0.614089 2.735409 +v 0.821181 -0.457839 2.579160 +v 1.014134 -0.494397 2.615718 +v 0.853533 -0.372462 2.493783 +v 1.046486 -0.409021 2.530342 +v 1.274114 0.828160 1.337355 +v 0.821181 -0.367112 2.532627 +v 1.062663 -0.412865 2.578380 +v 1.515596 0.782407 1.383108 +v 2.676175 1.232172 -0.375000 +v 2.506242 1.311413 -0.324760 +v 2.381843 1.369421 -0.187500 +v 2.336309 1.390654 0.000000 +v 2.381843 1.369421 0.187500 +v 2.506242 1.311413 0.324760 +v 2.676175 1.232172 0.375000 +v 2.846107 1.152931 0.324760 +v 2.970507 1.094923 0.187500 +v 3.016040 1.073690 0.000000 +v 2.970507 1.094923 -0.187500 +v 2.846107 1.152931 -0.324759 +v 2.676175 1.232172 -0.250000 +v 2.562886 1.284999 -0.216506 +v 2.479953 1.323672 -0.125000 +v 2.449598 1.337827 0.000000 +v 2.479953 1.323672 0.125000 +v 2.562886 1.284999 0.216506 +v 2.676175 1.232172 0.250000 +v 2.789463 1.179345 0.216506 +v 2.872396 1.140673 0.125000 +v 2.902751 1.126518 0.000000 +v 2.872396 1.140672 -0.125000 +v 2.789463 1.179345 -0.216506 +v 2.729002 1.345461 -0.250000 +v 2.615713 1.398288 -0.216506 +v 2.532781 1.436960 -0.125000 +v 2.502425 1.451115 0.000000 +v 2.532781 1.436960 0.125000 +v 2.615713 1.398288 0.216506 +v 2.729002 1.345461 0.250000 +v 2.842290 1.292633 0.216506 +v 2.925223 1.253961 0.125000 +v 2.955579 1.239806 0.000000 +v 2.925223 1.253961 -0.125000 +v 2.842290 1.292633 -0.216506 +v 2.464866 0.779018 -0.375000 +v 2.294933 0.858259 -0.324760 +v 2.170533 0.916268 -0.187500 +v 2.125000 0.937500 0.000000 +v 2.170533 0.916268 0.187500 +v 2.294933 0.858259 0.324760 +v 2.464865 0.779018 0.375000 +v 2.634798 0.699777 0.324760 +v 2.759197 0.641769 0.187500 +v 2.804731 0.620536 0.000000 +v 2.759198 0.641769 -0.187500 +v 2.634799 0.699777 -0.324759 +v 2.305976 1.177717 -0.044194 +v 2.313713 1.194307 -0.000000 +v 2.305976 1.177717 0.044194 +v 2.287299 1.137663 0.062500 +v 2.268621 1.097610 0.044194 +v 2.260885 1.081019 0.000000 +v 2.268621 1.097610 -0.044194 +v 2.287299 1.137663 -0.062500 +v 2.079399 1.283371 -0.044194 +v 2.087136 1.299962 -0.000000 +v 2.079399 1.283371 0.044194 +v 2.060722 1.243318 0.062500 +v 2.042045 1.203264 0.044194 +v 2.034308 1.186674 0.000000 +v 2.042045 1.203264 -0.044194 +v 2.060722 1.243318 -0.062500 +v 2.061334 1.096744 0.000000 +v 2.117366 1.216904 0.132583 +v 2.117366 1.216904 -0.132582 +v 2.173398 1.337065 0.000000 +v 2.174010 1.190491 -0.132582 +v 2.117979 1.070330 0.000000 +v 2.174010 1.190491 0.132583 +v 2.230042 1.310651 0.000000 +v 2.004078 1.269732 0.132583 +v 2.060110 1.389892 0.000000 +v 2.134819 1.550106 0.441942 +v 2.190850 1.670267 0.309359 +v 2.191463 1.523693 0.441942 +v 2.247494 1.643853 0.309359 +v 2.079399 1.283371 0.176777 +v 2.135431 1.403532 0.044194 +v 2.136044 1.256958 0.176777 +v 2.192075 1.377118 0.044194 +v 2.172173 1.630213 0.441942 +v 2.190850 1.670267 0.397748 +v 2.228817 1.603800 0.441942 +v 2.247494 1.643853 0.397748 +v 3.500000 0.250000 1.125000 +v 3.375000 0.216506 1.125000 +v 3.283494 0.125000 1.125000 +v 3.250000 -0.000000 1.125000 +v 3.283494 -0.125000 1.125000 +v 3.375000 -0.216506 1.125000 +v 3.500000 -0.250000 1.125000 +v 3.625000 -0.216506 1.125000 +v 3.716506 -0.125000 1.125000 +v 3.750000 -0.000000 1.125000 +v 3.716506 0.125000 1.125000 +v 3.625000 0.216506 1.125000 +v 3.500000 0.375000 1.125000 +v 3.312500 0.324759 1.125000 +v 3.175241 0.187500 1.125000 +v 3.125000 -0.000000 1.125000 +v 3.175241 -0.187500 1.125000 +v 3.312500 -0.324760 1.125000 +v 3.500000 -0.375000 1.125000 +v 3.687500 -0.324760 1.125000 +v 3.824759 -0.187500 1.125000 +v 3.875000 -0.000000 1.125000 +v 3.824760 0.187500 1.125000 +v 3.687500 0.324759 1.125000 +v 3.500000 0.375000 0.875000 +v 3.312500 0.324759 0.875000 +v 3.175241 0.187500 0.875000 +v 3.125000 -0.000000 0.875000 +v 3.175241 -0.187500 0.875000 +v 3.312500 -0.324760 0.875000 +v 3.500000 -0.375000 0.875000 +v 3.687500 -0.324760 0.875000 +v 3.824759 -0.187500 0.875000 +v 3.875000 -0.000000 0.875000 +v 3.824760 0.187500 0.875000 +v 3.687500 0.324759 0.875000 +v 3.500000 0.250000 1.187500 +v 3.375000 0.216506 1.187500 +v 3.283494 0.125000 1.187500 +v 3.250000 -0.000000 1.187500 +v 3.283494 -0.125000 1.187500 +v 3.375000 -0.216506 1.187500 +v 3.500000 -0.250000 1.187500 +v 3.625000 -0.216506 1.187500 +v 3.716506 -0.125000 1.187500 +v 3.750000 -0.000000 1.187500 +v 3.716506 0.125000 1.187500 +v 3.625000 0.216506 1.187500 +v -0.750000 0.875000 1.375000 +v -0.750000 1.062500 1.425240 +v -0.750000 1.199759 1.562500 +v -0.750000 1.250000 1.750000 +v -0.750000 1.199759 1.937500 +v -0.750000 1.062500 2.074759 +v -0.750000 0.875000 2.125000 +v -0.750000 0.687500 2.074759 +v -0.750000 0.550240 1.937500 +v -0.750000 0.500000 1.750000 +v -0.750000 0.550240 1.562500 +v -0.750000 0.687500 1.425241 +v -0.937500 1.062500 1.425240 +v -0.937500 0.875000 1.375000 +v -0.937500 1.199759 1.562500 +v -0.937500 1.250000 1.750000 +v -0.937500 1.199759 1.937500 +v -0.937500 1.062500 2.074759 +v -0.937500 0.875000 2.125000 +v -0.937500 0.687500 2.074759 +v -0.937500 0.550240 1.937500 +v -0.937500 0.500000 1.750000 +v -0.937500 0.550240 1.562500 +v -0.937500 0.687500 1.425241 +v -0.750000 0.710938 2.034164 +v -0.750000 0.875000 2.078125 +v -0.750000 1.039062 2.034164 +v -0.750000 1.159164 1.914062 +v -0.750000 1.203125 1.750000 +v -0.750000 1.159164 1.585937 +v -0.750000 0.875000 1.421875 +v -0.750000 1.039062 1.465835 +v -0.843750 0.584917 1.106471 +v -0.799556 0.568326 1.114207 +v -0.781250 0.528273 1.132885 +v -0.799556 0.488219 1.151562 +v -0.843750 0.471629 1.159298 +v -0.887944 0.488219 1.151562 +v -0.906250 0.528273 1.132885 +v -0.887944 0.568326 1.114207 +v -0.843750 0.743399 1.446337 +v -0.799556 0.726808 1.454073 +v -0.781250 0.686755 1.472750 +v -0.799556 0.646701 1.491427 +v -0.843750 0.630110 1.499164 +v -0.887944 0.646701 1.491427 +v -0.906250 0.686755 1.472750 +v -0.887944 0.726808 1.454073 +v -0.750000 0.590835 1.914062 +v -0.750000 0.546875 1.750000 +v -0.750000 0.590835 1.585938 +v -0.750000 0.710937 1.465835 +v -0.812500 0.875000 1.421875 +v -0.812500 0.710937 1.465835 +v -0.812500 0.590835 1.585938 +v -0.812500 0.546875 1.750000 +v -0.812500 0.590835 1.914062 +v -0.812500 1.039062 2.034164 +v -0.812500 1.159164 1.914062 +v -0.812500 0.875000 2.078125 +v -0.812500 1.159164 1.585937 +v -0.812500 1.039062 1.465835 +v -0.812500 1.203125 1.750000 +v -0.812500 0.710938 2.034164 +v -0.812500 0.875000 1.687500 +v -0.812500 0.919194 1.705806 +v -0.812500 0.937500 1.750000 +v -0.812500 0.919194 1.794194 +v -0.812500 0.875000 1.812500 +v -0.812500 0.830806 1.794194 +v -0.812500 0.812500 1.750000 +v -0.812500 0.830806 1.705806 +v -0.750000 0.875000 1.687500 +v -0.750000 0.919194 1.705806 +v -0.750000 0.937500 1.750000 +v -0.750000 0.919194 1.794194 +v -0.750000 0.875000 1.812500 +v -0.750000 0.830806 1.794194 +v -0.750000 0.812500 1.750000 +v -0.750000 0.830806 1.705806 +v -0.500000 0.000000 -1.375000 +v -0.500000 -0.526190 -1.270334 +v -0.500000 -0.972272 -0.972272 +v -0.500000 -1.270334 -0.526190 +v -0.500000 -1.375000 0.000000 +v -0.500000 -1.270334 0.526190 +v -0.500000 -0.972272 0.972272 +v -0.500000 -0.526190 1.270334 +v -0.500000 -0.000000 1.375000 +v -0.500000 0.526190 1.270334 +v -0.500000 0.972272 0.972272 +v -0.500000 1.270334 0.526190 +v -0.500000 1.375000 -0.000000 +v -0.500000 1.270334 -0.526190 +v -0.500000 0.972272 -0.972272 +v -0.500000 0.526189 -1.270335 +v -1.000000 -0.526190 -1.270334 +v -1.000000 -0.972272 -0.972272 +v -1.000000 0.000000 -1.375000 +v -1.000000 -1.270334 -0.526190 +v -1.000000 -1.375000 0.000000 +v -1.000000 -1.270334 0.526190 +v -1.000000 -0.972272 0.972272 +v -1.000000 -0.526190 1.270334 +v -1.000000 -0.000000 1.375000 +v -1.000000 0.526190 1.270334 +v -1.000000 0.972272 0.972272 +v -1.000000 1.270334 0.526190 +v -1.000000 1.375000 -0.000000 +v -1.000000 1.270334 -0.526190 +v -1.000000 0.972272 -0.972272 +v -1.000000 0.526189 -1.270335 +v -1.000000 -0.526190 -1.270334 +v -1.000000 -0.972272 -0.972272 +v -1.000000 0.000000 -1.375000 +v -1.000000 -1.270334 -0.526190 +v -1.000000 -1.375000 0.000000 +v -1.000000 -1.270334 0.526190 +v -1.000000 -0.972272 0.972272 +v -1.000000 -0.526190 1.270334 +v -1.000000 -0.000000 1.375000 +v -1.000000 0.526190 1.270334 +v -1.000000 0.972272 0.972272 +v -1.000000 1.270334 0.526190 +v -1.000000 1.375000 -0.000000 +v -1.000000 1.270334 -0.526190 +v -1.000000 0.972272 -0.972272 +v -1.000000 0.526189 -1.270335 +v -1.000000 0.000000 -1.000000 +v -1.000000 -0.382683 -0.923879 +v -1.000000 -0.707107 -0.707107 +v -1.000000 -0.923879 -0.382683 +v -1.000000 -1.000000 0.000000 +v -1.000000 -0.923879 0.382683 +v -1.000000 -0.707107 0.707107 +v -1.000000 -0.382683 0.923879 +v -1.000000 0.000000 1.000000 +v -1.000000 0.382683 0.923880 +v -1.000000 0.707107 0.707107 +v -1.000000 0.923880 0.382684 +v -1.000000 1.000000 -0.000000 +v -1.000000 0.923880 -0.382684 +v -1.000000 0.707107 -0.707107 +v -1.000000 0.382683 -0.923880 +v -1.500000 0.000000 -1.000000 +v -1.500000 -0.382683 -0.923879 +v -1.500000 -0.707107 -0.707107 +v -1.500000 -0.923879 -0.382683 +v -1.500000 -1.000000 0.000000 +v -1.500000 -0.923879 0.382683 +v -1.500000 -0.707107 0.707107 +v -1.500000 -0.382683 0.923879 +v -1.500000 0.000000 1.000000 +v -1.500000 0.382683 0.923880 +v -1.500000 0.707107 0.707107 +v -1.500000 0.923880 0.382684 +v -1.500000 1.000000 -0.000000 +v -1.500000 0.923880 -0.382684 +v -1.500000 0.707107 -0.707107 +v -1.500000 0.382683 -0.923880 +v -4.000000 0.000000 -0.500000 +v -4.000000 -0.191342 -0.461940 +v -4.000000 -0.353553 -0.353553 +v -4.000000 -0.461940 -0.191342 +v -4.000000 -0.500000 0.000000 +v -4.000000 -0.461940 0.191342 +v -4.000000 -0.353553 0.353553 +v -4.000000 -0.191342 0.461940 +v -4.000000 0.000000 0.500000 +v -4.000000 0.191342 0.461940 +v -4.000000 0.353553 0.353553 +v -4.000000 0.461940 0.191342 +v -4.000000 0.500000 -0.000000 +v -4.000000 0.461940 -0.191342 +v -4.000000 0.353553 -0.353553 +v -4.000000 0.191342 -0.461940 +v -4.500000 0.000000 -0.500000 +v -4.500000 -0.191342 -0.461940 +v -4.500000 -0.353553 -0.353553 +v -4.500000 -0.461940 -0.191342 +v -4.500000 -0.500000 0.000000 +v -4.500000 -0.461940 0.191342 +v -4.500000 -0.353553 0.353553 +v -4.500000 -0.191342 0.461940 +v -4.500000 0.000000 0.500000 +v -4.500000 0.191342 0.461940 +v -4.500000 0.353553 0.353553 +v -4.500000 0.461940 0.191342 +v -4.500000 0.500000 -0.000000 +v -4.500000 0.461940 -0.191342 +v -4.500000 0.353553 -0.353553 +v -4.500000 0.191342 -0.461940 +v -4.500000 0.000000 -0.375000 +v -4.500000 -0.143506 -0.346455 +v -4.500000 -0.265165 -0.265165 +v -4.500000 -0.346455 -0.143506 +v -4.500000 -0.375000 0.000000 +v -4.500000 -0.346455 0.143506 +v -4.500000 -0.265165 0.265165 +v -4.500000 -0.143506 0.346455 +v -4.500000 0.000000 0.375000 +v -4.500000 0.143506 0.346455 +v -4.500000 0.265165 0.265165 +v -4.500000 0.346455 0.143506 +v -4.500000 0.375000 -0.000000 +v -4.500000 0.346455 -0.143506 +v -4.500000 0.265165 -0.265165 +v -4.500000 0.143506 -0.346455 +v -5.500000 0.000000 -0.375000 +v -5.500000 -0.143506 -0.346455 +v -5.500000 -0.265165 -0.265165 +v -5.500000 -0.346455 -0.143506 +v -5.500000 -0.375000 0.000000 +v -5.500000 -0.346455 0.143506 +v -5.500000 -0.265165 0.265165 +v -5.500000 -0.143506 0.346455 +v -5.500000 0.000000 0.375000 +v -5.500000 0.143506 0.346455 +v -5.500000 0.265165 0.265165 +v -5.500000 0.346455 0.143506 +v -5.500000 0.375000 -0.000000 +v -5.500000 0.346455 -0.143506 +v -5.500000 0.265165 -0.265165 +v -5.500000 0.143506 -0.346455 +v -5.750000 0.000000 -0.500000 +v -5.750000 -0.191342 -0.461940 +v -5.750000 -0.353553 -0.353553 +v -5.750000 -0.461940 -0.191342 +v -5.750000 -0.500000 0.000000 +v -5.750000 -0.461940 0.191342 +v -5.750000 -0.353553 0.353553 +v -5.750000 -0.191342 0.461940 +v -5.750000 0.000000 0.500000 +v -5.750000 0.191342 0.461940 +v -5.750000 0.353553 0.353553 +v -5.750000 0.461940 0.191342 +v -5.750000 0.500000 -0.000000 +v -5.750000 0.461940 -0.191342 +v -5.750000 0.353553 -0.353553 +v -5.750000 0.191342 -0.461940 +v -6.250000 0.000000 -0.500000 +v -6.250000 -0.191342 -0.461940 +v -6.250000 -0.353553 -0.353553 +v -6.250000 -0.461940 -0.191342 +v -6.250000 -0.500000 0.000000 +v -6.250000 -0.461940 0.191342 +v -6.250000 -0.353553 0.353553 +v -6.250000 -0.191342 0.461940 +v -6.250000 0.000000 0.500000 +v -6.250000 0.191342 0.461940 +v -6.250000 0.353553 0.353553 +v -6.250000 0.461940 0.191342 +v -6.250000 0.500000 -0.000000 +v -6.250000 0.461940 -0.191342 +v -6.250000 0.353553 -0.353553 +v -6.250000 0.191342 -0.461940 +v -6.250000 0.000000 -0.375000 +v -6.250000 -0.143506 -0.346455 +v -6.250000 -0.265165 -0.265165 +v -6.250000 -0.346455 -0.143506 +v -6.250000 -0.375000 0.000000 +v -6.250000 -0.346455 0.143506 +v -6.250000 -0.265165 0.265165 +v -6.250000 -0.143506 0.346455 +v -6.250000 0.000000 0.375000 +v -6.250000 0.143506 0.346455 +v -6.250000 0.265165 0.265165 +v -6.250000 0.346455 0.143506 +v -6.250000 0.375000 -0.000000 +v -6.250000 0.346455 -0.143506 +v -6.250000 0.265165 -0.265165 +v -6.250000 0.143506 -0.346455 +v -5.750000 0.000000 -0.375000 +v -5.750000 -0.143506 -0.346455 +v -5.750000 -0.265165 -0.265165 +v -5.750000 -0.346455 -0.143506 +v -5.750000 -0.375000 0.000000 +v -5.750000 -0.346455 0.143507 +v -5.750000 -0.265165 0.265165 +v -5.750000 -0.143506 0.346455 +v -5.750000 0.000000 0.375000 +v -5.750000 0.143506 0.346455 +v -5.750000 0.265165 0.265165 +v -5.750000 0.346455 0.143507 +v -5.750000 0.375000 0.000000 +v -5.750000 0.346455 -0.143506 +v -5.750000 0.265165 -0.265165 +v -5.750000 0.143506 -0.346455 +v -0.500000 0.000000 -1.000000 +v -0.500000 -0.382683 -0.923879 +v -0.500000 -0.707107 -0.707107 +v -0.500000 -0.923879 -0.382683 +v -0.500000 -1.000000 0.000000 +v -0.500000 -0.923879 0.382683 +v -0.500000 -0.707107 0.707107 +v -0.500000 -0.382683 0.923879 +v -0.500000 0.000000 1.000000 +v -0.500000 0.382683 0.923880 +v -0.500000 0.707107 0.707107 +v -0.500000 0.923880 0.382684 +v -0.500000 1.000000 -0.000000 +v -0.500000 0.923880 -0.382684 +v -0.500000 0.707107 -0.707107 +v -0.500000 0.382683 -0.923880 +v -0.500000 0.000000 -1.375000 +v -0.500000 -0.526190 -1.270334 +v -0.500000 -0.972272 -0.972272 +v -0.500000 -1.270334 -0.526190 +v -0.500000 -1.375000 0.000000 +v -0.500000 -1.270334 0.526190 +v -0.500000 -0.972272 0.972272 +v -0.500000 -0.526190 1.270334 +v -0.500000 -0.000000 1.375000 +v -0.500000 0.526190 1.270334 +v -0.500000 0.972272 0.972272 +v -0.500000 1.270334 0.526190 +v -0.500000 1.375000 -0.000000 +v -0.500000 1.270334 -0.526190 +v -0.500000 0.972272 -0.972272 +v -0.500000 0.526189 -1.270335 +v 4.250000 -0.191342 -0.461940 +v 4.250000 0.000000 -0.500000 +v 4.250000 -0.353553 -0.353553 +v 4.250000 -0.461940 -0.191342 +v 4.250000 -0.500000 0.000000 +v 4.250000 -0.461940 0.191342 +v 4.250000 -0.353553 0.353553 +v 4.250000 -0.191342 0.461940 +v 4.250000 -0.000000 0.500000 +v 4.250000 0.191342 0.461940 +v 4.250000 0.353553 0.353553 +v 4.250000 0.461940 0.191342 +v 4.250000 0.500000 -0.000000 +v 4.250000 0.461940 -0.191342 +v 4.250000 0.353553 -0.353554 +v 4.250000 0.191342 -0.461940 +v 4.382812 -0.167424 -0.404197 +v 4.382812 0.000000 -0.437500 +v 4.382812 -0.309359 -0.309359 +v 4.382812 -0.404197 -0.167424 +v 4.382812 -0.437500 -0.000000 +v 4.382812 -0.404197 0.167424 +v 4.382812 -0.309359 0.309359 +v 4.382812 -0.167424 0.404197 +v 4.382812 -0.000000 0.437500 +v 4.382812 0.167424 0.404197 +v 4.382812 0.309359 0.309359 +v 4.382812 0.404197 0.167424 +v 4.382812 0.437500 -0.000000 +v 4.382812 0.404197 -0.167424 +v 4.382812 0.309359 -0.309359 +v 4.382812 0.167424 -0.404197 +v 4.492188 -0.083712 -0.202099 +v 4.492188 -0.000000 -0.218750 +v 4.492188 -0.154680 -0.154680 +v 4.492188 -0.202099 -0.083712 +v 4.492188 -0.218750 -0.000000 +v 4.492188 -0.202099 0.083712 +v 4.492188 -0.154680 0.154680 +v 4.492188 -0.083712 0.202099 +v 4.492188 -0.000000 0.218750 +v 4.492188 0.083712 0.202099 +v 4.492188 0.154680 0.154680 +v 4.492188 0.202099 0.083712 +v 4.492188 0.218750 -0.000000 +v 4.492188 0.202099 -0.083712 +v 4.492188 0.154680 -0.154680 +v 4.492188 0.083712 -0.202099 +v 3.500000 0.250000 1.187500 +v 3.375000 0.216506 1.187500 +v 3.283494 0.125000 1.187500 +v 3.250000 -0.000000 1.187500 +v 3.283494 -0.125000 1.187500 +v 3.375000 -0.216506 1.187500 +v 3.500000 -0.250000 1.187500 +v 3.625000 -0.216506 1.187500 +v 3.716506 -0.125000 1.187500 +v 3.750000 -0.000000 1.187500 +v 3.716506 0.125000 1.187500 +v 3.625000 0.216506 1.187500 +v 2.676175 1.232172 -0.375000 +v 2.506242 1.311413 -0.324760 +v 2.381843 1.369421 -0.187500 +v 2.336309 1.390654 0.000000 +v 2.381843 1.369421 0.187500 +v 2.506242 1.311413 0.324760 +v 2.676175 1.232172 0.375000 +v 2.846107 1.152931 0.324760 +v 2.970507 1.094923 0.187500 +v 3.016040 1.073690 0.000000 +v 2.970507 1.094923 -0.187500 +v 2.846107 1.152931 -0.324759 +v 2.676175 1.232172 -0.250000 +v 2.562886 1.284999 -0.216506 +v 2.479953 1.323672 -0.125000 +v 2.449598 1.337827 0.000000 +v 2.479953 1.323672 0.125000 +v 2.562886 1.284999 0.216506 +v 2.676175 1.232172 0.250000 +v 2.789463 1.179345 0.216506 +v 2.872396 1.140673 0.125000 +v 2.902751 1.126518 0.000000 +v 2.872396 1.140672 -0.125000 +v 2.789463 1.179345 -0.216506 +v 2.729002 1.345461 -0.250000 +v 2.615713 1.398288 -0.216506 +v 2.532781 1.436960 -0.125000 +v 2.502425 1.451115 0.000000 +v 2.532781 1.436960 0.125000 +v 2.615713 1.398288 0.216506 +v 2.729002 1.345461 0.250000 +v 2.842290 1.292633 0.216506 +v 2.925223 1.253961 0.125000 +v 2.955579 1.239806 0.000000 +v 2.925223 1.253961 -0.125000 +v 2.842290 1.292633 -0.216506 +v 1.500000 1.060660 0.530330 +v 1.312500 1.025135 0.565856 +v 1.175241 0.928078 0.662913 +v 1.125000 0.795495 0.795495 +v 1.175241 0.662913 0.928078 +v 1.312500 0.565856 1.025135 +v 1.500000 0.530330 1.060660 +v 1.687500 0.565856 1.025135 +v 1.824760 0.662913 0.928078 +v 1.875000 0.795495 0.795495 +v 1.824760 0.928078 0.662913 +v 1.687500 1.025135 0.565856 +v 1.500000 1.237437 0.707107 +v 1.312500 1.201912 0.742632 +v 1.175241 1.104854 0.839689 +v 1.125000 0.972272 0.972272 +v 1.175241 0.839689 1.104854 +v 1.312500 0.742632 1.201912 +v 1.500000 0.707107 1.237437 +v 1.687500 0.742632 1.201912 +v 1.824760 0.839689 1.104855 +v 1.875000 0.972272 0.972272 +v 1.824760 1.104854 0.839690 +v 1.687500 1.201911 0.742632 +v 1.500000 1.149049 0.441942 +v 1.250000 1.101681 0.489309 +v 1.066988 0.972272 0.618719 +v 1.000000 0.795495 0.795495 +v 1.066988 0.618719 0.972272 +v 1.250000 0.489309 1.101681 +v 1.500000 0.441942 1.149049 +v 1.750000 0.489309 1.101681 +v 1.933013 0.618719 0.972272 +v 2.000000 0.795495 0.795495 +v 1.933013 0.972272 0.618719 +v 1.750000 1.101681 0.489309 +v 0.000000 0.375000 1.125000 +v -0.187500 0.324760 1.125000 +v -0.324759 0.187500 1.125000 +v -0.375000 0.000000 1.125000 +v -0.324759 -0.187500 1.125000 +v -0.187500 -0.324759 1.125000 +v 0.000000 -0.375000 1.125000 +v 0.187500 -0.324760 1.125000 +v 0.324760 -0.187500 1.125000 +v 0.375000 -0.000000 1.125000 +v 0.324760 0.187500 1.125000 +v 0.187500 0.324759 1.125000 +v 0.000000 0.375000 1.375000 +v -0.187500 0.324760 1.375000 +v -0.324759 0.187500 1.375000 +v -0.375000 0.000000 1.375000 +v -0.324759 -0.187500 1.375000 +v -0.187500 -0.324759 1.375000 +v 0.000000 -0.375000 1.375000 +v 0.187500 -0.324760 1.375000 +v 0.324760 -0.187500 1.375000 +v 0.375000 -0.000000 1.375000 +v 0.324760 0.187500 1.375000 +v 0.187500 0.324759 1.375000 +v 0.000000 0.500000 1.125000 +v -0.250000 0.433013 1.125000 +v -0.433012 0.250000 1.125000 +v -0.500000 0.000000 1.125000 +v -0.433012 -0.250000 1.125000 +v -0.250000 -0.433013 1.125000 +v 0.000000 -0.500000 1.125000 +v 0.250000 -0.433013 1.125000 +v 0.433013 -0.250000 1.125000 +v 0.500000 -0.000000 1.125000 +v 0.433013 0.250000 1.125000 +v 0.250001 0.433013 1.125000 +v -0.750000 0.875000 1.375000 +v -0.750000 1.062500 1.425240 +v -0.750000 1.199759 1.562500 +v -0.750000 1.250000 1.750000 +v -0.750000 1.199759 1.937500 +v -0.750000 1.062500 2.074759 +v -0.750000 0.875000 2.125000 +v -0.750000 0.687500 2.074759 +v -0.750000 0.550240 1.937500 +v -0.750000 0.500000 1.750000 +v -0.750000 0.550240 1.562500 +v -0.750000 0.687500 1.425241 +v -0.937500 1.062500 1.425240 +v -0.937500 0.875000 1.375000 +v -0.937500 1.199759 1.562500 +v -0.937500 1.250000 1.750000 +v -0.937500 1.199759 1.937500 +v -0.937500 1.062500 2.074759 +v -0.937500 0.875000 2.125000 +v -0.937500 0.687500 2.074759 +v -0.937500 0.550240 1.937500 +v -0.937500 0.500000 1.750000 +v -0.937500 0.550240 1.562500 +v -0.937500 0.687500 1.425241 +v -0.750000 0.710938 2.034164 +v -0.750000 0.875000 2.078125 +v -0.750000 1.039062 2.034164 +v -0.750000 1.159164 1.914062 +v -0.750000 1.203125 1.750000 +v -0.750000 1.159164 1.585937 +v -0.750000 0.875000 1.421875 +v -0.750000 1.039062 1.465835 +v -0.750000 0.590835 1.914062 +v -0.750000 0.546875 1.750000 +v -0.750000 0.590835 1.585938 +v -0.750000 0.710937 1.465835 +v -0.812500 0.875000 1.421875 +v -0.812500 0.710937 1.465835 +v -0.812500 0.590835 1.585938 +v -0.812500 0.546875 1.750000 +v -0.812500 0.590835 1.914062 +v -0.812500 1.039062 2.034164 +v -0.812500 1.159164 1.914062 +v -0.812500 0.875000 2.078125 +v -0.812500 1.159164 1.585937 +v -0.812500 1.039062 1.465835 +v -0.812500 1.203125 1.750000 +v -0.812500 0.710938 2.034164 +v -0.750000 0.875000 1.687500 +v -0.750000 0.919194 1.705806 +v -0.750000 0.937500 1.750000 +v -0.750000 0.919194 1.794194 +v -0.750000 0.875000 1.812500 +v -0.750000 0.830806 1.794194 +v -0.750000 0.812500 1.750000 +v -0.750000 0.830806 1.705806 +v 0.000000 2.250000 -1.125000 +v 0.000000 2.250000 1.125000 +v 0.125000 2.216507 -1.125000 +v 0.125000 2.216507 1.125000 +v 0.216507 2.125000 -1.125000 +v 0.216507 2.125000 1.125000 +v 0.250000 2.000000 -1.125000 +v 0.250000 2.000000 1.125000 +v 0.216507 1.875000 -1.125000 +v 0.216507 1.875000 1.125000 +v 0.125000 1.783494 -1.125000 +v 0.125000 1.783494 1.125000 +v 0.000000 1.750000 -1.125000 +v 0.000000 1.750000 1.125000 +v -0.125000 1.783494 -1.125000 +v -0.125000 1.783494 1.125000 +v -0.216506 1.875000 -1.125000 +v -0.216506 1.875000 1.125000 +v -0.250000 2.000000 -1.125000 +v -0.250000 2.000000 1.125000 +v -0.216506 2.125000 -1.125000 +v -0.216506 2.125000 1.125000 +v -0.125000 2.216506 -1.125000 +v -0.125000 2.216506 1.125000 +v -0.093750 2.162380 -1.125000 +v -0.187500 2.000000 -1.125000 +v -0.162380 2.093750 -1.125000 +v 0.187500 2.000000 -1.125000 +v 0.162380 2.093750 -1.125000 +v 0.000000 2.187500 -1.125000 +v 0.093750 2.162380 -1.125000 +v -0.093750 2.162380 -1.250000 +v -0.162380 2.093750 -1.250000 +v -0.187500 2.000000 -1.250000 +v 0.187500 2.000000 -1.250000 +v 0.162380 2.093750 -1.250000 +v 0.093750 2.162380 -1.250000 +v 0.000000 2.187500 -1.250000 +v 0.000000 2.187500 1.125000 +v 0.093750 2.162380 1.125000 +v 0.162380 2.093750 1.125000 +v 0.187500 2.000000 1.125000 +v -0.187500 2.000000 1.125000 +v -0.162380 2.093750 1.125000 +v -0.093750 2.162380 1.125000 +v 0.093750 2.162380 1.250000 +v 0.000000 2.187500 1.250000 +v 0.162380 2.093750 1.250000 +v 0.187500 2.000000 1.250000 +v -0.162380 2.093750 1.250000 +v -0.187500 2.000000 1.250000 +v -0.093750 2.162380 1.250000 +v 0.250000 0.433013 -1.125000 +v 0.433013 0.250000 -1.125000 +v 0.500000 -0.000000 -1.125000 +v 0.433013 -0.250000 -1.125000 +v 0.250000 -0.433013 -1.125000 +v 0.000000 -0.500000 -1.125000 +v -0.250000 -0.433013 -1.125000 +v -0.433012 -0.250000 -1.125000 +v -0.500000 0.000000 -1.125000 +v -0.433012 0.250000 -1.125000 +v -0.250000 0.433013 -1.125000 +v 0.000000 0.500000 -1.125000 +v 0.187500 0.324759 -1.375000 +v 0.324760 0.187500 -1.375000 +v 0.375000 -0.000000 -1.375000 +v 0.324760 -0.187500 -1.375000 +v 0.187500 -0.324760 -1.375000 +v 0.000000 -0.375000 -1.375000 +v -0.187500 -0.324759 -1.375000 +v -0.324759 -0.187500 -1.375000 +v -0.375000 0.000000 -1.375000 +v -0.324759 0.187500 -1.375000 +v -0.187500 0.324760 -1.375000 +v 0.000000 0.375000 -1.375000 +v 0.187500 0.324759 -1.125000 +v 0.324760 0.187500 -1.125000 +v 0.375000 -0.000000 -1.125000 +v 0.324760 -0.187500 -1.125000 +v 0.187500 -0.324760 -1.125000 +v 0.000000 -0.375000 -1.125000 +v -0.187500 -0.324759 -1.125000 +v -0.324759 -0.187500 -1.125000 +v -0.375000 0.000000 -1.125000 +v -0.324759 0.187500 -1.125000 +v -0.187500 0.324760 -1.125000 +v 0.000000 0.375000 -1.125000 +v 2.079399 1.283371 -0.044194 +v 2.087136 1.299962 -0.000000 +v 2.079399 1.283371 0.044194 +v 2.060722 1.243318 0.062500 +v 2.042045 1.203264 0.044194 +v 2.034308 1.186674 0.000000 +v 2.042045 1.203264 -0.044194 +v 2.060722 1.243318 -0.062500 +v -6.746859 0.768306 -0.062500 +v -6.715609 0.737056 -0.044194 +v -6.702665 0.724112 0.000000 +v -6.715609 0.737056 0.044195 +v -6.746859 0.768306 0.062500 +v -6.778109 0.799556 0.044195 +v -6.791053 0.812500 0.000000 +v -6.778109 0.799556 -0.044194 +v -6.746859 0.768306 -0.093750 +v -6.699984 0.721431 -0.066291 +v -6.680568 0.702015 0.000000 +v -6.699984 0.721431 0.066292 +v -6.746859 0.768306 0.093750 +v -6.793734 0.815181 0.066292 +v -6.813150 0.834597 0.000000 +v -6.793734 0.815181 -0.066291 +v -6.835247 0.679917 -0.093750 +v -6.788372 0.633042 -0.066291 +v -6.768956 0.613626 0.000000 +v -6.788372 0.633042 0.066292 +v -6.835247 0.679917 0.093750 +v -6.882122 0.726792 0.066292 +v -6.901539 0.746209 0.000000 +v -6.882122 0.726792 -0.066291 +v -4.338388 0.562500 -0.088388 +v -4.250000 0.562500 -0.125000 +v -4.375000 0.562500 0.000000 +v -4.338388 0.562500 0.088388 +v -4.250000 0.562500 0.125000 +v -4.161612 0.562500 0.088388 +v -4.125000 0.562500 -0.000000 +v -4.161612 0.562500 -0.088388 +v 1.516177 1.103348 1.017972 +v 1.483824 1.103348 1.017972 +v 1.455806 1.091910 1.029410 +v 1.439630 1.072098 1.049222 +v 1.439630 1.049222 1.072099 +v 1.455806 1.029410 1.091910 +v 1.483824 1.017972 1.103349 +v 1.516177 1.017972 1.103349 +v 1.544195 1.029410 1.091910 +v 1.560371 1.049222 1.072099 +v 1.560371 1.072098 1.049222 +v 1.544195 1.091910 1.029410 +v 1.524265 1.102596 0.974531 +v 1.475736 1.102596 0.974531 +v 1.433709 1.085438 0.991688 +v 1.409445 1.055721 1.021406 +v 1.409445 1.021406 1.055721 +v 1.433709 0.991688 1.085438 +v 1.475736 0.974531 1.102596 +v 1.524265 0.974531 1.102596 +v 1.566292 0.991688 1.085438 +v 1.590556 1.021406 1.055721 +v 1.590556 1.055721 1.021406 +v 1.566292 1.085438 0.991688 +v 1.524265 1.124693 0.996628 +v 1.475736 1.124693 0.996628 +v 1.433709 1.107535 1.013785 +v 1.409445 1.077818 1.043503 +v 1.409445 1.043503 1.077818 +v 1.433709 1.013785 1.107535 +v 1.475736 0.996628 1.124693 +v 1.524265 0.996628 1.124693 +v 1.566292 1.013785 1.107535 +v 1.590556 1.043503 1.077818 +v 1.590556 1.077818 1.043503 +v 1.566292 1.107535 1.013785 +v 1.524265 1.102596 0.974531 +v 1.475736 1.102596 0.974531 +v 1.433709 1.085438 0.991688 +v 1.409445 1.055721 1.021406 +v 1.409445 1.021406 1.055721 +v 1.433709 0.991688 1.085438 +v 1.475736 0.974531 1.102596 +v 1.524265 0.974531 1.102596 +v 1.566292 0.991688 1.085438 +v 1.590556 1.021406 1.055721 +v 1.590556 1.055721 1.021406 +v 1.566292 1.085438 0.991688 +vt 0.043478 0.368553 +vt 0.057102 0.381645 +vt 0.043478 0.420921 +vt 0.063241 0.467105 +vt 0.071146 0.486842 +vt 0.063241 0.480263 +vt 0.063241 0.500000 +vt 0.063241 0.486842 +vt 0.063241 0.506579 +vt 0.071146 0.526316 +vt 0.063241 0.519737 +vt 0.063241 0.539474 +vt 0.063241 0.526316 +vt 0.063241 0.546053 +vt 0.071146 0.565789 +vt 0.063241 0.559211 +vt 0.063241 0.578947 +vt 0.063241 0.565789 +vt 0.071146 0.585526 +vt 0.063241 0.598684 +vt 0.063241 0.585526 +vt 0.071146 0.368421 +vt 0.063241 0.381579 +vt 0.063241 0.368421 +vt 0.071146 0.388158 +vt 0.063241 0.401316 +vt 0.063241 0.388158 +vt 0.063241 0.407895 +vt 0.071146 0.427632 +vt 0.063241 0.421053 +vt 0.063241 0.440789 +vt 0.063241 0.427632 +vt 0.943923 0.034534 +vt 0.939726 0.051399 +vt 0.929594 0.044413 +vt 0.063241 0.447368 +vt 0.071146 0.467105 +vt 0.063241 0.460526 +vt 0.928854 0.302632 +vt 0.905138 0.342105 +vt 0.905138 0.302632 +vt 0.905138 0.250000 +vt 0.928854 0.289474 +vt 0.905138 0.289474 +vt 0.936759 0.342105 +vt 0.928854 0.342105 +vt 0.897233 0.302632 +vt 0.928854 0.210526 +vt 0.928854 0.250000 +vt 0.905138 0.078947 +vt 0.905138 0.000000 +vt 0.928854 0.000000 +vt 0.928854 0.118421 +vt 0.936759 0.105263 +vt 0.936759 0.118421 +vt 0.905138 0.381579 +vt 0.928854 0.355263 +vt 0.928854 0.381579 +vt 0.897233 0.197368 +vt 0.905138 0.118421 +vt 0.905138 0.210526 +vt 0.936759 0.197368 +vt 0.897233 0.394737 +vt 0.897233 0.355263 +vt 0.936759 0.355263 +vt 0.909091 0.105263 +vt 0.924901 0.092105 +vt 0.924901 0.105263 +vt 0.897233 0.118421 +vt 0.905138 0.105263 +vt 0.434783 0.730263 +vt 0.458498 0.684211 +vt 0.458498 0.736842 +vt 0.434783 0.677632 +vt 0.458498 0.631579 +vt 0.434783 0.585526 +vt 0.458498 0.578947 +vt 0.434783 0.572368 +vt 0.458498 0.526316 +vt 0.434783 0.480263 +vt 0.458498 0.473684 +vt 0.434783 0.467105 +vt 0.458498 0.421053 +vt 0.434783 0.375000 +vt 0.458498 0.368421 +vt 0.434783 0.361842 +vt 0.458498 0.315789 +vt 0.434783 0.309211 +vt 0.458498 0.263158 +vt 0.434783 0.256579 +vt 0.458498 0.210526 +vt 0.434783 0.203947 +vt 0.458498 0.157895 +vt 0.434783 0.151316 +vt 0.458498 0.105263 +vt 0.434783 0.098684 +vt 0.458498 0.052632 +vt 0.434783 0.046053 +vt 0.458498 -0.000000 +vt 0.434783 0.835526 +vt 0.458498 0.789474 +vt 0.458498 0.842105 +vt 0.434783 0.743421 +vt 0.237154 0.157895 +vt 0.245059 0.138158 +vt 0.245059 0.151316 +vt 0.245059 0.171053 +vt 0.245059 0.157895 +vt 0.237154 0.197368 +vt 0.245059 0.177632 +vt 0.245059 0.190789 +vt 0.237154 0.217105 +vt 0.245059 0.197368 +vt 0.245059 0.210526 +vt 0.237154 0.236842 +vt 0.245059 0.217105 +vt 0.245059 0.230263 +vt 0.237154 0.256579 +vt 0.245059 0.236842 +vt 0.245059 0.250000 +vt 0.237154 0.276316 +vt 0.245059 0.256579 +vt 0.245059 0.269737 +vt 0.237154 0.296053 +vt 0.245059 0.276316 +vt 0.245059 0.289474 +vt 0.237154 0.315789 +vt 0.245059 0.296053 +vt 0.245059 0.309211 +vt 0.245059 0.013158 +vt 0.237154 -0.000000 +vt 0.245059 0.000000 +vt 0.237154 0.039474 +vt 0.245059 0.019737 +vt 0.245059 0.032895 +vt 0.245059 0.052632 +vt 0.245059 0.039474 +vt 0.237154 0.078947 +vt 0.245059 0.059211 +vt 0.245059 0.072368 +vt 0.237154 0.098684 +vt 0.245059 0.078947 +vt 0.245059 0.092105 +vt 0.245059 0.111842 +vt 0.245059 0.098684 +vt 0.245059 0.131579 +vt 0.237154 0.118421 +vt 0.245059 0.118421 +vt 0.205534 0.157895 +vt 0.197628 0.138158 +vt 0.205534 0.138158 +vt 0.197628 0.171053 +vt 0.205534 0.177632 +vt 0.197628 0.190789 +vt 0.205534 0.197368 +vt 0.197628 0.210526 +vt 0.205534 0.217105 +vt 0.205534 0.236842 +vt 0.197628 0.217105 +vt 0.197628 0.250000 +vt 0.205534 0.256579 +vt 0.197628 0.269737 +vt 0.205534 0.276316 +vt 0.197628 0.289474 +vt 0.205534 0.296053 +vt 0.197628 0.309211 +vt 0.205534 0.315789 +vt 0.197628 0.013158 +vt 0.205534 0.000000 +vt 0.205534 0.019737 +vt 0.205534 0.039474 +vt 0.197628 0.019737 +vt 0.197628 0.052632 +vt 0.205534 0.059211 +vt 0.197628 0.072368 +vt 0.205534 0.078947 +vt 0.197628 0.092105 +vt 0.205534 0.098684 +vt 0.197628 0.111842 +vt 0.205534 0.118421 +vt 0.197628 0.131579 +vt 0.245059 0.368421 +vt 0.213439 0.315789 +vt 0.245059 0.315789 +vt 0.213439 0.368421 +vt 0.055336 0.315789 +vt 0.245059 0.368421 +vt 0.213439 0.315789 +vt 0.245059 0.315789 +vt 0.213439 0.368421 +vt 0.055336 0.315789 +vt 0.245059 0.368421 +vt 0.213439 0.315789 +vt 0.245059 0.315789 +vt 0.213439 0.368421 +vt 0.055336 0.315789 +vt 0.245059 0.368421 +vt 0.213439 0.315789 +vt 0.245059 0.315789 +vt 0.213439 0.368421 +vt 0.055336 0.315789 +vt 0.086957 0.315789 +vt 0.079051 0.296053 +vt 0.086957 0.296053 +vt 0.086957 0.118421 +vt 0.079051 0.131579 +vt 0.079051 0.118421 +vt 0.079051 0.276316 +vt 0.086957 0.276316 +vt 0.079051 0.098684 +vt 0.086957 0.098684 +vt 0.079051 0.256579 +vt 0.086957 0.256579 +vt 0.086957 0.078947 +vt 0.079051 0.092105 +vt 0.079051 0.078947 +vt 0.086957 0.236842 +vt 0.079051 0.217105 +vt 0.086957 0.217105 +vt 0.079051 0.236842 +vt 0.086957 0.059211 +vt 0.079051 0.072368 +vt 0.079051 0.059211 +vt 0.079051 0.197368 +vt 0.086957 0.197368 +vt 0.086957 0.039474 +vt 0.079051 0.052632 +vt 0.079051 0.039474 +vt 0.079051 0.177632 +vt 0.086957 0.177632 +vt 0.079051 0.019737 +vt 0.086957 0.019737 +vt 0.086957 0.157895 +vt 0.079051 0.171053 +vt 0.079051 0.157895 +vt 0.079051 -0.000000 +vt 0.086957 -0.000000 +vt 0.079051 0.138158 +vt 0.086957 0.138158 +vt 0.490119 0.736842 +vt 0.513834 0.690789 +vt 0.513834 0.730263 +vt 0.490119 0.684211 +vt 0.513834 0.638158 +vt 0.513834 0.677632 +vt 0.490119 0.631579 +vt 0.513834 0.585526 +vt 0.513834 0.625000 +vt 0.513834 0.572368 +vt 0.490119 0.526316 +vt 0.513834 0.532895 +vt 0.513834 0.480263 +vt 0.513834 0.519737 +vt 0.513834 0.467105 +vt 0.490119 0.421053 +vt 0.513834 0.427632 +vt 0.513834 0.375000 +vt 0.513834 0.414474 +vt 0.513834 0.361842 +vt 0.490119 0.315789 +vt 0.513834 0.322368 +vt 0.513834 0.309211 +vt 0.490119 0.263158 +vt 0.513834 0.269737 +vt 0.513834 0.256579 +vt 0.490119 0.210526 +vt 0.513834 0.217105 +vt 0.513834 0.203947 +vt 0.490119 0.157895 +vt 0.513834 0.164474 +vt 0.513834 0.151316 +vt 0.490119 0.105263 +vt 0.513834 0.111842 +vt 0.513834 0.059211 +vt 0.513834 0.098684 +vt 0.513834 0.046053 +vt 0.490119 -0.000000 +vt 0.513834 0.006579 +vt 0.513834 0.835526 +vt 0.490119 0.789474 +vt 0.513834 0.796053 +vt 0.014804 0.003666 +vt 0.045228 0.024642 +vt 0.032626 0.075281 +vt 0.513834 0.743421 +vt 0.513834 0.782895 +vt 0.885349 0.519522 +vt 0.875134 0.509705 +vt 0.897233 0.500000 +vt 0.853893 0.519522 +vt 0.843678 0.509705 +vt 0.865613 0.500000 +vt 0.873518 0.500000 +vt 0.865613 0.315789 +vt 0.873518 0.315789 +vt 0.833992 0.315789 +vt 0.841897 0.500000 +vt 0.833992 0.500000 +vt 0.833992 0.315789 +vt 0.841897 0.500000 +vt 0.833992 0.500000 +vt 0.873518 0.500000 +vt 0.865613 0.315789 +vt 0.873518 0.315789 +vt 0.853893 0.519522 +vt 0.843678 0.509705 +vt 0.865613 0.500000 +vt 0.885349 0.519522 +vt 0.875134 0.509705 +vt 0.897233 0.500000 +vt 0.205534 0.526316 +vt 0.197628 0.546053 +vt 0.197628 0.526316 +vt 0.197628 0.552632 +vt 0.205534 0.578947 +vt 0.197628 0.572368 +vt 0.197628 0.578947 +vt 0.205534 0.605263 +vt 0.197628 0.598684 +vt 0.197628 0.605263 +vt 0.205534 0.631579 +vt 0.197628 0.625000 +vt 0.197628 0.631579 +vt 0.205534 0.657895 +vt 0.197628 0.651316 +vt 0.197628 0.657895 +vt 0.205534 0.684211 +vt 0.197628 0.677632 +vt 0.197628 0.368421 +vt 0.205534 0.394737 +vt 0.197628 0.388158 +vt 0.197628 0.414474 +vt 0.197628 0.394737 +vt 0.197628 0.421053 +vt 0.205534 0.447368 +vt 0.197628 0.440789 +vt 0.197628 0.467105 +vt 0.197628 0.447368 +vt 0.205534 0.473684 +vt 0.197628 0.493421 +vt 0.197628 0.473684 +vt 0.205534 0.500000 +vt 0.197628 0.519737 +vt 0.197628 0.500000 +vt 0.158103 0.369092 +vt 0.178292 0.388493 +vt 0.158103 0.446698 +vt 0.047431 0.157895 +vt 0.039526 0.177632 +vt 0.039526 0.157895 +vt 0.047431 0.098684 +vt 0.039526 0.118421 +vt 0.039526 0.098684 +vt 0.047431 0.197368 +vt 0.047431 0.177632 +vt 0.039526 0.138158 +vt 0.047431 0.138158 +vt 0.047431 0.118421 +vt 0.039526 0.078947 +vt 0.047431 0.078947 +vt 0.031621 0.131579 +vt 0.031621 0.125000 +vt 0.031621 0.111842 +vt 0.031621 0.105263 +vt 0.031621 0.092105 +vt 0.031621 0.085526 +vt 0.039526 0.197368 +vt 0.031621 0.190789 +vt 0.031621 0.184211 +vt 0.031621 0.171053 +vt 0.031621 0.164474 +vt 0.031621 0.151316 +vt 0.031621 0.144737 +vt 0.023068 0.088703 +vt 0.019763 0.091880 +vt 0.016457 0.082350 +vt 1.000000 0.046053 +vt 0.984190 0.230263 +vt 0.984190 0.046053 +vt 0.984190 0.315789 +vt 0.992095 0.289474 +vt 0.992095 0.315789 +vt 0.936759 0.289474 +vt 0.944664 0.315789 +vt 0.936759 0.315789 +vt 0.944664 0.263158 +vt 0.936759 0.263158 +vt 0.984190 0.263158 +vt 0.992095 0.263158 +vt 0.968379 0.263158 +vt 0.964427 0.276316 +vt 0.960474 0.263158 +vt 0.968379 0.250000 +vt 0.960474 0.250000 +vt 0.984190 0.315789 +vt 0.992095 0.289474 +vt 0.992095 0.315789 +vt 0.936759 0.289474 +vt 0.944664 0.315789 +vt 0.936759 0.315789 +vt 0.944664 0.263158 +vt 0.936759 0.263158 +vt 0.984190 0.263158 +vt 0.992095 0.263158 +vt 0.968379 0.263158 +vt 0.964427 0.276316 +vt 0.960474 0.263158 +vt 0.960474 0.250000 +vt 0.968379 0.289474 +vt 0.976285 0.315789 +vt 0.968379 0.315789 +vt 0.952569 0.315789 +vt 0.960474 0.289474 +vt 0.960474 0.315789 +vt 0.952569 0.263158 +vt 0.960474 0.263158 +vt 0.976285 0.263158 +vt 0.976102 0.289411 +vt 0.960474 0.263158 +vt 0.968379 0.263158 +vt 0.964427 0.276316 +vt 0.960474 0.250000 +vt 0.968379 0.250000 +vt 0.968379 0.289474 +vt 0.976285 0.315789 +vt 0.968379 0.315789 +vt 0.952569 0.315789 +vt 0.960474 0.289474 +vt 0.960474 0.315789 +vt 0.952569 0.263158 +vt 0.960474 0.263158 +vt 0.976285 0.263158 +vt 0.976285 0.289474 +vt 0.960474 0.263158 +vt 0.968379 0.263158 +vt 0.964427 0.276316 +vt 0.968379 0.250000 +vt 0.960474 0.250000 +vt 0.984190 0.355263 +vt 0.976285 0.381579 +vt 0.976285 0.355263 +vt 0.944664 0.355263 +vt 0.952569 0.381579 +vt 0.944664 0.381579 +vt 0.984190 0.250000 +vt 0.976285 0.250000 +vt 0.952569 0.289474 +vt 0.944664 0.289474 +vt 0.976285 0.328947 +vt 0.984190 0.328947 +vt 0.984190 0.355263 +vt 0.976285 0.381579 +vt 0.976285 0.355263 +vt 0.952569 0.250000 +vt 0.976285 0.250000 +vt 0.984190 0.250000 +vt 0.984190 0.328947 +vt 0.976285 0.328947 +vt 0.944664 0.250000 +vt 0.952569 0.328947 +vt 0.944664 0.328947 +vt 0.984784 0.289312 +vt 0.952569 0.328947 +vt 0.944664 0.328947 +vt 0.952569 0.289474 +vt 0.984190 0.289474 +vt 0.944664 0.355263 +vt 0.952569 0.355263 +vt 0.952569 0.381579 +vt 0.944664 0.381579 +vt 0.952569 0.355263 +vt 0.944664 0.289474 +vt 0.956522 0.046053 +vt 0.972332 0.230263 +vt 0.956522 0.230263 +vt 0.972332 0.046053 +vt 0.944664 0.230263 +vt 0.956522 0.250000 +vt 0.972332 0.250000 +vt 0.972332 0.026316 +vt 0.956522 0.026316 +vt 0.102767 0.526316 +vt 0.110672 0.552632 +vt 0.102767 0.546053 +vt 0.102767 0.552632 +vt 0.110672 0.578947 +vt 0.102767 0.572368 +vt 0.102767 0.578947 +vt 0.110672 0.605263 +vt 0.102767 0.598684 +vt 0.102767 0.605263 +vt 0.110672 0.631579 +vt 0.102767 0.625000 +vt 0.102767 0.631579 +vt 0.110672 0.657895 +vt 0.102767 0.651316 +vt 0.102767 0.657895 +vt 0.110672 0.684211 +vt 0.102767 0.677632 +vt 0.102767 0.368421 +vt 0.110672 0.394737 +vt 0.102767 0.388158 +vt 0.102767 0.414474 +vt 0.102767 0.394737 +vt 0.102767 0.421053 +vt 0.110672 0.447368 +vt 0.102767 0.440789 +vt 0.102767 0.467105 +vt 0.102767 0.447368 +vt 0.110672 0.473684 +vt 0.102767 0.493421 +vt 0.102767 0.473684 +vt 0.110672 0.500000 +vt 0.102767 0.519737 +vt 0.102767 0.500000 +vt 0.137679 0.506469 +vt 0.137679 0.467215 +vt 0.178527 0.467215 +vt 0.869565 0.197368 +vt 0.881423 0.217105 +vt 0.869565 0.217105 +vt 0.881423 0.223684 +vt 0.869565 0.243421 +vt 0.869565 0.223684 +vt 0.885375 0.223684 +vt 0.881423 0.243421 +vt 0.865613 0.223684 +vt 0.865613 0.243421 +vt 0.881423 0.184211 +vt 0.881423 0.197368 +vt 0.869565 0.118421 +vt 0.869565 0.072368 +vt 0.881423 0.072368 +vt 0.869565 0.256579 +vt 0.881423 0.250000 +vt 0.881423 0.256579 +vt 0.869565 0.250000 +vt 0.865613 0.263158 +vt 0.865613 0.250000 +vt 0.885375 0.250000 +vt 0.881423 0.138158 +vt 0.885375 0.177632 +vt 0.865613 0.177632 +vt 0.869565 0.138158 +vt 0.869565 0.184211 +vt 0.873518 0.131579 +vt 0.877470 0.125000 +vt 0.877470 0.131579 +vt 0.885375 0.138158 +vt 0.881423 0.131579 +vt 0.885375 0.131579 +vt 0.865613 0.138158 +vt 0.869565 0.131579 +vt 0.849802 0.828947 +vt 0.841897 0.809211 +vt 0.849802 0.809211 +vt 0.841897 0.789474 +vt 0.849802 0.789474 +vt 0.841897 0.769737 +vt 0.849802 0.769737 +vt 0.841897 0.750000 +vt 0.849802 0.750000 +vt 0.849802 0.730263 +vt 0.841897 0.743421 +vt 0.841897 0.730263 +vt 0.841897 0.710526 +vt 0.849802 0.710526 +vt 0.849802 0.690789 +vt 0.841897 0.703947 +vt 0.841897 0.690789 +vt 0.841897 0.671053 +vt 0.849802 0.671053 +vt 0.849802 0.651316 +vt 0.841897 0.664474 +vt 0.841897 0.651316 +vt 0.849802 0.631579 +vt 0.841897 0.644737 +vt 0.841897 0.631579 +vt 0.849802 0.868421 +vt 0.841897 0.848684 +vt 0.849802 0.848684 +vt 0.841897 0.828947 +vt 0.810292 0.680641 +vt 0.810292 0.635149 +vt 0.833962 0.657895 +vt 0.857871 0.081560 +vt 0.857871 0.076335 +vt 0.860091 0.072641 +vt 0.893281 0.717105 +vt 0.897233 0.736842 +vt 0.893281 0.736842 +vt 0.869479 0.612884 +vt 0.845936 0.612884 +vt 0.845936 0.545011 +vt 0.893281 0.677632 +vt 0.897233 0.697368 +vt 0.893281 0.697368 +vt 0.893281 0.618421 +vt 0.897233 0.598684 +vt 0.897233 0.618421 +vt 0.893281 0.756579 +vt 0.897233 0.776316 +vt 0.893281 0.776316 +vt 0.893281 0.657895 +vt 0.897233 0.638158 +vt 0.897233 0.657895 +vt 0.893281 0.559211 +vt 0.897233 0.539474 +vt 0.897233 0.559211 +vt 0.897233 0.677632 +vt 0.893281 0.578947 +vt 0.893281 0.598684 +vt 0.897233 0.756579 +vt 0.897233 0.717105 +vt 0.897233 0.578947 +vt 0.893281 0.638158 +vt 0.972245 0.550301 +vt 0.995874 0.618421 +vt 0.924988 0.686541 +vt 0.688010 0.657895 +vt 0.711331 0.635484 +vt 0.711331 0.680306 +vt 0.928909 0.405208 +vt 0.934420 0.401409 +vt 0.936703 0.410581 +vt 0.516180 0.670834 +vt 0.529644 0.632017 +vt 0.543109 0.670834 +vt 0.411238 0.697368 +vt 0.418973 0.684493 +vt 0.426708 0.697368 +vt 0.239289 0.634604 +vt 0.239289 0.648291 +vt 0.231066 0.648291 +vt 0.252964 0.638158 +vt 0.249012 0.644737 +vt 0.249012 0.638158 +vt 0.252964 0.657895 +vt 0.249012 0.651316 +vt 0.252964 0.651316 +vt 0.252964 0.664474 +vt 0.249012 0.671053 +vt 0.249012 0.664474 +vt 0.252964 0.677632 +vt 0.252964 0.671053 +vt 0.252964 0.631579 +vt 0.249012 0.631579 +vt 0.252964 0.644737 +vt 0.249012 0.657895 +vt 0.252964 0.684211 +vt 0.249012 0.677632 +vt 0.858186 0.023026 +vt 0.862097 0.007307 +vt 0.880985 0.007307 +vt 0.197628 0.546053 +vt 0.205534 0.526316 +vt 0.197628 0.526316 +vt 0.197628 0.552632 +vt 0.205534 0.578947 +vt 0.205534 0.552632 +vt 0.197628 0.598684 +vt 0.197628 0.578947 +vt 0.197628 0.605263 +vt 0.205534 0.631579 +vt 0.205534 0.605263 +vt 0.197628 0.631579 +vt 0.205534 0.657895 +vt 0.197628 0.657895 +vt 0.205534 0.684211 +vt 0.197628 0.368421 +vt 0.205534 0.394737 +vt 0.205534 0.368421 +vt 0.197628 0.414474 +vt 0.197628 0.394737 +vt 0.197628 0.421053 +vt 0.205534 0.447368 +vt 0.205534 0.421053 +vt 0.197628 0.467105 +vt 0.197628 0.447368 +vt 0.197628 0.493421 +vt 0.205534 0.473684 +vt 0.197628 0.473684 +vt 0.197628 0.519737 +vt 0.205534 0.500000 +vt 0.197628 0.500000 +vt 0.178292 0.427296 +vt 0.158103 0.369092 +vt 0.137913 0.427296 +vt 0.035613 0.417413 +vt 0.029855 0.407829 +vt 0.027747 0.394737 +vt 0.029855 0.381645 +vt 0.035613 0.372061 +vt 0.051344 0.372061 +vt 0.059210 0.394737 +vt 0.057102 0.407829 +vt 0.051344 0.417413 +vt 0.071146 0.506579 +vt 0.071146 0.546053 +vt 0.071146 0.605263 +vt 0.071146 0.407895 +vt 0.071146 0.447368 +vt 0.943923 0.044413 +vt 0.933791 0.051399 +vt 0.929594 0.034534 +vt 0.933791 0.027548 +vt 0.939726 0.027548 +vt 0.936759 0.302632 +vt 0.897233 0.342105 +vt 0.928854 0.078947 +vt 0.909091 0.092105 +vt 0.905138 0.355263 +vt 0.897233 0.342105 +vt 0.936759 0.342105 +vt 0.936759 0.394737 +vt 0.897233 0.105263 +vt 0.434783 0.690789 +vt 0.434783 0.638158 +vt 0.434783 0.625000 +vt 0.434783 0.532895 +vt 0.434783 0.519737 +vt 0.434783 0.427632 +vt 0.434783 0.414474 +vt 0.434783 0.322368 +vt 0.434783 0.269737 +vt 0.434783 0.217105 +vt 0.434783 0.164474 +vt 0.434783 0.111842 +vt 0.434783 0.059211 +vt 0.434783 0.006579 +vt 0.434783 0.796053 +vt 0.434783 0.782895 +vt 0.237154 0.138158 +vt 0.237154 0.177632 +vt 0.237154 0.019737 +vt 0.237154 0.059211 +vt 0.197628 0.151316 +vt 0.197628 0.157895 +vt 0.197628 0.177632 +vt 0.197628 0.197368 +vt 0.197628 0.230263 +vt 0.197628 0.236842 +vt 0.197628 0.256579 +vt 0.197628 0.276316 +vt 0.197628 0.296053 +vt 0.197628 0.000000 +vt 0.197628 0.032895 +vt 0.197628 0.039474 +vt 0.197628 0.059211 +vt 0.197628 0.078947 +vt 0.197628 0.098684 +vt 0.197628 0.118421 +vt 0.055336 0.368421 +vt 0.055336 0.368421 +vt 0.055336 0.368421 +vt 0.055336 0.368421 +vt 0.079051 0.309211 +vt 0.079051 0.289474 +vt 0.079051 0.111842 +vt 0.079051 0.269737 +vt 0.079051 0.230263 +vt 0.079051 0.250000 +vt 0.079051 0.210526 +vt 0.079051 0.190789 +vt 0.079051 0.032895 +vt 0.079051 0.013158 +vt 0.079051 0.151316 +vt 0.490119 0.578947 +vt 0.490119 0.473684 +vt 0.490119 0.368421 +vt 0.490119 0.052632 +vt 0.490119 0.842105 +vt 0.002202 0.054306 +vt 0.000430 0.039474 +vt 0.002202 0.024642 +vt 0.007250 0.012068 +vt 0.023715 0.000716 +vt 0.032626 0.003666 +vt 0.040181 0.012068 +vt 0.047001 0.039474 +vt 0.045228 0.054306 +vt 0.040181 0.066880 +vt 0.023715 0.078232 +vt 0.014804 0.075281 +vt 0.007250 0.066880 +vt 0.879451 0.516891 +vt 0.897233 0.315789 +vt 0.895565 0.509705 +vt 0.891247 0.516891 +vt 0.864109 0.509705 +vt 0.859792 0.516891 +vt 0.847996 0.516891 +vt 0.841897 0.315789 +vt 0.841897 0.315789 +vt 0.864109 0.509705 +vt 0.859792 0.516891 +vt 0.847996 0.516891 +vt 0.879451 0.516891 +vt 0.897233 0.315789 +vt 0.895565 0.509705 +vt 0.891247 0.516891 +vt 0.205534 0.552632 +vt 0.205534 0.368421 +vt 0.205534 0.421053 +vt 0.146446 0.441499 +vt 0.137913 0.427296 +vt 0.134790 0.407895 +vt 0.137913 0.388493 +vt 0.146446 0.374290 +vt 0.169759 0.374290 +vt 0.181415 0.407895 +vt 0.178292 0.427296 +vt 0.169759 0.441499 +vt 0.031621 0.118421 +vt 0.031621 0.098684 +vt 0.031621 0.078947 +vt 0.031621 0.177632 +vt 0.031621 0.157895 +vt 0.031621 0.138158 +vt 0.017854 0.091028 +vt 0.016457 0.088703 +vt 0.015946 0.085526 +vt 0.017854 0.080024 +vt 0.023068 0.082350 +vt 0.019763 0.079173 +vt 0.021671 0.080024 +vt 0.023580 0.085526 +vt 0.021671 0.091028 +vt 1.000000 0.230263 +vt 0.968379 0.250000 +vt 0.968379 0.263158 +vt 0.968379 0.263158 +vt 0.984190 0.381579 +vt 0.984190 0.381579 +vt 0.944664 0.250000 +vt 0.952569 0.250000 +vt 0.944664 0.046053 +vt 0.110672 0.526316 +vt 0.110672 0.368421 +vt 0.110672 0.421053 +vt 0.158103 0.526096 +vt 0.146311 0.520837 +vt 0.134520 0.486842 +vt 0.146311 0.452847 +vt 0.158103 0.447588 +vt 0.169895 0.452847 +vt 0.181686 0.486842 +vt 0.178527 0.506469 +vt 0.169895 0.520837 +vt 0.885375 0.243421 +vt 0.881423 0.118421 +vt 0.873518 0.125000 +vt 0.865613 0.243421 +vt 0.885375 0.243421 +vt 0.885375 0.263158 +vt 0.865613 0.131579 +vt 0.841897 0.822368 +vt 0.841897 0.802632 +vt 0.841897 0.782895 +vt 0.841897 0.763158 +vt 0.841897 0.723684 +vt 0.841897 0.684211 +vt 0.841897 0.861842 +vt 0.841897 0.842105 +vt 0.831847 0.671027 +vt 0.826072 0.680641 +vt 0.818182 0.684160 +vt 0.804516 0.671027 +vt 0.802402 0.657895 +vt 0.804516 0.644762 +vt 0.818182 0.631630 +vt 0.826072 0.635149 +vt 0.831847 0.644762 +vt 0.863229 0.072641 +vt 0.863229 0.085254 +vt 0.865449 0.076335 +vt 0.865449 0.081560 +vt 0.860091 0.085254 +vt 0.837319 0.598541 +vt 0.834165 0.578947 +vt 0.837319 0.559354 +vt 0.857707 0.539761 +vt 0.869479 0.545011 +vt 0.878096 0.559354 +vt 0.881250 0.578947 +vt 0.878096 0.598541 +vt 0.857707 0.618134 +vt 0.893281 0.539474 +vt 0.989543 0.657750 +vt 0.972245 0.686541 +vt 0.948617 0.697079 +vt 0.907691 0.657750 +vt 0.901359 0.618421 +vt 0.907691 0.579092 +vt 0.924988 0.550301 +vt 0.948617 0.539763 +vt 0.989543 0.579092 +vt 0.703557 0.683773 +vt 0.695784 0.680306 +vt 0.690093 0.670834 +vt 0.690093 0.644956 +vt 0.695784 0.635484 +vt 0.703557 0.632017 +vt 0.717022 0.644956 +vt 0.719104 0.657895 +vt 0.717022 0.670834 +vt 0.934420 0.414381 +vt 0.931192 0.414381 +vt 0.928909 0.410581 +vt 0.931192 0.401409 +vt 0.936703 0.405208 +vt 0.537418 0.680306 +vt 0.529644 0.683773 +vt 0.521871 0.680306 +vt 0.514097 0.657895 +vt 0.516180 0.644956 +vt 0.521871 0.635484 +vt 0.537418 0.635484 +vt 0.543109 0.644956 +vt 0.545191 0.657895 +vt 0.424442 0.706472 +vt 0.418973 0.710243 +vt 0.413503 0.706472 +vt 0.413503 0.688264 +vt 0.424442 0.688264 +vt 0.229363 0.641447 +vt 0.231066 0.634604 +vt 0.235178 0.631769 +vt 0.240992 0.641447 +vt 0.235178 0.651126 +vt 0.249012 0.684211 +vt 0.883881 0.014519 +vt 0.884897 0.023026 +vt 0.883881 0.031534 +vt 0.880985 0.038746 +vt 0.876652 0.043565 +vt 0.871541 0.045257 +vt 0.866430 0.043565 +vt 0.862097 0.038746 +vt 0.859202 0.031534 +vt 0.859202 0.014519 +vt 0.866430 0.002488 +vt 0.871542 0.000796 +vt 0.876652 0.002488 +vt 0.197628 0.572368 +vt 0.197628 0.625000 +vt 0.197628 0.651316 +vt 0.197628 0.677632 +vt 0.197628 0.388158 +vt 0.197628 0.440789 +vt 0.146446 0.441499 +vt 0.158103 0.446698 +vt 0.169759 0.441499 +vt 0.181415 0.407895 +vt 0.178292 0.388493 +vt 0.169759 0.374290 +vt 0.146446 0.374290 +vt 0.137913 0.388493 +vt 0.134790 0.407895 +vt 0.798419 0.473684 +vt 0.513834 0.513158 +vt 0.513834 0.473684 +vt 0.798419 0.513158 +vt 0.513834 0.552632 +vt 0.798419 0.552632 +vt 0.513834 0.592105 +vt 0.798419 0.592105 +vt 0.513834 0.631579 +vt 0.798419 0.000000 +vt 0.513834 0.039474 +vt 0.513834 -0.000000 +vt 0.798419 0.039474 +vt 0.513834 0.078947 +vt 0.798419 0.078947 +vt 0.513834 0.118421 +vt 0.798419 0.118421 +vt 0.513834 0.157895 +vt 0.798419 0.157895 +vt 0.513834 0.197368 +vt 0.798419 0.197368 +vt 0.513834 0.236842 +vt 0.798419 0.236842 +vt 0.513834 0.276316 +vt 0.798419 0.276316 +vt 0.513834 0.315789 +vt 0.798419 0.315789 +vt 0.513834 0.355263 +vt 0.798419 0.355263 +vt 0.513834 0.394737 +vt 0.810277 0.631579 +vt 0.798419 0.631579 +vt 0.798419 0.394737 +vt 0.513834 0.434211 +vt 0.810277 0.513158 +vt 0.833992 0.480263 +vt 0.833992 0.500000 +vt 0.810277 0.197368 +vt 0.810277 0.355263 +vt 0.810277 0.394737 +vt 0.810277 0.552632 +vt 0.810277 0.118421 +vt 0.810277 0.276316 +vt 0.810277 0.315789 +vt 0.810277 0.039474 +vt 0.810277 0.236842 +vt 0.810277 0.434211 +vt 0.798419 0.434211 +vt 0.810277 0.592105 +vt 0.810277 0.157895 +vt 0.810277 0.078947 +vt 0.810277 0.473684 +vt 0.833992 0.440789 +vt 0.833992 0.460526 +vt 0.833992 0.184211 +vt 0.833992 0.539474 +vt 0.833992 0.223684 +vt 0.833992 0.578947 +vt 0.833992 0.243421 +vt 0.833992 0.263158 +vt 0.833992 0.618421 +vt 0.833992 0.302632 +vt 0.833992 0.006579 +vt 0.833992 0.026316 +vt 0.833992 0.322368 +vt 0.833992 0.342105 +vt 0.833992 0.065789 +vt 0.833992 0.381579 +vt 0.833992 0.105263 +vt 0.833992 0.421053 +vt 0.833992 0.144737 +vt 0.897233 0.657895 +vt 0.901186 0.677632 +vt 0.897233 0.677632 +vt 0.897233 0.736842 +vt 0.901186 0.756579 +vt 0.897233 0.756579 +vt 0.897233 0.578947 +vt 0.901186 0.598684 +vt 0.897233 0.598684 +vt 0.901186 0.697368 +vt 0.897233 0.697368 +vt 0.897233 0.717105 +vt 0.901186 0.736842 +vt 0.901186 0.717105 +vt 0.897233 0.539474 +vt 0.901186 0.559211 +vt 0.897233 0.559211 +vt 0.901186 0.618421 +vt 0.897233 0.618421 +vt 0.897233 0.638158 +vt 0.901186 0.657895 +vt 0.901186 0.776316 +vt 0.897233 0.776316 +vt 0.901186 0.578947 +vt 0.944664 0.000000 +vt 0.936759 0.026316 +vt 0.936759 0.000000 +vt 0.992095 0.000000 +vt 0.984190 0.026316 +vt 0.984190 0.000000 +vt 0.976285 0.000000 +vt 0.968379 0.026316 +vt 0.968379 0.000000 +vt 0.960474 0.000000 +vt 0.952569 0.026316 +vt 0.952569 0.000000 +vt 0.928854 0.026316 +vt 0.928854 0.000000 +vt 0.976285 0.026316 +vt 0.960474 0.026316 +vt 0.944664 0.026316 +vt 0.434783 0.394737 +vt 0.403162 0.355263 +vt 0.434783 0.355263 +vt 0.434783 0.039474 +vt 0.403162 0.078947 +vt 0.403162 0.039474 +vt 0.403162 0.315789 +vt 0.434783 0.315789 +vt 0.403162 0.000000 +vt 0.434783 0.000000 +vt 0.403162 0.276316 +vt 0.434783 0.276316 +vt 0.434783 0.631579 +vt 0.403162 0.592105 +vt 0.434783 0.592105 +vt 0.403162 0.236842 +vt 0.434783 0.236842 +vt 0.403162 0.552632 +vt 0.434783 0.552632 +vt 0.403162 0.197368 +vt 0.434783 0.197368 +vt 0.403162 0.513158 +vt 0.434783 0.513158 +vt 0.403162 0.157895 +vt 0.434783 0.157895 +vt 0.434783 0.473684 +vt 0.403162 0.434211 +vt 0.434783 0.434211 +vt 0.403162 0.473684 +vt 0.403162 0.118421 +vt 0.434783 0.118421 +vt 0.403162 0.394737 +vt 0.434783 0.078947 +vt 0.403162 0.315789 +vt 0.245059 0.289474 +vt 0.403162 0.276316 +vt 0.403162 0.039474 +vt 0.245059 0.013158 +vt 0.403162 0.000000 +vt 0.245059 0.342105 +vt 0.245059 0.328947 +vt 0.403162 0.078947 +vt 0.245059 0.052632 +vt 0.403162 0.394737 +vt 0.245059 0.368421 +vt 0.403162 0.355263 +vt 0.403162 0.118421 +vt 0.245059 0.092105 +vt 0.403162 0.434211 +vt 0.245059 0.407895 +vt 0.245059 0.144737 +vt 0.245059 0.131579 +vt 0.403162 0.513158 +vt 0.245059 0.486842 +vt 0.403162 0.473684 +vt 0.245059 0.447368 +vt 0.403162 0.197368 +vt 0.245059 0.171053 +vt 0.403162 0.157895 +vt 0.245059 0.539474 +vt 0.245059 0.526316 +vt 0.245059 0.223684 +vt 0.245059 0.210526 +vt 0.403162 0.552632 +vt 0.245059 0.578947 +vt 0.245059 0.565789 +vt 0.245059 0.250000 +vt 0.403162 0.236842 +vt 0.403162 0.592105 +vt 0.245059 0.618421 +vt 0.245059 0.605263 +vt 0.237154 0.217105 +vt 0.205534 0.197368 +vt 0.237154 0.197368 +vt 0.237154 0.078947 +vt 0.205534 0.059211 +vt 0.237154 0.059211 +vt 0.237154 0.256579 +vt 0.205534 0.236842 +vt 0.237154 0.236842 +vt 0.205534 0.217105 +vt 0.237154 0.098684 +vt 0.205534 0.078947 +vt 0.237154 0.276316 +vt 0.205534 0.256579 +vt 0.237154 0.118421 +vt 0.205534 0.098684 +vt 0.237154 0.296053 +vt 0.205534 0.276316 +vt 0.237154 0.138158 +vt 0.205534 0.118421 +vt 0.237154 0.315789 +vt 0.205534 0.296053 +vt 0.237154 0.157895 +vt 0.205534 0.138158 +vt 0.237154 0.019737 +vt 0.205534 0.000000 +vt 0.237154 -0.000000 +vt 0.237154 0.177632 +vt 0.205534 0.157895 +vt 0.237154 0.039474 +vt 0.205534 0.019737 +vt 0.205534 0.177632 +vt 0.205534 0.039474 +vt 0.134387 0.151316 +vt 0.118577 0.138158 +vt 0.134387 0.138158 +vt 0.134387 0.171053 +vt 0.118577 0.157895 +vt 0.134387 0.157895 +vt 0.118577 0.197368 +vt 0.134387 0.177632 +vt 0.134387 0.190789 +vt 0.118577 0.217105 +vt 0.134387 0.197368 +vt 0.134387 0.210526 +vt 0.118577 0.236842 +vt 0.134387 0.217105 +vt 0.134387 0.230263 +vt 0.134387 0.250000 +vt 0.134387 0.236842 +vt 0.134387 0.269737 +vt 0.118577 0.256579 +vt 0.134387 0.256579 +vt 0.134387 0.289474 +vt 0.118577 0.276316 +vt 0.134387 0.276316 +vt 0.118577 0.315789 +vt 0.134387 0.296053 +vt 0.134387 0.309211 +vt 0.134387 0.013158 +vt 0.118577 -0.000000 +vt 0.134387 -0.000000 +vt 0.118577 0.039474 +vt 0.134387 0.019737 +vt 0.134387 0.032895 +vt 0.118577 0.059211 +vt 0.134387 0.039474 +vt 0.134387 0.052632 +vt 0.118577 0.078947 +vt 0.134387 0.059211 +vt 0.134387 0.072368 +vt 0.134387 0.092105 +vt 0.134387 0.078947 +vt 0.134387 0.111842 +vt 0.118577 0.098684 +vt 0.134387 0.098684 +vt 0.134387 0.118421 +vt 0.134387 0.131579 +vt 0.197628 0.210526 +vt 0.134387 0.197368 +vt 0.197628 0.197368 +vt 0.197628 0.105263 +vt 0.134387 0.092105 +vt 0.197628 0.092105 +vt 0.197628 0.013158 +vt 0.134387 0.000000 +vt 0.197628 0.000000 +vt 0.197628 0.118421 +vt 0.134387 0.105263 +vt 0.197628 0.026316 +vt 0.134387 0.013158 +vt 0.197628 0.131579 +vt 0.134387 0.118421 +vt 0.197628 0.039474 +vt 0.134387 0.026316 +vt 0.197628 0.144737 +vt 0.134387 0.131579 +vt 0.197628 0.052632 +vt 0.134387 0.039474 +vt 0.197628 0.171053 +vt 0.134387 0.157895 +vt 0.197628 0.157895 +vt 0.134387 0.144737 +vt 0.197628 0.065789 +vt 0.134387 0.052632 +vt 0.197628 0.184211 +vt 0.134387 0.171053 +vt 0.197628 0.078947 +vt 0.134387 0.065789 +vt 0.134387 0.184211 +vt 0.134387 0.078947 +vt 0.118577 0.197368 +vt 0.086957 0.177632 +vt 0.118577 0.177632 +vt 0.118577 0.059211 +vt 0.086957 0.039474 +vt 0.118577 0.039474 +vt 0.118577 0.217105 +vt 0.086957 0.197368 +vt 0.118577 0.078947 +vt 0.086957 0.059211 +vt 0.118577 0.256579 +vt 0.086957 0.236842 +vt 0.118577 0.236842 +vt 0.086957 0.217105 +vt 0.118577 0.098684 +vt 0.086957 0.078947 +vt 0.118577 0.276316 +vt 0.086957 0.256579 +vt 0.118577 0.118421 +vt 0.086957 0.098684 +vt 0.118577 0.296053 +vt 0.086957 0.276316 +vt 0.118577 0.138158 +vt 0.086957 0.118421 +vt 0.118577 0.315789 +vt 0.086957 0.296053 +vt 0.118577 0.157895 +vt 0.086957 0.138158 +vt 0.118577 0.019737 +vt 0.086957 -0.000000 +vt 0.118577 -0.000000 +vt 0.086957 0.157895 +vt 0.086957 0.019737 +vt 0.047431 0.026316 +vt 0.079051 0.039474 +vt 0.047431 0.039474 +vt 0.047431 0.131579 +vt 0.079051 0.144737 +vt 0.047431 0.144737 +vt 0.047431 0.013158 +vt 0.079051 0.026316 +vt 0.047431 0.118421 +vt 0.079051 0.131579 +vt 0.047431 -0.000000 +vt 0.079051 0.013158 +vt 0.047431 0.105263 +vt 0.079051 0.118421 +vt 0.047431 0.197368 +vt 0.079051 0.210526 +vt 0.047431 0.210526 +vt 0.047431 0.092105 +vt 0.079051 0.105263 +vt 0.047431 0.184211 +vt 0.079051 0.197368 +vt 0.047431 0.078947 +vt 0.079051 0.092105 +vt 0.047431 0.171053 +vt 0.079051 0.184211 +vt 0.047431 0.065789 +vt 0.079051 0.078947 +vt 0.047431 0.157895 +vt 0.079051 0.171053 +vt 0.079051 0.052632 +vt 0.047431 0.052632 +vt 0.079051 0.065789 +vt 0.079051 0.157895 +vt 0.197628 0.598684 +vt 0.181818 0.578947 +vt 0.197628 0.578947 +vt 0.197628 0.467105 +vt 0.181818 0.447368 +vt 0.197628 0.447368 +vt 0.197628 0.388158 +vt 0.181818 0.368421 +vt 0.197628 0.368421 +vt 0.197628 0.625000 +vt 0.181818 0.605263 +vt 0.197628 0.605263 +vt 0.197628 0.493421 +vt 0.181818 0.473684 +vt 0.197628 0.473684 +vt 0.197628 0.526316 +vt 0.181818 0.546053 +vt 0.181818 0.526316 +vt 0.197628 0.414474 +vt 0.181818 0.394737 +vt 0.197628 0.394737 +vt 0.197628 0.651316 +vt 0.181818 0.631579 +vt 0.197628 0.631579 +vt 0.197628 0.519737 +vt 0.181818 0.500000 +vt 0.197628 0.500000 +vt 0.197628 0.572368 +vt 0.181818 0.552632 +vt 0.197628 0.552632 +vt 0.197628 0.440789 +vt 0.181818 0.421053 +vt 0.197628 0.421053 +vt 0.197628 0.677632 +vt 0.181818 0.657895 +vt 0.197628 0.657895 +vt 0.901186 0.638158 +vt 0.893281 0.638158 +vt 0.881423 0.618421 +vt 0.893281 0.618421 +vt 0.893281 0.578947 +vt 0.881423 0.559211 +vt 0.893281 0.559211 +vt 0.893281 0.717105 +vt 0.881423 0.697368 +vt 0.893281 0.697368 +vt 0.893281 0.756579 +vt 0.881423 0.736842 +vt 0.893281 0.736842 +vt 0.893281 0.657895 +vt 0.881423 0.638158 +vt 0.893281 0.598684 +vt 0.881423 0.578947 +vt 0.893281 0.776316 +vt 0.881423 0.756579 +vt 0.893281 0.677632 +vt 0.881423 0.657895 +vt 0.881423 0.598684 +vt 0.881423 0.539474 +vt 0.893281 0.539474 +vt 0.881423 0.677632 +vt 0.881423 0.717105 +vt 0.205534 0.526316 +vt 0.229249 0.552632 +vt 0.205534 0.552632 +vt 0.205534 0.394737 +vt 0.229249 0.421053 +vt 0.205534 0.421053 +vt 0.205534 0.631579 +vt 0.229249 0.657895 +vt 0.205534 0.657895 +vt 0.205534 0.500000 +vt 0.229249 0.526316 +vt 0.229249 0.578947 +vt 0.205534 0.578947 +vt 0.229249 0.447368 +vt 0.205534 0.447368 +vt 0.229249 0.684211 +vt 0.205534 0.684211 +vt 0.229249 0.605263 +vt 0.205534 0.605263 +vt 0.229249 0.473684 +vt 0.205534 0.473684 +vt 0.205534 0.368421 +vt 0.229249 0.394737 +vt 0.229249 0.631579 +vt 0.229249 0.500000 +vt 0.229249 0.500000 +vt 0.205534 0.473684 +vt 0.205534 0.500000 +vt 0.229249 0.631579 +vt 0.205534 0.605263 +vt 0.205534 0.631579 +vt 0.229249 0.394737 +vt 0.205534 0.368421 +vt 0.205534 0.394737 +vt 0.229249 0.473684 +vt 0.205534 0.447368 +vt 0.229249 0.605263 +vt 0.205534 0.578947 +vt 0.229249 0.684211 +vt 0.205534 0.657895 +vt 0.205534 0.684211 +vt 0.229249 0.447368 +vt 0.205534 0.421053 +vt 0.229249 0.578947 +vt 0.205534 0.552632 +vt 0.229249 0.526316 +vt 0.205534 0.526316 +vt 0.229249 0.657895 +vt 0.229249 0.421053 +vt 0.229249 0.552632 +vt 0.181818 0.657895 +vt 0.197628 0.677632 +vt 0.197628 0.657895 +vt 0.181818 0.421053 +vt 0.197628 0.440789 +vt 0.197628 0.421053 +vt 0.181818 0.552632 +vt 0.197628 0.572368 +vt 0.197628 0.552632 +vt 0.181818 0.500000 +vt 0.197628 0.519737 +vt 0.197628 0.500000 +vt 0.181818 0.631579 +vt 0.197628 0.651316 +vt 0.197628 0.631579 +vt 0.181818 0.394737 +vt 0.197628 0.414474 +vt 0.197628 0.394737 +vt 0.197628 0.526316 +vt 0.181818 0.546053 +vt 0.197628 0.546053 +vt 0.181818 0.473684 +vt 0.197628 0.493421 +vt 0.197628 0.473684 +vt 0.181818 0.605263 +vt 0.197628 0.625000 +vt 0.197628 0.605263 +vt 0.181818 0.368421 +vt 0.197628 0.388158 +vt 0.197628 0.368421 +vt 0.181818 0.447368 +vt 0.197628 0.467105 +vt 0.197628 0.447368 +vt 0.181818 0.578947 +vt 0.197628 0.598684 +vt 0.197628 0.578947 +vt 0.545455 0.710526 +vt 0.687747 0.697368 +vt 0.687747 0.710526 +vt 0.545455 0.697368 +vt 0.687747 0.684211 +vt 0.545455 0.684211 +vt 0.687747 0.671053 +vt 0.545455 0.671053 +vt 0.687747 0.657895 +vt 0.545455 0.657895 +vt 0.687747 0.644737 +vt 0.545455 0.644737 +vt 0.687747 0.631579 +vt 0.545455 0.789474 +vt 0.687747 0.776316 +vt 0.687747 0.789474 +vt 0.545455 0.776316 +vt 0.687747 0.763158 +vt 0.545455 0.763158 +vt 0.687747 0.750000 +vt 0.545455 0.750000 +vt 0.687747 0.736842 +vt 0.873518 0.526316 +vt 0.865613 0.513158 +vt 0.873518 0.513158 +vt 0.545455 0.736842 +vt 0.687747 0.723684 +vt 0.545455 0.723684 +vt 0.833992 0.526316 +vt 0.841897 0.539474 +vt 0.833992 0.539474 +vt 0.833992 0.526316 +vt 0.841897 0.539474 +vt 0.833992 0.539474 +vt 0.873518 0.526316 +vt 0.865613 0.513158 +vt 0.873518 0.513158 +vt 0.833992 0.513158 +vt 0.841897 0.526316 +vt 0.865613 0.539474 +vt 0.865613 0.526316 +vt 0.833992 0.500000 +vt 0.841897 0.513158 +vt 0.865613 0.500000 +vt 0.873518 0.500000 +vt 0.411067 0.657895 +vt 0.418972 0.664474 +vt 0.411067 0.664474 +vt 0.403162 0.671053 +vt 0.411067 0.677632 +vt 0.403162 0.677632 +vt 0.276680 0.677632 +vt 0.276680 0.671053 +vt 0.418972 0.671053 +vt 0.411067 0.671053 +vt 0.403162 0.664474 +vt 0.276680 0.684211 +vt 0.418972 0.644737 +vt 0.411067 0.651316 +vt 0.411067 0.644737 +vt 0.403162 0.657895 +vt 0.403162 0.631579 +vt 0.276680 0.638158 +vt 0.276680 0.631579 +vt 0.411067 0.638158 +vt 0.418972 0.638158 +vt 0.403162 0.651316 +vt 0.403162 0.638158 +vt 0.276680 0.644737 +vt 0.411067 0.631579 +vt 0.418972 0.631579 +vt 0.403162 0.644737 +vt 0.276680 0.651316 +vt 0.418972 0.677632 +vt 0.411067 0.684211 +vt 0.276680 0.657895 +vt 0.403162 0.684211 +vt 0.276680 0.664474 +vt 0.418972 0.651316 +vt 0.268775 0.677632 +vt 0.434783 0.657895 +vt 0.418972 0.657895 +vt 0.434783 0.684211 +vt 0.418972 0.684211 +vt 0.434783 0.638158 +vt 0.434783 0.664474 +vt 0.434783 0.644737 +vt 0.434783 0.671053 +vt 0.434783 0.677632 +vt 0.434783 0.651316 +vt 0.434783 0.697368 +vt 0.426877 0.684211 +vt 0.434783 0.684211 +vt 0.434783 0.776316 +vt 0.426877 0.763158 +vt 0.434783 0.763158 +vt 0.434783 0.750000 +vt 0.426877 0.736842 +vt 0.434783 0.736842 +vt 0.434783 0.723684 +vt 0.426877 0.710526 +vt 0.434783 0.710526 +vt 0.426877 0.697368 +vt 0.434783 0.789474 +vt 0.426877 0.776316 +vt 0.426877 0.750000 +vt 0.426877 0.723684 +vt 0.268775 0.657895 +vt 0.252964 0.664474 +vt 0.252964 0.657895 +vt 0.268775 0.631579 +vt 0.268775 0.638158 +vt 0.268775 0.644737 +vt 0.268775 0.651316 +vt 0.268775 0.664474 +vt 0.268775 0.671053 +vt 0.252964 0.644737 +vt 0.252964 0.631579 +vt 0.252964 0.671053 +vt 0.252964 0.651316 +vt 0.252964 0.638158 +vt 0.268775 0.684211 +vt 0.252964 0.677632 +vt 0.249012 0.671053 +vt 0.241107 0.664474 +vt 0.249012 0.664474 +vt 0.027668 0.164474 +vt 0.023715 0.171053 +vt 0.023715 0.164474 +vt 0.023715 0.177632 +vt 0.027668 0.184211 +vt 0.023715 0.184211 +vt 0.023715 0.190789 +vt 0.249012 0.657895 +vt 0.241107 0.651316 +vt 0.249012 0.651316 +vt 0.249012 0.644737 +vt 0.241107 0.638158 +vt 0.249012 0.638158 +vt 0.249012 0.684211 +vt 0.241107 0.677632 +vt 0.249012 0.677632 +vt 0.241107 0.657895 +vt 0.241107 0.644737 +vt 0.249012 0.631579 +vt 0.241107 0.631579 +vt 0.241107 0.671053 +vt 0.102767 0.598684 +vt 0.086957 0.578947 +vt 0.102767 0.578947 +vt 0.102767 0.447368 +vt 0.086957 0.467105 +vt 0.086957 0.447368 +vt 0.102767 0.388158 +vt 0.086957 0.368421 +vt 0.102767 0.368421 +vt 0.102767 0.625000 +vt 0.086957 0.605263 +vt 0.102767 0.605263 +vt 0.102767 0.473684 +vt 0.086957 0.493421 +vt 0.086957 0.473684 +vt 0.102767 0.526316 +vt 0.086957 0.546053 +vt 0.086957 0.526316 +vt 0.102767 0.414474 +vt 0.086957 0.394737 +vt 0.102767 0.394737 +vt 0.102767 0.651316 +vt 0.086957 0.631579 +vt 0.102767 0.631579 +vt 0.102767 0.519737 +vt 0.086957 0.500000 +vt 0.102767 0.500000 +vt 0.102767 0.572368 +vt 0.086957 0.552632 +vt 0.102767 0.552632 +vt 0.102767 0.421053 +vt 0.086957 0.440789 +vt 0.086957 0.421053 +vt 0.102767 0.657895 +vt 0.086957 0.677632 +vt 0.086957 0.657895 +vt 0.110672 0.552632 +vt 0.134387 0.526316 +vt 0.134387 0.552632 +vt 0.110672 0.394737 +vt 0.134387 0.421053 +vt 0.110672 0.421053 +vt 0.110672 0.657895 +vt 0.134387 0.631579 +vt 0.134387 0.657895 +vt 0.110672 0.526316 +vt 0.134387 0.500000 +vt 0.134387 0.578947 +vt 0.110672 0.578947 +vt 0.134387 0.447368 +vt 0.110672 0.447368 +vt 0.110672 0.684211 +vt 0.134387 0.684211 +vt 0.134387 0.605263 +vt 0.110672 0.605263 +vt 0.134387 0.473684 +vt 0.110672 0.473684 +vt 0.110672 0.368421 +vt 0.134387 0.394737 +vt 0.110672 0.631579 +vt 0.110672 0.500000 +vt 0.841897 0.848684 +vt 0.833992 0.861842 +vt 0.833992 0.848684 +vt 0.841897 0.789474 +vt 0.833992 0.802632 +vt 0.833992 0.789474 +vt 0.841897 0.730263 +vt 0.833992 0.743421 +vt 0.833992 0.730263 +vt 0.841897 0.644737 +vt 0.833992 0.631579 +vt 0.841897 0.631579 +vt 0.841897 0.822368 +vt 0.833992 0.809211 +vt 0.841897 0.809211 +vt 0.841897 0.763158 +vt 0.833992 0.750000 +vt 0.841897 0.750000 +vt 0.841897 0.664474 +vt 0.833992 0.651316 +vt 0.841897 0.651316 +vt 0.841897 0.703947 +vt 0.833992 0.690789 +vt 0.841897 0.690789 +vt 0.841897 0.842105 +vt 0.833992 0.828947 +vt 0.841897 0.828947 +vt 0.841897 0.769737 +vt 0.833992 0.782895 +vt 0.833992 0.769737 +vt 0.841897 0.684211 +vt 0.833992 0.671053 +vt 0.841897 0.671053 +vt 0.841897 0.723684 +vt 0.833992 0.710526 +vt 0.841897 0.710526 +vt 0.849802 0.750000 +vt 0.881423 0.769737 +vt 0.849802 0.769737 +vt 0.849802 0.651316 +vt 0.881423 0.671053 +vt 0.849802 0.671053 +vt 0.849802 0.690789 +vt 0.881423 0.710526 +vt 0.849802 0.710526 +vt 0.849802 0.828947 +vt 0.881423 0.848684 +vt 0.849802 0.848684 +vt 0.881423 0.789474 +vt 0.849802 0.789474 +vt 0.881423 0.690789 +vt 0.881423 0.730263 +vt 0.849802 0.730263 +vt 0.849802 0.868421 +vt 0.881423 0.868421 +vt 0.881423 0.809211 +vt 0.849802 0.809211 +vt 0.881423 0.750000 +vt 0.881423 0.631579 +vt 0.881423 0.651316 +vt 0.881423 0.828947 +vt 0.881423 0.072368 +vt 0.877470 0.046053 +vt 0.881423 0.046053 +vt 0.889328 0.072368 +vt 0.885375 0.046053 +vt 0.889328 0.046053 +vt 0.865613 0.072368 +vt 0.861660 0.046053 +vt 0.865613 0.046053 +vt 0.873518 0.072368 +vt 0.869565 0.046053 +vt 0.873518 0.046053 +vt 0.857708 0.072368 +vt 0.857708 0.046053 +vt 0.071146 0.368421 +vt 0.086957 0.388158 +vt 0.071146 0.388158 +vt 0.071146 0.546053 +vt 0.086957 0.565789 +vt 0.071146 0.565789 +vt 0.071146 0.447368 +vt 0.086957 0.467105 +vt 0.071146 0.467105 +vt 0.071146 0.486842 +vt 0.086957 0.506579 +vt 0.071146 0.506579 +vt 0.086957 0.407895 +vt 0.071146 0.407895 +vt 0.086957 0.585526 +vt 0.071146 0.585526 +vt 0.086957 0.486842 +vt 0.086957 0.526316 +vt 0.071146 0.526316 +vt 0.086957 0.427632 +vt 0.071146 0.427632 +vt 0.086957 0.605263 +vt 0.071146 0.605263 +vt 0.086957 0.546053 +vt 0.086957 0.447368 +vt 0.063241 0.480263 +vt 0.059289 0.467105 +vt 0.063241 0.467105 +vt 0.063241 0.519737 +vt 0.059289 0.506579 +vt 0.063241 0.506579 +vt 0.063241 0.421053 +vt 0.059289 0.407895 +vt 0.063241 0.407895 +vt 0.063241 0.598684 +vt 0.059289 0.585526 +vt 0.063241 0.585526 +vt 0.063241 0.539474 +vt 0.059289 0.526316 +vt 0.063241 0.526316 +vt 0.063241 0.440789 +vt 0.059289 0.427632 +vt 0.063241 0.427632 +vt 0.063241 0.381579 +vt 0.059289 0.368421 +vt 0.063241 0.368421 +vt 0.063241 0.559211 +vt 0.059289 0.546053 +vt 0.063241 0.546053 +vt 0.063241 0.460526 +vt 0.059289 0.447368 +vt 0.063241 0.447368 +vt 0.063241 0.500000 +vt 0.059289 0.486842 +vt 0.063241 0.486842 +vt 0.063241 0.401316 +vt 0.059289 0.388158 +vt 0.063241 0.388158 +vt 0.063241 0.578947 +vt 0.059289 0.565789 +vt 0.063241 0.565789 +vt 0.924901 0.394737 +vt 0.928854 0.434211 +vt 0.924901 0.434211 +vt 0.905138 0.394737 +vt 0.909091 0.434211 +vt 0.905138 0.434211 +vt 0.897233 0.394737 +vt 0.901186 0.434211 +vt 0.897233 0.434211 +vt 0.913043 0.394737 +vt 0.913043 0.434211 +vt 0.920949 0.394737 +vt 0.920949 0.434211 +vt 0.916996 0.394737 +vt 0.916996 0.434211 +vt 0.865613 0.500000 +vt 0.873518 0.500000 +vt 0.833992 0.500000 +vt 0.841897 0.513158 +vt 0.833992 0.513158 +vt 0.865613 0.539474 +vt 0.865613 0.526316 +vt 0.841897 0.526316 +vt 0.944664 0.401316 +vt 0.948617 0.394737 +vt 0.948617 0.401316 +vt 0.956522 0.401316 +vt 0.960474 0.394737 +vt 0.960474 0.401316 +vt 0.932806 0.401316 +vt 0.936759 0.394737 +vt 0.936759 0.401316 +vt 0.940711 0.401316 +vt 0.944664 0.394737 +vt 0.952569 0.394737 +vt 0.952569 0.401316 +vt 0.956522 0.394737 +vt 0.928854 0.401316 +vt 0.932806 0.394737 +vt 0.940711 0.394737 +vt 0.027668 0.157895 +vt 0.023715 0.157895 +vt 0.023715 0.078947 +vt 0.027668 0.085526 +vt 0.023715 0.085526 +vt 0.027668 0.092105 +vt 0.023715 0.092105 +vt 0.023715 0.098684 +vt 0.027668 0.105263 +vt 0.023715 0.105263 +vt 0.023715 0.111842 +vt 0.027668 0.118421 +vt 0.023715 0.125000 +vt 0.023715 0.118421 +vt 0.027668 0.131579 +vt 0.023715 0.131579 +vt 0.027668 0.138158 +vt 0.023715 0.144737 +vt 0.023715 0.138158 +vt 0.027668 0.144737 +vt 0.023715 0.151316 +vt 0.490119 0.421053 +vt 0.458498 0.368421 +vt 0.490119 0.368421 +vt 0.490119 0.052632 +vt 0.458498 -0.000000 +vt 0.490119 -0.000000 +vt 0.490119 0.473684 +vt 0.458498 0.421053 +vt 0.458498 0.105263 +vt 0.458498 0.052632 +vt 0.490119 0.526316 +vt 0.458498 0.473684 +vt 0.490119 0.157895 +vt 0.490119 0.105263 +vt 0.490119 0.578947 +vt 0.458498 0.526316 +vt 0.458498 0.210526 +vt 0.458498 0.157895 +vt 0.490119 0.631579 +vt 0.458498 0.578947 +vt 0.490119 0.736842 +vt 0.458498 0.684211 +vt 0.490119 0.684211 +vt 0.490119 0.263158 +vt 0.490119 0.210526 +vt 0.458498 0.315789 +vt 0.458498 0.263158 +vt 0.490119 0.789474 +vt 0.458498 0.736842 +vt 0.490119 0.315789 +vt 0.490119 0.842105 +vt 0.458498 0.789474 +vt 0.458498 0.631579 +vt 0.833992 0.019737 +vt 0.841897 0.039474 +vt 0.833992 0.039474 +vt 0.841897 0.138158 +vt 0.857708 0.125000 +vt 0.857708 0.131579 +vt 0.833992 0.197368 +vt 0.841897 0.177632 +vt 0.841897 0.197368 +vt 0.833992 0.059211 +vt 0.841897 0.059211 +vt 0.833992 0.217105 +vt 0.841897 0.217105 +vt 0.841897 0.078947 +vt 0.833992 0.078947 +vt 0.833992 0.236842 +vt 0.841897 0.256579 +vt 0.833992 0.256579 +vt 0.841897 0.236842 +vt 0.833992 0.098684 +vt 0.841897 0.098684 +vt 0.841897 0.276316 +vt 0.833992 0.276316 +vt 0.833992 0.118421 +vt 0.841897 0.118421 +vt 0.833992 0.296053 +vt 0.841897 0.296053 +vt 0.833992 0.138158 +vt 0.841897 0.315789 +vt 0.833992 0.315789 +vt 0.841897 0.157895 +vt 0.833992 0.157895 +vt 0.841897 -0.000000 +vt 0.841897 0.019737 +vt 0.833992 0.177632 +vt 0.857708 0.309211 +vt 0.857708 0.151316 +vt 0.857708 0.013158 +vt 0.857708 0.171053 +vt 0.857708 0.032895 +vt 0.857708 0.184211 +vt 0.857708 0.190789 +vt 0.857708 0.046053 +vt 0.857708 0.052632 +vt 0.857708 0.210526 +vt 0.857708 0.065789 +vt 0.857708 0.072368 +vt 0.857708 0.250000 +vt 0.857708 0.230263 +vt 0.857708 0.092105 +vt 0.857708 0.269737 +vt 0.857708 0.111842 +vt 0.857708 0.289474 +vt 0.031621 0.111842 +vt 0.027668 0.105263 +vt 0.031621 0.105263 +vt 0.031621 0.085526 +vt 0.027668 0.078947 +vt 0.031621 0.078947 +vt 0.031621 0.171053 +vt 0.027668 0.164474 +vt 0.031621 0.164474 +vt 0.031621 0.118421 +vt 0.027668 0.125000 +vt 0.027668 0.118421 +vt 0.031621 0.144737 +vt 0.027668 0.138158 +vt 0.031621 0.138158 +vt 0.027668 0.092105 +vt 0.027668 0.085526 +vt 0.031621 0.177632 +vt 0.027668 0.184211 +vt 0.027668 0.177632 +vt 0.031621 0.131579 +vt 0.031621 0.125000 +vt 0.027668 0.151316 +vt 0.027668 0.144737 +vt 0.027668 0.098684 +vt 0.031621 0.098684 +vt 0.031621 0.190789 +vt 0.031621 0.184211 +vt 0.027668 0.157895 +vt 0.031621 0.157895 +vt 0.810277 0.000000 +vt 0.833992 0.164474 +vt 0.833992 0.519737 +vt 0.833992 0.203947 +vt 0.833992 0.559211 +vt 0.833992 0.598684 +vt 0.833992 0.282895 +vt 0.833992 0.046053 +vt 0.833992 0.361842 +vt 0.833992 0.085526 +vt 0.833992 0.401316 +vt 0.833992 0.125000 +vt 0.901186 0.539474 +vt 0.992095 0.026316 +vt 0.403162 0.631579 +vt 0.245059 0.302632 +vt 0.245059 0.026316 +vt 0.245059 0.065789 +vt 0.245059 0.381579 +vt 0.245059 0.105263 +vt 0.245059 0.421053 +vt 0.245059 0.500000 +vt 0.245059 0.460526 +vt 0.245059 0.184211 +vt 0.245059 0.263158 +vt 0.403162 0.631579 +vt 0.205534 0.315789 +vt 0.118577 0.177632 +vt 0.118577 0.296053 +vt 0.118577 0.019737 +vt 0.118577 0.118421 +vt 0.134387 0.210526 +vt 0.086957 0.315789 +vt 0.079051 -0.000000 +vt 0.181818 0.598684 +vt 0.181818 0.467105 +vt 0.181818 0.388158 +vt 0.181818 0.625000 +vt 0.181818 0.493421 +vt 0.197628 0.546053 +vt 0.181818 0.414474 +vt 0.181818 0.651316 +vt 0.181818 0.519737 +vt 0.181818 0.572368 +vt 0.181818 0.440789 +vt 0.181818 0.677632 +vt 0.881423 0.776316 +vt 0.229249 0.368421 +vt 0.229249 0.368421 +vt 0.181818 0.677632 +vt 0.181818 0.440789 +vt 0.181818 0.572368 +vt 0.181818 0.519737 +vt 0.181818 0.651316 +vt 0.181818 0.414474 +vt 0.181818 0.526316 +vt 0.181818 0.493421 +vt 0.181818 0.625000 +vt 0.181818 0.388158 +vt 0.181818 0.467105 +vt 0.181818 0.598684 +vt 0.545455 0.631579 +vt 0.873518 0.539474 +vt 0.841897 0.500000 +vt 0.434783 0.631579 +vt 0.426877 0.789474 +vt 0.252964 0.684211 +vt 0.027668 0.171053 +vt 0.027668 0.177632 +vt 0.027668 0.190789 +vt 0.241107 0.684211 +vt 0.086957 0.598684 +vt 0.102767 0.467105 +vt 0.086957 0.388158 +vt 0.086957 0.625000 +vt 0.102767 0.493421 +vt 0.102767 0.546053 +vt 0.086957 0.414474 +vt 0.086957 0.651316 +vt 0.086957 0.519737 +vt 0.086957 0.572368 +vt 0.102767 0.440789 +vt 0.102767 0.677632 +vt 0.134387 0.368421 +vt 0.841897 0.861842 +vt 0.841897 0.802632 +vt 0.841897 0.743421 +vt 0.833992 0.644737 +vt 0.833992 0.822368 +vt 0.833992 0.763158 +vt 0.833992 0.664474 +vt 0.833992 0.703947 +vt 0.833992 0.842105 +vt 0.841897 0.782895 +vt 0.833992 0.684211 +vt 0.833992 0.723684 +vt 0.849802 0.631579 +vt 0.877470 0.072368 +vt 0.885375 0.072368 +vt 0.861660 0.072368 +vt 0.869565 0.072368 +vt 0.086957 0.368421 +vt 0.059289 0.480263 +vt 0.059289 0.519737 +vt 0.059289 0.421053 +vt 0.059289 0.598684 +vt 0.059289 0.539474 +vt 0.059289 0.440789 +vt 0.059289 0.381579 +vt 0.059289 0.559211 +vt 0.059289 0.460526 +vt 0.059289 0.500000 +vt 0.059289 0.401316 +vt 0.059289 0.578947 +vt 0.928854 0.394737 +vt 0.909091 0.394737 +vt 0.901186 0.394737 +vt 0.841897 0.500000 +vt 0.873518 0.539474 +vt 0.928854 0.394737 +vt 0.027668 0.078947 +vt 0.027668 0.098684 +vt 0.027668 0.111842 +vt 0.027668 0.125000 +vt 0.027668 0.151316 +vt 0.458498 0.842105 +vt 0.833992 0.000000 +vt 0.857708 0.302632 +vt 0.857708 0.144737 +vt 0.857708 0.006579 +vt 0.857708 0.164474 +vt 0.857708 0.026316 +vt 0.857708 0.203947 +vt 0.857708 0.243421 +vt 0.857708 0.223684 +vt 0.857708 0.085526 +vt 0.857708 0.263158 +vt 0.857708 0.105263 +vt 0.857708 0.282895 +vt 0.027668 0.111842 +vt 0.027668 0.171053 +vt 0.031621 0.092105 +vt 0.027668 0.131579 +vt 0.031621 0.151316 +vt 0.027668 0.190789 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.3162 -0.9487 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 -0.5000 -0.5000 +vn 0.0000 -0.9487 0.3162 +vn -0.2425 0.0000 0.9701 +vn 0.0000 -1.0000 0.0000 +vn -0.2425 -0.9701 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.2425 0.0000 -0.9701 +vn 0.0000 1.0000 0.0000 +vn -0.2425 0.9701 0.0000 +vn -0.9659 0.1830 -0.1830 +vn 0.9659 -0.1830 0.1830 +vn -0.7071 -0.5000 0.5000 +vn -0.2588 0.6830 -0.6830 +vn 0.7071 0.5000 -0.5000 +vn 0.2588 -0.6830 0.6830 +vn 0.7511 0.4668 -0.4668 +vn 0.8660 0.3536 -0.3536 +vn -0.5000 0.6124 -0.6124 +vn -0.8660 -0.3536 0.3536 +vn 0.5000 -0.6124 0.6124 +vn 0.3204 -0.6698 0.6698 +vn -0.7511 -0.4668 0.4668 +vn -0.3204 0.6698 -0.6698 +vn 0.2588 0.6830 -0.6830 +vn -0.2588 -0.6830 0.6830 +vn -0.9063 0.4226 0.0000 +vn 0.9063 -0.4226 0.0000 +vn 0.2988 0.6409 -0.7071 +vn -0.2988 -0.6409 0.7071 +vn -0.2988 -0.6409 -0.7071 +vn 0.2988 0.6409 0.7071 +vn 0.8522 0.1543 0.5000 +vn 0.4226 0.9063 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.3668 0.0000 -0.9303 +vn 0.0000 -0.3827 -0.9239 +vn 0.3668 -0.3560 -0.8595 +vn 0.3668 -0.6578 -0.6578 +vn 0.0000 -0.9239 -0.3827 +vn 0.3668 -0.8595 -0.3560 +vn 0.3668 -0.9303 0.0000 +vn 0.0000 -0.9239 0.3827 +vn 0.3668 -0.8595 0.3560 +vn 0.3668 -0.6578 0.6578 +vn 0.0000 -0.3827 0.9239 +vn 0.3668 -0.3560 0.8595 +vn 0.3668 0.0000 0.9303 +vn 0.0000 0.3827 0.9239 +vn 0.3668 0.3560 0.8595 +vn 0.3668 0.6578 0.6578 +vn 0.0000 0.9239 0.3827 +vn 0.3668 0.8595 0.3560 +vn 0.3668 0.9303 0.0000 +vn 0.0000 0.9239 -0.3827 +vn 0.3668 0.8595 -0.3560 +vn 0.8379 -0.5459 0.0000 +vn 0.3668 0.6578 -0.6578 +vn 0.0000 0.3827 -0.9239 +vn 0.8379 -0.2089 -0.5043 +vn 0.9487 0.0000 -0.3162 +vn 0.9487 -0.1210 -0.2922 +vn 0.8379 0.2089 0.5043 +vn 0.8379 0.5043 -0.2089 +vn 0.8379 0.3860 -0.3860 +vn 0.8379 -0.3860 -0.3860 +vn 0.8379 -0.2089 0.5043 +vn 0.8379 0.5043 0.2089 +vn 0.8379 0.5459 0.0000 +vn 0.8379 -0.5043 0.2089 +vn 0.8379 0.3860 0.3860 +vn 0.8379 0.2089 -0.5043 +vn 0.3668 0.3560 -0.8595 +vn 0.8379 -0.5043 -0.2089 +vn 0.8379 0.0000 0.5459 +vn 0.8379 -0.3860 0.3860 +vn 0.8379 0.0000 -0.5459 +vn 0.9487 0.1210 -0.2922 +vn 0.9487 0.1210 0.2922 +vn 0.9487 -0.2236 -0.2236 +vn 0.9487 0.2236 0.2236 +vn 0.9487 -0.2922 -0.1210 +vn 0.9487 0.2922 0.1210 +vn 0.9487 -0.3162 0.0000 +vn 0.9487 0.3162 0.0000 +vn 0.9487 -0.2922 0.1210 +vn 0.9487 0.2922 -0.1210 +vn 0.9487 -0.2236 0.2236 +vn 0.9487 0.2236 -0.2236 +vn 0.9487 -0.1210 0.2922 +vn 0.9487 0.0000 0.3162 +vn 0.0000 -0.8660 0.5000 +vn 0.0000 0.5000 0.8660 +vn 0.0000 0.8660 0.5000 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 -0.5000 0.8660 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 -0.8660 -0.5000 +vn -0.2425 0.8963 0.3712 +vn -0.2425 -0.8963 0.3713 +vn -0.2425 0.8963 -0.3712 +vn -0.2425 -0.6860 0.6860 +vn -0.2425 -0.8963 0.3712 +vn -0.2425 0.6860 -0.6860 +vn -0.2425 -0.3713 0.8963 +vn -0.2425 0.3712 -0.8963 +vn -0.2425 -0.3712 0.8963 +vn -0.2425 -0.3712 -0.8963 +vn -0.2425 0.3712 0.8963 +vn -0.2425 -0.6860 -0.6860 +vn -0.2425 0.6860 0.6860 +vn -0.2425 -0.8963 -0.3712 +vn -0.2425 -0.8963 -0.3713 +vn 0.4472 0.8944 0.0000 +vn 0.4472 0.8263 0.3423 +vn 0.4472 0.8263 -0.3423 +vn 0.4472 0.6324 -0.6324 +vn 0.4472 0.3423 -0.8263 +vn 0.4472 0.0000 -0.8944 +vn 0.4472 -0.3423 -0.8263 +vn 0.4472 -0.6324 -0.6324 +vn 0.4472 -0.8263 -0.3423 +vn 0.4472 -0.8944 0.0000 +vn 0.4472 -0.8263 0.3423 +vn 0.4472 -0.6324 0.6324 +vn 0.4472 -0.3423 0.8263 +vn 0.4472 0.0000 0.8944 +vn 0.4472 0.3423 0.8263 +vn 0.4472 0.6324 0.6324 +vn -0.8660 0.5000 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.5000 0.8660 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.8660 -0.5000 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.9659 0.2588 0.0000 +vn 0.9659 0.2588 0.0000 +vn 0.7194 0.1447 -0.6794 +vn 0.5293 0.5293 -0.6630 +vn 0.0196 0.0473 -0.9987 +vn -0.4617 -0.4617 -0.7573 +vn -0.1363 -0.6737 -0.7263 +vn 0.1363 -0.6737 -0.7263 +vn -0.0196 0.0473 -0.9987 +vn 0.0473 0.0196 -0.9987 +vn 0.0670 0.0670 -0.9955 +vn 0.1447 0.7194 -0.6794 +vn 0.2048 -0.9788 0.0000 +vn 0.0473 0.0196 0.9987 +vn 0.5293 0.5293 0.6630 +vn 0.0670 0.0670 0.9955 +vn 0.1866 0.9824 0.0000 +vn -0.2048 -0.9788 0.0000 +vn 0.1363 -0.6737 0.7263 +vn -0.4617 -0.4617 0.7573 +vn -0.6737 -0.1363 0.7263 +vn 0.1447 0.7194 0.6794 +vn -0.1363 -0.6737 0.7263 +vn -0.0196 0.0473 0.9987 +vn -0.9788 -0.2048 0.0000 +vn 0.0196 0.0473 0.9987 +vn -0.1447 0.7194 0.6794 +vn -0.6737 -0.1363 -0.7263 +vn -0.1866 0.9824 0.0000 +vn -0.1447 0.7194 -0.6794 +vn 0.7194 0.1447 0.6794 +vn 0.3800 -0.5727 -0.7263 +vn 0.9824 0.1866 0.0000 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.5628 0.8266 0.0000 +vn -0.5000 0.5000 -0.7071 +vn -0.7071 0.7071 0.0000 +vn 0.5473 -0.8369 0.0000 +vn 0.3800 -0.5727 0.7263 +vn -0.4063 0.6110 0.6794 +vn -0.4063 0.6110 -0.6794 +vn 0.7071 -0.7071 0.0000 +vn -0.5000 0.5000 0.7071 +vn 0.5000 -0.5000 0.7071 +vn 0.5000 -0.5000 -0.7071 +vn -0.6830 0.6294 0.3706 +vn -0.6830 0.3706 0.6294 +vn -0.5000 0.1464 0.8535 +vn -0.1830 0.0170 0.9829 +vn -0.8660 0.3535 -0.3535 +vn 0.8660 0.3535 -0.3535 +vn -0.8660 -0.3535 0.3535 +vn 0.5000 0.6124 -0.6124 +vn 0.8660 -0.3535 0.3535 +vn -0.5000 -0.6124 0.6124 +vn 0.7849 -0.3660 0.5000 +vn -0.4531 0.2113 0.8660 +vn -0.7849 0.3660 -0.5000 +vn 0.7849 -0.3660 -0.5000 +vn 0.4531 -0.2113 0.8660 +vn -0.7849 0.3660 0.5000 +vn 0.4531 -0.2113 -0.8660 +vn -0.4531 0.2113 -0.8660 +vn 0.2988 0.6408 -0.7071 +vn -0.4226 -0.9063 0.0000 +vn -0.2988 -0.6408 -0.7071 +vn -0.2988 -0.6408 0.7071 +vn 0.2988 0.6408 0.7071 +vn 0.7071 -0.6408 0.2988 +vn 0.0000 -0.9063 0.4226 +vn -0.7071 0.6408 -0.2988 +vn -0.7071 -0.6408 0.2988 +vn 0.0000 0.9063 -0.4226 +vn 0.7071 0.6408 -0.2988 +vn 0.7071 0.6409 -0.2988 +vn -0.5000 0.8535 0.1464 +vn 0.1830 0.0170 0.9829 +vn 0.5000 0.1464 0.8535 +vn 0.6830 0.3706 0.6294 +vn 0.6830 0.6294 0.3706 +vn 0.5000 0.8535 0.1464 +vn 0.1830 0.9829 0.0170 +vn -0.1830 0.9829 0.0170 +vn 0.4258 -0.8359 0.3462 +vn 0.6788 -0.5192 0.5192 +vn 0.4258 -0.6398 0.6398 +vn 0.6788 0.6784 0.2810 +vn 0.9665 0.1814 0.1814 +vn 0.9665 0.2370 0.0982 +vn 0.4258 0.6398 -0.6398 +vn 0.6788 0.6784 -0.2810 +vn 0.6788 0.5192 -0.5192 +vn 0.4258 -0.3462 0.8359 +vn 0.6788 -0.2810 0.6784 +vn 0.4258 0.3462 -0.8359 +vn 0.6788 0.2810 -0.6784 +vn 0.6788 0.0000 0.7343 +vn 0.4258 0.0000 0.9048 +vn 0.4258 0.0000 -0.9048 +vn 0.6788 -0.2810 -0.6784 +vn 0.4258 -0.3462 -0.8359 +vn 0.6788 0.0000 -0.7343 +vn 0.4258 0.3462 0.8359 +vn 0.6788 0.2810 0.6784 +vn 0.6788 -0.5192 -0.5192 +vn 0.4258 -0.6398 -0.6398 +vn 0.4258 0.6398 0.6398 +vn 0.6788 0.5192 0.5192 +vn 0.4258 -0.8359 -0.3462 +vn 0.6788 -0.6784 -0.2810 +vn 0.4258 0.8359 0.3462 +vn 0.6788 -0.7343 0.0000 +vn 0.4258 -0.9048 0.0000 +vn 0.6788 0.7343 0.0000 +vn 0.4258 0.9048 0.0000 +vn 0.6788 -0.6784 0.2810 +vn 0.4258 0.8359 -0.3462 +vn 0.9665 -0.2566 0.0000 +vn 0.9665 0.2566 0.0000 +vn 0.9665 -0.2370 0.0982 +vn 0.9665 0.2370 -0.0982 +vn 0.9665 -0.1814 0.1814 +vn 0.9665 0.1814 -0.1814 +vn 0.9665 -0.0982 0.2370 +vn 0.9665 0.0982 -0.2370 +vn 0.9665 0.0000 0.2566 +vn 0.9665 -0.0982 -0.2370 +vn 0.9665 0.0000 -0.2566 +vn 0.9665 0.0982 0.2370 +vn 0.9665 -0.1814 -0.1814 +vn 0.9665 -0.2370 -0.0982 +vn -0.9659 -0.1830 0.1830 +vn 0.9659 0.1830 -0.1830 +vn -0.7071 0.5000 -0.5000 +vn 0.7071 -0.5000 0.5000 +s off +f 2299/1246/673 2301/1247/673 2293/1248/673 +f 1129/1249/673 1128/1250/673 1140/1251/673 +f 1128/1250/673 1139/1252/673 1140/1253/673 +f 1139/1254/673 1126/1255/673 1138/1256/673 +f 1126/1255/673 1137/1257/673 1138/1258/673 +f 1137/1259/673 1124/1260/673 1136/1261/673 +f 1124/1260/673 1135/1262/673 1136/1263/673 +f 1123/1264/673 1134/1265/673 1135/1266/673 +f 1122/1267/673 1133/1268/673 1134/1269/673 +f 1121/1270/673 1132/1271/673 1133/1272/673 +f 1132/1273/673 1119/1274/673 1131/1275/673 +f 1119/1274/673 1130/1276/673 1131/1277/673 +f 1148/1278/674 1146/1279/674 1144/1280/674 +f 1130/1281/673 1117/1282/673 1129/1283/673 +f 1167/1284/675 1166/1285/675 1165/1286/675 +f 1171/1287/674 1169/1288/674 1170/1289/674 +f 1167/1284/676 1172/1290/676 1168/1291/676 +f 1166/1285/677 1170/1292/677 1165/1286/677 +f 1171/1287/678 1174/1293/678 1172/1294/678 +f 1165/1286/678 1169/1288/678 1167/1284/678 +f 1177/1295/675 1179/1296/675 1180/1297/675 +f 1176/1298/679 1186/1299/679 1178/1300/679 +f 1179/1301/680 1182/1302/680 1180/1303/680 +f 1182/1302/681 1166/1285/681 1168/1291/681 +f 1179/1304/677 1175/1305/677 1173/1306/677 +f 1176/1298/676 1180/1307/676 1174/1293/676 +f 1179/1301/677 1173/1308/677 1171/1309/677 +f 1182/1302/676 1172/1310/676 1180/1303/676 +f 1183/1311/680 1186/1312/680 1184/1313/680 +f 1177/1314/682 1183/1315/682 1175/1305/682 +f 1176/1298/674 1174/1293/674 1173/1306/674 +f 2055/1316/675 2037/1317/675 2038/1318/675 +f 2054/1319/675 2039/1320/675 2037/1317/675 +f 2039/1320/675 2068/1321/675 2052/1322/675 +f 2068/1323/675 2051/1324/675 2052/1322/675 +f 2051/1324/675 2066/1325/675 2050/1326/675 +f 2066/1327/675 2049/1328/675 2050/1326/675 +f 2049/1328/675 2064/1329/675 2048/1330/675 +f 2064/1331/675 2047/1332/675 2048/1330/675 +f 2063/1333/675 2046/1334/675 2047/1332/675 +f 2062/1335/675 2045/1336/675 2046/1334/675 +f 2061/1337/675 2044/1338/675 2045/1336/675 +f 2060/1339/675 2043/1340/675 2044/1338/675 +f 2059/1341/675 2042/1342/675 2043/1340/675 +f 2058/1343/675 2041/1344/675 2042/1342/675 +f 2057/1345/675 2040/1346/675 2041/1347/675 +f 2040/1346/675 2055/1348/675 2038/1318/675 +f 2097/1349/674 1207/1350/674 1206/1351/674 +f 1205/1352/674 2097/1349/674 1206/1353/674 +f 2099/1354/674 1205/1355/674 1204/1356/674 +f 2100/1357/674 1204/1358/674 1203/1359/674 +f 2085/1360/674 1203/1361/674 1218/1362/674 +f 2086/1363/674 1218/1364/674 1217/1365/674 +f 2087/1366/674 1217/1367/674 1216/1368/674 +f 2088/1369/674 1216/1370/674 1215/1371/674 +f 2089/1372/674 1215/1373/674 1214/1374/674 +f 1213/1375/674 2089/1376/674 1214/1377/674 +f 2091/1378/674 1213/1379/674 1212/1380/674 +f 1211/1381/674 2091/1378/674 1212/1382/674 +f 2093/1383/674 1211/1384/674 1210/1385/674 +f 2094/1386/674 1210/1387/674 1209/1388/674 +f 1208/1389/674 2094/1386/674 1209/1390/674 +f 1207/1391/674 2095/1392/674 1208/1393/674 +f 2113/1394/675 2128/1395/675 2112/1396/675 +f 2130/1397/675 2113/1394/675 2114/1398/675 +f 2131/1399/675 2114/1398/675 2115/1400/675 +f 2132/1401/675 2115/1400/675 2116/1402/675 +f 2101/1403/675 2132/1404/675 2116/1402/675 +f 2118/1405/675 2101/1403/675 2102/1406/675 +f 2119/1407/675 2102/1406/675 2103/1408/675 +f 2120/1409/675 2103/1408/675 2104/1410/675 +f 2121/1411/675 2104/1410/675 2105/1412/675 +f 2122/1413/675 2105/1414/675 2106/1415/675 +f 2107/1416/675 2122/1417/675 2106/1415/675 +f 2124/1418/675 2107/1416/675 2108/1419/675 +f 2125/1420/675 2108/1419/675 2109/1421/675 +f 2126/1422/675 2109/1421/675 2110/1423/675 +f 2127/1424/675 2110/1423/675 2111/1425/675 +f 2128/1426/675 2111/1425/675 2112/1396/675 +f 1268/1427/673 1269/1428/673 1267/1429/673 +f 1270/1430/683 1271/1431/683 1269/1428/683 +f 1274/1432/684 1275/1433/684 1273/1434/684 +f 1276/1435/685 1277/1436/685 1275/1433/685 +f 1280/1437/686 1281/1438/686 1279/1439/686 +f 1282/1440/687 1283/1441/687 1281/1438/687 +f 1286/1442/688 1287/1443/688 1285/1444/688 +f 1288/1445/689 1289/1446/689 1287/1443/689 +f 2169/1447/675 2184/1448/675 2168/1449/675 +f 2175/1450/675 2192/1451/675 2191/1452/675 +f 2168/1449/675 2183/1453/675 2167/1454/675 +f 2175/1450/675 2190/1455/675 2174/1456/675 +f 2167/1454/675 2182/1457/675 2166/1458/675 +f 2173/1459/675 2190/1460/675 2189/1461/675 +f 2165/1462/675 2196/1463/675 2180/1464/675 +f 2166/1458/675 2181/1465/675 2165/1462/675 +f 2172/1466/675 2189/1467/675 2188/1468/675 +f 2180/1464/675 2195/1469/675 2179/1470/675 +f 2171/1471/675 2188/1472/675 2187/1473/675 +f 2179/1470/675 2194/1474/675 2178/1475/675 +f 2171/1471/675 2186/1476/675 2170/1477/675 +f 2177/1478/675 2194/1479/675 2193/1480/675 +f 2170/1477/675 2185/1481/675 2169/1482/675 +f 2177/1478/675 2192/1483/675 2176/1484/675 +f 2231/1485/674 2214/1486/674 2215/1487/674 +f 2230/1488/674 2213/1489/674 2214/1490/674 +f 2229/1491/674 2228/1492/674 2213/1493/674 +f 2228/1494/674 2243/1495/674 2227/1496/674 +f 2243/1495/674 2226/1497/674 2227/1498/674 +f 2226/1499/674 2241/1500/674 2225/1501/674 +f 2241/1500/674 2224/1502/674 2225/1503/674 +f 2224/1504/674 2239/1505/674 2223/1506/674 +f 2223/1507/674 2238/1508/674 2222/1509/674 +f 2222/1510/674 2237/1511/674 2221/1512/674 +f 2221/1513/674 2236/1514/674 2220/1515/674 +f 2220/1516/674 2235/1517/674 2219/1518/674 +f 2235/1517/674 2218/1519/674 2219/1520/674 +f 2218/1521/674 2233/1522/674 2217/1523/674 +f 2217/1524/674 2232/1525/674 2216/1526/674 +f 2200/1527/675 2204/1528/675 2208/1529/675 +f 2232/1525/674 2215/1530/674 2216/1531/674 +f 1523/1532/686 1525/1533/686 1527/1534/686 +f 1533/1535/673 1536/1536/673 1535/1537/673 +f 1526/1538/674 1539/1539/674 1530/1540/674 +f 1531/1541/675 1537/1542/675 1527/1543/675 +f 1550/1544/675 1544/1545/675 1554/1546/675 +f 1555/1547/674 1542/1548/674 1551/1549/674 +f 1548/1550/673 1545/1551/673 1546/1552/673 +f 1558/1553/686 1556/1554/686 1554/1555/686 +f 2401/1556/673 2378/1557/673 2377/1558/673 +f 2378/1559/673 2403/1560/673 2379/1561/673 +f 2379/1562/673 2404/1563/673 2380/1564/673 +f 2380/1565/673 2405/1566/673 2381/1567/673 +f 2381/1568/673 2406/1569/673 2382/1570/673 +f 2382/1571/673 2407/1572/673 2383/1573/673 +f 2383/1574/673 2408/1575/673 2384/1576/673 +f 2408/1575/673 2385/1577/673 2384/1578/673 +f 2385/1579/673 2410/1580/673 2386/1581/673 +f 2410/1580/673 2387/1582/673 2386/1583/673 +f 2411/1584/673 2388/1585/673 2387/1586/673 +f 2412/1587/673 2377/1588/673 2388/1589/673 +f 2395/1590/673 2397/1591/673 2389/1592/673 +f 1696/1593/690 1703/1594/690 1702/1595/690 +f 1699/1596/691 1706/1597/691 1705/1598/691 +f 1698/1599/692 1703/1594/692 1697/1600/692 +f 1696/1593/693 1701/1601/693 1695/1602/693 +f 1695/1602/694 1706/1597/694 1700/1603/694 +f 1699/1596/695 1704/1604/695 1698/1605/695 +f 1701/1601/678 1707/1606/678 1718/1607/678 +f 1706/1597/678 1717/1608/678 1716/1609/678 +f 1705/1598/678 1715/1610/678 1714/1611/678 +f 1704/1612/678 1713/1613/678 1712/1614/678 +f 1703/1594/678 1711/1615/678 1710/1616/678 +f 1702/1595/678 1709/1617/678 1708/1618/678 +f 1729/1619/678 1719/1620/678 1723/1621/678 +f 1744/1622/680 1747/1623/680 1745/1624/680 +f 1736/1625/680 1734/1626/680 1735/1627/680 +f 1732/1628/680 1737/1629/680 1731/1630/680 +f 1741/1631/680 1732/1628/680 1733/1632/680 +f 1734/1626/680 1740/1633/680 1733/1634/680 +f 1741/1635/680 1733/1636/680 1740/1637/680 +f 1743/1638/680 1740/1637/680 1742/1639/680 +f 1753/1640/680 1751/1641/680 1752/1642/680 +f 1749/1643/680 1754/1644/680 1748/1645/680 +f 1758/1646/680 1749/1643/680 1750/1647/680 +f 1751/1641/680 1757/1648/680 1750/1649/680 +f 1758/1650/680 1750/1651/680 1757/1652/680 +f 1759/1653/680 1758/1650/680 1757/1652/680 +f 1764/1654/678 1766/1655/678 1765/1656/678 +f 1767/1657/678 1761/1658/678 1762/1659/678 +f 1761/1658/678 1771/1660/678 1763/1661/678 +f 1764/1654/678 1770/1662/678 1768/1663/678 +f 1771/1664/678 1770/1665/678 1763/1666/678 +f 1770/1665/678 1773/1667/678 1772/1668/678 +f 1777/1669/678 1779/1670/678 1778/1671/678 +f 1780/1672/678 1774/1673/678 1775/1674/678 +f 1774/1673/678 1784/1675/678 1776/1676/678 +f 1777/1669/678 1783/1677/678 1781/1678/678 +f 1784/1679/678 1783/1680/678 1776/1681/678 +f 1785/1682/678 1784/1679/678 1786/1683/678 +f 1734/1684/693 1763/1685/693 1764/1686/693 +f 1749/1687/692 1776/1688/692 1750/1689/692 +f 1742/1690/691 1770/1662/691 1772/1691/691 +f 1758/1646/696 1782/1692/696 1756/1693/696 +f 1734/1684/690 1765/1694/690 1735/1695/690 +f 1751/1696/695 1776/1697/695 1777/1698/695 +f 1741/1631/690 1773/1699/690 1771/1660/690 +f 1757/1648/690 1785/1700/690 1759/1701/690 +f 1735/1695/697 1766/1655/697 1736/1625/697 +f 1752/1702/691 1777/1698/691 1778/1703/691 +f 1760/1704/691 1784/1675/691 1758/1646/691 +f 1737/1629/698 1762/1705/698 1731/1706/698 +f 1753/1640/699 1778/1703/699 1779/1670/699 +f 1736/1625/691 1768/1663/691 1738/1707/691 +f 1754/1644/700 1775/1708/700 1748/1709/700 +f 1737/1629/690 1769/1710/690 1767/1657/690 +f 1755/1711/690 1779/1670/690 1781/1678/690 +f 1732/1712/691 1762/1705/691 1761/1713/691 +f 1738/1707/701 1770/1662/701 1740/1633/701 +f 1756/1693/691 1780/1672/691 1754/1644/691 +f 1732/1712/694 1763/1714/694 1733/1715/694 +f 1748/1709/690 1774/1716/690 1749/1687/690 +f 1741/1631/702 1769/1710/702 1739/1717/702 +f 1755/1711/703 1783/1677/703 1757/1648/703 +f 1788/1718/678 1790/1719/678 1787/1720/678 +f 1747/1623/691 1789/1721/691 1745/1624/691 +f 1746/1722/690 1788/1718/690 1787/1720/690 +f 1746/1723/704 1790/1719/704 1747/1724/704 +f 1745/1725/705 1788/1718/705 1744/1726/705 +f 2341/1727/678 2366/1728/678 2342/1729/678 +f 2342/1730/678 2367/1731/678 2343/1732/678 +f 2343/1733/678 2368/1734/678 2344/1735/678 +f 2344/1736/678 2369/1737/678 2345/1738/678 +f 2345/1739/678 2370/1740/678 2346/1741/678 +f 2346/1742/678 2371/1743/678 2347/1744/678 +f 2347/1745/678 2372/1746/678 2348/1747/678 +f 2372/1746/678 2349/1748/678 2348/1749/678 +f 2349/1750/678 2374/1751/678 2350/1752/678 +f 2374/1751/678 2351/1753/678 2350/1754/678 +f 2375/1755/678 2352/1756/678 2351/1757/678 +f 2376/1758/678 2341/1759/678 2352/1760/678 +f 2355/1761/678 2357/1762/678 2361/1763/678 +f 1856/1764/706 1857/1765/706 1855/1766/706 +f 1859/1767/707 1861/1768/707 1860/1769/707 +f 1857/1770/708 1862/1771/708 1859/1767/708 +f 1855/1772/709 1861/1768/709 1856/1773/709 +f 1856/1764/710 1864/1774/710 1858/1775/710 +f 1855/1766/710 1859/1767/710 1860/1769/710 +f 1867/1776/707 1869/1777/707 1870/1778/707 +f 1869/1779/711 1872/1780/711 1870/1781/711 +f 1862/1771/712 1871/1782/712 1861/1768/712 +f 1869/1779/709 1863/1783/709 1856/1784/709 +f 1872/1780/708 1858/1785/708 1870/1781/708 +f 1866/1786/708 1870/1787/708 1864/1774/708 +f 1869/1788/709 1865/1789/709 1863/1790/709 +f 1873/1791/711 1876/1792/711 1874/1793/711 +f 1868/1794/713 1874/1795/713 1876/1796/713 +f 1867/1797/673 1873/1798/673 1865/1789/673 +f 1866/1786/706 1864/1774/706 1863/1790/706 +f 2312/1799/713 2323/1800/713 2311/1801/713 +f 2311/1801/713 2322/1802/713 2310/1803/713 +f 2310/1803/713 2321/1804/713 2309/1805/713 +f 2309/1805/713 2320/1806/713 2308/1807/713 +f 2307/1808/713 2320/1809/713 2319/1810/713 +f 2307/1808/713 2318/1811/713 2306/1812/713 +f 2305/1813/713 2318/1814/713 2317/1815/713 +f 2305/1813/713 2328/1816/713 2316/1817/713 +f 2315/1818/713 2328/1819/713 2327/1820/713 +f 2314/1821/713 2327/1822/713 2326/1823/713 +f 2314/1824/713 2325/1825/713 2313/1826/713 +f 2313/1826/713 2324/1827/713 2312/1799/713 +f 2333/1828/713 2337/1829/713 2329/1830/713 +f 2561/1831/706 2560/1832/706 2559/1833/706 +f 1925/1834/674 1976/1835/674 1936/1836/674 +f 1941/1837/675 1939/1838/675 1947/1839/675 +f 1927/1840/674 1956/1841/674 1926/1842/674 +f 1930/1843/674 1950/1844/674 1951/1845/674 +f 1935/1846/674 1974/1847/674 1934/1848/674 +f 1928/1849/674 1952/1850/674 1953/1851/674 +f 1933/1852/674 1974/1853/674 1973/1854/674 +f 1927/1840/674 1953/1851/674 1954/1855/674 +f 1932/1856/674 1950/1844/674 1931/1857/674 +f 1936/1836/674 1975/1858/674 1935/1846/674 +f 1926/1842/674 1955/1859/674 1925/1834/674 +f 1933/1852/674 1949/1860/674 1932/1856/674 +f 1929/1861/674 1951/1845/674 1952/1850/674 +f 1979/1862/674 1977/1863/674 1983/1864/674 +f 2475/1865/686 2483/1866/686 2491/1867/686 +f 2465/1868/674 2467/1869/674 2461/1870/674 +f 2490/1871/673 2482/1872/673 2474/1873/673 +f 2593/1874/688 2595/1875/688 2590/1876/688 +f 2584/1877/714 2586/1878/714 2588/1879/714 +f 2568/1880/715 2577/1881/715 2576/1882/715 +f 2571/1883/715 2578/1884/715 2570/1885/715 +f 2572/1886/715 2573/1887/715 2580/1888/715 +f 2566/1889/715 2573/1887/715 2565/1890/715 +f 2567/1891/715 2576/1882/715 2575/1892/715 +f 2570/1885/715 2577/1881/715 2569/1893/715 +f 2571/1883/715 2580/1888/715 2579/1894/715 +f 2567/1895/715 2574/1896/715 2566/1889/715 +f 2285/1897/674 2283/1898/674 2279/1899/674 +f 2555/1900/686 2532/1901/686 2556/1902/686 +f 2555/1903/686 2530/1904/686 2531/1905/686 +f 2553/1906/686 2530/1904/686 2554/1907/686 +f 2553/1908/686 2528/1909/686 2529/1910/686 +f 2552/1911/686 2527/1912/686 2528/1909/686 +f 2551/1913/686 2526/1914/686 2527/1912/686 +f 2550/1915/686 2525/1916/686 2526/1917/686 +f 2548/1918/686 2525/1916/686 2549/1919/686 +f 2548/1920/686 2523/1921/686 2524/1922/686 +f 2546/1923/686 2523/1921/686 2547/1924/686 +f 2545/1925/686 2522/1926/686 2546/1927/686 +f 2556/1928/686 2521/1929/686 2545/1930/686 +f 2534/1931/686 2538/1932/686 2542/1933/686 +f 2293/1248/673 2294/1934/673 2295/1935/673 +f 2295/1935/673 2296/1936/673 2297/1937/673 +f 2297/1937/673 2298/1938/673 2299/1246/673 +f 2299/1246/673 2300/1939/673 2301/1247/673 +f 2301/1247/673 2302/1940/673 2293/1248/673 +f 2302/1940/673 2303/1941/673 2293/1248/673 +f 2303/1941/673 2304/1942/673 2293/1248/673 +f 2293/1248/673 2295/1935/673 2297/1937/673 +f 2297/1937/673 2299/1246/673 2293/1248/673 +f 1129/1249/673 1117/1282/673 1128/1250/673 +f 1128/1250/673 1127/1943/673 1139/1252/673 +f 1139/1254/673 1127/1943/673 1126/1255/673 +f 1126/1255/673 1125/1944/673 1137/1257/673 +f 1137/1259/673 1125/1944/673 1124/1260/673 +f 1124/1260/673 1123/1264/673 1135/1262/673 +f 1123/1264/673 1122/1945/673 1134/1265/673 +f 1122/1267/673 1121/1270/673 1133/1268/673 +f 1121/1270/673 1120/1946/673 1132/1271/673 +f 1132/1273/673 1120/1946/673 1119/1274/673 +f 1119/1274/673 1118/1947/673 1130/1276/673 +f 1148/1278/674 1147/1948/674 1146/1279/674 +f 1146/1279/674 1145/1949/674 1144/1280/674 +f 1144/1280/674 1143/1950/674 1148/1278/674 +f 1143/1950/674 1142/1951/674 1148/1278/674 +f 1142/1951/674 1141/1952/674 1148/1278/674 +f 1130/1281/673 1118/1947/673 1117/1282/673 +f 1167/1284/675 1168/1291/675 1166/1285/675 +f 1171/1287/674 1172/1294/674 1169/1288/674 +f 1167/1284/676 1169/1953/676 1172/1290/676 +f 1166/1285/677 1171/1954/677 1170/1292/677 +f 1171/1287/678 1173/1306/678 1174/1293/678 +f 1165/1286/678 1170/1289/678 1169/1288/678 +f 1180/1297/675 1178/1955/675 1177/1295/675 +f 1178/1955/675 1186/1312/675 1177/1295/675 +f 1186/1312/675 1185/1956/675 1177/1295/675 +f 1176/1298/679 1184/1313/679 1186/1299/679 +f 1179/1301/680 1181/1957/680 1182/1302/680 +f 1182/1302/681 1181/1957/681 1166/1285/681 +f 1179/1304/677 1177/1314/677 1175/1305/677 +f 1176/1298/676 1178/1300/676 1180/1307/676 +f 1171/1309/677 1166/1958/677 1181/1957/677 +f 1181/1957/677 1179/1301/677 1171/1309/677 +f 1168/1959/676 1172/1310/676 1182/1302/676 +f 1172/1310/676 1174/1960/676 1180/1303/676 +f 1183/1311/680 1185/1956/680 1186/1312/680 +f 1177/1314/682 1185/1961/682 1183/1315/682 +f 1173/1306/674 1175/1305/674 1176/1298/674 +f 1175/1305/674 1183/1311/674 1176/1298/674 +f 1183/1311/674 1184/1313/674 1176/1298/674 +f 2055/1316/675 2054/1962/675 2037/1317/675 +f 2054/1319/675 2053/1963/675 2039/1320/675 +f 2039/1320/675 2053/1964/675 2068/1321/675 +f 2068/1323/675 2067/1965/675 2051/1324/675 +f 2051/1324/675 2067/1966/675 2066/1325/675 +f 2066/1327/675 2065/1967/675 2049/1328/675 +f 2049/1328/675 2065/1968/675 2064/1329/675 +f 2064/1331/675 2063/1969/675 2047/1332/675 +f 2063/1333/675 2062/1970/675 2046/1334/675 +f 2062/1335/675 2061/1971/675 2045/1336/675 +f 2061/1337/675 2060/1972/675 2044/1338/675 +f 2060/1339/675 2059/1973/675 2043/1340/675 +f 2059/1341/675 2058/1974/675 2042/1342/675 +f 2058/1343/675 2057/1975/675 2041/1344/675 +f 2057/1345/675 2056/1976/675 2040/1346/675 +f 2040/1346/675 2056/1977/675 2055/1348/675 +f 2097/1349/674 2096/1978/674 1207/1350/674 +f 1205/1352/674 2098/1979/674 2097/1349/674 +f 2099/1354/674 2098/1979/674 1205/1355/674 +f 2100/1357/674 2099/1354/674 1204/1358/674 +f 2085/1360/674 2100/1357/674 1203/1361/674 +f 2086/1363/674 2085/1360/674 1218/1364/674 +f 2087/1366/674 2086/1363/674 1217/1367/674 +f 2088/1369/674 2087/1366/674 1216/1370/674 +f 2089/1372/674 2088/1369/674 1215/1373/674 +f 1213/1375/674 2090/1980/674 2089/1376/674 +f 2091/1378/674 2090/1980/674 1213/1379/674 +f 1211/1381/674 2092/1981/674 2091/1378/674 +f 2093/1383/674 2092/1981/674 1211/1384/674 +f 2094/1386/674 2093/1383/674 1210/1387/674 +f 1208/1389/674 2095/1392/674 2094/1386/674 +f 1207/1391/674 2096/1978/674 2095/1392/674 +f 2113/1394/675 2129/1982/675 2128/1395/675 +f 2130/1397/675 2129/1983/675 2113/1394/675 +f 2131/1399/675 2130/1984/675 2114/1398/675 +f 2132/1401/675 2131/1985/675 2115/1400/675 +f 2101/1403/675 2117/1986/675 2132/1404/675 +f 2118/1405/675 2117/1987/675 2101/1403/675 +f 2119/1407/675 2118/1988/675 2102/1406/675 +f 2120/1409/675 2119/1989/675 2103/1408/675 +f 2121/1411/675 2120/1990/675 2104/1410/675 +f 2122/1413/675 2121/1991/675 2105/1414/675 +f 2107/1416/675 2123/1992/675 2122/1417/675 +f 2124/1418/675 2123/1993/675 2107/1416/675 +f 2125/1420/675 2124/1994/675 2108/1419/675 +f 2126/1422/675 2125/1995/675 2109/1421/675 +f 2127/1424/675 2126/1996/675 2110/1423/675 +f 2128/1426/675 2127/1997/675 2111/1425/675 +f 1268/1427/673 1270/1430/673 1269/1428/673 +f 1270/1430/683 1272/1998/683 1271/1431/683 +f 1274/1432/684 1276/1435/684 1275/1433/684 +f 1276/1435/685 1278/1999/685 1277/1436/685 +f 1280/1437/686 1282/1440/686 1281/1438/686 +f 1282/1440/687 1284/2000/687 1283/1441/687 +f 1286/1442/688 1288/1445/688 1287/1443/688 +f 1288/1445/689 1290/2001/689 1289/1446/689 +f 2169/1447/675 2185/2002/675 2184/1448/675 +f 2175/1450/675 2176/1484/675 2192/1451/675 +f 2168/1449/675 2184/2003/675 2183/1453/675 +f 2175/1450/675 2191/2004/675 2190/1455/675 +f 2167/1454/675 2183/2005/675 2182/1457/675 +f 2173/1459/675 2174/1456/675 2190/1460/675 +f 2165/1462/675 2181/2006/675 2196/1463/675 +f 2166/1458/675 2182/2007/675 2181/1465/675 +f 2172/1466/675 2173/1459/675 2189/1467/675 +f 2180/1464/675 2196/2008/675 2195/1469/675 +f 2171/1471/675 2172/1466/675 2188/1472/675 +f 2179/1470/675 2195/2009/675 2194/1474/675 +f 2171/1471/675 2187/2010/675 2186/1476/675 +f 2177/1478/675 2178/1475/675 2194/1479/675 +f 2170/1477/675 2186/2011/675 2185/1481/675 +f 2177/1478/675 2193/2012/675 2192/1483/675 +f 2231/1485/674 2230/1488/674 2214/1486/674 +f 2230/1488/674 2229/1491/674 2213/1489/674 +f 2229/1491/674 2244/2013/674 2228/1492/674 +f 2228/1494/674 2244/2013/674 2243/1495/674 +f 2243/1495/674 2242/2014/674 2226/1497/674 +f 2226/1499/674 2242/2014/674 2241/1500/674 +f 2241/1500/674 2240/2015/674 2224/1502/674 +f 2224/1504/674 2240/2015/674 2239/1505/674 +f 2223/1507/674 2239/1505/674 2238/1508/674 +f 2222/1510/674 2238/1508/674 2237/1511/674 +f 2221/1513/674 2237/1511/674 2236/1514/674 +f 2220/1516/674 2236/1514/674 2235/1517/674 +f 2235/1517/674 2234/2016/674 2218/1519/674 +f 2218/1521/674 2234/2016/674 2233/1522/674 +f 2217/1524/674 2233/2017/674 2232/1525/674 +f 2212/2018/675 2197/2019/675 2198/2020/675 +f 2198/2020/675 2199/2021/675 2212/2018/675 +f 2199/2021/675 2200/1527/675 2212/2018/675 +f 2200/1527/675 2201/2022/675 2202/2023/675 +f 2202/2023/675 2203/2024/675 2200/1527/675 +f 2203/2024/675 2204/1528/675 2200/1527/675 +f 2204/1528/675 2205/2025/675 2208/1529/675 +f 2205/2025/675 2206/2026/675 2208/1529/675 +f 2206/2026/675 2207/2027/675 2208/1529/675 +f 2208/1529/675 2209/2028/675 2212/2018/675 +f 2209/2028/675 2210/2029/675 2212/2018/675 +f 2210/2029/675 2211/2030/675 2212/2018/675 +f 2212/2018/675 2200/1527/675 2208/1529/675 +f 2232/1525/674 2231/1485/674 2215/1530/674 +f 1523/1532/686 1524/2031/686 1525/1533/686 +f 1525/1533/686 1526/1538/686 1527/1534/686 +f 1526/1538/686 1530/1540/686 1527/1534/686 +f 1530/1540/686 1531/2032/686 1527/1534/686 +f 1527/1534/686 1528/2033/686 1529/2034/686 +f 1529/2034/686 1523/1532/686 1527/1534/686 +f 1534/2035/673 1532/2036/673 1533/1535/673 +f 1533/1535/673 1538/2037/673 1536/1536/673 +f 1536/1536/673 1537/1542/673 1535/1537/673 +f 1537/1542/673 1540/2038/673 1535/1537/673 +f 1540/2038/673 1539/1539/673 1535/1537/673 +f 1535/1537/673 1534/2035/673 1533/1535/673 +f 1526/1538/674 1535/1537/674 1539/1539/674 +f 1531/1541/675 1540/2038/675 1537/1542/675 +f 1550/1544/675 1541/2039/675 1544/1545/675 +f 1555/1547/674 1546/1552/674 1542/1548/674 +f 1547/2040/673 1549/2041/673 1548/1550/673 +f 1548/1550/673 1543/2042/673 1545/1551/673 +f 1545/1551/673 1544/1545/673 1546/1552/673 +f 1544/1545/673 1541/2039/673 1546/1552/673 +f 1541/2039/673 1542/1548/673 1546/1552/673 +f 1546/1552/673 1547/2040/673 1548/1550/673 +f 1558/1553/686 1557/2043/686 1556/1554/686 +f 1556/1554/686 1555/1547/686 1554/1555/686 +f 1555/1547/686 1551/1549/686 1554/1555/686 +f 1551/1549/686 1550/2044/686 1554/1555/686 +f 1554/1555/686 1553/2045/686 1552/2046/686 +f 1552/2046/686 1558/1553/686 1554/1555/686 +f 2401/1556/673 2402/2047/673 2378/1557/673 +f 2378/1559/673 2402/2047/673 2403/1560/673 +f 2379/1562/673 2403/1560/673 2404/1563/673 +f 2380/1565/673 2404/1563/673 2405/1566/673 +f 2381/1568/673 2405/1566/673 2406/1569/673 +f 2382/1571/673 2406/1569/673 2407/1572/673 +f 2383/1574/673 2407/2048/673 2408/1575/673 +f 2408/1575/673 2409/2049/673 2385/1577/673 +f 2385/1579/673 2409/2049/673 2410/1580/673 +f 2410/1580/673 2411/1584/673 2387/1582/673 +f 2411/1584/673 2412/1587/673 2388/1585/673 +f 2412/1587/673 2401/1556/673 2377/1588/673 +f 2389/1592/673 2390/2050/673 2391/2051/673 +f 2391/2051/673 2392/2052/673 2393/2053/673 +f 2393/2053/673 2394/2054/673 2395/1590/673 +f 2395/1590/673 2396/2055/673 2397/1591/673 +f 2397/1591/673 2398/2056/673 2389/1592/673 +f 2398/2056/673 2399/2057/673 2389/1592/673 +f 2399/2057/673 2400/2058/673 2389/1592/673 +f 2389/1592/673 2391/2051/673 2393/2053/673 +f 2393/2053/673 2395/1590/673 2389/1592/673 +f 1696/1593/690 1697/1600/690 1703/1594/690 +f 1699/1596/691 1700/1603/691 1706/1597/691 +f 1698/1599/692 1704/1612/692 1703/1594/692 +f 1696/1593/693 1702/1595/693 1701/1601/693 +f 1695/1602/694 1701/1601/694 1706/1597/694 +f 1699/1596/695 1705/1598/695 1704/1604/695 +f 1717/2059/678 1706/1597/678 1718/1607/678 +f 1706/1597/678 1701/1601/678 1718/1607/678 +f 1715/2060/678 1705/1598/678 1716/1609/678 +f 1705/1598/678 1706/1597/678 1716/1609/678 +f 1713/2061/678 1704/1604/678 1714/1611/678 +f 1704/1604/678 1705/1598/678 1714/1611/678 +f 1711/2062/678 1703/1594/678 1712/1614/678 +f 1703/1594/678 1704/1612/678 1712/1614/678 +f 1709/2063/678 1702/1595/678 1710/1616/678 +f 1702/1595/678 1703/1594/678 1710/1616/678 +f 1707/2064/678 1701/1601/678 1708/1618/678 +f 1701/1601/678 1702/1595/678 1708/1618/678 +f 1719/1620/678 1720/2065/678 1723/1621/678 +f 1720/2065/678 1721/2066/678 1723/1621/678 +f 1721/2066/678 1722/2067/678 1723/1621/678 +f 1723/1621/678 1724/2068/678 1727/2069/678 +f 1724/2068/678 1725/2070/678 1727/2069/678 +f 1725/2070/678 1726/2071/678 1727/2069/678 +f 1727/2069/678 1728/2072/678 1729/1619/678 +f 1729/1619/678 1730/2073/678 1719/1620/678 +f 1727/2069/678 1729/1619/678 1723/1621/678 +f 1744/1622/680 1746/2074/680 1747/1623/680 +f 1736/1625/680 1738/1707/680 1734/1626/680 +f 1732/1628/680 1739/1717/680 1737/1629/680 +f 1741/1631/680 1739/1717/680 1732/1628/680 +f 1734/1626/680 1738/1707/680 1740/1633/680 +f 1743/1638/680 1741/1635/680 1740/1637/680 +f 1753/1640/680 1755/1711/680 1751/1641/680 +f 1749/1643/680 1756/1693/680 1754/1644/680 +f 1758/1646/680 1756/1693/680 1749/1643/680 +f 1751/1641/680 1755/1711/680 1757/1648/680 +f 1759/1653/680 1760/2075/680 1758/1650/680 +f 1764/1654/678 1768/1663/678 1766/1655/678 +f 1767/1657/678 1769/1710/678 1761/1658/678 +f 1761/1658/678 1769/1710/678 1771/1660/678 +f 1764/1654/678 1763/2076/678 1770/1662/678 +f 1770/1665/678 1771/1664/678 1773/1667/678 +f 1777/1669/678 1781/1678/678 1779/1670/678 +f 1780/1672/678 1782/1692/678 1774/1673/678 +f 1774/1673/678 1782/1692/678 1784/1675/678 +f 1777/1669/678 1776/2077/678 1783/1677/678 +f 1785/1682/678 1783/1680/678 1784/1679/678 +f 1734/1684/693 1733/2078/693 1763/1685/693 +f 1749/1687/692 1774/1716/692 1776/1688/692 +f 1742/1690/691 1740/1633/691 1770/1662/691 +f 1758/1646/696 1784/1675/696 1782/1692/696 +f 1734/1684/690 1764/1686/690 1765/1694/690 +f 1751/1696/695 1750/2079/695 1776/1697/695 +f 1741/1631/690 1743/2080/690 1773/1699/690 +f 1757/1648/690 1783/1677/690 1785/1700/690 +f 1735/1695/697 1765/1694/697 1766/1655/697 +f 1752/1702/691 1751/1696/691 1777/1698/691 +f 1760/1704/691 1786/2081/691 1784/1675/691 +f 1737/1629/698 1767/1657/698 1762/1705/698 +f 1753/1640/699 1752/1702/699 1778/1703/699 +f 1736/1625/691 1766/1655/691 1768/1663/691 +f 1754/1644/700 1780/1672/700 1775/1708/700 +f 1737/1629/690 1739/1717/690 1769/1710/690 +f 1755/1711/690 1753/1640/690 1779/1670/690 +f 1732/1712/691 1731/1706/691 1762/1705/691 +f 1738/1707/701 1768/1663/701 1770/1662/701 +f 1756/1693/691 1782/1692/691 1780/1672/691 +f 1732/1712/694 1761/1713/694 1763/1714/694 +f 1748/1709/690 1775/1708/690 1774/1716/690 +f 1741/1631/702 1771/1660/702 1769/1710/702 +f 1755/1711/703 1781/1678/703 1783/1677/703 +f 1788/1718/678 1789/1721/678 1790/1719/678 +f 1747/1623/691 1790/1719/691 1789/1721/691 +f 1746/1722/690 1744/2082/690 1788/1718/690 +f 1746/1723/704 1787/1720/704 1790/1719/704 +f 1745/1725/705 1789/1721/705 1788/1718/705 +f 2341/1727/678 2365/2083/678 2366/1728/678 +f 2342/1730/678 2366/1728/678 2367/1731/678 +f 2343/1733/678 2367/1731/678 2368/1734/678 +f 2344/1736/678 2368/1734/678 2369/1737/678 +f 2345/1739/678 2369/1737/678 2370/1740/678 +f 2346/1742/678 2370/1740/678 2371/1743/678 +f 2347/1745/678 2371/2084/678 2372/1746/678 +f 2372/1746/678 2373/2085/678 2349/1748/678 +f 2349/1750/678 2373/2085/678 2374/1751/678 +f 2374/1751/678 2375/1755/678 2351/1753/678 +f 2375/1755/678 2376/1758/678 2352/1756/678 +f 2376/1758/678 2365/2083/678 2341/1759/678 +f 2353/2086/678 2354/2087/678 2355/1761/678 +f 2355/1761/678 2356/2088/678 2357/1762/678 +f 2357/1762/678 2358/2089/678 2359/2090/678 +f 2359/2090/678 2360/2091/678 2357/1762/678 +f 2360/2091/678 2361/1763/678 2357/1762/678 +f 2361/1763/678 2362/2092/678 2353/2086/678 +f 2362/2092/678 2363/2093/678 2353/2086/678 +f 2363/2093/678 2364/2094/678 2353/2086/678 +f 2353/2086/678 2355/1761/678 2361/1763/678 +f 1856/1764/706 1858/1775/706 1857/1765/706 +f 1859/1767/707 1862/1771/707 1861/1768/707 +f 1857/1770/708 1858/2095/708 1862/1771/708 +f 1855/1772/709 1860/1769/709 1861/1768/709 +f 1856/1764/710 1863/1790/710 1864/1774/710 +f 1855/1766/710 1857/1765/710 1859/1767/710 +f 1870/1778/707 1868/2096/707 1867/1776/707 +f 1868/2096/707 1876/1792/707 1867/1776/707 +f 1876/1792/707 1875/2097/707 1867/1776/707 +f 1869/1779/711 1871/1782/711 1872/1780/711 +f 1862/1771/712 1872/1780/712 1871/1782/712 +f 1856/1784/709 1861/2098/709 1871/1782/709 +f 1871/1782/709 1869/1779/709 1856/1784/709 +f 1862/2099/708 1858/1785/708 1872/1780/708 +f 1858/1785/708 1864/2100/708 1870/1781/708 +f 1866/1786/708 1868/1794/708 1870/1787/708 +f 1869/1788/709 1867/1797/709 1865/1789/709 +f 1873/1791/711 1875/2097/711 1876/1792/711 +f 1868/1794/713 1866/1786/713 1874/1795/713 +f 1867/1797/673 1875/2101/673 1873/1798/673 +f 1863/1790/706 1865/1789/706 1866/1786/706 +f 1865/1789/706 1873/1791/706 1866/1786/706 +f 1873/1791/706 1874/1793/706 1866/1786/706 +f 2312/1799/713 2324/2102/713 2323/1800/713 +f 2311/1801/713 2323/2103/713 2322/1802/713 +f 2310/1803/713 2322/2104/713 2321/1804/713 +f 2309/1805/713 2321/2105/713 2320/1806/713 +f 2307/1808/713 2308/1807/713 2320/1809/713 +f 2307/1808/713 2319/2106/713 2318/1811/713 +f 2305/1813/713 2306/1812/713 2318/1814/713 +f 2305/1813/713 2317/2107/713 2328/1816/713 +f 2315/1818/713 2316/1817/713 2328/1819/713 +f 2314/1821/713 2315/1818/713 2327/1822/713 +f 2314/1824/713 2326/2108/713 2325/1825/713 +f 2313/1826/713 2325/2109/713 2324/1827/713 +f 2329/1830/713 2330/2110/713 2331/2111/713 +f 2331/2111/713 2332/2112/713 2333/1828/713 +f 2333/1828/713 2334/2113/713 2335/2114/713 +f 2335/2114/713 2336/2115/713 2337/1829/713 +f 2337/1829/713 2338/2116/713 2329/1830/713 +f 2338/2116/713 2339/2117/713 2329/1830/713 +f 2339/2117/713 2340/2118/713 2329/1830/713 +f 2329/1830/713 2331/2111/713 2333/1828/713 +f 2333/1828/713 2335/2114/713 2337/1829/713 +f 2559/1833/706 2558/2119/706 2563/2120/706 +f 2558/2119/706 2557/2121/706 2563/2120/706 +f 2557/2121/706 2564/2122/706 2563/2120/706 +f 2563/2120/706 2562/2123/706 2559/1833/706 +f 2562/2123/706 2561/1831/706 2559/1833/706 +f 1925/1834/674 1955/1859/674 1976/1835/674 +f 1939/1838/675 1937/2124/675 1947/1839/675 +f 1937/2124/675 1938/2125/675 1947/1839/675 +f 1938/2125/675 1948/2126/675 1947/1839/675 +f 1947/1839/675 1946/2127/675 1945/2128/675 +f 1945/2128/675 1944/2129/675 1943/2130/675 +f 1943/2130/675 1942/2131/675 1941/1837/675 +f 1941/1837/675 1940/2132/675 1939/1838/675 +f 1947/1839/675 1945/2128/675 1943/2130/675 +f 1943/2130/675 1941/1837/675 1947/1839/675 +f 1927/1840/674 1954/1855/674 1956/1841/674 +f 1930/1843/674 1931/1857/674 1950/1844/674 +f 1935/1846/674 1975/1858/674 1974/1847/674 +f 1928/1849/674 1929/1861/674 1952/1850/674 +f 1933/1852/674 1934/2133/674 1974/1853/674 +f 1927/1840/674 1928/1849/674 1953/1851/674 +f 1932/1856/674 1949/1860/674 1950/1844/674 +f 1936/1836/674 1976/1835/674 1975/1858/674 +f 1926/1842/674 1956/1841/674 1955/1859/674 +f 1933/1852/674 1973/1854/674 1949/1860/674 +f 1929/1861/674 1930/1843/674 1951/1845/674 +f 1977/1863/674 1986/2134/674 1985/2135/674 +f 1985/2135/674 1987/2136/674 1983/1864/674 +f 1983/1864/674 1982/2137/674 1984/2138/674 +f 1984/2138/674 1988/2139/674 1983/1864/674 +f 1988/2139/674 1981/2140/674 1983/1864/674 +f 1981/2140/674 1980/2141/674 1979/1862/674 +f 1979/1862/674 1978/2142/674 1977/1863/674 +f 1977/1863/674 1985/2135/674 1983/1864/674 +f 1981/2140/674 1979/1862/674 1983/1864/674 +f 2491/1867/686 2469/2143/686 2471/2144/686 +f 2471/2144/686 2473/2145/686 2475/1865/686 +f 2475/1865/686 2477/2146/686 2479/2147/686 +f 2479/2147/686 2481/2148/686 2483/1866/686 +f 2483/1866/686 2485/2149/686 2487/2150/686 +f 2487/2150/686 2489/2151/686 2491/1867/686 +f 2491/1867/686 2471/2144/686 2475/1865/686 +f 2475/1865/686 2479/2147/686 2483/1866/686 +f 2483/1866/686 2487/2150/686 2491/1867/686 +f 2461/1870/674 2462/2152/674 2463/2153/674 +f 2463/2153/674 2464/2154/674 2465/1868/674 +f 2465/1868/674 2466/2155/674 2467/1869/674 +f 2467/1869/674 2468/2156/674 2461/1870/674 +f 2461/1870/674 2463/2153/674 2465/1868/674 +f 2474/1873/673 2472/2157/673 2470/2158/673 +f 2470/2158/673 2492/2159/673 2474/1873/673 +f 2492/2159/673 2490/1871/673 2474/1873/673 +f 2490/1871/673 2488/2160/673 2486/2161/673 +f 2486/2161/673 2484/2162/673 2490/1871/673 +f 2484/2162/673 2482/1872/673 2490/1871/673 +f 2482/1872/673 2480/2163/673 2474/1873/673 +f 2480/2163/673 2478/2164/673 2474/1873/673 +f 2478/2164/673 2476/2165/673 2474/1873/673 +f 2590/1876/688 2589/2166/688 2591/2167/688 +f 2591/2167/688 2592/2168/688 2593/1874/688 +f 2593/1874/688 2594/2169/688 2595/1875/688 +f 2595/1875/688 2596/2170/688 2590/1876/688 +f 2590/1876/688 2591/2167/688 2593/1874/688 +f 2588/1879/714 2581/2171/714 2582/2172/714 +f 2582/2172/714 2583/2173/714 2588/1879/714 +f 2583/2173/714 2584/1877/714 2588/1879/714 +f 2584/1877/714 2585/2174/714 2586/1878/714 +f 2586/1878/714 2587/2175/714 2588/1879/714 +f 2568/1880/715 2569/1893/715 2577/1881/715 +f 2571/1883/715 2579/1894/715 2578/1884/715 +f 2572/1886/715 2565/1890/715 2573/1887/715 +f 2566/1889/715 2574/1896/715 2573/1887/715 +f 2567/1891/715 2568/1880/715 2576/1882/715 +f 2570/1885/715 2578/1884/715 2577/1881/715 +f 2571/1883/715 2572/1886/715 2580/1888/715 +f 2567/1895/715 2575/2176/715 2574/1896/715 +f 2279/1899/674 2277/2177/674 2278/2178/674 +f 2278/2178/674 2292/2179/674 2291/2180/674 +f 2291/2180/674 2290/2181/674 2289/2182/674 +f 2289/2182/674 2288/2183/674 2287/2184/674 +f 2287/2184/674 2286/2185/674 2285/1897/674 +f 2285/1897/674 2284/2186/674 2283/1898/674 +f 2283/1898/674 2282/2187/674 2279/1899/674 +f 2282/2187/674 2281/2188/674 2279/1899/674 +f 2281/2188/674 2280/2189/674 2279/1899/674 +f 2279/1899/674 2278/2178/674 2287/2184/674 +f 2278/2178/674 2291/2180/674 2287/2184/674 +f 2291/2180/674 2289/2182/674 2287/2184/674 +f 2287/2184/674 2285/1897/674 2279/1899/674 +f 2555/1900/686 2531/1905/686 2532/1901/686 +f 2555/1903/686 2554/2190/686 2530/1904/686 +f 2553/1906/686 2529/1910/686 2530/1904/686 +f 2553/1908/686 2552/2191/686 2528/1909/686 +f 2552/1911/686 2551/2192/686 2527/1912/686 +f 2551/1913/686 2550/2193/686 2526/1914/686 +f 2550/1915/686 2549/2194/686 2525/1916/686 +f 2548/1918/686 2524/1922/686 2525/1916/686 +f 2548/1920/686 2547/2195/686 2523/1921/686 +f 2546/1923/686 2522/1926/686 2523/1921/686 +f 2545/1925/686 2521/1929/686 2522/1926/686 +f 2556/1928/686 2532/1901/686 2521/1929/686 +f 2542/1933/686 2543/2196/686 2534/1931/686 +f 2543/2196/686 2544/2197/686 2534/1931/686 +f 2544/2197/686 2533/2198/686 2534/1931/686 +f 2534/1931/686 2535/2199/686 2538/1932/686 +f 2535/2199/686 2536/2200/686 2538/1932/686 +f 2536/2200/686 2537/2201/686 2538/1932/686 +f 2538/1932/686 2539/2202/686 2542/1933/686 +f 2539/2202/686 2540/2203/686 2542/1933/686 +f 2540/2203/686 2541/2204/686 2542/1933/686 +s 1 +f 1054/2205/716 1055/2206/717 1053/2207/686 +f 1056/2208/718 1057/2209/680 1055/2206/717 +f 1058/2210/719 1059/2211/720 1057/2209/680 +f 1060/2212/721 1061/2213/684 1059/2211/720 +f 1062/2214/722 1063/2215/723 1061/2216/684 +f 1064/2217/724 1065/2218/677 1063/2215/723 +f 1066/2219/725 1067/2220/726 1065/2218/677 +f 1068/2221/727 1069/2222/673 1067/2220/726 +f 1070/2223/728 1071/2224/729 1069/2222/673 +f 1072/2225/730 1073/2226/678 1071/2224/729 +f 1074/2227/731 1075/2228/732 1073/2226/678 +f 1076/2229/733 1077/2230/688 1075/2228/732 +f 1078/2231/734 1079/2232/735 1077/2230/688 +f 1080/2233/736 1081/2234/676 1079/2232/735 +f 1060/2212/721 1089/2235/737 1062/2236/722 +f 1082/2237/738 1083/2238/739 1081/2234/676 +f 1083/2238/739 1054/2205/716 1053/2207/686 +f 1085/2239/740 1102/2240/741 1101/2241/742 +f 1070/2223/728 1094/2242/743 1072/2225/730 +f 1082/2237/738 1098/2243/744 1099/2244/745 +f 1058/2210/719 1085/2239/740 1087/2245/746 +f 1066/2219/725 1092/2246/747 1068/2221/727 +f 1078/2231/734 1096/2247/748 1097/2248/749 +f 1062/2214/722 1090/2249/750 1064/2217/724 +f 1074/2227/731 1094/2242/743 1095/2250/751 +f 1082/2237/738 1100/2251/752 1084/2252/753 +f 1058/2210/719 1088/2253/754 1060/2212/721 +f 1068/2221/727 1093/2254/755 1070/2223/728 +f 1054/2205/716 1085/2239/740 1056/2208/718 +f 1078/2231/734 1098/2243/744 1080/2233/736 +f 1064/2217/724 1091/2255/756 1066/2219/725 +f 1074/2227/731 1096/2247/748 1076/2229/733 +f 1084/2252/753 1086/2256/757 1054/2205/716 +f 1086/2256/757 1116/2257/758 1102/2258/741 +f 1093/2254/755 1110/2259/759 1094/2242/743 +f 1085/2239/740 1103/2260/760 1087/2245/746 +f 1094/2242/743 1111/2261/761 1095/2250/751 +f 1087/2245/746 1104/2262/762 1088/2253/754 +f 1096/2247/748 1111/2263/761 1112/2264/763 +f 1088/2253/754 1105/2265/764 1089/2235/737 +f 1096/2247/748 1113/2266/765 1097/2248/749 +f 1090/2249/750 1105/2267/764 1106/2268/766 +f 1098/2243/744 1113/2269/765 1114/2270/767 +f 1090/2249/750 1107/2271/768 1091/2255/756 +f 1098/2243/744 1115/2272/769 1099/2244/745 +f 1091/2255/756 1108/2273/770 1092/2246/747 +f 1099/2244/745 1116/2274/758 1100/2251/752 +f 1092/2246/747 1109/2275/771 1093/2254/755 +f 2441/2276/684 2457/2277/772 2442/2278/772 +f 2448/2279/773 2451/2280/774 2447/2281/774 +f 2437/2282/775 2456/2283/686 2438/2284/686 +f 2442/2278/772 2458/2285/776 2444/2286/776 +f 2443/2287/673 2450/2288/773 2448/2279/773 +f 2444/2286/776 2449/2289/673 2443/2287/673 +f 2446/2290/688 2453/2291/777 2445/2292/777 +f 2438/2284/686 2454/2293/778 2439/2294/778 +f 2440/2295/779 2459/2296/684 2441/2276/684 +f 2447/2281/774 2452/2297/688 2446/2298/688 +f 2445/2292/777 2460/2299/775 2437/2282/775 +f 1149/2300/686 1164/2301/680 1156/2302/680 +f 1155/2303/684 1162/2304/677 1154/2305/677 +f 1153/2306/673 1160/2307/678 1152/2308/678 +f 1151/2309/688 1158/2310/676 1150/2311/676 +f 1156/2302/680 1163/2312/684 1155/2313/684 +f 1154/2305/677 1161/2314/673 1153/2306/673 +f 1152/2308/678 1159/2315/688 1151/2309/688 +f 1150/2311/676 1157/2316/686 1149/2300/686 +f 1188/2317/676 2082/2318/735 1189/2319/735 +f 1197/2320/723 2075/2321/677 2074/2322/723 +f 1189/2319/735 2081/2323/688 1190/2324/688 +f 1197/2320/723 2073/2325/684 1198/2326/684 +f 1190/2324/688 2080/2327/732 1191/2328/732 +f 1198/2329/684 2072/2330/720 1199/2331/720 +f 1191/2328/732 2079/2332/678 1192/2333/678 +f 1199/2331/720 2071/2334/680 1200/2335/680 +f 1192/2333/678 2078/2336/729 1193/2337/729 +f 1200/2335/680 2070/2338/717 1201/2339/717 +f 1193/2337/729 2077/2340/673 1194/2341/673 +f 1202/2342/686 2084/2343/739 1187/2344/739 +f 1201/2339/717 2069/2345/686 1202/2342/686 +f 1194/2341/673 2076/2346/726 1195/2347/726 +f 1187/2344/739 2083/2348/676 1188/2317/676 +f 1195/2347/726 2075/2321/677 1196/2349/677 +f 1231/2350/689 1246/2351/780 1230/2352/780 +f 1224/2353/781 1239/2354/685 1223/2355/685 +f 1231/2350/689 1248/2356/782 1247/2357/689 +f 1225/2358/783 1240/2359/784 1224/2353/781 +f 1233/2360/785 1248/2361/782 1232/2362/782 +f 1226/2363/786 1241/2364/783 1225/2358/783 +f 1234/2365/787 1249/2366/785 1233/2360/785 +f 1226/2363/786 1243/2367/683 1242/2368/788 +f 1220/2369/789 1235/2370/687 1219/2371/687 +f 1219/2371/687 1250/2372/787 1234/2365/787 +f 1228/2373/790 1243/2374/683 1227/2375/683 +f 1220/2369/789 1237/2376/791 1236/2377/789 +f 1228/2373/790 1245/2378/792 1244/2379/790 +f 1221/2380/791 1238/2381/793 1237/2382/791 +f 1230/2352/780 1245/2383/792 1229/2384/792 +f 1222/2385/794 1239/2386/685 1238/2387/793 +f 1266/2388/739 1305/2389/676 1265/2390/676 +f 1259/2391/673 1298/2392/726 1258/2393/726 +f 1252/2394/717 1291/2395/686 1251/2396/686 +f 1251/2396/686 1306/2397/739 1266/2388/739 +f 1260/2398/729 1299/2399/673 1259/2391/673 +f 1253/2400/680 1292/2401/717 1252/2394/717 +f 1261/2402/678 1300/2403/729 1260/2398/729 +f 1254/2404/720 1293/2405/680 1253/2400/680 +f 1262/2406/732 1301/2407/678 1261/2402/678 +f 1255/2408/684 1294/2409/720 1254/2404/720 +f 1263/2410/688 1302/2411/732 1262/2406/732 +f 1256/2412/723 1295/2413/684 1255/2414/684 +f 1264/2415/735 1303/2416/688 1263/2410/688 +f 1257/2417/677 1296/2418/723 1256/2412/723 +f 1265/2390/676 1304/2419/735 1264/2415/735 +f 1258/2393/726 1297/2420/677 1257/2417/677 +f 2145/2421/795 2160/2422/796 2144/2423/796 +f 2146/2424/797 2161/2425/795 2145/2426/795 +f 2163/2427/798 2146/2428/797 2147/2429/798 +f 2164/2430/799 2147/2431/798 2148/2432/799 +f 2149/2433/800 2148/2434/799 2133/2435/800 +f 2134/2436/801 2149/2433/800 2133/2437/800 +f 2135/2438/802 2150/2439/801 2134/2440/801 +f 2136/2441/803 2151/2442/802 2135/2443/802 +f 2153/2444/804 2136/2445/803 2137/2446/804 +f 2138/2447/805 2153/2448/804 2137/2449/804 +f 2155/2450/806 2138/2451/805 2139/2452/806 +f 2156/2453/807 2139/2454/806 2140/2455/807 +f 2157/2456/808 2140/2457/807 2141/2458/808 +f 2142/2459/809 2157/2456/808 2141/2460/808 +f 2143/2461/810 2158/2462/809 2142/2463/809 +f 2160/2422/796 2143/2464/810 2144/2465/796 +f 1311/2466/684 1326/2467/720 1310/2468/720 +f 1319/2469/688 1334/2470/732 1318/2471/732 +f 1312/2472/723 1327/2473/684 1311/2474/684 +f 1320/2475/735 1335/2476/688 1319/2469/688 +f 1313/2477/677 1328/2478/723 1312/2472/723 +f 1321/2479/676 1336/2480/735 1320/2475/735 +f 1314/2481/726 1329/2482/677 1313/2477/677 +f 1322/2483/739 1337/2484/676 1321/2479/676 +f 1315/2485/673 1330/2486/726 1314/2481/726 +f 1308/2487/717 1323/2488/686 1307/2489/686 +f 1307/2489/686 1338/2490/739 1322/2483/739 +f 1316/2491/729 1331/2492/673 1315/2485/673 +f 1309/2493/680 1324/2494/717 1308/2487/717 +f 1317/2495/678 1332/2496/729 1316/2491/729 +f 1310/2468/720 1325/2497/680 1309/2493/680 +f 1318/2471/732 1333/2498/678 1317/2495/678 +f 1353/2499/676 1368/2500/735 1352/2501/735 +f 1346/2502/726 1361/2503/677 1345/2504/677 +f 1354/2505/739 1369/2506/676 1353/2499/676 +f 1347/2507/673 1362/2508/726 1346/2502/726 +f 1340/2509/717 1355/2510/686 1339/2511/686 +f 1339/2511/686 1370/2512/739 1354/2505/739 +f 1348/2513/729 1363/2514/673 1347/2507/673 +f 1341/2515/680 1356/2516/717 1340/2509/717 +f 1349/2517/678 1364/2518/729 1348/2513/729 +f 1342/2519/720 1357/2520/680 1341/2515/680 +f 1350/2521/732 1365/2522/678 1349/2517/678 +f 1343/2523/684 1358/2524/720 1342/2519/720 +f 1351/2525/688 1366/2526/732 1350/2521/732 +f 1344/2527/723 1359/2528/684 1343/2529/684 +f 1352/2501/735 1367/2530/688 1351/2525/688 +f 1345/2504/677 1360/2531/723 1344/2527/723 +f 1373/2532/678 1388/2533/729 1372/2534/729 +f 1381/2535/680 1396/2536/717 1380/2537/717 +f 1374/2538/732 1389/2539/678 1373/2532/678 +f 1382/2540/720 1397/2541/680 1381/2535/680 +f 1375/2542/688 1390/2543/732 1374/2538/732 +f 1383/2544/684 1398/2545/720 1382/2540/720 +f 1376/2546/735 1391/2547/688 1375/2548/688 +f 1384/2549/723 1399/2550/684 1383/2544/684 +f 1377/2551/676 1392/2552/735 1376/2546/735 +f 1385/2553/677 1400/2554/723 1384/2549/723 +f 1378/2555/739 1393/2556/676 1377/2551/676 +f 1386/2557/726 1401/2558/677 1385/2553/677 +f 1379/2559/686 1394/2560/739 1378/2555/739 +f 1372/2534/729 1387/2561/673 1371/2562/673 +f 1371/2562/673 1402/2563/726 1386/2557/726 +f 1380/2537/717 1395/2564/686 1379/2559/686 +f 1406/2565/675 1417/2566/811 1405/2567/811 +f 1413/2568/812 1424/2569/674 1412/2570/674 +f 1410/2571/813 1421/2572/684 1409/2573/684 +f 1407/2574/814 1418/2575/675 1406/2576/675 +f 1414/2577/815 1425/2578/812 1413/2579/812 +f 1403/2580/688 1416/2581/816 1415/2582/688 +f 1411/2583/817 1422/2584/813 1410/2585/813 +f 1408/2586/818 1419/2587/814 1407/2588/814 +f 1403/2589/688 1426/2590/815 1414/2591/815 +f 1405/2592/811 1416/2593/816 1404/2594/816 +f 1412/2595/674 1423/2596/817 1411/2597/817 +f 1409/2598/684 1420/2599/818 1408/2600/818 +f 2439/2294/778 2455/2601/779 2440/2295/779 +f 2417/2602/774 2430/2603/773 2418/2604/773 +f 2420/2605/776 2433/2606/772 2421/2607/772 +f 2413/2608/686 2425/2609/775 2414/2610/775 +f 2423/2611/779 2436/2612/778 2424/2613/778 +f 2416/2614/688 2429/2615/774 2417/2602/774 +f 2419/2616/673 2432/2617/776 2420/2605/776 +f 2422/2618/684 2435/2619/779 2423/2611/779 +f 2415/2620/777 2428/2621/688 2416/2614/688 +f 2418/2604/773 2431/2622/673 2419/2616/673 +f 2421/2607/772 2434/2623/684 2422/2624/684 +f 2414/2610/775 2427/2625/777 2415/2620/777 +f 2424/2613/778 2426/2626/686 2413/2608/686 +f 1427/2627/688 1440/2628/816 1428/2629/816 +f 1434/2630/813 1447/2631/817 1435/2632/817 +f 1431/2633/814 1444/2634/818 1432/2635/818 +f 1438/2636/815 1439/2637/688 1427/2627/688 +f 1428/2629/816 1441/2638/811 1429/2639/811 +f 1435/2632/817 1448/2640/674 1436/2641/674 +f 1432/2635/818 1445/2642/684 1433/2643/684 +f 1429/2639/811 1442/2644/675 1430/2645/675 +f 1436/2641/674 1449/2646/812 1437/2647/812 +f 1433/2648/684 1446/2649/813 1434/2630/813 +f 1430/2645/675 1443/2650/814 1431/2633/814 +f 1437/2647/812 1450/2651/815 1438/2636/815 +f 1451/2652/815 1464/2653/812 1463/2654/815 +f 1458/2655/814 1471/2656/675 1470/2657/814 +f 1455/2658/813 1468/2659/684 1467/2660/813 +f 1452/2661/812 1465/2662/674 1464/2653/812 +f 1459/2663/675 1472/2664/811 1471/2656/675 +f 1456/2665/684 1469/2666/818 1468/2667/684 +f 1453/2668/674 1466/2669/817 1465/2662/674 +f 1460/2670/811 1473/2671/816 1472/2664/811 +f 1462/2672/688 1463/2654/815 1474/2673/688 +f 1457/2674/818 1470/2657/814 1469/2666/818 +f 1454/2675/817 1467/2660/813 1466/2669/817 +f 1461/2676/816 1474/2673/688 1473/2671/816 +f 1481/2677/818 1492/2678/684 1493/2679/818 +f 1478/2680/817 1489/2681/674 1490/2682/817 +f 1485/2683/816 1496/2684/811 1497/2685/816 +f 1475/2686/815 1498/2687/688 1487/2688/815 +f 1482/2689/814 1493/2690/818 1494/2691/814 +f 1479/2692/813 1490/2693/817 1491/2694/813 +f 1498/2695/688 1485/2696/816 1497/2697/816 +f 1476/2698/812 1487/2699/815 1488/2700/812 +f 1483/2701/675 1494/2702/814 1495/2703/675 +f 1480/2704/684 1491/2705/813 1492/2706/684 +f 1477/2707/674 1488/2708/812 1489/2709/674 +f 1484/2710/811 1495/2711/675 1496/2712/811 +f 1500/2713/688 1501/2714/815 1499/2715/688 +f 1502/2716/815 1503/2717/812 1501/2714/815 +f 1504/2718/812 1505/2719/674 1503/2717/812 +f 1506/2720/674 1507/2721/817 1505/2719/674 +f 1508/2722/817 1509/2723/813 1507/2721/817 +f 1510/2724/813 1511/2725/684 1509/2723/813 +f 1512/2726/684 1513/2727/818 1511/2728/684 +f 1514/2729/818 1515/2730/814 1513/2727/818 +f 1516/2731/814 1517/2732/675 1515/2730/814 +f 1518/2733/675 1519/2734/811 1517/2732/675 +f 2505/2735/815 2497/2736/812 2504/2737/812 +f 1520/2738/811 1521/2739/816 1519/2734/811 +f 1522/2740/816 1499/2715/688 1521/2739/816 +f 2500/2741/816 2498/2742/688 2506/2743/688 +f 2513/2744/816 2515/2745/688 2507/2746/688 +f 2508/2747/815 2516/2748/812 2509/2749/812 +f 2512/2750/811 2520/2751/816 2513/2744/816 +f 2508/2747/815 2515/2752/688 2514/2753/815 +f 2511/2754/819 2518/2755/811 2512/2750/811 +f 2509/2749/812 2517/2756/820 2510/2757/820 +f 1581/2758/715 1590/2759/821 1582/2760/822 +f 1562/2761/823 1559/2762/824 1564/2763/825 +f 1562/2761/823 1563/2764/826 1561/2765/827 +f 1582/2760/822 1584/2766/828 1560/2767/829 +f 1560/2767/829 1576/2768/830 1582/2760/822 +f 1564/2763/825 1565/2769/831 1563/2764/826 +f 1587/2770/832 1580/2771/833 1579/2772/834 +f 1582/2760/822 1574/2773/835 1581/2758/715 +f 1566/2774/836 1567/2775/837 1565/2776/831 +f 1587/2770/832 1578/2777/838 1586/2778/839 +f 1580/2771/833 1574/2773/835 1572/2779/840 +f 1568/2780/841 1569/2781/842 1567/2775/837 +f 1586/2778/839 1577/2782/714 1585/2783/843 +f 1579/2772/834 1572/2779/840 1570/2784/844 +f 1570/2784/844 1571/2785/845 1569/2781/842 +f 1583/2786/846 1577/2787/714 1559/2762/824 +f 1577/2782/714 1568/2780/841 1566/2774/836 +f 1572/2779/840 1573/2788/847 1571/2785/845 +f 1578/2777/838 1570/2784/844 1568/2780/841 +f 1564/2763/825 1577/2787/714 1566/2789/836 +f 1574/2773/835 1575/2790/848 1573/2788/847 +f 1588/2791/849 1581/2758/715 1580/2771/833 +f 1584/2766/828 1559/2762/824 1560/2767/829 +f 1576/2768/830 1561/2765/827 1575/2790/848 +f 1616/2792/850 1561/2765/827 1563/2764/826 +f 1588/2791/849 1597/2793/674 1589/2794/851 +f 1583/2786/846 1593/2795/675 1585/2796/843 +f 1585/2783/843 1594/2797/852 1586/2778/839 +f 1589/2794/851 1598/2798/853 1590/2759/821 +f 1586/2778/839 1595/2799/673 1587/2770/832 +f 1590/2759/821 1592/2800/686 1584/2766/828 +f 1584/2766/828 1591/2801/854 1583/2786/846 +f 1587/2770/832 1596/2802/855 1588/2791/849 +f 1606/2803/853 1613/2804/674 1605/2805/674 +f 1604/2806/855 1611/2807/673 1603/2808/673 +f 1602/2809/852 1609/2810/675 1601/2811/675 +f 1599/2812/854 1608/2813/686 1600/2814/686 +f 1600/2814/686 1614/2815/853 1606/2803/853 +f 1605/2816/674 1612/2817/855 1604/2806/855 +f 1603/2808/673 1610/2818/852 1602/2809/852 +f 1601/2811/675 1607/2819/854 1599/2812/854 +f 1621/2820/856 1630/2821/857 1629/2822/858 +f 1565/2769/831 1616/2792/850 1563/2764/826 +f 1567/2775/837 1617/2823/859 1565/2776/831 +f 1569/2781/842 1618/2824/860 1567/2775/837 +f 1571/2785/845 1619/2825/842 1569/2781/842 +f 1573/2788/847 1620/2826/861 1571/2785/845 +f 1622/2827/862 1573/2788/847 1575/2790/848 +f 1615/2828/827 1575/2790/848 1561/2765/827 +f 1620/2826/861 1627/2829/673 1619/2825/842 +f 1618/2824/860 1625/2830/863 1617/2823/859 +f 1616/2792/850 1623/2831/686 1615/2828/827 +f 1622/2827/862 1623/2831/686 1630/2821/857 +f 1620/2826/861 1629/2822/858 1628/2832/864 +f 1619/2825/842 1626/2833/865 1618/2824/860 +f 1617/2834/859 1624/2835/866 1616/2792/850 +f 1631/2836/686 1646/2837/857 1638/2838/857 +f 2612/2839/867 2601/2840/868 2600/2841/867 +f 2601/2842/868 2614/2843/869 2602/2844/869 +f 2614/2843/869 2603/2845/870 2602/2844/869 +f 1637/2846/858 1644/2847/864 1636/2848/864 +f 1635/2849/673 1642/2850/865 1634/2851/865 +f 1633/2852/863 1640/2853/866 1632/2854/866 +f 1637/2846/858 1646/2837/857 1645/2855/858 +f 1636/2848/864 1643/2856/673 1635/2849/673 +f 1633/2857/863 1642/2850/865 1641/2858/863 +f 1632/2854/866 1639/2859/686 1631/2836/686 +f 1650/2860/675 1661/2861/871 1649/2862/871 +f 1656/2863/674 1669/2864/872 1668/2865/674 +f 1654/2866/700 1665/2867/677 1653/2868/677 +f 1651/2869/873 1662/2870/675 1650/2871/675 +f 1657/2872/872 1670/2873/874 1669/2874/872 +f 1647/2875/676 1660/2876/698 1659/2877/676 +f 1655/2878/875 1666/2879/700 1654/2880/700 +f 1652/2881/876 1663/2882/873 1651/2883/873 +f 1647/2884/676 1670/2885/874 1658/2886/874 +f 1649/2887/871 1660/2888/698 1648/2889/698 +f 1655/2890/875 1668/2891/674 1667/2892/875 +f 1652/2893/876 1665/2894/677 1664/2895/876 +f 1672/2896/698 1683/2897/676 1684/2898/698 +f 1678/2899/700 1691/2900/875 1679/2901/875 +f 1676/2902/876 1687/2903/873 1688/2904/876 +f 1671/2905/676 1694/2906/874 1683/2897/676 +f 1672/2896/698 1685/2907/871 1673/2908/871 +f 1679/2901/875 1692/2909/674 1680/2910/674 +f 1677/2911/677 1688/2904/876 1689/2912/677 +f 1673/2908/871 1686/2913/675 1674/2914/675 +f 1680/2910/674 1693/2915/872 1681/2916/872 +f 1677/2917/677 1690/2918/700 1678/2899/700 +f 1674/2914/675 1687/2903/873 1675/2919/873 +f 1682/2920/874 1693/2915/872 1694/2906/874 +f 1811/2921/877 1824/2922/707 1823/2923/877 +f 1808/2924/878 1821/2925/673 1820/2926/878 +f 1805/2927/879 1818/2928/706 1817/2929/879 +f 1813/2930/880 1824/2931/707 1812/2932/707 +f 1810/2933/881 1821/2934/673 1809/2935/673 +f 1807/2936/882 1818/2937/706 1806/2938/706 +f 1814/2939/883 1825/2940/880 1813/2941/880 +f 1804/2942/884 1815/2943/686 1803/2944/686 +f 1811/2945/877 1822/2946/881 1810/2947/881 +f 1807/2948/882 1820/2949/878 1819/2950/882 +f 1803/2951/686 1826/2952/883 1814/2953/883 +f 1805/2954/879 1816/2955/884 1804/2956/884 +f 1794/2957/706 1831/2958/882 1795/2959/882 +f 1801/2960/880 1838/2961/883 1802/2962/883 +f 1791/2963/686 1828/2964/884 1792/2965/884 +f 1798/2966/881 1835/2967/877 1799/2968/877 +f 1795/2959/882 1832/2969/878 1796/2970/878 +f 1791/2963/686 1838/2961/883 1827/2971/686 +f 1792/2965/884 1829/2972/879 1793/2973/879 +f 1800/2974/707 1835/2967/877 1836/2975/707 +f 1796/2970/878 1833/2976/673 1797/2977/673 +f 1794/2957/706 1829/2972/879 1830/2978/706 +f 1801/2960/880 1836/2979/707 1837/2980/880 +f 1797/2977/673 1834/2981/881 1798/2966/881 +f 1854/2982/686 1839/2983/885 1846/2984/686 +f 1852/2985/886 1845/2986/887 1844/2987/886 +f 1850/2988/673 1843/2989/888 1842/2990/673 +f 1848/2991/713 1841/2992/889 1840/2993/713 +f 1845/2986/887 1854/2982/686 1846/2984/686 +f 1843/2989/888 1852/2994/886 1844/2995/886 +f 1841/2992/889 1850/2988/673 1842/2990/673 +f 1839/2983/885 1848/2991/713 1840/2993/713 +f 1895/2996/684 1908/2997/813 1896/2998/813 +f 1892/2999/675 1905/3000/814 1893/3001/814 +f 1899/3002/812 1912/3003/815 1900/3004/815 +f 1889/3005/688 1902/3006/816 1890/3007/816 +f 1896/2998/813 1909/3008/817 1897/3009/817 +f 1893/3001/814 1906/3010/818 1894/3011/818 +f 1900/3004/815 1901/3012/688 1889/3005/688 +f 1890/3007/816 1903/3013/811 1891/3014/811 +f 1897/3009/817 1910/3015/674 1898/3016/674 +f 1894/3011/818 1907/3017/684 1895/3018/684 +f 1891/3014/811 1904/3019/675 1892/2999/675 +f 1898/3016/674 1911/3020/812 1899/3002/812 +f 1877/3021/688 1924/3022/815 1888/3023/815 +f 1879/3024/811 1914/3025/816 1878/3026/816 +f 1886/3027/674 1921/3028/817 1885/3029/817 +f 1883/3030/684 1918/3031/818 1882/3032/818 +f 1880/3033/675 1915/3034/811 1879/3035/811 +f 1887/3036/812 1922/3037/674 1886/3038/674 +f 1884/3039/813 1919/3040/684 1883/3041/684 +f 1881/3042/814 1916/3043/675 1880/3044/675 +f 1888/3045/815 1923/3046/812 1887/3047/812 +f 1878/3048/816 1913/3049/688 1877/3050/688 +f 1885/3051/817 1920/3052/813 1884/3053/813 +f 1882/3054/818 1917/3055/814 1881/3056/814 +f 1968/3057/890 1961/3058/891 1960/3059/890 +f 1971/3060/675 1964/3061/892 1963/3062/675 +f 1969/3063/891 1962/3064/893 1961/3065/891 +f 1964/3061/892 1965/3066/894 1957/3067/894 +f 1967/3068/674 1960/3059/890 1959/3069/674 +f 1962/3064/893 1971/3060/675 1963/3062/675 +f 1966/3070/895 1959/3069/674 1958/3071/896 +f 1957/3067/894 1966/3070/895 1958/3071/896 +f 2504/2737/812 2496/3072/820 2503/3073/820 +f 2502/3074/819 2495/3075/811 2501/3076/811 +f 2505/2735/815 2498/3077/688 2499/3078/815 +f 2501/3076/811 2493/3079/816 2500/2741/816 +f 1991/3080/688 1998/3081/676 1990/3082/676 +f 1996/3083/680 2003/3084/684 1995/3085/684 +f 1994/3086/677 2001/3087/673 1993/3088/673 +f 1992/3089/678 1999/3090/688 1991/3080/688 +f 1990/3082/676 1997/3091/686 1989/3092/686 +f 1989/3092/686 2004/3093/680 1996/3083/680 +f 1995/3094/684 2002/3095/677 1994/3086/677 +f 1993/3088/673 2000/3096/678 1992/3089/678 +f 2611/3097/897 2600/2841/867 2599/3098/897 +f 2603/3099/870 2616/3100/898 2604/3101/898 +f 2604/3101/898 2617/3102/899 2605/3103/899 +f 2605/3104/899 2618/3105/900 2606/3106/900 +f 2618/3105/900 2607/3107/901 2606/3106/900 +f 2619/3108/901 2608/3109/902 2607/3110/901 +f 2608/3109/902 2609/3111/903 2597/3112/903 +f 2609/3113/903 2598/3114/904 2597/3115/903 +f 2610/3116/904 2599/3117/897 2598/3114/904 +f 2017/3118/688 2032/3119/732 2016/3120/732 +f 2010/3121/723 2025/3122/684 2009/3123/684 +f 2018/3124/735 2033/3125/688 2017/3118/688 +f 2010/3121/723 2027/3126/677 2026/3127/723 +f 2019/3128/676 2034/3129/735 2018/3124/735 +f 2012/3130/726 2027/3126/677 2011/3131/677 +f 2020/3132/739 2035/3133/676 2019/3128/676 +f 2012/3130/726 2029/3134/673 2028/3135/726 +f 2005/3136/686 2036/3137/739 2020/3132/739 +f 2007/3138/680 2021/3139/717 2006/3140/717 +f 2014/3141/729 2029/3134/673 2013/3142/673 +f 2014/3141/729 2031/3143/678 2030/3144/729 +f 2008/3145/720 2022/3146/680 2007/3138/680 +f 2016/3120/732 2031/3143/678 2015/3147/678 +f 2009/3148/684 2024/3149/720 2008/3145/720 +f 2005/3136/686 2021/3139/717 2023/3150/686 +f 2250/3151/905 2267/3152/906 2251/3153/907 +f 2272/3154/908 2287/3155/909 2288/3156/910 +f 2259/3157/911 2274/3158/912 2275/3159/913 +f 2252/3160/914 2267/3152/906 2268/3161/915 +f 2260/3162/916 2275/3159/913 2276/3163/917 +f 2252/3160/914 2269/3164/918 2253/3165/919 +f 2246/3166/920 2261/3167/921 2245/3168/922 +f 2246/3166/920 2276/3163/917 2262/3169/923 +f 2254/3170/924 2269/3164/918 2270/3171/925 +f 2245/3168/922 2263/3172/926 2247/3173/927 +f 2255/3174/928 2270/3171/925 2271/3175/929 +f 2248/3176/930 2263/3172/926 2264/3177/931 +f 2255/3174/928 2272/3154/908 2256/3178/932 +f 2248/3176/930 2265/3179/933 2249/3180/934 +f 2256/3178/932 2273/3181/935 2257/3182/936 +f 2250/3151/905 2265/3183/933 2266/3184/937 +f 2258/3185/938 2273/3181/935 2274/3158/912 +f 2264/3177/931 2281/3186/939 2265/3179/933 +f 2272/3154/908 2289/3187/940 2273/3181/935 +f 2265/3183/933 2282/3188/941 2266/3184/937 +f 2273/3181/935 2290/3189/942 2274/3158/912 +f 2266/3184/937 2283/3190/943 2267/3152/906 +f 2275/3159/913 2290/3191/942 2291/3192/944 +f 2268/3161/915 2283/3193/943 2284/3194/945 +f 2275/3159/913 2292/3195/946 2276/3163/917 +f 2269/3164/918 2284/3196/945 2285/3197/947 +f 2262/3169/923 2277/3198/948 2261/3167/921 +f 2276/3163/917 2278/3199/949 2262/3169/923 +f 2269/3164/918 2286/3200/950 2270/3171/925 +f 2261/3167/921 2279/3201/951 2263/3172/926 +f 2270/3171/925 2287/3202/909 2271/3175/929 +f 2263/3172/926 2280/3203/952 2264/3177/931 +f 2631/3204/953 2642/3205/690 2630/3206/690 +f 2628/3207/693 2639/3208/704 2627/3209/704 +f 2625/3210/954 2636/3211/691 2624/3212/691 +f 2631/3213/953 2644/3214/692 2643/3215/953 +f 2622/3216/695 2633/3217/705 2621/3218/705 +f 2628/3207/693 2641/3219/955 2640/3220/693 +f 2625/3221/954 2638/3222/694 2637/3223/954 +f 2621/3224/705 2644/3214/692 2632/3225/692 +f 2622/3216/695 2635/3226/956 2634/3227/695 +f 2630/3206/690 2641/3228/955 2629/3229/955 +f 2627/3230/704 2638/3222/694 2626/3231/694 +f 2624/3212/691 2635/3232/956 2623/3233/956 +f 1054/2205/716 1056/2208/718 1055/2206/717 +f 1056/2208/718 1058/2210/719 1057/2209/680 +f 1058/2210/719 1060/2212/721 1059/2211/720 +f 1060/2212/721 1062/2236/722 1061/2213/684 +f 1062/2214/722 1064/2217/724 1063/2215/723 +f 1064/2217/724 1066/2219/725 1065/2218/677 +f 1066/2219/725 1068/2221/727 1067/2220/726 +f 1068/2221/727 1070/2223/728 1069/2222/673 +f 1070/2223/728 1072/2225/730 1071/2224/729 +f 1072/2225/730 1074/2227/731 1073/2226/678 +f 1074/2227/731 1076/2229/733 1075/2228/732 +f 1076/2229/733 1078/2231/734 1077/2230/688 +f 1078/2231/734 1080/2233/736 1079/2232/735 +f 1080/2233/736 1082/2237/738 1081/2234/676 +f 1060/2212/721 1088/2253/754 1089/2235/737 +f 1082/2237/738 1084/2252/753 1083/2238/739 +f 1083/2238/739 1084/2252/753 1054/2205/716 +f 1085/2239/740 1086/2256/757 1102/2240/741 +f 1070/2223/728 1093/2254/755 1094/2242/743 +f 1082/2237/738 1080/2233/736 1098/2243/744 +f 1058/2210/719 1056/2208/718 1085/2239/740 +f 1066/2219/725 1091/2255/756 1092/2246/747 +f 1078/2231/734 1076/2229/733 1096/2247/748 +f 1062/2214/722 1089/3234/737 1090/2249/750 +f 1074/2227/731 1072/2225/730 1094/2242/743 +f 1082/2237/738 1099/2244/745 1100/2251/752 +f 1058/2210/719 1087/2245/746 1088/2253/754 +f 1068/2221/727 1092/2246/747 1093/2254/755 +f 1054/2205/716 1086/2256/757 1085/2239/740 +f 1078/2231/734 1097/2248/749 1098/2243/744 +f 1064/2217/724 1090/2249/750 1091/2255/756 +f 1074/2227/731 1095/2250/751 1096/2247/748 +f 1084/2252/753 1100/2251/752 1086/2256/757 +f 1086/2256/757 1100/2251/752 1116/2257/758 +f 1093/2254/755 1109/3235/771 1110/2259/759 +f 1085/2239/740 1101/3236/742 1103/2260/760 +f 1094/2242/743 1110/3237/759 1111/2261/761 +f 1087/2245/746 1103/3238/760 1104/2262/762 +f 1096/2247/748 1095/2250/751 1111/2263/761 +f 1088/2253/754 1104/3239/762 1105/2265/764 +f 1096/2247/748 1112/3240/763 1113/2266/765 +f 1090/2249/750 1089/3234/737 1105/2267/764 +f 1098/2243/744 1097/2248/749 1113/2269/765 +f 1090/2249/750 1106/3241/766 1107/2271/768 +f 1098/2243/744 1114/3242/767 1115/2272/769 +f 1091/2255/756 1107/3243/768 1108/2273/770 +f 1099/2244/745 1115/3244/769 1116/2274/758 +f 1092/2246/747 1108/3245/770 1109/2275/771 +f 2441/2276/684 2459/2296/684 2457/2277/772 +f 2448/2279/773 2450/2288/773 2451/2280/774 +f 2437/2282/775 2460/2299/775 2456/2283/686 +f 2442/2278/772 2457/2277/772 2458/2285/776 +f 2443/2287/673 2449/2289/673 2450/2288/773 +f 2444/2286/776 2458/2285/776 2449/2289/673 +f 2446/2290/688 2452/3246/688 2453/2291/777 +f 2438/2284/686 2456/2283/686 2454/2293/778 +f 2440/2295/779 2455/2601/779 2459/2296/684 +f 2447/2281/774 2451/2280/774 2452/2297/688 +f 2445/2292/777 2453/2291/777 2460/2299/775 +f 1149/2300/686 1157/2316/686 1164/2301/680 +f 1155/2303/684 1163/3247/684 1162/2304/677 +f 1153/2306/673 1161/2314/673 1160/2307/678 +f 1151/2309/688 1159/2315/688 1158/2310/676 +f 1156/2302/680 1164/2301/680 1163/2312/684 +f 1154/2305/677 1162/2304/677 1161/2314/673 +f 1152/2308/678 1160/2307/678 1159/2315/688 +f 1150/2311/676 1158/2310/676 1157/2316/686 +f 1188/2317/676 2083/2348/676 2082/2318/735 +f 1197/2320/723 1196/2349/677 2075/2321/677 +f 1189/2319/735 2082/2318/735 2081/2323/688 +f 1197/2320/723 2074/2322/723 2073/2325/684 +f 1190/2324/688 2081/2323/688 2080/2327/732 +f 1198/2329/684 2073/3248/684 2072/2330/720 +f 1191/2328/732 2080/2327/732 2079/2332/678 +f 1199/2331/720 2072/2330/720 2071/2334/680 +f 1192/2333/678 2079/2332/678 2078/2336/729 +f 1200/2335/680 2071/2334/680 2070/2338/717 +f 1193/2337/729 2078/2336/729 2077/2340/673 +f 1202/2342/686 2069/2345/686 2084/2343/739 +f 1201/2339/717 2070/2338/717 2069/2345/686 +f 1194/2341/673 2077/2340/673 2076/2346/726 +f 1187/2344/739 2084/2343/739 2083/2348/676 +f 1195/2347/726 2076/2346/726 2075/2321/677 +f 1231/2350/689 1247/3249/689 1246/2351/780 +f 1224/2353/781 1240/3250/784 1239/2354/685 +f 1231/2350/689 1232/2362/782 1248/2356/782 +f 1225/2358/783 1241/3251/783 1240/2359/784 +f 1233/2360/785 1249/3252/785 1248/2361/782 +f 1226/2363/786 1242/3253/788 1241/2364/783 +f 1234/2365/787 1250/3254/787 1249/2366/785 +f 1226/2363/786 1227/2375/683 1243/2367/683 +f 1220/2369/789 1236/3255/789 1235/2370/687 +f 1219/2371/687 1235/3256/687 1250/2372/787 +f 1228/2373/790 1244/3257/790 1243/2374/683 +f 1220/2369/789 1221/2380/791 1237/2376/791 +f 1228/2373/790 1229/2384/792 1245/2378/792 +f 1221/2380/791 1222/2385/794 1238/2381/793 +f 1230/2352/780 1246/3258/780 1245/2383/792 +f 1222/2385/794 1223/3259/685 1239/2386/685 +f 1266/2388/739 1306/2397/739 1305/2389/676 +f 1259/2391/673 1299/2399/673 1298/2392/726 +f 1252/2394/717 1292/2401/717 1291/2395/686 +f 1251/2396/686 1291/2395/686 1306/2397/739 +f 1260/2398/729 1300/2403/729 1299/2399/673 +f 1253/2400/680 1293/2405/680 1292/2401/717 +f 1261/2402/678 1301/2407/678 1300/2403/729 +f 1254/2404/720 1294/2409/720 1293/2405/680 +f 1262/2406/732 1302/2411/732 1301/2407/678 +f 1255/2408/684 1295/3260/684 1294/2409/720 +f 1263/2410/688 1303/2416/688 1302/2411/732 +f 1256/2412/723 1296/2418/723 1295/2413/684 +f 1264/2415/735 1304/2419/735 1303/2416/688 +f 1257/2417/677 1297/2420/677 1296/2418/723 +f 1265/2390/676 1305/2389/676 1304/2419/735 +f 1258/2393/726 1298/2392/726 1297/2420/677 +f 2145/2421/795 2161/2425/795 2160/2422/796 +f 2146/2424/797 2162/3261/797 2161/2425/795 +f 2163/2427/798 2162/3261/797 2146/2428/797 +f 2164/2430/799 2163/2427/798 2147/2431/798 +f 2149/2433/800 2164/2430/799 2148/2434/799 +f 2134/2436/801 2150/2439/801 2149/2433/800 +f 2135/2438/802 2151/2442/802 2150/2439/801 +f 2136/2441/803 2152/3262/803 2151/2442/802 +f 2153/2444/804 2152/3262/803 2136/2445/803 +f 2138/2447/805 2154/3263/805 2153/2448/804 +f 2155/2450/806 2154/3263/805 2138/2451/805 +f 2156/2453/807 2155/2450/806 2139/2454/806 +f 2157/2456/808 2156/2453/807 2140/2457/807 +f 2142/2459/809 2158/2462/809 2157/2456/808 +f 2143/2461/810 2159/3264/810 2158/2462/809 +f 2160/2422/796 2159/3264/810 2143/2464/810 +f 1311/2466/684 1327/3265/684 1326/2467/720 +f 1319/2469/688 1335/2476/688 1334/2470/732 +f 1312/2472/723 1328/2478/723 1327/2473/684 +f 1320/2475/735 1336/2480/735 1335/2476/688 +f 1313/2477/677 1329/2482/677 1328/2478/723 +f 1321/2479/676 1337/2484/676 1336/2480/735 +f 1314/2481/726 1330/2486/726 1329/2482/677 +f 1322/2483/739 1338/2490/739 1337/2484/676 +f 1315/2485/673 1331/2492/673 1330/2486/726 +f 1308/2487/717 1324/2494/717 1323/2488/686 +f 1307/2489/686 1323/2488/686 1338/2490/739 +f 1316/2491/729 1332/2496/729 1331/2492/673 +f 1309/2493/680 1325/2497/680 1324/2494/717 +f 1317/2495/678 1333/2498/678 1332/2496/729 +f 1310/2468/720 1326/2467/720 1325/2497/680 +f 1318/2471/732 1334/2470/732 1333/2498/678 +f 1353/2499/676 1369/2506/676 1368/2500/735 +f 1346/2502/726 1362/2508/726 1361/2503/677 +f 1354/2505/739 1370/2512/739 1369/2506/676 +f 1347/2507/673 1363/2514/673 1362/2508/726 +f 1340/2509/717 1356/2516/717 1355/2510/686 +f 1339/2511/686 1355/2510/686 1370/2512/739 +f 1348/2513/729 1364/2518/729 1363/2514/673 +f 1341/2515/680 1357/2520/680 1356/2516/717 +f 1349/2517/678 1365/2522/678 1364/2518/729 +f 1342/2519/720 1358/2524/720 1357/2520/680 +f 1350/2521/732 1366/2526/732 1365/2522/678 +f 1343/2523/684 1359/3266/684 1358/2524/720 +f 1351/2525/688 1367/2530/688 1366/2526/732 +f 1344/2527/723 1360/2531/723 1359/2528/684 +f 1352/2501/735 1368/2500/735 1367/2530/688 +f 1345/2504/677 1361/2503/677 1360/2531/723 +f 1373/2532/678 1389/2539/678 1388/2533/729 +f 1381/2535/680 1397/2541/680 1396/2536/717 +f 1374/2538/732 1390/2543/732 1389/2539/678 +f 1382/2540/720 1398/2545/720 1397/2541/680 +f 1375/2542/688 1391/3267/688 1390/2543/732 +f 1383/2544/684 1399/2550/684 1398/2545/720 +f 1376/2546/735 1392/2552/735 1391/2547/688 +f 1384/2549/723 1400/2554/723 1399/2550/684 +f 1377/2551/676 1393/2556/676 1392/2552/735 +f 1385/2553/677 1401/2558/677 1400/2554/723 +f 1378/2555/739 1394/2560/739 1393/2556/676 +f 1386/2557/726 1402/2563/726 1401/2558/677 +f 1379/2559/686 1395/2564/686 1394/2560/739 +f 1372/2534/729 1388/2533/729 1387/2561/673 +f 1371/2562/673 1387/2561/673 1402/2563/726 +f 1380/2537/717 1396/2536/717 1395/2564/686 +f 1406/2565/675 1418/3268/675 1417/2566/811 +f 1413/2568/812 1425/3269/812 1424/2569/674 +f 1410/2571/813 1422/3270/813 1421/2572/684 +f 1407/2574/814 1419/3271/814 1418/2575/675 +f 1414/2577/815 1426/3272/815 1425/2578/812 +f 1403/2580/688 1404/3273/816 1416/2581/816 +f 1411/2583/817 1423/3274/817 1422/2584/813 +f 1408/2586/818 1420/3275/818 1419/2587/814 +f 1403/2589/688 1415/3276/688 1426/2590/815 +f 1405/2592/811 1417/3277/811 1416/2593/816 +f 1412/2595/674 1424/3278/674 1423/2596/817 +f 1409/2598/684 1421/3279/684 1420/2599/818 +f 2439/2294/778 2454/2293/778 2455/2601/779 +f 2417/2602/774 2429/2615/774 2430/2603/773 +f 2420/2605/776 2432/2617/776 2433/2606/772 +f 2413/2608/686 2426/2626/686 2425/2609/775 +f 2423/2611/779 2435/2619/779 2436/2612/778 +f 2416/2614/688 2428/2621/688 2429/2615/774 +f 2419/2616/673 2431/2622/673 2432/2617/776 +f 2422/2618/684 2434/3280/684 2435/2619/779 +f 2415/2620/777 2427/2625/777 2428/2621/688 +f 2418/2604/773 2430/2603/773 2431/2622/673 +f 2421/2607/772 2433/2606/772 2434/2623/684 +f 2414/2610/775 2425/2609/775 2427/2625/777 +f 2424/2613/778 2436/2612/778 2426/2626/686 +f 1427/2627/688 1439/2637/688 1440/2628/816 +f 1434/2630/813 1446/2649/813 1447/2631/817 +f 1431/2633/814 1443/2650/814 1444/2634/818 +f 1438/2636/815 1450/2651/815 1439/2637/688 +f 1428/2629/816 1440/2628/816 1441/2638/811 +f 1435/2632/817 1447/2631/817 1448/2640/674 +f 1432/2635/818 1444/2634/818 1445/2642/684 +f 1429/2639/811 1441/2638/811 1442/2644/675 +f 1436/2641/674 1448/2640/674 1449/2646/812 +f 1433/2648/684 1445/3281/684 1446/2649/813 +f 1430/2645/675 1442/2644/675 1443/2650/814 +f 1437/2647/812 1449/2646/812 1450/2651/815 +f 1451/2652/815 1452/2661/812 1464/2653/812 +f 1458/2655/814 1459/2663/675 1471/2656/675 +f 1455/2658/813 1456/3282/684 1468/2659/684 +f 1452/2661/812 1453/2668/674 1465/2662/674 +f 1459/2663/675 1460/2670/811 1472/2664/811 +f 1456/2665/684 1457/2674/818 1469/2666/818 +f 1453/2668/674 1454/2675/817 1466/2669/817 +f 1460/2670/811 1461/2676/816 1473/2671/816 +f 1462/2672/688 1451/2652/815 1463/2654/815 +f 1457/2674/818 1458/2655/814 1470/2657/814 +f 1454/2675/817 1455/2658/813 1467/2660/813 +f 1461/2676/816 1462/2672/688 1474/2673/688 +f 1481/2677/818 1480/3283/684 1492/2678/684 +f 1478/2680/817 1477/3284/674 1489/2681/674 +f 1485/2683/816 1484/3285/811 1496/2684/811 +f 1475/2686/815 1486/3286/688 1498/2687/688 +f 1482/2689/814 1481/3287/818 1493/2690/818 +f 1479/2692/813 1478/3288/817 1490/2693/817 +f 1498/2695/688 1486/3289/688 1485/2696/816 +f 1476/2698/812 1475/3290/815 1487/2699/815 +f 1483/2701/675 1482/3291/814 1494/2702/814 +f 1480/2704/684 1479/3292/813 1491/2705/813 +f 1477/2707/674 1476/3293/812 1488/2708/812 +f 1484/2710/811 1483/3294/675 1495/2711/675 +f 1500/2713/688 1502/2716/815 1501/2714/815 +f 1502/2716/815 1504/2718/812 1503/2717/812 +f 1504/2718/812 1506/2720/674 1505/2719/674 +f 1506/2720/674 1508/2722/817 1507/2721/817 +f 1508/2722/817 1510/2724/813 1509/2723/813 +f 1510/2724/813 1512/3295/684 1511/2725/684 +f 1512/2726/684 1514/2729/818 1513/2727/818 +f 1514/2729/818 1516/2731/814 1515/2730/814 +f 1516/2731/814 1518/2733/675 1517/2732/675 +f 1518/2733/675 1520/2738/811 1519/2734/811 +f 2505/2735/815 2499/3078/815 2497/2736/812 +f 1520/2738/811 1522/2740/816 1521/2739/816 +f 1522/2740/816 1500/2713/688 1499/2715/688 +f 2500/2741/816 2493/3079/816 2498/2742/688 +f 2513/2744/816 2520/2751/816 2515/2745/688 +f 2508/2747/815 2514/2753/815 2516/2748/812 +f 2512/2750/811 2518/2755/811 2520/2751/816 +f 2508/2747/815 2507/3296/688 2515/2752/688 +f 2511/2754/819 2519/3297/819 2518/2755/811 +f 2509/2749/812 2516/2748/812 2517/2756/820 +f 1581/2758/715 1589/2794/851 1590/2759/821 +f 1562/2761/823 1560/2767/829 1559/2762/824 +f 1562/2761/823 1564/2763/825 1563/2764/826 +f 1582/2760/822 1590/2759/821 1584/2766/828 +f 1560/2767/829 1562/2761/823 1576/2768/830 +f 1564/2763/825 1566/2789/836 1565/2769/831 +f 1587/2770/832 1588/2791/849 1580/2771/833 +f 1582/2760/822 1576/2768/830 1574/2773/835 +f 1566/2774/836 1568/2780/841 1567/2775/837 +f 1587/2770/832 1579/2772/834 1578/2777/838 +f 1580/2771/833 1581/2758/715 1574/2773/835 +f 1568/2780/841 1570/2784/844 1569/2781/842 +f 1586/2778/839 1578/2777/838 1577/2782/714 +f 1579/2772/834 1580/2771/833 1572/2779/840 +f 1570/2784/844 1572/2779/840 1571/2785/845 +f 1583/2786/846 1585/2796/843 1577/2787/714 +f 1577/2782/714 1578/2777/838 1568/2780/841 +f 1572/2779/840 1574/2773/835 1573/2788/847 +f 1578/2777/838 1579/2772/834 1570/2784/844 +f 1564/2763/825 1559/2762/824 1577/2787/714 +f 1574/2773/835 1576/2768/830 1575/2790/848 +f 1588/2791/849 1589/2794/851 1581/2758/715 +f 1584/2766/828 1583/2786/846 1559/2762/824 +f 1576/2768/830 1562/2761/823 1561/2765/827 +f 1616/2792/850 1615/2828/827 1561/2765/827 +f 1588/2791/849 1596/2802/855 1597/2793/674 +f 1583/2786/846 1591/2801/854 1593/2795/675 +f 1585/2783/843 1593/3298/675 1594/2797/852 +f 1589/2794/851 1597/2793/674 1598/2798/853 +f 1586/2778/839 1594/2797/852 1595/2799/673 +f 1590/2759/821 1598/2798/853 1592/2800/686 +f 1584/2766/828 1592/2800/686 1591/2801/854 +f 1587/2770/832 1595/2799/673 1596/2802/855 +f 1606/2803/853 1614/2815/853 1613/2804/674 +f 1604/2806/855 1612/2817/855 1611/2807/673 +f 1602/2809/852 1610/2818/852 1609/2810/675 +f 1599/2812/854 1607/2819/854 1608/2813/686 +f 1600/2814/686 1608/2813/686 1614/2815/853 +f 1605/2816/674 1613/3299/674 1612/2817/855 +f 1603/2808/673 1611/2807/673 1610/2818/852 +f 1601/2811/675 1609/2810/675 1607/2819/854 +f 1621/2820/856 1622/2827/862 1630/2821/857 +f 1565/2769/831 1617/2834/859 1616/2792/850 +f 1567/2775/837 1618/2824/860 1617/2823/859 +f 1569/2781/842 1619/2825/842 1618/2824/860 +f 1571/2785/845 1620/2826/861 1619/2825/842 +f 1573/2788/847 1621/2820/856 1620/2826/861 +f 1622/2827/862 1621/2820/856 1573/2788/847 +f 1615/2828/827 1622/2827/862 1575/2790/848 +f 1620/2826/861 1628/2832/864 1627/2829/673 +f 1618/2824/860 1626/2833/865 1625/2830/863 +f 1616/2792/850 1624/2835/866 1623/2831/686 +f 1622/2827/862 1615/2828/827 1623/2831/686 +f 1620/2826/861 1621/2820/856 1629/2822/858 +f 1619/2825/842 1627/2829/673 1626/2833/865 +f 1617/2834/859 1625/3300/863 1624/2835/866 +f 1631/2836/686 1639/2859/686 1646/2837/857 +f 2612/2839/867 2613/3301/868 2601/2840/868 +f 2601/2842/868 2613/3302/868 2614/2843/869 +f 2614/2843/869 2615/3303/870 2603/2845/870 +f 1637/2846/858 1645/2855/858 1644/2847/864 +f 1635/2849/673 1643/2856/673 1642/2850/865 +f 1633/2852/863 1641/3304/863 1640/2853/866 +f 1637/2846/858 1638/2838/857 1646/2837/857 +f 1636/2848/864 1644/2847/864 1643/2856/673 +f 1633/2857/863 1634/2851/865 1642/2850/865 +f 1632/2854/866 1640/2853/866 1639/2859/686 +f 1650/2860/675 1662/3305/675 1661/2861/871 +f 1656/2863/674 1657/3306/872 1669/2864/872 +f 1654/2866/700 1666/3307/700 1665/2867/677 +f 1651/2869/873 1663/3308/873 1662/2870/675 +f 1657/2872/872 1658/3309/874 1670/2873/874 +f 1647/2875/676 1648/3310/698 1660/2876/698 +f 1655/2878/875 1667/3311/875 1666/2879/700 +f 1652/2881/876 1664/3312/876 1663/2882/873 +f 1647/2884/676 1659/3313/676 1670/2885/874 +f 1649/2887/871 1661/3314/871 1660/2888/698 +f 1655/2890/875 1656/3315/674 1668/2891/674 +f 1652/2893/876 1653/3316/677 1665/2894/677 +f 1672/2896/698 1671/2905/676 1683/2897/676 +f 1678/2899/700 1690/2918/700 1691/2900/875 +f 1676/2902/876 1675/2919/873 1687/2903/873 +f 1671/2905/676 1682/2920/874 1694/2906/874 +f 1672/2896/698 1684/2898/698 1685/2907/871 +f 1679/2901/875 1691/2900/875 1692/2909/674 +f 1677/2911/677 1676/2902/876 1688/2904/876 +f 1673/2908/871 1685/2907/871 1686/2913/675 +f 1680/2910/674 1692/2909/674 1693/2915/872 +f 1677/2917/677 1689/3317/677 1690/2918/700 +f 1674/2914/675 1686/2913/675 1687/2903/873 +f 1682/2920/874 1681/2916/872 1693/2915/872 +f 1811/2921/877 1812/3318/707 1824/2922/707 +f 1808/2924/878 1809/3319/673 1821/2925/673 +f 1805/2927/879 1806/3320/706 1818/2928/706 +f 1813/2930/880 1825/3321/880 1824/2931/707 +f 1810/2933/881 1822/3322/881 1821/2934/673 +f 1807/2936/882 1819/3323/882 1818/2937/706 +f 1814/2939/883 1826/3324/883 1825/2940/880 +f 1804/2942/884 1816/3325/884 1815/2943/686 +f 1811/2945/877 1823/3326/877 1822/2946/881 +f 1807/2948/882 1808/3327/878 1820/2949/878 +f 1803/2951/686 1815/3328/686 1826/2952/883 +f 1805/2954/879 1817/3329/879 1816/2955/884 +f 1794/2957/706 1830/2978/706 1831/2958/882 +f 1801/2960/880 1837/2980/880 1838/2961/883 +f 1791/2963/686 1827/2971/686 1828/2964/884 +f 1798/2966/881 1834/2981/881 1835/2967/877 +f 1795/2959/882 1831/2958/882 1832/2969/878 +f 1791/2963/686 1802/2962/883 1838/2961/883 +f 1792/2965/884 1828/2964/884 1829/2972/879 +f 1800/2974/707 1799/2968/877 1835/2967/877 +f 1796/2970/878 1832/2969/878 1833/2976/673 +f 1794/2957/706 1793/2973/879 1829/2972/879 +f 1801/2960/880 1800/3330/707 1836/2979/707 +f 1797/2977/673 1833/2976/673 1834/2981/881 +f 1854/2982/686 1847/3331/885 1839/2983/885 +f 1852/2985/886 1853/3332/887 1845/2986/887 +f 1850/2988/673 1851/3333/888 1843/2989/888 +f 1848/2991/713 1849/3334/889 1841/2992/889 +f 1845/2986/887 1853/3332/887 1854/2982/686 +f 1843/2989/888 1851/3333/888 1852/2994/886 +f 1841/2992/889 1849/3334/889 1850/2988/673 +f 1839/2983/885 1847/3331/885 1848/2991/713 +f 1895/2996/684 1907/3335/684 1908/2997/813 +f 1892/2999/675 1904/3019/675 1905/3000/814 +f 1899/3002/812 1911/3020/812 1912/3003/815 +f 1889/3005/688 1901/3012/688 1902/3006/816 +f 1896/2998/813 1908/2997/813 1909/3008/817 +f 1893/3001/814 1905/3000/814 1906/3010/818 +f 1900/3004/815 1912/3003/815 1901/3012/688 +f 1890/3007/816 1902/3006/816 1903/3013/811 +f 1897/3009/817 1909/3008/817 1910/3015/674 +f 1894/3011/818 1906/3010/818 1907/3017/684 +f 1891/3014/811 1903/3013/811 1904/3019/675 +f 1898/3016/674 1910/3015/674 1911/3020/812 +f 1877/3021/688 1913/3336/688 1924/3022/815 +f 1879/3024/811 1915/3337/811 1914/3025/816 +f 1886/3027/674 1922/3338/674 1921/3028/817 +f 1883/3030/684 1919/3339/684 1918/3031/818 +f 1880/3033/675 1916/3340/675 1915/3034/811 +f 1887/3036/812 1923/3341/812 1922/3037/674 +f 1884/3039/813 1920/3342/813 1919/3040/684 +f 1881/3042/814 1917/3343/814 1916/3043/675 +f 1888/3045/815 1924/3344/815 1923/3046/812 +f 1878/3048/816 1914/3345/816 1913/3049/688 +f 1885/3051/817 1921/3346/817 1920/3052/813 +f 1882/3054/818 1918/3347/818 1917/3055/814 +f 1968/3057/890 1969/3348/891 1961/3058/891 +f 1971/3060/675 1972/3349/892 1964/3061/892 +f 1969/3063/891 1970/3350/893 1962/3064/893 +f 1964/3061/892 1972/3349/892 1965/3066/894 +f 1967/3068/674 1968/3057/890 1960/3059/890 +f 1962/3064/893 1970/3350/893 1971/3060/675 +f 1966/3070/895 1967/3068/674 1959/3069/674 +f 1957/3067/894 1965/3066/894 1966/3070/895 +f 2504/2737/812 2497/2736/812 2496/3072/820 +f 2502/3074/819 2494/3351/819 2495/3075/811 +f 2505/2735/815 2506/3352/688 2498/3077/688 +f 2501/3076/811 2495/3075/811 2493/3079/816 +f 1991/3080/688 1999/3090/688 1998/3081/676 +f 1996/3083/680 2004/3093/680 2003/3084/684 +f 1994/3086/677 2002/3095/677 2001/3087/673 +f 1992/3089/678 2000/3096/678 1999/3090/688 +f 1990/3082/676 1998/3081/676 1997/3091/686 +f 1989/3092/686 1997/3091/686 2004/3093/680 +f 1995/3094/684 2003/3353/684 2002/3095/677 +f 1993/3088/673 2001/3087/673 2000/3096/678 +f 2611/3097/897 2612/2839/867 2600/2841/867 +f 2603/3099/870 2615/3354/870 2616/3100/898 +f 2604/3101/898 2616/3100/898 2617/3102/899 +f 2605/3104/899 2617/3355/899 2618/3105/900 +f 2618/3105/900 2619/3356/901 2607/3107/901 +f 2619/3108/901 2620/3357/902 2608/3109/902 +f 2608/3109/902 2620/3357/902 2609/3111/903 +f 2609/3113/903 2610/3116/904 2598/3114/904 +f 2610/3116/904 2611/3358/897 2599/3117/897 +f 2017/3118/688 2033/3125/688 2032/3119/732 +f 2010/3121/723 2026/3127/723 2025/3122/684 +f 2018/3124/735 2034/3129/735 2033/3125/688 +f 2010/3121/723 2011/3131/677 2027/3126/677 +f 2019/3128/676 2035/3133/676 2034/3129/735 +f 2012/3130/726 2028/3135/726 2027/3126/677 +f 2020/3132/739 2036/3137/739 2035/3133/676 +f 2012/3130/726 2013/3142/673 2029/3134/673 +f 2005/3136/686 2023/3150/686 2036/3137/739 +f 2007/3138/680 2022/3146/680 2021/3139/717 +f 2014/3141/729 2030/3144/729 2029/3134/673 +f 2014/3141/729 2015/3147/678 2031/3143/678 +f 2008/3145/720 2024/3149/720 2022/3146/680 +f 2016/3120/732 2032/3119/732 2031/3143/678 +f 2009/3148/684 2025/3359/684 2024/3149/720 +f 2005/3136/686 2006/3140/717 2021/3139/717 +f 2250/3151/905 2266/3184/937 2267/3152/906 +f 2272/3154/908 2271/3175/929 2287/3155/909 +f 2259/3157/911 2258/3185/938 2274/3158/912 +f 2252/3160/914 2251/3153/907 2267/3152/906 +f 2260/3162/916 2259/3157/911 2275/3159/913 +f 2252/3160/914 2268/3161/915 2269/3164/918 +f 2246/3166/920 2262/3169/923 2261/3167/921 +f 2246/3166/920 2260/3162/916 2276/3163/917 +f 2254/3170/924 2253/3165/919 2269/3164/918 +f 2245/3168/922 2261/3167/921 2263/3172/926 +f 2255/3174/928 2254/3170/924 2270/3171/925 +f 2248/3176/930 2247/3173/927 2263/3172/926 +f 2255/3174/928 2271/3175/929 2272/3154/908 +f 2248/3176/930 2264/3177/931 2265/3179/933 +f 2256/3178/932 2272/3154/908 2273/3181/935 +f 2250/3151/905 2249/3360/934 2265/3183/933 +f 2258/3185/938 2257/3182/936 2273/3181/935 +f 2264/3177/931 2280/3361/952 2281/3186/939 +f 2272/3154/908 2288/3362/910 2289/3187/940 +f 2265/3183/933 2281/3363/939 2282/3188/941 +f 2273/3181/935 2289/3364/940 2290/3189/942 +f 2266/3184/937 2282/3365/941 2283/3190/943 +f 2275/3159/913 2274/3158/912 2290/3191/942 +f 2268/3161/915 2267/3152/906 2283/3193/943 +f 2275/3159/913 2291/3366/944 2292/3195/946 +f 2269/3164/918 2268/3161/915 2284/3196/945 +f 2262/3169/923 2278/3367/949 2277/3198/948 +f 2276/3163/917 2292/3368/946 2278/3199/949 +f 2269/3164/918 2285/3369/947 2286/3200/950 +f 2261/3167/921 2277/3370/948 2279/3201/951 +f 2270/3171/925 2286/3371/950 2287/3202/909 +f 2263/3172/926 2279/3372/951 2280/3203/952 +f 2631/3204/953 2643/3373/953 2642/3205/690 +f 2628/3207/693 2640/3220/693 2639/3208/704 +f 2625/3210/954 2637/3374/954 2636/3211/691 +f 2631/3213/953 2632/3225/692 2644/3214/692 +f 2622/3216/695 2634/3227/695 2633/3217/705 +f 2628/3207/693 2629/3375/955 2641/3219/955 +f 2625/3221/954 2626/3231/694 2638/3222/694 +f 2621/3224/705 2633/3376/705 2644/3214/692 +f 2622/3216/695 2623/3377/956 2635/3226/956 +f 2630/3206/690 2642/3205/690 2641/3228/955 +f 2627/3230/704 2639/3378/704 2638/3222/694 +f 2624/3212/691 2636/3211/691 2635/3232/956 diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_crate_desh.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_crate_desh.png index ba84eb2146e5fb8d77ee5f24ef5850d7cbc97df7..5946a1293786871d2879adce827ec36c283123a4 100644 GIT binary patch literal 1458 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 ev Date: Fri, 19 Aug 2022 11:23:22 +0200 Subject: [PATCH 015/111] tooltips for persistent containers --- .../hbm/blocks/IPersistentInfoProvider.java | 12 ++++++ .../hbm/blocks/machine/BlockFluidBarrel.java | 15 +++++++- .../hbm/blocks/machine/MachineBattery.java | 37 +++++++++++++++++-- .../blocks/machine/MachineBigAssTank9000.java | 16 +++++++- .../com/hbm/blocks/machine/MachineFENSU.java | 11 +++++- .../hbm/blocks/machine/MachineFluidTank.java | 15 +++++++- .../java/com/hbm/crafting/ToolRecipes.java | 3 +- .../com/hbm/items/block/ItemBlockBase.java | 12 +++++- .../hbm/items/tool/ItemToolAbilityFueled.java | 8 ++++ .../render/tileentity/RenderFluidTank.java | 33 +++++++++++++---- .../com/hbm/tileentity/IPersistentNBT.java | 12 ++++-- .../machine/TileEntityMachineMiningLaser.java | 5 --- .../machine/storage/TileEntityBarrel.java | 6 +-- .../storage/TileEntityMachineBattery.java | 22 ++++++++++- .../storage/TileEntityMachineFluidTank.java | 4 +- .../turret/TileEntityTurretMaxwell.java | 9 ++++- 16 files changed, 186 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/IPersistentInfoProvider.java diff --git a/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java b/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java new file mode 100644 index 000000000..ce033b3cb --- /dev/null +++ b/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java @@ -0,0 +1,12 @@ +package com.hbm.blocks; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public interface IPersistentInfoProvider { + + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext); +} diff --git a/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java b/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java index 8bea5bb4f..a2b70c655 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java +++ b/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java @@ -1,12 +1,17 @@ package com.hbm.blocks.machine; import java.util.ArrayList; +import java.util.List; import java.util.Random; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityBarrel; +import com.hbm.util.I18nUtil; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; @@ -22,10 +27,11 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockFluidBarrel extends BlockContainer { +public class BlockFluidBarrel extends BlockContainer implements IPersistentInfoProvider { int capacity; @@ -156,4 +162,11 @@ public class BlockFluidBarrel extends BlockContainer { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + tank.readFromNBT(persistentTag, "tank"); + list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineBattery.java b/src/main/java/com/hbm/blocks/machine/MachineBattery.java index f09e3e8f9..c96d2f901 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBattery.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBattery.java @@ -5,10 +5,11 @@ import java.util.List; import java.util.Random; import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityDiFurnace; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityMachineBattery; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; @@ -26,13 +27,15 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class MachineBattery extends BlockContainer implements ILookOverlay { +public class MachineBattery extends BlockContainer implements ILookOverlay, IPersistentInfoProvider { private final Random field_149933_a = new Random(); private static boolean keepInventory; @@ -143,8 +146,10 @@ public class MachineBattery extends BlockContainer implements ILookOverlay { } if(itemStack.hasDisplayName()) { - ((TileEntityDiFurnace) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); + ((TileEntityMachineBattery) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); } + + IPersistentNBT.restoreData(world, x, y, z, itemStack); } @Override @@ -249,4 +254,30 @@ public class MachineBattery extends BlockContainer implements ILookOverlay { TileEntityMachineBattery battery = (TileEntityMachineBattery) te; return battery.getComparatorPower(); } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { + + if(!player.capabilities.isCreativeMode) { + harvesters.set(player); + this.dropBlockAsItem(world, x, y, z, meta, 0); + harvesters.set(null); + } + } + + @Override + public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { + player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); + player.addExhaustion(0.025F); + } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.YELLOW + "" + BobMathUtil.getShortNumber(persistentTag.getLong("power")) + "/" + BobMathUtil.getShortNumber(this.maxPower) + "HE"); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java index caa8d11c0..af50f4738 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java @@ -1,24 +1,31 @@ package com.hbm.blocks.machine; import java.util.ArrayList; +import java.util.List; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandlerXR; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.storage.TileEntityMachineBAT9000; +import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineBigAssTank9000 extends BlockDummyable { +public class MachineBigAssTank9000 extends BlockDummyable implements IPersistentInfoProvider { public MachineBigAssTank9000(Material mat) { super(mat); @@ -91,4 +98,11 @@ public class MachineBigAssTank9000 extends BlockDummyable { public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { return IPersistentNBT.getDrops(world, x, y, z, this); } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + tank.readFromNBT(persistentTag, "tank"); + list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineFENSU.java b/src/main/java/com/hbm/blocks/machine/MachineFENSU.java index 3860f2096..1acebe7e4 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFENSU.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFENSU.java @@ -5,9 +5,9 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityMachineBattery; import com.hbm.tileentity.machine.storage.TileEntityMachineFENSU; import com.hbm.util.BobMathUtil; @@ -17,11 +17,13 @@ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class MachineFENSU extends BlockDummyable implements ILookOverlay { +public class MachineFENSU extends BlockDummyable implements ILookOverlay, IPersistentInfoProvider { public MachineFENSU(Material mat) { super(mat); @@ -93,4 +95,9 @@ public class MachineFENSU extends BlockDummyable implements ILookOverlay { ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.YELLOW + "" + BobMathUtil.getShortNumber(persistentTag.getLong("power")) + "/" + BobMathUtil.getShortNumber(Long.MAX_VALUE) + "HE"); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java index cfa8bbad1..bc4094202 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java @@ -1,15 +1,20 @@ package com.hbm.blocks.machine; import java.util.ArrayList; +import java.util.List; import java.util.Random; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandler; import com.hbm.interfaces.IMultiblock; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.storage.TileEntityMachineFluidTank; +import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -24,10 +29,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class MachineFluidTank extends BlockContainer implements IMultiblock { +public class MachineFluidTank extends BlockContainer implements IMultiblock, IPersistentInfoProvider { public MachineFluidTank(Material p_i45386_1_) { super(p_i45386_1_); @@ -342,4 +348,11 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + tank.readFromNBT(persistentTag, "tank"); + list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); + } } diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index cce37dadf..1657bec8b 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -10,6 +10,7 @@ import com.hbm.items.machine.ItemBattery; import com.hbm.items.tool.ItemModMinecart; import com.hbm.items.tool.ItemModMinecart.EnumCartBase; import com.hbm.items.tool.ItemModMinecart.EnumMinecart; +import com.hbm.items.tool.ItemToolAbilityFueled; import com.hbm.main.CraftingManager; import net.minecraft.init.Blocks; @@ -78,7 +79,7 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.mese_pickaxe, 1), new Object[] { " SD", "APS", "FA ", 'S', ModItems.blades_desh, 'D', ModItems.powder_dineutronium, 'A', ModItems.plate_paa, 'P', ModItems.chlorophyte_pickaxe, 'F', ModItems.shimmer_handle }); //Chainsaws - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', ModItems.canister_empty }); + CraftingManager.addRecipeAuto(ItemToolAbilityFueled.getEmptyTool(ModItems.chainsaw), new Object[] { "CCH", "BBP", "CCE", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', ModBlocks.chain, 'E', ModItems.canister_empty }); //Misc CraftingManager.addRecipeAuto(new ItemStack(ModItems.euphemium_stopper, 1), new Object[] { "I", "S", "S", 'I', EUPH.ingot(), 'S', KEY_STICK }); diff --git a/src/main/java/com/hbm/items/block/ItemBlockBase.java b/src/main/java/com/hbm/items/block/ItemBlockBase.java index a38a2199d..04823443b 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockBase.java +++ b/src/main/java/com/hbm/items/block/ItemBlockBase.java @@ -4,7 +4,9 @@ import java.util.List; import com.hbm.blocks.BlockEnumMulti; import com.hbm.blocks.IBlockMulti; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.util.EnumUtil; import cpw.mods.fml.relauncher.Side; @@ -14,6 +16,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.IIcon; public class ItemBlockBase extends ItemBlock { @@ -48,10 +51,15 @@ public class ItemBlockBase extends ItemBlock { } @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { if(field_150939_a instanceof ITooltipProvider) { - ((ITooltipProvider) field_150939_a).addInformation(itemstack, player, list, bool); + ((ITooltipProvider) field_150939_a).addInformation(stack, player, list, bool); + } + + if(field_150939_a instanceof IPersistentInfoProvider && stack.hasTagCompound() && stack.getTagCompound().hasKey(IPersistentNBT.NBT_PERSISTENT_KEY)) { + NBTTagCompound data = stack.getTagCompound().getCompoundTag(IPersistentNBT.NBT_PERSISTENT_KEY); + ((IPersistentInfoProvider) field_150939_a).addInformation(stack, data, player, list, bool); } } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java index 11cd40a3e..3af794c96 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java @@ -10,6 +10,7 @@ import api.hbm.fluid.IFillableItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; @@ -113,4 +114,11 @@ public class ItemToolAbilityFueled extends ItemToolAbility implements IFillableI public int tryEmpty(FluidType type, int amount, ItemStack stack) { return amount; } + + public static ItemStack getEmptyTool(Item item) { + ItemToolAbilityFueled tool = (ItemToolAbilityFueled) item; + ItemStack stack = new ItemStack(item); + tool.setFill(stack, 0); + return stack; + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderFluidTank.java b/src/main/java/com/hbm/render/tileentity/RenderFluidTank.java index 239ef1ee9..2966ec618 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFluidTank.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFluidTank.java @@ -5,15 +5,19 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.render.util.DiamondPronter; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityMachineFluidTank; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; @@ -37,12 +41,9 @@ public class RenderFluidTank extends TileEntitySpecialRenderer implements IItemR GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.tank_tex); ResourceManager.fluidtank.renderPart("Frame"); - - String s = "NONE"; - if(tileEntity instanceof TileEntityMachineFluidTank) - s = ((TileEntityMachineFluidTank) tileEntity).tank.getTankType().getName(); - - bindTexture(new ResourceLocation(RefStrings.MODID, "textures/models/tank/tank_" + s + ".png")); + + TileEntityMachineFluidTank tank = (TileEntityMachineFluidTank) tileEntity; + bindTexture(new ResourceLocation(RefStrings.MODID, getTextureFromType(tank.tank.getTankType()))); ResourceManager.fluidtank.renderPart("Tank"); GL11.glShadeModel(GL11.GL_FLAT); @@ -70,6 +71,15 @@ public class RenderFluidTank extends TileEntitySpecialRenderer implements IItemR GL11.glPopMatrix(); RenderHelper.enableStandardItemLighting(); } + + public String getTextureFromType(FluidType type) { + String s = type.getName(); + + if(type.isAntimatter() || (type.hasTrait(FT_Corrosive.class) && type.getTrait(FT_Corrosive.class).isHighlyCorrosive())) + s = "DANGER"; + + return "textures/models/tank/tank_" + s + ".png"; + } @Override public Item getItemForRenderer() { @@ -85,12 +95,19 @@ public class RenderFluidTank extends TileEntitySpecialRenderer implements IItemR GL11.glTranslated(0, -2, 0); GL11.glScaled(3.5, 3.5, 3.5); } - public void renderCommon() { + public void renderCommonWithStack(ItemStack item) { GL11.glRotated(90, 0, 1, 0); GL11.glScaled(0.75, 0.75, 0.75); GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.tank_tex); ResourceManager.fluidtank.renderPart("Frame"); - bindTexture(ResourceManager.tank_label_tex); ResourceManager.fluidtank.renderPart("Tank"); + + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + if(item.hasTagCompound() && item.getTagCompound().hasKey(IPersistentNBT.NBT_PERSISTENT_KEY)) { + tank.readFromNBT(item.getTagCompound().getCompoundTag(IPersistentNBT.NBT_PERSISTENT_KEY), "tank"); + } + + bindTexture(new ResourceLocation(RefStrings.MODID, getTextureFromType(tank.getTankType()))); + ResourceManager.fluidtank.renderPart("Tank"); GL11.glShadeModel(GL11.GL_FLAT); }}; } diff --git a/src/main/java/com/hbm/tileentity/IPersistentNBT.java b/src/main/java/com/hbm/tileentity/IPersistentNBT.java index 159ad3fc4..61195a6c0 100644 --- a/src/main/java/com/hbm/tileentity/IPersistentNBT.java +++ b/src/main/java/com/hbm/tileentity/IPersistentNBT.java @@ -9,6 +9,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public interface IPersistentNBT { + + public static final String NBT_PERSISTENT_KEY = "persistent"; public void writeNBT(NBTTagCompound nbt); public void readNBT(NBTTagCompound nbt); @@ -33,8 +35,12 @@ public interface IPersistentNBT { } public static void restoreData(World world, int x, int y, int z, ItemStack stack) { - if(!stack.hasTagCompound()) return; - IPersistentNBT tile = (IPersistentNBT) world.getTileEntity(x, y, z); - tile.readNBT(stack.stackTagCompound); + try { + if(!stack.hasTagCompound()) return; + IPersistentNBT tile = (IPersistentNBT) world.getTileEntity(x, y, z); + tile.readNBT(stack.stackTagCompound); + } catch(Exception ex) { + ex.printStackTrace(); + } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index 816395e8f..43f495f8a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -402,11 +402,6 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen for(int z = -range; z <= range; z++) { if(worldObj.getBlock(x + xCoord, targetY, z + zCoord).getMaterial().isLiquid()) { - /*targetX = x + xCoord; - targetZ = z + zCoord; - worldObj.func_147480_a(x + xCoord, targetY, z + zCoord, false); - beam = true;*/ - continue; } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 47f5cb221..4d4256312 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -226,13 +226,13 @@ public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcc public void writeNBT(NBTTagCompound nbt) { NBTTagCompound data = new NBTTagCompound(); this.tank.writeToNBT(data, "tank"); - data.getShort("mode"); - nbt.setTag("persistent", data); + data.setShort("mode", mode); + nbt.setTag(NBT_PERSISTENT_KEY, data); } @Override public void readNBT(NBTTagCompound nbt) { - NBTTagCompound data = nbt.getCompoundTag("persistent"); + NBTTagCompound data = nbt.getCompoundTag(NBT_PERSISTENT_KEY); this.tank.readFromNBT(data, "tank"); this.mode = data.getShort("nbt"); } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index 3ea4d1d0d..88864eb4e 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine.storage; import com.hbm.blocks.machine.MachineBattery; import com.hbm.lib.Library; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energy.IBatteryItem; @@ -21,7 +22,7 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.SimpleComponent; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyUser, SimpleComponent { +public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyUser, IPersistentNBT, SimpleComponent { public long[] log = new long[20]; public long power = 0; @@ -326,4 +327,23 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public Object[] getMaxEnergy(Context context, Arguments args) { return new Object[] {getMaxPower()}; } + + @Override + public void writeNBT(NBTTagCompound nbt) { + NBTTagCompound data = new NBTTagCompound(); + data.setLong("power", power); + data.setShort("redLow", redLow); + data.setShort("redHigh", redHigh); + data.setInteger("priority", this.priority.ordinal()); + nbt.setTag(NBT_PERSISTENT_KEY, data); + } + + @Override + public void readNBT(NBTTagCompound nbt) { + NBTTagCompound data = nbt.getCompoundTag(NBT_PERSISTENT_KEY); + this.power = data.getLong("power"); + this.redLow = data.getShort("redLow"); + this.redHigh = data.getShort("redHigh"); + this.priority = ConnectionPriority.values()[data.getInteger("priority")]; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index ee7acb06e..a2d8df30a 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -214,12 +214,12 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements NBTTagCompound data = new NBTTagCompound(); this.tank.writeToNBT(data, "tank"); data.setShort("mode", mode); - nbt.setTag("persistent", data); + nbt.setTag(NBT_PERSISTENT_KEY, data); } @Override public void readNBT(NBTTagCompound nbt) { - NBTTagCompound data = nbt.getCompoundTag("persistent"); + NBTTagCompound data = nbt.getCompoundTag(NBT_PERSISTENT_KEY); this.tank.readFromNBT(data, "tank"); this.mode = data.getShort("mode"); } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index 99037829b..413a166ad 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -57,6 +57,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { ammoStacks.add(new ItemStack(ModItems.upgrade_overdrive_2)); ammoStacks.add(new ItemStack(ModItems.upgrade_overdrive_3)); ammoStacks.add(new ItemStack(ModItems.upgrade_5g)); + ammoStacks.add(new ItemStack(ModItems.upgrade_screm)); return ammoStacks; } @@ -143,6 +144,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { this.blackLevel = 0; this.pinkLevel = 0; this._5g = false; + this.screm = false; for(int i = 1; i < 10; i++) { if(slots[i] != null) { @@ -164,6 +166,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { if(item == ModItems.upgrade_overdrive_2) blackLevel += 2; if(item == ModItems.upgrade_overdrive_3) blackLevel += 3; if(item == ModItems.upgrade_5g) _5g = true; + if(item == ModItems.upgrade_screm) screm = true; } } } @@ -180,6 +183,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { int blackLevel; int pinkLevel; boolean _5g; + boolean screm; int checkDelay; @@ -206,7 +210,10 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { vdat.setInteger("ent", this.target.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ), new TargetPoint(this.target.dimension, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ, 150)); - worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); + if(this.screm) + worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "hbm:block.screm", 20.0F, 1.0F); + else + worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); } this.power -= demand; From 82a26a929d98f8edeee09e0c95c7704ab0955a88 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 19 Aug 2022 15:21:58 +0200 Subject: [PATCH 016/111] a command for diagnostic and suicide --- src/main/java/com/hbm/main/MainRegistry.java | 3 + .../java/com/hbm/util/SuicideThreadDump.java | 85 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/com/hbm/util/SuicideThreadDump.java diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 0ca3b45af..e715ee150 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -69,6 +69,7 @@ import com.hbm.tileentity.bomb.TileEntityNukeCustom; import com.hbm.tileentity.machine.*; import com.hbm.tileentity.machine.rbmk.RBMKDials; import com.hbm.util.ArmorUtil; +import com.hbm.util.SuicideThreadDump; import com.hbm.world.feature.*; import com.hbm.world.generator.CellularDungeonFactory; @@ -809,6 +810,8 @@ public class MainRegistry { new OreCave(ModBlocks.stone_resource, 0).setThreshold(1.5D).setRangeMult(20).setYLevel(30).setMaxRange(20).withFluid(ModBlocks.sulfuric_acid_block); //sulfur new OreCave(ModBlocks.stone_resource, 1).setThreshold(1.75D).setRangeMult(20).setYLevel(25).setMaxRange(20); //asbestos //new OreLayer(Blocks.coal_ore, 0.2F).setThreshold(4).setRangeMult(3).setYLevel(70); + + SuicideThreadDump.register(); } @EventHandler diff --git a/src/main/java/com/hbm/util/SuicideThreadDump.java b/src/main/java/com/hbm/util/SuicideThreadDump.java new file mode 100644 index 000000000..39ad116a2 --- /dev/null +++ b/src/main/java/com/hbm/util/SuicideThreadDump.java @@ -0,0 +1,85 @@ +package com.hbm.util; + +import java.lang.management.ManagementFactory; +import java.lang.management.MonitorInfo; +import java.lang.management.ThreadInfo; + +import org.apache.logging.log4j.Level; + +import com.hbm.main.MainRegistry; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.FMLLaunchHandler; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.client.ClientCommandHandler; + +public class SuicideThreadDump extends CommandBase { + + public static void register() { + if(FMLLaunchHandler.side() != Side.CLIENT) return; + ClientCommandHandler handler = ClientCommandHandler.instance; + handler.registerCommand(new SuicideThreadDump()); + } + + @Override + public String getCommandName() { + return "dumpthreadsandcrashgame"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/dumpthreadsandcrashgame [dump/crash]"; + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender sender) { + return sender instanceof EntityPlayer; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + + if(args.length != 1 || !(args[0].equals("dump") || args[0].equals("crash"))) { + throw new CommandException("Requires argument \"dump\" or \"crash\"!"); + } + + ThreadInfo[] threads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true); + + for(ThreadInfo thread : threads) { + dumpThread(thread); + } + + if(args[0].equals("crash")) { + FMLCommonHandler.instance().exitJava(0, true); + } + } + + private static void dumpThread(ThreadInfo info) { + + MainRegistry.logger.log(Level.FATAL, "==========================================="); + MainRegistry.logger.log(Level.FATAL, "Thread: " + info.getThreadName() + " PID: " + info.getThreadId()); + MainRegistry.logger.log(Level.FATAL, "Suspended: " + info.isSuspended()); + MainRegistry.logger.log(Level.FATAL, "Blocked: " + info.getBlockedTime() + "ms, " + info.getBlockedCount() + "x"); + MainRegistry.logger.log(Level.FATAL, "Runs Native: " + info.isInNative()); + MainRegistry.logger.log(Level.FATAL, "State: " + info.getThreadState().name()); + MainRegistry.logger.log(Level.FATAL, "-------------------------------------------"); + + if(info.getLockedMonitors().length != 0) { + MainRegistry.logger.log(Level.FATAL, "Following locks found:"); + for(MonitorInfo monitor : info.getLockedMonitors()) { + MainRegistry.logger.log(Level.FATAL, "- " + monitor.getLockedStackFrame()); + } + MainRegistry.logger.log(Level.FATAL, "-------------------------------------------"); + } + + MainRegistry.logger.log(Level.FATAL, "Stacktrace:"); + for(StackTraceElement line : info.getStackTrace()) { + MainRegistry.logger.log(Level.FATAL, "- " + line); + } + MainRegistry.logger.log(Level.FATAL, "==========================================="); + } +} From ee11de50fa4a291694daea3bf0c01e8810a34e7e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 21 Aug 2022 17:55:38 +0200 Subject: [PATCH 017/111] the ferociouss chemical spewer --- src/main/java/com/hbm/blocks/ModBlocks.java | 30 +- .../hbm/blocks/machine/MachineFluidTank.java | 31 +- .../com/hbm/blocks/machine/MachineOrbus.java | 25 +- .../java/com/hbm/crafting/WeaponRecipes.java | 1 + .../java/com/hbm/entity/EntityMappings.java | 1 + .../hbm/entity/projectile/EntityChemical.java | 364 +++++++++++++ .../entity/projectile/EntityThrowableNT.java | 2 +- .../java/com/hbm/extprop/HbmLivingProps.java | 12 + .../com/hbm/handler/EntityEffectHandler.java | 24 + .../java/com/hbm/handler/ToolAbility.java | 91 ++-- .../hbm/handler/guncfg/GunEnergyFactory.java | 2 +- .../hbm/interfaces/IPartiallyFillable.java | 22 - .../java/com/hbm/inventory/fluid/Fluids.java | 20 +- .../fluid/trait/FT_VentRadiation.java | 4 + .../fluid/trait/FluidTraitSimple.java | 7 +- .../com/hbm/items/IHeldSoundProvider.java | 5 + src/main/java/com/hbm/items/ModItems.java | 2 +- .../java/com/hbm/items/armor/ArmorFSB.java | 2 +- .../java/com/hbm/items/armor/JetpackBase.java | 50 +- .../com/hbm/items/block/ItemBlockLore.java | 3 +- .../com/hbm/items/special/ItemSyringe.java | 11 +- .../java/com/hbm/items/tool/IItemAbility.java | 48 ++ .../java/com/hbm/items/tool/ItemChainsaw.java | 35 ++ .../com/hbm/items/tool/ItemToolAbility.java | 4 +- .../hbm/items/tool/ItemToolAbilityFueled.java | 2 +- .../hbm/items/tool/ItemToolAbilityPower.java | 2 +- .../hbm/items/weapon/ItemGunChemthrower.java | 11 +- .../java/com/hbm/lib/ModDamageSource.java | 2 + src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 54 ++ .../com/hbm/main/ModEventHandlerClient.java | 1 - .../java/com/hbm/main/ResourceManager.java | 2 + .../entity/projectile/RenderChemical.java | 170 ++++++ .../item/weapon/ItemRenderChainsaw.java | 131 +++++ .../weapon/ItemRenderWeaponChemthrower.java | 12 +- .../com/hbm/tileentity/IPersistentNBT.java | 6 +- .../machine/storage/TileEntityBarrel.java | 1 + .../storage/TileEntityMachineFluidTank.java | 1 + src/main/resources/assets/hbm/lang/de_DE.lang | 5 +- src/main/resources/assets/hbm/lang/en_US.lang | 3 + .../assets/hbm/models/weapons/chainsaw.obj | 505 ++++++++++++++++++ .../hbm/sounds/weapon/chainsaw_loop.ogg | Bin 0 -> 14025 bytes .../hbm/textures/models/weapons/chainsaw.png | Bin 0 -> 1637 bytes .../textures/models/weapons/chemthrower.png | Bin 3810 -> 3572 bytes src/main/resources/mcmod.info | 2 +- 45 files changed, 1559 insertions(+), 149 deletions(-) create mode 100644 src/main/java/com/hbm/entity/projectile/EntityChemical.java delete mode 100644 src/main/java/com/hbm/interfaces/IPartiallyFillable.java create mode 100644 src/main/java/com/hbm/items/IHeldSoundProvider.java create mode 100644 src/main/java/com/hbm/items/tool/ItemChainsaw.java create mode 100644 src/main/java/com/hbm/render/entity/projectile/RenderChemical.java create mode 100644 src/main/java/com/hbm/render/item/weapon/ItemRenderChainsaw.java create mode 100644 src/main/resources/assets/hbm/models/weapons/chainsaw.obj create mode 100644 src/main/resources/assets/hbm/sounds/weapon/chainsaw_loop.ogg create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/chainsaw.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 545cfe47f..8e507f00f 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -3127,18 +3127,18 @@ public class ModBlocks { GameRegistry.registerBlock(ladder_lead, ladder_lead.getUnlocalizedName()); GameRegistry.registerBlock(ladder_cobalt, ladder_cobalt.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_plastic, ItemBlockLore.class, barrel_plastic.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_corroded, ItemBlockLore.class, barrel_corroded.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_iron, ItemBlockLore.class, barrel_iron.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_steel, ItemBlockLore.class, barrel_steel.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_tcalloy, ItemBlockLore.class, barrel_tcalloy.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_antimatter, ItemBlockLore.class, barrel_antimatter.getUnlocalizedName()); - GameRegistry.registerBlock(machine_battery_potato, machine_battery_potato.getUnlocalizedName()); - GameRegistry.registerBlock(machine_battery, machine_battery.getUnlocalizedName()); - GameRegistry.registerBlock(machine_lithium_battery, machine_lithium_battery.getUnlocalizedName()); - GameRegistry.registerBlock(machine_schrabidium_battery, machine_schrabidium_battery.getUnlocalizedName()); - GameRegistry.registerBlock(machine_dineutronium_battery, machine_dineutronium_battery.getUnlocalizedName()); - GameRegistry.registerBlock(machine_fensu, machine_fensu.getUnlocalizedName()); + register(barrel_plastic); + register(barrel_corroded); + register(barrel_iron); + register(barrel_steel); + register(barrel_tcalloy); + register(barrel_antimatter); + register(machine_battery_potato); + register(machine_battery); + register(machine_lithium_battery); + register(machine_schrabidium_battery); + register(machine_dineutronium_battery); + register(machine_fensu); GameRegistry.registerBlock(machine_transformer, machine_transformer.getUnlocalizedName()); GameRegistry.registerBlock(machine_transformer_20, machine_transformer_20.getUnlocalizedName()); GameRegistry.registerBlock(machine_transformer_dnt, machine_transformer_dnt.getUnlocalizedName()); @@ -3154,9 +3154,9 @@ public class ModBlocks { GameRegistry.registerBlock(machine_assemfac, machine_assemfac.getUnlocalizedName()); GameRegistry.registerBlock(machine_chemplant, machine_chemplant.getUnlocalizedName()); GameRegistry.registerBlock(machine_chemfac, machine_chemfac.getUnlocalizedName()); - GameRegistry.registerBlock(machine_fluidtank, machine_fluidtank.getUnlocalizedName()); - GameRegistry.registerBlock(machine_bat9000, machine_bat9000.getUnlocalizedName()); - GameRegistry.registerBlock(machine_orbus, machine_orbus.getUnlocalizedName()); + register(machine_fluidtank); + register(machine_bat9000); + register(machine_orbus); GameRegistry.registerBlock(machine_boiler_off, machine_boiler_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_boiler_on, machine_boiler_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_boiler_electric_on, machine_boiler_electric_on.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java index bc4094202..1b5e3670d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java @@ -85,6 +85,9 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe @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; + + ItemStack drop = itemStack.copy(); + drop.stackSize = 1; if (i == 0) { world.setBlockMetadataWithNotify(x, y, z, 5, 2); @@ -128,8 +131,11 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe DummyBlockFluidTank.safeBreak = false; // - } else - world.func_147480_a(x, y, z, true); + } else { + this.dropBlockAsItem(world, x, y, z, drop); + world.func_147480_a(x, y, z, false); + System.out.println("piss and shit"); + } } if (i == 1) { world.setBlockMetadataWithNotify(x, y, z, 3, 2); @@ -173,8 +179,11 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe DummyBlockFluidTank.safeBreak = false; // - } else - world.func_147480_a(x, y, z, true); + } else { + this.dropBlockAsItem(world, x, y, z, drop); + world.func_147480_a(x, y, z, false); + System.out.println("piss and shit"); + } } if (i == 2) { world.setBlockMetadataWithNotify(x, y, z, 4, 2); @@ -218,8 +227,11 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe DummyBlockFluidTank.safeBreak = false; // - } else - world.func_147480_a(x, y, z, true); + } else { + this.dropBlockAsItem(world, x, y, z, drop); + world.func_147480_a(x, y, z, false); + System.out.println("piss and shit"); + } } if (i == 3) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); @@ -263,8 +275,11 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe DummyBlockFluidTank.safeBreak = false; // - } else - world.func_147480_a(x, y, z, true); + } else { + this.dropBlockAsItem(world, x, y, z, drop); + world.func_147480_a(x, y, z, false); + System.out.println("piss and shit"); + } } IPersistentNBT.restoreData(world, x, y, z, itemStack); diff --git a/src/main/java/com/hbm/blocks/machine/MachineOrbus.java b/src/main/java/com/hbm/blocks/machine/MachineOrbus.java index 5bf08f383..17e5004e7 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineOrbus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineOrbus.java @@ -1,19 +1,30 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.storage.TileEntityMachineOrbus; +import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineOrbus extends BlockDummyable { +public class MachineOrbus extends BlockDummyable implements IPersistentInfoProvider { public MachineOrbus(Material mat) { super(mat); @@ -73,4 +84,16 @@ public class MachineOrbus extends BlockDummyable { this.makeExtra(world, x + dir.offsetX + d2.offsetX, y + i, z + dir.offsetZ + d2.offsetZ); } } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + tank.readFromNBT(persistentTag, "tank"); + list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); + } } diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 9a8291b1e..2ca3c5638 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -87,6 +87,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_revolver_nightmare, 1), new Object[] { "SEM", " RW", 'S', STEEL.plate(), 'W', KEY_PLANKS, 'R', ModItems.wire_aluminium, 'E', ModItems.powder_power, 'M', ModItems.mechanism_revolver_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_revolver_nightmare2, 1), new Object[] { "SSM", "RRW", 'S', OreDictManager.getReflector(), 'W', W.ingot(), 'R', ModItems.wire_gold, 'M', ModItems.mechanism_special }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_bio_revolver, 1), new Object[] { "SSM", "BTW", 'S', STEEL.plate(), 'M', ModItems.mechanism_revolver_2, 'B', B.ingot(), 'T', ModItems.bolt_tungsten, 'W', KEY_LOG }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_chemthrower, 1), new Object[] { "RWC", "HHT", "RLC", 'R', RUBBER.ingot(), 'W', ModItems.wrench, 'C', CU.plate(), 'H', ModItems.hull_small_steel, 'T', ModItems.tank_steel, 'L', ModItems.mechanism_launcher_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_fatman, 1), new Object[] { "SSI", "IIM", "WPH", 'S', STEEL.plate(), 'I', STEEL.ingot(), 'W', ModItems.wire_aluminium, 'H', ModItems.hull_small_steel, 'P', Item.getItemFromBlock(Blocks.piston), 'M', ModItems.mechanism_launcher_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_mirv, 1), new Object[] { "LLL", "WFW", "SSS", 'S', STEEL.plate(), 'L', PB.plate(), 'W', ModItems.wire_gold, 'F', ModItems.gun_fatman }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_proto, 1), new Object[] { "LLL", "WFW", "SSS", 'S', ModItems.plate_polymer, 'L', ModItems.plate_desh, 'W', ModItems.wire_tungsten, 'F', ModItems.gun_fatman }); diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 9f9c0db4b..8a0f2a135 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -206,6 +206,7 @@ public class EntityMappings { addEntity(EntitySiegeTunneler.class, "entity_meme_tunneler", 1000); addEntity(EntitySPV.class, "entity_self_propelled_vehicle_mark_1", 1000); addEntity(EntityCog.class, "entity_stray_cog", 1000); + addEntity(EntityChemical.class, "entity_chemthrower_splash", 1000); addMob(EntityNuclearCreeper.class, "entity_mob_nuclear_creeper", 0x204131, 0x75CE00); addMob(EntityTaintedCreeper.class, "entity_mob_tainted_creeper", 0x813b9b, 0xd71fdd); diff --git a/src/main/java/com/hbm/entity/projectile/EntityChemical.java b/src/main/java/com/hbm/entity/projectile/EntityChemical.java new file mode 100644 index 000000000..4c798bc3d --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityChemical.java @@ -0,0 +1,364 @@ +package com.hbm.entity.projectile; + +import java.awt.Color; +import java.util.List; + +import com.hbm.extprop.HbmLivingProps; +import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.trait.FT_Combustible; +import com.hbm.inventory.fluid.trait.FT_Corrosive; +import com.hbm.inventory.fluid.trait.FT_Flammable; +import com.hbm.inventory.fluid.trait.FT_VentRadiation; +import com.hbm.lib.ModDamageSource; +import com.hbm.main.MainRegistry; +import com.hbm.util.ArmorUtil; +import com.hbm.util.ContaminationUtil; +import com.hbm.util.ContaminationUtil.ContaminationType; +import com.hbm.util.ContaminationUtil.HazardType; +import com.hbm.util.EntityDamageUtil; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSourceIndirect; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class EntityChemical extends EntityThrowableNT { + + /* + * TYPE INFO: + * + * if ANTIMATTER: ignore all other traits, become a gamme beam with no gravity + * if HOT: set fire and deal extra fire damage, scaling with the temperature + * if COLD: freeze, duration scaling with temperature, assuming COMBUSTIBLE does not apply + * if GAS: short range with the spread going up + * if EVAP: same as gas + * if LIQUID: if EVAP doesn't apply, create a narrow spray with long range affected by gravity + * if COMBUSTIBLE: auto-ignite + * if FLAMMABLE: if GAS or EVAP apply, do the same as COMBUSTIBLE, otherwise create a neutral spray that adds the "soaked" effect + * if CORROSIVE: apply extra acid damage, poison effect as well as armor degradation + */ + + public EntityChemical(World world) { + super(world); + this.ignoreFrustumCheck = true; + } + + public EntityChemical(World world, EntityLivingBase thrower) { + super(world, thrower); + this.ignoreFrustumCheck = true; + } + + @Override + protected void entityInit() { + this.dataWatcher.addObject(10, new Integer(0)); + } + + public EntityChemical setFluid(FluidType fluid) { + this.dataWatcher.updateObject(10, fluid.getID()); + return this; + } + + public FluidType getType() { + return Fluids.fromID(this.dataWatcher.getWatchableObjectInt(10)); + } + + @Override + public void onUpdate() { + + if(!worldObj.isRemote) { + + if(this.ticksExisted > this.getMaxAge()) { + this.setDead(); + } + + FluidType type = this.getType(); + + if(type.hasTrait(Fluids.GASEOUS.getClass()) || type.hasTrait(Fluids.EVAP.getClass())) { + + double intensity = 1D - (double) this.ticksExisted / (double) this.getMaxAge(); + List affected = worldObj.getEntitiesWithinAABBExcludingEntity(this.thrower, this.boundingBox.expand(intensity * 2.5, intensity * 2.5, intensity * 2.5)); + + for(Entity e : affected) { + this.affect(e, intensity); + } + } + + } else { + + ChemicalStyle style = getStyle(); + + if(style == ChemicalStyle.LIQUID) { + + FluidType type = getType(); + Color color = new Color(type.getColor()); + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "vanillaExt"); + data.setString("mode", "colordust"); + data.setDouble("posX", posX); + data.setDouble("posY", posY); + data.setDouble("posZ", posZ); + data.setDouble("mX", motionX + worldObj.rand.nextGaussian() * 0.05); + data.setDouble("mY", motionY - 0.2 + worldObj.rand.nextGaussian() * 0.05); + data.setDouble("mZ", motionZ + worldObj.rand.nextGaussian() * 0.05); + data.setFloat("r", color.getRed() / 255F); + data.setFloat("g", color.getGreen() / 255F); + data.setFloat("b", color.getBlue() / 255F); + MainRegistry.proxy.effectNT(data); + } + + if(style == ChemicalStyle.BURNING) { + + double motion = Math.min(Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector(), 0.1); + + for(double d = 0; d < motion; d += 0.0625) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", "vanillaExt"); + nbt.setString("mode", "flame"); + nbt.setDouble("posX", (this.lastTickPosX - this.posX) * d + this.posX); + nbt.setDouble("posY", (this.lastTickPosY - this.posY) * d + this.posY); + nbt.setDouble("posZ", (this.lastTickPosZ - this.posZ) * d + this.posZ); + MainRegistry.proxy.effectNT(nbt); + } + } + } + super.onUpdate(); + } + + protected void affect(Entity e, double intensity) { + + ChemicalStyle style = getStyle(); + FluidType type = getType(); + EntityLivingBase living = e instanceof EntityLivingBase ? (EntityLivingBase) e : null; + + if(style == ChemicalStyle.LIQUID || style == ChemicalStyle.BURNING) //ignore range penalty for liquids + intensity = 1D; + + if(style == ChemicalStyle.AMAT) { + if(living != null) { + ContaminationUtil.contaminate(living, HazardType.RADIATION, ContaminationType.CREATIVE, 50F * (float) intensity); + return; + } + } + + if(type.temperature >= 100) { + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_boil), 5F + (type.temperature - 100) * 0.02F); //5 damage at 100°C with one extra damage every 50°C + + if(type.temperature >= 500) { + e.setFire(10); //afterburn for 10 seconds + } + } + + if(style == ChemicalStyle.LIQUID || style == ChemicalStyle.GAS) { + if(type.temperature < -20) { + if(living != null) { //only living things are affected + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_cryolator), 5F + (type.temperature + 20) * -0.05F); //5 damage at -20°C with one extra damage every -20°C + living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 2)); + living.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 100, 4)); + } + } + + if(type.hasTrait(Fluids.DELICIOUS.getClass())) { + if(living != null && living.isEntityAlive()) { + living.heal(2F * (float) intensity); + } + } + } + + if(style == ChemicalStyle.LIQUID) { + + if(type.hasTrait(FT_Flammable.class)) { + if(living != null) { + HbmLivingProps.setOil(living, 300); //doused in oil for 15 seconds + } + } else { + + if(type.temperature < 50) { + e.extinguish(); //if it's a cold non-flammable liquid (that isn't burning), extinguish + } + } + } + + if(style == ChemicalStyle.BURNING) { + FT_Combustible trait = type.getTrait(FT_Combustible.class); + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_flamethrower), 2F + (trait != null ? (trait.getCombustionEnergy() / 100_000F) : 0)); + e.setFire(5); + } + + if(style == ChemicalStyle.GASFLAME) { + FT_Flammable flammable = type.getTrait(FT_Flammable.class); + FT_Combustible combustible = type.getTrait(FT_Combustible.class); + + float heat = Math.max(flammable != null ? flammable.getHeatEnergy() / 50_000F : 0, combustible != null ? combustible.getCombustionEnergy() / 100_000F : 0); + heat *= intensity; + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_flamethrower), (2F + heat) * (float) intensity); + e.setFire((int) Math.ceil(5 * intensity)); + } + + if(type.hasTrait(FT_Corrosive.class)) { + FT_Corrosive trait = type.getTrait(FT_Corrosive.class); + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_acid), trait.getRating() / 20F); + + if(living != null) { + for(int i = 0; i < 4; i++) { + ArmorUtil.damageSuit(living, i, trait.getRating() / 5); + } + } + } + + if(type.hasTrait(FT_VentRadiation.class)) { + FT_VentRadiation trait = type.getTrait(FT_VentRadiation.class); + if(living != null) { + ContaminationUtil.contaminate(living, HazardType.RADIATION, ContaminationType.CREATIVE, trait.getRadPerMB() * 5); + } + ChunkRadiationManager.proxy.incrementRad(worldObj, (int) Math.floor(e.posX), (int) Math.floor(e.posY), (int) Math.floor(e.posZ), trait.getRadPerMB() * 5); + } + } + + protected DamageSource getDamage(String name) { + + if(thrower != null) { + return new EntityDamageSourceIndirect(name, this, thrower); + } else { + return new DamageSource(name); + } + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + + if(!worldObj.isRemote) { + + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { + this.affect(mop.entityHit, 1D - (double) this.ticksExisted / (double) this.getMaxAge()); + } + + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + + FluidType type = getType(); + + if(type.hasTrait(FT_VentRadiation.class)) { + FT_VentRadiation trait = type.getTrait(FT_VentRadiation.class); + ChunkRadiationManager.proxy.incrementRad(worldObj, mop.blockX, mop.blockY, mop.blockZ, trait.getRadPerMB() * 5); + } + + ChemicalStyle style = getStyle(); + + if(style == ChemicalStyle.BURNING || style == ChemicalStyle.GASFLAME) { + int x = mop.blockX; + int y = mop.blockY; + int z = mop.blockZ; + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if(worldObj.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).isAir(worldObj, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ)) { + worldObj.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, Blocks.fire); + } + } + } + + this.setDead(); + } + } + } + + @Override + protected float getAirDrag() { + + ChemicalStyle type = getStyle(); + + if(type == ChemicalStyle.AMAT) return 1F; + if(type == ChemicalStyle.GAS) return 0.95F; + + return 0.99F; + } + + @Override + protected float getWaterDrag() { + + ChemicalStyle type = getStyle(); + + if(type == ChemicalStyle.AMAT) return 1F; + if(type == ChemicalStyle.GAS) return 1F; + + return 0.8F; + } + + public int getMaxAge() { + + switch(this.getStyle()) { + case AMAT: return 100; + case BURNING:return 600; + case GAS: return 60; + case GASFLAME: return 20; + case LIQUID: return 600; + } + + return 100; + } + + @Override + public double getGravityVelocity() { + + ChemicalStyle type = getStyle(); + + if(type == ChemicalStyle.AMAT) return 0D; + if(type == ChemicalStyle.GAS) return 0D; + if(type == ChemicalStyle.GASFLAME) return -0.01D; + + return 0.03D; + } + + public ChemicalStyle getStyle() { + return getStyleFromType(this.getType()); + } + + public static ChemicalStyle getStyleFromType(FluidType type) { + + if(type.isAntimatter()) { + return ChemicalStyle.AMAT; + } + + if(type.hasTrait(Fluids.GASEOUS.getClass()) || type.hasTrait(Fluids.EVAP.getClass())) { + + if(type.hasTrait(FT_Flammable.class) || type.hasTrait(FT_Combustible.class)) { + return ChemicalStyle.GASFLAME; + } else { + return ChemicalStyle.GAS; + } + } + + if(type.hasTrait(Fluids.LIQUID.getClass())) { + + if(type.hasTrait(FT_Combustible.class)) { + return ChemicalStyle.BURNING; + } else { + return ChemicalStyle.LIQUID; + } + } + + return ChemicalStyle.NULL; + } + + /** + * The general type of the chemical, determines rendering and movement + */ + public static enum ChemicalStyle { + AMAT, //renders as beam + LIQUID, //no renderer, fluid particles + GAS, //renders as particles + GASFLAME, //renders as fire particles + BURNING, //no renderer, fire particles + NULL + } +} diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java index cfbfabc17..b1a27a009 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -30,7 +30,7 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { private Block stuckBlock; protected boolean inGround; public int throwableShake; - private EntityLivingBase thrower; + protected EntityLivingBase thrower; private String throwerName; private int ticksInGround; private int ticksInAir; diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index 72d76ec0f..6eb410031 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -43,6 +43,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { private float radBuf; private int bombTimer; private int contagion; + private int oil; private List contamination = new ArrayList(); public HbmLivingProps(EntityLivingBase entity) { @@ -269,6 +270,15 @@ public class HbmLivingProps implements IExtendedEntityProperties { public static void setContagion(EntityLivingBase entity, int contageon) { getData(entity).contagion = contageon; } + + /// OIL /// + public static int getOil(EntityLivingBase entity) { + return getData(entity).oil; + } + + public static void setOil(EntityLivingBase entity, int oil) { + getData(entity).oil = oil; + } @Override public void init(Entity entity, World world) { } @@ -285,6 +295,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { props.setInteger("hfr_contagion", contagion); props.setInteger("hfr_blacklung", blacklung); props.setInteger("hfr_fibrosis", fibrosis); + props.setInteger("hfr_oil", oil); props.setInteger("hfr_cont_count", this.contamination.size()); @@ -308,6 +319,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { contagion = props.getInteger("hfr_contagion"); blacklung = props.getInteger("hfr_blacklung"); fibrosis = props.getInteger("hfr_fibrosis"); + oil = props.getInteger("hfr_oil"); int cont = props.getInteger("hfr_cont_count"); diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index 78c037158..1b78ce031 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -94,6 +94,7 @@ public class EntityEffectHandler { handleRadiation(entity); handleDigamma(entity); handleLungDisease(entity); + handleOil(entity); handleDashing(entity); handlePlinking(entity); @@ -426,6 +427,29 @@ public class EntityEffectHandler { } } + private static void handleOil(EntityLivingBase entity) { + int oil = HbmLivingProps.getOil(entity); + + if(oil > 0) { + + if(entity.isBurning()) { + HbmLivingProps.setOil(entity, 0); + entity.worldObj.newExplosion(null, entity.posX, entity.posY + entity.height / 2, entity.posZ, 3F, false, true); + } else { + HbmLivingProps.setOil(entity, oil - 1); + } + + if(entity.ticksExisted % 5 == 0) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", "sweat"); + nbt.setInteger("count", 1); + nbt.setInteger("block", Block.getIdFromBlock(Blocks.coal_block)); + nbt.setInteger("entity", entity.getEntityId()); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + } + } + } + private static void handleDashing(Entity entity) { //AAAAAAAAAAAAAAAAAAAAEEEEEEEEEEEEEEEEEEEE diff --git a/src/main/java/com/hbm/handler/ToolAbility.java b/src/main/java/com/hbm/handler/ToolAbility.java index 87bfcf558..60bdb43d5 100644 --- a/src/main/java/com/hbm/handler/ToolAbility.java +++ b/src/main/java/com/hbm/handler/ToolAbility.java @@ -14,11 +14,15 @@ import com.hbm.inventory.recipes.CrystallizerRecipes; import com.hbm.inventory.recipes.ShredderRecipes; import com.hbm.items.ModItems; import com.hbm.items.tool.IItemAbility; +import com.hbm.util.EnchantmentUtil; import net.minecraft.block.Block; import net.minecraft.client.resources.I18n; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; @@ -28,8 +32,7 @@ import net.minecraft.world.World; public abstract class ToolAbility { //how to potentially save this: cancel the event/operation so that ItemInWorldManager's harvest method falls short, then recreate it with a more sensible structure - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { } - public void onDigPost(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { } + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { return false; } public abstract String getName(); public abstract String getFullName(); public abstract String getExtension(); @@ -46,14 +49,14 @@ public abstract class ToolAbility { private Set pos = new HashSet(); @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { Block b = world.getBlock(x, y, z); if(b == Blocks.stone && !ToolConfig.recursiveStone) - return; + return false; if(b == Blocks.netherrack && !ToolConfig.recursiveNetherrack) - return; + return false; List indices = Arrays.asList(new Integer[] {0, 1, 2, 3, 4, 5}); Collections.shuffle(indices); @@ -70,6 +73,7 @@ public abstract class ToolAbility { case 5: breakExtra(world, x, y, z - 1, x, y, z, player, tool, 0); break; } } + return false; } private void breakExtra(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemAbility tool, int depth) { @@ -160,7 +164,7 @@ public abstract class ToolAbility { } @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { for(int a = x - range; a <= x + range; a++) { for(int b = y - range; b <= y + range; b++) { @@ -173,6 +177,8 @@ public abstract class ToolAbility { } } } + + return false; } @Override @@ -199,23 +205,20 @@ public abstract class ToolAbility { public static class SilkAbility extends ToolAbility { @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { - /*//if the tool is already enchanted, do nothing if(EnchantmentHelper.getSilkTouchModifier(player) || player.getHeldItem() == null) - return; + return false; - //add enchantment ItemStack stack = player.getHeldItem(); - EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1); - block.harvestBlock(world, player, x, y, z, meta); + + if(player instanceof EntityPlayerMP) + IItemAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); + EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); - world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player);*/ - - //tool.breakBlockSpecial(world, x, y, z, block, meta, player, 0, true); //TODO: replace + return true; } @Override @@ -248,25 +251,20 @@ public abstract class ToolAbility { } @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { - /*//if the tool is already enchanted, do nothing if(EnchantmentHelper.getFortuneModifier(player) > 0 || player.getHeldItem() == null) - return; + return false; - //add enchantment ItemStack stack = player.getHeldItem(); - EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, luck); - block.harvestBlock(world, player, x, y, z, meta); + + if(player instanceof EntityPlayerMP) + IItemAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); + EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); - world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player);*/ - - - - //tool.breakBlockSpecial(world, x, y, z, block, meta, player, luck, false); //TODO: replace + return true; } @Override @@ -293,10 +291,12 @@ public abstract class ToolAbility { public static class SmelterAbility extends ToolAbility { @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { List drops = block.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + boolean doesSmelt = false; + for(int i = 0; i < drops.size(); i++) { ItemStack stack = drops.get(i).copy(); ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(stack); @@ -305,14 +305,19 @@ public abstract class ToolAbility { result = result.copy(); result.stackSize *= stack.stackSize; drops.set(i, result); + doesSmelt = true; } } - world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player); + if(doesSmelt) { + world.setBlockToAir(x, y, z); + player.getHeldItem().damageItem(1, player); + + for(ItemStack stack : drops) + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + } - for(ItemStack stack : drops) - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + return false; } @Override @@ -339,7 +344,7 @@ public abstract class ToolAbility { public static class ShredderAbility extends ToolAbility { @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -353,6 +358,8 @@ public abstract class ToolAbility { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.copy())); player.getHeldItem().damageItem(1, player); } + + return false; } @Override @@ -379,7 +386,7 @@ public abstract class ToolAbility { public static class CentrifugeAbility extends ToolAbility { @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -397,6 +404,8 @@ public abstract class ToolAbility { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, st.copy())); } } + + return false; } @Override @@ -423,7 +432,7 @@ public abstract class ToolAbility { public static class CrystallizerAbility extends ToolAbility { @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -437,6 +446,8 @@ public abstract class ToolAbility { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.copy())); player.getHeldItem().damageItem(1, player); } + + return false; } @Override @@ -463,7 +474,7 @@ public abstract class ToolAbility { public static class MercuryAbility extends ToolAbility { @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -481,6 +492,8 @@ public abstract class ToolAbility { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ingot_mercury, mercury))); player.getHeldItem().damageItem(1, player); } + + return false; } @Override @@ -513,7 +526,7 @@ public abstract class ToolAbility { } @Override - public void onDigPre(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { ExplosionNT ex = new ExplosionNT(player.worldObj, player, x + 0.5, y + 0.5, z + 0.5, strength); ex.addAttrib(ExAttrib.ALLDROP); @@ -523,6 +536,8 @@ public abstract class ToolAbility { ex.doExplosionB(false); player.worldObj.createExplosion(player, x + 0.5, y + 0.5, z + 0.5, 0.1F, false); + + return true; } @Override diff --git a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java index 7ebb1c831..5b52257b3 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java @@ -37,7 +37,7 @@ public class GunEnergyFactory { config.firingMode = GunConfiguration.FIRE_AUTO; config.allowsInfinity = false; config.ammoCap = 3_000; - config.durability = 30_000; + config.durability = 90_000; config.reloadType = GunConfiguration.RELOAD_FULL; config.crosshair = Crosshair.CIRCLE; diff --git a/src/main/java/com/hbm/interfaces/IPartiallyFillable.java b/src/main/java/com/hbm/interfaces/IPartiallyFillable.java deleted file mode 100644 index f35f1df6a..000000000 --- a/src/main/java/com/hbm/interfaces/IPartiallyFillable.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.hbm.interfaces; - -import com.hbm.inventory.fluid.FluidType; - -import net.minecraft.item.ItemStack; - -@Deprecated -public interface IPartiallyFillable { - - public FluidType getType(ItemStack stack); - - public int getFill(ItemStack stack); - - public void setFill(ItemStack stack, int fill); - - public int getMaxFill(ItemStack stack); - - public int getLoadSpeed(ItemStack stack); - - public int getUnloadSpeed(ItemStack stack); - -} diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 810df8eba..867f1789e 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -150,27 +150,27 @@ public class Fluids { BIOGAS = new FluidType("BIOGAS", 0xbfd37c, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(25_000), GASEOUS); BIOFUEL = new FluidType("BIOFUEL", 0xeef274, 1, 2, 0, EnumSymbol.NONE).addContainers(0x9EB623, ExtContainer.CANISTER).addTraits(new FT_Flammable(150_000), new FT_Combustible(FuelGrade.HIGH, 400_000), LIQUID); NITAN = new FluidType("NITAN", 0x8018ad, 2, 4, 1, EnumSymbol.NONE).addContainers(0x6B238C, ExtContainer.CANISTER).addTraits(new FT_Flammable(2_000_000), new FT_Combustible(FuelGrade.HIGH, 5_000_000), LIQUID); - UF6 = new FluidType("UF6", 0xD1CEBE, 4, 0, 2, EnumSymbol.RADIATION).addTraits(new FT_Corrosive(15), GASEOUS); - PUF6 = new FluidType("PUF6", 0x4C4C4C, 4, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_Corrosive(15), GASEOUS); - SAS3 = new FluidType("SAS3", 0x4ffffc, 5, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_Corrosive(30), LIQUID); - SCHRABIDIC = new FluidType("SCHRABIDIC", 0x006B6B, 5, 0, 5, EnumSymbol.ACID).addTraits(new FT_Corrosive(75), LIQUID); + UF6 = new FluidType("UF6", 0xD1CEBE, 4, 0, 2, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.2F), new FT_Corrosive(15), GASEOUS); + PUF6 = new FluidType("PUF6", 0x4C4C4C, 4, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.1F), new FT_Corrosive(15), GASEOUS); + SAS3 = new FluidType("SAS3", 0x4ffffc, 5, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(1F), new FT_Corrosive(30), LIQUID); + SCHRABIDIC = new FluidType("SCHRABIDIC", 0x006B6B, 5, 0, 5, EnumSymbol.ACID).addTraits(new FT_VentRadiation(1F), new FT_Corrosive(75), LIQUID); AMAT = new FluidType("AMAT", 0x010101, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); ASCHRAB = new FluidType("ASCHRAB", 0xb50000, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); ACID = new FluidType("ACID", 0xfff7aa, 3, 0, 3, EnumSymbol.OXIDIZER).addTraits(new FT_Corrosive(40), LIQUID); WATZ = new FluidType("WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(60), LIQUID); CRYOGEL = new FluidType("CRYOGEL", 0x32ffff, 2, 0, 0, EnumSymbol.CROYGENIC).setTemp(-170).addTraits(LIQUID); - HYDROGEN = new FluidType("HYDROGEN", 0x4286f4, 3, 4, 0, EnumSymbol.CROYGENIC).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), LIQUID, EVAP); - OXYGEN = new FluidType("OXYGEN", 0x98bdf9, 3, 0, 0, EnumSymbol.CROYGENIC).addTraits(LIQUID, EVAP); + HYDROGEN = new FluidType("HYDROGEN", 0x4286f4, 3, 4, 0, EnumSymbol.CROYGENIC).setTemp(-260).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), LIQUID, EVAP); + OXYGEN = new FluidType("OXYGEN", 0x98bdf9, 3, 0, 0, EnumSymbol.CROYGENIC).setTemp(-100).addTraits(LIQUID, EVAP); XENON = new FluidType("XENON", 0xba45e8, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); BALEFIRE = new FluidType("BALEFIRE", 0x28e02e, 4, 4, 3, EnumSymbol.RADIATION).setTemp(1500).addTraits(new FT_Corrosive(50), new FT_Flammable(1_000_000), new FT_Combustible(FuelGrade.HIGH, 2_500_000), LIQUID); MERCURY = new FluidType("MERCURY", 0x808080, 2, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); PAIN = new FluidType("PAIN", 0x938541, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(30)); - WASTEFLUID = new FluidType("WASTEFLUID", 0x544400, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON); - WASTEGAS = new FluidType("WASTEGAS", 0xB8B8B8, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON); + WASTEFLUID = new FluidType("WASTEFLUID", 0x544400, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON, LIQUID); + WASTEGAS = new FluidType("WASTEGAS", 0xB8B8B8, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON, GASEOUS); GASOLINE = new FluidType("GASOLINE", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2F7747, ExtContainer.CANISTER).addTraits(new FT_Flammable(400_000), new FT_Combustible(FuelGrade.HIGH, 1_000_000), LIQUID); COALGAS = new FluidType("COALGAS", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2E155F, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.MEDIUM, 150_000), LIQUID); - SPENTSTEAM = new FluidType("SPENTSTEAM", 0x445772, 2, 0, 0, EnumSymbol.NONE).setCompression(1D).addTraits(NOCON); - FRACKSOL = new FluidType("FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addContainers(0x4F887F, ExtContainer.CANISTER).addTraits(new FT_Corrosive(15)); + SPENTSTEAM = new FluidType("SPENTSTEAM", 0x445772, 2, 0, 0, EnumSymbol.NONE).setCompression(1D).addTraits(NOCON, GASEOUS); + FRACKSOL = new FluidType("FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addContainers(0x4F887F, ExtContainer.CANISTER).addTraits(new FT_Corrosive(15), LIQUID); PLASMA_DT = new FluidType("PLASMA_DT", 0xF7AFDE, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3250).addTraits(NOCON, NOID, PLASMA); PLASMA_HD = new FluidType("PLASMA_HD", 0xF0ADF4, 0, 4, 0, EnumSymbol.RADIATION).setTemp(2500).addTraits(NOCON, NOID, PLASMA); PLASMA_HT = new FluidType("PLASMA_HT", 0xD1ABF2, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3000).addTraits(NOCON, NOID, PLASMA); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java index 9126aea5d..64c4c5072 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java @@ -13,6 +13,10 @@ public class FT_VentRadiation extends FluidTrait { this.radPerMB = rad; } + public float getRadPerMB() { + return this.radPerMB; + } + @Override public void onFluidRelease(World world, int x, int y, int z, FluidTank tank, int overflowAmount) { ChunkRadiationManager.proxy.incrementRad(world, x, y, z, overflowAmount * radPerMB); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java index 8cceb5db3..8afc8ee8f 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java @@ -27,7 +27,7 @@ public class FluidTraitSimple { } public static class FT_Amat extends FluidTrait { - @Override public void addInfoHidden(List info) { + @Override public void addInfo(List info) { info.add(EnumChatFormatting.DARK_RED + "[Antimatter]"); } } @@ -37,8 +37,11 @@ public class FluidTraitSimple { info.add(EnumChatFormatting.DARK_RED + "[Requires hazardous material tank to hold]"); } } + public static class FT_Delicious extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.DARK_GREEN + "[Delicious]"); + }} public static class FT_NoID extends FluidTrait { } public static class FT_NoContainer extends FluidTrait { } - public static class FT_Delicious extends FluidTrait { } } diff --git a/src/main/java/com/hbm/items/IHeldSoundProvider.java b/src/main/java/com/hbm/items/IHeldSoundProvider.java new file mode 100644 index 000000000..3549e6df4 --- /dev/null +++ b/src/main/java/com/hbm/items/IHeldSoundProvider.java @@ -0,0 +1,5 @@ +package com.hbm.items; + +public interface IHeldSoundProvider { + +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 12a1cb086..2bd682de5 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -5182,7 +5182,7 @@ public class ModItems { jackt = new ModArmor(MainRegistry.aMatSteel, 7, 1).setUnlocalizedName("jackt").setTextureName(RefStrings.MODID + ":jackt"); jackt2 = new ModArmor(MainRegistry.aMatSteel, 7, 1).setUnlocalizedName("jackt2").setTextureName(RefStrings.MODID + ":jackt2"); - chainsaw = new ItemToolAbilityFueled(25, -0.05, MainRegistry.tMatChainsaw, EnumToolType.AXE, 5000, 1, 250, + chainsaw = new ItemChainsaw(25, -0.05, MainRegistry.tMatChainsaw, EnumToolType.AXE, 5000, 1, 250, Fluids.DIESEL, Fluids.DIESEL_CRACK, Fluids.KEROSENE, Fluids.BIOFUEL, Fluids.GASOLINE, Fluids.GASOLINE_LEADED, Fluids.PETROIL, Fluids.PETROIL_LEADED, Fluids.COALGAS, Fluids.COALGAS_LEADED) .addBreakAbility(new ToolAbility.SilkAbility()) .addBreakAbility(new ToolAbility.RecursionAbility(5)) diff --git a/src/main/java/com/hbm/items/armor/ArmorFSB.java b/src/main/java/com/hbm/items/armor/ArmorFSB.java index 5da09df69..73f20974c 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSB.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSB.java @@ -433,7 +433,7 @@ public class ArmorFSB extends ItemArmor implements IArmorDisableModel { if(!chestplate.effects.isEmpty()) { for(PotionEffect i : chestplate.effects) { - player.addPotionEffect(new PotionEffect(i.getPotionID(), i.getDuration(), i.getAmplifier(), i.getIsAmbient())); + player.addPotionEffect(new PotionEffect(i.getPotionID(), i.getDuration(), i.getAmplifier(), true)); } } diff --git a/src/main/java/com/hbm/items/armor/JetpackBase.java b/src/main/java/com/hbm/items/armor/JetpackBase.java index c701fecc5..c036d3ad6 100644 --- a/src/main/java/com/hbm/items/armor/JetpackBase.java +++ b/src/main/java/com/hbm/items/armor/JetpackBase.java @@ -3,12 +3,12 @@ package com.hbm.items.armor; import java.util.List; import com.hbm.handler.ArmorModHandler; -import com.hbm.interfaces.IPartiallyFillable; import com.hbm.inventory.fluid.FluidType; import com.hbm.render.model.ModelJetPack; import com.hbm.util.ArmorUtil; import com.hbm.util.I18nUtil; +import api.hbm.fluid.IFillableItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; @@ -24,7 +24,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderPlayerEvent; -public abstract class JetpackBase extends ItemArmorMod implements IPartiallyFillable { +public abstract class JetpackBase extends ItemArmorMod implements IFillableItem { private ModelJetPack model; public FluidType fuel; @@ -138,33 +138,43 @@ public abstract class JetpackBase extends ItemArmorMod implements IPartiallyFill } - @Override - public FluidType getType(ItemStack stack) { - return fuel; - } - - @Override - public int getFill(ItemStack stack) { - return this.getFuel(stack); - } - - @Override - public void setFill(ItemStack stack, int fill) { - this.setFuel(stack, fill); - } - - @Override public int getMaxFill(ItemStack stack) { return this.maxFuel; } - @Override public int getLoadSpeed(ItemStack stack) { return 10; } @Override - public int getUnloadSpeed(ItemStack stack) { + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return type == this.fuel; + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + int fill = this.getFuel(stack); + int req = maxFuel - fill; + + int toFill = Math.min(amount, req); + //toFill = Math.min(toFill, getLoadSpeed(stack)); + + this.setFuel(stack, fill + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return false; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { return 0; } } diff --git a/src/main/java/com/hbm/items/block/ItemBlockLore.java b/src/main/java/com/hbm/items/block/ItemBlockLore.java index c83b5293b..5be85c400 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockLore.java +++ b/src/main/java/com/hbm/items/block/ItemBlockLore.java @@ -12,7 +12,7 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -public class ItemBlockLore extends ItemBlock { +public class ItemBlockLore extends ItemBlockBase { public ItemBlockLore(Block p_i45328_1_) { super(p_i45328_1_); @@ -20,6 +20,7 @@ public class ItemBlockLore extends ItemBlock { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + super.addInformation(itemstack, player, list, bool); if(this.field_150939_a instanceof RedBarrel) { list.add("Static fluid barrel"); diff --git a/src/main/java/com/hbm/items/special/ItemSyringe.java b/src/main/java/com/hbm/items/special/ItemSyringe.java index b14fddcd3..d50a57074 100644 --- a/src/main/java/com/hbm/items/special/ItemSyringe.java +++ b/src/main/java/com/hbm/items/special/ItemSyringe.java @@ -6,13 +6,13 @@ import java.util.Random; import com.hbm.config.VersatileConfig; import com.hbm.extprop.HbmLivingProps; import com.hbm.handler.ArmorModHandler; -import com.hbm.interfaces.IPartiallyFillable; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemGunBase; import com.hbm.lib.ModDamageSource; import com.hbm.potion.HbmPotion; +import api.hbm.fluid.IFillableItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.EntityLivingBase; @@ -279,16 +279,15 @@ public class ItemSyringe extends Item { jetpack = ArmorModHandler.pryMods(jetpack)[ArmorModHandler.plate_only]; } - if(jetpack == null || !(jetpack.getItem() instanceof IPartiallyFillable)) + if(jetpack == null || !(jetpack.getItem() instanceof IFillableItem)) return stack; - IPartiallyFillable fillable = (IPartiallyFillable) jetpack.getItem(); + IFillableItem fillable = (IFillableItem) jetpack.getItem(); - if(fillable.getType(jetpack) != Fluids.KEROSENE) + if(!fillable.acceptsFluid(Fluids.KEROSENE, jetpack)) return stack; - int fill = Math.min(fillable.getFill(jetpack) + 1000, fillable.getMaxFill(jetpack)); - fillable.setFill(jetpack, fill); + fillable.tryFill(Fluids.KEROSENE, 1000, jetpack); if(jetpack.getItem() != player.inventory.armorInventory[2].getItem()) ArmorModHandler.applyMod(player.inventory.armorInventory[2], jetpack); diff --git a/src/main/java/com/hbm/items/tool/IItemAbility.java b/src/main/java/com/hbm/items/tool/IItemAbility.java index 00f5cefab..ca8a33b4b 100644 --- a/src/main/java/com/hbm/items/tool/IItemAbility.java +++ b/src/main/java/com/hbm/items/tool/IItemAbility.java @@ -86,4 +86,52 @@ public interface IItemAbility { Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C07PacketPlayerDigging(2, x, y, z, Minecraft.getMinecraft().objectMouseOver.sideHit)); } } + + public static void standardDigPost(World world, int x, int y, int z, EntityPlayerMP player) { + + Block block = world.getBlock(x, y, z); + int l = world.getBlockMetadata(x, y, z); + world.playAuxSFXAtEntity(player, 2001, x, y, z, Block.getIdFromBlock(block) + (world.getBlockMetadata(x, y, z) << 12)); + boolean flag = false; + + if(player.capabilities.isCreativeMode) { + flag = removeBlock(world, x, y, z, false, player); + player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world)); + } else { + ItemStack itemstack = player.getCurrentEquippedItem(); + boolean flag1 = block.canHarvestBlock(player, l); + + if(itemstack != null) { + itemstack.func_150999_a(world, block, x, y, z, player); + + if(itemstack.stackSize == 0) { + player.destroyCurrentEquippedItem(); + } + } + + flag = removeBlock(world, x, y, z, flag1, player); + if(flag && flag1) { + block.harvestBlock(world, player, x, y, z, l); + } + } + + /* + * // Drop experience if (!player.capabilities.isCreativeMode && flag && + * event != null) { block.dropXpOnBlockBreak(world, x, y, z, + * event.getExpToDrop()); } + */ + } + + public static boolean removeBlock(World world, int x, int y, int z, boolean canHarvest, EntityPlayerMP player) { + Block block = world.getBlock(x, y, z); + int l = world.getBlockMetadata(x, y, z); + block.onBlockHarvested(world, x, y, z, l, player); + boolean flag = block.removedByPlayer(world, player, x, y, z, canHarvest); + + if(flag) { + block.onBlockDestroyedByPlayer(world, x, y, z, l); + } + + return flag; + } } diff --git a/src/main/java/com/hbm/items/tool/ItemChainsaw.java b/src/main/java/com/hbm/items/tool/ItemChainsaw.java new file mode 100644 index 000000000..a2d4dfb38 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemChainsaw.java @@ -0,0 +1,35 @@ +package com.hbm.items.tool; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.items.IHeldSoundProvider; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemChainsaw extends ItemToolAbilityFueled implements IHeldSoundProvider { + + public ItemChainsaw(float damage, double movement, ToolMaterial material, EnumToolType type, int maxFuel, int consumption, int fillRate, FluidType... acceptedFuels) { + super(damage, movement, material, type, maxFuel, consumption, fillRate, acceptedFuels); + } + + @Override + public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { + + if(!(entityLiving instanceof EntityPlayerMP)) + return false; + + if(stack.getItemDamage() >= stack.getMaxDamage()) + return false; + + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", "anim"); + nbt.setString("mode", "sSwing"); + PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); + + return false; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index accb7ba63..8497d24ce 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -130,7 +130,7 @@ public class ItemToolAbility extends ItemTool implements IItemAbility, IDepthRoc int meta = world.getBlockMetadata(x, y, z); if(!world.isRemote && canHarvestBlock(block, stack) && this.getCurrentAbility(stack) != null && canOperate(stack)) - this.getCurrentAbility(stack).onDigPre(world, x, y, z, player, block, meta, this); + return this.getCurrentAbility(stack).onDig(world, x, y, z, player, block, meta, this); return false; } @@ -274,7 +274,7 @@ public class ItemToolAbility extends ItemTool implements IItemAbility, IDepthRoc stack.stackTagCompound.setInteger("ability", ability); } - protected boolean canOperate(ItemStack stack) { + public boolean canOperate(ItemStack stack) { return true; } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java index 3af794c96..fd116a9b0 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java @@ -55,7 +55,7 @@ public class ItemToolAbilityFueled extends ItemToolAbility implements IFillableI } @Override - protected boolean canOperate(ItemStack stack) { + public boolean canOperate(ItemStack stack) { return getFill(stack) >= this.consumption; } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java index 865d5d5af..80fb5fa87 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java @@ -97,7 +97,7 @@ public class ItemToolAbilityPower extends ItemToolAbility implements IBatteryIte } @Override - protected boolean canOperate(ItemStack stack) { + public boolean canOperate(ItemStack stack) { return getCharge(stack) >= this.consumption; } diff --git a/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java b/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java index eea0f648a..04f029d2a 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java @@ -3,15 +3,13 @@ package com.hbm.items.weapon; import java.util.List; import com.hbm.config.GeneralConfig; -import com.hbm.handler.BulletConfigSyncingUtil; -import com.hbm.handler.BulletConfiguration; +import com.hbm.entity.projectile.EntityChemical; import com.hbm.handler.GunConfiguration; import com.hbm.handler.guncfg.GunEnergyFactory; import com.hbm.interfaces.IHoldableWeapon; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.machine.ItemFluidIcon; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.GunAnimationPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.render.anim.HbmAnimations.AnimType; @@ -28,7 +26,6 @@ import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; @@ -43,8 +40,6 @@ public class ItemGunChemthrower extends ItemGunBase implements IFillableItem { @Override protected void fire(ItemStack stack, World world, EntityPlayer player) { - System.out.println("nuts"); - if(!hasAmmo(stack, player, true)) return; @@ -99,6 +94,10 @@ public class ItemGunChemthrower extends ItemGunBase implements IFillableItem { //spawn fluid projectile + EntityChemical chem = new EntityChemical(world, player); + chem.setFluid(this.getFluidType(stack)); + world.spawnEntityInWorld(chem); + if(player instanceof EntityPlayerMP) PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(AnimType.CYCLE.ordinal()), (EntityPlayerMP) player); } diff --git a/src/main/java/com/hbm/lib/ModDamageSource.java b/src/main/java/com/hbm/lib/ModDamageSource.java index 0c5e3ba5a..a477d929c 100644 --- a/src/main/java/com/hbm/lib/ModDamageSource.java +++ b/src/main/java/com/hbm/lib/ModDamageSource.java @@ -65,6 +65,8 @@ public class ModDamageSource extends DamageSource { public static final String s_immolator = "plasma"; public static final String s_cryolator = "ice"; public static final String s_laser = "laser"; + public static final String s_boil = "boil"; + public static final String s_acid = "acidPlayer"; public ModDamageSource(String p_i1566_1_) { super(p_i1566_1_); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 7734a8c20..867d48a7e 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4327)"; + public static final String VERSION = "1.0.27 BETA (4333)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 72809337b..a570423a0 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -410,6 +410,7 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.diamond_gavel, new ItemRenderGavel()); MinecraftForgeClient.registerItemRenderer(ModItems.mese_gavel, new ItemRenderGavel()); MinecraftForgeClient.registerItemRenderer(ModItems.crucible, new ItemRenderCrucible()); + MinecraftForgeClient.registerItemRenderer(ModItems.chainsaw, new ItemRenderChainsaw()); //guns MinecraftForgeClient.registerItemRenderer(ModItems.gun_rpg, new ItemRenderRpg()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_karl, new ItemRenderRpg()); @@ -556,6 +557,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityZirnoxDebris.class, new RenderZirnoxDebris()); RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryShell.class, new RenderArtilleryShell()); RenderingRegistry.registerEntityRenderingHandler(EntityCog.class, new RenderCog()); + RenderingRegistry.registerEntityRenderingHandler(EntityChemical.class, new RenderChemical()); //grenades RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeGeneric.class, new RenderSnowball(ModItems.grenade_generic)); RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeStrong.class, new RenderSnowball(ModItems.grenade_strong)); @@ -1137,6 +1139,14 @@ public class ClientProxy extends ServerProxy { fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, 0); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(20), "particleMaxAge", "field_70547_e"); } + + if("colordust".equals(data.getString("mode"))) { + + Block b = Blocks.wool; + fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, 0); + fx.setRBGColorF(data.getFloat("r"), data.getFloat("g"), data.getFloat("b")); + ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(20), "particleMaxAge", "field_70547_e"); + } if(fx != null) { @@ -1637,6 +1647,50 @@ public class ClientProxy extends ServerProxy { HbmAnimations.hotbar[player.inventory.currentItem] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); } } + + if("sSwing".equals(data.getString("mode"))) { + + int forward = 150; + int sideways = 100; + int retire = 200; + + if(HbmAnimations.getRelevantAnim() == null) { + + BusAnimation animation = new BusAnimation() + .addBus("SWING_ROT", new BusAnimationSequence() + .addKeyframe(new BusAnimationKeyframe(0, 0, 90, forward)) + .addKeyframe(new BusAnimationKeyframe(45, 0, 90, sideways)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 0, retire))) + .addBus("SWING_TRANS", new BusAnimationSequence() + .addKeyframe(new BusAnimationKeyframe(0, 0, 3, forward)) + .addKeyframe(new BusAnimationKeyframe(2, 0, 2, sideways)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 0, retire))); + + + HbmAnimations.hotbar[player.inventory.currentItem] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + + } else { + + double[] rot = HbmAnimations.getRelevantTransformation("SWING_ROT"); + double[] trans = HbmAnimations.getRelevantTransformation("SWING_TRANS"); + + if(System.currentTimeMillis() - HbmAnimations.getRelevantAnim().startMillis < 50) return; + + BusAnimation animation = new BusAnimation() + .addBus("SWING_ROT", new BusAnimationSequence() + .addKeyframe(new BusAnimationKeyframe(rot[0], rot[1], rot[2], 0)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 90, forward)) + .addKeyframe(new BusAnimationKeyframe(45, 0, 90, sideways)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 0, retire))) + .addBus("SWING_TRANS", new BusAnimationSequence() + .addKeyframe(new BusAnimationKeyframe(trans[0], trans[1], trans[2], 0)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 3, forward)) + .addKeyframe(new BusAnimationKeyframe(2, 0, 2, sideways)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 0, retire))); + + HbmAnimations.hotbar[player.inventory.currentItem] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + } + } } if("tau".equals(type)) { diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index ca1f2767e..2432a68ce 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -76,7 +76,6 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.OpenGlHelper; diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 149248f01..3de95a373 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -655,6 +655,7 @@ public class ResourceManager { public static final IModelCustom pch = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/pch.obj")); public static final IModelCustom gavel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/gavel.obj")); public static final IModelCustom crucible = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/crucible.obj")); + public static final IModelCustom chainsaw = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/chainsaw.obj"), false); public static final IModelCustom brimstone = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/brimstone.obj")); public static final IModelCustom hk69 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/hk69.obj")); @@ -723,6 +724,7 @@ public class ResourceManager { public static final ResourceLocation crucible_hilt = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/crucible_hilt.png"); public static final ResourceLocation crucible_guard = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/crucible_guard.png"); public static final ResourceLocation crucible_blade = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/crucible_blade.png"); + public static final ResourceLocation chainsaw_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/chainsaw.png"); public static final ResourceLocation brimstone_tex = new ResourceLocation(RefStrings.MODID, "textures/models/brimstone.png"); public static final ResourceLocation hk69_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/hk69.png"); diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderChemical.java b/src/main/java/com/hbm/render/entity/projectile/RenderChemical.java new file mode 100644 index 000000000..fc6fa00af --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderChemical.java @@ -0,0 +1,170 @@ +package com.hbm.render.entity.projectile; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.entity.projectile.EntityChemical; +import com.hbm.entity.projectile.EntityChemical.ChemicalStyle; +import com.hbm.lib.RefStrings; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; + +public class RenderChemical extends Render { + + private static ResourceLocation gas = new ResourceLocation(RefStrings.MODID + ":textures/particle/particle_base.png"); + + @Override + public void doRender(Entity entity, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + EntityChemical chem = (EntityChemical) entity; + ChemicalStyle style = chem.getStyle(); + + if(style == ChemicalStyle.AMAT) + renderAmatBeam(chem, f1); + + if(style == ChemicalStyle.GAS) { + this.bindEntityTexture(chem); + renderGasCloud(chem, f1); + } + + if(style == ChemicalStyle.GASFLAME) { + this.bindEntityTexture(chem); + renderGasFire(chem, f1); + } + + GL11.glPopMatrix(); + } + + private void renderGasFire(EntityChemical chem, float interp) { + + float exp = (float) (chem.ticksExisted + interp) / (float) chem.getMaxAge(); + double size = 0.0 + exp * 2; + Color color = Color.getHSBColor(Math.max((60 - exp * 100) / 360F, 0.0F), 1 - exp * 0.25F, 1 - exp * 0.5F); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GREATER, 0); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(false); + + Tessellator tess = Tessellator.instance; + GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + tess.startDrawingQuads(); + tess.setNormal(0.0F, 1.0F, 0.0F); + tess.setColorRGBA_I(color.getRGB(), (int) Math.max(255 * (1 - exp), 0)); + tess.addVertexWithUV(-size, -size, 0.0D, 1, 1); + tess.addVertexWithUV(size, -size, 0.0D, 0, 1); + tess.addVertexWithUV(size, size, 0.0D, 0, 0); + tess.addVertexWithUV(-size, size, 0.0D, 1, 0); + tess.draw(); + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.1F); + } + + private void renderGasCloud(EntityChemical chem, float interp) { + + double exp = (double) (chem.ticksExisted + interp) / (double) chem.getMaxAge(); + double size = 0.0 + exp * 10; + int color = chem.getType().getColor(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GREATER, 0); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(false); + + Tessellator tess = Tessellator.instance; + GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + tess.startDrawingQuads(); + tess.setNormal(0.0F, 1.0F, 0.0F); + tess.setColorRGBA_I(color, (int) Math.max(127 * (1 - exp), 0)); + tess.addVertexWithUV(-size, -size, 0.0D, 1, 1); + tess.addVertexWithUV(size, -size, 0.0D, 0, 1); + tess.addVertexWithUV(size, size, 0.0D, 0, 0); + tess.addVertexWithUV(-size, size, 0.0D, 1, 0); + tess.draw(); + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.1F); + } + + private void renderAmatBeam(EntityChemical chem, float interp) { + + float yaw = chem.prevRotationYaw + (chem.rotationYaw - chem.prevRotationYaw) * interp; + float pitch = chem.prevRotationPitch + (chem.rotationPitch - chem.prevRotationPitch) * interp; + GL11.glRotatef(yaw, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-pitch - 90, 1.0F, 0.0F, 0.0F); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glDepthMask(false); + + double length = Vec3.createVectorHelper(chem.motionX, chem.motionY, chem.motionZ).lengthVector() * (chem.ticksExisted + interp) * 0.75; + double size = 0.0625; + float o = 0.2F; + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + + tess.setColorRGBA_F(1F, 1F, 1F, o); + tess.addVertex(-size, 0, -size); + tess.addVertex(size, 0, -size); + tess.setColorRGBA_F(1F, 1F, 1F, 0.0F); + tess.addVertex(size, length, -size); + tess.addVertex(-size, length, -size); + + tess.setColorRGBA_F(1F, 1F, 1F, o); + tess.addVertex(-size, 0, size); + tess.addVertex(size, 0, size); + tess.setColorRGBA_F(1F, 1F, 1F, 0.0F); + tess.addVertex(size, length, size); + tess.addVertex(-size, length, size); + + tess.setColorRGBA_F(1F, 1F, 1F, o); + tess.addVertex(-size, 0, -size); + tess.addVertex(-size, 0, size); + tess.setColorRGBA_F(1F, 1F, 1F, 0.0F); + tess.addVertex(-size, length, size); + tess.addVertex(-size, length, -size); + + tess.setColorRGBA_F(1F, 1F, 1F, o); + tess.addVertex(size, 0, -size); + tess.addVertex(size, 0, size); + tess.setColorRGBA_F(1F, 1F, 1F, 0.0F); + tess.addVertex(size, length, size); + tess.addVertex(size, length, -size); + + tess.draw(); + + GL11.glDepthMask(true); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return gas; + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/ItemRenderChainsaw.java b/src/main/java/com/hbm/render/item/weapon/ItemRenderChainsaw.java new file mode 100644 index 000000000..2f3aecabe --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/ItemRenderChainsaw.java @@ -0,0 +1,131 @@ +package com.hbm.render.item.weapon; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.handler.BulletConfigSyncingUtil; +import com.hbm.items.ModItems; +import com.hbm.items.tool.ItemToolAbilityFueled; +import com.hbm.items.weapon.ItemGunBase; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; + +public class ItemRenderChainsaw implements IItemRenderer { + + public ItemRenderChainsaw() { } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch(type) { + case EQUIPPED: + case EQUIPPED_FIRST_PERSON: + case ENTITY: + case INVENTORY: + return true; + default: return false; + } + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + + return type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + GL11.glPushMatrix(); + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + + GL11.glEnable(GL11.GL_CULL_FACE); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.chainsaw_tex); + + switch(type) { + + case EQUIPPED_FIRST_PERSON: + + player.isSwingInProgress = false; + + double s0 = 0.35D; + GL11.glTranslated(0.5, 0.25, -0.25F); + GL11.glRotated(45, 0, 0, 1); + GL11.glRotated(80, 0, 1, 0); + GL11.glScaled(s0, s0, s0); + + if(!player.isBlocking()) { + double[] sRot = HbmAnimations.getRelevantTransformation("SWING_ROT"); + double[] sTrans = HbmAnimations.getRelevantTransformation("SWING_TRANS"); + GL11.glTranslated(sTrans[0], sTrans[1], sTrans[2]); + GL11.glRotated(sRot[2], 0, 0, 1); + GL11.glRotated(sRot[1], 0, 1, 0); + GL11.glRotated(sRot[0], 1, 0, 0); + } + + break; + + case EQUIPPED: + + double scale = -0.375D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(85, 0, 1, 0); + GL11.glRotated(135D, 1.0D, 0.0D, 0.0D); + GL11.glTranslated(-0.125, -2.0, 1.75); + + break; + + case ENTITY: + + double s1 = 0.5D; + GL11.glScaled(s1, s1, s1); + break; + + case INVENTORY: + + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_LIGHTING); + + double s = 4D; + GL11.glTranslated(8, 10, 0); + GL11.glRotated(-90, 0, 1, 0); + GL11.glRotated(-135, 1, 0, 0); + GL11.glScaled(s, s, -s); + + break; + + default: break; + } + + ResourceManager.chainsaw.renderPart("Saw"); + + for(int i = 0; i < 20; i++) { + + double run = ((ItemToolAbilityFueled) item.getItem()).canOperate(item) ? System.currentTimeMillis() % 100D * 0.25D / 100D : 0.0625D; + double forward = i * 0.25 + (run) - 2.0625; + + GL11.glPushMatrix(); + + GL11.glTranslated(0, 0, 1.9375); + GL11.glTranslated(0, 0.375, 0.5625); + double angle = MathHelper.clamp_double(forward, 0, 0.25 * Math.PI); + GL11.glRotated(angle * 180D / (Math.PI * 0.25), 1, 0, 0); + GL11.glTranslated(0, -0.375, -0.5625); + if(forward < 0) GL11.glTranslated(0, 0, forward); + if(forward > Math.PI * 0.25) GL11.glTranslated(0, 0, forward - Math.PI * 0.25); + ResourceManager.chainsaw.renderPart("Tooth"); + GL11.glPopMatrix(); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java b/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java index 6cca2ee0b..4996d353e 100644 --- a/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java +++ b/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java @@ -52,18 +52,18 @@ public class ItemRenderWeaponChemthrower implements IItemRenderer { case EQUIPPED: - double scale = 0.125D; + double scale = 0.25D; GL11.glScaled(scale, scale, scale); - GL11.glRotatef(20F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(10, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(15F, 1.0F, 0.0F, 0.0F); - GL11.glTranslatef(4F, -2F, 5F); + GL11.glRotated(100, 0, 1, 0); + GL11.glRotated(-10, 1, 0, 0); + GL11.glRotated(10, 0, 0, 1); + GL11.glTranslatef(-0.25F, -2.5F, 1.75F); break; case ENTITY: - double s1 = 0.1D; + double s1 = 0.25D; GL11.glScaled(s1, s1, s1); break; diff --git a/src/main/java/com/hbm/tileentity/IPersistentNBT.java b/src/main/java/com/hbm/tileentity/IPersistentNBT.java index 61195a6c0..fe9b5e835 100644 --- a/src/main/java/com/hbm/tileentity/IPersistentNBT.java +++ b/src/main/java/com/hbm/tileentity/IPersistentNBT.java @@ -18,8 +18,10 @@ public interface IPersistentNBT { public default ArrayList getDrops(Block b) { ArrayList list = new ArrayList(); ItemStack stack = new ItemStack(b); - stack.stackTagCompound = new NBTTagCompound(); - writeNBT(stack.stackTagCompound); + NBTTagCompound data = new NBTTagCompound(); + writeNBT(data); + if(!data.hasNoTags()) + stack.stackTagCompound = data; list.add(stack); return list; } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 4d4256312..0eaca905a 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -224,6 +224,7 @@ public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcc @Override public void writeNBT(NBTTagCompound nbt) { + if(tank.getFill() == 0) return; NBTTagCompound data = new NBTTagCompound(); this.tank.writeToNBT(data, "tank"); data.setShort("mode", mode); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index a2d8df30a..264b154d8 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -211,6 +211,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public void writeNBT(NBTTagCompound nbt) { + if(tank.getFill() == 0) return; NBTTagCompound data = new NBTTagCompound(); this.tank.writeToNBT(data, "tank"); data.setShort("mode", mode); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 2f10c0958..03636b45b 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -356,13 +356,15 @@ container.watzPowerplant=Watzkraftwerk container.zirnox=ZIRNOX Atomreaktor death.attack.acid=%1$s fiel in Säure. +death.attack.acidPlayer=%1$s wurde von %2$s aufgelöst. death.attack.ams=%1$s wurde in tödlichen Teilchen gebadet, die von der Menschheit erst benannt werden müssen. death.attack.amsCore=%1$s wurde vom Feuer einer Singularität verdampft. death.attack.asbestos=%1$s hat sich für finanzielle Entschädigung qualifiziert. death.attack.bang=%1$s wurde in mundgerechte Stücke zerfetzt. death.attack.blackhole=%1$s wurde spaghettifiziert. death.attack.blender=%1$s wurde in kleine, mundgerechte Stücke geschnitten. -death.attack.boat=%1$s wurde von Schiff erschlagen. +death.attack.boat=%1$s wurde von einem Schiff erschlagen. +death.attack.boil=%1$s wurde von %2$s lebend gekocht. death.attack.boxcar=%1$s wurde von einem fallenden Güterwagon zermatscht. Autsch! death.attack.broadcast=%1$s wurde das Gehirn geschmolzen. death.attack.building=%1$s wurde von einem Gebäude zermatscht. @@ -1527,6 +1529,7 @@ item.gun_bolter_digamma.name=Digammagewehr item.gun_calamity.name=Knochensäge item.gun_calamity_ammo.name=.50 BMG Patrone (LEGACY) item.gun_calamity_dual.name=Sattelkanone +item.gun_chemthrower.name=Chemowerfer item.gun_cryolator.name=Der Cryolator item.gun_cryolator_ammo.name=Kryozelle item.gun_dampfmaschine.name=Garantiert keine Scherzwaffe diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 8aa4b70a9..75ad64d4d 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -547,6 +547,7 @@ container.watzPowerplant=Watz Power Plant container.zirnox=ZIRNOX Nuclear Reactor death.attack.acid=%1$s fell into acid. +death.attack.acidPlayer=%1$s was dissolved by %2$s. death.attack.ams=%1$s was bathed in deadly particles that have yet to be named by human science. death.attack.amsCore=%1$s was vaporized in the fire of a singularity. death.attack.asbestos=%1$s is now entitled to financial compensation. @@ -554,6 +555,7 @@ death.attack.bang=%1$s was blasted into bite-sized pieces. death.attack.blackhole=%1$s was spaghettified. death.attack.blender=%1$s was chopped in small, bite-sized pieces. death.attack.boat=%1$s was hit by a boat. +death.attack.boil=%1$s was boiled alive by %2$s. death.attack.boxcar=%1$s was smushed by a falling boxcar. Oh well. death.attack.broadcast=%1$s got their brain melted. death.attack.building=%1$s was hit by a falling building. @@ -1793,6 +1795,7 @@ item.gun_bolter_digamma.name=Digamma Gun item.gun_calamity.name=Buzzsaw item.gun_calamity_ammo.name=.50 BMG Round (LEGACY) item.gun_calamity_dual.name=Saddle Gun +item.gun_chemthrower.name=Chemthrower item.gun_cryolator.name=The Cryolator item.gun_cryolator_ammo.name=Cryo Cell item.gun_dampfmaschine.name=Totally Not a Joke Weapon diff --git a/src/main/resources/assets/hbm/models/weapons/chainsaw.obj b/src/main/resources/assets/hbm/models/weapons/chainsaw.obj new file mode 100644 index 000000000..3bd2f83db --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/chainsaw.obj @@ -0,0 +1,505 @@ +# Blender v2.79 (sub 0) OBJ File: 'chainsaw.blend' +# www.blender.org +o Tooth +v -0.421875 0.562500 0.625000 +v -0.390625 0.562500 0.625000 +v -0.390625 0.687500 0.625000 +v -0.421875 0.687500 0.625000 +v -0.421875 0.687500 0.500000 +v -0.390625 0.687500 0.500000 +v -0.390625 0.562500 0.500000 +v -0.421875 0.562500 0.500000 +vt 0.755814 0.579710 +vt 0.732558 0.608696 +vt 0.732558 0.579710 +vt 0.790698 0.579710 +vt 0.767442 0.608696 +vt 0.767442 0.579710 +vt 0.755814 0.608696 +vt 0.732558 0.623188 +vt 0.720930 0.579710 +vt 0.790698 0.608696 +vt 0.755814 0.623188 +vt 0.720930 0.608696 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1/1/1 5/2/1 8/3/1 +f 7/4/2 3/5/2 2/6/2 +f 1/1/3 3/5/3 4/7/3 +f 4/7/4 6/8/4 5/2/4 +f 5/2/5 7/9/5 8/3/5 +f 1/1/1 4/7/1 5/2/1 +f 7/4/2 6/10/2 3/5/2 +f 1/1/3 2/6/3 3/5/3 +f 4/7/4 3/11/4 6/8/4 +f 5/2/5 6/12/5 7/9/5 +o Saw +v 0.500000 0.687500 0.250000 +v 0.500000 0.062500 0.250000 +v 0.500000 0.687500 -0.312500 +v 0.500000 0.062500 -0.312500 +v 0.562500 0.625000 -0.250000 +v 0.562500 0.625000 0.250000 +v 0.562500 0.125000 0.250000 +v 0.562500 0.125000 -0.250000 +v -0.125000 0.000000 -1.000000 +v 0.125000 0.000000 -1.000000 +v -0.125000 0.000000 -1.750000 +v 0.125000 0.000000 -1.750000 +v -0.125000 0.375000 -1.750000 +v 0.125000 0.375000 -1.750000 +v -0.125000 0.750000 -1.000000 +v 0.125000 0.750000 -1.000000 +v -0.125000 0.125000 -1.000000 +v 0.125000 0.125000 -1.000000 +v -0.125000 0.125000 -1.625000 +v 0.125000 0.125000 -1.625000 +v -0.125000 0.250000 -1.625000 +v 0.125000 0.250000 -1.625000 +v -0.125000 0.625000 -0.885000 +v 0.125000 0.625000 -0.885000 +v -0.062500 0.896676 -0.695873 +v 0.062500 0.896676 -0.695873 +v -0.062500 0.834176 -0.804127 +v 0.062500 0.834176 -0.804127 +v -0.062500 0.888302 -0.835377 +v -0.062500 0.950802 -0.727123 +v 0.062500 0.950802 -0.727123 +v 0.062500 0.888302 -0.835377 +v -0.500000 0.125000 0.500000 +v -0.500000 0.625000 0.500000 +v 0.375000 0.750000 0.500000 +v -0.500000 0.625000 -0.250000 +v -0.375000 0.750000 0.500000 +v -0.625000 0.125000 0.500000 +v -0.625000 0.625000 0.500000 +v -0.625000 0.625000 -0.250000 +v -0.500000 0.375000 -0.500000 +v -0.500000 0.125000 -0.500000 +v -0.625000 0.375000 -0.500000 +v -0.625000 0.125000 -0.500000 +v 0.500000 0.000000 0.375000 +v 0.625000 0.000000 0.375000 +v 0.500000 0.000000 0.250000 +v 0.625000 0.000000 0.250000 +v 0.500000 1.250000 0.375000 +v 0.625000 1.375000 0.375000 +v 0.500000 1.250000 0.250000 +v 0.625000 1.375000 0.250000 +v -0.500000 1.250000 0.375000 +v -0.500000 1.250000 0.250000 +v -0.500000 0.625000 0.375000 +v -0.500000 0.625000 0.250000 +v -0.625000 1.375000 0.375000 +v -0.625000 1.375000 0.250000 +v -0.625000 0.625000 0.375000 +v -0.625000 0.625000 0.250000 +v -0.375000 0.750000 0.500000 +v 0.375000 0.750000 0.500000 +v -0.375000 1.000000 0.750000 +v 0.375000 1.000000 0.750000 +v -0.375000 1.500000 0.750000 +v 0.375000 1.500000 0.750000 +v -0.437500 0.125000 0.500000 +v -0.437500 0.625000 0.500000 +v -0.375000 0.125000 0.500000 +v -0.375000 0.625000 0.500000 +v -0.437500 0.125000 2.500000 +v -0.437500 0.625000 2.500000 +v -0.375000 0.125000 2.500000 +v -0.375000 0.625000 2.500000 +v -0.375000 0.125000 0.500000 +v -0.375000 0.625000 0.500000 +v 0.375000 0.125000 0.500000 +v 0.375000 0.625000 0.500000 +v -0.375000 0.250000 0.625000 +v -0.375000 0.500000 0.625000 +v 0.375000 0.250000 0.625000 +v 0.375000 0.500000 0.625000 +v -0.500000 0.000000 -0.500000 +v -0.500000 0.000000 0.500000 +v -0.375000 0.198223 2.676777 +v -0.437500 0.551777 2.676777 +v -0.437500 0.375000 2.750000 +v -0.437500 0.198223 2.676777 +v -0.375000 0.375000 2.750000 +v -0.375000 0.551777 2.676777 +v 0.500000 0.000000 0.500000 +v 0.500000 0.000000 -0.500000 +v -0.250000 0.000000 -1.000000 +v 0.250000 0.000000 -1.000000 +v -0.500000 0.750000 -0.500000 +v -0.500000 0.750000 0.500000 +v 0.500000 0.750000 0.500000 +v 0.500000 0.750000 -0.500000 +v -0.250000 0.750000 -1.000000 +v 0.250000 0.750000 -1.000000 +v -0.250000 1.000000 0.500000 +v 0.250000 1.000000 0.500000 +v -0.250000 1.000000 -0.500000 +v 0.250000 1.000000 -0.500000 +v -0.447500 0.262500 0.625000 +v -0.447500 0.487500 0.625000 +v -0.447500 0.262500 2.500000 +v -0.447500 0.487500 2.500000 +v -0.365000 0.262500 0.625000 +v -0.365000 0.487500 0.625000 +v -0.365000 0.262500 2.500000 +v -0.365000 0.487500 2.500000 +v -0.375000 1.000000 0.750000 +v 0.375000 1.000000 0.750000 +v -0.375000 1.500000 0.750000 +v 0.375000 1.500000 0.750000 +vt 0.209302 0.057971 +vt 0.186047 0.086957 +vt 0.186047 0.057971 +vt 0.325581 0.724638 +vt 0.186047 0.637681 +vt 0.325581 0.637681 +vt 0.209302 0.086957 +vt 0.441860 0.115942 +vt 0.209302 0.115942 +vt 0.465116 0.130435 +vt 0.558140 0.246377 +vt 0.465116 0.246377 +vt 0.569767 0.260870 +vt 0.558140 0.130435 +vt 0.569767 0.115942 +vt 0.058140 0.869565 +vt 0.930233 1.000000 +vt 0.058140 1.000000 +vt 0.465116 0.115942 +vt 0.465116 0.260870 +vt 0.720930 0.289855 +vt 0.674419 0.115942 +vt 0.720930 0.115942 +vt 0.720930 0.376812 +vt 0.674419 0.289855 +vt 0.720930 0.550725 +vt 0.674419 0.376812 +vt 0.790698 0.115942 +vt 0.744186 0.260870 +vt 0.744186 0.115942 +vt 0.790698 0.318841 +vt 0.744186 0.347826 +vt 0.744186 0.318841 +vt 0.790698 0.405797 +vt 0.744186 0.579710 +vt 0.744186 0.405797 +vt 0.651163 0.347826 +vt 0.651163 0.260870 +vt 0.674419 0.550725 +vt 0.651163 0.405797 +vt 0.581395 0.159420 +vt 0.604651 0.130435 +vt 0.604651 0.159420 +vt 0.616279 0.159420 +vt 0.616279 0.130435 +vt 0.604651 0.115942 +vt 0.581395 0.130435 +vt 0.581395 0.115942 +vt 0.581395 0.173913 +vt 0.604651 0.173913 +vt 0.569767 0.130435 +vt 0.569767 0.159420 +vt 0.209302 0.289855 +vt 0.348837 0.260870 +vt 0.348837 0.289855 +vt 0.186047 0.637681 +vt 0.325581 0.724638 +vt 0.325581 0.637681 +vt 0.162791 0.260870 +vt 0.209302 0.260870 +vt 0.372093 0.260870 +vt 0.348837 0.144928 +vt 0.372093 0.144928 +vt 0.139535 0.144928 +vt 0.162791 0.202899 +vt 0.139535 0.202899 +vt 0.186047 0.724638 +vt 0.325581 0.840580 +vt 0.441860 0.028986 +vt 0.209302 0.028986 +vt 0.162791 0.144928 +vt 0.441860 -0.000000 +vt 0.209302 -0.000000 +vt 0.465116 0.057971 +vt 0.465116 0.086957 +vt 0.488372 -0.000000 +vt 0.674419 0.028986 +vt 0.488372 0.028986 +vt 0.720930 0.000000 +vt 0.837209 0.028986 +vt 0.720930 0.028986 +vt 0.697674 0.086957 +vt 0.697674 0.057971 +vt 0.837209 0.086957 +vt 0.488372 0.115942 +vt 0.720930 0.115942 +vt 0.837209 0.115942 +vt 0.837209 0.057971 +vt 0.325581 0.840580 +vt 0.186047 0.724638 +vt 0.895349 0.115942 +vt 0.883721 0.579710 +vt 0.883721 0.115942 +vt 0.988372 0.115942 +vt 0.895349 0.579710 +vt 1.000000 0.115942 +vt 0.988372 0.579710 +vt 0.790698 0.579710 +vt 0.790698 0.115942 +vt 0.511628 0.666667 +vt 0.651163 0.724638 +vt 0.511628 0.724638 +vt 0.511628 0.753623 +vt 0.651163 0.753623 +vt 0.651163 0.637681 +vt 0.511628 0.637681 +vt 0.674419 0.753623 +vt 0.651163 0.666667 +vt 0.674419 0.637681 +vt 0.988372 0.623188 +vt 1.000000 0.666667 +vt 0.988372 0.666667 +vt 0.895349 0.666667 +vt 0.883721 0.623188 +vt 0.895349 0.623188 +vt 1.000000 0.623188 +vt 1.000000 0.579710 +vt 0.974987 0.620786 +vt 0.941860 0.637681 +vt 0.909405 0.620786 +vt 0.870647 0.620786 +vt 0.805065 0.620786 +vt 0.186047 0.405797 +vt 0.000000 0.637681 +vt -0.000000 0.405797 +vt 0.046512 0.289855 +vt 0.651163 0.637681 +vt 0.511628 0.405797 +vt 0.651163 0.405797 +vt 0.186047 0.289855 +vt 0.325581 0.405797 +vt 0.325581 0.869565 +vt 0.511628 0.695652 +vt 0.511628 0.869565 +vt 0.511628 0.289855 +vt 0.651163 0.289855 +vt 0.465116 0.115942 +vt 0.372093 0.289855 +vt 0.372093 0.115942 +vt 0.325581 0.637681 +vt 0.186047 0.637681 +vt 0.325581 0.695652 +vt 0.465116 0.637681 +vt 0.372093 0.637681 +vt 0.465116 0.405797 +vt 0.372093 0.405797 +vt 0.511628 0.637681 +vt 0.465116 0.289855 +vt 0.325581 0.289855 +vt 0.058140 1.000000 +vt 0.930233 0.869565 +vt 0.930233 1.000000 +vt 0.348837 0.115942 +vt 0.930233 0.869565 +vt 0.790698 0.260870 +vt 0.790698 0.347826 +vt 0.790698 0.579710 +vt 0.651163 0.318841 +vt 0.651163 0.115942 +vt 0.651163 0.579710 +vt 0.162791 0.289855 +vt 0.186047 0.840580 +vt 0.674419 0.000000 +vt 0.837209 0.000000 +vt 0.674419 0.115942 +vt 0.186047 0.840580 +vt 0.883721 0.666667 +vt 0.837209 0.637681 +vt 0.139535 0.289855 +vt 0.058140 0.869565 +vt 0.162791 0.115942 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn -1.0000 0.0000 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.8920 0.4520 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 0.5000 0.8660 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.3827 0.9239 +vn 0.0000 0.9239 0.3827 +vn 0.0000 -0.9239 0.3827 +vn 0.8944 0.0000 -0.4472 +vn -0.8944 0.0000 -0.4472 +vn -0.7071 0.7071 0.0000 +vn -0.6667 0.6667 -0.3333 +vn 0.6667 0.6667 -0.3333 +s off +f 56/13/6 53/14/6 55/15/6 +f 71/16/7 70/17/7 69/18/7 +f 54/19/8 57/20/8 53/21/8 +f 15/22/9 13/23/9 14/24/9 +f 11/25/10 16/26/10 12/27/10 +f 113/28/11 116/29/11 114/30/11 +f 10/31/12 16/26/12 15/22/12 +f 9/32/13 13/23/13 11/25/13 +f 19/33/6 18/34/6 17/35/6 +f 21/36/14 20/37/14 19/33/14 +f 23/38/15 22/39/15 21/36/15 +f 26/40/16 27/41/16 25/42/16 +f 28/43/8 29/44/8 27/45/8 +f 30/46/17 31/47/17 29/48/17 +f 27/45/11 21/36/11 19/33/11 +f 30/49/9 20/37/9 22/39/9 +f 28/50/9 18/34/9 20/37/9 +f 29/48/11 23/38/11 21/36/11 +f 24/51/9 30/52/9 22/39/9 +f 17/35/11 27/41/11 19/33/11 +f 39/53/18 37/54/18 38/55/18 +f 33/56/11 37/54/11 35/57/11 +f 35/58/19 40/59/19 36/60/19 +f 34/61/20 38/55/20 33/62/20 +f 36/63/9 39/53/9 34/64/9 +f 44/65/16 47/66/16 42/67/16 +f 43/68/21 121/69/21 45/70/21 +f 44/65/7 51/71/7 48/72/7 +f 42/73/8 46/74/8 41/75/8 +f 50/76/14 51/77/14 49/78/14 +f 122/79/8 123/80/8 121/69/8 +f 59/81/14 56/13/14 55/82/14 +f 46/74/11 48/72/11 52/83/11 +f 57/84/11 55/82/11 53/85/11 +f 54/19/9 60/86/9 58/87/9 +f 57/88/6 62/89/6 59/90/6 +f 61/91/9 64/92/9 62/93/9 +f 60/86/16 65/94/16 58/87/16 +f 66/95/11 67/96/11 65/94/11 +f 65/94/8 57/97/8 58/87/8 +f 61/98/8 67/96/8 63/99/8 +f 59/90/14 66/95/14 60/86/14 +f 68/100/14 62/93/14 64/92/14 +f 73/101/14 72/102/14 71/16/14 +f 76/103/16 82/104/16 78/105/16 +f 75/106/11 80/107/11 76/103/11 +f 77/108/6 79/109/6 75/106/6 +f 78/105/9 81/110/9 77/111/9 +f 87/112/8 90/113/8 88/114/8 +f 84/115/22 90/113/22 86/116/22 +f 85/117/21 87/112/21 83/118/21 +f 86/119/9 89/120/9 85/121/9 +f 96/122/23 97/123/23 95/124/23 +f 95/125/24 98/126/24 94/127/24 +f 94/127/25 82/104/25 80/107/25 +f 93/128/26 79/109/26 81/129/26 +f 96/130/11 95/131/11 94/132/11 +f 98/133/9 93/134/9 81/110/9 +f 100/135/6 92/136/6 91/137/6 +f 101/138/6 100/135/6 91/137/6 +f 92/139/11 103/140/11 91/141/11 +f 102/142/27 106/143/27 100/135/27 +f 99/144/8 104/145/8 92/146/8 +f 91/141/28 107/147/28 101/148/28 +f 101/149/14 108/150/14 102/151/14 +f 100/135/9 105/152/9 99/153/9 +f 105/154/8 109/155/8 104/145/8 +f 110/156/16 111/157/16 109/155/16 +f 112/158/13 105/152/13 106/143/13 +f 109/155/29 103/140/29 104/159/29 +f 107/160/15 112/158/15 108/150/15 +f 107/147/30 103/140/30 111/157/30 +f 108/161/31 112/158/31 106/143/31 +f 120/162/9 117/163/9 118/164/9 +f 52/83/6 41/165/6 46/74/6 +f 56/13/6 54/19/6 53/14/6 +f 71/16/7 72/102/7 70/17/7 +f 54/19/8 58/87/8 57/20/8 +f 15/22/9 16/26/9 13/23/9 +f 11/25/10 13/23/10 16/26/10 +f 113/28/11 115/166/11 116/29/11 +f 10/31/12 12/27/12 16/26/12 +f 9/32/13 14/24/13 13/23/13 +f 19/33/6 20/37/6 18/34/6 +f 21/36/14 22/39/14 20/37/14 +f 23/38/15 24/51/15 22/39/15 +f 26/40/16 28/167/16 27/41/16 +f 28/43/8 30/168/8 29/44/8 +f 30/46/17 32/169/17 31/47/17 +f 27/45/11 29/44/11 21/36/11 +f 30/49/9 28/170/9 20/37/9 +f 28/50/9 26/171/9 18/34/9 +f 29/48/11 31/47/11 23/38/11 +f 24/51/9 32/172/9 30/52/9 +f 17/35/11 25/42/11 27/41/11 +f 39/53/18 40/59/18 37/54/18 +f 33/56/11 38/55/11 37/54/11 +f 35/58/19 37/54/19 40/59/19 +f 34/61/20 39/53/20 38/55/20 +f 36/63/9 40/59/9 39/53/9 +f 44/65/16 48/72/16 47/66/16 +f 43/68/21 122/79/21 121/69/21 +f 44/65/7 49/173/7 51/71/7 +f 42/73/8 47/66/8 46/74/8 +f 50/76/14 52/83/14 51/77/14 +f 122/79/8 124/174/8 123/80/8 +f 59/81/14 60/86/14 56/13/14 +f 47/66/11 48/72/11 46/74/11 +f 48/72/11 51/77/11 52/83/11 +f 57/84/11 59/81/11 55/82/11 +f 54/19/9 56/13/9 60/86/9 +f 57/88/6 61/175/6 62/89/6 +f 61/91/9 63/176/9 64/92/9 +f 60/86/16 66/95/16 65/94/16 +f 66/95/11 68/100/11 67/96/11 +f 65/94/8 61/177/8 57/97/8 +f 61/98/8 65/94/8 67/96/8 +f 59/90/14 62/89/14 66/95/14 +f 68/100/14 66/95/14 62/93/14 +f 73/101/14 74/178/14 72/102/14 +f 76/103/16 80/107/16 82/104/16 +f 75/106/11 79/109/11 80/107/11 +f 77/108/6 81/129/6 79/109/6 +f 78/105/9 82/104/9 81/110/9 +f 87/112/8 89/120/8 90/113/8 +f 84/115/22 88/114/22 90/113/22 +f 85/117/21 89/120/21 87/112/21 +f 86/119/9 90/113/9 89/120/9 +f 96/122/23 93/128/23 97/123/23 +f 95/125/24 97/179/24 98/126/24 +f 94/127/25 98/126/25 82/104/25 +f 93/128/26 96/122/26 79/109/26 +f 94/132/11 80/107/11 79/109/11 +f 79/109/11 96/130/11 94/132/11 +f 81/110/9 82/104/9 98/133/9 +f 98/133/9 97/180/9 93/134/9 +f 100/135/6 99/153/6 92/136/6 +f 101/138/6 102/181/6 100/135/6 +f 92/139/11 104/159/11 103/140/11 +f 102/142/27 108/161/27 106/143/27 +f 99/144/8 105/154/8 104/145/8 +f 91/141/28 103/140/28 107/147/28 +f 101/149/14 107/160/14 108/150/14 +f 100/135/9 106/143/9 105/152/9 +f 105/154/8 110/156/8 109/155/8 +f 110/156/16 112/158/16 111/157/16 +f 112/158/13 110/156/13 105/152/13 +f 109/155/29 111/157/29 103/140/29 +f 107/160/15 111/157/15 112/158/15 +f 120/162/9 119/182/9 117/163/9 +f 52/83/6 50/183/6 41/165/6 diff --git a/src/main/resources/assets/hbm/sounds/weapon/chainsaw_loop.ogg b/src/main/resources/assets/hbm/sounds/weapon/chainsaw_loop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a687020c809ff2c5c3d01afb0d4cc7bfbda3a303 GIT binary patch literal 14025 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/chemthrower.png b/src/main/resources/assets/hbm/textures/models/weapons/chemthrower.png index 9463a19871439518d85c85c332bc52eda4665ef0..6d09425aef937ced8fbf994590b1b6303f6791dc 100644 GIT binary patch delta 3555 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 U_q9C~0g?>+3s;~uw!TUK1;X~3XaE2J literal 3810 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 ev Date: Sun, 21 Aug 2022 18:20:22 +0200 Subject: [PATCH 018/111] nobody saw that --- .../java/com/hbm/blocks/machine/MachineFluidTank.java | 4 ---- .../java/com/hbm/entity/logic/EntityNukeExplosionNT.java | 1 - src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java | 8 -------- 3 files changed, 13 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java index 1b5e3670d..994097ec3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java @@ -134,7 +134,6 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe } else { this.dropBlockAsItem(world, x, y, z, drop); world.func_147480_a(x, y, z, false); - System.out.println("piss and shit"); } } if (i == 1) { @@ -182,7 +181,6 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe } else { this.dropBlockAsItem(world, x, y, z, drop); world.func_147480_a(x, y, z, false); - System.out.println("piss and shit"); } } if (i == 2) { @@ -230,7 +228,6 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe } else { this.dropBlockAsItem(world, x, y, z, drop); world.func_147480_a(x, y, z, false); - System.out.println("piss and shit"); } } if (i == 3) { @@ -278,7 +275,6 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock, IPe } else { this.dropBlockAsItem(world, x, y, z, drop); world.func_147480_a(x, y, z, false); - System.out.println("piss and shit"); } } diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionNT.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionNT.java index 427321413..31771102d 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionNT.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionNT.java @@ -26,7 +26,6 @@ public class EntityNukeExplosionNT extends Entity { if(!worldObj.isRemote) { if(this.explosion == null || this.explosion.isDone()) { - System.out.println(this.ticksExisted + " explosion done."); this.setDead(); return; } diff --git a/src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java b/src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java index 4f9c2498e..0e0139b60 100644 --- a/src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java +++ b/src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java @@ -89,7 +89,6 @@ public class Mark5Ausf2 implements IExplosionLogic { System.out.println(seg.rays.length); } }*/ - System.out.println("STOP"); } @Override @@ -109,7 +108,6 @@ public class Mark5Ausf2 implements IExplosionLogic { this.processBow = 0; this.processRing = 0; this.phase = 1; - System.out.println("Ending phase 0"); } private void processRays(int amount) { @@ -196,7 +194,6 @@ public class Mark5Ausf2 implements IExplosionLogic { if(this.phase == 1 && this.buffer.isEmpty()) { this.phase = 2; - System.out.println("Ending phase 1"); return; } @@ -218,7 +215,6 @@ public class Mark5Ausf2 implements IExplosionLogic { if(this.buffer.isEmpty()) { this.phase = 2; - System.out.println("Ending phase 1"); } } @@ -315,9 +311,6 @@ public class Mark5Ausf2 implements IExplosionLogic { this.segments = this.repopulatedSegments; this.repopulatedSegments = null; - System.out.println("Ending phase 2"); - - System.out.println("Initialized with" + segments.length + " segments!"); /*for(HorizontalSegment seg : segments) { @@ -332,7 +325,6 @@ public class Mark5Ausf2 implements IExplosionLogic { this.phase = 0; if(!didYouDoLiterallyAnything) { - System.out.println("Done!"); this.isDone = true; } } From 6196edc1b69d8feb405b832b1f03170b922d0c8b Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 21 Aug 2022 18:42:37 +0200 Subject: [PATCH 019/111] i don't even know how this one happened --- .../com/hbm/entity/item/EntityMovingConveyorObject.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java b/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java index 779696bba..fb97632ae 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java @@ -70,6 +70,12 @@ public abstract class EntityMovingConveyorObject extends Entity { } if(!worldObj.isRemote) { + + ticksExisted++; + + if(this.ticksExisted <= 5) { + return; + } int blockX = (int) Math.floor(posX); int blockY = (int) Math.floor(posY); From 408461a29b0b602a53ce293548ca52f7882dc79b Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Sun, 21 Aug 2022 20:30:06 +0300 Subject: [PATCH 020/111] Updated ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index c6e8b4044..324af65ba 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1203,6 +1203,8 @@ death.attack.twr2=%2$s разбил %1$s на миллион осколков с death.attack.twr3=%2$s показал %1$s, что здесь нету выхода. death.attack.overdose=%1$s умер от передоза метамфетамином. death.attack.microwave=%1$s взорвался от микроволнового излучения. +death.attack.acidPlayer=%1$s был растворён %2$s. +death.attack.boil=%1$s был заживо сварен %2$s. item.redstone_sword.name=Меч из красного камня item.big_sword.name=Большой меч @@ -3438,6 +3440,7 @@ item.gun_xvl1456.name=Прототип Тау-пушки XVL1456 item.gun_osipr.name=Импульсная винтовка Патруля item.gun_immolator.name=Иммолятор item.gun_flamer.name=Мистер Топаз +item.gun_chemthrower.name=Химомёт item.gun_cryolator.name=Криолятор item.gun_mp.name=Пулемет Пацифистов item.gun_zomg.name=ZOMG-пушка From 8e1b32cb42b19aa3271d3a4ad82fad75162a3d71 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 22 Aug 2022 12:18:36 +0200 Subject: [PATCH 021/111] fixes, fluid trait improvements --- .../hbm/entity/projectile/EntityChemical.java | 127 ++++++++++++++++-- .../java/com/hbm/inventory/fluid/Fluids.java | 14 +- .../inventory/fluid/trait/FT_Flammable.java | 16 +++ .../hbm/inventory/fluid/trait/FT_Poison.java | 29 ++++ .../hbm/inventory/gui/GUIMachineBattery.java | 7 +- .../inventory/recipes/CyclotronRecipes.java | 17 ++- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../storage/TileEntityMachineBattery.java | 22 +-- src/main/resources/mcmod.info | 2 +- 9 files changed, 201 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FT_Poison.java diff --git a/src/main/java/com/hbm/entity/projectile/EntityChemical.java b/src/main/java/com/hbm/entity/projectile/EntityChemical.java index 4c798bc3d..ea7f07050 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityChemical.java +++ b/src/main/java/com/hbm/entity/projectile/EntityChemical.java @@ -3,6 +3,7 @@ package com.hbm.entity.projectile; import java.awt.Color; import java.util.List; +import com.hbm.blocks.ModBlocks; import com.hbm.extprop.HbmLivingProps; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.inventory.fluid.FluidType; @@ -10,11 +11,13 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.trait.FT_Combustible; import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.inventory.fluid.trait.FT_Flammable; +import com.hbm.inventory.fluid.trait.FT_Poison; import com.hbm.inventory.fluid.trait.FT_VentRadiation; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; import com.hbm.util.ArmorUtil; import com.hbm.util.ContaminationUtil; +import com.hbm.util.EnchantmentUtil; import com.hbm.util.ContaminationUtil.ContaminationType; import com.hbm.util.ContaminationUtil.HazardType; import com.hbm.util.EntityDamageUtil; @@ -22,12 +25,14 @@ import com.hbm.util.EntityDamageUtil; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSourceIndirect; +import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -146,6 +151,7 @@ public class EntityChemical extends EntityThrowableNT { intensity = 1D; if(style == ChemicalStyle.AMAT) { + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, ModDamageSource.radiation, 1F); if(living != null) { ContaminationUtil.contaminate(living, HazardType.RADIATION, ContaminationType.CREATIVE, 50F * (float) intensity); return; @@ -182,14 +188,13 @@ public class EntityChemical extends EntityThrowableNT { if(living != null) { HbmLivingProps.setOil(living, 300); //doused in oil for 15 seconds } - } else { - - if(type.temperature < 50) { - e.extinguish(); //if it's a cold non-flammable liquid (that isn't burning), extinguish - } } } + if(this.isExtinguishing()) { + e.extinguish(); + } + if(style == ChemicalStyle.BURNING) { FT_Combustible trait = type.getTrait(FT_Combustible.class); EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_flamethrower), 2F + (trait != null ? (trait.getCombustionEnergy() / 100_000F) : 0)); @@ -224,6 +229,30 @@ public class EntityChemical extends EntityThrowableNT { } ChunkRadiationManager.proxy.incrementRad(worldObj, (int) Math.floor(e.posX), (int) Math.floor(e.posY), (int) Math.floor(e.posZ), trait.getRadPerMB() * 5); } + + if(type.hasTrait(FT_Poison.class)) { + FT_Poison trait = type.getTrait(FT_Poison.class); + + if(living != null) { + living.addPotionEffect(new PotionEffect(trait.isWithering() ? Potion.wither.id : Potion.poison.id, (int) (5 * 20 * intensity))); + } + } + + if(type == Fluids.XPJUICE) { + + if(e instanceof EntityPlayer) { + EnchantmentUtil.addExperience((EntityPlayer) e, 1, false); + this.setDead(); + } + } + + if(type == Fluids.ENDERJUICE) { + this.teleportRandomly(e); + } + } + + protected boolean isExtinguishing() { + return this.getStyle() == ChemicalStyle.LIQUID && this.getType().temperature < 50 && !this.getType().hasTrait(FT_Flammable.class); } protected DamageSource getDamage(String name) { @@ -234,6 +263,73 @@ public class EntityChemical extends EntityThrowableNT { return new DamageSource(name); } } + + //terribly copy-pasted from EntityEnderman.class + protected boolean teleportRandomly(Entity e) { + double x = this.posX + (this.rand.nextDouble() - 0.5D) * 64.0D; + double y = this.posY + (double) (this.rand.nextInt(64) - 32); + double z = this.posZ + (this.rand.nextDouble() - 0.5D) * 64.0D; + return this.teleportTo(e, x, y, z); + } + + protected boolean teleportTo(Entity e, double x, double y, double z) { + + double targetX = e.posX; + double targetY = e.posY; + double targetZ = e.posZ; + e.posX = x; + e.posY = y; + e.posZ = z; + boolean flag = false; + int i = MathHelper.floor_double(e.posX); + int j = MathHelper.floor_double(e.posY); + int k = MathHelper.floor_double(e.posZ); + + if(e.worldObj.blockExists(i, j, k)) { + boolean flag1 = false; + + while(!flag1 && j > 0) { + Block block = e.worldObj.getBlock(i, j - 1, k); + + if(block.getMaterial().blocksMovement()) { + flag1 = true; + } else { + --e.posY; + --j; + } + } + + if(flag1) { + e.setPosition(e.posX, e.posY, e.posZ); + + if(e.worldObj.getCollidingBoundingBoxes(e, e.boundingBox).isEmpty() && !e.worldObj.isAnyLiquid(e.boundingBox)) { + flag = true; + } + } + } + + if(!flag) { + e.setPosition(targetX, targetY, targetZ); + return false; + } else { + short short1 = 128; + + for(int l = 0; l < short1; ++l) { + double d6 = (double) l / ((double) short1 - 1.0D); + float f = (this.rand.nextFloat() - 0.5F) * 0.2F; + float f1 = (this.rand.nextFloat() - 0.5F) * 0.2F; + float f2 = (this.rand.nextFloat() - 0.5F) * 0.2F; + double d7 = targetX + (e.posX - targetX) * d6 + (this.rand.nextDouble() - 0.5D) * (double) e.width * 2.0D; + double d8 = targetY + (e.posY - targetY) * d6 + this.rand.nextDouble() * (double) e.height; + double d9 = targetZ + (e.posZ - targetZ) * d6 + (this.rand.nextDouble() - 0.5D) * (double) e.width * 2.0D; + e.worldObj.spawnParticle("portal", d7, d8, d9, (double) f, (double) f1, (double) f2); + } + + e.worldObj.playSoundEffect(targetX, targetY, targetZ, "mob.endermen.portal", 1.0F, 1.0F); + e.playSound("mob.endermen.portal", 1.0F, 1.0F); + return true; + } + } @Override protected void onImpact(MovingObjectPosition mop) { @@ -261,8 +357,24 @@ public class EntityChemical extends EntityThrowableNT { int z = mop.blockZ; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + + Block fire = type == Fluids.BALEFIRE ? ModBlocks.balefire : Blocks.fire; + if(worldObj.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).isAir(worldObj, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ)) { - worldObj.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, Blocks.fire); + worldObj.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, fire); + } + } + } + + if(this.isExtinguishing()) { + int x = mop.blockX; + int y = mop.blockY; + int z = mop.blockZ; + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + + if(worldObj.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) == Blocks.fire) { + worldObj.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, Blocks.air); } } } @@ -302,9 +414,8 @@ public class EntityChemical extends EntityThrowableNT { case GAS: return 60; case GASFLAME: return 20; case LIQUID: return 600; + default: return 100; } - - return 100; } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 867f1789e..99c90d18c 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -143,7 +143,7 @@ public class Fluids { NAPHTHA = new FluidType("NAPHTHA", 0x595744, 2, 1, 0, EnumSymbol.NONE).addContainers(0x5F6D44, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 200_000), LIQUID); DIESEL = new FluidType("DIESEL", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF2C2C, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.HIGH, 500_000), LIQUID); LIGHTOIL = new FluidType("LIGHTOIL", 0x8c7451, 1, 2, 0, EnumSymbol.NONE).addContainers(0xB46B52, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.MEDIUM, 500_000), LIQUID); - KEROSENE = new FluidType("KEROSENE", 0xffa5d2, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF377D, ExtContainer.CANISTER).addTraits(new FT_Flammable(300_000), new FT_Combustible(FuelGrade.AERO, 1_250_000)); + KEROSENE = new FluidType("KEROSENE", 0xffa5d2, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF377D, ExtContainer.CANISTER).addTraits(new FT_Flammable(300_000), new FT_Combustible(FuelGrade.AERO, 1_250_000), LIQUID); GAS = new FluidType("GAS", 0xfffeed, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(10_000), GASEOUS); PETROLEUM = new FluidType("PETROLEUM", 0x7cb7c9, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(25_000), GASEOUS); LPG = new FluidType("LPG", 0x4747EA, 1, 3, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.HIGH, 400_000), LIQUID); @@ -153,24 +153,24 @@ public class Fluids { UF6 = new FluidType("UF6", 0xD1CEBE, 4, 0, 2, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.2F), new FT_Corrosive(15), GASEOUS); PUF6 = new FluidType("PUF6", 0x4C4C4C, 4, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.1F), new FT_Corrosive(15), GASEOUS); SAS3 = new FluidType("SAS3", 0x4ffffc, 5, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(1F), new FT_Corrosive(30), LIQUID); - SCHRABIDIC = new FluidType("SCHRABIDIC", 0x006B6B, 5, 0, 5, EnumSymbol.ACID).addTraits(new FT_VentRadiation(1F), new FT_Corrosive(75), LIQUID); + SCHRABIDIC = new FluidType("SCHRABIDIC", 0x006B6B, 5, 0, 5, EnumSymbol.ACID).addTraits(new FT_VentRadiation(1F), new FT_Corrosive(75), new FT_Poison(true, 2), LIQUID); AMAT = new FluidType("AMAT", 0x010101, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); ASCHRAB = new FluidType("ASCHRAB", 0xb50000, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); ACID = new FluidType("ACID", 0xfff7aa, 3, 0, 3, EnumSymbol.OXIDIZER).addTraits(new FT_Corrosive(40), LIQUID); - WATZ = new FluidType("WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(60), LIQUID); + WATZ = new FluidType("WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(60), new FT_VentRadiation(0.1F), LIQUID); CRYOGEL = new FluidType("CRYOGEL", 0x32ffff, 2, 0, 0, EnumSymbol.CROYGENIC).setTemp(-170).addTraits(LIQUID); HYDROGEN = new FluidType("HYDROGEN", 0x4286f4, 3, 4, 0, EnumSymbol.CROYGENIC).setTemp(-260).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), LIQUID, EVAP); OXYGEN = new FluidType("OXYGEN", 0x98bdf9, 3, 0, 0, EnumSymbol.CROYGENIC).setTemp(-100).addTraits(LIQUID, EVAP); XENON = new FluidType("XENON", 0xba45e8, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); BALEFIRE = new FluidType("BALEFIRE", 0x28e02e, 4, 4, 3, EnumSymbol.RADIATION).setTemp(1500).addTraits(new FT_Corrosive(50), new FT_Flammable(1_000_000), new FT_Combustible(FuelGrade.HIGH, 2_500_000), LIQUID); - MERCURY = new FluidType("MERCURY", 0x808080, 2, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); - PAIN = new FluidType("PAIN", 0x938541, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(30)); + MERCURY = new FluidType("MERCURY", 0x808080, 2, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, new FT_Poison(false, 2)); + PAIN = new FluidType("PAIN", 0x938541, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(30), new FT_Poison(true, 2), LIQUID); WASTEFLUID = new FluidType("WASTEFLUID", 0x544400, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON, LIQUID); WASTEGAS = new FluidType("WASTEGAS", 0xB8B8B8, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON, GASEOUS); GASOLINE = new FluidType("GASOLINE", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2F7747, ExtContainer.CANISTER).addTraits(new FT_Flammable(400_000), new FT_Combustible(FuelGrade.HIGH, 1_000_000), LIQUID); COALGAS = new FluidType("COALGAS", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2E155F, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.MEDIUM, 150_000), LIQUID); SPENTSTEAM = new FluidType("SPENTSTEAM", 0x445772, 2, 0, 0, EnumSymbol.NONE).setCompression(1D).addTraits(NOCON, GASEOUS); - FRACKSOL = new FluidType("FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addContainers(0x4F887F, ExtContainer.CANISTER).addTraits(new FT_Corrosive(15), LIQUID); + FRACKSOL = new FluidType("FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addContainers(0x4F887F, ExtContainer.CANISTER).addTraits(new FT_Corrosive(15), new FT_Poison(false, 0), LIQUID); PLASMA_DT = new FluidType("PLASMA_DT", 0xF7AFDE, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3250).addTraits(NOCON, NOID, PLASMA); PLASMA_HD = new FluidType("PLASMA_HD", 0xF0ADF4, 0, 4, 0, EnumSymbol.RADIATION).setTemp(2500).addTraits(NOCON, NOID, PLASMA); PLASMA_HT = new FluidType("PLASMA_HT", 0xD1ABF2, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3000).addTraits(NOCON, NOID, PLASMA); @@ -179,7 +179,7 @@ public class Fluids { CARBONDIOXIDE = new FluidType("CARBONDIOXIDE", 0x404040, 3, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); PLASMA_DH3 = new FluidType("PLASMA_DH3", 0xFF83AA, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3480).addTraits(NOCON, NOID, PLASMA); HELIUM3 = new FluidType("HELIUM3", 0xFCF0C4, 3, 4, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); - DEATH = new FluidType("DEATH", 0x717A88, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(80), LEADCON, LIQUID); + DEATH = new FluidType("DEATH", 0x717A88, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(80), new FT_Poison(true, 4), LEADCON, LIQUID); ETHANOL = new FluidType("ETHANOL", 0xe0ffff, 2, 3, 0, EnumSymbol.NONE).addContainers(0xEAFFF3, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.HIGH, 200_000), LIQUID); HEAVYWATER = new FluidType("HEAVYWATER", 0x00a0b0, 1, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); CRACKOIL = new FluidType("CRACKOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java index 9899fccf7..c2b582ae5 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java @@ -1,5 +1,11 @@ package com.hbm.inventory.fluid.trait; +import java.util.List; + +import com.hbm.util.BobMathUtil; + +import net.minecraft.util.EnumChatFormatting; + public class FT_Flammable extends FluidTrait { /** How much heat energy (usually translates into HE 1:1) 1000mB hold */ @@ -12,4 +18,14 @@ public class FT_Flammable extends FluidTrait { public long getHeatEnergy() { return this.energy; } + + @Override + public void addInfo(List info) { + super.addInfo(info); + + info.add(EnumChatFormatting.YELLOW + "[Flammable]"); + + if(energy > 0) + info.add(EnumChatFormatting.YELLOW + "Provides " + EnumChatFormatting.RED + "" + BobMathUtil.getShortNumber(energy) + "TU " + EnumChatFormatting.YELLOW + "per bucket"); + } } diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Poison.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Poison.java new file mode 100644 index 000000000..a8154c1f5 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Poison.java @@ -0,0 +1,29 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.List; + +import net.minecraft.util.EnumChatFormatting; + +public class FT_Poison extends FluidTrait { + + protected boolean withering = false; + protected int level = 0; + + public FT_Poison(boolean withering, int level) { + this.withering = withering; + this.level = level; + } + + public boolean isWithering() { + return this.withering; + } + + public int getLevel() { + return this.level; + } + + @Override + public void addInfoHidden(List info) { + info.add(EnumChatFormatting.GREEN + "[Toxic Fumes]"); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java index 8ea6d2891..5b2e00658 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java @@ -39,11 +39,10 @@ public class GUIMachineBattery extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 62, guiTop + 69 - 52, 52, 52, battery.power, battery.getMaxPower()); - long delta = battery.log[19] - battery.log[0]; - String deltaText = BobMathUtil.getShortNumber(Math.abs(delta)) + "HE/s"; + String deltaText = BobMathUtil.getShortNumber(Math.abs(battery.delta)) + "HE/s"; - if(delta > 0) deltaText = EnumChatFormatting.GREEN + "+" + deltaText; - else if(delta < 0) deltaText = EnumChatFormatting.RED + "-" + deltaText; + if(battery.delta > 0) deltaText = EnumChatFormatting.GREEN + "+" + deltaText; + else if(battery.delta < 0) deltaText = EnumChatFormatting.RED + "-" + deltaText; else deltaText = EnumChatFormatting.YELLOW + "+" + deltaText; String[] info = { BobMathUtil.getShortNumber(battery.power) + "/" + BobMathUtil.getShortNumber(battery.getMaxPower()) + "HE", deltaText }; diff --git a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java index 538047e74..61afb281d 100644 --- a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java @@ -16,7 +16,6 @@ import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; -import com.hbm.util.ItemStackUtil; import com.hbm.util.Tuple.Pair; import net.minecraft.item.ItemStack; @@ -116,7 +115,17 @@ public class CyclotronRecipes extends SerializableRecipe { ComparableStack boxStack = new ComparableStack(box).makeSingular(); ComparableStack comp = new ComparableStack(stack).makeSingular(); - Pair output = recipes.get(new Pair(boxStack, comp)); + //boo hoo we iterate over a hash map, cry me a river + for(Entry, Pair> entry : recipes.entrySet()) { + + if(entry.getKey().getKey().isApplicable(boxStack) && entry.getKey().getValue().isApplicable(comp)) { + return new Object[] { entry.getValue().getKey(), entry.getValue().getValue() }; + } + } + + //there's literally 0 reason why this doesn't work yet it refuses, fuck this + + /*Pair output = recipes.get(new Pair(boxStack, comp)); if(output != null) { return new Object[] { output.getKey().copy(), output.getValue() }; @@ -124,12 +133,12 @@ public class CyclotronRecipes extends SerializableRecipe { for(String name : ItemStackUtil.getOreDictNames(stack)) { OreDictStack ods = new OreDictStack(name); - output = recipes.get(new Pair(boxStack, comp)); + output = recipes.get(new Pair(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustCobalt"))); if(output != null) { return new Object[] { output.getKey().copy(), output.getValue() }; } - } + }*/ return null; } diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 867d48a7e..834f7e2f4 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4333)"; + public static final String VERSION = "1.0.27 BETA (4334)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index 88864eb4e..3266b3397 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -25,6 +25,7 @@ import li.cil.oc.api.network.SimpleComponent; public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyUser, IPersistentNBT, SimpleComponent { public long[] log = new long[20]; + public long delta = 0; public long power = 0; //0: input only @@ -161,22 +162,22 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I power = Library.chargeTEFromItems(slots, 0, power, getMaxPower()); power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); - - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setLong("power", (power + prevPower) / 2); - nbt.setShort("redLow", redLow); - nbt.setShort("redHigh", redHigh); - nbt.setByte("priority", (byte) this.priority.ordinal()); - this.networkPack(nbt, 20); - } - - if(worldObj.isRemote) { + + this.delta = this.power - this.log[0]; for(int i = 1; i < this.log.length; i++) { this.log[i - 1] = this.log[i]; } this.log[19] = this.power; + + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setLong("power", (power + prevPower) / 2); + nbt.setLong("delta", delta); + nbt.setShort("redLow", redLow); + nbt.setShort("redHigh", redHigh); + nbt.setByte("priority", (byte) this.priority.ordinal()); + this.networkPack(nbt, 20); } } @@ -227,6 +228,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public void networkUnpack(NBTTagCompound nbt) { this.power = nbt.getLong("power"); + this.delta = nbt.getLong("delta"); this.redLow = nbt.getShort("redLow"); this.redHigh = nbt.getShort("redHigh"); this.priority = ConnectionPriority.values()[nbt.getByte("priority")]; diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index b80e198dd..12e1e91a4 100755 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "hbm", "name": "Hbm's Nuclear Tech", "description": "A mod that adds weapons, nuclear themed stuff and machines", - "version":"1.0.27_X4333", + "version":"1.0.27_X4334", "mcversion": "1.7.10", "url": "", "updateUrl": "", From 9c57c73d11ab5db9b038b7dd1bdb462b52b1ca33 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 22 Aug 2022 16:09:48 +0200 Subject: [PATCH 022/111] small test involving jars --- src/main/java/com/hbm/wiaj/FauxWorld.java | 34 ++++++ .../java/com/hbm/wiaj/GuiWorldInAJar.java | 8 ++ .../java/com/hbm/wiaj/ITileActorRenderer.java | 6 + src/main/java/com/hbm/wiaj/WorldInAJar.java | 109 ++++++++++++++++++ .../com/hbm/wiaj/actions/ActionSetBlock.java | 31 +++++ .../com/hbm/wiaj/actions/IWorldAction.java | 8 ++ 6 files changed, 196 insertions(+) create mode 100644 src/main/java/com/hbm/wiaj/FauxWorld.java create mode 100644 src/main/java/com/hbm/wiaj/GuiWorldInAJar.java create mode 100644 src/main/java/com/hbm/wiaj/ITileActorRenderer.java create mode 100644 src/main/java/com/hbm/wiaj/WorldInAJar.java create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java create mode 100644 src/main/java/com/hbm/wiaj/actions/IWorldAction.java diff --git a/src/main/java/com/hbm/wiaj/FauxWorld.java b/src/main/java/com/hbm/wiaj/FauxWorld.java new file mode 100644 index 000000000..583770d8d --- /dev/null +++ b/src/main/java/com/hbm/wiaj/FauxWorld.java @@ -0,0 +1,34 @@ +package com.hbm.wiaj; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.WorldProvider; +import net.minecraft.world.WorldSettings; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.storage.SaveHandlerMP; + +@SideOnly(Side.CLIENT) +public class FauxWorld extends World { + + public FauxWorld(String p_i45368_2_, WorldProvider p_i45368_3_, WorldSettings p_i45368_4_, Profiler p_i45368_5_) { + super(new SaveHandlerMP(), "FauxWorld", p_i45368_3_, p_i45368_4_, p_i45368_5_); + } + + @Override + protected IChunkProvider createChunkProvider() { + return null; + } + + @Override + protected int func_152379_p() { + return 0; + } + + @Override + public Entity getEntityByID(int id) { + return null; + } +} diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java new file mode 100644 index 000000000..75f4b5551 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -0,0 +1,8 @@ +package com.hbm.wiaj; + +import net.minecraft.client.gui.GuiScreen; + +//krass +public class GuiWorldInAJar extends GuiScreen { + +} diff --git a/src/main/java/com/hbm/wiaj/ITileActorRenderer.java b/src/main/java/com/hbm/wiaj/ITileActorRenderer.java new file mode 100644 index 000000000..0d3edbb35 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/ITileActorRenderer.java @@ -0,0 +1,6 @@ +package com.hbm.wiaj; + +public interface ITileActorRenderer { + + public void renderActor(Object... data); +} diff --git a/src/main/java/com/hbm/wiaj/WorldInAJar.java b/src/main/java/com/hbm/wiaj/WorldInAJar.java new file mode 100644 index 000000000..9c968d7e8 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/WorldInAJar.java @@ -0,0 +1,109 @@ +package com.hbm.wiaj; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * A hastily put together implementation of IBlockAccess in order to render things using ISBRH... + * It can handle blocks, and not a whole lot else. + * @author hbm + */ +public class WorldInAJar implements IBlockAccess { + + private int sizeX; + private int sizeY; + private int sizeZ; + + private Block[][][] blocks; + private short[][][] meta; + private TileEntity[][][] tiles; + + public WorldInAJar(int x, int y, int z) { + this.sizeX = x; + this.sizeY = y; + this.sizeZ = z; + + this.blocks = new Block[x][y][z]; + this.meta = new short[x][y][z]; + this.tiles = new TileEntity[x][y][z]; + } + + @Override + public Block getBlock(int x, int y, int z) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return Blocks.air; + + return this.blocks[x][y][z] != null ? this.blocks[x][y][z] : Blocks.air; + } + + public void setBlock(int x, int y, int z, Block b, int meta) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return; + + this.blocks[x][y][z] = b; + this.meta[x][y][z] = (short) Math.abs(meta % 16); + } + + @Override + public int getBlockMetadata(int x, int y, int z) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return 0; + + return this.meta[x][y][z]; + } + + //shaky, we may kick tile entities entirely and rely on outside-the-world tile actors for rendering + //might still come in handy for manipulating things using dummy tiles, like cable connections + @Override + public TileEntity getTileEntity(int x, int y, int z) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return null; + + TileEntity tile = this.tiles[x][y][z]; + + return null; + } + + //always render fullbright, if the situation requires it we could add a very rudimentary system that + //darkens blocks id there is a solid one above + @Override + public int getLightBrightnessForSkyBlocks(int x, int y, int z, int blockBrightness) { + return 15; //always be on fullbright + } + + //redstone could theoretically be implemented, but we will wait for now + @Override + public int isBlockProvidingPowerTo(int x, int y, int z, int dir) { + return 0; + } + + @Override + public boolean isAirBlock(int x, int y, int z) { + return this.getBlock(x, y, z).isAir(this, x, y, z); + } + + //biomes don't matter to us, if the situation requires it we could implement a primitive biome mask + @Override + public BiomeGenBase getBiomeGenForCoords(int x, int z) { + return BiomeGenBase.plains; + } + + @Override + public int getHeight() { + return this.sizeY; + } + + @Override + public boolean extendedLevelsInChunkCache() { + return false; + } + + @Override + public boolean isSideSolid(int x, int y, int z, ForgeDirection side, boolean _default) { + return getBlock(x, y, z).isSideSolid(this, x, y, z, side); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java b/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java new file mode 100644 index 000000000..7eb23d3ff --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java @@ -0,0 +1,31 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.WorldInAJar; + +import net.minecraft.block.Block; + +public class ActionSetBlock implements IWorldAction { + + int x; + int y; + int z; + Block b; + int meta; + + public ActionSetBlock(int x, int y, int z, Block b) { + this(x, y, z, b, 0); + } + + public ActionSetBlock(int x, int y, int z, Block b, int meta) { + this.x = x; + this.y = y; + this.z = z; + this.b = b; + this.meta = meta; + } + + @Override + public void act(WorldInAJar world) { + world.setBlock(x, y, z, b, meta); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/IWorldAction.java b/src/main/java/com/hbm/wiaj/actions/IWorldAction.java new file mode 100644 index 000000000..bf5c22b53 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/IWorldAction.java @@ -0,0 +1,8 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.WorldInAJar; + +public interface IWorldAction { + + public void act(WorldInAJar world); +} From 1a1be50d3dfa0436ae75a7c042f986dd0e8389a9 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 22 Aug 2022 22:02:18 +0200 Subject: [PATCH 023/111] cram it in a jar --- .../com/hbm/blocks/test/TestEventTester.java | 9 +- src/main/java/com/hbm/handler/GUIHandler.java | 3 + .../java/com/hbm/wiaj/GuiWorldInAJar.java | 109 ++++++++++++++++++ src/main/java/com/hbm/wiaj/WorldInAJar.java | 10 +- 4 files changed, 124 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/blocks/test/TestEventTester.java b/src/main/java/com/hbm/blocks/test/TestEventTester.java index 83bbe5a63..04e66efa2 100644 --- a/src/main/java/com/hbm/blocks/test/TestEventTester.java +++ b/src/main/java/com/hbm/blocks/test/TestEventTester.java @@ -8,6 +8,9 @@ import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; import com.hbm.entity.effect.EntityNukeCloudSmall; +import com.hbm.main.MainRegistry; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.enchantment.EnchantmentProtection; @@ -395,10 +398,8 @@ public class TestEventTester extends Block { ex.doExplosionB(false); }*/ - if(!worldObj.isRemote) { - - worldObj.spawnEntityInWorld(EntityNukeCloudSmall.statFacBale(worldObj, par2, par3 + 5, par4, 100, 0)); - } + + FMLNetworkHandler.openGui(par5EntityPlayer, MainRegistry.instance, -1, par1World, par2, par3, par4); return true; } diff --git a/src/main/java/com/hbm/handler/GUIHandler.java b/src/main/java/com/hbm/handler/GUIHandler.java index 3c52cf260..3389333ca 100644 --- a/src/main/java/com/hbm/handler/GUIHandler.java +++ b/src/main/java/com/hbm/handler/GUIHandler.java @@ -17,6 +17,7 @@ import com.hbm.tileentity.machine.oil.*; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.turret.*; +import com.hbm.wiaj.GuiWorldInAJar; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; @@ -843,6 +844,8 @@ public class GUIHandler implements IGuiHandler { public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity entity = world.getTileEntity(x, y, z); + if(ID == -1) return new GuiWorldInAJar(); + if(entity instanceof IGUIProvider) { return ((IGUIProvider) entity).provideGUI(ID, player, world, x, y, z); } diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 75f4b5551..50bb5d038 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -1,8 +1,117 @@ package com.hbm.wiaj; +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; + +import net.minecraft.client.Minecraft; 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.init.Blocks; //krass public class GuiWorldInAJar extends GuiScreen { + + WorldInAJar world; + RenderBlocks renderer; + public GuiWorldInAJar() { + super(); + world = new WorldInAJar(15, 15, 15); + renderer = new RenderBlocks(world); + renderer.enableAO = true; + + for(int x = 0; x < 15; x++) { + for(int y = 0; y < 15; y++) { + for(int z = 0; z < 15; z++) { + + if(y == 14) { + world.setBlock(x, y, z, ModBlocks.glass_boron, 0); + continue; + } + + if(y > 0) { + if(x == 0 || x == 14 || z == 0 || z == 14) { + world.setBlock(x, y, z, ModBlocks.glass_boron, 0); + continue; + } + } + + if(y == 0) { + if(x == 0 || x == 14 || z == 0 || z == 14) { + world.setBlock(x, y, z, ModBlocks.concrete_colored, 6); + } else { + world.setBlock(x, y, z, ModBlocks.concrete_smooth, 0); + } + } + } + } + } + + world.setBlock(2, 1, 2, ModBlocks.fallout, 0); + world.setBlock(4, 1, 4, ModBlocks.conveyor, 2); + world.setBlock(4, 1, 5, ModBlocks.conveyor, 2); + world.setBlock(4, 1, 6, ModBlocks.conveyor, 2); + world.setBlock(4, 1, 7, ModBlocks.conveyor, 2); + world.setBlock(4, 1, 8, ModBlocks.conveyor, 2); + world.setBlock(4, 1, 9, ModBlocks.conveyor, 2); + world.setBlock(4, 1, 10, ModBlocks.conveyor, 6); + world.setBlock(5, 1, 10, ModBlocks.conveyor, 4); + + for(int x = 9; x < 12; x++) { + for(int y = 1; y < 5; y++) { + for(int z = 6; z < 9; z++) { + world.setBlock(x, y, z, Blocks.brick_block, 0); + } + } + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + this.drawDefaultBackground(); + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glDisable(GL11.GL_LIGHTING); + //this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + } + + private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { + + GL11.glPushMatrix(); + double scale = -10; + GL11.glTranslated(width / 2, height / 2 + 70, 100); + GL11.glScaled(scale, scale, scale); + GL11.glScaled(1, 1, 0.01); // increadible flattening power + GL11.glRotated(30, -1, 0, 0); + GL11.glRotated(45, 0, -1, 0); + GL11.glTranslated(-7, 0 , -7); + + GL11.glTranslated(world.sizeX / 2D, 0 , world.sizeZ / 2D); + GL11.glRotated(System.currentTimeMillis() % (360 * 20) / 20D, 0, -1, 0); + GL11.glTranslated(world.sizeX / -2D, 0 , world.sizeZ / -2D); + + Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator.instance.startDrawingQuads(); + + for(int x = 0; x < world.sizeX; x++) { + for(int y = 0; y < world.sizeY; y++) { + for(int z = 0; z < world.sizeZ; z++) { + renderer.renderBlockByRenderType(world.getBlock(x, y, z), x, y, z); + } + } + } + + Tessellator.instance.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } } diff --git a/src/main/java/com/hbm/wiaj/WorldInAJar.java b/src/main/java/com/hbm/wiaj/WorldInAJar.java index 9c968d7e8..4b920be92 100644 --- a/src/main/java/com/hbm/wiaj/WorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/WorldInAJar.java @@ -1,5 +1,7 @@ package com.hbm.wiaj; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; @@ -14,9 +16,9 @@ import net.minecraftforge.common.util.ForgeDirection; */ public class WorldInAJar implements IBlockAccess { - private int sizeX; - private int sizeY; - private int sizeZ; + public int sizeX; + public int sizeY; + public int sizeZ; private Block[][][] blocks; private short[][][] meta; @@ -88,11 +90,13 @@ public class WorldInAJar implements IBlockAccess { //biomes don't matter to us, if the situation requires it we could implement a primitive biome mask @Override + @SideOnly(Side.CLIENT) public BiomeGenBase getBiomeGenForCoords(int x, int z) { return BiomeGenBase.plains; } @Override + @SideOnly(Side.CLIENT) public int getHeight() { return this.sizeY; } From 53bcebfe9770f07bb10fad77e9c41578a36b2fb3 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 23 Aug 2022 16:08:31 +0200 Subject: [PATCH 024/111] jar test sequence, more animation types --- .../inventory/recipes/CentrifugeRecipes.java | 9 +- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 70 ++++++++---- src/main/java/com/hbm/wiaj/JarScene.java | 67 ++++++++++++ src/main/java/com/hbm/wiaj/JarScript.java | 100 ++++++++++++++++++ .../com/hbm/wiaj/actions/ActionRotate.java | 28 +++++ .../com/hbm/wiaj/actions/ActionSetBlock.java | 14 ++- .../java/com/hbm/wiaj/actions/ActionWait.java | 21 ++++ .../java/com/hbm/wiaj/actions/IJarAction.java | 12 +++ .../com/hbm/wiaj/actions/IWorldAction.java | 8 -- 9 files changed, 294 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/hbm/wiaj/JarScene.java create mode 100644 src/main/java/com/hbm/wiaj/JarScript.java create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionRotate.java create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionWait.java create mode 100644 src/main/java/com/hbm/wiaj/actions/IJarAction.java delete mode 100644 src/main/java/com/hbm/wiaj/actions/IWorldAction.java diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 136663cc5..8d34db3dc 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -358,11 +358,10 @@ public class CentrifugeRecipes extends SerializableRecipe { if(recipes.containsKey(comp)) return RecipesCommon.copyStackArray(recipes.get(comp)); - String[] dictKeys = comp.getDictKeys(); - - for(String key : dictKeys) { - if(recipes.containsKey(new OreDictStack(key))) - return RecipesCommon.copyStackArray(recipes.get(key)); + for(Entry entry : recipes.entrySet()) { + if(entry.getKey().isApplicable(stack)) { + return RecipesCommon.copyStackArray(entry.getValue()); + } } return null; diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 50bb5d038..469befbc7 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -3,6 +3,9 @@ package com.hbm.wiaj; import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; +import com.hbm.wiaj.actions.ActionRotate; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionWait; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -16,6 +19,8 @@ public class GuiWorldInAJar extends GuiScreen { WorldInAJar world; RenderBlocks renderer; + + JarScript testScript; public GuiWorldInAJar() { super(); @@ -23,55 +28,76 @@ public class GuiWorldInAJar extends GuiScreen { renderer = new RenderBlocks(world); renderer.enableAO = true; + testScript = new JarScript(world); + JarScene startingScene = new JarScene(testScript); + for(int x = 0; x < 15; x++) { for(int y = 0; y < 15; y++) { for(int z = 0; z < 15; z++) { if(y == 14) { - world.setBlock(x, y, z, ModBlocks.glass_boron, 0); + startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.glass_boron)); + startingScene.add(new ActionWait(1)); continue; } if(y > 0) { if(x == 0 || x == 14 || z == 0 || z == 14) { - world.setBlock(x, y, z, ModBlocks.glass_boron, 0); + startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.glass_boron)); + startingScene.add(new ActionWait(1)); continue; } } if(y == 0) { if(x == 0 || x == 14 || z == 0 || z == 14) { - world.setBlock(x, y, z, ModBlocks.concrete_colored, 6); + startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.concrete_colored, 6)); } else { - world.setBlock(x, y, z, ModBlocks.concrete_smooth, 0); + startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.concrete_colored, 0)); } } } } } - - world.setBlock(2, 1, 2, ModBlocks.fallout, 0); - world.setBlock(4, 1, 4, ModBlocks.conveyor, 2); - world.setBlock(4, 1, 5, ModBlocks.conveyor, 2); - world.setBlock(4, 1, 6, ModBlocks.conveyor, 2); - world.setBlock(4, 1, 7, ModBlocks.conveyor, 2); - world.setBlock(4, 1, 8, ModBlocks.conveyor, 2); - world.setBlock(4, 1, 9, ModBlocks.conveyor, 2); - world.setBlock(4, 1, 10, ModBlocks.conveyor, 6); - world.setBlock(5, 1, 10, ModBlocks.conveyor, 4); - for(int x = 9; x < 12; x++) { - for(int y = 1; y < 5; y++) { + startingScene.add(new ActionWait(20)); + + startingScene.add(new ActionSetBlock(2, 1, 2, ModBlocks.fallout, 0)); + startingScene.add(new ActionSetBlock(4, 1, 4, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 5, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 6, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 7, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 8, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 9, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 10, ModBlocks.conveyor, 6)); + startingScene.add(new ActionSetBlock(5, 1, 10, ModBlocks.conveyor, 4)); + + startingScene.add(new ActionRotate(90, 0, 50)); + + JarScene brickScene = new JarScene(testScript); + + for(int y = 1; y < 7; y++) { + for(int x = 9; x < 12; x++) { for(int z = 6; z < 9; z++) { - world.setBlock(x, y, z, Blocks.brick_block, 0); + brickScene.add(new ActionSetBlock(x, y, z, Blocks.brick_block)); } } + brickScene.add(new ActionWait(10)); } + + brickScene.add(new ActionRotate(-90, 0, 20)); + + this.testScript.addScene(startingScene).addScene(brickScene); } @Override public void drawScreen(int mouseX, int mouseY, float f) { this.drawDefaultBackground(); + + if(testScript != null) { + testScript.run(); + } + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); GL11.glDisable(GL11.GL_LIGHTING); //this.drawGuiContainerForegroundLayer(mouseX, mouseY); @@ -85,12 +111,16 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glTranslated(width / 2, height / 2 + 70, 100); GL11.glScaled(scale, scale, scale); GL11.glScaled(1, 1, 0.01); // increadible flattening power - GL11.glRotated(30, -1, 0, 0); - GL11.glRotated(45, 0, -1, 0); + + double pitch = testScript.lastRotationPitch + (testScript.rotationPitch - testScript.lastRotationPitch) * testScript.interp; + double yaw = testScript.lastRotationYaw + (testScript.rotationYaw - testScript.lastRotationYaw) * testScript.interp; + GL11.glRotated(pitch, 1, 0, 0); + GL11.glRotated(yaw, 0, 1, 0); + GL11.glTranslated(-7, 0 , -7); GL11.glTranslated(world.sizeX / 2D, 0 , world.sizeZ / 2D); - GL11.glRotated(System.currentTimeMillis() % (360 * 20) / 20D, 0, -1, 0); + //GL11.glRotated(System.currentTimeMillis() % (360 * 20) / 20D, 0, -1, 0); GL11.glTranslated(world.sizeX / -2D, 0 , world.sizeZ / -2D); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); diff --git a/src/main/java/com/hbm/wiaj/JarScene.java b/src/main/java/com/hbm/wiaj/JarScene.java new file mode 100644 index 000000000..95d8e6f91 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/JarScene.java @@ -0,0 +1,67 @@ +package com.hbm.wiaj; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.wiaj.actions.IJarAction; + +import net.minecraft.util.MathHelper; + +/** + * A scene is a simple sequence of tasks, every script can have multiple scenes + * Scenes depend on each other, in order to rewind we'll have to re-init the playing field and FFW through all previous scenes + * @author hbm + * + */ +public class JarScene { + + public List actions = new ArrayList(); + public JarScript script; + + private int actionNumber = 0; + public IJarAction currentAction; //the action that is currently happening + public int currentActionStart = 0; //time in ticks since init + + public JarScene (JarScript script) { + this.script = script; + } + + public JarScene add(IJarAction action) { + + if(this.currentAction == null) + this.currentAction = action; //set first action + + this.actions.add(action); + return this; + } + + /** does the once per 50ms tick routine */ + public void tick() { + + if(this.currentAction == null) return; + + this.currentAction.act(script.world, this); + + int duration = this.currentAction.getDuration(); + + if(this.currentActionStart + duration <= script.ticksElapsed) { //choose next action + + this.actionNumber++; + this.currentActionStart = script.ticksElapsed; + + if(actionNumber < this.actions.size()) { + this.currentAction = this.actions.get(actionNumber); + tick(); + + } else { + this.currentAction = null; + } + } + } + + public void reset() { + this.currentAction = this.actions.get(0); + this.actionNumber = 0; + this.currentActionStart = script.ticksElapsed; + } +} diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java new file mode 100644 index 000000000..de8e991bb --- /dev/null +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -0,0 +1,100 @@ +package com.hbm.wiaj; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.util.MathHelper; + +public class JarScript { + + public WorldInAJar world; + private List scenes = new ArrayList(); + private JarScene currentScene; + private int sceneNumber = 0; + + public double lastRotationYaw = -45D; + public double lastRotationPitch = -30D; + public double rotationYaw = -45D; + public double rotationPitch = -30D; + + public float interp = 0F; + + public long lastTick = 0; + public int ticksElapsed = 0; + + private boolean isPaused = false; + + public JarScript(WorldInAJar world) { + this.world = world; + } + + public JarScript addScene(JarScene scene) { + + if(this.currentScene == null) + this.currentScene = scene; + + this.scenes.add(scene); + return this; + } + + /**supposed to be called every frame, it calculates tick times and interp values */ + public void run() { + long now = System.currentTimeMillis(); + + boolean nextTick = false; + + if(this.lastTick == 0) { // do the first tick right away + this.lastTick = now; + nextTick = true; + } + + if(this.lastTick + 50 < now) { + this.lastTick = now; + this.ticksElapsed++; + nextTick = true; + } + + this.interp = MathHelper.clamp_float((float) (now - this.lastTick) / 50F, 0F, 1F); + + if(nextTick) { + this.lastRotationPitch = this.rotationPitch; + this.lastRotationYaw = this.rotationYaw; + + if(this.currentScene != null) { + tickScene(); + } + } + } + + public void tickScene() { + this.currentScene.tick(); + + if(this.currentScene.currentAction == null) { //means this scene is done + + this.sceneNumber++; + + if(this.sceneNumber < this.scenes.size()) { + this.currentScene = this.scenes.get(sceneNumber); + this.currentScene.currentActionStart = this.ticksElapsed; + } else { + this.currentScene = null; + } + } + } + + private long pauseDelta; + + public void pause() { + this.isPaused = true; + this.pauseDelta = System.currentTimeMillis() - this.lastTick; //saves the difference between last tick and now + } + + public void unpause() { + this.isPaused = false; + this.lastTick = System.currentTimeMillis() - this.pauseDelta; //recreates an equivalent last tick from the new current time + } + + public boolean isPaused() { + return this.isPaused; + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionRotate.java b/src/main/java/com/hbm/wiaj/actions/ActionRotate.java new file mode 100644 index 000000000..efa02312f --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionRotate.java @@ -0,0 +1,28 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionRotate implements IJarAction { + + int time; + double velYaw; + double velPitch; + + public ActionRotate(double yaw, double pitch, int time) { + this.velYaw = yaw / time; + this.velPitch = pitch / time; + this.time = time; + } + + @Override + public int getDuration() { + return this.time; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.rotationPitch += this.velPitch; + scene.script.rotationYaw += this.velYaw; + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java b/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java index 7eb23d3ff..8291c3c88 100644 --- a/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java @@ -1,10 +1,15 @@ package com.hbm.wiaj.actions; +import com.hbm.wiaj.JarScene; import com.hbm.wiaj.WorldInAJar; import net.minecraft.block.Block; -public class ActionSetBlock implements IWorldAction { +/** + * Simple action that places one block instantly with no delay + * @author hmb + */ +public class ActionSetBlock implements IJarAction { int x; int y; @@ -25,7 +30,12 @@ public class ActionSetBlock implements IWorldAction { } @Override - public void act(WorldInAJar world) { + public void act(WorldInAJar world, JarScene scene) { world.setBlock(x, y, z, b, meta); } + + @Override + public int getDuration() { + return 0; + } } diff --git a/src/main/java/com/hbm/wiaj/actions/ActionWait.java b/src/main/java/com/hbm/wiaj/actions/ActionWait.java new file mode 100644 index 000000000..4ed64fec0 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionWait.java @@ -0,0 +1,21 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionWait implements IJarAction { + + private int ticks; + + public ActionWait(int ticks) { + this.ticks = ticks; + } + + @Override + public int getDuration() { + return this.ticks; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { } +} diff --git a/src/main/java/com/hbm/wiaj/actions/IJarAction.java b/src/main/java/com/hbm/wiaj/actions/IJarAction.java new file mode 100644 index 000000000..5250d248b --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/IJarAction.java @@ -0,0 +1,12 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public interface IJarAction { + + /** Time taken by this action in ticks */ + public int getDuration(); + /** Perform this action */ + public void act(WorldInAJar world, JarScene scene); +} diff --git a/src/main/java/com/hbm/wiaj/actions/IWorldAction.java b/src/main/java/com/hbm/wiaj/actions/IWorldAction.java deleted file mode 100644 index bf5c22b53..000000000 --- a/src/main/java/com/hbm/wiaj/actions/IWorldAction.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.hbm.wiaj.actions; - -import com.hbm.wiaj.WorldInAJar; - -public interface IWorldAction { - - public void act(WorldInAJar world); -} From a5f4726244cb6986f375d28b9f01ddc0f883e95f Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 23 Aug 2022 22:37:47 +0200 Subject: [PATCH 025/111] the magic of doing not a whole lot --- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 27 +++++++++++++------ src/main/java/com/hbm/wiaj/JarScript.java | 4 +++ .../com/hbm/wiaj/actions/ActionRotate.java | 4 +-- .../com/hbm/wiaj/actors/ISpecialActor.java | 10 +++++++ .../wiaj/{ => actors}/ITileActorRenderer.java | 2 +- 5 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/hbm/wiaj/actors/ISpecialActor.java rename src/main/java/com/hbm/wiaj/{ => actors}/ITileActorRenderer.java (74%) diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 469befbc7..3b26be2ba 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -30,21 +30,19 @@ public class GuiWorldInAJar extends GuiScreen { testScript = new JarScript(world); JarScene startingScene = new JarScene(testScript); - - for(int x = 0; x < 15; x++) { - for(int y = 0; y < 15; y++) { + + for(int y = 0; y < 15; y++) { + for(int x = 0; x < 15; x++) { for(int z = 0; z < 15; z++) { if(y == 14) { startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.glass_boron)); - startingScene.add(new ActionWait(1)); continue; } if(y > 0) { if(x == 0 || x == 14 || z == 0 || z == 14) { startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.glass_boron)); - startingScene.add(new ActionWait(1)); continue; } } @@ -58,11 +56,15 @@ public class GuiWorldInAJar extends GuiScreen { } } } + startingScene.add(new ActionWait(1)); } - startingScene.add(new ActionWait(20)); + startingScene.add(new ActionWait(10)); startingScene.add(new ActionSetBlock(2, 1, 2, ModBlocks.fallout, 0)); + + startingScene.add(new ActionWait(10)); + startingScene.add(new ActionSetBlock(4, 1, 4, ModBlocks.conveyor, 2)); startingScene.add(new ActionSetBlock(4, 1, 5, ModBlocks.conveyor, 2)); startingScene.add(new ActionSetBlock(4, 1, 6, ModBlocks.conveyor, 2)); @@ -72,6 +74,8 @@ public class GuiWorldInAJar extends GuiScreen { startingScene.add(new ActionSetBlock(4, 1, 10, ModBlocks.conveyor, 6)); startingScene.add(new ActionSetBlock(5, 1, 10, ModBlocks.conveyor, 4)); + startingScene.add(new ActionWait(10)); + startingScene.add(new ActionRotate(90, 0, 50)); JarScene brickScene = new JarScene(testScript); @@ -82,10 +86,17 @@ public class GuiWorldInAJar extends GuiScreen { brickScene.add(new ActionSetBlock(x, y, z, Blocks.brick_block)); } } - brickScene.add(new ActionWait(10)); + brickScene.add(new ActionWait(2)); } - brickScene.add(new ActionRotate(-90, 0, 20)); + brickScene.add(new ActionRotate(-90, 0, 10)); + + brickScene.add(new ActionWait(20)); + brickScene.add(new ActionRotate(45, 30, 10)); + brickScene.add(new ActionWait(40)); + brickScene.add(new ActionRotate(360, 0, 100)); + brickScene.add(new ActionWait(40)); + brickScene.add(new ActionRotate(-45, -30, 10)); this.testScript.addScene(startingScene).addScene(brickScene); } diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java index de8e991bb..0e4404dd6 100644 --- a/src/main/java/com/hbm/wiaj/JarScript.java +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -1,14 +1,18 @@ package com.hbm.wiaj; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import com.hbm.wiaj.actors.ISpecialActor; + import net.minecraft.util.MathHelper; public class JarScript { public WorldInAJar world; private List scenes = new ArrayList(); + private HashMap actors = new HashMap(); private JarScene currentScene; private int sceneNumber = 0; diff --git a/src/main/java/com/hbm/wiaj/actions/ActionRotate.java b/src/main/java/com/hbm/wiaj/actions/ActionRotate.java index efa02312f..f859e1164 100644 --- a/src/main/java/com/hbm/wiaj/actions/ActionRotate.java +++ b/src/main/java/com/hbm/wiaj/actions/ActionRotate.java @@ -10,8 +10,8 @@ public class ActionRotate implements IJarAction { double velPitch; public ActionRotate(double yaw, double pitch, int time) { - this.velYaw = yaw / time; - this.velPitch = pitch / time; + this.velYaw = yaw / (time + 1); + this.velPitch = pitch / (time + 1); this.time = time; } diff --git a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java new file mode 100644 index 000000000..0c4e12a6c --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java @@ -0,0 +1,10 @@ +package com.hbm.wiaj.actors; + +import com.hbm.wiaj.JarScene; + +public interface ISpecialActor { + + public void draw(); + public void updateActor(JarScene scene); + public void setActorData(Object... data); +} diff --git a/src/main/java/com/hbm/wiaj/ITileActorRenderer.java b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java similarity index 74% rename from src/main/java/com/hbm/wiaj/ITileActorRenderer.java rename to src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java index 0d3edbb35..26ba99f3e 100644 --- a/src/main/java/com/hbm/wiaj/ITileActorRenderer.java +++ b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java @@ -1,4 +1,4 @@ -package com.hbm.wiaj; +package com.hbm.wiaj.actors; public interface ITileActorRenderer { From f57a6f35a4ce34f1d10e125cdf3a08fccf2863d2 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 24 Aug 2022 10:41:42 +0200 Subject: [PATCH 026/111] cyclotron recipe fix, hashCode implementation for ODStacks --- .../java/com/hbm/inventory/RecipesCommon.java | 47 +++++++++++++++---- .../inventory/recipes/CyclotronRecipes.java | 2 +- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index fc219a3bf..740b909b8 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -202,21 +202,21 @@ public class RecipesCommon { @Override public boolean equals(Object obj) { - if (this == obj) + if(this == obj) return true; - if (obj == null) + if(obj == null) return false; - if (getClass() != obj.getClass()) + if(getClass() != obj.getClass()) return false; ComparableStack other = (ComparableStack) obj; - if (item == null) { - if (other.item != null) + if(item == null) { + if(other.item != null) return false; - } else if (!item.equals(other.item)) + } else if(!item.equals(other.item)) return false; - if (meta != OreDictionary.WILDCARD_VALUE && other.meta != OreDictionary.WILDCARD_VALUE && meta != other.meta) + if(meta != OreDictionary.WILDCARD_VALUE && other.meta != OreDictionary.WILDCARD_VALUE && meta != other.meta) return false; - if (stacksize != other.stacksize) + if(stacksize != other.stacksize) return false; return true; } @@ -330,7 +330,7 @@ public class RecipesCommon { } public static class OreDictStack extends AStack { - + public String name; public OreDictStack(String name) { @@ -410,6 +410,35 @@ public class RecipesCommon { return ores; } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + this.stacksize; + return result; + } + + @Override + public boolean equals(Object obj) { + if(this == obj) + return true; + if(obj == null) + return false; + if(getClass() != obj.getClass()) + return false; + OreDictStack other = (OreDictStack) obj; + if(name == null) { + if(other.name != null) + return false; + } else if(!name.equals(other.name)) { + return false; + } + if(this.stacksize != other.stacksize) + return false; + return true; + } } public static class MetaBlock { diff --git a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java index 61afb281d..d552e73d6 100644 --- a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java @@ -119,7 +119,7 @@ public class CyclotronRecipes extends SerializableRecipe { for(Entry, Pair> entry : recipes.entrySet()) { if(entry.getKey().getKey().isApplicable(boxStack) && entry.getKey().getValue().isApplicable(comp)) { - return new Object[] { entry.getValue().getKey(), entry.getValue().getValue() }; + return new Object[] { entry.getValue().getKey().copy(), entry.getValue().getValue() }; } } From df0693db12f99e6844f6d5f8a3d3547041cdfd47 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 24 Aug 2022 16:48:55 +0200 Subject: [PATCH 027/111] tile entity? put it in the jar --- .../hbm/render/tileentity/RenderStirling.java | 49 ++++++++++++++++++- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 9 +++- src/main/java/com/hbm/wiaj/JarScene.java | 2 - src/main/java/com/hbm/wiaj/JarScript.java | 9 +++- .../hbm/wiaj/actions/ActionCreateActor.java | 26 ++++++++++ .../hbm/wiaj/actions/ActionRemoveActor.java | 23 +++++++++ .../hbm/wiaj/actions/ActionSetActorData.java | 27 ++++++++++ .../hbm/wiaj/actions/ActionUpdateActor.java | 27 ++++++++++ .../com/hbm/wiaj/actors/ActorTileEntity.java | 38 ++++++++++++++ .../com/hbm/wiaj/actors/ISpecialActor.java | 12 ++++- .../hbm/wiaj/actors/ITileActorRenderer.java | 5 +- 11 files changed, 219 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java create mode 100644 src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java diff --git a/src/main/java/com/hbm/render/tileentity/RenderStirling.java b/src/main/java/com/hbm/render/tileentity/RenderStirling.java index b241459e9..7d6bfd224 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderStirling.java +++ b/src/main/java/com/hbm/render/tileentity/RenderStirling.java @@ -7,14 +7,16 @@ import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.machine.TileEntityStirling; +import com.hbm.wiaj.actors.ITileActorRenderer; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.IItemRenderer; -public class RenderStirling extends TileEntitySpecialRenderer implements IItemRendererProvider { +public class RenderStirling extends TileEntitySpecialRenderer implements IItemRendererProvider, ITileActorRenderer { @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -93,4 +95,49 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe RenderStirling.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1F : 0, cog, item.getItem() == Item.getItemFromBlock(ModBlocks.machine_stirling) ? 0 : 1); }}; } + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + int type = data.getInteger("type"); + boolean hasCog = data.getBoolean("hasCog"); + float lastSpin = data.getFloat("lastSpin"); + float spin = data.getFloat("spin"); + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + renderCommon(lastSpin + (spin - lastSpin) * interp, hasCog, type); + + GL11.glPopMatrix(); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { + + float lastSpin = 0; + float spin = data.getFloat("spin"); + float speed = data.getFloat("speed"); + + lastSpin = spin; + spin += speed; + + if(spin >= 360) { + lastSpin -= 360; + spin -= 360; + } + + data.setFloat("lastSpin", lastSpin); + data.setFloat("spin", spin); + } } diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 3b26be2ba..5989c07e1 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -1,11 +1,14 @@ package com.hbm.wiaj; +import java.util.Map.Entry; + import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; import com.hbm.wiaj.actions.ActionRotate; import com.hbm.wiaj.actions.ActionSetBlock; import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ISpecialActor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -131,7 +134,6 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glTranslated(-7, 0 , -7); GL11.glTranslated(world.sizeX / 2D, 0 , world.sizeZ / 2D); - //GL11.glRotated(System.currentTimeMillis() % (360 * 20) / 20D, 0, -1, 0); GL11.glTranslated(world.sizeX / -2D, 0 , world.sizeZ / -2D); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); @@ -148,6 +150,11 @@ public class GuiWorldInAJar extends GuiScreen { Tessellator.instance.draw(); GL11.glShadeModel(GL11.GL_FLAT); + + for(Entry actor : this.testScript.actors.entrySet()) { + actor.getValue().draw(this.testScript.ticksElapsed, this.testScript.interp); + } + GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/wiaj/JarScene.java b/src/main/java/com/hbm/wiaj/JarScene.java index 95d8e6f91..e6af1ae44 100644 --- a/src/main/java/com/hbm/wiaj/JarScene.java +++ b/src/main/java/com/hbm/wiaj/JarScene.java @@ -5,8 +5,6 @@ import java.util.List; import com.hbm.wiaj.actions.IJarAction; -import net.minecraft.util.MathHelper; - /** * A scene is a simple sequence of tasks, every script can have multiple scenes * Scenes depend on each other, in order to rewind we'll have to re-init the playing field and FFW through all previous scenes diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java index 0e4404dd6..6a315a67c 100644 --- a/src/main/java/com/hbm/wiaj/JarScript.java +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -3,6 +3,7 @@ package com.hbm.wiaj; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map.Entry; import com.hbm.wiaj.actors.ISpecialActor; @@ -12,7 +13,7 @@ public class JarScript { public WorldInAJar world; private List scenes = new ArrayList(); - private HashMap actors = new HashMap(); + public HashMap actors = new HashMap(); private JarScene currentScene; private int sceneNumber = 0; @@ -61,10 +62,16 @@ public class JarScript { this.interp = MathHelper.clamp_float((float) (now - this.lastTick) / 50F, 0F, 1F); if(nextTick) { + this.lastRotationPitch = this.rotationPitch; this.lastRotationYaw = this.rotationYaw; if(this.currentScene != null) { + + for(Entry actor : this.actors.entrySet()) { + actor.getValue().updateActor(this.currentScene); + } + tickScene(); } } diff --git a/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java b/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java new file mode 100644 index 000000000..c18986376 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java @@ -0,0 +1,26 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actors.ISpecialActor; + +public class ActionCreateActor implements IJarAction { + + int id; + ISpecialActor actor; + + public ActionCreateActor(int id, ISpecialActor actor) { + this.id = id; + this.actor = actor; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.put(id, actor); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java b/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java new file mode 100644 index 000000000..62e94b615 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java @@ -0,0 +1,23 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionRemoveActor implements IJarAction { + + int id; + + public ActionRemoveActor(int id) { + this.id = id; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.remove(id); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java b/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java new file mode 100644 index 000000000..b39c5888e --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java @@ -0,0 +1,27 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +import net.minecraft.nbt.NBTTagCompound; + +public class ActionSetActorData implements IJarAction { + + int id; + NBTTagCompound data; + + public ActionSetActorData(int id, NBTTagCompound data) { + this.id = id; + this.data = data; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.get(id).setActorData(data); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java b/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java new file mode 100644 index 000000000..6c28be0f2 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java @@ -0,0 +1,27 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionUpdateActor implements IJarAction { + + int id; + String key; + Object data; + + public ActionUpdateActor(int id, String key, Object data) { + this.id = id; + this.key = key; + this.data = data; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.get(id).setDataPoint(key, data); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java new file mode 100644 index 000000000..b184744d0 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java @@ -0,0 +1,38 @@ +package com.hbm.wiaj.actors; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.nbt.NBTTagCompound; + +public class ActorTileEntity implements ISpecialActor { + + ITileActorRenderer renderer; + NBTTagCompound data = new NBTTagCompound(); + + public ActorTileEntity(ITileActorRenderer renderer) { + this.renderer = renderer; + } + + @Override + public void draw(int ticks, float interp) { + renderer.renderActor(ticks, interp, data); + } + + @Override + public void updateActor(JarScene scene) { + renderer.updateActor(scene.script.ticksElapsed, data); + } + + @Override + public void setActorData(NBTTagCompound data) { + this.data = data; + } + + @Override + public void setDataPoint(String tag, Object o) { + if(o instanceof String) this.data.setString(tag, (String) o); + if(o instanceof Integer) this.data.setInteger(tag, (Integer) o); + if(o instanceof Float) this.data.setFloat(tag, (Float) o); + if(o instanceof Double) this.data.setDouble(tag, (Double) o); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java index 0c4e12a6c..0ac958a45 100644 --- a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java +++ b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java @@ -2,9 +2,17 @@ package com.hbm.wiaj.actors; import com.hbm.wiaj.JarScene; +import net.minecraft.nbt.NBTTagCompound; + +/** + * Actors, anything that can receive ticks (for rendering movement for example) and renders on screen + * Can be tile entity models, faux entities or tooltips + * @author hbm + */ public interface ISpecialActor { - public void draw(); + public void draw(int ticks, float interp); public void updateActor(JarScene scene); - public void setActorData(Object... data); + public void setActorData(NBTTagCompound data); + public void setDataPoint(String tag, Object o); } diff --git a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java index 26ba99f3e..22fcaa9c5 100644 --- a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java +++ b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java @@ -1,6 +1,9 @@ package com.hbm.wiaj.actors; +import net.minecraft.nbt.NBTTagCompound; + public interface ITileActorRenderer { - public void renderActor(Object... data); + public void renderActor(int ticks, float interp, NBTTagCompound data); + public void updateActor(int ticks, NBTTagCompound data); } From 091d6f3d2ca5f3aa6c752e2569c2fde15256a8e5 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 24 Aug 2022 22:08:18 +0200 Subject: [PATCH 028/111] stirling in a jar --- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../hbm/render/tileentity/RenderStirling.java | 7 ++ .../java/com/hbm/wiaj/GuiWorldInAJar.java | 64 +++++++++++++++---- src/main/java/com/hbm/wiaj/JarScript.java | 6 +- src/main/java/com/hbm/wiaj/WorldInAJar.java | 2 +- .../com/hbm/wiaj/actors/ActorTileEntity.java | 1 + src/main/resources/mcmod.info | 2 +- 7 files changed, 69 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 834f7e2f4..41803a4aa 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4334)"; + public static final String VERSION = "1.0.27 BETA (4336)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/render/tileentity/RenderStirling.java b/src/main/java/com/hbm/render/tileentity/RenderStirling.java index 7d6bfd224..38699104c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderStirling.java +++ b/src/main/java/com/hbm/render/tileentity/RenderStirling.java @@ -9,11 +9,13 @@ import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.machine.TileEntityStirling; import com.hbm.wiaj.actors.ITileActorRenderer; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; public class RenderStirling extends TileEntitySpecialRenderer implements IItemRendererProvider, ITileActorRenderer { @@ -68,6 +70,11 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe GL11.glTranslated(Math.sin(rot * Math.PI / 90D) * 0.25 + 0.125, 0, 0); ResourceManager.stirling.renderPart("Piston"); } + + @Override + protected void bindTexture(ResourceLocation tex) { + Minecraft.getMinecraft().getTextureManager().bindTexture(tex); + } @Override public Item getItemForRenderer() { diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 5989c07e1..58cce4bff 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -3,19 +3,28 @@ package com.hbm.wiaj; import java.util.Map.Entry; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; import com.hbm.blocks.ModBlocks; +import com.hbm.render.tileentity.RenderStirling; +import com.hbm.wiaj.actions.ActionCreateActor; import com.hbm.wiaj.actions.ActionRotate; +import com.hbm.wiaj.actions.ActionSetActorData; import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionUpdateActor; import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorTileEntity; import com.hbm.wiaj.actors.ISpecialActor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; //krass public class GuiWorldInAJar extends GuiScreen { @@ -63,11 +72,8 @@ public class GuiWorldInAJar extends GuiScreen { } startingScene.add(new ActionWait(10)); - startingScene.add(new ActionSetBlock(2, 1, 2, ModBlocks.fallout, 0)); - startingScene.add(new ActionWait(10)); - startingScene.add(new ActionSetBlock(4, 1, 4, ModBlocks.conveyor, 2)); startingScene.add(new ActionSetBlock(4, 1, 5, ModBlocks.conveyor, 2)); startingScene.add(new ActionSetBlock(4, 1, 6, ModBlocks.conveyor, 2)); @@ -77,9 +83,8 @@ public class GuiWorldInAJar extends GuiScreen { startingScene.add(new ActionSetBlock(4, 1, 10, ModBlocks.conveyor, 6)); startingScene.add(new ActionSetBlock(5, 1, 10, ModBlocks.conveyor, 4)); - startingScene.add(new ActionWait(10)); - - startingScene.add(new ActionRotate(90, 0, 50)); + startingScene.add(new ActionWait(5)); + startingScene.add(new ActionRotate(90, 0, 10)); JarScene brickScene = new JarScene(testScript); @@ -93,13 +98,32 @@ public class GuiWorldInAJar extends GuiScreen { } brickScene.add(new ActionRotate(-90, 0, 10)); - brickScene.add(new ActionWait(20)); brickScene.add(new ActionRotate(45, 30, 10)); - brickScene.add(new ActionWait(40)); - brickScene.add(new ActionRotate(360, 0, 100)); - brickScene.add(new ActionWait(40)); + brickScene.add(new ActionWait(20)); brickScene.add(new ActionRotate(-45, -30, 10)); + brickScene.add(new ActionWait(20)); + + brickScene.add(new ActionCreateActor(0, new ActorTileEntity(new RenderStirling()))); + NBTTagCompound stirling = new NBTTagCompound(); + stirling.setDouble("x", 7); + stirling.setDouble("y", 1); + stirling.setDouble("z", 7); + stirling.setInteger("rotation", 2); + stirling.setBoolean("hasCog", true); + brickScene.add(new ActionSetActorData(0, stirling)); + brickScene.add(new ActionWait(20)); + brickScene.add(new ActionUpdateActor(0, "speed", 5F)); + brickScene.add(new ActionWait(20)); + brickScene.add(new ActionUpdateActor(0, "speed", 10F)); + brickScene.add(new ActionWait(20)); + brickScene.add(new ActionUpdateActor(0, "speed", 15F)); + brickScene.add(new ActionWait(20)); + brickScene.add(new ActionUpdateActor(0, "speed", 2F)); + brickScene.add(new ActionUpdateActor(0, "hasCog", false)); + brickScene.add(new ActionWait(20)); + brickScene.add(new ActionRotate(360, 0, 20)); + brickScene.add(new ActionWait(100)); this.testScript.addScene(startingScene).addScene(brickScene); } @@ -124,7 +148,7 @@ public class GuiWorldInAJar extends GuiScreen { double scale = -10; GL11.glTranslated(width / 2, height / 2 + 70, 100); GL11.glScaled(scale, scale, scale); - GL11.glScaled(1, 1, 0.01); // increadible flattening power + GL11.glScaled(1, 1, 0.01); //incredible flattening power double pitch = testScript.lastRotationPitch + (testScript.rotationPitch - testScript.lastRotationPitch) * testScript.interp; double yaw = testScript.lastRotationYaw + (testScript.rotationYaw - testScript.lastRotationYaw) * testScript.interp; @@ -150,9 +174,27 @@ public class GuiWorldInAJar extends GuiScreen { Tessellator.instance.draw(); GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + + RenderHelper.enableStandardItemLighting(); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + GL11.glPushMatrix(); + + GL11.glTranslated(width / 2, height / 2 + 70, 100); + GL11.glScaled(scale, scale, scale); + GL11.glScaled(1, 1, 0.01); + GL11.glRotated(pitch, 1, 0, 0); + GL11.glRotated(yaw, 0, 1, 0); + GL11.glTranslated(-7, 0 , -7); + GL11.glTranslated(world.sizeX / 2D, 0 , world.sizeZ / 2D); + GL11.glTranslated(world.sizeX / -2D, 0 , world.sizeZ / -2D); for(Entry actor : this.testScript.actors.entrySet()) { + GL11.glPushMatrix(); actor.getValue().draw(this.testScript.ticksElapsed, this.testScript.interp); + GL11.glPopMatrix(); } GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java index 6a315a67c..ce9672076 100644 --- a/src/main/java/com/hbm/wiaj/JarScript.java +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -59,7 +59,11 @@ public class JarScript { nextTick = true; } - this.interp = MathHelper.clamp_float((float) (now - this.lastTick) / 50F, 0F, 1F); + if(this.currentScene != null) { + this.interp = MathHelper.clamp_float((float) (now - this.lastTick) / 50F, 0F, 1F); + } else { + this.interp = 0; + } if(nextTick) { diff --git a/src/main/java/com/hbm/wiaj/WorldInAJar.java b/src/main/java/com/hbm/wiaj/WorldInAJar.java index 4b920be92..34b25bc2d 100644 --- a/src/main/java/com/hbm/wiaj/WorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/WorldInAJar.java @@ -65,7 +65,7 @@ public class WorldInAJar implements IBlockAccess { if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) return null; - TileEntity tile = this.tiles[x][y][z]; + //TileEntity tile = this.tiles[x][y][z]; return null; } diff --git a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java index b184744d0..bbbb6d12b 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java @@ -34,5 +34,6 @@ public class ActorTileEntity implements ISpecialActor { if(o instanceof Integer) this.data.setInteger(tag, (Integer) o); if(o instanceof Float) this.data.setFloat(tag, (Float) o); if(o instanceof Double) this.data.setDouble(tag, (Double) o); + if(o instanceof Boolean) this.data.setBoolean(tag, (Boolean) o); } } diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 12e1e91a4..63b9ce36e 100755 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "hbm", "name": "Hbm's Nuclear Tech", "description": "A mod that adds weapons, nuclear themed stuff and machines", - "version":"1.0.27_X4334", + "version":"1.0.27_X4336", "mcversion": "1.7.10", "url": "", "updateUrl": "", From 916cab1fbdc38ce0d0d1c4125a10631be91f70b1 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 25 Aug 2022 16:58:27 +0200 Subject: [PATCH 029/111] jar foreground actors --- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 71 ++++++++++--------- .../java/com/hbm/wiaj/actors/ActorBase.java | 28 ++++++++ .../com/hbm/wiaj/actors/ActorTileEntity.java | 24 ++----- .../com/hbm/wiaj/actors/ISpecialActor.java | 8 ++- 4 files changed, 77 insertions(+), 54 deletions(-) create mode 100644 src/main/java/com/hbm/wiaj/actors/ActorBase.java diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 58cce4bff..75e847907 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -29,14 +29,13 @@ import net.minecraft.nbt.NBTTagCompound; //krass public class GuiWorldInAJar extends GuiScreen { - WorldInAJar world; RenderBlocks renderer; JarScript testScript; public GuiWorldInAJar() { super(); - world = new WorldInAJar(15, 15, 15); + WorldInAJar world = new WorldInAJar(15, 15, 15); renderer = new RenderBlocks(world); renderer.enableAO = true; @@ -122,7 +121,13 @@ public class GuiWorldInAJar extends GuiScreen { brickScene.add(new ActionUpdateActor(0, "speed", 2F)); brickScene.add(new ActionUpdateActor(0, "hasCog", false)); brickScene.add(new ActionWait(20)); - brickScene.add(new ActionRotate(360, 0, 20)); + brickScene.add(new ActionUpdateActor(0, "rotation", 4)); + brickScene.add(new ActionWait(10)); + brickScene.add(new ActionUpdateActor(0, "rotation", 3)); + brickScene.add(new ActionWait(10)); + brickScene.add(new ActionUpdateActor(0, "rotation", 5)); + brickScene.add(new ActionWait(10)); + brickScene.add(new ActionUpdateActor(0, "rotation", 2)); brickScene.add(new ActionWait(100)); this.testScript.addScene(startingScene).addScene(brickScene); @@ -145,29 +150,16 @@ public class GuiWorldInAJar extends GuiScreen { private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { GL11.glPushMatrix(); - double scale = -10; - GL11.glTranslated(width / 2, height / 2 + 70, 100); - GL11.glScaled(scale, scale, scale); - GL11.glScaled(1, 1, 0.01); //incredible flattening power - - double pitch = testScript.lastRotationPitch + (testScript.rotationPitch - testScript.lastRotationPitch) * testScript.interp; - double yaw = testScript.lastRotationYaw + (testScript.rotationYaw - testScript.lastRotationYaw) * testScript.interp; - GL11.glRotated(pitch, 1, 0, 0); - GL11.glRotated(yaw, 0, 1, 0); - - GL11.glTranslated(-7, 0 , -7); - - GL11.glTranslated(world.sizeX / 2D, 0 , world.sizeZ / 2D); - GL11.glTranslated(world.sizeX / -2D, 0 , world.sizeZ / -2D); + setupRotation(); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); GL11.glShadeModel(GL11.GL_SMOOTH); Tessellator.instance.startDrawingQuads(); - for(int x = 0; x < world.sizeX; x++) { - for(int y = 0; y < world.sizeY; y++) { - for(int z = 0; z < world.sizeZ; z++) { - renderer.renderBlockByRenderType(world.getBlock(x, y, z), x, y, z); + for(int x = 0; x < testScript.world.sizeX; x++) { + for(int y = 0; y < testScript.world.sizeY; y++) { + for(int z = 0; z < testScript.world.sizeZ; z++) { + renderer.renderBlockByRenderType(testScript.world.getBlock(x, y, z), x, y, z); } } } @@ -175,31 +167,42 @@ public class GuiWorldInAJar extends GuiScreen { Tessellator.instance.draw(); GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); - - RenderHelper.enableStandardItemLighting(); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + + GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glPushMatrix(); - - GL11.glTranslated(width / 2, height / 2 + 70, 100); - GL11.glScaled(scale, scale, scale); - GL11.glScaled(1, 1, 0.01); - GL11.glRotated(pitch, 1, 0, 0); - GL11.glRotated(yaw, 0, 1, 0); - GL11.glTranslated(-7, 0 , -7); - GL11.glTranslated(world.sizeX / 2D, 0 , world.sizeZ / 2D); - GL11.glTranslated(world.sizeX / -2D, 0 , world.sizeZ / -2D); + setupRotation(); + RenderHelper.enableStandardItemLighting(); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); for(Entry actor : this.testScript.actors.entrySet()) { GL11.glPushMatrix(); - actor.getValue().draw(this.testScript.ticksElapsed, this.testScript.interp); + actor.getValue().drawBackgroundComponent(this.testScript.ticksElapsed, this.testScript.interp); GL11.glPopMatrix(); } GL11.glPopMatrix(); } + private void setupRotation() { + + double scale = -50; + + GL11.glTranslated(width / 2, height / 2 + 70, 400); + GL11.glScaled(scale, scale, scale); + GL11.glScaled(1, 1, 0.5); //incredible flattening power + + double pitch = testScript.lastRotationPitch + (testScript.rotationPitch - testScript.lastRotationPitch) * testScript.interp; + double yaw = testScript.lastRotationYaw + (testScript.rotationYaw - testScript.lastRotationYaw) * testScript.interp; + + GL11.glRotated(pitch, 1, 0, 0); + GL11.glRotated(yaw, 0, 1, 0); + GL11.glTranslated(-7, 0 , -7); + GL11.glTranslated(testScript.world.sizeX / 2D, 0 , testScript.world.sizeZ / 2D); + GL11.glTranslated(testScript.world.sizeX / -2D, 0 , testScript.world.sizeZ / -2D); + } + @Override public boolean doesGuiPauseGame() { return false; diff --git a/src/main/java/com/hbm/wiaj/actors/ActorBase.java b/src/main/java/com/hbm/wiaj/actors/ActorBase.java new file mode 100644 index 000000000..be65923cf --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorBase.java @@ -0,0 +1,28 @@ +package com.hbm.wiaj.actors; + +import net.minecraft.nbt.NBTTagCompound; + +/** + * Very basic actor base class that holds NBT, not very useful on its own + * @author hbm + */ +public abstract class ActorBase implements ISpecialActor { + + protected NBTTagCompound data = new NBTTagCompound(); + + @Override + public void setActorData(NBTTagCompound data) { + this.data = data; + } + + @Override + public void setDataPoint(String tag, Object o) { + if(o instanceof String) this.data.setString(tag, (String) o); + if(o instanceof Integer) this.data.setInteger(tag, (Integer) o); + if(o instanceof Float) this.data.setFloat(tag, (Float) o); + if(o instanceof Double) this.data.setDouble(tag, (Double) o); + if(o instanceof Boolean) this.data.setBoolean(tag, (Boolean) o); + if(o instanceof Byte) this.data.setByte(tag, (Byte) o); + if(o instanceof Short) this.data.setShort(tag, (Short) o); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java index bbbb6d12b..0aeac2776 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java @@ -2,19 +2,19 @@ package com.hbm.wiaj.actors; import com.hbm.wiaj.JarScene; -import net.minecraft.nbt.NBTTagCompound; - -public class ActorTileEntity implements ISpecialActor { +public class ActorTileEntity extends ActorBase { ITileActorRenderer renderer; - NBTTagCompound data = new NBTTagCompound(); public ActorTileEntity(ITileActorRenderer renderer) { this.renderer = renderer; } @Override - public void draw(int ticks, float interp) { + public void drawForegroundComponent(int ticks, float interp) { } + + @Override + public void drawBackgroundComponent(int ticks, float interp) { renderer.renderActor(ticks, interp, data); } @@ -22,18 +22,4 @@ public class ActorTileEntity implements ISpecialActor { public void updateActor(JarScene scene) { renderer.updateActor(scene.script.ticksElapsed, data); } - - @Override - public void setActorData(NBTTagCompound data) { - this.data = data; - } - - @Override - public void setDataPoint(String tag, Object o) { - if(o instanceof String) this.data.setString(tag, (String) o); - if(o instanceof Integer) this.data.setInteger(tag, (Integer) o); - if(o instanceof Float) this.data.setFloat(tag, (Float) o); - if(o instanceof Double) this.data.setDouble(tag, (Double) o); - if(o instanceof Boolean) this.data.setBoolean(tag, (Boolean) o); - } } diff --git a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java index 0ac958a45..244620dea 100644 --- a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java +++ b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java @@ -11,8 +11,14 @@ import net.minecraft.nbt.NBTTagCompound; */ public interface ISpecialActor { - public void draw(int ticks, float interp); + /** Draws things in the foreground like text boxes */ + public void drawForegroundComponent(int ticks, float interp); + /** Draws things in the background, fotted to the world renderer like TESRs */ + public void drawBackgroundComponent(int ticks, float interp); + /** Update ticks to emulate serverside ticking */ public void updateActor(JarScene scene); + /** Sets the data object to the passed NBT */ public void setActorData(NBTTagCompound data); + /** Auto-detects the passed object's type and sets the specified NBT tag */ public void setDataPoint(String tag, Object o); } From e0e50226d8a2d449f36b6ff8415cd005185d3afb Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 25 Aug 2022 23:16:07 +0200 Subject: [PATCH 030/111] basic GUI panel for jar world --- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 170 +++++++++++++-- .../com/hbm/wiaj/actors/ActorBasicPanel.java | 201 ++++++++++++++++++ .../com/hbm/wiaj/actors/ActorTileEntity.java | 2 +- .../com/hbm/wiaj/actors/ISpecialActor.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 2 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- 6 files changed, 358 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 75e847907..b9080b70c 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -1,11 +1,17 @@ package com.hbm.wiaj; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; import java.util.Map.Entry; +import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import com.hbm.blocks.ModBlocks; +import com.hbm.items.ModItems; import com.hbm.render.tileentity.RenderStirling; import com.hbm.wiaj.actions.ActionCreateActor; import com.hbm.wiaj.actions.ActionRotate; @@ -13,10 +19,12 @@ import com.hbm.wiaj.actions.ActionSetActorData; import com.hbm.wiaj.actions.ActionSetBlock; import com.hbm.wiaj.actions.ActionUpdateActor; import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorBasicPanel; import com.hbm.wiaj.actors.ActorTileEntity; import com.hbm.wiaj.actors.ISpecialActor; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderBlocks; @@ -24,6 +32,7 @@ import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; //krass @@ -118,17 +127,8 @@ public class GuiWorldInAJar extends GuiScreen { brickScene.add(new ActionWait(20)); brickScene.add(new ActionUpdateActor(0, "speed", 15F)); brickScene.add(new ActionWait(20)); - brickScene.add(new ActionUpdateActor(0, "speed", 2F)); - brickScene.add(new ActionUpdateActor(0, "hasCog", false)); - brickScene.add(new ActionWait(20)); - brickScene.add(new ActionUpdateActor(0, "rotation", 4)); - brickScene.add(new ActionWait(10)); - brickScene.add(new ActionUpdateActor(0, "rotation", 3)); - brickScene.add(new ActionWait(10)); - brickScene.add(new ActionUpdateActor(0, "rotation", 5)); - brickScene.add(new ActionWait(10)); - brickScene.add(new ActionUpdateActor(0, "rotation", 2)); - brickScene.add(new ActionWait(100)); + + brickScene.add(new ActionCreateActor(1, new ActorBasicPanel(0, 0, new Object[]{ new ItemStack(ModItems.ammo_arty, 1, 5)," shit *and* piss" }))); this.testScript.addScene(startingScene).addScene(brickScene); } @@ -136,6 +136,7 @@ public class GuiWorldInAJar extends GuiScreen { @Override public void drawScreen(int mouseX, int mouseY, float f) { this.drawDefaultBackground(); + shittyHack = this; if(testScript != null) { testScript.run(); @@ -143,10 +144,25 @@ public class GuiWorldInAJar extends GuiScreen { this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); GL11.glDisable(GL11.GL_LIGHTING); - //this.drawGuiContainerForegroundLayer(mouseX, mouseY); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); GL11.glEnable(GL11.GL_LIGHTING); } + private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + + if(Keyboard.isKeyDown(Keyboard.KEY_LMENU)) { + List list = new ArrayList(); + list.add(new Object[] { (mouseX - width / 2) + " / " + (mouseY - height / 2) }); + this.drawStackText(list, mouseX - width / 2, mouseY - height / 2, this.fontRendererObj); + } + + for(Entry actor : this.testScript.actors.entrySet()) { + GL11.glPushMatrix(); + actor.getValue().drawForegroundComponent(this.width, this.height, this.testScript.ticksElapsed, this.testScript.interp); + GL11.glPopMatrix(); + } + } + private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { GL11.glPushMatrix(); @@ -187,9 +203,9 @@ public class GuiWorldInAJar extends GuiScreen { private void setupRotation() { - double scale = -50; + double scale = -10; - GL11.glTranslated(width / 2, height / 2 + 70, 400); + GL11.glTranslated(width / 2, height / 2, 400); GL11.glScaled(scale, scale, scale); GL11.glScaled(1, 1, 0.5); //incredible flattening power @@ -198,13 +214,133 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glRotated(pitch, 1, 0, 0); GL11.glRotated(yaw, 0, 1, 0); - GL11.glTranslated(-7, 0 , -7); - GL11.glTranslated(testScript.world.sizeX / 2D, 0 , testScript.world.sizeZ / 2D); - GL11.glTranslated(testScript.world.sizeX / -2D, 0 , testScript.world.sizeZ / -2D); + GL11.glTranslated(testScript.world.sizeX / -2D, -testScript.world.sizeY / 2D , testScript.world.sizeZ / -2D); } @Override public boolean doesGuiPauseGame() { return false; } + + public static GuiWorldInAJar shittyHack; + + public void drawStackText(List lines, int x, int y, FontRenderer font) { + + x += width / 2; + y += height / 2; + + if(!lines.isEmpty()) { + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + int height = 0; + int longestline = 0; + Iterator iterator = lines.iterator(); + + while(iterator.hasNext()) { + Object[] line = (Object[]) iterator.next(); + int lineWidth = 0; + + boolean hasStack = false; + + for(Object o : line) { + + if(o instanceof String) { + lineWidth += font.getStringWidth((String) o); + } else { + lineWidth += 18; + hasStack = true; + } + } + + if(hasStack) { + height += 18; + } else { + height += 10; + } + + if(lineWidth > longestline) { + longestline = lineWidth; + } + } + + int minX = x + 12; + int minY = y - 12; + + if(minX + longestline > this.width) { + minX -= 28 + longestline; + } + + if(minY + height + 6 > this.height) { + minY = this.height - height - 6; + } + + this.zLevel = 300.0F; + itemRender.zLevel = 300.0F; + //int j1 = -267386864; + int colorBg = 0xF0100010; + this.drawGradientRect(minX - 3, minY - 4, minX + longestline + 3, minY - 3, colorBg, colorBg); + this.drawGradientRect(minX - 3, minY + height + 3, minX + longestline + 3, minY + height + 4, colorBg, colorBg); + this.drawGradientRect(minX - 3, minY - 3, minX + longestline + 3, minY + height + 3, colorBg, colorBg); + this.drawGradientRect(minX - 4, minY - 3, minX - 3, minY + height + 3, colorBg, colorBg); + this.drawGradientRect(minX + longestline + 3, minY - 3, minX + longestline + 4, minY + height + 3, colorBg, colorBg); + //int k1 = 1347420415; + int color0 = 0x505000FF; + //int l1 = (k1 & 16711422) >> 1 | k1 & -16777216; + int color1 = (color0 & 0xFEFEFE) >> 1 | color0 & 0xFF000000; + this.drawGradientRect(minX - 3, minY - 3 + 1, minX - 3 + 1, minY + height + 3 - 1, color0, color1); + this.drawGradientRect(minX + longestline + 2, minY - 3 + 1, minX + longestline + 3, minY + height + 3 - 1, color0, color1); + this.drawGradientRect(minX - 3, minY - 3, minX + longestline + 3, minY - 3 + 1, color0, color0); + this.drawGradientRect(minX - 3, minY + height + 2, minX + longestline + 3, minY + height + 3, color1, color1); + + for(int index = 0; index < lines.size(); ++index) { + + Object[] line = (Object[]) lines.get(index); + int indent = 0; + boolean hasStack = false; + + for(Object o : line) { + if(!(o instanceof String)) { + hasStack = true; + } + } + + for(Object o : line) { + + if(o instanceof String) { + font.drawStringWithShadow((String) o, minX + indent, minY + (hasStack ? 4 : 0), -1); + indent += font.getStringWidth((String) o) + 2; + } else { + ItemStack stack = (ItemStack) o; + GL11.glColor3f(1F, 1F, 1F); + + if(stack.stackSize == 0) { + this.drawGradientRect(minX + indent - 1, minY - 1, minX + indent + 17, minY + 17, 0xffff0000, 0xffff0000); + this.drawGradientRect(minX + indent, minY, minX + indent + 16, minY + 16, 0xffb0b0b0, 0xffb0b0b0); + } + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + indent += 18; + } + } + + if(index == 0) { + minY += 2; + } + + minY += hasStack ? 18 : 10; + } + + this.zLevel = 0.0F; + itemRender.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + } } diff --git a/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java b/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java new file mode 100644 index 000000000..55290e0bd --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java @@ -0,0 +1,201 @@ +package com.hbm.wiaj.actors; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ActorBasicPanel implements ISpecialActor { + + int x; + int y; + List lines; + + public ActorBasicPanel(int x, int y, Object[]... objects) { + this.x = x; + this.y = y; + this.lines = new ArrayList(); + + for(Object[] o : objects) { + this.lines.add(o); + } + } + + @Override + public void drawForegroundComponent(int w, int h, int ticks, float interp) { + drawStackText(lines, x, y, Minecraft.getMinecraft().fontRenderer, RenderItem.getInstance(), w, h); + } + + @Override + public void drawBackgroundComponent(int ticks, float interp) { } + + @Override + public void updateActor(JarScene scene) { } + + @Override + public void setActorData(NBTTagCompound data) { } + + @Override + public void setDataPoint(String tag, Object o) { } + + protected void drawStackText(List lines, int x, int y, FontRenderer font, RenderItem itemRender, int w, int h) { + + x += w / 2; + y += h / 2; + + if(!lines.isEmpty()) { + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + int height = 0; + int longestline = 0; + Iterator iterator = lines.iterator(); + + while(iterator.hasNext()) { + Object[] line = (Object[]) iterator.next(); + int lineWidth = 0; + + boolean hasStack = false; + + for(Object o : line) { + + if(o instanceof String) { + lineWidth += font.getStringWidth((String) o); + } else { + lineWidth += 18; + hasStack = true; + } + } + + if(hasStack) { + height += 18; + } else { + height += 10; + } + + if(lineWidth > longestline) { + longestline = lineWidth; + } + } + + int minX = x + 12; + int minY = y - 12; + + if(minX + longestline > w) { + minX -= 28 + longestline; + } + + if(minY + height + 6 > h) { + minY = h - height - 6; + } + + itemRender.zLevel = 300.0F; + //int j1 = -267386864; + int colorBg = 0xF0100010; + this.drawGradientRect(minX - 3, minY - 4, minX + longestline + 3, minY - 3, colorBg, colorBg); + this.drawGradientRect(minX - 3, minY + height + 3, minX + longestline + 3, minY + height + 4, colorBg, colorBg); + this.drawGradientRect(minX - 3, minY - 3, minX + longestline + 3, minY + height + 3, colorBg, colorBg); + this.drawGradientRect(minX - 4, minY - 3, minX - 3, minY + height + 3, colorBg, colorBg); + this.drawGradientRect(minX + longestline + 3, minY - 3, minX + longestline + 4, minY + height + 3, colorBg, colorBg); + //int k1 = 1347420415; + int color0 = 0x505000FF; + //int l1 = (k1 & 16711422) >> 1 | k1 & -16777216; + int color1 = (color0 & 0xFEFEFE) >> 1 | color0 & 0xFF000000; + this.drawGradientRect(minX - 3, minY - 3 + 1, minX - 3 + 1, minY + height + 3 - 1, color0, color1); + this.drawGradientRect(minX + longestline + 2, minY - 3 + 1, minX + longestline + 3, minY + height + 3 - 1, color0, color1); + this.drawGradientRect(minX - 3, minY - 3, minX + longestline + 3, minY - 3 + 1, color0, color0); + this.drawGradientRect(minX - 3, minY + height + 2, minX + longestline + 3, minY + height + 3, color1, color1); + + for(int index = 0; index < lines.size(); ++index) { + + Object[] line = (Object[]) lines.get(index); + int indent = 0; + boolean hasStack = false; + + for(Object o : line) { + if(!(o instanceof String)) { + hasStack = true; + } + } + + for(Object o : line) { + + if(o instanceof String) { + font.drawStringWithShadow((String) o, minX + indent, minY + (hasStack ? 4 : 0), -1); + indent += font.getStringWidth((String) o) + 2; + } else { + ItemStack stack = (ItemStack) o; + GL11.glColor3f(1F, 1F, 1F); + + if(stack.stackSize == 0) { + this.drawGradientRect(minX + indent - 1, minY - 1, minX + indent + 17, minY + 17, 0xffff0000, 0xffff0000); + this.drawGradientRect(minX + indent, minY, minX + indent + 16, minY + 16, 0xffb0b0b0, 0xffb0b0b0); + } + itemRender.renderItemAndEffectIntoGUI(font, Minecraft.getMinecraft().getTextureManager(), stack, minX + indent, minY); + itemRender.renderItemOverlayIntoGUI(font, Minecraft.getMinecraft().getTextureManager(), stack, minX + indent, minY, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + indent += 18; + } + } + + if(index == 0) { + minY += 2; + } + + minY += hasStack ? 18 : 10; + } + + itemRender.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + } + + protected void drawGradientRect(int p_73733_1_, int p_73733_2_, int p_73733_3_, int p_73733_4_, int p_73733_5_, int p_73733_6_) { + float zLevel = 300.0F; + float f = (float) (p_73733_5_ >> 24 & 255) / 255.0F; + float f1 = (float) (p_73733_5_ >> 16 & 255) / 255.0F; + float f2 = (float) (p_73733_5_ >> 8 & 255) / 255.0F; + float f3 = (float) (p_73733_5_ & 255) / 255.0F; + float f4 = (float) (p_73733_6_ >> 24 & 255) / 255.0F; + float f5 = (float) (p_73733_6_ >> 16 & 255) / 255.0F; + float f6 = (float) (p_73733_6_ >> 8 & 255) / 255.0F; + float f7 = (float) (p_73733_6_ & 255) / 255.0F; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(f1, f2, f3, f); + tessellator.addVertex((double) p_73733_3_, (double) p_73733_2_, (double) zLevel); + tessellator.addVertex((double) p_73733_1_, (double) p_73733_2_, (double) zLevel); + tessellator.setColorRGBA_F(f5, f6, f7, f4); + tessellator.addVertex((double) p_73733_1_, (double) p_73733_4_, (double) zLevel); + tessellator.addVertex((double) p_73733_3_, (double) p_73733_4_, (double) zLevel); + tessellator.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java index 0aeac2776..3cd80af1b 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java @@ -11,7 +11,7 @@ public class ActorTileEntity extends ActorBase { } @Override - public void drawForegroundComponent(int ticks, float interp) { } + public void drawForegroundComponent(int w, int h, int ticks, float interp) { } @Override public void drawBackgroundComponent(int ticks, float interp) { diff --git a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java index 244620dea..a70be8389 100644 --- a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java +++ b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java @@ -12,7 +12,7 @@ import net.minecraft.nbt.NBTTagCompound; public interface ISpecialActor { /** Draws things in the foreground like text boxes */ - public void drawForegroundComponent(int ticks, float interp); + public void drawForegroundComponent(int w, int h, int ticks, float interp); /** Draws things in the background, fotted to the world renderer like TESRs */ public void drawBackgroundComponent(int ticks, float interp); /** Update ticks to emulate serverside ticking */ diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 03636b45b..20d41b0b0 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3803,7 +3803,7 @@ trait.rbmk.depletion=Erschöpfung: %s trait.rbmk.diffusion=Diffusion: %s trait.rbmk.fluxFunc=Flux-Funktion: %s trait.rbmk.funcType=Funktionstyp: %s -trait.rbmk.heat=Hitze pro Tick bei voller Kraft: %s +trait.rbmk.heat=Hitze pro 100 Flux: %s trait.rbmk.melt=Schmelzpunkt: %s trait.rbmk.neutron.any=Alle Neutronen trait.rbmk.neutron.fast=Schnelle Neutronen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 75ad64d4d..621753930 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4244,7 +4244,7 @@ trait.rbmk.depletion=Depletion: %s trait.rbmk.diffusion=Diffusion: %s trait.rbmk.fluxFunc=Flux function: %s trait.rbmk.funcType=Function type: %s -trait.rbmk.heat=Heat per tick at full power: %s +trait.rbmk.heat=Heat per 100 flux: %s trait.rbmk.melt=Melting point: %s trait.rbmk.neutron.any=All Neutrons trait.rbmk.neutron.fast=Fast Neutrons From 448e1c947cdf836fde9f2cd36eb7b0ce90cf3664 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 26 Aug 2022 15:13:02 +0200 Subject: [PATCH 031/111] jar tooltip test texture, scene offset actions --- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 30 ++++++++------- src/main/java/com/hbm/wiaj/JarScript.java | 19 +++++++-- .../com/hbm/wiaj/actions/ActionOffsetBy.java | 36 ++++++++++++++++++ ...{ActionRotate.java => ActionRotateBy.java} | 9 ++++- .../com/hbm/wiaj/actors/ActorFancyPanel.java | 36 ++++++++++++++++++ .../assets/hbm/textures/gui/gui_utility.png | Bin 1014 -> 3247 bytes 6 files changed, 111 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java rename src/main/java/com/hbm/wiaj/actions/{ActionRotate.java => ActionRotateBy.java} (62%) create mode 100644 src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index b9080b70c..5afb45c20 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -1,7 +1,6 @@ package com.hbm.wiaj; import java.util.ArrayList; -import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; @@ -14,7 +13,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; import com.hbm.render.tileentity.RenderStirling; import com.hbm.wiaj.actions.ActionCreateActor; -import com.hbm.wiaj.actions.ActionRotate; +import com.hbm.wiaj.actions.ActionRotateBy; import com.hbm.wiaj.actions.ActionSetActorData; import com.hbm.wiaj.actions.ActionSetBlock; import com.hbm.wiaj.actions.ActionUpdateActor; @@ -92,7 +91,7 @@ public class GuiWorldInAJar extends GuiScreen { startingScene.add(new ActionSetBlock(5, 1, 10, ModBlocks.conveyor, 4)); startingScene.add(new ActionWait(5)); - startingScene.add(new ActionRotate(90, 0, 10)); + startingScene.add(new ActionRotateBy(90, 0, 10)); JarScene brickScene = new JarScene(testScript); @@ -105,11 +104,11 @@ public class GuiWorldInAJar extends GuiScreen { brickScene.add(new ActionWait(2)); } - brickScene.add(new ActionRotate(-90, 0, 10)); + brickScene.add(new ActionRotateBy(-90, 0, 10)); brickScene.add(new ActionWait(20)); - brickScene.add(new ActionRotate(45, 30, 10)); + brickScene.add(new ActionRotateBy(45, 30, 10)); brickScene.add(new ActionWait(20)); - brickScene.add(new ActionRotate(-45, -30, 10)); + brickScene.add(new ActionRotateBy(-45, -30, 10)); brickScene.add(new ActionWait(20)); brickScene.add(new ActionCreateActor(0, new ActorTileEntity(new RenderStirling()))); @@ -122,10 +121,17 @@ public class GuiWorldInAJar extends GuiScreen { brickScene.add(new ActionSetActorData(0, stirling)); brickScene.add(new ActionWait(20)); brickScene.add(new ActionUpdateActor(0, "speed", 5F)); - brickScene.add(new ActionWait(20)); + brickScene.add(new ActionWait(10)); brickScene.add(new ActionUpdateActor(0, "speed", 10F)); - brickScene.add(new ActionWait(20)); + brickScene.add(new ActionWait(10)); brickScene.add(new ActionUpdateActor(0, "speed", 15F)); + brickScene.add(new ActionWait(10)); + brickScene.add(new ActionUpdateActor(0, "speed", 20F)); + brickScene.add(new ActionWait(10)); + brickScene.add(new ActionUpdateActor(0, "speed", 25F)); + brickScene.add(new ActionWait(10)); + brickScene.add(new ActionUpdateActor(0, "hasCog", false)); + brickScene.add(new ActionUpdateActor(0, "speed", 5F)); brickScene.add(new ActionWait(20)); brickScene.add(new ActionCreateActor(1, new ActorBasicPanel(0, 0, new Object[]{ new ItemStack(ModItems.ammo_arty, 1, 5)," shit *and* piss" }))); @@ -209,12 +215,10 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glScaled(scale, scale, scale); GL11.glScaled(1, 1, 0.5); //incredible flattening power - double pitch = testScript.lastRotationPitch + (testScript.rotationPitch - testScript.lastRotationPitch) * testScript.interp; - double yaw = testScript.lastRotationYaw + (testScript.rotationYaw - testScript.lastRotationYaw) * testScript.interp; - - GL11.glRotated(pitch, 1, 0, 0); - GL11.glRotated(yaw, 0, 1, 0); + GL11.glRotated(testScript.pitch(), 1, 0, 0); + GL11.glRotated(testScript.yaw(), 0, 1, 0); GL11.glTranslated(testScript.world.sizeX / -2D, -testScript.world.sizeY / 2D , testScript.world.sizeZ / -2D); + GL11.glTranslated(testScript.offsetX(), testScript.offsetY(), testScript.offsetZ()); } @Override diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java index ce9672076..d5592e816 100644 --- a/src/main/java/com/hbm/wiaj/JarScript.java +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map.Entry; +import com.hbm.util.BobMathUtil; import com.hbm.wiaj.actors.ISpecialActor; import net.minecraft.util.MathHelper; @@ -17,10 +18,11 @@ public class JarScript { private JarScene currentScene; private int sceneNumber = 0; - public double lastRotationYaw = -45D; - public double lastRotationPitch = -30D; - public double rotationYaw = -45D; - public double rotationPitch = -30D; + public double lastRotationYaw = -45D, rotationYaw = -45D; + public double lastRotationPitch = -30D, rotationPitch = -30D; + public double lastOffsetX = 0, offsetX = 0; + public double lastOffsetY = 0, offsetY = 0; + public double lastOffsetZ = 0, offsetZ = 0; public float interp = 0F; @@ -69,6 +71,9 @@ public class JarScript { this.lastRotationPitch = this.rotationPitch; this.lastRotationYaw = this.rotationYaw; + this.lastOffsetX = this.offsetX; + this.lastOffsetY = this.offsetY; + this.lastOffsetZ = this.offsetZ; if(this.currentScene != null) { @@ -112,4 +117,10 @@ public class JarScript { public boolean isPaused() { return this.isPaused; } + + public double yaw() { return BobMathUtil.interp(this.lastRotationYaw, this.rotationYaw, interp); } + public double pitch() { return BobMathUtil.interp(this.lastRotationPitch, this.rotationPitch, interp); } + public double offsetX() { return BobMathUtil.interp(this.lastOffsetX, this.offsetX, interp); } + public double offsetY() { return BobMathUtil.interp(this.lastOffsetY, this.offsetY, interp); } + public double offsetZ() { return BobMathUtil.interp(this.lastOffsetZ, this.offsetZ, interp); } } diff --git a/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java b/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java new file mode 100644 index 000000000..814c1ac09 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java @@ -0,0 +1,36 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +/** + * Static action for moving the scene around + * To move the scene along with another action, create a special actor that moves the scene + * @author hbm + */ +public class ActionOffsetBy implements IJarAction { + + int time; + double motionX; + double motionY; + double motionZ; + + public ActionOffsetBy(double x, double y, double z, int time) { + this.motionX = x / (time + 1); + this.motionY = y / (time + 1); + this.motionZ = z / (time + 1); + this.time = time; + } + + @Override + public int getDuration() { + return this.time; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.offsetX += this.motionX; + scene.script.offsetY += this.motionY; + scene.script.offsetZ += this.motionZ; + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionRotate.java b/src/main/java/com/hbm/wiaj/actions/ActionRotateBy.java similarity index 62% rename from src/main/java/com/hbm/wiaj/actions/ActionRotate.java rename to src/main/java/com/hbm/wiaj/actions/ActionRotateBy.java index f859e1164..99277ef6d 100644 --- a/src/main/java/com/hbm/wiaj/actions/ActionRotate.java +++ b/src/main/java/com/hbm/wiaj/actions/ActionRotateBy.java @@ -3,13 +3,18 @@ package com.hbm.wiaj.actions; import com.hbm.wiaj.JarScene; import com.hbm.wiaj.WorldInAJar; -public class ActionRotate implements IJarAction { +/** + * Static action for rotating the scene around + * To rotate the scene along with another action, create a special actor that rotates the scene + * @author hbm + */ +public class ActionRotateBy implements IJarAction { int time; double velYaw; double velPitch; - public ActionRotate(double yaw, double pitch, int time) { + public ActionRotateBy(double yaw, double pitch, int time) { this.velYaw = yaw / (time + 1); this.velPitch = pitch / (time + 1); this.time = time; diff --git a/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java new file mode 100644 index 000000000..8b87888ff --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java @@ -0,0 +1,36 @@ +package com.hbm.wiaj.actors; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.nbt.NBTTagCompound; + +public class ActorFancyPanel implements ISpecialActor { + + public ActorFancyPanel() { + + } + + @Override + public void drawForegroundComponent(int w, int h, int ticks, float interp) { } + + @Override + public void drawBackgroundComponent(int ticks, float interp) { } + + @Override + public void updateActor(JarScene scene) { } + + @Override + public void setActorData(NBTTagCompound data) { } + + @Override + public void setDataPoint(String tag, Object o) { } + + /** where the arrow should be or if the box should be centered around the home position */ + public static enum Orientation { + TOP, + BOTTOM, + LEFT, + RIGHT, + CENTER + } +} diff --git a/src/main/resources/assets/hbm/textures/gui/gui_utility.png b/src/main/resources/assets/hbm/textures/gui/gui_utility.png index e36d0f1cc5c3d422993c796b200ad0a31cacdcbf..8cb3cbc26eb1968c0266890f54f7cd7caf2e3fea 100644 GIT binary patch delta 3007 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 Eg1Cxy+5i9m From 393f2e4280bdd7ae32ffe573d449199e661adf60 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 27 Aug 2022 22:53:27 +0200 Subject: [PATCH 032/111] a film in a jar --- .../handler/nei/CentrifugeRecipeHandler.java | 13 +- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 102 +++-- src/main/java/com/hbm/wiaj/JarScene.java | 2 +- src/main/java/com/hbm/wiaj/JarScript.java | 81 +++- src/main/java/com/hbm/wiaj/WorldInAJar.java | 7 + .../hbm/wiaj/actions/ActionSetActorData.java | 2 +- .../com/hbm/wiaj/actors/ActorFancyPanel.java | 380 +++++++++++++++++- .../assets/hbm/textures/gui/gui_utility.png | Bin 3247 -> 3646 bytes 8 files changed, 538 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java index d2558d5ea..ab15345f9 100644 --- a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java @@ -138,19 +138,14 @@ public class CentrifugeRecipeHandler extends TemplateRecipeHandler { Map recipes = CentrifugeRecipes.getRecipes(); for(Map.Entry recipe : recipes.entrySet()) { + if(recipe.getKey() instanceof List) { - if(recipe.getKey() instanceof ItemStack) { - - if(NEIServerUtils.areStacksSameType(ingredient, (ItemStack) recipe.getKey())) - this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); - - } else if(recipe.getKey() instanceof ArrayList) { - - for(Object o : (ArrayList) recipe.getKey()) { + for(Object o : (List) recipe.getKey()) { ItemStack stack = (ItemStack) o; - if(NEIServerUtils.areStacksSameType(ingredient, stack)) + if(NEIServerUtils.areStacksSameType(ingredient, stack)) { this.arecipes.add(new RecipeSet(stack, RecipesCommon.objectToStackArray(recipe.getValue()))); + } } } } diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 5afb45c20..c555b6ba4 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -10,19 +10,22 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import com.hbm.blocks.ModBlocks; -import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; import com.hbm.render.tileentity.RenderStirling; import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionOffsetBy; import com.hbm.wiaj.actions.ActionRotateBy; import com.hbm.wiaj.actions.ActionSetActorData; import com.hbm.wiaj.actions.ActionSetBlock; import com.hbm.wiaj.actions.ActionUpdateActor; import com.hbm.wiaj.actions.ActionWait; -import com.hbm.wiaj.actors.ActorBasicPanel; +import com.hbm.wiaj.actors.ActorFancyPanel; import com.hbm.wiaj.actors.ActorTileEntity; import com.hbm.wiaj.actors.ISpecialActor; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.OpenGlHelper; @@ -33,16 +36,19 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; //krass public class GuiWorldInAJar extends GuiScreen { - RenderBlocks renderer; + private static final ResourceLocation guiUtil = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_utility.png"); + RenderBlocks renderer; JarScript testScript; public GuiWorldInAJar() { super(); + this.fontRendererObj = Minecraft.getMinecraft().fontRenderer; WorldInAJar world = new WorldInAJar(15, 15, 15); renderer = new RenderBlocks(world); renderer.enableAO = true; @@ -105,11 +111,6 @@ public class GuiWorldInAJar extends GuiScreen { } brickScene.add(new ActionRotateBy(-90, 0, 10)); - brickScene.add(new ActionWait(20)); - brickScene.add(new ActionRotateBy(45, 30, 10)); - brickScene.add(new ActionWait(20)); - brickScene.add(new ActionRotateBy(-45, -30, 10)); - brickScene.add(new ActionWait(20)); brickScene.add(new ActionCreateActor(0, new ActorTileEntity(new RenderStirling()))); NBTTagCompound stirling = new NBTTagCompound(); @@ -123,20 +124,18 @@ public class GuiWorldInAJar extends GuiScreen { brickScene.add(new ActionUpdateActor(0, "speed", 5F)); brickScene.add(new ActionWait(10)); brickScene.add(new ActionUpdateActor(0, "speed", 10F)); + brickScene.add(new ActionOffsetBy(1, 0, 0, 10)); brickScene.add(new ActionWait(10)); - brickScene.add(new ActionUpdateActor(0, "speed", 15F)); - brickScene.add(new ActionWait(10)); - brickScene.add(new ActionUpdateActor(0, "speed", 20F)); - brickScene.add(new ActionWait(10)); - brickScene.add(new ActionUpdateActor(0, "speed", 25F)); - brickScene.add(new ActionWait(10)); - brickScene.add(new ActionUpdateActor(0, "hasCog", false)); - brickScene.add(new ActionUpdateActor(0, "speed", 5F)); - brickScene.add(new ActionWait(20)); + brickScene.add(new ActionOffsetBy(0, 0, 1, 10)); - brickScene.add(new ActionCreateActor(1, new ActorBasicPanel(0, 0, new Object[]{ new ItemStack(ModItems.ammo_arty, 1, 5)," shit *and* piss" }))); + //brickScene.add(new ActionCreateActor(1, new ActorBasicPanel(0, 0, new Object[]{ new ItemStack(ModItems.ammo_arty, 1, 5)," shit *and* piss" }))); + + brickScene.add(new ActionCreateActor(1, new ActorFancyPanel(this.fontRendererObj, 0, 30, new Object[][] {{"I've come to make an announcement: Shadow the Hedgehog's a bitch-ass motherfucker. He pissed on my fucking wife. That's right. He took his hedgehog fuckin' quilly dick out and he pissed on my FUCKING wife, and he said his dick was THIS BIG, and I said that's disgusting. So I'm making a callout post on my Twitter.com. Shadow the Hedgehog, you got a small dick. It's the size of this walnut except WAY smaller. And guess what? Here's what my dong looks like. That's right, baby. Tall points, no quills, no pillows, look at that, it looks like two balls and a bong. He fucked my wife, so guess what, I'm gonna fuck the earth. That's right, this is what you get! My SUPER LASER PISS! Except I'm not gonna piss on the earth. I'm gonna go higher. I'm pissing on the MOOOON! How do you like that, OBAMA? I PISSED ON THE MOON, YOU IDIOT! You have twenty-three hours before the piss DROPLETS hit the fucking earth, now get out of my fucking sight before I piss on you too! "}}, 450) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + brickScene.add(new ActionWait(200)); this.testScript.addScene(startingScene).addScene(brickScene); + //SKY BLUE: 0xffA5D9FF, 0xff39ACFF, 0xff1A6CA7, 0xff1A1F22 } @Override @@ -153,8 +152,44 @@ public class GuiWorldInAJar extends GuiScreen { this.drawGuiContainerForegroundLayer(mouseX, mouseY); GL11.glEnable(GL11.GL_LIGHTING); } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int button) { + + if(width / 2 - 12 <= mouseX && width / 2 - 12 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + + if(this.testScript.isPaused()) { + this.testScript.unpause(); + } else { + this.testScript.pause(); + } + } + + if(width / 2 - 12 - 36 <= mouseX && width / 2 - 12 - 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { + + if(this.testScript.sceneNumber > 0) { + this.testScript.rewindOne(); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + } + } + + if(width / 2 - 12 + 36 <= mouseX && width / 2 - 12 + 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { + + if(this.testScript.sceneNumber < this.testScript.scenes.size()) { + this.testScript.forwardOne(); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + } + } + } private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + + for(Entry actor : this.testScript.actors.entrySet()) { + GL11.glPushMatrix(); + actor.getValue().drawForegroundComponent(this.width, this.height, this.testScript.ticksElapsed, this.testScript.interp); + GL11.glPopMatrix(); + } if(Keyboard.isKeyDown(Keyboard.KEY_LMENU)) { List list = new ArrayList(); @@ -162,11 +197,32 @@ public class GuiWorldInAJar extends GuiScreen { this.drawStackText(list, mouseX - width / 2, mouseY - height / 2, this.fontRendererObj); } - for(Entry actor : this.testScript.actors.entrySet()) { - GL11.glPushMatrix(); - actor.getValue().drawForegroundComponent(this.width, this.height, this.testScript.ticksElapsed, this.testScript.interp); - GL11.glPopMatrix(); - } + Minecraft.getMinecraft().getTextureManager().bindTexture(guiUtil); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + int playButton = this.testScript.isPaused() ? 64 : 40; + + if(width / 2 - 12 <= mouseX && width / 2 - 12 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) + this.drawTexturedModalRect(width / 2 - 12, height - 36, playButton, 24, 24, 24); + else + this.drawTexturedModalRect(width / 2 - 12, height - 36, playButton, 48, 24, 24); + + if(this.testScript.sceneNumber == 0) + this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 72, 24, 24); + else if(width / 2 - 12 - 36 <= mouseX && width / 2 - 12 - 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) + this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 24, 24, 24); + else + this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 48, 24, 24); + + if(this.testScript.sceneNumber >= this.testScript.scenes.size()) + this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 72, 24, 24); + else if(width / 2 - 12 + 36 <= mouseX && width / 2 - 12 + 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) + this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 24, 24, 24); + else + this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 48, 24, 24); + + GL11.glEnable(GL11.GL_DEPTH_TEST); } private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { diff --git a/src/main/java/com/hbm/wiaj/JarScene.java b/src/main/java/com/hbm/wiaj/JarScene.java index e6af1ae44..ec62493f2 100644 --- a/src/main/java/com/hbm/wiaj/JarScene.java +++ b/src/main/java/com/hbm/wiaj/JarScene.java @@ -16,7 +16,7 @@ public class JarScene { public List actions = new ArrayList(); public JarScript script; - private int actionNumber = 0; + public int actionNumber = 0; public IJarAction currentAction; //the action that is currently happening public int currentActionStart = 0; //time in ticks since init diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java index d5592e816..5261c39db 100644 --- a/src/main/java/com/hbm/wiaj/JarScript.java +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -6,17 +6,19 @@ import java.util.List; import java.util.Map.Entry; import com.hbm.util.BobMathUtil; +import com.hbm.wiaj.actions.IJarAction; import com.hbm.wiaj.actors.ISpecialActor; +import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; public class JarScript { public WorldInAJar world; - private List scenes = new ArrayList(); + public List scenes = new ArrayList(); public HashMap actors = new HashMap(); - private JarScene currentScene; - private int sceneNumber = 0; + public JarScene currentScene; + public int sceneNumber = 0; public double lastRotationYaw = -45D, rotationYaw = -45D; public double lastRotationPitch = -30D, rotationPitch = -30D; @@ -46,6 +48,9 @@ public class JarScript { /**supposed to be called every frame, it calculates tick times and interp values */ public void run() { + + if(this.isPaused && !freeRun) return; + long now = System.currentTimeMillis(); boolean nextTick = false; @@ -55,7 +60,7 @@ public class JarScript { nextTick = true; } - if(this.lastTick + 50 < now) { + if(this.lastTick + 50 < now || freeRun) { this.lastTick = now; this.ticksElapsed++; nextTick = true; @@ -95,7 +100,7 @@ public class JarScript { if(this.sceneNumber < this.scenes.size()) { this.currentScene = this.scenes.get(sceneNumber); - this.currentScene.currentActionStart = this.ticksElapsed; + this.currentScene.reset(); } else { this.currentScene = null; } @@ -118,6 +123,72 @@ public class JarScript { return this.isPaused; } + private void ffw() { + + this.reset(); + + freeRun = true; + int i = 0; + + while(this.sceneNumber < ffwTarget && this.currentScene != null && i < 10_000) { + this.run(); + i++; + } + + if(i > 0) { //i don't know why it needs one more cycle but it does + this.run(); + } + + freeRun = false; + } + + /** how far we want to fast forward */ + public static int ffwTarget = 0; + /** flag set during FFW, skips tick delay checks which means ticks during run() are always executed */ + public static boolean freeRun = false; + + public void reset() { + + this.actors.clear(); + this.world.nuke(); + + this.currentScene = this.scenes.get(0); + this.sceneNumber = 0; + this.ticksElapsed = 0; + this.lastTick = 0; + + this.lastOffsetX = this.offsetX = 0D; + this.lastOffsetY = this.offsetY = 0D; + this.lastOffsetZ = this.offsetZ = 0D; + this.lastRotationYaw = this.rotationYaw = -45D; + this.lastRotationPitch = this.rotationPitch = -30D; + + for(JarScene scene : this.scenes) { + scene.reset(); + } + } + + public void rewindOne() { + + if(this.sceneNumber > 0) { + this.ffwTarget = this.sceneNumber - 1; + } else { + this.ffwTarget = 0; + } + + ffw(); + } + + public void forwardOne() { + if(this.sceneNumber < this.scenes.size()) { + this.ffwTarget = this.sceneNumber + 1; + } else { + this.ffwTarget = this.scenes.size(); + } + + ffw(); + } + public double yaw() { return BobMathUtil.interp(this.lastRotationYaw, this.rotationYaw, interp); } public double pitch() { return BobMathUtil.interp(this.lastRotationPitch, this.rotationPitch, interp); } public double offsetX() { return BobMathUtil.interp(this.lastOffsetX, this.offsetX, interp); } diff --git a/src/main/java/com/hbm/wiaj/WorldInAJar.java b/src/main/java/com/hbm/wiaj/WorldInAJar.java index 34b25bc2d..b83622160 100644 --- a/src/main/java/com/hbm/wiaj/WorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/WorldInAJar.java @@ -33,6 +33,13 @@ public class WorldInAJar implements IBlockAccess { this.meta = new short[x][y][z]; this.tiles = new TileEntity[x][y][z]; } + + public void nuke() { + + this.blocks = new Block[sizeX][sizeY][sizeZ]; + this.meta = new short[sizeX][sizeY][sizeZ]; + this.tiles = new TileEntity[sizeX][sizeY][sizeZ]; + } @Override public Block getBlock(int x, int y, int z) { diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java b/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java index b39c5888e..fdab377b9 100644 --- a/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java @@ -22,6 +22,6 @@ public class ActionSetActorData implements IJarAction { @Override public void act(WorldInAJar world, JarScene scene) { - scene.script.actors.get(id).setActorData(data); + scene.script.actors.get(id).setActorData((NBTTagCompound) data.copy()); } } diff --git a/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java index 8b87888ff..3bf696701 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java @@ -1,29 +1,389 @@ package com.hbm.wiaj.actors; +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.lib.RefStrings; +import com.hbm.util.I18nUtil; import com.hbm.wiaj.JarScene; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; public class ActorFancyPanel implements ISpecialActor { - public ActorFancyPanel() { + static final ResourceLocation guiUtil = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_utility.png"); + + List lines = new ArrayList(); + RenderItem itemRender = new RenderItem(); + TextureManager texman = Minecraft.getMinecraft().getTextureManager(); + FontRenderer font; + + int x; + int y; + + boolean consistentHeight = false; + int lineDist = 2; + int tallestElement = 0; + static final int STACK_HEIGHT = 18; + + Orientation o = Orientation.CENTER; + int colorBrighter = 0xFFCCCCCC; + int colorDarker = 0xFF7D7D7D; + int colorFrame = 0xFFA0A0A0; + int colorBg = 0xFF302E36; + + public ActorFancyPanel(FontRenderer font, int x, int y, Object[][] raw, int autowrap) { + this.font = font; + this.x = x; + this.y = y; + + if(autowrap <= 0) { //if autowrap is off, just add the lines 1:1 + for(Object[] o : raw) { + lines.add(o); + } + } else { + + for(Object[] line : raw) { + + if(line.length == 1 && line[0] instanceof String) { //auto wrap can only apply to text-only lines + List frags = I18nUtil.autoBreak(font, (String)line[0], autowrap); + for(String s : frags) { + lines.add(new Object[] { s }); + } + } else { + lines.add(line); + } + } + } + } + + public ActorFancyPanel enforceConsistentHeight() { + this.consistentHeight = true; + return this; + } + + public ActorFancyPanel setLineDist(int dist) { + this.lineDist = dist; + return this; + } + + public ActorFancyPanel setOrientation(Orientation o) { + this.o = o; + return this; + } + + public ActorFancyPanel setColors(int brighter, int frame, int darker, int background) { + this.colorBrighter = brighter; + this.colorFrame = frame; + this.colorDarker = darker; + this.colorBg = background; + return this; + } + + public int getTallestElement() { + if(this.tallestElement > 0) { + return this.tallestElement; + } + + for(Object[] line : this.lines) { + for(Object element : line) { + + int height = getElementHeight(element); + + if(height > this.tallestElement) { + this.tallestElement = height; + } + } + } + + return this.tallestElement; + } + + public int getElementHeight(Object element) { + + if(element instanceof String) { + return this.font.FONT_HEIGHT; + } + + if(element instanceof ItemStack) { + return STACK_HEIGHT; + } + + if(element instanceof Object[]) { + Object[] scaledStack = (Object[]) element; //[0] ItemStack, [1] double + return (int) Math.ceil(STACK_HEIGHT * (double) scaledStack[1]); + } + + return 0; + } + + public int getElementWidth(Object element) { + + if(element instanceof String) { + return this.font.getStringWidth((String) element); + } + + if(element instanceof ItemStack) { + return STACK_HEIGHT; + } + + if(element instanceof Object[]) { + Object[] scaledStack = (Object[]) element; //[0] ItemStack, [1] double + return (int) Math.ceil(STACK_HEIGHT * (double) scaledStack[1]); + } + + return 0; + } + + int blockHeight = 0; + private int getBlockHeight() { + + if(this.blockHeight > 0) { + return this.blockHeight; + } + + for(Object[] line : this.lines) { + + if(this.blockHeight > 0) { + this.blockHeight += this.lineDist; + } + + int lineHeight = this.font.FONT_HEIGHT; + + if(this.consistentHeight) { + lineHeight = Math.max(lineHeight, getTallestElement()); + } else { + + for(Object o : line) { + lineHeight = Math.max(lineHeight, getElementHeight(o)); + } + } + + this.blockHeight += lineHeight; + } + + return this.blockHeight; + } + + int blockWidth = 0; + private int getBlockWidth() { + + if(this.blockWidth > 0) { + return this.blockWidth; + } + + for(Object[] line : this.lines) { + + int lineWidth = 0; + + for(Object o : line) { + + if(lineWidth > 0) { + lineWidth += 2; + } + + lineWidth += getElementWidth(o); + } + + if(lineWidth > this.blockWidth) { + this.blockWidth = lineWidth; + } + } + + return this.blockWidth; } @Override - public void drawForegroundComponent(int w, int h, int ticks, float interp) { } + public void drawForegroundComponent(int w, int h, int ticks, float interp) { + + int height = this.getBlockHeight(); + int width = this.getBlockWidth(); + + int posX = w / 2 + x; + int posY = h / 2 + y; + + switch(o) { + case TOP: + posX -= width / 2; + posY += 15; + break; + case BOTTOM: + posX -= width / 2; + posY -= height + 15; + break; + case LEFT: + posX += 15; + posY -= height / 2; + break; + case RIGHT: + posX -= width + 15; + posY -= height / 2; + break; + case CENTER: + posX -= width / 2; + posY -= height / 2; + break; + } - @Override - public void drawBackgroundComponent(int ticks, float interp) { } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + this.drawRect(posX - 5, posY - 5, posX + width + 5, posY + height + 5, colorFrame); + + this.drawRect(posX - 5, posY - 5, posX - 4, posY + height + 4, colorBrighter); + this.drawRect(posX - 5, posY - 5, posX + width + 4, posY - 4, colorBrighter); + this.drawRect(posX + width + 2, posY - 2, posX + width + 3, posY + height + 3, colorBrighter); + this.drawRect(posX - 2, posY + height + 2, posX + width + 3, posY + height + 3, colorBrighter); + + this.drawRect(posX - 3, posY - 3, posX - 2, posY + height + 2, colorDarker); + this.drawRect(posX - 3, posY - 3, posX + width + 2, posY - 2, colorDarker); + this.drawRect(posX + width + 4, posY - 4, posX + width + 5, posY + height + 5, colorDarker); + this.drawRect(posX - 4, posY + height + 4, posX + width + 5, posY + height + 5, colorDarker); + + this.drawRect(posX - 2, posY - 2, posX + width + 2, posY + height + 2, colorBg); - @Override - public void updateActor(JarScene scene) { } + Minecraft.getMinecraft().getTextureManager().bindTexture(guiUtil); + + int off = 28; + + switch(o) { + case TOP: + this.drawTexturedModalRect(posX + width / 2 - 7, posY - 15, 40 + off, 14, 14, 10); + break; + case BOTTOM: + this.drawTexturedModalRect(posX + width / 2 - 7, posY + height + 5, 54 + off, 14, 14, 10); + break; + case LEFT: + this.drawTexturedModalRect(posX - 15, posY + height / 2 - 7, 40 + off, 0, 10, 14); + break; + case RIGHT: + this.drawTexturedModalRect(posX + width + 5, posY + height / 2 - 7, 50 + off, 0, 10, 14); + break; + case CENTER: break; + } + + int offsetY = 0; + + for(Object[] line : this.lines) { + + if(offsetY > 0) offsetY+= this.lineDist; + int lineHeight = 0; + for(Object element : line) lineHeight = Math.max(lineHeight, this.getElementHeight(element)); + + int indent = 0; + for(Object element : line) { + + if(indent > 0) { + indent += 2; + } + + drawElement(posX + indent, posY + offsetY + lineHeight / 2, element); + indent += getElementWidth(element); + } + + offsetY += lineHeight; + } - @Override - public void setActorData(NBTTagCompound data) { } + itemRender.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + + private void drawElement(int x, int y, Object element) { + + if(element instanceof String) { + String text = (String) element; + this.font.drawString(text, x, y - this.font.FONT_HEIGHT / 2, 0xffffff); + + } else if(element instanceof ItemStack) { + + ItemStack stack = (ItemStack) element; + GL11.glColor3f(1F, 1F, 1F); - @Override - public void setDataPoint(String tag, Object o) { } + if(stack.stackSize == 0) { + this.drawGradientRect(x - 1, y - 1 - 8, x + 17, y + 17, 0xffff0000, 0xffff0000); + this.drawGradientRect(x, y - 8, x + 16, y + 16, 0xffb0b0b0, 0xffb0b0b0); + } + itemRender.renderItemAndEffectIntoGUI(this.font, texman, stack, x, y - 8); + itemRender.renderItemOverlayIntoGUI(this.font, texman, stack, x, y - 8, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + } //TODO: scaled stacks + } + + @Override public void drawBackgroundComponent(int ticks, float interp) { } + @Override public void updateActor(JarScene scene) { } + @Override public void setActorData(NBTTagCompound data) { } + @Override public void setDataPoint(String tag, Object o) { } + + protected void drawRect(int minX, int minY, int maxX, int maxY, int color) { + drawGradientRect(minX, minY, maxX, maxY, color, color); + } + + protected void drawGradientRect(int minX, int minY, int maxX, int maxY, int color1, int color2) { + + double zLevel = 300D; + float a1 = (float) (color1 >> 24 & 255) / 255.0F; + float r1 = (float) (color1 >> 16 & 255) / 255.0F; + float g1 = (float) (color1 >> 8 & 255) / 255.0F; + float b1 = (float) (color1 & 255) / 255.0F; + float a2 = (float) (color2 >> 24 & 255) / 255.0F; + float r2 = (float) (color2 >> 16 & 255) / 255.0F; + float g2 = (float) (color2 >> 8 & 255) / 255.0F; + float b2 = (float) (color2 & 255) / 255.0F; + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glShadeModel(GL11.GL_SMOOTH); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(r1, g1, b1, a1); + tessellator.addVertex((double) maxX, (double) minY, (double) zLevel); + tessellator.addVertex((double) minX, (double) minY, (double) zLevel); + tessellator.setColorRGBA_F(r2, g2, b2, a2); + tessellator.addVertex((double) minX, (double) maxY, (double) zLevel); + tessellator.addVertex((double) maxX, (double) maxY, (double) zLevel); + tessellator.draw(); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public void drawTexturedModalRect(int posX, int posY, int u, int v, int sizeX, int sizeY) { + double zLevel = 300D; + float f = 0.00390625F; + float f1 = 0.00390625F; + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(posX + 0, posY + sizeY, zLevel, (u + 0) * f, (v + sizeY) * f1); + tessellator.addVertexWithUV(posX + sizeX, posY + sizeY, zLevel, (u + sizeX) * f, (v + sizeY) * f1); + tessellator.addVertexWithUV(posX + sizeX, posY + 0, zLevel, (u + sizeX) * f, (v + 0) * f1); + tessellator.addVertexWithUV(posX + 0, posY + 0, zLevel, (u + 0) * f, (v + 0) * f); + tessellator.draw(); + } /** where the arrow should be or if the box should be centered around the home position */ public static enum Orientation { diff --git a/src/main/resources/assets/hbm/textures/gui/gui_utility.png b/src/main/resources/assets/hbm/textures/gui/gui_utility.png index 8cb3cbc26eb1968c0266890f54f7cd7caf2e3fea..c251970510966c8ac580705b2e385ab79ceae995 100644 GIT binary patch delta 3399 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 xqzXO-o@0TYda=Dkf&UuE0+T@v Date: Sun, 28 Aug 2022 20:48:56 +0200 Subject: [PATCH 033/111] recipe reload command, FEnSU and GC jar presentations --- .../hbm/commands/CommandReloadRecipes.java | 37 ++++ .../recipes/loader/SerializableRecipe.java | 4 +- src/main/java/com/hbm/main/MainRegistry.java | 2 + src/main/java/com/hbm/render/block/ct/CT.java | 3 - .../hbm/render/block/ct/CTStitchReceiver.java | 1 - .../com/hbm/render/block/ct/IBlockCT.java | 1 - .../java/com/hbm/render/block/ct/IconCT.java | 1 - .../hbm/render/block/ct/RenderBlocksCT.java | 1 - .../hbm/render/tileentity/RenderFENSU.java | 58 +++++- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 39 +++- src/main/java/com/hbm/wiaj/JarScript.java | 6 +- src/main/java/com/hbm/wiaj/WorldInAJar.java | 11 +- .../com/hbm/wiaj/actions/ActionOffsetBy.java | 6 + .../com/hbm/wiaj/actions/ActionSetTile.java | 31 ++++ .../com/hbm/wiaj/actions/ActionSetZoom.java | 30 ++++ .../com/hbm/wiaj/actors/ActorTileEntity.java | 7 + .../hbm/wiaj/actors/ITileActorRenderer.java | 6 + .../hbm/wiaj/cannery/CanneryCentrifuge.java | 169 ++++++++++++++++++ .../com/hbm/wiaj/cannery/CanneryFEnSU.java | 95 ++++++++++ .../java/com/hbm/wiaj/cannery/Dummies.java | 20 +++ .../com/hbm/wiaj/cannery/package-info.java | 9 + 21 files changed, 515 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/hbm/commands/CommandReloadRecipes.java create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionSetTile.java create mode 100644 src/main/java/com/hbm/wiaj/actions/ActionSetZoom.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/Dummies.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/package-info.java diff --git a/src/main/java/com/hbm/commands/CommandReloadRecipes.java b/src/main/java/com/hbm/commands/CommandReloadRecipes.java new file mode 100644 index 000000000..ea28801d5 --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandReloadRecipes.java @@ -0,0 +1,37 @@ +package com.hbm.commands; + +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.util.ChatBuilder; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +public class CommandReloadRecipes extends CommandBase { + + @Override + public String getCommandName() { + return "ntmreload"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/ntmreload"; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + try { + SerializableRecipe.initialize(); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Reload complete :)")); + } catch(Exception ex) { + sender.addChatMessage(ChatBuilder.start("----------------------------------").color(EnumChatFormatting.GRAY).flush()); + sender.addChatMessage(ChatBuilder.start("An error has occoured during loading, consult the log for details.").color(EnumChatFormatting.RED).flush()); + sender.addChatMessage(ChatBuilder.start(ex.getLocalizedMessage()).color(EnumChatFormatting.RED).flush()); + sender.addChatMessage(ChatBuilder.start(ex.getStackTrace()[0].toString()).color(EnumChatFormatting.RED).flush()); + sender.addChatMessage(ChatBuilder.start("----------------------------------").color(EnumChatFormatting.GRAY).flush()); + throw ex; + } + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 8e3c85a2f..163a35473 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -58,6 +58,8 @@ public abstract class SerializableRecipe { for(SerializableRecipe recipe : recipeHandlers) { + recipe.deleteRecipes(); + File recFile = new File(recDir.getAbsolutePath() + File.separatorChar + recipe.getFileName()); if(recFile.exists() && recFile.isFile()) { MainRegistry.logger.info("Reading recipe file " + recFile.getName()); @@ -166,7 +168,7 @@ public abstract class SerializableRecipe { int stacksize = array.size() > 2 ? array.get(2).getAsInt() : 1; if("item".equals(type)) { Item item = (Item) Item.itemRegistry.getObject(array.get(1).getAsString()); - int meta = array.size() > 3 ? array.get(3).getAsInt() : 2; + int meta = array.size() > 3 ? array.get(3).getAsInt() : 0; return new ComparableStack(item, stacksize, meta); } if("dict".equals(type)) { diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index e715ee150..d04e5c040 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -42,6 +42,7 @@ import org.apache.logging.log4j.Logger; import com.google.common.collect.ImmutableList; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockMotherOfAllOres; +import com.hbm.commands.CommandReloadRecipes; import com.hbm.config.*; import com.hbm.creativetabs.*; import com.hbm.entity.EntityMappings; @@ -847,6 +848,7 @@ public class MainRegistry { World world = event.getServer().getEntityWorld(); RBMKDials.createDials(world); SiegeOrchestrator.createGameRules(world); + event.registerServerCommand(new CommandReloadRecipes()); } private void loadConfig(FMLPreInitializationEvent event) { diff --git a/src/main/java/com/hbm/render/block/ct/CT.java b/src/main/java/com/hbm/render/block/ct/CT.java index f9448160a..6e3bf5ca5 100644 --- a/src/main/java/com/hbm/render/block/ct/CT.java +++ b/src/main/java/com/hbm/render/block/ct/CT.java @@ -1,8 +1,5 @@ package com.hbm.render.block.ct; -import java.util.ArrayList; -import java.util.List; - import cpw.mods.fml.client.registry.RenderingRegistry; public class CT { diff --git a/src/main/java/com/hbm/render/block/ct/CTStitchReceiver.java b/src/main/java/com/hbm/render/block/ct/CTStitchReceiver.java index be89c4ef2..e6b661bdc 100644 --- a/src/main/java/com/hbm/render/block/ct/CTStitchReceiver.java +++ b/src/main/java/com/hbm/render/block/ct/CTStitchReceiver.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.util.IIcon; -import net.minecraftforge.client.event.TextureStitchEvent; public class CTStitchReceiver { diff --git a/src/main/java/com/hbm/render/block/ct/IBlockCT.java b/src/main/java/com/hbm/render/block/ct/IBlockCT.java index 58453e4ee..a7896f433 100644 --- a/src/main/java/com/hbm/render/block/ct/IBlockCT.java +++ b/src/main/java/com/hbm/render/block/ct/IBlockCT.java @@ -3,7 +3,6 @@ package com.hbm.render.block.ct; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; public interface IBlockCT { diff --git a/src/main/java/com/hbm/render/block/ct/IconCT.java b/src/main/java/com/hbm/render/block/ct/IconCT.java index dd66acd29..2145bdd72 100644 --- a/src/main/java/com/hbm/render/block/ct/IconCT.java +++ b/src/main/java/com/hbm/render/block/ct/IconCT.java @@ -1,6 +1,5 @@ package com.hbm.render.block.ct; -import static com.hbm.render.block.ct.CT.*; import net.minecraft.util.IIcon; public class IconCT implements IIcon { diff --git a/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java b/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java index 5d44aa9b4..e59c4a6b5 100644 --- a/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java +++ b/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java @@ -2,7 +2,6 @@ package com.hbm.render.block.ct; import org.lwjgl.opengl.GL11; -import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.render.block.ct.CTContext.CTFace; diff --git a/src/main/java/com/hbm/render/tileentity/RenderFENSU.java b/src/main/java/com/hbm/render/tileentity/RenderFENSU.java index 1ace84964..a1c420293 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFENSU.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFENSU.java @@ -5,12 +5,14 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.main.ResourceManager; import com.hbm.tileentity.machine.storage.TileEntityMachineFENSU; +import com.hbm.wiaj.actors.ITileActorRenderer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public class RenderFENSU extends TileEntitySpecialRenderer { +public class RenderFENSU extends TileEntitySpecialRenderer implements ITileActorRenderer { @Override public void renderTileEntityAt(TileEntity te, double x, double y, double z, float f) { @@ -59,4 +61,58 @@ public class RenderFENSU extends TileEntitySpecialRenderer { GL11.glPopMatrix(); } + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + float lastSpin = data.getFloat("lastSpin"); + float spin = data.getFloat("spin"); + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.fensu_tex); + ResourceManager.fensu.renderPart("Base"); + + float rot = lastSpin + (spin - lastSpin) * interp; + + GL11.glTranslated(0, 2.5, 0); + GL11.glRotated(rot, 1, 0, 0); + GL11.glTranslated(0, -2.5, 0); + ResourceManager.fensu.renderPart("Disc"); + ResourceManager.fensu.renderPart("Lights"); + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { + + float lastSpin = 0; + float spin = data.getFloat("spin"); + float speed = data.getFloat("speed"); + + lastSpin = spin; + spin += speed; + + if(spin >= 360) { + lastSpin -= 360; + spin -= 360; + } + + data.setFloat("lastSpin", lastSpin); + data.setFloat("spin", spin); + } } diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index c555b6ba4..9a05c907c 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -22,6 +22,7 @@ import com.hbm.wiaj.actions.ActionWait; import com.hbm.wiaj.actors.ActorFancyPanel; import com.hbm.wiaj.actors.ActorTileEntity; import com.hbm.wiaj.actors.ISpecialActor; +import com.hbm.wiaj.cannery.*; import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; import net.minecraft.client.Minecraft; @@ -36,6 +37,8 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; //krass @@ -50,8 +53,6 @@ public class GuiWorldInAJar extends GuiScreen { super(); this.fontRendererObj = Minecraft.getMinecraft().fontRenderer; WorldInAJar world = new WorldInAJar(15, 15, 15); - renderer = new RenderBlocks(world); - renderer.enableAO = true; testScript = new JarScript(world); JarScene startingScene = new JarScene(testScript); @@ -130,11 +131,20 @@ public class GuiWorldInAJar extends GuiScreen { //brickScene.add(new ActionCreateActor(1, new ActorBasicPanel(0, 0, new Object[]{ new ItemStack(ModItems.ammo_arty, 1, 5)," shit *and* piss" }))); - brickScene.add(new ActionCreateActor(1, new ActorFancyPanel(this.fontRendererObj, 0, 30, new Object[][] {{"I've come to make an announcement: Shadow the Hedgehog's a bitch-ass motherfucker. He pissed on my fucking wife. That's right. He took his hedgehog fuckin' quilly dick out and he pissed on my FUCKING wife, and he said his dick was THIS BIG, and I said that's disgusting. So I'm making a callout post on my Twitter.com. Shadow the Hedgehog, you got a small dick. It's the size of this walnut except WAY smaller. And guess what? Here's what my dong looks like. That's right, baby. Tall points, no quills, no pillows, look at that, it looks like two balls and a bong. He fucked my wife, so guess what, I'm gonna fuck the earth. That's right, this is what you get! My SUPER LASER PISS! Except I'm not gonna piss on the earth. I'm gonna go higher. I'm pissing on the MOOOON! How do you like that, OBAMA? I PISSED ON THE MOON, YOU IDIOT! You have twenty-three hours before the piss DROPLETS hit the fucking earth, now get out of my fucking sight before I piss on you too! "}}, 450) + brickScene.add(new ActionCreateActor(1, new ActorFancyPanel(this.fontRendererObj, 0, 30, new Object[][] {{"I've come to make an announcement: Shadow the Hedgehog's a" + + " bitch-ass motherfucker. He pissed on my fucking wife. That's right. He took his hedgehog fuckin' quilly dick out and he pissed on my FUCKING wife, and he" + + " said his dick was THIS BIG, and I said that's disgusting. So I'm making a callout post on my Twitter.com. Shadow the Hedgehog, you got a small dick. It's" + + " the size of this walnut except WAY smaller. And guess what? Here's what my dong looks like. That's right, baby. Tall points, no quills, no pillows, look " + + "at that, it looks like two balls and a bong. He fucked my wife, so guess what, I'm gonna fuck the earth. That's right, this is what you get! My SUPER LASE" + + "R PISS! Except I'm not gonna piss on the earth. I'm gonna go higher. I'm pissing on the MOOOON! How do you like that, OBAMA? I PISSED ON THE MOON, YOU IDI" + + "OT! You have twenty-three hours before the piss DROPLETS hit the fucking earth, now get out of my fucking sight before I piss on you too! "}}, 450) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); brickScene.add(new ActionWait(200)); - this.testScript.addScene(startingScene).addScene(brickScene); + //this.testScript.addScene(startingScene).addScene(brickScene); + this.testScript = CanneryCentrifuge.createScript(); + renderer = new RenderBlocks(testScript.world); + renderer.enableAO = true; //SKY BLUE: 0xffA5D9FF, 0xff39ACFF, 0xff1A6CA7, 0xff1A1F22 } @@ -147,10 +157,20 @@ public class GuiWorldInAJar extends GuiScreen { testScript.run(); } - this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); - GL11.glDisable(GL11.GL_LIGHTING); - this.drawGuiContainerForegroundLayer(mouseX, mouseY); - GL11.glEnable(GL11.GL_LIGHTING); + try { + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + } catch(Exception ex) { + + for(StackTraceElement line : ex.getStackTrace()) { + this.mc.thePlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + line.toString())); + } + + this.mc.displayGuiScreen((GuiScreen) null); + this.mc.setIngameFocus(); + } } @Override @@ -270,6 +290,9 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glTranslated(width / 2, height / 2, 400); GL11.glScaled(scale, scale, scale); GL11.glScaled(1, 1, 0.5); //incredible flattening power + + double zoom = testScript.zoom(); + GL11.glScaled(zoom, zoom, zoom); GL11.glRotated(testScript.pitch(), 1, 0, 0); GL11.glRotated(testScript.yaw(), 0, 1, 0); diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java index 5261c39db..caa8d65b8 100644 --- a/src/main/java/com/hbm/wiaj/JarScript.java +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -6,10 +6,8 @@ import java.util.List; import java.util.Map.Entry; import com.hbm.util.BobMathUtil; -import com.hbm.wiaj.actions.IJarAction; import com.hbm.wiaj.actors.ISpecialActor; -import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; public class JarScript { @@ -25,6 +23,7 @@ public class JarScript { public double lastOffsetX = 0, offsetX = 0; public double lastOffsetY = 0, offsetY = 0; public double lastOffsetZ = 0, offsetZ = 0; + public double lastZoom = 1, zoom = 1; public float interp = 0F; @@ -79,6 +78,7 @@ public class JarScript { this.lastOffsetX = this.offsetX; this.lastOffsetY = this.offsetY; this.lastOffsetZ = this.offsetZ; + this.lastZoom = this.zoom; if(this.currentScene != null) { @@ -160,6 +160,7 @@ public class JarScript { this.lastOffsetX = this.offsetX = 0D; this.lastOffsetY = this.offsetY = 0D; this.lastOffsetZ = this.offsetZ = 0D; + this.lastZoom = this.zoom = 1D; this.lastRotationYaw = this.rotationYaw = -45D; this.lastRotationPitch = this.rotationPitch = -30D; @@ -194,4 +195,5 @@ public class JarScript { public double offsetX() { return BobMathUtil.interp(this.lastOffsetX, this.offsetX, interp); } public double offsetY() { return BobMathUtil.interp(this.lastOffsetY, this.offsetY, interp); } public double offsetZ() { return BobMathUtil.interp(this.lastOffsetZ, this.offsetZ, interp); } + public double zoom() { return BobMathUtil.interp(this.lastZoom, this.zoom, interp); } } diff --git a/src/main/java/com/hbm/wiaj/WorldInAJar.java b/src/main/java/com/hbm/wiaj/WorldInAJar.java index b83622160..099cdc444 100644 --- a/src/main/java/com/hbm/wiaj/WorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/WorldInAJar.java @@ -54,7 +54,7 @@ public class WorldInAJar implements IBlockAccess { return; this.blocks[x][y][z] = b; - this.meta[x][y][z] = (short) Math.abs(meta % 16); + this.meta[x][y][z] = (short)meta; } @Override @@ -72,9 +72,14 @@ public class WorldInAJar implements IBlockAccess { if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) return null; - //TileEntity tile = this.tiles[x][y][z]; + return this.tiles[x][y][z]; + } + + public void setTileEntity(int x, int y, int z, TileEntity tile) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return; - return null; + this.tiles[x][y][z] = tile; } //always render fullbright, if the situation requires it we could add a very rudimentary system that diff --git a/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java b/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java index 814c1ac09..4035fedb1 100644 --- a/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java +++ b/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java @@ -32,5 +32,11 @@ public class ActionOffsetBy implements IJarAction { scene.script.offsetX += this.motionX; scene.script.offsetY += this.motionY; scene.script.offsetZ += this.motionZ; + + if(this.time == 0) { + scene.script.lastOffsetX = scene.script.offsetX; + scene.script.lastOffsetY = scene.script.offsetY; + scene.script.lastOffsetZ = scene.script.offsetZ; + } } } diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetTile.java b/src/main/java/com/hbm/wiaj/actions/ActionSetTile.java new file mode 100644 index 000000000..3317557dc --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetTile.java @@ -0,0 +1,31 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +import net.minecraft.tileentity.TileEntity; + +public class ActionSetTile implements IJarAction { + + int x; + int y; + int z; + TileEntity tile; + + public ActionSetTile(int x, int y, int z, TileEntity tile) { + this.x = x; + this.y = y; + this.z = z; + this.tile = tile; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + world.setTileEntity(x, y, z, tile); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetZoom.java b/src/main/java/com/hbm/wiaj/actions/ActionSetZoom.java new file mode 100644 index 000000000..23e093a49 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetZoom.java @@ -0,0 +1,30 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionSetZoom implements IJarAction { + + int time; + double zoom; + + public ActionSetZoom(double zoom, int time) { + this.zoom = zoom / (time + 1); + this.time = time; + } + + @Override + public int getDuration() { + return this.time; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + + if(this.getDuration() == 0) { + scene.script.lastZoom = scene.script.zoom = this.zoom; + } else { + scene.script.zoom += this.zoom; + } + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java index 3cd80af1b..50a1f1650 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java @@ -2,6 +2,8 @@ package com.hbm.wiaj.actors; import com.hbm.wiaj.JarScene; +import net.minecraft.nbt.NBTTagCompound; + public class ActorTileEntity extends ActorBase { ITileActorRenderer renderer; @@ -9,6 +11,11 @@ public class ActorTileEntity extends ActorBase { public ActorTileEntity(ITileActorRenderer renderer) { this.renderer = renderer; } + + public ActorTileEntity(ITileActorRenderer renderer, NBTTagCompound data) { + this(renderer); + this.data = data; + } @Override public void drawForegroundComponent(int w, int h, int ticks, float interp) { } diff --git a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java index 22fcaa9c5..5c98d5b90 100644 --- a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java +++ b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java @@ -1,9 +1,15 @@ package com.hbm.wiaj.actors; +import net.minecraft.client.Minecraft; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; public interface ITileActorRenderer { public void renderActor(int ticks, float interp, NBTTagCompound data); public void updateActor(int ticks, NBTTagCompound data); + + public static void bindTexture(ResourceLocation tex) { + Minecraft.getMinecraft().getTextureManager().bindTexture(tex); + } } diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java new file mode 100644 index 000000000..cff8a1c67 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java @@ -0,0 +1,169 @@ +package com.hbm.wiaj.cannery; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ModItems; +import com.hbm.main.ResourceManager; +import com.hbm.render.tileentity.RenderFENSU; +import com.hbm.tileentity.network.TileEntityPipeBaseNT; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ITileActorRenderer; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class CanneryCentrifuge { + + public static JarScript createScript() { + WorldInAJar world = new WorldInAJar(9, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + scene0.add(new ActionSetZoom(2, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + + if(x == 7) { + scene0.add(new ActionSetTile(7, 1, 2, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetBlock(7, 1, 2, ModBlocks.barrel_tcalloy)); + } + + if(x == 6) { + TileEntityPipeBaseNT duct = new TileEntityPipeBaseNT(); + duct.setType(Fluids.UF6); + scene0.add(new ActionSetTile(6, 1, 2, duct)); + scene0.add(new ActionSetBlock(6, 1, 2, ModBlocks.fluid_duct_neo, 0)); + } + + if(x == 5) { + scene0.add(new ActionSetTile(5, 1, 2, new Dummies.JarDummyConnector())); + NBTTagCompound cent = new NBTTagCompound(); + cent.setDouble("x", 5); + cent.setDouble("y", 1); + cent.setDouble("z", 2); + cent.setInteger("rotation", 2); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorGasCent(), cent))); + } + + scene0.add(new ActionWait(2)); + } + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, -50, new Object[][] {{"Gas centrifuges can be supplied with fluid " + + "using regular fluid ducts."}}, 200) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + + JarScene scene1 = new JarScene(script); + + scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, 10, new Object[][] {{"Most recipes require multiple centrifuges. " + + "The intermediate products cannot be transported via pipes."}}, 200) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(1)); + + scene1.add(new ActionSetZoom(4, 20)); + + scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 40, new Object[][] {{"This side acts as a connector which " + + "outputs the intermediate product into an adjecent centrifuge."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.LEFT))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(1)); + scene1.add(new ActionSetZoom(-2, 20)); + scene1.add(new ActionWait(20)); + + NBTTagCompound c2 = new NBTTagCompound(); c2.setDouble("x", 4); c2.setDouble("y", 1); c2.setDouble("z", 2); c2.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(1, new ActorTileEntity(new ActorGasCent(), c2))); + scene1.add(new ActionWait(10)); + + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{"Uranium hexafluoride can be processed with just " + + "two centrifuges, this however will produce Uranium fuel and Uranium-238."}}, 200) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); + + scene1.add(new ActionWait(100)); + scene1.add(new ActionRemoveActor(2)); + scene1.add(new ActionSetZoom(-2, 20)); + + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{"Fully processing it into Uranium-235 and Uranium-238 " + + "requires a total of four centrifuges."}}, 200) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(2)); + + NBTTagCompound c3 = new NBTTagCompound(); c3.setDouble("x", 3); c3.setDouble("y", 1); c3.setDouble("z", 2); c3.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(2, new ActorTileEntity(new ActorGasCent(), c3))); + scene1.add(new ActionWait(10)); + NBTTagCompound c4 = new NBTTagCompound(); c4.setDouble("x", 2); c4.setDouble("y", 1); c4.setDouble("z", 2); c4.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(3, new ActorTileEntity(new ActorGasCent(), c4))); + scene1.add(new ActionWait(10)); + + scene1.add(new ActionCreateActor(4, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{"Some recipes also require the centrifuge speed upgrade."}}, 200) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(4)); + + scene1.add(new ActionCreateActor(4, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 28, -30, new Object[][] {{new ItemStack(ModItems.upgrade_gc_speed)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionCreateActor(5, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 45, 35, new Object[][] {{" = ", new ItemStack(ModItems.nugget_u238, 11), new ItemStack(ModItems.nugget_u235)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.LEFT))); + + script.addScene(scene0).addScene(scene1); + return script; + } + + public static class ActorGasCent implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.gascent_tex); + ResourceManager.gascent.renderPart("Centrifuge"); + ResourceManager.gascent.renderPart("Flag"); + + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java new file mode 100644 index 000000000..418c0551d --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java @@ -0,0 +1,95 @@ +package com.hbm.wiaj.cannery; + +import com.hbm.blocks.ModBlocks; +import com.hbm.render.tileentity.RenderFENSU; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionOffsetBy; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionRotateBy; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; + +public class CanneryFEnSU { + + public static JarScript createScript() { + WorldInAJar world = new WorldInAJar(11, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + scene0.add(new ActionSetZoom(1.5D, 0)); + scene0.add(new ActionOffsetBy(-2D, 0D, 0D, 0)); + NBTTagCompound fensu = new NBTTagCompound(); + fensu.setDouble("x", 7); + fensu.setDouble("y", 1); + fensu.setDouble("z", 2); + fensu.setInteger("rotation", 4); + fensu.setFloat("speed", 10F); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new RenderFENSU(), fensu))); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -50, new Object[][] {{"The FEnSU is capable of storing absurd " + + "amounts of energy, over 9EHE (that's a nine followed by 18 zeros)."}}, 200) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionWait(80)); + scene0.add(new ActionRemoveActor(1)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionRotateBy(45, 90, 20)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{"There is only one energy connector " + + "which can be found on the bottom."}}, 200) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.TOP))); + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{"This is also the only place where the" + + " FEnSU can receive a redstone signal."}}, 200) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.TOP))); + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + + scene0.add(new ActionSetBlock(7, 0, 2, ModBlocks.red_wire_coated)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetBlock(6, 0, 2, Blocks.lever, 2)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionRotateBy(0, -60, 20)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetBlock(6, 0, 2, Blocks.lever, 10)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionSetBlock(6, 0, 2, Blocks.lever, 2)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionRotateBy(-45, -30, 20)); + scene0.add(new ActionOffsetBy(2D, 0D, 0D, 10)); + /// END OF SCENE 1 /// + + JarScene scene1 = new JarScene(script); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + if(z == 2 && x > 0 && x < 10) + scene1.add(new ActionSetBlock(x, 0, z, ModBlocks.red_wire_coated)); + else + scene1.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + scene1.add(new ActionWait(2)); + } + + scene1.add(new ActionWait(18)); + scene1.add(new ActionSetBlock(1, 1, 2, ModBlocks.machine_detector)); + scene1.add(new ActionWait(10)); + scene1.add(new ActionSetBlock(1, 1, 2, ModBlocks.machine_detector, 1)); + scene1.add(new ActionWait(60)); + + script.addScene(scene0).addScene(scene1); + return script; + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/Dummies.java b/src/main/java/com/hbm/wiaj/cannery/Dummies.java new file mode 100644 index 000000000..adbc22ee6 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/Dummies.java @@ -0,0 +1,20 @@ +package com.hbm.wiaj.cannery; + +import com.hbm.inventory.fluid.FluidType; + +import api.hbm.energy.IEnergyConnector; +import api.hbm.fluid.IFluidConnector; +import net.minecraft.tileentity.TileEntity; + +public class Dummies { + + public static class JarDummyConnector extends TileEntity implements IEnergyConnector, IFluidConnector { + + @Override public boolean isLoaded() { return false; } + @Override public long transferFluid(FluidType type, long fluid) { return 0; } + @Override public long getDemand(FluidType type) { return 0; } + @Override public long transferPower(long power) { return 0; } + @Override public long getPower() { return 0; } + @Override public long getMaxPower() { return 0; } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/package-info.java b/src/main/java/com/hbm/wiaj/cannery/package-info.java new file mode 100644 index 000000000..a3380c776 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/package-info.java @@ -0,0 +1,9 @@ +/** + * @author hbm + */ +package com.hbm.wiaj.cannery; + +/* + * as it turns out, a factory for filling jars is called a "cannery", not a "jarrery", even though they don't necessarily + * fill cans there. well it sure beats calling every damn class a "JarFactory" + */ \ No newline at end of file From fea8dd9628e8f4c25220b1ccb40d48102243f1a6 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 29 Aug 2022 10:28:00 +0200 Subject: [PATCH 034/111] hakita redemption arc --- .../java/com/hbm/items/armor/ItemModV1.java | 20 ------------------- .../com/hbm/items/machine/ItemRBMKRod.java | 3 --- src/main/resources/assets/hbm/lang/de_DE.lang | 2 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- 4 files changed, 2 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/hbm/items/armor/ItemModV1.java b/src/main/java/com/hbm/items/armor/ItemModV1.java index 6d206fca6..bb5d8a3a6 100644 --- a/src/main/java/com/hbm/items/armor/ItemModV1.java +++ b/src/main/java/com/hbm/items/armor/ItemModV1.java @@ -7,19 +7,15 @@ import com.google.common.collect.Multimap; import com.hbm.handler.ArmorModHandler; import com.hbm.interfaces.IArmorModDash; -import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.ai.attributes.IAttributeInstance; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.event.entity.living.LivingHurtEvent; public class ItemModV1 extends ItemArmorMod implements IArmorModDash { private static final UUID speed = UUID.fromString("1d11e63e-28c4-4e14-b09f-fe0bd1be708f"); - public static final UUID its_to_prevent_you_from_healing = UUID.fromString("9b0ff87a-6103-482b-b515-19ef2e6721ce"); public ItemModV1() { super(ArmorModHandler.extra, false, true, false, false); @@ -48,20 +44,4 @@ public class ItemModV1 extends ItemArmorMod implements IArmorModDash { public int getDashes() { return 3; } - - @Override - public void modDamage(LivingHurtEvent event, ItemStack armor) { - - EntityLivingBase entity = event.entityLiving; - - IAttributeInstance attributeinstance = entity.getAttributeMap().getAttributeInstance(SharedMonsterAttributes.maxHealth); - - float health = entity.getMaxHealth(); - - try { - attributeinstance.removeModifier(attributeinstance.getModifier(its_to_prevent_you_from_healing)); - } catch(Exception ex) { } - - attributeinstance.applyModifier(new AttributeModifier(its_to_prevent_you_from_healing, "hakita what is this bullshit", -(entity.getMaxHealth() - health + event.ammount * 0.35), 0)); - } } diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 557892236..fa33d32ed 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -8,9 +8,6 @@ import com.hbm.tileentity.machine.rbmk.IRBMKFluxReceiver.NType; import com.hbm.tileentity.machine.rbmk.RBMKDials; import com.hbm.util.I18nUtil; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 20d41b0b0..5cca52ac0 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3803,7 +3803,7 @@ trait.rbmk.depletion=Erschöpfung: %s trait.rbmk.diffusion=Diffusion: %s trait.rbmk.fluxFunc=Flux-Funktion: %s trait.rbmk.funcType=Funktionstyp: %s -trait.rbmk.heat=Hitze pro 100 Flux: %s +trait.rbmk.heat=Hitze pro Flux: %s trait.rbmk.melt=Schmelzpunkt: %s trait.rbmk.neutron.any=Alle Neutronen trait.rbmk.neutron.fast=Schnelle Neutronen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 621753930..fb479e7c5 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4244,7 +4244,7 @@ trait.rbmk.depletion=Depletion: %s trait.rbmk.diffusion=Diffusion: %s trait.rbmk.fluxFunc=Flux function: %s trait.rbmk.funcType=Function type: %s -trait.rbmk.heat=Heat per 100 flux: %s +trait.rbmk.heat=Heat per flux: %s trait.rbmk.melt=Melting point: %s trait.rbmk.neutron.any=All Neutrons trait.rbmk.neutron.fast=Fast Neutrons From 1c79e4b900dbf8e32e7f25820c6e0c80e6623c12 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 29 Aug 2022 16:32:55 +0200 Subject: [PATCH 035/111] some compat crap --- src/main/java/api/hbm/fluid/IFluidUser.java | 8 ++ .../tileentity/machine/TileEntityChungus.java | 5 ++ .../machine/TileEntityCondenser.java | 5 ++ .../machine/TileEntityCoreEmitter.java | 7 +- .../machine/TileEntityCoreInjector.java | 5 ++ .../machine/TileEntityCoreReceiver.java | 5 ++ .../machine/TileEntityDeuteriumExtractor.java | 5 ++ .../machine/TileEntityFWatzCore.java | 6 ++ .../machine/TileEntityHeaterOilburner.java | 5 ++ .../tileentity/machine/TileEntityITER.java | 5 ++ .../machine/TileEntityMachineAssemfac.java | 5 ++ .../machine/TileEntityMachineBoiler.java | 5 ++ .../TileEntityMachineBoilerElectric.java | 5 ++ .../machine/TileEntityMachineCMBFactory.java | 7 +- .../machine/TileEntityMachineChemplant.java | 5 ++ .../machine/TileEntityMachineCoal.java | 5 ++ .../TileEntityMachineCrystallizer.java | 5 ++ .../machine/TileEntityMachineCyclotron.java | 5 ++ .../machine/TileEntityMachineDiesel.java | 5 ++ .../machine/TileEntityMachineGasCent.java | 5 ++ .../machine/TileEntityMachineIGenerator.java | 5 ++ .../machine/TileEntityMachineMiningLaser.java | 5 ++ .../machine/TileEntityMachineTurbine.java | 5 ++ .../machine/TileEntityMachineTurbofan.java | 5 ++ .../machine/TileEntityReactorZirnox.java | 5 ++ .../machine/TileEntitySolarBoiler.java | 5 ++ .../machine/TileEntityStorageDrum.java | 5 ++ .../machine/TileEntityWatzCore.java | 5 ++ .../TileEntityMachineCatalyticCracker.java | 5 ++ .../oil/TileEntityMachineFrackingTower.java | 5 ++ .../oil/TileEntityMachineFractionTower.java | 5 ++ .../oil/TileEntityMachineGasFlare.java | 5 ++ .../oil/TileEntityMachineLiquefactor.java | 5 ++ .../oil/TileEntityMachinePumpjack.java | 1 + .../oil/TileEntityMachineRefinery.java | 5 ++ .../oil/TileEntityMachineSolidifier.java | 5 ++ .../machine/oil/TileEntityOilDrillBase.java | 5 ++ .../machine/storage/TileEntityBarrel.java | 5 ++ .../storage/TileEntityMachineFluidTank.java | 5 ++ .../turret/TileEntityTurretFritz.java | 5 ++ .../java/com/hbm/util/CompatExternal.java | 90 +++++++++++++++++++ 41 files changed, 292 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hbm/util/CompatExternal.java diff --git a/src/main/java/api/hbm/fluid/IFluidUser.java b/src/main/java/api/hbm/fluid/IFluidUser.java index 92c86e7c6..4abb80ed3 100644 --- a/src/main/java/api/hbm/fluid/IFluidUser.java +++ b/src/main/java/api/hbm/fluid/IFluidUser.java @@ -1,6 +1,7 @@ package api.hbm.fluid; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; @@ -90,4 +91,11 @@ public interface IFluidUser extends IFluidConnector { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.tryUnsubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); } + + /** + * Returns all internal tanks of this tile. Not used by the fluid network, it should only be used for display purposes or edge cases that can't be solved otherwise. + * The array is either composed of the original tank or outright the original tank array, so changes done to this array will extend to the IFluidUser. + * @return + */ + public FluidTank[] getAllTanks(); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index e0acee51d..44d3f3441 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -282,4 +282,9 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index 986d3fc10..fbaf20204 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -163,4 +163,9 @@ public class TileEntityCondenser extends TileEntity implements IFluidAcceptor, I public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks [0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index f22952e22..4aca127f2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -292,7 +292,12 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne @Override public FluidTank[] getReceivingTanks() { - return new FluidTank[] {tank}; + return new FluidTank[] { tank }; + } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; } // do some opencomputer stuff diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java index 7e592e2b8..94f8f7540 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java @@ -182,6 +182,11 @@ public class TileEntityCoreInjector extends TileEntityMachineBase implements IFl public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0], tanks[1]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } // do some opencomputer stuff @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java index 8d4edca9d..b7822bf84 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java @@ -178,6 +178,11 @@ public class TileEntityCoreReceiver extends TileEntityMachineBase implements IEn return new FluidTank[] { tank }; } + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } + // do some opencomputer stuff @Override public String getComponentName() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java index 66811bd7d..e01421730 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java @@ -187,4 +187,9 @@ public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implemen public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java index 8c6e3ebf3..b764fd23a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java @@ -435,8 +435,14 @@ public class TileEntityFWatzCore extends TileEntityLoadedBase implements ISidedI else return 0; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[1], tanks[2] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java index 6844d9fbf..69faf2675 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java @@ -190,4 +190,9 @@ public class TileEntityHeaterOilburner extends TileEntityMachineBase implements public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 8d1a46769..4cccb4016 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -534,4 +534,9 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java index fd7d5a514..188f0ff01 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java @@ -447,4 +447,9 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im public int getMaxFluidFill(FluidType type) { return type == water.getTankType() ? water.getMaxFill() : 0; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { water, steam }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java index 8924ebbea..9f47277bd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java @@ -401,4 +401,9 @@ public class TileEntityMachineBoiler extends TileEntity implements ISidedInvento public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java index e58455769..b475f959e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java @@ -423,4 +423,9 @@ public class TileEntityMachineBoilerElectric extends TileEntityLoadedBase implem public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java index 544eb884f..c855fe8cd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java @@ -356,6 +356,11 @@ public class TileEntityMachineCMBFactory extends TileEntityLoadedBase implements @Override public FluidTank[] getReceivingTanks() { - return new FluidTank[] {tank}; + return new FluidTank[] { tank }; + } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 38fcb882e..29772bafd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -611,4 +611,9 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0], tanks[1]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java index cdc84f728..2bc550040 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java @@ -343,4 +343,9 @@ public class TileEntityMachineCoal extends TileEntityLoadedBase implements ISide public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index 2165ed7ee..62e19ca68 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -380,4 +380,9 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index c804d647c..1ace1c9b0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -536,4 +536,9 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] { coolant }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { amat, coolant }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index 905d52a69..ea9a96922 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -236,4 +236,9 @@ public class TileEntityMachineDiesel extends TileEntityMachineBase implements IE public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index b90d37d85..260b28c52 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -340,6 +340,11 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } AxisAlignedBB bb = null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index 5b833a10c..ad6a6ef74 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -308,4 +308,9 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0], tanks[1], tanks[2] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index 43f495f8a..1fdc124e9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -686,4 +686,9 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen public FluidTank[] getSendingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index 278a6f02b..64a8fe472 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -363,4 +363,9 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index f98b0de63..bbba68220 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -403,4 +403,9 @@ public class TileEntityMachineTurbofan extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index ad339c00b..759892c38 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -530,6 +530,11 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IF public FluidTank[] getReceivingTanks() { return new FluidTank[] { water, carbonDioxide }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { water, steam, carbonDioxide }; + } // do some opencomputer stuff @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java index e8b12ca17..d9a9d46b1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java @@ -189,4 +189,9 @@ public class TileEntitySolarBoiler extends TileEntity implements IFluidAcceptor, public FluidTank[] getReceivingTanks() { return new FluidTank[] { water }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { water, steam }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java index 3e8f9c78b..52172bafb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java @@ -317,4 +317,9 @@ public class TileEntityStorageDrum extends TileEntityMachineBase implements IFlu public FluidTank[] getSendingTanks() { return new FluidTank[] { tanks[0], tanks[1] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java index ab752bc78..6373f69c0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java @@ -754,4 +754,9 @@ public class TileEntityWatzCore extends TileEntityLoadedBase implements ISidedIn public FluidTank[] getSendingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java index 79b817c37..6d81d415e 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java @@ -278,4 +278,9 @@ public class TileEntityMachineCatalyticCracker extends TileEntity implements IFl public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0], tanks[1]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java index 166307a3f..494c8d0ea 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java @@ -121,6 +121,11 @@ public class TileEntityMachineFrackingTower extends TileEntityOilDrillBase imple return new FluidTank[] { tanks[2] }; } + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + @Override public DirPos[] getConPos() { return new DirPos[] { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java index 65cb2fbea..f43c3ad26 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java @@ -272,4 +272,9 @@ public class TileEntityMachineFractionTower extends TileEntity implements IFluid public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index 29ed47647..6c94e3730 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -273,4 +273,9 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java index 941d10cea..e8ee4edae 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java @@ -273,4 +273,9 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen public FluidTank[] getSendingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java index f59456d9d..b52cb8fa1 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine.oil; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.DirPos; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java index 4007ec868..50bb2b2f1 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -358,4 +358,9 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java index bc5d3cd2f..44f0beece 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java @@ -247,4 +247,9 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java index e3bb51550..6015322b4 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java @@ -339,6 +339,11 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple public FluidTank[] getReceivingTanks() { return new FluidTank[0]; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } public abstract DirPos[] getConPos(); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 0eaca905a..5a019683e 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -222,6 +222,11 @@ public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcc return (mode == 0 || mode == 1) ? new FluidTank[] {tank} : new FluidTank[0]; } + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } + @Override public void writeNBT(NBTTagCompound nbt) { if(tank.getFill() == 0) return; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index 264b154d8..7aee76459 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -209,6 +209,11 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements return type == tank.getTankType() ? tank.getMaxFill() - tank.getFill() : 0; } + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } + @Override public void writeNBT(NBTTagCompound nbt) { if(tank.getFill() == 0) return; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java index 484fa0ac2..f571c4c03 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java @@ -207,4 +207,9 @@ public class TileEntityTurretFritz extends TileEntityTurretBaseNT implements IFl public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/util/CompatExternal.java b/src/main/java/com/hbm/util/CompatExternal.java new file mode 100644 index 000000000..37a6d67da --- /dev/null +++ b/src/main/java/com/hbm/util/CompatExternal.java @@ -0,0 +1,90 @@ +package com.hbm.util; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.machine.TileEntityDummy; + +import api.hbm.energy.IEnergyUser; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +/** + * EXTERNAL COMPATIBILITY CLASS - DO NOT CHANGE METHOD NAMES/PARAMS ONCE CREATED + * Is there a smarter way to do this? Most likely. Is there an easier one? Probably not. + * @author hbm + */ +public class CompatExternal { + + /** + * Gets the tile entity at that pos. If the tile entity is an mk1 or mk2 dummy, it will return the core instead. + * This method will be updated in the event that other multiblock systems or dummies are added to retrain the intended functionality. + * @return the core tile entity if the given position holds a dummy, the tile entity at that position if it doesn't or null if there is no tile entity + */ + public static TileEntity getCoreFromPos(World world, int x, int y, int z) { + + Block b = world.getBlock(x, y, z); + + //if the block at that pos is a Dummyable, use the mk2's system to find the core + if(b instanceof BlockDummyable) { + BlockDummyable dummy = (BlockDummyable) b; + int[] pos = dummy.findCore(world, x, y, z); + + if(pos != null) { + return world.getTileEntity(pos[0], pos[1], pos[2]); + } + } + + TileEntity tile = world.getTileEntity(x, y, z); + + //if the tile at that pos is an old dummy tile, use mk1 + if(tile instanceof TileEntityDummy) { + TileEntityDummy dummy = (TileEntityDummy) tile; + return world.getTileEntity(dummy.targetX, dummy.targetY, dummy.targetZ); + } + + //otherwise, return the tile at that position whihc could be null + return tile; + } + + /** + * Returns the numeric value of the buffered energy held by that tile entity. Current implementation relies on IEnergyUser. + * @param tile + * @return power + */ + public static long getBufferedPowerFromTile(TileEntity tile) { + + if(tile instanceof IEnergyUser) { + return ((IEnergyUser) tile).getPower(); + } + + return 0L; + } + + /** + * Returns the numeric value of the energy capacity of this tile entity. Current implementation relies on IEnergyUser. + * @param tile + * @return max power + */ + public static long getMaxPowerFromTile(TileEntity tile) { + + if(tile instanceof IEnergyUser) { + return ((IEnergyUser) tile).getMaxPower(); + } + + return 0L; + } + + /** + * Returns the ordinal of the energy priority from the supplied tile entity. 0 = low, 1 = normal, 2 = high. Returns -1 if not applicable. + * @param tile + * @return priority + */ + public static int getEnergyPriorityFromTile(TileEntity tile) { + + if(tile instanceof IEnergyUser) { + return ((IEnergyUser) tile).getPriority().ordinal(); + } + + return -1; + } +} From 8f837aa78387b5dbc624ccd2b74bf10bfe8dc4a4 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 29 Aug 2022 23:41:50 +0200 Subject: [PATCH 036/111] SILEX in a jar --- .../java/com/hbm/extprop/HbmLivingProps.java | 4 + .../com/hbm/render/tileentity/RenderFEL.java | 4 +- .../java/com/hbm/render/util/BeamPronter.java | 9 +- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 2 +- .../hbm/wiaj/cannery/CanneryCentrifuge.java | 1 - .../com/hbm/wiaj/cannery/CannerySILEX.java | 306 ++++++++++++++++++ 6 files changed, 321 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index 6eb410031..2a6ab82a5 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -175,6 +175,10 @@ public class HbmLivingProps implements IExtendedEntityProperties { } public static void incrementDigamma(EntityLivingBase entity, float digamma) { + + if(entity instanceof EntityDuck) + digamma = 0.0F; + HbmLivingProps data = getData(entity); float dRad = getDigamma(entity) + digamma; diff --git a/src/main/java/com/hbm/render/tileentity/RenderFEL.java b/src/main/java/com/hbm/render/tileentity/RenderFEL.java index 9d888457f..dbf119500 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFEL.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFEL.java @@ -49,8 +49,8 @@ public class RenderFEL extends TileEntitySpecialRenderer { int length = fel.distance - 3; GL11.glTranslated(0, 1.5, -1.5); if(fel.power > fel.powerReq * Math.pow(2, fel.mode.ordinal()) && fel.isOn && !(fel.mode == EnumWavelengths.NULL) && length > 0) { - BeamPronter.prontBeam(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.SPIRAL, EnumBeamType.SOLID, color, color, 0, 1, 0F, 2, 0.0625F); - BeamPronter.prontBeam(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.RANDOM, EnumBeamType.SOLID, color, color, (int)(tileEntity.getWorldObj().getTotalWorldTime() % 1000 / 2), (length / 2) + 1, 0.0625F, 2, 0.0625F); + BeamPronter.prontBeamwithDepth(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.SPIRAL, EnumBeamType.SOLID, color, color, 0, 1, 0F, 2, 0.0625F); + BeamPronter.prontBeamwithDepth(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.RANDOM, EnumBeamType.SOLID, color, color, (int)(tileEntity.getWorldObj().getTotalWorldTime() % 1000 / 2), (length / 2) + 1, 0.0625F, 2, 0.0625F); } GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/render/util/BeamPronter.java b/src/main/java/com/hbm/render/util/BeamPronter.java index bdf1f4826..27a065534 100644 --- a/src/main/java/com/hbm/render/util/BeamPronter.java +++ b/src/main/java/com/hbm/render/util/BeamPronter.java @@ -17,11 +17,18 @@ public class BeamPronter { public static enum EnumBeamType { SOLID, LINE } + + private static boolean depthMask = false; + public static void prontBeamwithDepth(Vec3 skeleton, EnumWaveType wave, EnumBeamType beam, int outerColor, int innerColor, int start, int segments, float size, int layers, float thickness) { + depthMask = true; + prontBeam(skeleton, wave, beam, outerColor, innerColor, start, segments, size, layers, thickness); + depthMask = false; + } public static void prontBeam(Vec3 skeleton, EnumWaveType wave, EnumBeamType beam, int outerColor, int innerColor, int start, int segments, float size, int layers, float thickness) { GL11.glPushMatrix(); - GL11.glDepthMask(false); + GL11.glDepthMask(depthMask); float sYaw = (float) (Math.atan2(skeleton.xCoord, skeleton.zCoord) * 180F / Math.PI); float sqrt = MathHelper.sqrt_double(skeleton.xCoord * skeleton.xCoord + skeleton.zCoord * skeleton.zCoord); diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 9a05c907c..c81b2ef69 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -142,7 +142,7 @@ public class GuiWorldInAJar extends GuiScreen { brickScene.add(new ActionWait(200)); //this.testScript.addScene(startingScene).addScene(brickScene); - this.testScript = CanneryCentrifuge.createScript(); + this.testScript = CannerySILEX.createScript(); renderer = new RenderBlocks(testScript.world); renderer.enableAO = true; //SKY BLUE: 0xffA5D9FF, 0xff39ACFF, 0xff1A6CA7, 0xff1A1F22 diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java index cff8a1c67..bfe5c5810 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java @@ -6,7 +6,6 @@ import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.main.ResourceManager; -import com.hbm.render.tileentity.RenderFENSU; import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.wiaj.JarScene; import com.hbm.wiaj.JarScript; diff --git a/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java new file mode 100644 index 000000000..f37010a98 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java @@ -0,0 +1,306 @@ +package com.hbm.wiaj.cannery; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemFELCrystal.EnumWavelengths; +import com.hbm.main.ResourceManager; +import com.hbm.render.util.BeamPronter; +import com.hbm.render.util.BeamPronter.EnumBeamType; +import com.hbm.render.util.BeamPronter.EnumWaveType; +import com.hbm.tileentity.network.TileEntityPipeBaseNT; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionUpdateActor; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ITileActorRenderer; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Vec3; + +public class CannerySILEX { + + public static JarScript createScript() { + WorldInAJar world = new WorldInAJar(17, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + scene0.add(new ActionSetZoom(2, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + + scene0.add(new ActionWait(1)); + } + + scene0.add(new ActionWait(9)); + + NBTTagCompound fel = new NBTTagCompound(); + fel.setDouble("x", 11D); + fel.setDouble("y", 1D); + fel.setDouble("z", 2D); + fel.setInteger("rotation", 5); + fel.setInteger("length", 11); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorFEL(), fel))); + + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 15, -5, new Object[][] {{"The Free Electron Laser (FEL) uses energy and a " + + "laser crystal to create a powerful laser beam."}}, 100) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.LEFT))); + + scene0.add(new ActionWait(80)); + scene0.add(new ActionRemoveActor(3)); + scene0.add(new ActionWait(10)); + + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_co2)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 1)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_bismuth)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 2)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_cmb)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 3)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_dnt)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 4)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_digamma)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 5)); + scene0.add(new ActionWait(20)); + + scene0.add(new ActionRemoveActor(3)); + scene0.add(new ActionUpdateActor(0, "mode", 0)); + scene0.add(new ActionWait(20)); + + for(int y = 1; y < 4; y++) { + for(int z = 1; z < 4; z++) { + scene0.add(new ActionSetBlock(5, y, z, Blocks.stone)); + } + scene0.add(new ActionWait(5)); + } + + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{"Be careful, as the laser will burn/melt through weaker blocks..."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 3)); + scene0.add(new ActionUpdateActor(0, "length", 4)); + + scene0.add(new ActionWait(40)); + scene0.add(new ActionUpdateActor(0, "length", 11)); + scene0.add(new ActionSetBlock(5, 2, 2, Blocks.fire)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetBlock(5, 2, 2, Blocks.air)); + scene0.add(new ActionWait(40)); + + for(int y = 1; y < 4; y++) { + for(int z = 1; z < 4; z++) { + scene0.add(new ActionSetBlock(5, y, z, ModBlocks.brick_concrete)); + } + + if(y == 2) { + scene0.add(new ActionUpdateActor(0, "length", 4)); + } + + scene0.add(new ActionWait(5)); + } + + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{"...but not blast-proof ones."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionWait(40)); + scene0.add(new ActionRemoveActor(3)); + + for(int y = 3; y > 0; y--) { + for(int z = 1; z < 4; z++) { + scene0.add(new ActionSetBlock(5, y, z, Blocks.air)); + } + + if(y == 2) { + scene0.add(new ActionUpdateActor(0, "length", 11)); + } + + scene0.add(new ActionWait(5)); + } + + scene0.add(new ActionUpdateActor(0, "mode", 0)); + + JarScene scene1 = new JarScene(script); + + NBTTagCompound silex0 = new NBTTagCompound(); + silex0.setDouble("x", 5D); + silex0.setDouble("y", 1D); + silex0.setDouble("z", 2D); + silex0.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(1, new ActorTileEntity(new ActorSILEX(), silex0))); + + scene1.add(new ActionWait(20)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{"The FEL is used to power the Laser Isotope " + + "Separation Chamber (SILEX). The FEL and SILEX have to be at least two blocks apart."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionWait(80)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 60, 32, new Object[][] {{"The laser has to enter through the glass openings " + + "of the SILEX. Aiming it wrong could destroy it."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + + scene1.add(new ActionWait(60)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 12, 32, new Object[][] {{"The openings on the sides can be used to connect " + + "fluid ducts to the SILEX."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(3)); + scene1.add(new ActionWait(10)); + + TileEntityPipeBaseNT duct = new TileEntityPipeBaseNT(); + duct.setType(Fluids.ACID); + scene1.add(new ActionSetTile(5, 2, 0, duct)); + scene1.add(new ActionSetTile(5, 1, 0, duct)); + scene1.add(new ActionSetTile(6, 1, 0, duct)); + scene1.add(new ActionSetTile(7, 1, 0, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(5, 2, 1, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetBlock(5, 2, 0, ModBlocks.fluid_duct_neo)); + scene1.add(new ActionSetBlock(5, 1, 0, ModBlocks.fluid_duct_neo)); + scene1.add(new ActionSetBlock(6, 1, 0, ModBlocks.fluid_duct_neo)); + scene1.add(new ActionSetBlock(7, 1, 0, ModBlocks.barrel_tcalloy)); + + scene1.add(new ActionWait(20)); + scene1.add(new ActionUpdateActor(0, "mode", 3)); + scene1.add(new ActionWait(10)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{"In addition to the two connectors on the sides, " + + "there is a third hidden connector at the bottom from which items can be extracted."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionWait(80)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{"Each recipe requires a specific laser type. " + + "Using a stronger type than required will process items faster."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionWait(60)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{"One FEL can supply up to 5 SILEX. Each SILEX has " + + "to be one block apart from one another."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(3)); + scene1.add(new ActionWait(10)); + + NBTTagCompound silex1 = new NBTTagCompound(); + silex1.setDouble("x", 1D); + silex1.setDouble("y", 1D); + silex1.setDouble("z", 2D); + silex1.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(2, new ActorTileEntity(new ActorSILEX(), silex1))); + scene1.add(new ActionWait(10)); + + for(int i = 1; i < 5; i++) { + scene1.add(new ActionSetTile(i, 1, 0, duct)); + scene1.add(new ActionSetBlock(i, 1, 0, ModBlocks.fluid_duct_neo)); + } + scene1.add(new ActionSetTile(1, 2, 0, duct)); + scene1.add(new ActionSetBlock(1, 2, 0, ModBlocks.fluid_duct_neo)); + scene1.add(new ActionSetTile(1, 2, 1, new Dummies.JarDummyConnector())); + + scene1.add(new ActionWait(20)); + + script.addScene(scene0).addScene(scene1); + return script; + } + + public static class ActorFEL implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + int mode = data.getInteger("mode"); + int length = data.getInteger("length"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.fel_tex); + ResourceManager.fel.renderAll(); + + GL11.glTranslated(0, 1.5, -1.5); + if(mode > 0 && mode < 6) { + EnumWavelengths wave = EnumWavelengths.values()[mode]; + int color = wave.guiColor; + if(color == 0) + color = Color.HSBtoRGB(Minecraft.getMinecraft().theWorld.getTotalWorldTime() / 50.0F, 0.5F, 0.1F) & 16777215; + + BeamPronter.prontBeamwithDepth(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.SPIRAL, EnumBeamType.SOLID, color, color, 0, 1, 0F, 2, 0.0625F); + BeamPronter.prontBeamwithDepth(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.RANDOM, EnumBeamType.SOLID, color, color, (int)(Minecraft.getMinecraft().theWorld.getTotalWorldTime() % 1000 / 2), (length / 2) + 1, 0.0625F, 2, 0.0625F); + } + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } + } + + public static class ActorSILEX implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.silex_tex); + ResourceManager.silex.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } + } +} From 003177cba4ef6fcf404e89421bd175ee7e8f1845 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 31 Aug 2022 16:35:07 +0200 Subject: [PATCH 037/111] he's dead :tada: :tada: :tada: --- src/main/java/com/hbm/blocks/ModBlocks.java | 6 - .../blocks/machine/FactoryCoreAdvanced.java | 81 ------ .../blocks/machine/FactoryCoreTitanium.java | 82 ------ .../com/hbm/blocks/machine/FactoryHatch.java | 2 - .../inventory/recipes/ChemplantRecipes.java | 32 --- .../hbm/inventory/recipes/MagicRecipes.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 48 +--- .../com/hbm/items/machine/ItemBattery.java | 4 +- src/main/java/com/hbm/lib/Library.java | 9 - .../java/com/hbm/main/CraftingManager.java | 9 +- src/main/java/com/hbm/main/MainRegistry.java | 13 + .../java/com/hbm/tileentity/TileMappings.java | 2 - .../machine/TileEntityCoreAdvanced.java | 250 ----------------- .../machine/TileEntityCoreTitanium.java | 253 ------------------ .../java/com/hbm/world/dungeon/Factory.java | 144 +++++----- src/main/java/com/hbm/world/feature/Dud.java | 6 - 16 files changed, 99 insertions(+), 844 deletions(-) delete mode 100644 src/main/java/com/hbm/blocks/machine/FactoryCoreAdvanced.java delete mode 100644 src/main/java/com/hbm/blocks/machine/FactoryCoreTitanium.java delete mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityCoreAdvanced.java delete mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityCoreTitanium.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 8e507f00f..940a58afc 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -812,12 +812,10 @@ public class ModBlocks { public static Block factory_titanium_hull; @Deprecated public static Block factory_titanium_furnace; @Deprecated public static Block factory_titanium_conductor; - @Deprecated public static Block factory_titanium_core; public static Block factory_advanced_hull; @Deprecated public static Block factory_advanced_furnace; @Deprecated public static Block factory_advanced_conductor; - @Deprecated public static Block factory_advanced_core; public static Block reactor_element; public static Block reactor_control; @@ -1979,11 +1977,9 @@ public class ModBlocks { factory_titanium_hull = new BlockGeneric(Material.iron).setBlockName("factory_titanium_hull").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_hull"); factory_titanium_furnace = new FactoryHatch(Material.iron).setBlockName("factory_titanium_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_furnace"); factory_titanium_conductor = new BlockPillar(Material.iron, RefStrings.MODID + ":factory_titanium_conductor").setBlockName("factory_titanium_conductor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_hull"); - factory_titanium_core = new FactoryCoreTitanium(Material.iron).setBlockName("factory_titanium_core").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_core"); factory_advanced_hull = new BlockGeneric(Material.iron).setBlockName("factory_advanced_hull").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_hull"); factory_advanced_furnace = new FactoryHatch(Material.iron).setBlockName("factory_advanced_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_furnace"); factory_advanced_conductor = new BlockPillar(Material.iron, RefStrings.MODID + ":factory_advanced_conductor").setBlockName("factory_advanced_conductor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_hull"); - factory_advanced_core = new FactoryCoreAdvanced(Material.iron).setBlockName("factory_advanced_core").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_core"); reactor_element = new BlockPillar(Material.iron, RefStrings.MODID + ":reactor_element_top", RefStrings.MODID + ":reactor_element_base").setBlockName("reactor_element").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":reactor_element_side"); reactor_control = new BlockPillar(Material.iron, RefStrings.MODID + ":reactor_control_top").setBlockName("reactor_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":reactor_control_side"); @@ -3234,11 +3230,9 @@ public class ModBlocks { GameRegistry.registerBlock(factory_titanium_hull, factory_titanium_hull.getUnlocalizedName()); GameRegistry.registerBlock(factory_titanium_furnace, factory_titanium_furnace.getUnlocalizedName()); GameRegistry.registerBlock(factory_titanium_conductor, factory_titanium_conductor.getUnlocalizedName()); - GameRegistry.registerBlock(factory_titanium_core, factory_titanium_core.getUnlocalizedName()); GameRegistry.registerBlock(factory_advanced_hull, factory_advanced_hull.getUnlocalizedName()); GameRegistry.registerBlock(factory_advanced_furnace, factory_advanced_furnace.getUnlocalizedName()); GameRegistry.registerBlock(factory_advanced_conductor, factory_advanced_conductor.getUnlocalizedName()); - GameRegistry.registerBlock(factory_advanced_core, factory_advanced_core.getUnlocalizedName()); //The Fluid Inserter //GameRegistry.registerBlock(machine_inserter, machine_inserter.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/FactoryCoreAdvanced.java b/src/main/java/com/hbm/blocks/machine/FactoryCoreAdvanced.java deleted file mode 100644 index 63709f047..000000000 --- a/src/main/java/com/hbm/blocks/machine/FactoryCoreAdvanced.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.tileentity.machine.TileEntityCoreAdvanced; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class FactoryCoreAdvanced extends BlockContainer { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; - - public FactoryCoreAdvanced(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityCoreAdvanced(); - } - - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) - { - if (!keepInventory) - { - TileEntityCoreAdvanced tileentityfurnace = (TileEntityCoreAdvanced)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if (tileentityfurnace != null) - { - for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) - { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.field_149933_a.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float)this.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } -} diff --git a/src/main/java/com/hbm/blocks/machine/FactoryCoreTitanium.java b/src/main/java/com/hbm/blocks/machine/FactoryCoreTitanium.java deleted file mode 100644 index 9fff1f9b2..000000000 --- a/src/main/java/com/hbm/blocks/machine/FactoryCoreTitanium.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.tileentity.machine.TileEntityCoreTitanium; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class FactoryCoreTitanium extends BlockContainer { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; - - public FactoryCoreTitanium(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityCoreTitanium(); - } - - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) - { - if (!keepInventory) - { - TileEntityCoreTitanium tileentityfurnace = (TileEntityCoreTitanium)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if (tileentityfurnace != null) - { - for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) - { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.field_149933_a.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float)this.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } - -} diff --git a/src/main/java/com/hbm/blocks/machine/FactoryHatch.java b/src/main/java/com/hbm/blocks/machine/FactoryHatch.java index b86e508a3..55d64c79d 100644 --- a/src/main/java/com/hbm/blocks/machine/FactoryHatch.java +++ b/src/main/java/com/hbm/blocks/machine/FactoryHatch.java @@ -5,8 +5,6 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityCoreAdvanced; -import com.hbm.tileentity.machine.TileEntityCoreTitanium; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java index bb3cc2522..6144d31bf 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java @@ -142,38 +142,6 @@ public class ChemplantRecipes extends SerializableRecipe { new OreDictStack(S.dust(), 2)) .inputFluids(new FluidStack(Fluids.ACID, 2000)) .outputFluids(new FluidStack(Fluids.SAS3, 1000))); - recipes.add(new ChemRecipe(50, "DYN_SCHRAB", 1200) - .inputItems( - new ComparableStack(ModItems.dynosphere_desh_charged, 3), - new OreDictStack(U.ingot()), - new ComparableStack(ModItems.catalyst_clay, 8)) - .outputItems( - new ItemStack(ModItems.ingot_schrabidium), - new ItemStack(ModItems.powder_desh, 12), - new ItemStack(ModItems.powder_desh_mix, 12)) - .outputFluids(new FluidStack(Fluids.WATZ, 50))); - recipes.add(new ChemRecipe(51, "DYN_EUPH", 3600) - .inputItems( - new ComparableStack(ModItems.dynosphere_schrabidium_charged, 1), - new OreDictStack(PU.ingot()), - new ComparableStack(ModItems.catalyst_clay, 16), - new OreDictStack(EUPH.ingot())) - .outputItems( - new ItemStack(ModItems.nugget_euphemium, 12), - new ItemStack(ModItems.powder_schrabidium, 4), - new ItemStack(ModItems.powder_power, 4)) - .outputFluids(new FluidStack(Fluids.WATZ, 100))); - recipes.add(new ChemRecipe(52, "DYN_DNT", 6000) - .inputItems( - new ComparableStack(ModItems.dynosphere_euphemium_charged, 2), - new ComparableStack(ModItems.powder_spark_mix), - new ComparableStack(ModItems.ingot_starmetal), - new ComparableStack(ModItems.catalyst_clay, 32)) - .outputItems( - new ItemStack(ModItems.ingot_dineutronium), - new ItemStack(ModItems.powder_euphemium, 8), - new ItemStack(ModItems.powder_nitan_mix, 8)) - .outputFluids(new FluidStack(Fluids.WATZ, 150))); recipes.add(new ChemRecipe(53, "CORDITE", 40) .inputItems( new OreDictStack(KNO.dust(), 2), diff --git a/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java b/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java index 3cb813da8..ada0f7399 100644 --- a/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java @@ -42,7 +42,7 @@ public class MagicRecipes { recipes.add(new MagicRecipe(new ItemStack(ModItems.rod_of_discord), new ComparableStack(Items.ender_pearl), new ComparableStack(Items.blaze_rod), new ComparableStack(ModItems.nugget_euphemium))); recipes.add(new MagicRecipe(new ItemStack(ModItems.balefire_and_steel), new OreDictStack("ingotSteel"), new ComparableStack(ModItems.egg_balefire_shard))); recipes.add(new MagicRecipe(new ItemStack(ModItems.mysteryshovel), new ComparableStack(Items.iron_shovel), new ComparableStack(Items.bone), new ComparableStack(ModItems.ingot_starmetal), new ComparableStack(ModItems.ducttape))); - recipes.add(new MagicRecipe(new ItemStack(ModItems.ingot_electronium), new ComparableStack(ModItems.dynosphere_dineutronium_charged), new ComparableStack(ModItems.dynosphere_dineutronium_charged), new ComparableStack(ModItems.dynosphere_dineutronium_charged), new ComparableStack(ModItems.dynosphere_dineutronium_charged))); + recipes.add(new MagicRecipe(new ItemStack(ModItems.ingot_electronium), new ComparableStack(ModItems.pellet_charged), new ComparableStack(ModItems.pellet_charged), new ComparableStack(ModItems.ingot_dineutronium), new ComparableStack(ModItems.ingot_dineutronium))); recipes.add(new MagicRecipe(new ItemStack(ModItems.ammo_44_pip), new ComparableStack(ModItems.ammo_44), diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 2bd682de5..9b54ad396 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -882,13 +882,13 @@ public class ModItems { @Deprecated public static Item canister_NITAN; @Deprecated public static Item canister_fracksol; - public static Item canister_heavyoil; - public static Item canister_bitumen; - public static Item canister_heatingoil; - public static Item canister_naphtha; - public static Item canister_lightoil; - public static Item canister_biofuel; - public static Item canister_ethanol; + @Deprecated public static Item canister_heavyoil; + @Deprecated public static Item canister_bitumen; + @Deprecated public static Item canister_heatingoil; + @Deprecated public static Item canister_naphtha; + @Deprecated public static Item canister_lightoil; + @Deprecated public static Item canister_biofuel; + @Deprecated public static Item canister_ethanol; public static Item gas_empty; public static Item gas_full; @@ -1925,7 +1925,7 @@ public class ModItems { public static Item arc_electrode; public static Item arc_electrode_burnt; public static Item arc_electrode_desh; - public static Item dynosphere_base; + /*public static Item dynosphere_base; public static Item dynosphere_desh; public static Item dynosphere_desh_charged; public static Item dynosphere_schrabidium; @@ -1933,12 +1933,12 @@ public class ModItems { public static Item dynosphere_euphemium; public static Item dynosphere_euphemium_charged; public static Item dynosphere_dineutronium; - public static Item dynosphere_dineutronium_charged; + public static Item dynosphere_dineutronium_charged;*/ public static Item tank_waste; - public static Item factory_core_titanium; - public static Item factory_core_advanced; + /*public static Item factory_core_titanium; + public static Item factory_core_advanced;*/ public static Item upgrade_template; public static Item upgrade_speed_1; @@ -4676,19 +4676,6 @@ public class ModItems { arc_electrode_burnt = new Item().setUnlocalizedName("arc_electrode_burnt").setMaxStackSize(1).setFull3D().setTextureName(RefStrings.MODID + ":arc_electrode_burnt"); arc_electrode_desh = new ItemCustomLore().setUnlocalizedName("arc_electrode_desh").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setFull3D().setTextureName(RefStrings.MODID + ":arc_electrode_desh"); - dynosphere_base = new Item().setUnlocalizedName("dynosphere_base").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_base"); - dynosphere_desh = new ItemBattery(1000000L, 10000L, 0).setUnlocalizedName("dynosphere_desh").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_desh"); - dynosphere_desh_charged = new Item().setUnlocalizedName("dynosphere_desh_charged").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_desh_charged"); - dynosphere_schrabidium = new ItemBattery(100000000L, 500000L, 0).setUnlocalizedName("dynosphere_schrabidium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_schrabidium"); - dynosphere_schrabidium_charged = new Item().setUnlocalizedName("dynosphere_schrabidium_charged").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_schrabidium_charged"); - dynosphere_euphemium = new ItemBattery(10000000000L, 25000000L, 0).setUnlocalizedName("dynosphere_euphemium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_euphemium"); - dynosphere_euphemium_charged = new Item().setUnlocalizedName("dynosphere_euphemium_charged").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_euphemium_charged"); - dynosphere_dineutronium = new ItemBattery(1000000000000L, 1250000000L, 0).setUnlocalizedName("dynosphere_dineutronium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_dineutronium"); - dynosphere_dineutronium_charged = new Item().setUnlocalizedName("dynosphere_dineutronium_charged").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_dineutronium_charged"); - - factory_core_titanium = new ItemBattery(7040000, 1000, 0).setUnlocalizedName("factory_core_titanium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":factory_core_titanium"); - factory_core_advanced = new ItemBattery(4160000, 1000, 0).setUnlocalizedName("factory_core_advanced").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":factory_core_advanced"); - ams_focus_blank = new Item().setUnlocalizedName("ams_focus_blank").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":ams_focus_blank"); ams_focus_limiter = new ItemCustomLore().setUnlocalizedName("ams_focus_limiter").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":ams_focus_limiter"); ams_focus_booster = new ItemCustomLore().setUnlocalizedName("ams_focus_booster").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":ams_focus_booster"); @@ -6586,19 +6573,6 @@ public class ModItems { GameRegistry.registerItem(fusion_core, fusion_core.getUnlocalizedName()); GameRegistry.registerItem(energy_core, energy_core.getUnlocalizedName()); GameRegistry.registerItem(fusion_core_infinite, fusion_core_infinite.getUnlocalizedName()); - GameRegistry.registerItem(factory_core_titanium, factory_core_titanium.getUnlocalizedName()); - GameRegistry.registerItem(factory_core_advanced, factory_core_advanced.getUnlocalizedName()); - - //Dynospheres - GameRegistry.registerItem(dynosphere_base, dynosphere_base.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_desh, dynosphere_desh.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_desh_charged, dynosphere_desh_charged.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_schrabidium, dynosphere_schrabidium.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_schrabidium_charged, dynosphere_schrabidium_charged.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_euphemium, dynosphere_euphemium.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_euphemium_charged, dynosphere_euphemium_charged.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_dineutronium, dynosphere_dineutronium.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_dineutronium_charged, dynosphere_dineutronium_charged.getUnlocalizedName()); //Folders GameRegistry.registerItem(template_folder, template_folder.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemBattery.java b/src/main/java/com/hbm/items/machine/ItemBattery.java index 427ad2767..3f281f9e2 100644 --- a/src/main/java/com/hbm/items/machine/ItemBattery.java +++ b/src/main/java/com/hbm/items/machine/ItemBattery.java @@ -33,7 +33,7 @@ public class ItemBattery extends Item implements IBatteryItem { if(itemstack.hasTagCompound()) charge = getCharge(itemstack); - if(itemstack.getItem() != ModItems.fusion_core && itemstack.getItem() != ModItems.factory_core_titanium && itemstack.getItem() != ModItems.factory_core_advanced && itemstack.getItem() != ModItems.energy_core && itemstack.getItem() != ModItems.dynosphere_desh && itemstack.getItem() != ModItems.dynosphere_schrabidium && itemstack.getItem() != ModItems.dynosphere_euphemium && itemstack.getItem() != ModItems.dynosphere_dineutronium) { + if(itemstack.getItem() != ModItems.fusion_core && itemstack.getItem() != ModItems.energy_core) { list.add("Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); } else { String charge1 = BobMathUtil.getShortNumber((charge * 100) / this.maxCharge); @@ -51,7 +51,7 @@ public class ItemBattery extends Item implements IBatteryItem { return EnumRarity.rare; } - if(this == ModItems.fusion_core || this == ModItems.factory_core_titanium || this == ModItems.factory_core_advanced || this == ModItems.energy_core || this == ModItems.dynosphere_desh || this == ModItems.dynosphere_schrabidium || this == ModItems.dynosphere_euphemium || this == ModItems.dynosphere_dineutronium) { + if(this == ModItems.fusion_core || this == ModItems.energy_core) { return EnumRarity.uncommon; } diff --git a/src/main/java/com/hbm/lib/Library.java b/src/main/java/com/hbm/lib/Library.java index 6e13476dc..a4cd31470 100644 --- a/src/main/java/com/hbm/lib/Library.java +++ b/src/main/java/com/hbm/lib/Library.java @@ -355,15 +355,6 @@ public class Library { power -= toCharge; battery.chargeBattery(slots[index], toCharge); - - if(slots[index] != null && slots[index].getItem() == ModItems.dynosphere_desh && battery.getCharge(slots[index]) >= battery.getMaxCharge()) - slots[index] = new ItemStack(ModItems.dynosphere_desh_charged); - if(slots[index] != null && slots[index].getItem() == ModItems.dynosphere_schrabidium && battery.getCharge(slots[index]) >= battery.getMaxCharge()) - slots[index] = new ItemStack(ModItems.dynosphere_schrabidium_charged); - if(slots[index] != null && slots[index].getItem() == ModItems.dynosphere_euphemium && battery.getCharge(slots[index]) >= battery.getMaxCharge()) - slots[index] = new ItemStack(ModItems.dynosphere_euphemium_charged); - if(slots[index] != null && slots[index].getItem() == ModItems.dynosphere_dineutronium && battery.getCharge(slots[index]) >= battery.getMaxCharge()) - slots[index] = new ItemStack(ModItems.dynosphere_dineutronium_charged); } return power; diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 34f8aea09..dd73cdd3e 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -591,13 +591,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.inf_water, 1), new Object[] { "222", "131", "222", '1', Items.water_bucket, '2', AL.plate(), '3', DIAMOND.gem() }); addRecipeAuto(new ItemStack(ModItems.inf_water_mk2, 1), new Object[] { "BPB", "PTP", "BPB", 'B', ModItems.inf_water, 'P', ModBlocks.fluid_duct, 'T', ModItems.tank_steel }); - - addRecipeAuto(new ItemStack(ModItems.dynosphere_base), new Object[] { "RPR", "PBP", "RPR", 'R', MINGRADE.dust(), 'P', STEEL.plate(), 'B', REDSTONE.block() }); - addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.dynosphere_desh), new Object[] { "RPR", "PBP", "RPR", 'R', ModItems.powder_desh_mix, 'P', DESH.ingot(), 'B', ModItems.dynosphere_base }); - addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.dynosphere_schrabidium), new Object[] { "RPR", "PBP", "RPR", 'R', ModItems.powder_power, 'P', SA326.ingot(), 'B', ModItems.dynosphere_desh_charged }); - addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.dynosphere_euphemium), new Object[] { "RPR", "PBP", "RPR", 'R', ModItems.powder_nitan_mix, 'P', EUPH.ingot(), 'B', ModItems.dynosphere_schrabidium_charged }); - addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.dynosphere_dineutronium), new Object[] { "RPR", "PBP", "RPR", 'R', ModItems.powder_spark_mix, 'P', DNT.ingot(), 'B', ModItems.dynosphere_euphemium_charged }); - //not so Temporary Crappy Recipes addRecipeAuto(new ItemStack(ModItems.piston_selenium, 1), new Object[] { "SSS", "STS", " D ", 'S', STEEL.plate(), 'T', W.ingot(), 'D', ModItems.bolt_dura_steel }); addShapelessAuto(new ItemStack(ModItems.catalyst_clay), new Object[] { IRON.dust(), Items.clay_ball }); @@ -719,7 +712,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModBlocks.sand_lead, 8), new Object[] { "sand", "sand", "sand", "sand", "sand", "sand", "sand", "sand", PB.dust() }); addShapelessAuto(new ItemStack(ModBlocks.sand_quartz, 1), new Object[] { "sand", "sand", NETHERQUARTZ.dust(), NETHERQUARTZ.dust() }); - addRecipeAuto(new ItemStack(ModItems.rune_blank, 1), new Object[] { "PSP", "SDS", "PSP", 'P', ModItems.powder_magic, 'S', STAR.ingot(), 'D', ModItems.dynosphere_dineutronium_charged }); + addRecipeAuto(new ItemStack(ModItems.rune_blank, 1), new Object[] { "PSP", "SDS", "PSP", 'P', ModItems.powder_magic, 'S', STAR.ingot(), 'D', KEY_CIRCUIT_BISMUTH }); addShapelessAuto(new ItemStack(ModItems.rune_isa, 1), new Object[] { ModItems.rune_blank, ModItems.powder_spark_mix, ModItems.singularity_counter_resonant }); addShapelessAuto(new ItemStack(ModItems.rune_dagaz, 1), new Object[] { ModItems.rune_blank, ModItems.powder_spark_mix, ModItems.singularity }); addShapelessAuto(new ItemStack(ModItems.rune_hagalaz, 1), new Object[] { ModItems.rune_blank, ModItems.powder_spark_mix, ModItems.singularity_super_heated }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index d04e5c040..65a18d204 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -915,6 +915,19 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.sellafield_core"); ignoreMappings.add("hbm:tile.fusion_core"); ignoreMappings.add("hbm:tile.machine_telelinker"); + ignoreMappings.add("hbm:item.dynosphere_base"); + ignoreMappings.add("hbm:item.dynosphere_desh"); + ignoreMappings.add("hbm:item.dynosphere_desh_charged"); + ignoreMappings.add("hbm:item.dynosphere_schrabidium"); + ignoreMappings.add("hbm:item.dynosphere_schrabidium_charged"); + ignoreMappings.add("hbm:item.dynosphere_euphemium"); + ignoreMappings.add("hbm:item.dynosphere_euphemium_charged"); + ignoreMappings.add("hbm:item.dynosphere_dineutronium"); + ignoreMappings.add("hbm:item.dynosphere_dineutronium_charged"); + ignoreMappings.add("hbm:item.factory_core_titanium"); + ignoreMappings.add("hbm:item.factory_core_advanced"); + ignoreMappings.add("hbm:tile.factory_titanium_core"); + ignoreMappings.add("hbm:tile.factory_advanced_core"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index c1c42a6fe..96ce3d2c0 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -59,8 +59,6 @@ public class TileMappings { put(TileEntityDecoBlockAltW.class, "tileentity_deco_w"); put(TileEntityDecoBlockAltG.class, "tileentity_deco_g"); put(TileEntityDecoBlockAltF.class, "tileentity_deco_f"); - put(TileEntityCoreTitanium.class, "tileentity_core_titanium"); - put(TileEntityCoreAdvanced.class, "tileentity_core_advanced"); put(TileEntityCrashedBomb.class, "tileentity_crashed_balefire"); put(TileEntityConverterHeRf.class, "tileentity_converter_herf"); put(TileEntityConverterRfHe.class, "tileentity_converter_rfhe"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreAdvanced.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreAdvanced.java deleted file mode 100644 index 27e1b8b90..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreAdvanced.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.hbm.tileentity.machine; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IFactory; -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemBattery; -import com.hbm.tileentity.TileEntityLoadedBase; - -import api.hbm.energy.IBatteryItem; -import api.hbm.energy.IEnergyUser; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityCoreAdvanced extends TileEntityLoadedBase implements ISidedInventory, IFactory, IEnergyUser { - - public int progress = 0; - public long power = 0; - public int soundCycle = 0; - public final static int processTime = 100; - public final static int maxPower = (int)((ItemBattery)ModItems.factory_core_advanced).getMaxCharge(); - private ItemStack slots[]; - - private String customName; - - public TileEntityCoreAdvanced() { - slots = new ItemStack[27]; - } - @Override - public int getSizeInventory() { - return slots.length; - } - - @Override - public ItemStack getStackInSlot(int i) { - return slots[i]; - } - - @Override - public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } else { - return null; - } - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemStack) { - slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { - itemStack.stackSize = getInventoryStackLimit(); - } - } - - @Override - public String getInventoryName() { - return this.hasCustomInventoryName() ? this.customName : "container.factoryAdvanced"; - } - - @Override - public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; - } - - public void setCustomName(String name) { - this.customName = name; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { - return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; - } - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - return true; - } - - @Override - public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } - ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { - slots[i] = null; - } - - return itemStack1; - } else { - return null; - } - } - - @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return new int[0]; - } - - @Override - public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { - return false; - } - - @Override - public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { - return false; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList list = nbt.getTagList("items", 10); - - this.progress = nbt.getShort("cookTime"); - slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setShort("cookTime", (short) progress); - NBTTagList list = new NBTTagList(); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - nbt.setTag("items", list); - } - - @Override - public boolean isStructureValid(World world) { - if(world.getBlock(this.xCoord, this.yCoord, this.zCoord) == ModBlocks.factory_advanced_core && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord) == ModBlocks.factory_advanced_hull && - (world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == ModBlocks.factory_advanced_conductor || world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == ModBlocks.factory_advanced_hull) && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord, this.zCoord - 1) == ModBlocks.factory_advanced_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord) == ModBlocks.factory_advanced_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord) == ModBlocks.factory_advanced_furnace && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord, this.zCoord + 1) == ModBlocks.factory_advanced_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord) == ModBlocks.factory_advanced_hull && - (world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) == ModBlocks.factory_advanced_conductor || world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) == ModBlocks.factory_advanced_hull) && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull) - { - return true; - } - return false; - } - - @Override - public long getPowerScaled(long i) { - return (power * i) / maxPower; - } - - @Override - public int getProgressScaled(int i) { - return (progress * i) / processTime; - } - - @Override - public boolean isProcessable(ItemStack item) { - if(item != null) - { - return FurnaceRecipes.smelting().getSmeltingResult(item) != null; - } else { - return false; - } - } - - @Override - public void updateEntity() { } - - @Override - public void setPower(long i) { } - - @Override - public long getPower() { - return power; - } - @Override - public long getMaxPower() { - return maxPower; - } -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreTitanium.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreTitanium.java deleted file mode 100644 index 1af5b3cfd..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreTitanium.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.hbm.tileentity.machine; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IFactory; -import com.hbm.interfaces.Spaghetti; -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemBattery; -import com.hbm.tileentity.TileEntityLoadedBase; - -import api.hbm.energy.IBatteryItem; -import api.hbm.energy.IEnergyUser; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityCoreTitanium extends TileEntityLoadedBase implements ISidedInventory, IFactory, IEnergyUser { - - public int progress = 0; - public long power = 0; - public int soundCycle = 0; - public final static int processTime = 200; - public final static int maxPower = (int)((ItemBattery)ModItems.factory_core_titanium).getMaxCharge(); - private ItemStack slots[]; - - private String customName; - - public TileEntityCoreTitanium() { - slots = new ItemStack[23]; - } - @Override - public int getSizeInventory() { - return slots.length; - } - - @Override - public ItemStack getStackInSlot(int i) { - return slots[i]; - } - - @Override - public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } else { - return null; - } - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemStack) { - slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { - itemStack.stackSize = getInventoryStackLimit(); - } - } - - @Override - public String getInventoryName() { - return this.hasCustomInventoryName() ? this.customName : "container.factoryTitanium"; - } - - @Override - public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; - } - - public void setCustomName(String name) { - this.customName = name; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { - return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; - } - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - return true; - } - - @Override - public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } - ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { - slots[i] = null; - } - - return itemStack1; - } else { - return null; - } - } - - @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return new int[0]; - } - - @Override - public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { - return false; - } - - @Override - public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { - return false; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList list = nbt.getTagList("items", 10); - - this.progress = nbt.getShort("cookTime"); - slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setShort("cookTime", (short) progress); - NBTTagList list = new NBTTagList(); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - nbt.setTag("items", list); - } - - @Spaghetti("2016 bobcode *shudders*") - @Override - public boolean isStructureValid(World world) { - if(world.getBlock(this.xCoord, this.yCoord, this.zCoord) == ModBlocks.factory_titanium_core && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord) == ModBlocks.factory_titanium_hull && - (world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == ModBlocks.factory_titanium_conductor || world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == ModBlocks.factory_titanium_hull) && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord, this.zCoord - 1) == ModBlocks.factory_titanium_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord) == ModBlocks.factory_titanium_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord) == ModBlocks.factory_titanium_furnace && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord, this.zCoord + 1) == ModBlocks.factory_titanium_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord) == ModBlocks.factory_titanium_hull && - (world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) == ModBlocks.factory_titanium_conductor || world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) == ModBlocks.factory_titanium_hull) && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull) - { - return true; - } - return false; - } - - @Override - public long getPowerScaled(long i) { - return (power * i) / maxPower; - } - - @Override - public int getProgressScaled(int i) { - return (progress * i) / processTime; - } - - @Override - public boolean isProcessable(ItemStack item) { - if(item != null) - { - return FurnaceRecipes.smelting().getSmeltingResult(item) != null; - } else { - return false; - } - } - - @Override - public void updateEntity() { } - - @Override - public void setPower(long i) { } - - @Override - public long getPower() { - return power; - } - @Override - public long getMaxPower() { - return maxPower; - } - -} diff --git a/src/main/java/com/hbm/world/dungeon/Factory.java b/src/main/java/com/hbm/world/dungeon/Factory.java index 970f789fe..f8446778c 100644 --- a/src/main/java/com/hbm/world/dungeon/Factory.java +++ b/src/main/java/com/hbm/world/dungeon/Factory.java @@ -7,7 +7,6 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.lib.HbmChestContents; -import com.hbm.main.MainRegistry; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -21,7 +20,6 @@ public class Factory extends WorldGenerator { Block Block1 = ModBlocks.steel_scaffold; Block Block2 = ModBlocks.red_barrel; - Block Block3 = ModBlocks.factory_titanium_core; Block Block4 = ModBlocks.steel_wall; Block Block5 = ModBlocks.reinforced_light; @@ -594,9 +592,9 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 3, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 4, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 4, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 0, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 4, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 4, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 9, y + 0, z + 4, Blocks.chest, 5, 3); world.setBlockMetadataWithNotify(x + 9, y + 0, z + 4, 5, 3); if(world.getBlock(x + 9, y + 0, z + 4) == Blocks.chest) @@ -607,16 +605,16 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 4, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 5, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 5, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 5, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 5, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 5, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 5, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 5, Blocks.chest, 4, 3); world.setBlock(x + 14, y + 0, z + 5, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 6, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 6, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 6, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 6, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 6, Blocks.hopper, 2, 3); world.setBlock(x + 14, y + 0, z + 6, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 7, Blocks.stonebrick, 0, 3); @@ -630,9 +628,9 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 9, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 10, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 10, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 0, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 10, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 10, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 9, y + 0, z + 10, Blocks.chest, 5, 3); world.setBlockMetadataWithNotify(x + 9, y + 0, z + 10, 5, 3); if(world.getBlock(x + 9, y + 0, z + 10) == Blocks.chest) @@ -643,16 +641,16 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 10, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 11, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 11, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 11, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 11, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 11, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 11, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 11, Blocks.chest, 4, 3); world.setBlock(x + 14, y + 0, z + 11, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 12, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 12, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 12, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 12, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 12, Blocks.hopper, 2, 3); world.setBlock(x + 14, y + 0, z + 12, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 13, Blocks.stonebrick, 0, 3); @@ -666,9 +664,9 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 15, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 16, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 16, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 0, z + 16, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 16, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 16, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 16, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 16, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 16, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 9, y + 0, z + 16, Blocks.chest, 5, 3); world.setBlockMetadataWithNotify(x + 9, y + 0, z + 16, 5, 3); if(world.getBlock(x + 9, y + 0, z + 16) == Blocks.chest) @@ -679,16 +677,16 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 16, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 17, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 17, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 17, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 17, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 17, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 17, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 17, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 17, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 17, Blocks.chest, 4, 3); world.setBlock(x + 14, y + 0, z + 17, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 18, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 18, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 18, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 18, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 18, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 18, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 18, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 18, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 18, Blocks.hopper, 2, 3); world.setBlock(x + 14, y + 0, z + 18, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 19, Blocks.stonebrick, 0, 3); @@ -798,23 +796,23 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 1, z + 3, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 4, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 4, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 1, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 4, ModBlocks.factory_titanium_furnace, 2, 3); - world.setBlock(x + 8, y + 1, z + 4, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 4, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 4, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 4, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 5, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 5, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 5, ModBlocks.factory_titanium_furnace, 4, 3); - world.setBlock(x + 7, y + 1, z + 5, Block3, 0, 3); - world.setBlock(x + 8, y + 1, z + 5, ModBlocks.factory_titanium_furnace, 5, 3); + world.setBlock(x + 6, y + 1, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 5, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 5, Blocks.stone_brick_stairs, 4, 3); world.setBlock(x + 14, y + 1, z + 5, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 6, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 6, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 6, ModBlocks.factory_titanium_furnace, 3, 3); - world.setBlock(x + 8, y + 1, z + 6, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 6, ModBlocks.deco_steel, 3, 3); + world.setBlock(x + 8, y + 1, z + 6, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 6, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 6, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 7, Blocks.stonebrick, 0, 3); @@ -827,23 +825,23 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 1, z + 9, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 10, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 10, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 1, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 10, ModBlocks.factory_titanium_furnace, 2, 3); - world.setBlock(x + 8, y + 1, z + 10, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 10, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 10, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 10, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 11, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 11, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 11, ModBlocks.factory_titanium_furnace, 4, 3); - world.setBlock(x + 7, y + 1, z + 11, Block3, 0, 3); - world.setBlock(x + 8, y + 1, z + 11, ModBlocks.factory_titanium_furnace, 5, 3); + world.setBlock(x + 6, y + 1, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 11, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 11, Blocks.stone_brick_stairs, 4, 3); world.setBlock(x + 14, y + 1, z + 11, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 12, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 12, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 12, ModBlocks.factory_titanium_furnace, 3, 3); - world.setBlock(x + 8, y + 1, z + 12, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 12, ModBlocks.deco_steel, 3, 3); + world.setBlock(x + 8, y + 1, z + 12, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 12, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 12, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 13, Blocks.stonebrick, 0, 3); @@ -856,21 +854,21 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 1, z + 15, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 16, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 16, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 1, z + 16, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 16, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 16, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 16, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 16, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 16, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 17, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 17, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 17, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 17, Block3, 0, 3); - world.setBlock(x + 8, y + 1, z + 17, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 17, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 17, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 17, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 17, Blocks.stone_brick_stairs, 4, 3); world.setBlock(x + 14, y + 1, z + 17, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 18, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 18, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 18, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 18, ModBlocks.factory_titanium_furnace, 3, 3); + world.setBlock(x + 6, y + 1, z + 18, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 18, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 18, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 18, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 19, Blocks.stonebrick, 0, 3); @@ -965,19 +963,19 @@ public class Factory extends WorldGenerator world.setBlock(x + 8, y + 2, z + 3, Blocks.iron_bars, 0, 3); world.setBlock(x + 14, y + 2, z + 3, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 4, Blocks.glass, 0, 3); - world.setBlock(x + 6, y + 2, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 4, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 4, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 4, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 5, Blocks.brick_block, 0, 3); - world.setBlock(x + 6, y + 2, z + 5, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 5, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 5, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 5, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 5, Blocks.brick_block, 0, 3); world.setBlock(x + 0, y + 2, z + 6, Blocks.brick_block, 0, 3); - world.setBlock(x + 6, y + 2, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 6, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 6, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 6, Blocks.brick_block, 0, 3); world.setBlock(x + 0, y + 2, z + 7, Blocks.glass, 0, 3); world.setBlock(x + 6, y + 2, z + 7, Blocks.iron_bars, 0, 3); @@ -992,19 +990,19 @@ public class Factory extends WorldGenerator world.setBlock(x + 8, y + 2, z + 9, Blocks.iron_bars, 0, 3); world.setBlock(x + 14, y + 2, z + 9, Blocks.brick_block, 0, 3); world.setBlock(x + 0, y + 2, z + 10, Blocks.brick_block, 0, 3); - world.setBlock(x + 6, y + 2, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 10, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 10, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 10, Blocks.brick_block, 0, 3); world.setBlock(x + 0, y + 2, z + 11, Blocks.glass, 0, 3); - world.setBlock(x + 6, y + 2, z + 11, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 11, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 11, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 11, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 11, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 12, Blocks.glass, 0, 3); - world.setBlock(x + 6, y + 2, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 12, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 12, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 12, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 13, Blocks.brick_block, 0, 3); world.setBlock(x + 6, y + 2, z + 13, Blocks.iron_bars, 0, 3); @@ -1017,7 +1015,7 @@ public class Factory extends WorldGenerator world.setBlock(x + 6, y + 2, z + 15, Blocks.iron_bars, 0, 3); world.setBlock(x + 14, y + 2, z + 15, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 16, Blocks.glass, 0, 3); - world.setBlock(x + 6, y + 2, z + 16, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 16, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 16, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 17, Blocks.brick_block, 0, 3); world.setBlock(x + 14, y + 2, z + 17, Blocks.brick_block, 0, 3); diff --git a/src/main/java/com/hbm/world/feature/Dud.java b/src/main/java/com/hbm/world/feature/Dud.java index 1622cfae4..85572aa4a 100644 --- a/src/main/java/com/hbm/world/feature/Dud.java +++ b/src/main/java/com/hbm/world/feature/Dud.java @@ -13,12 +13,6 @@ import net.minecraft.world.gen.feature.WorldGenerator; public class Dud extends WorldGenerator { - Block Block1 = ModBlocks.steel_scaffold; - Block Block2 = ModBlocks.machine_difurnace_off; - Block Block3 = ModBlocks.factory_titanium_core; - Block Block4 = ModBlocks.steel_wall; - Block Block5 = ModBlocks.reinforced_light; - protected Block[] GetValidSpawnBlocks() { return new Block[] { Blocks.grass, From f45fb21d63c20801b15e5bda2a0caa917363e663 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 31 Aug 2022 22:58:03 +0200 Subject: [PATCH 038/111] firebox in a jar --- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 9 +- .../com/hbm/wiaj/actors/ActorVillager.java | 52 ++++ .../com/hbm/wiaj/cannery/CanneryFirebox.java | 226 ++++++++++++++++++ 3 files changed, 282 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/hbm/wiaj/actors/ActorVillager.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index c81b2ef69..b9b5caef2 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -142,7 +142,7 @@ public class GuiWorldInAJar extends GuiScreen { brickScene.add(new ActionWait(200)); //this.testScript.addScene(startingScene).addScene(brickScene); - this.testScript = CannerySILEX.createScript(); + this.testScript = CanneryFirebox.createScript(); renderer = new RenderBlocks(testScript.world); renderer.enableAO = true; //SKY BLUE: 0xffA5D9FF, 0xff39ACFF, 0xff1A6CA7, 0xff1A1F22 @@ -153,11 +153,10 @@ public class GuiWorldInAJar extends GuiScreen { this.drawDefaultBackground(); shittyHack = this; - if(testScript != null) { - testScript.run(); - } - try { + if(testScript != null) { + testScript.run(); + } this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); GL11.glDisable(GL11.GL_LIGHTING); this.drawGuiContainerForegroundLayer(mouseX, mouseY); diff --git a/src/main/java/com/hbm/wiaj/actors/ActorVillager.java b/src/main/java/com/hbm/wiaj/actors/ActorVillager.java new file mode 100644 index 000000000..2d4b02bed --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorVillager.java @@ -0,0 +1,52 @@ +package com.hbm.wiaj.actors; + +import org.lwjgl.opengl.GL11; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.nbt.NBTTagCompound; + +public class ActorVillager implements ISpecialActor { + + EntityVillager villager = new EntityVillager(Minecraft.getMinecraft().theWorld); + NBTTagCompound data = new NBTTagCompound(); + + public ActorVillager() { } + + public ActorVillager(NBTTagCompound data) { + this.data = data; + } + + @Override + public void drawForegroundComponent(int w, int h, int ticks, float interp) { } + + @Override + public void drawBackgroundComponent(int ticks, float interp) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + double yaw = data.getDouble("yaw"); + GL11.glTranslated(x, y, z); + GL11.glRotated(yaw, 0, 1, 0); + RenderManager.instance.renderEntityWithPosYaw(villager, 0D, 0D, 0D, 0F, interp); + } + + @Override + public void updateActor(JarScene scene) { + villager.limbSwingAmount += (1F - villager.limbSwingAmount) * 0.4F; + villager.limbSwing += villager.limbSwingAmount; + } + + @Override + public void setActorData(NBTTagCompound data) { + + } + + @Override + public void setDataPoint(String tag, Object o) { + + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java new file mode 100644 index 000000000..a234d3c68 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java @@ -0,0 +1,226 @@ +package com.hbm.wiaj.cannery; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.items.ModItems; +import com.hbm.main.ResourceManager; +import com.hbm.render.tileentity.RenderStirling; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionUpdateActor; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ActorVillager; +import com.hbm.wiaj.actors.ITileActorRenderer; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; + +public class CanneryFirebox { + + public static JarScript createScript() { + + WorldInAJar world = new WorldInAJar(5, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + scene0.add(new ActionSetZoom(3, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + scene0.add(new ActionWait(2)); + } + + scene0.add(new ActionWait(8)); + + NBTTagCompound firebox = new NBTTagCompound(); firebox.setDouble("x", 2); firebox.setDouble("y", 1); firebox.setDouble("z", 2); firebox.setInteger("rotation", 5); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorSILEX(), firebox))); + + scene0.add(new ActionWait(10)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{"The firebox burns flammable items to generate heat."}}, 150) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{"It can burn any flammable item, although higher quality " + + "fuels such as coal, coke and solid fuel burn longer and hotter."}}, 250) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + scene0.add(new ActionWait(5)); + scene0.add(new ActionUpdateActor(0, "open", true)); + scene0.add(new ActionWait(30)); + + scene0.add(new ActionUpdateActor(0, "isOn", true)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(Items.coal)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.coke)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.solid_fuel)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.rocket_fuel)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.solid_fuel_bf)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionRemoveActor(1)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionUpdateActor(0, "open", false)); + scene0.add(new ActionWait(30)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{"Heat is given off by the copper contact at the " + + "top of the firebox. Machines with an identical contact on the bottom can receive heat by being placed on top of the firebox."}}, 250) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(80)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{"If heat isn't being used up and the heat buffer " + + "becomes full, the firebox will shut off to prevent wasting of fuel."}}, 250) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + scene0.add(new ActionWait(10)); + + JarScene scene1 = new JarScene(script); + + NBTTagCompound stirling = new NBTTagCompound(); + /*stirling.setDouble("x", 2.5); + stirling.setDouble("y", 2); + stirling.setDouble("z", 2.5); + stirling.setDouble("yaw", 180); + stirling.setBoolean("hasCog", true); + scene1.add(new ActionCreateActor(1, new ActorVillager(stirling)));*/ + stirling.setDouble("x", 2); + stirling.setDouble("y", 2); + stirling.setDouble("z", 2); + stirling.setInteger("rotation", 2); + stirling.setBoolean("hasCog", true); + scene1.add(new ActionCreateActor(1, new ActorTileEntity(new RenderStirling(), stirling))); + scene1.add(new ActionUpdateActor(1, "speed", 0F)); + + scene1.add(new ActionWait(10)); + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{"One such machine is the stirling engine, which will " + + "turn heat directly into energy."}}, 250) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(2)); + scene1.add(new ActionWait(10)); + + for(int i = 0; i < 60; i++) { + scene1.add(new ActionUpdateActor(1, "speed", i / 5F)); + scene1.add(new ActionWait(1)); + } + + scene1.add(new ActionSetTile(1, 2, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(0, 2, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(0, 1, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(0, 1, 3, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetBlock(0, 2, 2, ModBlocks.red_cable)); + scene1.add(new ActionSetBlock(0, 1, 2, ModBlocks.red_cable)); + scene1.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 0)); + scene1.add(new ActionWait(10)); + scene1.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 1)); + scene1.add(new ActionWait(100)); + + script.addScene(scene0).addScene(scene1); + return script; + } + + public static class ActorSILEX implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + boolean isOn = data.getBoolean("isOn"); + float doorAngle = data.getFloat("angle"); + float prevDoorAngle = data.getFloat("lastAngle"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.heater_firebox_tex); + ResourceManager.heater_firebox.renderPart("Main"); + + GL11.glPushMatrix(); + + float door = prevDoorAngle + (doorAngle - prevDoorAngle) * interp; + GL11.glTranslated(1.375, 0, 0.375); + GL11.glRotatef(door, 0F, -1F, 0F); + GL11.glTranslated(-1.375, 0, -0.375); + ResourceManager.heater_firebox.renderPart("Door"); + GL11.glPopMatrix(); + + if(isOn) { + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + ResourceManager.heater_firebox.renderPart("InnerBurning"); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } else { + ResourceManager.heater_firebox.renderPart("InnerEmpty"); + } + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { + + boolean open = data.getBoolean("open"); + float doorAngle = data.getFloat("angle"); + data.setFloat("lastAngle", doorAngle); + + float swingSpeed = (doorAngle / 10F) + 3; + + if(open) { + doorAngle += swingSpeed; + } else { + doorAngle -= swingSpeed; + } + + doorAngle = MathHelper.clamp_float(doorAngle, 0F, 135F); + data.setFloat("angle", doorAngle); + } + } +} From 5b408de422aec3a9dc004a47f7a8de5d9b709352 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 1 Sep 2022 16:59:32 +0200 Subject: [PATCH 039/111] some plant related recipes --- src/main/java/com/hbm/items/ModItems.java | 3 +++ src/main/java/com/hbm/items/food/ItemPill.java | 9 +++++++++ src/main/java/com/hbm/main/CraftingManager.java | 4 +++- .../assets/hbm/textures/items/pill_herbal.png | Bin 0 -> 394 bytes 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/hbm/textures/items/pill_herbal.png diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 9b54ad396..9de70bc27 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -924,6 +924,7 @@ public class ModItems { public static Item radaway_flush; public static Item radx; public static Item siox; + public static Item pill_herbal; public static Item pirfenidone; public static Item xanax; public static Item fmn; @@ -3435,6 +3436,7 @@ public class ModItems { 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"); + pill_herbal = new ItemPill(0).setUnlocalizedName("pill_herbal").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":pill_herbal"); pirfenidone = new ItemPill(0).setUnlocalizedName("pirfenidone").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":pirfenidone"); xanax = new ItemPill(0).setUnlocalizedName("xanax").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":xanax_2"); fmn = new ItemPill(0).setUnlocalizedName("fmn").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":tablet"); @@ -7666,6 +7668,7 @@ public class ModItems { GameRegistry.registerItem(radaway_flush, radaway_flush.getUnlocalizedName()); GameRegistry.registerItem(radx, radx.getUnlocalizedName()); GameRegistry.registerItem(siox, siox.getUnlocalizedName()); + GameRegistry.registerItem(pill_herbal, pill_herbal.getUnlocalizedName()); GameRegistry.registerItem(pirfenidone, pirfenidone.getUnlocalizedName()); GameRegistry.registerItem(pill_iodine, pill_iodine.getUnlocalizedName()); GameRegistry.registerItem(xanax, xanax.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/food/ItemPill.java b/src/main/java/com/hbm/items/food/ItemPill.java index 5ddbf2feb..6e1144e57 100644 --- a/src/main/java/com/hbm/items/food/ItemPill.java +++ b/src/main/java/com/hbm/items/food/ItemPill.java @@ -56,6 +56,15 @@ public class ItemPill extends ItemFood { HbmLivingProps.setAsbestos(player, 0); HbmLivingProps.setBlackLung(player, Math.min(HbmLivingProps.getBlackLung(player), HbmLivingProps.maxBlacklung / 5)); } + + if(this == ModItems.pill_herbal) { + HbmLivingProps.setAsbestos(player, 0); + HbmLivingProps.setBlackLung(player, Math.min(HbmLivingProps.getBlackLung(player), HbmLivingProps.maxBlacklung / 5)); + player.addPotionEffect(new PotionEffect(Potion.confusion.id, 10 * 20, 0)); + player.addPotionEffect(new PotionEffect(Potion.weakness.id, 10 * 60 * 20, 2)); + player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 10 * 60 * 20, 2)); + player.addPotionEffect(new PotionEffect(Potion.poison.id, 5 * 20, 2)); + } if(this == ModItems.xanax) { float digamma = HbmLivingProps.getDigamma(player); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index dd73cdd3e..09117cd8e 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -213,7 +213,9 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.turbine_tungsten, 1), new Object[] { "BBB", "BSB", "BBB", 'B', ModItems.blade_tungsten, 'S', DURA.ingot() }); addRecipeAuto(new ItemStack(ModItems.ring_starmetal, 1), new Object[] { " S ", "S S", " S ", 'S', STAR.ingot() }); addRecipeAuto(new ItemStack(ModItems.flywheel_beryllium, 1), new Object[] { "BBB", "BTB", "BBB", 'B', BE.block(), 'T', ModItems.bolt_compound }); - + + addShapelessAuto(new ItemStack(ModItems.powder_poison), new Object[] { DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.NIGHTSHADE) }); + addShapelessAuto(new ItemStack(ModItems.syringe_metal_stimpak), new Object[] { ModItems.syringe_metal_empty, Items.carrot, DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.FOXGLOVE) }); //xander root and broc flower addShapelessAuto(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE, 1), new Object[] { Items.string, Items.string, Items.string }); addRecipeAuto(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE, 4), new Object[] { "W", "W", "W", 'W', DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.WEED) }); addRecipeAuto(new ItemStack(ModItems.rag, 16), new Object[] { "WW", "WW", 'W', DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.WEED) }); diff --git a/src/main/resources/assets/hbm/textures/items/pill_herbal.png b/src/main/resources/assets/hbm/textures/items/pill_herbal.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb4dd0ed3d9e2efa8ce1f7390d30c217c766570 GIT binary patch literal 394 zcmV;50d@X~P)yy8-|V;}{_n)L;ZP7(w^~T$$%G zDMQ`FN2@{Vb(M;-4}hkP12BC#&r$25e*nOX^Gu3m0MyYC0N0M?tpR{(TRgov0O*d^ z;bf5RAW@28*K64I8m4Vw+7^jY%zFcXg>n+Ve;9yfv%zQM-FpLoo!tXAHn%!+FGw5Q z74OMyXF3gXD;XZvs@?-a{t-@>P5_vjngu`)YjES%N>4c(O}7^(ljvcMh&Bd5vAoXS o0f6nGye;|07EcYTaZrCumAu607*qoM6N<$f)2i&`Tzg` literal 0 HcmV?d00001 From 00b089188b740b2326b66182e5b0f94744e0ddeb Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 1 Sep 2022 21:58:58 +0200 Subject: [PATCH 040/111] funny herb paste --- .../java/com/hbm/config/VersatileConfig.java | 6 +++++- .../java/com/hbm/items/food/ItemLemon.java | 2 +- .../java/com/hbm/items/food/ItemPill.java | 13 +++++++++++++ .../java/com/hbm/main/CraftingManager.java | 1 + src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../textures/blocks/plant_flower.foxglove.png | Bin 575 -> 313 bytes .../blocks/plant_flower.nightshade.png | Bin 468 -> 279 bytes .../textures/blocks/plant_flower.tobacco.png | Bin 451 -> 248 bytes .../textures/blocks/plant_tall.weed.lower.png | Bin 0 -> 542 bytes .../textures/blocks/plant_tall.weed.upper.png | Bin 0 -> 361 bytes .../assets/hbm/textures/gui/potions.png | Bin 3854 -> 3989 bytes 12 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.lower.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.upper.png diff --git a/src/main/java/com/hbm/config/VersatileConfig.java b/src/main/java/com/hbm/config/VersatileConfig.java index 851211b76..eae8519d9 100644 --- a/src/main/java/com/hbm/config/VersatileConfig.java +++ b/src/main/java/com/hbm/config/VersatileConfig.java @@ -1,5 +1,7 @@ package com.hbm.config; +import java.util.ArrayList; + import com.hbm.items.ModItems; import com.hbm.potion.HbmPotion; @@ -33,7 +35,9 @@ public class VersatileConfig { if(PotionConfig.potionSickness == 2) duration *= 12; - entity.addPotionEffect(new PotionEffect(HbmPotion.potionsickness.id, duration * 20)); + PotionEffect eff = new PotionEffect(HbmPotion.potionsickness.id, duration * 20); + eff.setCurativeItems(new ArrayList()); + entity.addPotionEffect(eff); } public static boolean hasPotionSickness(EntityLivingBase entity) { diff --git a/src/main/java/com/hbm/items/food/ItemLemon.java b/src/main/java/com/hbm/items/food/ItemLemon.java index e66f898c0..661661140 100644 --- a/src/main/java/com/hbm/items/food/ItemLemon.java +++ b/src/main/java/com/hbm/items/food/ItemLemon.java @@ -45,7 +45,7 @@ public class ItemLemon extends ItemFood { if(this == ModItems.med_ipecac) { list.add("Bitter juice that will cause your stomach"); - list.add("to forcefully eject it's contents."); + list.add("to forcefully eject its contents."); } if(this == ModItems.med_ptsd) { diff --git a/src/main/java/com/hbm/items/food/ItemPill.java b/src/main/java/com/hbm/items/food/ItemPill.java index 6e1144e57..f531ddb55 100644 --- a/src/main/java/com/hbm/items/food/ItemPill.java +++ b/src/main/java/com/hbm/items/food/ItemPill.java @@ -1,5 +1,6 @@ package com.hbm.items.food; +import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -58,12 +59,20 @@ public class ItemPill extends ItemFood { } if(this == ModItems.pill_herbal) { + float fibrosis = HbmLivingProps.getFibrosis(player); + HbmLivingProps.setFibrosis(player, (int) Math.min(fibrosis, 37800)); HbmLivingProps.setAsbestos(player, 0); HbmLivingProps.setBlackLung(player, Math.min(HbmLivingProps.getBlackLung(player), HbmLivingProps.maxBlacklung / 5)); + HbmLivingProps.incrementRadiation(player, -100F); + player.addPotionEffect(new PotionEffect(Potion.confusion.id, 10 * 20, 0)); player.addPotionEffect(new PotionEffect(Potion.weakness.id, 10 * 60 * 20, 2)); player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 10 * 60 * 20, 2)); player.addPotionEffect(new PotionEffect(Potion.poison.id, 5 * 20, 2)); + + PotionEffect eff = new PotionEffect(HbmPotion.potionsickness.id, 10 * 60 * 20); + eff.setCurativeItems(new ArrayList()); + player.addPotionEffect(eff); } if(this == ModItems.xanax) { @@ -112,6 +121,10 @@ public class ItemPill extends ItemFood { if(this == ModItems.siox) { list.add("Reverses mesothelioma with the power of Asbestos!"); } + if(this == ModItems.pill_herbal) { + list.add("Effective treatment against lung disease and mild radiation poisoning"); + list.add("Comes with side effects"); + } if(this == ModItems.xanax) { list.add("Removes 500mDRX"); } diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 09117cd8e..2f30e19ee 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -216,6 +216,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModItems.powder_poison), new Object[] { DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.NIGHTSHADE) }); addShapelessAuto(new ItemStack(ModItems.syringe_metal_stimpak), new Object[] { ModItems.syringe_metal_empty, Items.carrot, DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.FOXGLOVE) }); //xander root and broc flower + addShapelessAuto(new ItemStack(ModItems.pill_herbal), new Object[] { COAL.dust(), Items.poisonous_potato, Items.nether_wart, DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.FOXGLOVE) }); addShapelessAuto(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE, 1), new Object[] { Items.string, Items.string, Items.string }); addRecipeAuto(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE, 4), new Object[] { "W", "W", "W", 'W', DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.WEED) }); addRecipeAuto(new ItemStack(ModItems.rag, 16), new Object[] { "WW", "WW", 'W', DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.WEED) }); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 5cca52ac0..e24b1c8c4 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2215,6 +2215,7 @@ item.pile_rod_plutonium.name=Chicago Pile Plutoniumstab item.pile_rod_source.name=Chicago Pile Ra226Be-Neutronenquelle item.pile_rod_uranium.name=Chicago Pile Uranstab item.pill_iodine.name=Iodpille +item.pill_herbal.name=Kräuterpaste item.pin.name=Haarklammer item.pipes_steel.name=Stahlrohre item.pirfenidone.name=Pirfenidon diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index fb479e7c5..c9f511f43 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2553,6 +2553,7 @@ item.pile_rod_source.desc=§d[Neutron Source] item.pile_rod_uranium.name=Chicago Pile Uranium Rod item.pile_rod_uranium.desc=§a[Reactive Fuel]$§eUse hand drill to take core sample item.pill_iodine.name=Iodine Pill +item.pill_herbal.name=Herbal Paste item.pin.name=Bobby Pin item.pin.desc="*Unmodified* success rate of picking a standard lock is ~10%. item.pipes_steel.name=Steel Pipes diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_flower.foxglove.png b/src/main/resources/assets/hbm/textures/blocks/plant_flower.foxglove.png index f1357aa192e3cc81258a9742498ef5f464fc2cfd..bba918c74881fc86e6b16b44f513fa40f8bf3840 100644 GIT binary patch delta 297 zcmdnbvXg0oWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE0C`h;1lAS z*y8{H-`D3G9|V;-{{Q>*{K>9c?dKd54W8#;|Mc#_<=DedAFkf!vK*-V*Oqb*AjMY_ zM-N+{1quc(K=5T#}JL+*uH3?qY50(D>r@$ z__qJ9^v1Wxk4mapI=G$OUva=Xw3%jKteHJT3Px z`zFh5$npKrlWHP8!5}&62shK`vg><4FtnBRe{E!a7jlTXf>}a1rJm=_$^a{+i?;%l jHaNa~-SW6<%1rxWLC)2@MQ+=HPGRtL^>bP0l+XkK?B;>YJjLtY~XfIHf7D$ah7@ty{l}G&6XnIArGbaotf8XmVOCkaa@C_}77^HQ`I# zY-OarJo|s7*5=~DrN(=z-&sEYZ~gp*>Mwt3p1zJ%Kc{xNDu&xK%w-5HpC7?u_-?Ag zij`L;OepvjQ{V8XyJPM;&On>q>^qg`U9Z>7zqjJpjF$cNiea8}cPCy9b7j8{^lb;wLU;EbMz4_m0nFuFAs_*&a>BTY|QId7Ey%)_hQ-66|cv ztkA-kvSkwIgp7?hGwbg>TX;QW%Igo(30;Y)UAxQk_+H!%3}AB*$TqqCyE9zFkKy*I zADU&g2lsspW;^h2hJxMPCssa1kHU6ZhnaLeoX#q6ccIDh7j_<3jLS%r_=K@sTb>gTe~DWM4f(IDmS diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_flower.nightshade.png b/src/main/resources/assets/hbm/textures/blocks/plant_flower.nightshade.png index 77d18136aef283a2b94486c6874790276d4e4e55..01a3dcf5907c95623c4daa29fd1d1eb5bbb55282 100644 GIT binary patch delta 262 zcmcb@Je_HRWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE08Z2;1l9{ z??URt{Ppu|_ofC^WHy=AObqT>5|iKL8Bw4CRPtRfB@sw*l?3?(|AzsFO=on@14TIt zJR*x382Ao@Fyrz36)8Z$9M5_e#}JL+*4~3+tcEPkFB6{pum7Q1VmkZzmQz#P9tyL4 zj(%j}-E2So$jA2L1O7TQ+~p>&+ED4c*`jtT#}wnLcTGYI8e~n|ihXEoSg^^>bP0l+XkKGKy!G delta 453 zcmbQvbcK0>WIY=L1B3kM|A|0~u{g-xiDBJ2nU_G0OKOB?ny)W|7Ld)sz}TM2zyeYN z#8N=az`(qKk%1XVGlIkxFu`R77BC~&AcZEOg`a@R>^xl@Lo5WBPTcQxxIp0e`ljZl zl@oS$*9Xfh{NUTw>CGO_zI+GQwS^W|Gfr;oZtk|Q_|B*!X{FJTag;s4u&Md<`WnA? z9;-P$@_#;kx9@-5{*E(|ygwda%-iuU-)mNGX8h8d@A;epMRu9JVUm4vd%E<=OREE1 z@4a68n@?w1!d<~45m%!an+cm2FFfyifhDbc7K6Y7HB0+M~h78)hANWVoT}&%bY<6FBNluYOYbuBq*__MAEIe<NO=t1xuuQSLqupJhQ~31i&u2@X&lYK0xcuLrULBu?-^HwH|Mi4dD*sZx f*7&NdnA?ZJFnO`doue-%fCAOi)z4*}Q$iB}vmLu` diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_flower.tobacco.png b/src/main/resources/assets/hbm/textures/blocks/plant_flower.tobacco.png index ea4d67d05035b2c9b87e41b669eb806ff877f98e..56f0815de2b241687ecc179c02aabcb71f948c21 100644 GIT binary patch delta 231 zcmX@i{DX0VWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE08Y~;1lB7 zy|XNKva@fqaoL(!t27m$aH!{6VIaj;666>B9|RaS?_aVXD8gCb5n0T@z;_sg8IR|$ zNC67Qdb&7$HJ`hHL{ETuhEyEtS@>|w1ZLFEj&TU zXl6@DM^Dd5iAv^TkKpA(nK!bh%P4p(n%glYN-_S!gAZcw=Y}8sb$^Fng^==tt)@P$ zjVmjen0nOIW}bhl+kKpU)^YxWUw(*+Z2Y&uPvWur@7;CpH*8}H_FOKzit)oCP#Ai; L`njxgN@xNAO0}Z3 diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.lower.png b/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.lower.png new file mode 100644 index 0000000000000000000000000000000000000000..1e412f0cfd490bb097cbe803026637f714ca9242 GIT binary patch literal 542 zcmV+(0^$9MP)ej_g+DQf0qFZlt-D!o@pI3n8~WIet0e=(qhtWj>QS9*7~XWeDL%aVGE#0_ zjT|Lbw+hiQ{3sN&sQ;DW|21)GEhhoKed=>Bm*(-ar14#O5gW+{Ru*?f&>nDo zGKG5@(5$y;)>}F!N^*RdsQl=LKGtyu4le5d*0@h)qbQYJ5hX@D1AP75$2|==KMQpt zD^Io!*|F%Y%FJ%))2z3Q$;MLSOlLCM8>7LGJqyq3QO?&yb*>?fc07Zuf@C``Y7+{V zwou(FNb9%*z+of7`B})!!o>#eKS~2;8e_xcqaBZ+Js@ZgbX}dx`I_*oo)P6s6DW=9 gc7>UR07*qoM6N<$f^moU1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.upper.png b/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.upper.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a23bdbe5185425575d4c4717ea90f2fde514ee GIT binary patch literal 361 zcmV-v0ha!WP)fCQfg<&~^Aoc_ROrlRztPBt5&s*O>ky1EMSLnAR!w+5Y{$``rAk>?V5^R2@sUsw$ zSjQKxvLCtv04Q0Y+Zq`^%Wv%ng{xd|Ix0DcJ#lbkX;=Ce+u3wW`yPQA00000NkvXX Hu0mjfone@c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/potions.png b/src/main/resources/assets/hbm/textures/gui/potions.png index 8eafece7325cea7568630ded48a5ebeb7d1f1a0b..09759f2f957ee9e9467fe0fdf6d592a326a6ede7 100644 GIT binary patch delta 3680 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 y2>bBHuE-Edk^o~*! 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 Tn8+yQe Date: Sun, 4 Sep 2022 20:23:31 +0200 Subject: [PATCH 041/111] dead plants, usable presentation system --- src/main/java/com/hbm/blocks/ModBlocks.java | 5 +- .../hbm/blocks/generic/BlockDeadPlant.java | 85 ++++++++ src/main/java/com/hbm/handler/GUIHandler.java | 2 - .../hbm/inventory/recipes/HadronRecipes.java | 1 + .../inventory/recipes/ShredderRecipes.java | 126 +++++++----- .../recipes/loader/SerializableRecipe.java | 1 + .../java/com/hbm/items/tool/ItemWandD.java | 7 +- src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/MainRegistry.java | 2 - .../com/hbm/main/ModEventHandlerClient.java | 48 +++++ .../com/hbm/tileentity/IPersistentNBT.java | 5 +- .../machine/TileEntityMachineAutocrafter.java | 6 +- .../storage/TileEntityMachineBattery.java | 9 +- .../java/com/hbm/util/CompatExternal.java | 38 ++++ .../java/com/hbm/wiaj/GuiWorldInAJar.java | 36 ++-- .../com/hbm/wiaj/cannery/CanneryBase.java | 11 + .../hbm/wiaj/cannery/CanneryCentrifuge.java | 27 +-- .../com/hbm/wiaj/cannery/CanneryFEnSU.java | 20 +- .../com/hbm/wiaj/cannery/CanneryFirebox.java | 35 ++-- .../com/hbm/wiaj/cannery/CannerySILEX.java | 35 ++-- .../com/hbm/wiaj/cannery/CanneryStirling.java | 188 ++++++++++++++++++ src/main/java/com/hbm/wiaj/cannery/Jars.java | 21 ++ .../java/com/hbm/world/feature/OilSpot.java | 31 ++- src/main/resources/assets/hbm/lang/de_DE.lang | 36 ++++ src/main/resources/assets/hbm/lang/en_US.lang | 35 ++++ .../textures/blocks/plant_dead.bigflower.png | Bin 0 -> 243 bytes .../hbm/textures/blocks/plant_dead.fern.png | Bin 0 -> 219 bytes .../hbm/textures/blocks/plant_dead.flower.png | Bin 0 -> 224 bytes .../textures/blocks/plant_dead.generic.png | Bin 0 -> 198 bytes .../hbm/textures/blocks/plant_dead.grass.png | Bin 0 -> 196 bytes .../assets/hbm/textures/gui/gui_utility.png | Bin 3646 -> 3954 bytes src/main/resources/mcmod.info | 2 +- 32 files changed, 667 insertions(+), 147 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockDeadPlant.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/CanneryBase.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/Jars.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/plant_dead.bigflower.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/plant_dead.fern.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/plant_dead.flower.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/plant_dead.generic.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/plant_dead.grass.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 940a58afc..fc1ba1692 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -452,6 +452,7 @@ public class ModBlocks { public static Block mush_block_stem; public static Block plant_flower; + public static Block plant_dead; public static Block waste_earth; public static Block waste_mycelium; @@ -1701,6 +1702,7 @@ public class ModBlocks { mush_block_stem = new BlockMushHuge(Material.plants).setBlockName("mush_block_stem").setLightLevel(1.0F).setStepSound(Block.soundTypeGrass).setHardness(0.2F).setBlockTextureName(RefStrings.MODID + ":mush_block_stem"); plant_flower = new BlockNTMFlower().setBlockName("plant_flower").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); + plant_dead = new BlockDeadPlant().setBlockName("plant_dead").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); waste_earth = new WasteEarth(Material.ground, true).setBlockName("waste_earth").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_earth"); waste_mycelium = new WasteEarth(Material.ground, true).setBlockName("waste_mycelium").setStepSound(Block.soundTypeGrass).setLightLevel(1F).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_mycelium_side"); @@ -2769,7 +2771,8 @@ public class ModBlocks { GameRegistry.registerBlock(deco_pipe_quad_green_rusted, ItemBlockBase.class, deco_pipe_quad_green_rusted.getUnlocalizedName()); GameRegistry.registerBlock(deco_pipe_quad_red, ItemBlockBase.class, deco_pipe_quad_red.getUnlocalizedName()); GameRegistry.registerBlock(deco_pipe_quad_marked, ItemBlockBase.class, deco_pipe_quad_marked.getUnlocalizedName()); - GameRegistry.registerBlock(plant_flower, ItemBlockBase.class, plant_flower.getUnlocalizedName()); + register(plant_flower); + register(plant_dead); GameRegistry.registerBlock(mush, mush.getUnlocalizedName()); GameRegistry.registerBlock(mush_block, mush_block.getUnlocalizedName()); GameRegistry.registerBlock(mush_block_stem, mush_block_stem.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDeadPlant.java b/src/main/java/com/hbm/blocks/generic/BlockDeadPlant.java new file mode 100644 index 000000000..4693db839 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockDeadPlant.java @@ -0,0 +1,85 @@ +package com.hbm.blocks.generic; + +import java.util.Random; + +import com.hbm.blocks.BlockEnumMulti; +import com.hbm.blocks.ModBlocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class BlockDeadPlant extends BlockEnumMulti { + + public BlockDeadPlant() { + super(Material.plants, EnumDeadPlantType.class, false, true); + } + + public static enum EnumDeadPlantType { + GENERIC, + GRASS, + FLOWER, + BIGFLOWER, + FERN + } + + @Override + public boolean canPlaceBlockAt(World world, int x, int y, int z) { + return super.canPlaceBlockAt(world, x, y, z) && this.canBlockStay(world, x, y, z); + } + + protected boolean canPlaceBlockOn(Block block) { + return block == Blocks.grass || block == Blocks.dirt || block == ModBlocks.waste_earth || block == ModBlocks.dirt_oily || block == ModBlocks.dirt_dead; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + super.onNeighborBlockChange(world, x, y, z, block); + this.checkAndDropBlock(world, x, y, z); + } + + protected void checkAndDropBlock(World world, int x, int y, int z) { + if(!this.canBlockStay(world, x, y, z)) { + this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + world.setBlock(x, y, z, getBlockById(0), 0, 2); + } + } + + @Override + public boolean canBlockStay(World world, int x, int y, int z) { + return canPlaceBlockOn(world.getBlock(x, y - 1, z)); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return 1; + } + + @Override + public int damageDropped(int meta) { + return meta; + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + return null; + } +} diff --git a/src/main/java/com/hbm/handler/GUIHandler.java b/src/main/java/com/hbm/handler/GUIHandler.java index 3389333ca..3aa597ed9 100644 --- a/src/main/java/com/hbm/handler/GUIHandler.java +++ b/src/main/java/com/hbm/handler/GUIHandler.java @@ -844,8 +844,6 @@ public class GUIHandler implements IGuiHandler { public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity entity = world.getTileEntity(x, y, z); - if(ID == -1) return new GuiWorldInAJar(); - if(entity instanceof IGUIProvider) { return ((IGUIProvider) entity).provideGUI(ID, player, world, x, y, z); } diff --git a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java index 0c1f679c9..e0694e1ae 100644 --- a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java @@ -218,6 +218,7 @@ public class HadronRecipes extends SerializableRecipe { writer.endArray(); } + @Override public String getComment() { return "Rules: Both in- and output stacks cannot be null. Stacksizes are set to 1 for all stacks."; } diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index d1ac38a06..d88dc2b5c 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -1,13 +1,19 @@ package com.hbm.inventory.recipes; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; import com.hbm.interfaces.Untested; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.util.Compat; @@ -19,12 +25,13 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class ShredderRecipes { +public class ShredderRecipes extends SerializableRecipe { public static HashMap shredderRecipes = new HashMap(); public static HashMap neiShredderRecipes; - public static void registerShredder() { + @Override + public void registerPost() { String[] names = OreDictionary.getOreNames(); @@ -106,7 +113,7 @@ public class ShredderRecipes { if(in != null) { if(in.getItem() != null) { - shredderRecipes.put(new ComparableStack(in), dust); + setRecipe(new ComparableStack(in), dust); } else { MainRegistry.logger.error("Ore dict entry '" + name + "' has a null item in its stack! How does that even happen?"); Thread.currentThread().dumpStack(); @@ -117,12 +124,11 @@ public class ShredderRecipes { Thread.currentThread().dumpStack(); } } - - public static void registerOverrides() { - /* - * Primary recipes - */ + @Override + public void registerDefaults() { + + /* Primary recipes */ ShredderRecipes.setRecipe(ModItems.scrap, new ItemStack(ModItems.dust)); ShredderRecipes.setRecipe(ModItems.dust, new ItemStack(ModItems.dust)); ShredderRecipes.setRecipe(Blocks.glowstone, new ItemStack(Items.glowstone_dust, 4)); @@ -192,9 +198,7 @@ public class ShredderRecipes { for(int i = 0; i < 5; i++) ShredderRecipes.setRecipe(new ItemStack(Items.skull, 1, i), new ItemStack(ModItems.biomass)); - /* - * Crstaly processing - */ + /* Crystal processing */ ShredderRecipes.setRecipe(ModItems.ingot_schraranium, new ItemStack(ModItems.nugget_schrabidium, 2)); ShredderRecipes.setRecipe(ModItems.crystal_coal, new ItemStack(ModItems.powder_coal, 3)); ShredderRecipes.setRecipe(ModItems.crystal_iron, new ItemStack(ModItems.powder_iron, 3)); @@ -223,9 +227,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModItems.crystal_starmetal, new ItemStack(ModItems.powder_dura_steel, 6)); ShredderRecipes.setRecipe(ModItems.crystal_cobalt, new ItemStack(ModItems.powder_cobalt, 3)); - /* - * Misc recycling - */ + /* Misc recycling */ ShredderRecipes.setRecipe(ModBlocks.steel_poles, new ItemStack(ModItems.powder_steel_tiny, 3)); ShredderRecipes.setRecipe(ModBlocks.pole_top, new ItemStack(ModItems.powder_tungsten, 4)); ShredderRecipes.setRecipe(ModBlocks.tape_recorder, new ItemStack(ModItems.powder_steel, 1)); @@ -251,9 +253,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModBlocks.steel_grate, new ItemStack(ModItems.powder_steel_tiny, 3)); ShredderRecipes.setRecipe(ModItems.pipes_steel, new ItemStack(ModItems.powder_steel, 27)); - /* - * Sellafite scrapping - */ + /* Sellafite scrapping */ ShredderRecipes.setRecipe(ModBlocks.sellafield_slaked, new ItemStack(Blocks.gravel)); ShredderRecipes.setRecipe(new ItemStack(ModBlocks.sellafield, 1, 0), new ItemStack(ModItems.scrap_nuclear, 1)); ShredderRecipes.setRecipe(new ItemStack(ModBlocks.sellafield, 1, 1), new ItemStack(ModItems.scrap_nuclear, 2)); @@ -262,9 +262,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(new ItemStack(ModBlocks.sellafield, 1, 4), new ItemStack(ModItems.scrap_nuclear, 7)); ShredderRecipes.setRecipe(new ItemStack(ModBlocks.sellafield, 1, 5), new ItemStack(ModItems.scrap_nuclear, 15)); - /* - * Fracking debris scrapping - */ + /* Fracking debris scrapping */ ShredderRecipes.setRecipe(ModBlocks.dirt_dead, new ItemStack(ModItems.scrap_oil, 1)); ShredderRecipes.setRecipe(ModBlocks.dirt_oily, new ItemStack(ModItems.scrap_oil, 1)); ShredderRecipes.setRecipe(ModBlocks.sand_dirty, new ItemStack(ModItems.scrap_oil, 1)); @@ -272,9 +270,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModBlocks.stone_cracked, new ItemStack(ModItems.scrap_oil, 1)); ShredderRecipes.setRecipe(ModBlocks.stone_porous, new ItemStack(ModItems.scrap_oil, 1)); - /* - * Deco pipe recycling - */ + /* Deco pipe recycling */ ShredderRecipes.setRecipe(ModBlocks.deco_pipe, new ItemStack(ModItems.powder_steel, 1)); ShredderRecipes.setRecipe(ModBlocks.deco_pipe_rusted, new ItemStack(ModItems.powder_steel, 1)); ShredderRecipes.setRecipe(ModBlocks.deco_pipe_green, new ItemStack(ModItems.powder_steel, 1)); @@ -300,9 +296,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModBlocks.deco_pipe_framed_red, new ItemStack(ModItems.powder_steel, 1)); ShredderRecipes.setRecipe(ModBlocks.deco_pipe_framed_marked, new ItemStack(ModItems.powder_steel, 1)); - /* - * Turret and ammo recycling - */ + /* Turret and ammo recycling */ ShredderRecipes.setRecipe(ModBlocks.turret_light, new ItemStack(ModItems.powder_steel, 16)); ShredderRecipes.setRecipe(ModBlocks.turret_heavy, new ItemStack(ModItems.powder_steel, 16)); ShredderRecipes.setRecipe(ModBlocks.turret_flamer, new ItemStack(ModItems.powder_steel, 16)); @@ -316,25 +310,19 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModItems.turret_cwis_ammo, new ItemStack(Items.gunpowder, 4)); ShredderRecipes.setRecipe(ModItems.turret_tau_ammo, new ItemStack(ModItems.powder_uranium, 4)); - /* - * Wool and clay scrapping - */ + /* Wool and clay scrapping */ for(int i = 0; i < 16; i++) { ShredderRecipes.setRecipe(new ItemStack(Blocks.stained_hardened_clay, 1, i), new ItemStack(Items.clay_ball, 4)); ShredderRecipes.setRecipe(new ItemStack(Blocks.wool, 1, i), new ItemStack(Items.string, 4)); } - /* - * Shredding bobbleheads - */ + /* Shredding bobbleheads */ for(int i = 0; i < BobbleType.values().length; i++) { BobbleType type = BobbleType.values()[i]; ShredderRecipes.setRecipe(new ItemStack(ModBlocks.bobblehead, 1, i), new ItemStack(ModItems.scrap_plastic, 1, type.scrap.ordinal())); } - /* - * Debris shredding - */ + /* Debris shredding */ ShredderRecipes.setRecipe(ModItems.debris_concrete, new ItemStack(ModItems.scrap_nuclear, 2)); ShredderRecipes.setRecipe(ModItems.debris_shrapnel, new ItemStack(ModItems.powder_steel_tiny, 5)); ShredderRecipes.setRecipe(ModItems.debris_exchanger, new ItemStack(ModItems.powder_steel, 3)); @@ -342,18 +330,14 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModItems.debris_metal, new ItemStack(ModItems.powder_steel_tiny, 3)); ShredderRecipes.setRecipe(ModItems.debris_graphite, new ItemStack(ModItems.powder_coal, 1)); - /* - * GC COMPAT - */ + /* GC COMPAT */ Item gcMoonBlock = Compat.tryLoadItem(Compat.MOD_GCC, "moonBlock"); if(gcMoonBlock != null) { ShredderRecipes.setRecipe(new ItemStack(gcMoonBlock, 1, 3), new ItemStack(ModBlocks.moon_turf)); //Moon dirt ShredderRecipes.setRecipe(new ItemStack(gcMoonBlock, 1, 5), new ItemStack(ModBlocks.moon_turf)); //Moon topsoil } - /* - * AR COMPAT - */ + /* AR COMPAT */ Item arMoonTurf = Compat.tryLoadItem(Compat.MOD_AR, "turf"); if(arMoonTurf != null) ShredderRecipes.setRecipe(arMoonTurf, new ItemStack(ModBlocks.moon_turf)); //i assume it's moon turf Item arMoonTurfDark = Compat.tryLoadItem(Compat.MOD_AR, "turfDark"); @@ -396,18 +380,21 @@ public class ShredderRecipes { } public static void setRecipe(Item in, ItemStack out) { - - shredderRecipes.put(new ComparableStack(in), out); + setRecipe(new ComparableStack(in), out); } public static void setRecipe(Block in, ItemStack out) { - - shredderRecipes.put(new ComparableStack(in), out); + setRecipe(new ComparableStack(in), out); } public static void setRecipe(ItemStack in, ItemStack out) { - - shredderRecipes.put(new ComparableStack(in), out); + setRecipe(new ComparableStack(in), out); + } + + public static void setRecipe(ComparableStack in, ItemStack out) { + if(!shredderRecipes.containsKey(in)) { + shredderRecipes.put(in, out); + } } public static Map getShredderRecipes() { @@ -426,11 +413,46 @@ public class ShredderRecipes { ItemStack sta = shredderRecipes.get(new ComparableStack(stack).makeSingular()); - /*if(sta != null) - System.out.println(stack.getDisplayName() + " resulted " + sta.getDisplayName()); - else - System.out.println(stack.getDisplayName() + " resulted null");*/ - return sta == null ? new ItemStack(ModItems.scrap) : sta; } + + @Override + public String getFileName() { + return "hbmShredder.json"; + } + + @Override + public Object getRecipeObject() { + return shredderRecipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonObject obj = (JsonObject) recipe; + ComparableStack comp = new ComparableStack(this.readItemStack(obj.get("input").getAsJsonArray())).makeSingular(); + ItemStack out = this.readItemStack(obj.get("output").getAsJsonArray()); + + this.shredderRecipes.put(comp, out); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + Entry entry = (Entry) recipe; + + writer.name("input"); + this.writeItemStack(entry.getKey().toStack(), writer); + writer.name("output"); + this.writeItemStack(entry.getValue(), writer); + } + + @Override + public void deleteRecipes() { + this.shredderRecipes.clear(); + this.neiShredderRecipes = null; + } + + @Override + public String getComment() { + return "Ingot/block/ore -> dust recipes are generated in post and can therefore not be changed with the config. Non-auto recipes do not use ore dict."; + } } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 163a35473..c601a4222 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -38,6 +38,7 @@ public abstract class SerializableRecipe { */ public static void registerAllHandlers() { + recipeHandlers.add(new ShredderRecipes()); recipeHandlers.add(new ChemplantRecipes()); recipeHandlers.add(new CentrifugeRecipes()); recipeHandlers.add(new CyclotronRecipes()); diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 527f6d5cf..69fdac079 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -8,6 +8,7 @@ import com.hbm.entity.mob.siege.EntitySiegeTunneler; import com.hbm.items.ModItems; import com.hbm.items.special.ItemKitCustom; import com.hbm.lib.Library; +import com.hbm.world.feature.OilSpot; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; @@ -31,9 +32,11 @@ public class ItemWandD extends Item { if(pos != null) { - EntityNukeTorex torex = new EntityNukeTorex(world); + OilSpot.generateOilSpot(world, pos.blockX, pos.blockZ, 20, 500); + + /*EntityNukeTorex torex = new EntityNukeTorex(world); torex.setPositionAndRotation(pos.blockX, pos.blockY + 1, pos.blockZ, 0, 0); - world.spawnEntityInWorld(torex); + world.spawnEntityInWorld(torex);*/ /*EntitySiegeTunneler tunneler = new EntitySiegeTunneler(world); tunneler.setPosition(pos.blockX, pos.blockY + 1, pos.blockZ); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 41803a4aa..f131c6199 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4336)"; + public static final String VERSION = "1.0.27 BETA (4347)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 65a18d204..dd79757d6 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -768,8 +768,6 @@ public class MainRegistry { @EventHandler public static void PostLoad(FMLPostInitializationEvent PostEvent) { - ShredderRecipes.registerShredder(); - ShredderRecipes.registerOverrides(); CrystallizerRecipes.register(); TileEntityNukeFurnace.registerFuels(); BreederRecipes.registerRecipes(); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 2432a68ce..e9d63a7cc 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1,9 +1,11 @@ package com.hbm.main; +import java.lang.reflect.Method; import java.util.List; import java.util.Random; import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import com.hbm.blocks.ILookOverlay; @@ -55,6 +57,9 @@ import com.hbm.tileentity.machine.TileEntityNukeFurnace; import com.hbm.util.I18nUtil; import com.hbm.util.ItemStackUtil; import com.hbm.util.LoggingUtil; +import com.hbm.wiaj.GuiWorldInAJar; +import com.hbm.wiaj.cannery.CanneryBase; +import com.hbm.wiaj.cannery.Jars; import com.hbm.util.ArmorRegistry; import com.hbm.util.ArmorUtil; import com.hbm.util.ArmorRegistry.HazardClass; @@ -66,17 +71,20 @@ import api.hbm.item.IClickReceiver; import com.hbm.sound.MovingSoundPlayerLoop.EnumHbmSound; import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; +import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; @@ -84,6 +92,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; +import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; @@ -611,6 +620,11 @@ public class ModEventHandlerClient { if(entry.entry == EnumEntryType.MULT) list.add(EnumChatFormatting.GOLD + "Adds multiplier " + entry.value + " to the custom nuke stage " + entry.type); } + + CanneryBase cannery = Jars.canneries.get(comp); + if(cannery != null) { + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("cannery.f1")); + } } private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); @@ -720,6 +734,40 @@ public class ModEventHandlerClient { MainRegistry.proxy.displayTooltip(EnumChatFormatting.RED + "Your mask has no filter!", MainRegistry.proxy.ID_FILTER); } } + + if(mc.currentScreen instanceof GuiContainer && Keyboard.isKeyDown(Keyboard.KEY_F1)) { + + ScaledResolution scaledresolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / mc.displayWidth; + int mouseY = height - Mouse.getY() * height / mc.displayHeight - 1; + + GuiContainer container = (GuiContainer) mc.currentScreen; + + for(Object o : container.inventorySlots.inventorySlots) { + Slot slot = (Slot) o; + + if(slot.getHasStack()) { + try { + Method isMouseOverSlot = ReflectionHelper.findMethod(GuiContainer.class, container, new String[] {"func_146981_a", "isMouseOverSlot"}, Slot.class, int.class, int.class); + + if((boolean) isMouseOverSlot.invoke(container, slot, mouseX, mouseY)) { + + ComparableStack comp = new ComparableStack(slot.getStack()).makeSingular(); + CanneryBase cannery = Jars.canneries.get(comp); + + if(cannery != null) { + FMLCommonHandler.instance().showGuiScreen(new GuiWorldInAJar(cannery.createScript(), cannery.getIcon())); + } + + break; + } + + } catch(Exception ex) { } + } + } + } } @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/tileentity/IPersistentNBT.java b/src/main/java/com/hbm/tileentity/IPersistentNBT.java index fe9b5e835..77f698de4 100644 --- a/src/main/java/com/hbm/tileentity/IPersistentNBT.java +++ b/src/main/java/com/hbm/tileentity/IPersistentNBT.java @@ -2,6 +2,8 @@ package com.hbm.tileentity; import java.util.ArrayList; +import com.hbm.util.CompatExternal; + import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -27,7 +29,8 @@ public interface IPersistentNBT { } public static ArrayList getDrops(World world, int x, int y, int z, Block b) { - TileEntity tile = world.getTileEntity(x, y, z); + + TileEntity tile = CompatExternal.getCoreFromPos(world, x, y, z); if(tile instanceof IPersistentNBT) { return ((IPersistentNBT) tile).getDrops(b); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java index 4d266a204..7f5ffa1ac 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java @@ -167,7 +167,7 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase implemen if(ingredient != null) { this.decrStackSize(i, 1); - if(ingredient.getItem().hasContainerItem(ingredient)) { + if(slots[i] == null && ingredient.getItem().hasContainerItem(ingredient)) { ItemStack container = ingredient.getItem().getContainerItem(ingredient); if(container != null && container.isItemStackDamageable() && container.getItemDamage() > container.getMaxDamage()) { @@ -269,6 +269,10 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase implemen @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { + + //automatically prohibit any stacked item with a container + if(stack.stackSize > 1 && stack.getItem().hasContainerItem(stack)) + return false; //only allow insertion for the nine recipe slots if(slot < 10 || slot > 18) diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index 3266b3397..ed23114be 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -147,7 +147,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I @Override public void updateEntity() { - if(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery && !worldObj.isRemote) { + if(!worldObj.isRemote && worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery) { long prevPower = this.power; @@ -163,16 +163,17 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I power = Library.chargeTEFromItems(slots, 0, power, getMaxPower()); power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); - this.delta = this.power - this.log[0]; + long avg = (power + prevPower) / 2; + this.delta = avg - this.log[0]; for(int i = 1; i < this.log.length; i++) { this.log[i - 1] = this.log[i]; } - this.log[19] = this.power; + this.log[19] = avg; NBTTagCompound nbt = new NBTTagCompound(); - nbt.setLong("power", (power + prevPower) / 2); + nbt.setLong("power", avg); nbt.setLong("delta", delta); nbt.setShort("redLow", redLow); nbt.setShort("redHigh", redHigh); diff --git a/src/main/java/com/hbm/util/CompatExternal.java b/src/main/java/com/hbm/util/CompatExternal.java index 37a6d67da..00d1425ee 100644 --- a/src/main/java/com/hbm/util/CompatExternal.java +++ b/src/main/java/com/hbm/util/CompatExternal.java @@ -1,9 +1,14 @@ package com.hbm.util; +import java.util.ArrayList; + import com.hbm.blocks.BlockDummyable; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.machine.TileEntityDummy; import api.hbm.energy.IEnergyUser; +import api.hbm.fluid.IFluidUser; import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -87,4 +92,37 @@ public class CompatExternal { return -1; } + + /** + * Returns a list of tank definitions from the supplied tile entity. Uses IFluidUser, if the tile is incompatible it returns an empty list. + * @param tile + * @return an ArrayList of Object arrays with each array representing a fluid tank.
+ * [0]: STRING - unlocalized name of the fluid, simply use I18n to get the translated name
+ * [1]: INT - the unique ID of this fluid
+ * [2]: INT - the hexadecimal color of this fluid
+ * [3]: INT - the amount of fluid in this tank in millibuckets
+ * [4]: INT - the capacity of this tank in millibuckets + */ + public static ArrayList getFluidInfoFromTile(TileEntity tile) { + ArrayList list = new ArrayList(); + + if(!(tile instanceof IFluidUser)) { + return list; + } + + IFluidUser container = (IFluidUser) tile; + + for(FluidTank tank : container.getAllTanks()) { + FluidType type = tank.getTankType(); + list.add(new Object[] { + type.getName(), + type.getID(), + type.getColor(), + tank.getFill(), + tank.getMaxFill() + }); + } + + return list; + } } diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index b9b5caef2..153031df3 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -9,21 +9,9 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; -import com.hbm.render.tileentity.RenderStirling; -import com.hbm.wiaj.actions.ActionCreateActor; -import com.hbm.wiaj.actions.ActionOffsetBy; -import com.hbm.wiaj.actions.ActionRotateBy; -import com.hbm.wiaj.actions.ActionSetActorData; -import com.hbm.wiaj.actions.ActionSetBlock; -import com.hbm.wiaj.actions.ActionUpdateActor; -import com.hbm.wiaj.actions.ActionWait; -import com.hbm.wiaj.actors.ActorFancyPanel; -import com.hbm.wiaj.actors.ActorTileEntity; import com.hbm.wiaj.actors.ISpecialActor; import com.hbm.wiaj.cannery.*; -import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; @@ -34,9 +22,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; @@ -48,11 +34,20 @@ public class GuiWorldInAJar extends GuiScreen { RenderBlocks renderer; JarScript testScript; + ItemStack icon; + CanneryBase[] seeAlso; - public GuiWorldInAJar() { + public GuiWorldInAJar(JarScript script, ItemStack icon, CanneryBase... seeAlso) { super(); this.fontRendererObj = Minecraft.getMinecraft().fontRenderer; - WorldInAJar world = new WorldInAJar(15, 15, 15); + + this.testScript = script; + this.icon = icon; + this.seeAlso = seeAlso; + renderer = new RenderBlocks(testScript.world); + renderer.enableAO = true; + + /*WorldInAJar world = new WorldInAJar(15, 15, 15); testScript = new JarScript(world); JarScene startingScene = new JarScene(testScript); @@ -141,10 +136,7 @@ public class GuiWorldInAJar extends GuiScreen { .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); brickScene.add(new ActionWait(200)); - //this.testScript.addScene(startingScene).addScene(brickScene); - this.testScript = CanneryFirebox.createScript(); - renderer = new RenderBlocks(testScript.world); - renderer.enableAO = true; + this.testScript.addScene(startingScene).addScene(brickScene);*/ //SKY BLUE: 0xffA5D9FF, 0xff39ACFF, 0xff1A6CA7, 0xff1A1F22 } @@ -242,6 +234,10 @@ public class GuiWorldInAJar extends GuiScreen { this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 48, 24, 24); GL11.glEnable(GL11.GL_DEPTH_TEST); + this.drawTexturedModalRect(15, 15, 136, 48, 24, 24); + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.renderEngine, this.icon, 19, 19); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.renderEngine, this.icon, 19, 19, null); + RenderHelper.disableStandardItemLighting(); } private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java b/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java new file mode 100644 index 000000000..f80399ab9 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java @@ -0,0 +1,11 @@ +package com.hbm.wiaj.cannery; + +import com.hbm.wiaj.JarScript; + +import net.minecraft.item.ItemStack; + +public abstract class CanneryBase { + + public abstract ItemStack getIcon(); + public abstract JarScript createScript(); +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java index bfe5c5810..135dbbd9c 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java @@ -7,6 +7,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.main.ResourceManager; import com.hbm.tileentity.network.TileEntityPipeBaseNT; +import com.hbm.util.I18nUtil; import com.hbm.wiaj.JarScene; import com.hbm.wiaj.JarScript; import com.hbm.wiaj.WorldInAJar; @@ -26,9 +27,14 @@ import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -public class CanneryCentrifuge { +public class CanneryCentrifuge extends CanneryBase { - public static JarScript createScript() { + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_gascent); + } + + public JarScript createScript() { WorldInAJar world = new WorldInAJar(9, 5, 5); JarScript script = new JarScript(world); @@ -66,8 +72,7 @@ public class CanneryCentrifuge { scene0.add(new ActionWait(2)); } - scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, -50, new Object[][] {{"Gas centrifuges can be supplied with fluid " - + "using regular fluid ducts."}}, 200) + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, -50, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.0")}}, 200) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); @@ -75,8 +80,7 @@ public class CanneryCentrifuge { JarScene scene1 = new JarScene(script); - scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, 10, new Object[][] {{"Most recipes require multiple centrifuges. " - + "The intermediate products cannot be transported via pipes."}}, 200) + scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, 10, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.1")}}, 200) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); scene1.add(new ActionWait(60)); @@ -84,8 +88,7 @@ public class CanneryCentrifuge { scene1.add(new ActionSetZoom(4, 20)); - scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 40, new Object[][] {{"This side acts as a connector which " - + "outputs the intermediate product into an adjecent centrifuge."}}, 150) + scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 40, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.2")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.LEFT))); scene1.add(new ActionWait(60)); @@ -97,16 +100,14 @@ public class CanneryCentrifuge { scene1.add(new ActionCreateActor(1, new ActorTileEntity(new ActorGasCent(), c2))); scene1.add(new ActionWait(10)); - scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{"Uranium hexafluoride can be processed with just " - + "two centrifuges, this however will produce Uranium fuel and Uranium-238."}}, 200) + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.3")}}, 200) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); scene1.add(new ActionWait(100)); scene1.add(new ActionRemoveActor(2)); scene1.add(new ActionSetZoom(-2, 20)); - scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{"Fully processing it into Uranium-235 and Uranium-238 " - + "requires a total of four centrifuges."}}, 200) + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.4")}}, 200) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); scene1.add(new ActionWait(60)); @@ -119,7 +120,7 @@ public class CanneryCentrifuge { scene1.add(new ActionCreateActor(3, new ActorTileEntity(new ActorGasCent(), c4))); scene1.add(new ActionWait(10)); - scene1.add(new ActionCreateActor(4, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{"Some recipes also require the centrifuge speed upgrade."}}, 200) + scene1.add(new ActionCreateActor(4, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.5")}}, 200) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); scene1.add(new ActionWait(60)); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java index 418c0551d..6ae2c95f8 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java @@ -2,6 +2,7 @@ package com.hbm.wiaj.cannery; import com.hbm.blocks.ModBlocks; import com.hbm.render.tileentity.RenderFENSU; +import com.hbm.util.I18nUtil; import com.hbm.wiaj.JarScene; import com.hbm.wiaj.JarScript; import com.hbm.wiaj.WorldInAJar; @@ -18,11 +19,17 @@ import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; import net.minecraft.client.Minecraft; import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -public class CanneryFEnSU { +public class CanneryFEnSU extends CanneryBase { - public static JarScript createScript() { + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_fensu); + } + + public JarScript createScript() { WorldInAJar world = new WorldInAJar(11, 5, 5); JarScript script = new JarScript(world); @@ -37,22 +44,19 @@ public class CanneryFEnSU { fensu.setFloat("speed", 10F); scene0.add(new ActionCreateActor(0, new ActorTileEntity(new RenderFENSU(), fensu))); - scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -50, new Object[][] {{"The FEnSU is capable of storing absurd " - + "amounts of energy, over 9EHE (that's a nine followed by 18 zeros)."}}, 200) + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -50, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.0")}}, 200) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(80)); scene0.add(new ActionRemoveActor(1)); scene0.add(new ActionWait(10)); scene0.add(new ActionRotateBy(45, 90, 20)); - scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{"There is only one energy connector " - + "which can be found on the bottom."}}, 200) + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.1")}}, 200) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.TOP))); scene0.add(new ActionWait(60)); scene0.add(new ActionRemoveActor(1)); - scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{"This is also the only place where the" - + " FEnSU can receive a redstone signal."}}, 200) + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.2")}}, 200) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.TOP))); scene0.add(new ActionWait(60)); scene0.add(new ActionRemoveActor(1)); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java index a234d3c68..1e99f4172 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java @@ -6,6 +6,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; import com.hbm.main.ResourceManager; import com.hbm.render.tileentity.RenderStirling; +import com.hbm.util.I18nUtil; import com.hbm.wiaj.JarScene; import com.hbm.wiaj.JarScript; import com.hbm.wiaj.WorldInAJar; @@ -18,7 +19,6 @@ import com.hbm.wiaj.actions.ActionUpdateActor; import com.hbm.wiaj.actions.ActionWait; import com.hbm.wiaj.actors.ActorFancyPanel; import com.hbm.wiaj.actors.ActorTileEntity; -import com.hbm.wiaj.actors.ActorVillager; import com.hbm.wiaj.actors.ITileActorRenderer; import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; @@ -30,9 +30,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; -public class CanneryFirebox { +public class CanneryFirebox extends CanneryBase { - public static JarScript createScript() { + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.heater_firebox); + } + + public JarScript createScript() { WorldInAJar world = new WorldInAJar(5, 5, 5); JarScript script = new JarScript(world); @@ -51,17 +56,16 @@ public class CanneryFirebox { scene0.add(new ActionWait(8)); NBTTagCompound firebox = new NBTTagCompound(); firebox.setDouble("x", 2); firebox.setDouble("y", 1); firebox.setDouble("z", 2); firebox.setInteger("rotation", 5); - scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorSILEX(), firebox))); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorFirebox(), firebox))); scene0.add(new ActionWait(10)); - scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{"The firebox burns flammable items to generate heat."}}, 150) + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.0")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); - scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{"It can burn any flammable item, although higher quality " - + "fuels such as coal, coke and solid fuel burn longer and hotter."}}, 250) + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.1")}}, 250) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); @@ -92,14 +96,12 @@ public class CanneryFirebox { scene0.add(new ActionUpdateActor(0, "open", false)); scene0.add(new ActionWait(30)); - scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{"Heat is given off by the copper contact at the " - + "top of the firebox. Machines with an identical contact on the bottom can receive heat by being placed on top of the firebox."}}, 250) + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.2")}}, 250) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(80)); - scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{"If heat isn't being used up and the heat buffer " - + "becomes full, the firebox will shut off to prevent wasting of fuel."}}, 250) + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.3")}}, 250) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); @@ -109,12 +111,6 @@ public class CanneryFirebox { JarScene scene1 = new JarScene(script); NBTTagCompound stirling = new NBTTagCompound(); - /*stirling.setDouble("x", 2.5); - stirling.setDouble("y", 2); - stirling.setDouble("z", 2.5); - stirling.setDouble("yaw", 180); - stirling.setBoolean("hasCog", true); - scene1.add(new ActionCreateActor(1, new ActorVillager(stirling)));*/ stirling.setDouble("x", 2); stirling.setDouble("y", 2); stirling.setDouble("z", 2); @@ -124,8 +120,7 @@ public class CanneryFirebox { scene1.add(new ActionUpdateActor(1, "speed", 0F)); scene1.add(new ActionWait(10)); - scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{"One such machine is the stirling engine, which will " - + "turn heat directly into energy."}}, 250) + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.4")}}, 250) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(2)); @@ -151,7 +146,7 @@ public class CanneryFirebox { return script; } - public static class ActorSILEX implements ITileActorRenderer { + public static class ActorFirebox implements ITileActorRenderer { @Override public void renderActor(int ticks, float interp, NBTTagCompound data) { diff --git a/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java index f37010a98..224d0b7d4 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java +++ b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java @@ -13,6 +13,7 @@ import com.hbm.render.util.BeamPronter; import com.hbm.render.util.BeamPronter.EnumBeamType; import com.hbm.render.util.BeamPronter.EnumWaveType; import com.hbm.tileentity.network.TileEntityPipeBaseNT; +import com.hbm.util.I18nUtil; import com.hbm.wiaj.JarScene; import com.hbm.wiaj.JarScript; import com.hbm.wiaj.WorldInAJar; @@ -34,9 +35,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; -public class CannerySILEX { +public class CannerySILEX extends CanneryBase{ - public static JarScript createScript() { + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_silex); + } + + public JarScript createScript() { WorldInAJar world = new WorldInAJar(17, 5, 5); JarScript script = new JarScript(world); @@ -62,8 +68,7 @@ public class CannerySILEX { fel.setInteger("length", 11); scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorFEL(), fel))); - scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 15, -5, new Object[][] {{"The Free Electron Laser (FEL) uses energy and a " - + "laser crystal to create a powerful laser beam."}}, 100) + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 15, -5, new Object[][] {{I18nUtil.resolveKey("cannery.silex.0")}}, 100) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.LEFT))); scene0.add(new ActionWait(80)); @@ -102,7 +107,7 @@ public class CannerySILEX { scene0.add(new ActionWait(5)); } - scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{"Be careful, as the laser will burn/melt through weaker blocks..."}}, 150) + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.1")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionUpdateActor(0, "mode", 3)); scene0.add(new ActionUpdateActor(0, "length", 4)); @@ -126,7 +131,7 @@ public class CannerySILEX { scene0.add(new ActionWait(5)); } - scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{"...but not blast-proof ones."}}, 150) + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.2")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(40)); scene0.add(new ActionRemoveActor(3)); @@ -156,20 +161,17 @@ public class CannerySILEX { scene1.add(new ActionWait(20)); - scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{"The FEL is used to power the Laser Isotope " - + "Separation Chamber (SILEX). The FEL and SILEX have to be at least two blocks apart."}}, 150) + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.3")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(80)); - scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 60, 32, new Object[][] {{"The laser has to enter through the glass openings " - + "of the SILEX. Aiming it wrong could destroy it."}}, 150) + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 60, 32, new Object[][] {{I18nUtil.resolveKey("cannery.silex.4")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); scene1.add(new ActionWait(60)); - scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 12, 32, new Object[][] {{"The openings on the sides can be used to connect " - + "fluid ducts to the SILEX."}}, 150) + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 12, 32, new Object[][] {{I18nUtil.resolveKey("cannery.silex.5")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); scene1.add(new ActionWait(60)); @@ -192,20 +194,17 @@ public class CannerySILEX { scene1.add(new ActionUpdateActor(0, "mode", 3)); scene1.add(new ActionWait(10)); - scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{"In addition to the two connectors on the sides, " - + "there is a third hidden connector at the bottom from which items can be extracted."}}, 150) + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.6")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(80)); - scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{"Each recipe requires a specific laser type. " - + "Using a stronger type than required will process items faster."}}, 150) + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.7")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(60)); - scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{"One FEL can supply up to 5 SILEX. Each SILEX has " - + "to be one block apart from one another."}}, 150) + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.8")}}, 150) .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(60)); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java b/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java new file mode 100644 index 000000000..78641f227 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java @@ -0,0 +1,188 @@ +package com.hbm.wiaj.cannery; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.tileentity.RenderStirling; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionUpdateActor; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ITileActorRenderer; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; +import com.hbm.wiaj.cannery.CanneryFirebox.ActorFirebox; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class CanneryStirling extends CanneryBase { + + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_stirling); + } + + @Override + public JarScript createScript() { + + WorldInAJar world = new WorldInAJar(5, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + scene0.add(new ActionSetZoom(3, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + scene0.add(new ActionWait(2)); + } + + scene0.add(new ActionWait(8)); + + NBTTagCompound firebox = new NBTTagCompound(); firebox.setDouble("x", 2); firebox.setDouble("y", 1); firebox.setDouble("z", 2); firebox.setInteger("rotation", 5); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorFirebox(), firebox))); + + scene0.add(new ActionWait(10)); + + NBTTagCompound stirling = new NBTTagCompound(); + stirling.setDouble("x", 2); + stirling.setDouble("y", 2); + stirling.setDouble("z", 2); + stirling.setInteger("rotation", 2); + stirling.setInteger("type", 0); + stirling.setBoolean("hasCog", true); + scene0.add(new ActionCreateActor(1, new ActorTileEntity(new RenderStirling(), stirling))); + scene0.add(new ActionUpdateActor(1, "speed", 0F)); + scene0.add(new ActionUpdateActor(1, "y", 2D)); + + scene0.add(new ActionWait(10)); + + scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.0")}}, 250) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + + scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 40, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.1")}}, 250) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(2)); + scene0.add(new ActionWait(5)); + scene0.add(new ActionUpdateActor(0, "open", true)); + scene0.add(new ActionWait(30)); + scene0.add(new ActionUpdateActor(0, "isOn", true)); + scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(Items.coal)}}, 0) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(20)); + scene0.add(new ActionRemoveActor(2)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionUpdateActor(0, "open", false)); + scene0.add(new ActionWait(30)); + + for(int i = 0; i < 60; i++) { + scene0.add(new ActionUpdateActor(1, "speed", i / 5F)); + scene0.add(new ActionWait(1)); + } + + scene0.add(new ActionWait(20)); + + scene0.add(new ActionSetTile(1, 2, 2, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetTile(0, 2, 2, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetTile(0, 1, 2, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetTile(0, 1, 3, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetBlock(0, 2, 2, ModBlocks.red_cable)); + scene0.add(new ActionSetBlock(0, 1, 2, ModBlocks.red_cable)); + scene0.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 0)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 1)); + scene0.add(new ActionWait(40)); + + JarScene scene1 = new JarScene(script); + + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.2")}}, 250) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(2)); + + NBTTagCompound burner = new NBTTagCompound(); burner.setDouble("x", 2); burner.setDouble("y", 1); burner.setDouble("z", 2); burner.setInteger("rotation", 5); + scene1.add(new ActionCreateActor(0, new ActorTileEntity(new ActorBurner(), burner))); + scene1.add(new ActionUpdateActor(1, "y", 3D)); + scene1.add(new ActionSetTile(1, 2, 2, null)); + scene1.add(new ActionSetTile(1, 3, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(0, 3, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetBlock(0, 3, 2, ModBlocks.red_cable)); + + for(int i = 0; i < 100; i++) { + scene1.add(new ActionUpdateActor(1, "speed", (i + 60) / 5F)); + scene1.add(new ActionWait(1)); + } + + scene1.add(new ActionWait(20)); + scene1.add(new ActionUpdateActor(1, "hasCog", false)); + scene1.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 0)); + + for(int i = 0; i < 160; i += 10) { + scene1.add(new ActionUpdateActor(1, "speed", (160 - i) / 5F)); + scene1.add(new ActionWait(1)); + } + scene1.add(new ActionUpdateActor(1, "speed", 0F)); + + scene1.add(new ActionWait(20)); + + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.3")}}, 250) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(2)); + scene1.add(new ActionWait(20)); + scene1.add(new ActionUpdateActor(1, "hasCog", true)); + scene1.add(new ActionUpdateActor(1, "type", 1)); + scene1.add(new ActionWait(20)); + + for(int i = 0; i < 60; i++) { + scene1.add(new ActionUpdateActor(1, "speed", i / 5F)); + scene1.add(new ActionWait(1)); + } + + scene1.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 1)); + scene1.add(new ActionWait(100)); + + script.addScene(scene0).addScene(scene1); + return script; + } + + public static class ActorBurner implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glEnable(GL11.GL_CULL_FACE); + + ITileActorRenderer.bindTexture(ResourceManager.heater_oilburner_tex); + ResourceManager.heater_oilburner.renderAll(); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/Jars.java b/src/main/java/com/hbm/wiaj/cannery/Jars.java new file mode 100644 index 000000000..30907c583 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/Jars.java @@ -0,0 +1,21 @@ +package com.hbm.wiaj.cannery; + +import java.util.HashMap; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.ComparableStack; + +public class Jars { + + public static HashMap canneries = new HashMap(); + + static { + canneries.put(new ComparableStack(ModBlocks.heater_firebox), new CanneryFirebox()); + canneries.put(new ComparableStack(ModBlocks.machine_stirling), new CanneryStirling()); + canneries.put(new ComparableStack(ModBlocks.machine_stirling_steel), new CanneryStirling()); + canneries.put(new ComparableStack(ModBlocks.machine_gascent), new CanneryCentrifuge()); + canneries.put(new ComparableStack(ModBlocks.machine_fensu), new CanneryFEnSU()); + canneries.put(new ComparableStack(ModBlocks.machine_fel), new CannerySILEX()); + canneries.put(new ComparableStack(ModBlocks.machine_silex), new CannerySILEX()); + } +} diff --git a/src/main/java/com/hbm/world/feature/OilSpot.java b/src/main/java/com/hbm/world/feature/OilSpot.java index 35fc16e2d..cfc3014c1 100644 --- a/src/main/java/com/hbm/world/feature/OilSpot.java +++ b/src/main/java/com/hbm/world/feature/OilSpot.java @@ -1,11 +1,17 @@ package com.hbm.world.feature; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockDeadPlant.EnumDeadPlantType; import net.minecraft.block.Block; +import net.minecraft.block.BlockBush; +import net.minecraft.block.BlockDoublePlant; +import net.minecraft.block.BlockFlower; +import net.minecraft.block.BlockTallGrass; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; public class OilSpot { @@ -17,9 +23,32 @@ public class OilSpot { int rY = world.getHeightValue(rX, rZ); for(int y = rY; y > rY - 4; y--) { - + + Block below = world.getBlock(rX, y - 1, rZ); Block ground = world.getBlock(rX, y, rZ); + if(below.isNormalCube() && ground != ModBlocks.plant_dead) { + if(ground instanceof BlockTallGrass) { + if(world.rand.nextInt(10) == 0) { + if(world.getBlockMetadata(rX, y + 1, rZ) == 2) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.FERN.ordinal(), 3); + } else { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.GRASS.ordinal(), 3); + } + } else { + world.setBlock(rX, y, rZ, Blocks.air); + } + } else if(ground instanceof BlockFlower) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.FLOWER.ordinal(), 3); + } else if(ground instanceof BlockDoublePlant) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.BIGFLOWER.ordinal(), 3); + } else if(ground instanceof BlockBush) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.GENERIC.ordinal(), 3); + } else if(ground instanceof IPlantable) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.GENERIC.ordinal(), 3); + } + } + if(ground == Blocks.grass || ground == Blocks.dirt) { world.setBlock(rX, y, rZ, world.rand.nextInt(10) == 0 ? ModBlocks.dirt_oily : ModBlocks.dirt_dead); break; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index e24b1c8c4..511425f4c 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -128,6 +128,40 @@ bomb.triggered=Erfolgreich ausgelöst! book.test.page1=Testseite 1 +cannery.f1=[ Drücke F1 für Hilfe ] + +cannery.centrifuge.0=Gaszentrifugen können mit Flüssigkeitsrohren versorgt werden. +cannery.centrifuge.1=Die meisten Rezepte benötigen mehrere Zentrifugen, Zwischenprodukte können nicht mit Rohren transportiert werden. +cannery.centrifuge.2=Diese Seite dient als Verbindung, die Zwischenprodukte in anliegende Zentrifugen überträgt. +cannery.centrifuge.3=Uranhexafluorid kann mit nur zwei Zentrifugen verarbeitet werden, jedoch erzeugt das Urankernbrennstoff und Uran-238. +cannery.centrifuge.4=Mit vier Zentrifugen kann es vollständig in Uran-235 und Uran238 verarbeitet werden. +cannery.centrifuge.5=Manche Rezepte benötigen das Zentrifugen-Geschwingidkeitsupgrade. + +cannery.fensu.0=Die FEnSU kann absurde Mengen Energie speichern, über 9EHE (eine Neun gefolgt von 18 Nullen). +cannery.fensu.1=Es gibt nur einen Kontakt auf der Unterseite. +cannery.fensu.2=Das ist auch der einzige Ort, an dem die FEnSU ein Redstone-Signal empfangen kann. + +cannery.firebox.0=Die Feuerbüchse verbrennt Gegenstände, um Hitze zu erzeugen. +cannery.firebox.1=Sie kann alle brennbaren Gegenstände verwenden, aber hochwertigere Brennstoffe wie Kohle, Koks oder Festbrennstoff brennen länger und heißer. +cannery.firebox.2=Hitze wird von dem Kupferkontakt an der Oberseite abgegeben. Maschinen mit einem identischen Kontakt an der Unterseite können Hitze annehmen, wenn sie darauf platziert werden. +cannery.firebox.3=Wenn die Hitze nicht verbraucht wird hält die Feuerbüchse an, um keinen Brennstoff zu verschwenden. +cannery.firebox.4=Eine solche Maschine ist der Stirlingmotor, welcher aus Hitze direkt Energie erzeugt. + +cannery.silex.0=Der Freieilektonenlaser (FEL) verwendet Energie und einen Laserkristall um einen starken Laserstrahl zu erzeugen. +cannery.silex.1=Vorsicht, der Laser kann sich durch schwächere Blöcke hindurchbrennen... +cannery.silex.2=...aber nicht durch sprengsichere. +cannery.silex.3=Der FEL betreibt den Laser-Isotopentrenner (SILEX). FEL und SILEX müssen dabei mindestens zwei Blöcke Abstand haben. +cannery.silex.4=Der Laser muss durch die kleinen Fenster des SILEX durch. Eine falsche Ausrichtung könnte das SILEX zerstören. +cannery.silex.5=Die Öffnungen an den Seiten können verwendet werden, um das SILEX mit Flüssigkeit zu versorgen. +cannery.silex.6=Zusätzlich zu den zwei Öffnungen gibt es an der Unterseite eine versteckte Verbindung, über der Gegenstände herausgenommen werden kann. +cannery.silex.7=Jedes Rezept benötigt einen speziellen Laser-Typ. Stärkere Typen beschleunigen den Vorgang. +cannery.silex.8=Ein FEL kann bis zu fünf SILEX betreiben. Jedes SILEX muss einen Block Abstand halten. + +cannery.stirling.0=Der Stirlingmotor verwendet Hitze aus einer externen Quelle um Energie zu erzeugen. +cannery.stirling.1=Er muss auf einem Hitzeerzeuger platziert werden, zum Beispiel der Feuerbüchse. +cannery.stirling.2=Die Hitze die maximal verwendet werden kann ist limitiert, Übergeschwindigkeit kann zu katastrophalen Fehlfunktionen führen. +cannery.stirling.3=Die verbesserte Version kann wesentlich mehr Hitze aufnehmen, ohne kaputt zu werden. + chem.ARSENIC=Arsenextraktion chem.ASPHALT=Asphaltherstellung chem.BAKELITE=Bakelitherstellung @@ -2824,6 +2858,7 @@ item.upgrade_ejector_3.name=Auswurfupgrade Mk.III item.upgrade_fortune_1.name=Glückupgrade Mk.I item.upgrade_fortune_2.name=Glückupgrade Mk.II item.upgrade_fortune_3.name=Glückupgrade Mk.III +item.upgrade_gc_speed.name=Gaszentrifugen-Geschwindigkeitsupgrade item.upgrade_health.name=Kraftfeld-Resistenzupgrade item.upgrade_nullifier.name=Müllvernichter-Upgrade item.upgrade_overdrive_1.name=Overdrive-Upgrade Mk.I @@ -3599,6 +3634,7 @@ tile.pink_log.name=Pinkes Holz tile.pink_planks.name=Pinke Holzbretter tile.pink_slab.name=Pinke Holzstufe tile.pink_stairs.name=Pinke Holztreppen +tile.plant_dead.name=Tote Pflanze tile.plant_flower.foxglove.name=Roter Fingerhut tile.plant_flower.nightshade.name=Schwarze Tollkirsche tile.plant_flower.tobacco.name=Tabakpflanze diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c9f511f43..a62bf5050 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -314,6 +314,40 @@ book.starter.page18=vær is just a guy who has been trapped in the grey void fea #book.rbmk.title16=Meltdown #book.rbmk.page16=§4§lAvoid. +cannery.f1=[ Press F1 for help ] + +cannery.centrifuge.0=Gas centrifuges can be supplied with fluid using regular fluid ducts. +cannery.centrifuge.1=Most recipes require multiple centrifuges. The intermediate products cannot be transported via pipes. +cannery.centrifuge.2=This side acts as a connector which outputs the intermediate product into an adjacent centrifuge. +cannery.centrifuge.3=Uranium hexafluoride can be processed with just two centrifuges, this however will produce Uranium fuel and Uranium-238. +cannery.centrifuge.4=Fully processing it into Uranium-235 and Uranium-238 requires a total of four centrifuges. +cannery.centrifuge.5=Some recipes also require the centrifuge overclocking upgrade. + +cannery.fensu.0=The FEnSU is capable of storing absurd amounts of energy, over 9EHE (that's a nine followed by 18 zeros). +cannery.fensu.1=There is only one energy connector which can be found on the bottom. +cannery.fensu.2=This is also the only place where the FEnSU can receive a redstone signal. + +cannery.firebox.0=The firebox burns flammable items to generate heat. +cannery.firebox.1=It can burn any flammable item, although higher quality fuels such as coal, coke and solid fuel burn longer and hotter. +cannery.firebox.2=Heat is given off by the copper contact at the top of the firebox. Machines with an identical contact on the bottom can receive heat by being placed on top of the firebox. +cannery.firebox.3=If heat isn't being used up and the heat buffer becomes full, the firebox will shut off to prevent wasting of fuel. +cannery.firebox.4=One such machine is the stirling engine, which will turn heat directly into energy. + +cannery.silex.0=The Free Electron Laser (FEL) uses energy and a laser crystal to create a powerful laser beam. +cannery.silex.1=Be careful, as the laser will burn/melt through weaker blocks... +cannery.silex.2=...but not blast-proof ones. +cannery.silex.3=The FEL is used to power the Laser Isotope Separation Chamber (SILEX). The FEL and SILEX have to be at least two blocks apart. +cannery.silex.4=The laser has to enter through the glass openings of the SILEX. Aiming it wrong could destroy it. +cannery.silex.5=The openings on the sides can be used to connect fluid ducts to the SILEX. +cannery.silex.6=In addition to the two connectors on the sides, there is a third hidden connector at the bottom from which items can be extracted. +cannery.silex.7=Each recipe requires a specific laser type. Using a stronger type than required will process items faster. +cannery.silex.8=One FEL can supply up to 5 SILEX. Each SILEX has to be one block apart from one another. + +cannery.stirling.0=The Stirling engine uses heat energy from external sources to create power. +cannery.stirling.1=It needs to be placed on top of a heat-producing machine, such as the firebox. +cannery.stirling.2=The amount of heat it can utilize however is limited, overspinning can lead to catastrophic malfunction. +cannery.stirling.3=The upgraded version can take significantly more heat without breaking. + chem.ARSENIC=Arsenic Extraction chem.ASPHALT=Asphalt Production chem.BAKELITE=Bakelite Production @@ -4041,6 +4075,7 @@ tile.pink_log.name=Pink Log tile.pink_planks.name=Pink Wood Planks tile.pink_slab.name=Pink Wood Slab tile.pink_stairs.name=Pink Wood Stairs +tile.plant_dead.name=Dead Plant tile.plant_flower.foxglove.name=Foxglove tile.plant_flower.nightshade.name=Deadly Nightshade tile.plant_flower.tobacco.name=Tobacco Plant diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.bigflower.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.bigflower.png new file mode 100644 index 0000000000000000000000000000000000000000..9898dc7ee639870ad0623e244e3d99ff84480ae1 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}f0G|-oDcu(9mpWC(+E2>&N%1kME7J$ccrRJ~0Z6fz1o;L32LlEvZ)P{3 z5NCl$WHAE+-(e7DJf6QI1t=Ke>Ealo5xlj>lkb252lMfq|Mf+UD=fd>3Dm8=sb)(;+%O}4D bD^)T)N@Ce{W%DT^p!p1*u6{1-oD!M<$yQQ! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.fern.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.fern.png new file mode 100644 index 0000000000000000000000000000000000000000..6df4a050872554518b58565bacd606ec3f36ea3a GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|>0G|-o@_dbHy;gfS2LJ{3G6qG0)RhGJ1^@s5pTR+E$w zc7!rkEV6yO#Br+0xBbb?o0O87KXK%-%Y3qSSZA=&IjVFnQ>)%GuH!&689ZJ6T-G@y GGywpOr$iM1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.flower.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.flower.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d5b4bcd63035135bc1d40551f7c53748e0e92c GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}f0G|-o^-G=V%JipnTcr4yRL0s*%J%`v9R4B}38dIdg8YL2g8_q-H?td1 zh_k>WvY3H^?=T269?xHq0u*%gba4#P2tL}w&BdU=;aqz2UHy}`G)M7_2k$p#)_jq^ zaj(jvb7J(p7Ok`u;tWqD4EYOA2%A5W)cnft>czT-aVLXtEbEjTzyAYGWnl1h^>bP0 Hl+XkKMI}Zt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.generic.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.generic.png new file mode 100644 index 0000000000000000000000000000000000000000..95c164e6af58aed7910cd8f3acb93624c807297e GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|>0G|-o^-Gr93EUXFzsVfQc3;zHAKZAqT$}d1ZXMsm#F#`kN zVGw3Kp1&dmC}`~I;uxY4e6{N!FN1=>A&qzYHy3NS%G|>0G|-o`O|!-bX(Mw=>rAMa9bS&sVfQc3;zHAKZAqT$}d1ZXMsm#F#`kN zVGw3Kp1&dmC}`;E;uxY4e6{N~CxZbGQ|+7m#fyJx-d!MgSo6^NzhO_N2bez4OSpEL i`HIHkGLK0~U3R_Km^MYuD^~+*X7F_Nb6Mw<&;$VdK0G`C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/gui_utility.png b/src/main/resources/assets/hbm/textures/gui/gui_utility.png index c251970510966c8ac580705b2e385ab79ceae995..9c33f4a0e91a04573386fc433b4ac7bfbee76af1 100644 GIT binary patch literal 3954 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 Ip?kvr0DU!4f&c&j delta 3399 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 IVeTIDe;Lii!T Date: Sun, 4 Sep 2022 23:05:36 +0300 Subject: [PATCH 042/111] Updated ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 324af65ba..9fd4ffdd0 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -149,6 +149,40 @@ achievement.sulfuric=я не должен был окунать свои яйц achievement.witchtaunter.desc=Эти твари ничего тебе не сделают! achievement.witchtaunter=Насмехайтесь над ведьмами +cannery.f1=[ Press F1 for help ] + +cannery.centrifuge.0=Gas centrifuges can be supplied with fluid using regular fluid ducts. +cannery.centrifuge.1=Most recipes require multiple centrifuges. The intermediate products cannot be transported via pipes. +cannery.centrifuge.2=This side acts as a connector which outputs the intermediate product into an adjacent centrifuge. +cannery.centrifuge.3=Uranium hexafluoride can be processed with just two centrifuges, this however will produce Uranium fuel and Uranium-238. +cannery.centrifuge.4=Fully processing it into Uranium-235 and Uranium-238 requires a total of four centrifuges. +cannery.centrifuge.5=Some recipes also require the centrifuge overclocking upgrade. + +cannery.fensu.0=The FEnSU is capable of storing absurd amounts of energy, over 9EHE (that's a nine followed by 18 zeros). +cannery.fensu.1=There is only one energy connector which can be found on the bottom. +cannery.fensu.2=This is also the only place where the FEnSU can receive a redstone signal. + +cannery.firebox.0=The firebox burns flammable items to generate heat. +cannery.firebox.1=It can burn any flammable item, although higher quality fuels such as coal, coke and solid fuel burn longer and hotter. +cannery.firebox.2=Heat is given off by the copper contact at the top of the firebox. Machines with an identical contact on the bottom can receive heat by being placed on top of the firebox. +cannery.firebox.3=If heat isn't being used up and the heat buffer becomes full, the firebox will shut off to prevent wasting of fuel. +cannery.firebox.4=One such machine is the stirling engine, which will turn heat directly into energy. + +cannery.silex.0=The Free Electron Laser (FEL) uses energy and a laser crystal to create a powerful laser beam. +cannery.silex.1=Be careful, as the laser will burn/melt through weaker blocks... +cannery.silex.2=...but not blast-proof ones. +cannery.silex.3=The FEL is used to power the Laser Isotope Separation Chamber (SILEX). The FEL and SILEX have to be at least two blocks apart. +cannery.silex.4=The laser has to enter through the glass openings of the SILEX. Aiming it wrong could destroy it. +cannery.silex.5=The openings on the sides can be used to connect fluid ducts to the SILEX. +cannery.silex.6=In addition to the two connectors on the sides, there is a third hidden connector at the bottom from which items can be extracted. +cannery.silex.7=Each recipe requires a specific laser type. Using a stronger type than required will process items faster. +cannery.silex.8=One FEL can supply up to 5 SILEX. Each SILEX has to be one block apart from one another. + +cannery.stirling.0=The Stirling engine uses heat energy from external sources to create power. +cannery.stirling.1=It needs to be placed on top of a heat-producing machine, such as the firebox. +cannery.stirling.2=The amount of heat it can utilize however is limited, overspinning can lead to catastrophic malfunction. +cannery.stirling.3=The upgraded version can take significantly more heat without breaking. + potion.hbm_taint=Порча potion.hbm_mutation=Заражённое порчей сердце potion.hbm_radiation=Излучение @@ -3156,6 +3190,7 @@ item.kit_toolbox_empty.name=Пустой ящик для инструменто tile.burning_earth.name=Горящая трава tile.waste_earth.name=Мертвая трава tile.dirt_dead.name=Мертвая земля +tile.plant_dead.name=Мертвое растение tile.dirt_oily.name=Пропитанная нефтью земля tile.waste_trinitite.name=Тринититовая руда tile.waste_trinitite_red.name=Красная тринититовая руда @@ -3749,6 +3784,7 @@ item.radx.name=Рад-X item.mentats.name=Ментаты item.pt_mentats.name=Праздничные Ментаты item.pill_iodine.name=Таблетка иода +item.pill_herbal.name=Травяная паста item.fmn.name=Таблетка флунитразепама item.xanax.name=Препарат "НАКСА" против дигаммы item.five_htp.name=Таблетки энтерамина From 1f58ab69a7e087dec435566c4ba4257103c57411 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 6 Sep 2022 22:22:12 +0200 Subject: [PATCH 043/111] yeah whatever this is --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../hbm/blocks/machine/MachineSawmill.java | 165 ++ src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 2 + .../hbm/render/tileentity/RenderSawmill.java | 89 + .../java/com/hbm/tileentity/TileMappings.java | 1 + .../tileentity/machine/TileEntitySawmill.java | 237 ++ src/main/java/com/hbm/util/ItemStackUtil.java | 11 - src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../assets/hbm/models/machines/sawmill.obj | 2296 +++++++++++++++++ .../hbm/textures/models/machines/sawmill.png | Bin 0 -> 6452 bytes 12 files changed, 2796 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineSawmill.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderSawmill.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java create mode 100644 src/main/resources/assets/hbm/models/machines/sawmill.obj create mode 100644 src/main/resources/assets/hbm/textures/models/machines/sawmill.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index fc1ba1692..470b4747b 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -633,6 +633,7 @@ public class ModBlocks { public static Block furnace_steel; public static Block machine_stirling; public static Block machine_stirling_steel; + public static Block machine_sawmill; public static Block machine_difurnace_off; public static Block machine_difurnace_on; @@ -1806,6 +1807,7 @@ public class ModBlocks { furnace_steel = new FurnaceSteel().setBlockName("furnace_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_stirling = new MachineStirling().setBlockName("machine_stirling").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_stirling_steel = new MachineStirling().setBlockName("machine_stirling_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_sawmill = new MachineSawmill().setBlockName("machine_sawmill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); @@ -2990,6 +2992,7 @@ public class ModBlocks { register(furnace_steel); register(machine_stirling); register(machine_stirling_steel); + register(machine_sawmill); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_rtg_off, machine_difurnace_rtg_off.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/MachineSawmill.java b/src/main/java/com/hbm/blocks/machine/MachineSawmill.java new file mode 100644 index 000000000..b33c3d5d9 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineSawmill.java @@ -0,0 +1,165 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntitySawmill; +import com.hbm.util.BobMathUtil; +import com.hbm.util.I18nUtil; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineSawmill extends BlockDummyable implements ILookOverlay, ITooltipProvider { + + public MachineSawmill() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) + return new TileEntitySawmill(); + + if(meta >= extra) + return new TileEntityProxyCombo().inventory(); + + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {1, 0, 1, 1, 1, 1}; + } + + @Override + public int getOffset() { + return 1; + } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + x = x + dir.offsetX * o; + z = z + dir.offsetZ * o; + + this.makeExtra(world, x + 1, y, z); + this.makeExtra(world, x - 1, y, z); + this.makeExtra(world, x, y, z + 1); + this.makeExtra(world, x, y, z - 1); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(world.isRemote) { + return true; + + } else if(!player.isSneaking()) { + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return false; + + TileEntitySawmill sawmill = (TileEntitySawmill)world.getTileEntity(pos[0], pos[1], pos[2]); + + if(sawmill.slots[1] != null || sawmill.slots[2] != null) { + for(int i = 1; i < 3; i++) { + if(sawmill.slots[i] != null) { + if(!player.inventory.addItemStackToInventory(sawmill.slots[i].copy())) { + player.dropPlayerItemWithRandomChoice(sawmill.slots[i].copy(), false); + } + sawmill.slots[i] = null; + } + } + player.inventoryContainer.detectAndSendChanges(); + sawmill.markDirty(); + return true; + + } else { + if(sawmill.slots[0] == null && player.getHeldItem() != null && sawmill.getOutput(player.getHeldItem()) != null) { + sawmill.slots[0] = player.getHeldItem().copy(); + sawmill.slots[0].stackSize = 1; + player.getHeldItem().stackSize--; + sawmill.markDirty(); + player.inventoryContainer.detectAndSendChanges(); + return true; + } + } + } + + return false; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntitySawmill)) + return; + + TileEntitySawmill stirling = (TileEntitySawmill) te; + + List text = new ArrayList(); + text.add(stirling.heat + "TU/t"); + + double percent = (double) stirling.heat / (double) 300; + int color = ((int) (0xFF - 0xFF * percent)) << 16 | ((int)(0xFF * percent) << 8); + + if(percent > 1D) + color = 0xff0000; + + text.add("&[" + color + "&]" + ((stirling.heat * 1000 / 300) / 10D) + "%"); + + int limiter = stirling.progress * 26 / stirling.processingTime; + String bar = EnumChatFormatting.GREEN + "[ "; + for(int i = 0; i < 25; i++) { + if(i == limiter) { + bar += EnumChatFormatting.RESET; + } + + bar += "▏"; + } + + bar += EnumChatFormatting.GREEN + " ]"; + + text.add(bar); + + for(int i = 0; i < 3; i++) { + if(stirling.slots[i] != null) { + text.add((i == 0 ? (EnumChatFormatting.GREEN + "-> ") : (EnumChatFormatting.RED + "<- ")) + EnumChatFormatting.RESET + stirling.slots[i].getDisplayName() + (stirling.slots[i].stackSize > 1 ? " x" + stirling.slots[i].stackSize : "")); + } + } + + if(stirling.heat > 300) { + text.add("&[" + (BobMathUtil.getBlink() ? 0xff0000 : 0xffff00) + "&]! ! ! OVERSPEED ! ! !"); + } + + if(!stirling.hasBlade) { + text.add("&[" + 0xff0000 + "&]Blade missing!"); + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index a570423a0..49397dc48 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -263,6 +263,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterFirebox.class, new RenderFirebox()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterOilburner.class, new RenderOilburner()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityStirling.class, new RenderStirling()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySawmill.class, new RenderSawmill()); //AMS ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSBase.class, new RenderAMSBase()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSEmitter.class, new RenderAMSEmitter()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 3de95a373..f1a0d6e0e 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -63,6 +63,7 @@ public class ResourceManager { //Heat Engines public static final IModelCustom stirling = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/stirling.obj")); + public static final IModelCustom sawmill = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/sawmill.obj")); //Furnaces public static final IModelCustom furnace_iron = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_iron.obj")); @@ -383,6 +384,7 @@ public class ResourceManager { //Heat Engines public static final ResourceLocation stirling_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling.png"); public static final ResourceLocation stirling_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling_steel.png"); + public static final ResourceLocation sawmill_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/sawmill.png"); //Furnaces public static final ResourceLocation furnace_iron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_iron.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderSawmill.java b/src/main/java/com/hbm/render/tileentity/RenderSawmill.java new file mode 100644 index 000000000..e6a66cfa1 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderSawmill.java @@ -0,0 +1,89 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntitySawmill; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderSawmill extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + TileEntitySawmill sawmill = (TileEntitySawmill) tile; + + float rot = sawmill.lastSpin + (sawmill.spin - sawmill.lastSpin) * interp; + renderCommon(rot, sawmill.hasBlade); + + GL11.glPopMatrix(); + } + + private void renderCommon(float rot, boolean hasBlade) { + + bindTexture(ResourceManager.sawmill_tex); + ResourceManager.sawmill.renderPart("Main"); + + if(hasBlade) { + GL11.glPushMatrix(); + GL11.glTranslated(0, 1.375, 0); + GL11.glRotatef(-rot * 2, 0, 0, 1); + GL11.glTranslated(0, -1.375, 0); + ResourceManager.sawmill.renderPart("Blade"); + GL11.glPopMatrix(); + } + + GL11.glPushMatrix(); + GL11.glTranslated(0.5625, 1.375, 0); + GL11.glRotatef(rot, 0, 0, 1); + GL11.glTranslated(-0.5625, -1.375, 0); + ResourceManager.sawmill.renderPart("GearLeft"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(-0.5625, 1.375, 0); + GL11.glRotatef(-rot, 0, 0, 1); + GL11.glTranslated(0.5625, -1.375, 0); + ResourceManager.sawmill.renderPart("GearRight"); + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_sawmill); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -1.5, 0); + GL11.glScaled(3.25, 3.25, 3.25); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glRotatef(90, 0F, 1F, 0F); + boolean cog = item.getItemDamage() != 1; + RenderSawmill.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1F : 0, cog); + }}; + } + +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 96ce3d2c0..ae50f7837 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -249,6 +249,7 @@ public class TileMappings { put(TileEntityFurnaceIron.class, "tileentity_furnace_iron"); put(TileEntityFurnaceSteel.class, "tileentity_furnace_steel"); put(TileEntityStirling.class, "tileentity_stirling"); + put(TileEntitySawmill.class, "tileentity_sawmill"); put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter"); put(TileEntityDiFurnaceRTG.class, "tileentity_rtg_difurnace"); put(TileEntityMachineRadiolysis.class, "tileentity_radiolysis"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java new file mode 100644 index 000000000..a9512d229 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -0,0 +1,237 @@ +package com.hbm.tileentity.machine; + +import java.util.List; + +import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCraftingAuto; +import com.hbm.util.ItemStackUtil; + +import api.hbm.tile.IHeatSource; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; + +public class TileEntitySawmill extends TileEntityMachineBase { + + public int heat; + public static final double diffusion = 0.1D; + private int warnCooldown = 0; + private int overspeed = 0; + public boolean hasBlade = true; + public int progress = 0; + public static final int processingTime = 600; + + public float spin; + public float lastSpin; + + public TileEntitySawmill() { + super(3); + } + + @Override + public String getName() { return ""; } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(hasBlade) { + tryPullHeat(); + + if(warnCooldown > 0) + warnCooldown--; + + if(heat >= 100) { + + ItemStack result = this.getOutput(slots[0]); + + if(result != null) { + progress += heat / 10; + + if(progress >= this.processingTime) { + progress = 0; + slots[0] = null; + slots[1] = result; + this.markDirty(); + } + + } else { + this.progress = 0; + } + } else { + this.progress = 0; + } + + if(heat > 300) { + + this.overspeed++; + + if(overspeed > 60 && warnCooldown == 0) { + warnCooldown = 100; + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1, zCoord + 0.5, "hbm:block.warnOverspeed", 2.0F, 1.0F); + } + + if(overspeed > 300) { + this.hasBlade = false; + this.worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 5F, false, false); + this.markDirty(); + } + + } else { + this.overspeed = 0; + } + } else { + this.overspeed = 0; + this.warnCooldown = 0; + } + + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("heat", heat); + data.setInteger("progress", progress); + data.setBoolean("hasBlade", hasBlade); + + NBTTagList list = new NBTTagList(); + for(int i = 0; i < slots.length; i++) { + if(slots[i] != null) { + NBTTagCompound nbt1 = new NBTTagCompound(); + nbt1.setByte("slot", (byte) i); + slots[i].writeToNBT(nbt1); + list.appendTag(nbt1); + } + } + data.setTag("items", list); + + INBTPacketReceiver.networkPack(this, data, 150); + + this.heat = 0; + + } else { + + float momentum = heat * 25F / ((float) 300); + + this.lastSpin = this.spin; + this.spin += momentum; + + if(this.spin >= 360F) { + this.spin -= 360F; + this.lastSpin -= 360F; + } + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.heat = nbt.getInteger("heat"); + this.progress = nbt.getInteger("progress"); + this.hasBlade = nbt.getBoolean("hasBlade"); + + NBTTagList list = nbt.getTagList("items", 10); + + slots = new ItemStack[3]; + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound nbt1 = list.getCompoundTagAt(i); + byte b0 = nbt1.getByte("slot"); + if(b0 >= 0 && b0 < slots.length) { + slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); + } + } + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + int heatSrc = (int) (source.getHeatStored() * diffusion); + + if(heatSrc > 0) { + source.useUpHeat(heatSrc); + this.heat += heatSrc; + return; + } + } + + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); + } + + protected InventoryCraftingAuto craftingInventory = new InventoryCraftingAuto(1, 1); + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + return i == 0 && slots[0] == null && slots[1] == null && slots[2] == null && stack.stackSize == 1 && getOutput(stack) != null; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i > 0; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {0, 1, 2}; + } + + public ItemStack getOutput(ItemStack input) { + + if(input == null) + return null; + + craftingInventory.setInventorySlotContents(0, input); + + List names = ItemStackUtil.getOreDictNames(input); + + if(names.contains("logWood")) { + for(Object o : CraftingManager.getInstance().getRecipeList()) { + IRecipe recipe = (IRecipe) o; + if(recipe.matches(craftingInventory, worldObj)) { + ItemStack out = recipe.getCraftingResult(craftingInventory); + if(out != null) { + out = out.copy(); //for good measure + out.stackSize = out.stackSize * 6 / 4; //4 planks become 6 + return out; + } + } + } + } + + if(names.contains("plankWood")) { + return new ItemStack(Items.stick, 4); + } + + return null; + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 2, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/java/com/hbm/util/ItemStackUtil.java b/src/main/java/com/hbm/util/ItemStackUtil.java index ea4c1b843..c90042a4a 100644 --- a/src/main/java/com/hbm/util/ItemStackUtil.java +++ b/src/main/java/com/hbm/util/ItemStackUtil.java @@ -139,22 +139,12 @@ public class ItemStackUtil { return stacks; } - //private static HashMap> buffered = new HashMap(); - /** * Returns a List of all ore dict names for this stack. Stack cannot be null, list is empty when there are no ore dict entries. * @param stack * @return */ public static List getOreDictNames(ItemStack stack) { - - /*ÜComparableStack comp = new ComparableStack(stack).makeSingular(); - - List buff = buffered.get(comp); - - if(buff != null) - return buff;*/ - List list = new ArrayList(); int ids[] = OreDictionary.getOreIDs(stack); @@ -162,7 +152,6 @@ public class ItemStackUtil { list.add(OreDictionary.getOreName(i)); } - //buffered.put(comp, new ArrayList(list)); return list; } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 511425f4c..5eb9e96c4 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3496,6 +3496,7 @@ tile.machine_rtg_purple.name=Paarvernichtungsgenerator tile.machine_rtg_red.name=Fulminationsgenerator tile.machine_rtg_yellow.name=Australium Supergenerator tile.machine_satlinker.name=Satelliten-ID-Manager +tile.machine_sawmill.name=Stirling-Sägemühle tile.machine_schrabidium_battery.name=Schrabidium-Energiespeicherblock tile.machine_schrabidium_transmutator.name=Schrabidium-Transmutationsgerät tile.machine_selenium.name=Hochleistungs-Sternmotor diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index a62bf5050..f5f460306 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3936,6 +3936,7 @@ tile.machine_rtg_purple.name=Antimatter Annihilation Generator tile.machine_rtg_red.name=Fulmination Generator tile.machine_rtg_yellow.name=Australium Superfuel Reactor tile.machine_satlinker.name=Satellite ID Manager +tile.machine_sawmill.name=Stirling Sawmill tile.machine_schrabidium_battery.name=Schrabidium Energy Storage Block tile.machine_schrabidium_transmutator.name=Schrabidium Transmutation Device tile.machine_selenium.name=Radial Performance Engine diff --git a/src/main/resources/assets/hbm/models/machines/sawmill.obj b/src/main/resources/assets/hbm/models/machines/sawmill.obj new file mode 100644 index 000000000..880f0f117 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/sawmill.obj @@ -0,0 +1,2296 @@ +# Blender v2.79 (sub 0) OBJ File: 'sawmill.blend' +# www.blender.org +o GearRight +v -0.687500 0.687500 -1.031250 +v -0.687500 0.687500 -1.218750 +v -0.437500 0.687500 -1.031250 +v -0.437500 0.687500 -1.218750 +v -0.129487 1.625000 -1.250000 +v -0.312500 1.808013 -1.250000 +v -0.562500 1.875000 -1.250000 +v -0.812500 1.808012 -1.250000 +v -0.995513 1.625000 -1.250000 +v -1.062500 1.375000 -1.250000 +v -0.995513 1.125000 -1.250000 +v -0.812500 0.941987 -1.250000 +v -0.562500 0.875000 -1.250000 +v -0.312500 0.941987 -1.250000 +v -0.062500 1.375000 -1.250000 +v -0.129487 1.125000 -1.250000 +v -0.129487 1.625000 -1.000000 +v -0.312500 1.808013 -1.000000 +v -0.562500 1.875000 -1.000000 +v -0.812500 1.808012 -1.000000 +v -0.995513 1.625000 -1.000000 +v -1.062500 1.375000 -1.000000 +v -0.995513 1.125000 -1.000000 +v -0.812500 0.941987 -1.000000 +v -0.562500 0.875000 -1.000000 +v -0.312500 0.941987 -1.000000 +v -0.129487 1.125000 -1.000000 +v -0.062500 1.375000 -1.000000 +v -0.687500 0.937500 -1.218750 +v -0.437500 0.937500 -1.218750 +v -0.687500 0.937500 -1.031250 +v -0.437500 0.937500 -1.031250 +v -0.437500 2.062500 -1.031250 +v -0.437500 2.062500 -1.218750 +v -0.687500 2.062500 -1.031250 +v -0.687500 2.062500 -1.218750 +v -0.437500 1.812500 -1.218750 +v -0.687500 1.812500 -1.218750 +v -0.437500 1.812500 -1.031250 +v -0.687500 1.812500 -1.031250 +v -0.029608 0.922997 -1.031250 +v -0.029608 0.922997 -1.218750 +v 0.095392 1.139503 -1.031250 +v 0.095392 1.139503 -1.218750 +v -0.246114 1.047997 -1.218750 +v -0.121114 1.264503 -1.218750 +v -0.246114 1.047997 -1.031250 +v -0.121114 1.264503 -1.031250 +v -1.095392 1.827003 -1.031250 +v -1.095392 1.827003 -1.218750 +v -1.220392 1.610497 -1.031250 +v -1.220392 1.610497 -1.218750 +v -0.878886 1.702003 -1.218750 +v -1.003886 1.485497 -1.218750 +v -0.878886 1.702003 -1.031250 +v -1.003886 1.485497 -1.031250 +v 0.095393 1.610497 -1.031250 +v 0.095393 1.610497 -1.218750 +v -0.029607 1.827003 -1.031250 +v -0.029607 1.827003 -1.218750 +v -0.121114 1.485497 -1.218750 +v -0.246114 1.702003 -1.218750 +v -0.121114 1.485497 -1.031250 +v -0.246114 1.702003 -1.031250 +v -1.220392 1.139503 -1.031250 +v -1.220392 1.139503 -1.218750 +v -1.095392 0.922997 -1.031250 +v -1.095392 0.922997 -1.218750 +v -1.003886 1.264503 -1.218750 +v -0.878886 1.047997 -1.218750 +v -1.003886 1.264503 -1.031250 +v -0.878886 1.047997 -1.031250 +v -0.237741 1.562500 -1.000000 +v -0.375000 1.699759 -1.000000 +v -0.562500 1.750000 -1.000000 +v -0.750000 1.699759 -1.000000 +v -0.887259 1.562500 -1.000000 +v -0.937500 1.375000 -1.000000 +v -0.887259 1.187500 -1.000000 +v -0.750000 1.050241 -1.000000 +v -0.562500 1.000000 -1.000000 +v -0.375000 1.050241 -1.000000 +v -0.237740 1.187500 -1.000000 +v -0.187500 1.375000 -1.000000 +v -0.237741 1.562500 -1.250000 +v -0.375000 1.699759 -1.250000 +v -0.562500 1.750000 -1.250000 +v -0.750000 1.699759 -1.250000 +v -0.887259 1.562500 -1.250000 +v -0.937500 1.375000 -1.250000 +v -0.887259 1.187500 -1.250000 +v -0.750000 1.050241 -1.250000 +v -0.562500 1.000000 -1.250000 +v -0.375000 1.050241 -1.250000 +v -0.187500 1.375000 -1.250000 +v -0.237740 1.187500 -1.250000 +v -0.345994 1.500000 -1.250000 +v -0.437500 1.591506 -1.250000 +v -0.562500 1.625000 -1.250000 +v -0.687500 1.591506 -1.250000 +v -0.779006 1.500000 -1.250000 +v -0.812500 1.375000 -1.250000 +v -0.779006 1.250000 -1.250000 +v -0.687500 1.158494 -1.250000 +v -0.562500 1.125000 -1.250000 +v -0.437500 1.158494 -1.250000 +v -0.312500 1.375000 -1.250000 +v -0.345994 1.250000 -1.250000 +v -0.345994 1.500000 -1.000000 +v -0.437500 1.591506 -1.000000 +v -0.562500 1.625000 -1.000000 +v -0.687500 1.591506 -1.000000 +v -0.779006 1.500000 -1.000000 +v -0.812500 1.375000 -1.000000 +v -0.779006 1.250000 -1.000000 +v -0.687500 1.158494 -1.000000 +v -0.562500 1.125000 -1.000000 +v -0.437500 1.158494 -1.000000 +v -0.345994 1.250000 -1.000000 +v -0.312500 1.375000 -1.000000 +v -0.437500 1.562500 -1.062500 +v -0.437500 1.562500 -1.187500 +v -0.687500 1.562500 -1.062500 +v -0.687500 1.562500 -1.187500 +v -0.437500 1.750000 -1.062500 +v -0.437500 1.750000 -1.187500 +v -0.687500 1.750000 -1.062500 +v -0.687500 1.750000 -1.187500 +v -0.462620 1.172997 -1.062500 +v -0.462620 1.172997 -1.187500 +v -0.337621 1.389503 -1.062500 +v -0.337620 1.389503 -1.187500 +v -0.300241 1.079247 -1.062500 +v -0.300241 1.079247 -1.187500 +v -0.175241 1.295753 -1.062500 +v -0.175241 1.295753 -1.187500 +v -0.787380 1.389503 -1.062500 +v -0.787380 1.389503 -1.187500 +v -0.662380 1.172997 -1.062500 +v -0.662380 1.172997 -1.187500 +v -0.949759 1.295753 -1.062500 +v -0.949759 1.295753 -1.187500 +v -0.824759 1.079247 -1.062500 +v -0.824759 1.079247 -1.187500 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.666667 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.696429 +vt 0.598214 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.690476 0.767857 +vt 0.702381 0.732143 +vt 0.702381 0.767857 +vt 0.642857 0.767857 +vt 0.654762 0.732143 +vt 0.654762 0.767857 +vt 0.714286 0.732143 +vt 0.714286 0.767857 +vt 0.726190 0.732143 +vt 0.726190 0.767857 +vt 0.738095 0.732143 +vt 0.738095 0.767857 +vt 0.750000 0.732143 +vt 0.750000 0.767857 +vt 0.666667 0.732143 +vt 0.666667 0.767857 +vt 0.761905 0.732143 +vt 0.761905 0.767857 +vt 0.678571 0.732143 +vt 0.678571 0.767857 +vt 0.619048 0.767857 +vt 0.630952 0.732143 +vt 0.630952 0.767857 +vt 0.690476 0.732143 +vt 0.642857 0.732143 +vt 0.623435 0.679608 +vt 0.642857 0.662788 +vt 0.662280 0.679608 +vt 0.662280 0.786751 +vt 0.662280 0.820392 +vt 0.623435 0.820392 +vt 0.666667 0.705357 +vt 0.690476 0.732143 +vt 0.666667 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.690476 0.705357 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.830357 +vt 0.595238 0.714286 +vt 0.595238 0.714286 +vt 0.595238 0.714286 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.767857 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.619048 0.732143 +vt 0.665285 0.696429 +vt 0.662280 0.713249 +vt 0.654071 0.725563 +vt 0.642857 0.730070 +vt 0.631644 0.725563 +vt 0.623435 0.713249 +vt 0.620430 0.696429 +vt 0.631644 0.667295 +vt 0.654071 0.667295 +vt 0.620430 0.803571 +vt 0.642857 0.769930 +vt 0.623435 0.786751 +vt 0.631644 0.774437 +vt 0.654071 0.774437 +vt 0.665284 0.803571 +vt 0.654071 0.832705 +vt 0.642857 0.837212 +vt 0.631644 0.832705 +vt 0.738095 0.705357 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vn 0.0000 -1.0000 0.0000 +vn -0.2588 0.9659 0.0000 +vn 0.9659 -0.2588 0.0000 +vn -0.7071 0.7071 0.0000 +vn -0.9659 0.2588 0.0000 +vn -0.9659 -0.2588 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.9659 0.2588 0.0000 +vn -0.2588 -0.9659 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.2588 -0.9659 0.0000 +vn 0.2588 0.9659 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.8660 -0.5000 0.0000 +vn -0.8660 0.5000 0.0000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn 0.8660 0.5000 0.0000 +vn -0.8660 -0.5000 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +s off +f 3/1/1 2/2/1 4/3/1 +f 19/4/2 8/5/2 20/6/2 +f 27/7/3 15/8/3 28/9/3 +f 20/10/4 9/11/4 21/12/4 +f 21/13/5 10/14/5 22/15/5 +f 22/16/6 11/17/6 23/18/6 +f 23/19/7 12/20/7 24/21/7 +f 28/22/8 5/23/8 17/24/8 +f 24/25/9 13/26/9 25/27/9 +f 17/28/10 6/29/10 18/30/10 +f 25/31/11 14/32/11 26/33/11 +f 18/34/12 7/35/12 19/36/12 +f 26/37/13 16/38/13 27/39/13 +f 35/40/14 34/41/14 36/42/14 +f 3/43/15 31/44/15 1/45/15 +f 2/2/16 30/46/16 4/3/16 +f 4/3/17 32/47/17 3/43/17 +f 1/45/18 29/48/18 2/49/18 +f 33/50/15 40/51/15 39/52/15 +f 34/41/16 38/53/16 36/42/16 +f 36/42/18 40/51/18 35/54/18 +f 33/50/17 37/55/17 34/56/17 +f 43/57/19 42/58/19 44/59/19 +f 51/60/20 50/61/20 52/62/20 +f 41/63/15 48/64/15 47/65/15 +f 42/58/16 46/66/16 44/59/16 +f 44/59/21 48/64/21 43/67/21 +f 41/63/22 45/68/22 42/69/22 +f 51/70/15 55/71/15 49/72/15 +f 52/62/16 53/73/16 54/74/16 +f 52/62/22 56/75/22 51/70/22 +f 49/72/21 53/76/21 50/77/21 +f 59/78/23 58/79/23 60/80/23 +f 67/81/24 66/82/24 68/83/24 +f 57/84/15 64/85/15 63/86/15 +f 58/79/16 62/87/16 60/80/16 +f 60/80/25 64/85/25 59/88/25 +f 57/84/26 61/89/26 58/90/26 +f 65/91/15 72/92/15 71/93/15 +f 66/82/16 70/94/16 68/83/16 +f 68/83/26 72/92/26 67/95/26 +f 65/91/25 69/96/25 66/97/25 +f 20/6/15 75/98/15 19/4/15 +f 27/39/15 82/99/15 26/37/15 +f 17/24/15 84/100/15 28/22/15 +f 24/21/15 79/101/15 23/19/15 +f 20/10/15 77/102/15 76/103/15 +f 27/7/15 84/104/15 83/105/15 +f 17/28/15 74/106/15 73/107/15 +f 25/27/15 80/108/15 24/25/15 +f 22/15/15 77/109/15 21/13/15 +f 18/34/15 75/110/15 74/111/15 +f 26/33/15 81/112/15 25/31/15 +f 23/18/15 78/113/15 22/16/15 +f 10/14/16 89/114/16 90/115/16 +f 6/116/16 87/117/16 7/35/16 +f 13/118/16 94/119/16 14/32/16 +f 10/120/16 91/121/16 11/17/16 +f 8/5/16 87/122/16 88/123/16 +f 14/124/16 96/125/16 16/38/16 +f 5/23/16 95/126/16 85/127/16 +f 11/128/16 92/129/16 12/20/16 +f 8/130/16 89/131/16 9/11/16 +f 16/132/16 95/133/16 15/8/16 +f 5/134/16 86/135/16 6/29/16 +f 12/136/16 93/137/16 13/26/16 +f 94/119/2 81/138/2 82/139/2 +f 96/125/4 82/140/4 83/141/4 +f 95/133/5 83/142/5 84/143/5 +f 85/127/6 84/144/6 73/145/6 +f 86/135/7 73/146/7 74/147/7 +f 87/117/9 74/148/9 75/149/9 +f 88/123/11 75/150/11 76/151/11 +f 77/152/13 88/153/13 76/154/13 +f 90/115/3 77/155/3 78/156/3 +f 91/121/8 78/157/8 79/158/8 +f 92/129/10 79/159/10 80/160/10 +f 93/137/12 80/161/12 81/162/12 +f 111/163/2 100/164/2 112/165/2 +f 119/166/3 107/167/3 120/168/3 +f 112/165/4 101/169/4 113/170/4 +f 113/170/5 102/171/5 114/172/5 +f 114/172/6 103/173/6 115/174/6 +f 115/174/7 104/175/7 116/176/7 +f 120/168/8 97/177/8 109/178/8 +f 116/176/9 105/179/9 117/180/9 +f 109/178/10 98/181/10 110/182/10 +f 117/183/11 106/184/11 118/185/11 +f 110/182/12 99/186/12 111/163/12 +f 118/185/13 108/187/13 119/166/13 +f 115/188/15 117/189/15 119/190/15 +f 103/191/16 101/192/16 97/193/16 +f 125/194/15 123/195/15 121/196/15 +f 128/197/16 122/198/16 124/199/16 +f 127/200/18 124/199/18 123/195/18 +f 126/201/17 121/202/17 122/198/17 +f 129/203/15 135/204/15 131/205/15 +f 136/206/16 130/207/16 132/208/16 +f 135/204/21 132/208/21 131/205/21 +f 134/209/22 129/210/22 130/207/22 +f 137/211/15 143/212/15 139/213/15 +f 144/214/16 138/215/16 140/216/16 +f 143/212/26 140/216/26 139/213/26 +f 142/217/25 137/218/25 138/215/25 +f 3/1/1 1/219/1 2/2/1 +f 19/4/2 7/220/2 8/5/2 +f 27/7/3 16/132/3 15/8/3 +f 20/10/4 8/130/4 9/11/4 +f 21/13/5 9/221/5 10/14/5 +f 22/16/6 10/120/6 11/17/6 +f 23/19/7 11/128/7 12/20/7 +f 28/22/8 15/222/8 5/23/8 +f 24/25/9 12/136/9 13/26/9 +f 17/28/10 5/134/10 6/29/10 +f 25/31/11 13/118/11 14/32/11 +f 18/34/12 6/116/12 7/35/12 +f 26/37/13 14/124/13 16/38/13 +f 35/40/14 33/223/14 34/41/14 +f 3/43/15 32/47/15 31/44/15 +f 2/2/16 29/224/16 30/46/16 +f 4/3/17 30/46/17 32/47/17 +f 1/45/18 31/44/18 29/48/18 +f 33/50/15 35/54/15 40/51/15 +f 34/41/16 37/225/16 38/53/16 +f 36/42/18 38/53/18 40/51/18 +f 33/50/17 39/52/17 37/55/17 +f 43/57/19 41/226/19 42/58/19 +f 51/60/20 49/227/20 50/61/20 +f 41/63/15 43/67/15 48/64/15 +f 42/58/16 45/228/16 46/66/16 +f 44/59/21 46/66/21 48/64/21 +f 41/63/22 47/65/22 45/68/22 +f 51/70/15 56/75/15 55/71/15 +f 52/62/16 50/61/16 53/73/16 +f 52/62/22 54/74/22 56/75/22 +f 49/72/21 55/71/21 53/76/21 +f 59/78/23 57/229/23 58/79/23 +f 67/81/24 65/230/24 66/82/24 +f 57/84/15 59/88/15 64/85/15 +f 58/79/16 61/231/16 62/87/16 +f 60/80/25 62/87/25 64/85/25 +f 57/84/26 63/86/26 61/89/26 +f 65/91/15 67/95/15 72/92/15 +f 66/82/16 69/232/16 70/94/16 +f 68/83/26 70/94/26 72/92/26 +f 65/91/25 71/93/25 69/96/25 +f 20/6/15 76/233/15 75/98/15 +f 27/39/15 83/234/15 82/99/15 +f 17/24/15 73/235/15 84/100/15 +f 24/21/15 80/236/15 79/101/15 +f 20/10/15 21/12/15 77/102/15 +f 27/7/15 28/9/15 84/104/15 +f 17/28/15 18/30/15 74/106/15 +f 25/27/15 81/237/15 80/108/15 +f 22/15/15 78/238/15 77/109/15 +f 18/34/15 19/36/15 75/110/15 +f 26/33/15 82/239/15 81/112/15 +f 23/18/15 79/240/15 78/113/15 +f 10/14/16 9/221/16 89/114/16 +f 6/116/16 86/241/16 87/117/16 +f 13/118/16 93/242/16 94/119/16 +f 10/120/16 90/243/16 91/121/16 +f 8/5/16 7/220/16 87/122/16 +f 14/124/16 94/244/16 96/125/16 +f 5/23/16 15/222/16 95/126/16 +f 11/128/16 91/245/16 92/129/16 +f 8/130/16 88/153/16 89/131/16 +f 16/132/16 96/246/16 95/133/16 +f 5/134/16 85/247/16 86/135/16 +f 12/136/16 92/248/16 93/137/16 +f 94/119/2 93/242/2 81/138/2 +f 96/125/4 94/244/4 82/140/4 +f 95/133/5 96/246/5 83/142/5 +f 85/127/6 95/126/6 84/144/6 +f 86/135/7 85/247/7 73/146/7 +f 87/117/9 86/241/9 74/148/9 +f 88/123/11 87/122/11 75/150/11 +f 77/152/13 89/131/13 88/153/13 +f 90/115/3 89/114/3 77/155/3 +f 91/121/8 90/243/8 78/157/8 +f 92/129/10 91/245/10 79/159/10 +f 93/137/12 92/248/12 80/161/12 +f 111/163/2 99/186/2 100/164/2 +f 119/166/3 108/187/3 107/167/3 +f 112/165/4 100/164/4 101/169/4 +f 113/170/5 101/169/5 102/171/5 +f 114/172/6 102/171/6 103/173/6 +f 115/174/7 103/173/7 104/175/7 +f 120/168/8 107/167/8 97/177/8 +f 116/176/9 104/175/9 105/179/9 +f 109/178/10 97/177/10 98/181/10 +f 117/183/11 105/249/11 106/184/11 +f 110/182/12 98/181/12 99/186/12 +f 118/185/13 106/184/13 108/187/13 +f 119/190/15 120/250/15 109/251/15 +f 109/251/15 110/252/15 111/253/15 +f 111/253/15 112/254/15 115/188/15 +f 112/254/15 113/255/15 115/188/15 +f 113/255/15 114/256/15 115/188/15 +f 115/188/15 116/257/15 117/189/15 +f 117/189/15 118/258/15 119/190/15 +f 119/190/15 109/251/15 115/188/15 +f 109/251/15 111/253/15 115/188/15 +f 97/193/16 107/259/16 105/260/16 +f 107/259/16 108/261/16 105/260/16 +f 108/261/16 106/262/16 105/260/16 +f 105/260/16 104/263/16 103/191/16 +f 103/191/16 102/264/16 101/192/16 +f 101/192/16 100/265/16 97/193/16 +f 100/265/16 99/266/16 97/193/16 +f 99/266/16 98/267/16 97/193/16 +f 105/260/16 103/191/16 97/193/16 +f 125/194/15 127/200/15 123/195/15 +f 128/197/16 126/201/16 122/198/16 +f 127/200/18 128/197/18 124/199/18 +f 126/201/17 125/268/17 121/202/17 +f 129/203/15 133/269/15 135/204/15 +f 136/206/16 134/209/16 130/207/16 +f 135/204/21 136/206/21 132/208/21 +f 134/209/22 133/270/22 129/210/22 +f 137/211/15 141/271/15 143/212/15 +f 144/214/16 142/217/16 138/215/16 +f 143/212/26 144/214/26 140/216/26 +f 142/217/25 141/272/25 137/218/25 +o GearLeft +v 0.797997 0.717108 -1.031250 +v 0.797997 0.717108 -1.218750 +v 1.014503 0.842108 -1.031250 +v 1.014503 0.842108 -1.218750 +v 0.812500 1.808013 -1.250000 +v 0.562500 1.875000 -1.250000 +v 0.312500 1.808013 -1.250000 +v 0.129487 1.625000 -1.250000 +v 0.062500 1.375000 -1.250000 +v 0.129487 1.125000 -1.250000 +v 0.312500 0.941987 -1.250000 +v 0.562500 0.875000 -1.250000 +v 0.812500 0.941987 -1.250000 +v 0.995513 1.125000 -1.250000 +v 0.995513 1.625000 -1.250000 +v 1.062500 1.375000 -1.250000 +v 0.812500 1.808013 -1.000000 +v 0.562500 1.875000 -1.000000 +v 0.312500 1.808013 -1.000000 +v 0.129487 1.625000 -1.000000 +v 0.062500 1.375000 -1.000000 +v 0.129487 1.125000 -1.000000 +v 0.312500 0.941987 -1.000000 +v 0.562500 0.875000 -1.000000 +v 0.812500 0.941987 -1.000000 +v 0.995513 1.125000 -1.000000 +v 1.062500 1.375000 -1.000000 +v 0.995513 1.625000 -1.000000 +v 0.672997 0.933614 -1.218750 +v 0.889503 1.058614 -1.218750 +v 0.672997 0.933614 -1.031250 +v 0.889503 1.058614 -1.031250 +v 0.327004 2.032893 -1.031250 +v 0.327004 2.032893 -1.218750 +v 0.110497 1.907893 -1.031250 +v 0.110497 1.907893 -1.218750 +v 0.452004 1.816386 -1.218750 +v 0.235497 1.691386 -1.218750 +v 0.452004 1.816386 -1.031250 +v 0.235497 1.691386 -1.031250 +v 1.250000 1.250000 -1.031250 +v 1.250000 1.250000 -1.218750 +v 1.250000 1.500000 -1.031250 +v 1.250000 1.500000 -1.218750 +v 1.000000 1.250000 -1.218750 +v 1.000000 1.500000 -1.218750 +v 1.000000 1.250000 -1.031250 +v 1.000000 1.500000 -1.031250 +v -0.125000 1.500000 -1.031250 +v -0.125000 1.500000 -1.218750 +v -0.125000 1.250000 -1.031250 +v -0.125000 1.250000 -1.218750 +v 0.125000 1.500000 -1.218750 +v 0.125000 1.250000 -1.218750 +v 0.125000 1.500000 -1.031250 +v 0.125000 1.250000 -1.031250 +v 1.014503 1.907892 -1.031250 +v 1.014503 1.907892 -1.218750 +v 0.797997 2.032892 -1.031250 +v 0.797997 2.032892 -1.218750 +v 0.889503 1.691386 -1.218750 +v 0.672997 1.816386 -1.218750 +v 0.889503 1.691386 -1.031250 +v 0.672997 1.816386 -1.031250 +v 0.110497 0.842108 -1.031250 +v 0.110497 0.842108 -1.218750 +v 0.327003 0.717108 -1.031250 +v 0.327003 0.717108 -1.218750 +v 0.235497 1.058614 -1.218750 +v 0.452003 0.933614 -1.218750 +v 0.235497 1.058614 -1.031250 +v 0.452003 0.933614 -1.031250 +v 0.750000 1.699759 -1.000000 +v 0.562500 1.750000 -1.000000 +v 0.375000 1.699759 -1.000000 +v 0.237741 1.562500 -1.000000 +v 0.187500 1.375000 -1.000000 +v 0.237741 1.187500 -1.000000 +v 0.375000 1.050241 -1.000000 +v 0.562500 1.000000 -1.000000 +v 0.750000 1.050241 -1.000000 +v 0.887260 1.187500 -1.000000 +v 0.937500 1.375000 -1.000000 +v 0.887260 1.562500 -1.000000 +v 0.750000 1.699759 -1.250000 +v 0.562500 1.750000 -1.250000 +v 0.375000 1.699759 -1.250000 +v 0.237741 1.562500 -1.250000 +v 0.187500 1.375000 -1.250000 +v 0.237741 1.187500 -1.250000 +v 0.375000 1.050241 -1.250000 +v 0.562500 1.000000 -1.250000 +v 0.750000 1.050241 -1.250000 +v 0.887260 1.187500 -1.250000 +v 0.887260 1.562500 -1.250000 +v 0.937500 1.375000 -1.250000 +v 0.687500 1.591506 -1.250000 +v 0.562500 1.625000 -1.250000 +v 0.437500 1.591506 -1.250000 +v 0.345994 1.500000 -1.250000 +v 0.312500 1.375000 -1.250000 +v 0.345994 1.250000 -1.250000 +v 0.437500 1.158494 -1.250000 +v 0.562500 1.125000 -1.250000 +v 0.687500 1.158494 -1.250000 +v 0.779006 1.250000 -1.250000 +v 0.779006 1.500000 -1.250000 +v 0.812500 1.375000 -1.250000 +v 0.687500 1.591506 -1.000000 +v 0.562500 1.625000 -1.000000 +v 0.437500 1.591506 -1.000000 +v 0.345994 1.500000 -1.000000 +v 0.312500 1.375000 -1.000000 +v 0.345994 1.250000 -1.000000 +v 0.437500 1.158494 -1.000000 +v 0.562500 1.125000 -1.000000 +v 0.687500 1.158494 -1.000000 +v 0.779007 1.250000 -1.000000 +v 0.812500 1.375000 -1.000000 +v 0.779006 1.500000 -1.000000 +v 0.577003 1.599880 -1.062500 +v 0.577003 1.599880 -1.187500 +v 0.360497 1.474880 -1.062500 +v 0.360497 1.474880 -1.187500 +v 0.483254 1.762260 -1.062500 +v 0.483254 1.762260 -1.187500 +v 0.266747 1.637260 -1.062500 +v 0.266747 1.637260 -1.187500 +v 0.750000 1.250000 -1.062500 +v 0.750000 1.250000 -1.187500 +v 0.750000 1.500000 -1.062500 +v 0.750000 1.500000 -1.187500 +v 0.937500 1.250000 -1.062500 +v 0.937500 1.250000 -1.187500 +v 0.937500 1.500000 -1.062500 +v 0.937500 1.500000 -1.187500 +v 0.360497 1.275120 -1.062500 +v 0.360497 1.275120 -1.187500 +v 0.577003 1.150121 -1.062500 +v 0.577003 1.150121 -1.187500 +v 0.266747 1.112741 -1.062500 +v 0.266747 1.112741 -1.187500 +v 0.483253 0.987741 -1.062500 +v 0.483253 0.987741 -1.187500 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.666667 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.666667 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.666667 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.690476 0.767857 +vt 0.702381 0.732143 +vt 0.702381 0.767857 +vt 0.642857 0.767857 +vt 0.654762 0.732143 +vt 0.654762 0.767857 +vt 0.714286 0.732143 +vt 0.714286 0.767857 +vt 0.726190 0.767857 +vt 0.726190 0.732143 +vt 0.738095 0.767857 +vt 0.738095 0.732143 +vt 0.750000 0.732143 +vt 0.750000 0.767857 +vt 0.666667 0.732143 +vt 0.666667 0.767857 +vt 0.761905 0.732143 +vt 0.761905 0.767857 +vt 0.678571 0.767857 +vt 0.678571 0.732143 +vt 0.619048 0.767857 +vt 0.630952 0.732143 +vt 0.630952 0.767857 +vt 0.690476 0.732143 +vt 0.642857 0.732143 +vt 0.623435 0.679608 +vt 0.642857 0.662788 +vt 0.662280 0.679608 +vt 0.662280 0.786751 +vt 0.662280 0.820392 +vt 0.623435 0.820392 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.830357 +vt 0.595238 0.714286 +vt 0.595238 0.714286 +vt 0.595238 0.714286 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.619048 0.732143 +vt 0.665285 0.696429 +vt 0.662280 0.713249 +vt 0.654071 0.725563 +vt 0.642857 0.730070 +vt 0.631644 0.725563 +vt 0.623435 0.713249 +vt 0.620430 0.696429 +vt 0.631644 0.667295 +vt 0.654071 0.667295 +vt 0.620430 0.803571 +vt 0.642857 0.769930 +vt 0.623435 0.786751 +vt 0.631644 0.774437 +vt 0.654071 0.774437 +vt 0.665284 0.803571 +vt 0.654071 0.832705 +vt 0.642857 0.837212 +vt 0.631644 0.832705 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vn 0.5000 -0.8660 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.9659 0.2588 0.0000 +vn -0.9659 0.2588 0.0000 +vn -0.9659 -0.2588 0.0000 +vn -0.7071 -0.7071 0.0000 +vn -0.2588 -0.9659 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.2588 -0.9659 0.0000 +vn 0.2588 0.9659 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.2588 0.9659 0.0000 +vn 0.9659 -0.2588 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.8660 0.5000 0.0000 +vn -0.8660 -0.5000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 -0.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.8660 0.5000 0.0000 +vn 0.8660 -0.5000 0.0000 +s off +f 147/273/27 146/274/27 148/275/27 +f 163/276/28 152/277/28 164/278/28 +f 171/279/29 159/280/29 172/281/29 +f 164/282/30 153/283/30 165/284/30 +f 165/285/31 154/286/31 166/287/31 +f 166/288/32 155/289/32 167/290/32 +f 167/291/33 156/292/33 168/293/33 +f 172/294/34 149/295/34 161/296/34 +f 168/297/35 157/298/35 169/299/35 +f 161/300/36 150/301/36 162/302/36 +f 169/303/37 158/304/37 170/305/37 +f 162/306/38 151/307/38 163/308/38 +f 170/309/39 160/310/39 171/311/39 +f 179/312/40 178/313/40 180/314/40 +f 147/315/41 175/316/41 145/317/41 +f 148/275/42 173/318/42 174/319/42 +f 148/275/43 176/320/43 147/315/43 +f 145/317/44 173/321/44 146/322/44 +f 179/323/41 183/324/41 177/325/41 +f 180/314/42 181/326/42 182/327/42 +f 179/323/44 182/327/44 184/328/44 +f 177/325/43 181/329/43 178/330/43 +f 187/331/45 186/332/45 188/333/45 +f 195/334/46 194/335/46 196/336/46 +f 185/337/41 192/338/41 191/339/41 +f 186/332/42 190/340/42 188/333/42 +f 188/333/47 192/338/47 187/341/47 +f 185/337/48 189/342/48 186/343/48 +f 195/344/41 199/345/41 193/346/41 +f 196/336/42 197/347/42 198/348/42 +f 196/336/48 200/349/48 195/344/48 +f 193/346/47 197/350/47 194/351/47 +f 203/352/49 202/353/49 204/354/49 +f 211/355/50 210/356/50 212/357/50 +f 201/358/41 208/359/41 207/360/41 +f 202/353/42 206/361/42 204/354/42 +f 204/354/51 208/359/51 203/362/51 +f 201/358/52 205/363/52 202/364/52 +f 209/365/41 216/366/41 215/367/41 +f 210/356/42 214/368/42 212/357/42 +f 212/357/52 216/366/52 211/369/52 +f 209/365/51 213/370/51 210/371/51 +f 164/278/41 219/372/41 163/276/41 +f 171/311/41 226/373/41 170/309/41 +f 161/296/41 228/374/41 172/294/41 +f 167/291/41 224/375/41 223/376/41 +f 165/284/41 220/377/41 164/282/41 +f 172/281/41 227/378/41 171/279/41 +f 161/300/41 218/379/41 217/380/41 +f 169/299/41 224/381/41 168/297/41 +f 166/287/41 221/382/41 165/285/41 +f 163/308/41 218/383/41 162/306/41 +f 170/305/41 225/384/41 169/303/41 +f 167/290/41 222/385/41 166/288/41 +f 153/386/42 234/387/42 154/286/42 +f 150/388/42 231/389/42 151/307/42 +f 157/390/42 238/391/42 158/304/42 +f 154/392/42 235/393/42 155/289/42 +f 152/277/42 231/394/42 232/395/42 +f 158/396/42 240/397/42 160/310/42 +f 149/295/42 239/398/42 229/399/42 +f 155/400/42 236/401/42 156/292/42 +f 152/402/42 233/403/42 153/283/42 +f 159/280/42 240/404/42 239/405/42 +f 149/406/42 230/407/42 150/301/42 +f 156/408/42 237/409/42 157/298/42 +f 238/391/28 225/410/28 226/411/28 +f 240/397/30 226/412/30 227/413/30 +f 239/405/31 227/414/31 228/415/31 +f 229/399/32 228/416/32 217/417/32 +f 230/407/33 217/418/33 218/419/33 +f 231/389/35 218/420/35 219/421/35 +f 232/395/37 219/422/37 220/423/37 +f 233/403/39 220/424/39 221/425/39 +f 234/387/29 221/426/29 222/427/29 +f 235/393/34 222/428/34 223/429/34 +f 236/401/36 223/430/36 224/431/36 +f 237/409/38 224/432/38 225/433/38 +f 255/434/28 244/435/28 256/436/28 +f 263/437/29 251/438/29 264/439/29 +f 256/436/30 245/440/30 257/441/30 +f 258/442/31 245/440/31 246/443/31 +f 259/444/32 246/443/32 247/445/32 +f 259/444/33 248/446/33 260/447/33 +f 264/439/34 241/448/34 253/449/34 +f 260/447/35 249/450/35 261/451/35 +f 254/452/36 241/448/36 242/453/36 +f 261/454/37 250/455/37 262/456/37 +f 254/452/38 243/457/38 255/434/38 +f 262/456/39 252/458/39 263/437/39 +f 259/459/41 261/460/41 263/461/41 +f 247/462/42 245/463/42 241/464/42 +f 265/465/41 271/466/41 267/467/41 +f 272/468/42 266/469/42 268/470/42 +f 271/466/44 268/470/44 267/467/44 +f 270/471/43 265/472/43 266/469/43 +f 273/473/41 279/474/41 275/475/41 +f 280/476/42 274/477/42 276/478/42 +f 279/474/47 276/478/47 275/475/47 +f 278/479/48 273/480/48 274/477/48 +f 281/481/41 287/482/41 283/483/41 +f 288/484/42 282/485/42 284/486/42 +f 287/482/52 284/486/52 283/483/52 +f 286/487/51 281/488/51 282/485/51 +f 147/273/27 145/489/27 146/274/27 +f 163/276/28 151/490/28 152/277/28 +f 171/279/29 160/491/29 159/280/29 +f 164/282/30 152/402/30 153/283/30 +f 165/285/31 153/386/31 154/286/31 +f 166/288/32 154/392/32 155/289/32 +f 167/291/33 155/400/33 156/292/33 +f 172/294/34 159/492/34 149/295/34 +f 168/297/35 156/408/35 157/298/35 +f 161/300/36 149/406/36 150/301/36 +f 169/303/37 157/390/37 158/304/37 +f 162/306/38 150/388/38 151/307/38 +f 170/309/39 158/396/39 160/310/39 +f 179/312/40 177/493/40 178/313/40 +f 147/315/41 176/320/41 175/316/41 +f 148/275/42 146/274/42 173/318/42 +f 148/275/43 174/319/43 176/320/43 +f 145/317/44 175/316/44 173/321/44 +f 179/323/41 184/328/41 183/324/41 +f 180/314/42 178/313/42 181/326/42 +f 179/323/44 180/314/44 182/327/44 +f 177/325/43 183/324/43 181/329/43 +f 187/331/45 185/494/45 186/332/45 +f 195/334/46 193/495/46 194/335/46 +f 185/337/41 187/341/41 192/338/41 +f 186/332/42 189/496/42 190/340/42 +f 188/333/47 190/340/47 192/338/47 +f 185/337/48 191/339/48 189/342/48 +f 195/344/41 200/349/41 199/345/41 +f 196/336/42 194/335/42 197/347/42 +f 196/336/48 198/348/48 200/349/48 +f 193/346/47 199/345/47 197/350/47 +f 203/352/49 201/497/49 202/353/49 +f 211/355/50 209/498/50 210/356/50 +f 201/358/41 203/362/41 208/359/41 +f 202/353/42 205/499/42 206/361/42 +f 204/354/51 206/361/51 208/359/51 +f 201/358/52 207/360/52 205/363/52 +f 209/365/41 211/369/41 216/366/41 +f 210/356/42 213/500/42 214/368/42 +f 212/357/52 214/368/52 216/366/52 +f 209/365/51 215/367/51 213/370/51 +f 164/278/41 220/501/41 219/372/41 +f 171/311/41 227/502/41 226/373/41 +f 161/296/41 217/503/41 228/374/41 +f 167/291/41 168/293/41 224/375/41 +f 165/284/41 221/504/41 220/377/41 +f 172/281/41 228/505/41 227/378/41 +f 161/300/41 162/302/41 218/379/41 +f 169/299/41 225/506/41 224/381/41 +f 166/287/41 222/507/41 221/382/41 +f 163/308/41 219/508/41 218/383/41 +f 170/305/41 226/509/41 225/384/41 +f 167/290/41 223/510/41 222/385/41 +f 153/386/42 233/511/42 234/387/42 +f 150/388/42 230/512/42 231/389/42 +f 157/390/42 237/513/42 238/391/42 +f 154/392/42 234/514/42 235/393/42 +f 152/277/42 151/490/42 231/394/42 +f 158/396/42 238/515/42 240/397/42 +f 149/295/42 159/492/42 239/398/42 +f 155/400/42 235/516/42 236/401/42 +f 152/402/42 232/517/42 233/403/42 +f 159/280/42 160/491/42 240/404/42 +f 149/406/42 229/518/42 230/407/42 +f 156/408/42 236/519/42 237/409/42 +f 238/391/28 237/513/28 225/410/28 +f 240/397/30 238/515/30 226/412/30 +f 239/405/31 240/404/31 227/414/31 +f 229/399/32 239/398/32 228/416/32 +f 230/407/33 229/518/33 217/418/33 +f 231/389/35 230/512/35 218/420/35 +f 232/395/37 231/394/37 219/422/37 +f 233/403/39 232/517/39 220/424/39 +f 234/387/29 233/511/29 221/426/29 +f 235/393/34 234/514/34 222/428/34 +f 236/401/36 235/516/36 223/430/36 +f 237/409/38 236/519/38 224/432/38 +f 255/434/28 243/457/28 244/435/28 +f 263/437/29 252/458/29 251/438/29 +f 256/436/30 244/435/30 245/440/30 +f 258/442/31 257/441/31 245/440/31 +f 259/444/32 258/442/32 246/443/32 +f 259/444/33 247/445/33 248/446/33 +f 264/439/34 251/438/34 241/448/34 +f 260/447/35 248/446/35 249/450/35 +f 254/452/36 253/449/36 241/448/36 +f 261/454/37 249/520/37 250/455/37 +f 254/452/38 242/453/38 243/457/38 +f 262/456/39 250/455/39 252/458/39 +f 263/461/41 264/521/41 253/522/41 +f 253/522/41 254/523/41 255/524/41 +f 255/524/41 256/525/41 259/459/41 +f 256/525/41 257/526/41 259/459/41 +f 257/526/41 258/527/41 259/459/41 +f 259/459/41 260/528/41 261/460/41 +f 261/460/41 262/529/41 263/461/41 +f 263/461/41 253/522/41 259/459/41 +f 253/522/41 255/524/41 259/459/41 +f 241/464/42 251/530/42 249/531/42 +f 251/530/42 252/532/42 249/531/42 +f 252/532/42 250/533/42 249/531/42 +f 249/531/42 248/534/42 247/462/42 +f 247/462/42 246/535/42 245/463/42 +f 245/463/42 244/536/42 241/464/42 +f 244/536/42 243/537/42 241/464/42 +f 243/537/42 242/538/42 241/464/42 +f 249/531/42 247/462/42 241/464/42 +f 265/465/41 269/539/41 271/466/41 +f 272/468/42 270/471/42 266/469/42 +f 271/466/44 272/468/44 268/470/44 +f 270/471/43 269/540/43 265/472/43 +f 273/473/41 277/541/41 279/474/41 +f 280/476/42 278/479/42 274/477/42 +f 279/474/47 280/476/47 276/478/47 +f 278/479/48 277/542/48 273/480/48 +f 281/481/41 285/543/41 287/482/41 +f 288/484/42 286/487/42 282/485/42 +f 287/482/52 288/484/52 284/486/52 +f 286/487/51 285/544/51 281/488/51 +o Blade +v -0.000000 2.375000 0.937500 +v -0.195090 2.355785 0.937500 +v -0.382683 2.298879 0.937500 +v -0.555570 2.206470 0.937500 +v -0.707107 2.082107 0.937500 +v -0.831470 1.930570 0.937500 +v -0.923879 1.757683 0.937500 +v -0.980785 1.570090 0.937500 +v -1.000000 1.375000 0.937500 +v -0.980785 1.179909 0.937500 +v -0.923880 0.992316 0.937500 +v -0.831470 0.819430 0.937500 +v -0.707107 0.667893 0.937500 +v -0.555570 0.543530 0.937500 +v -0.382683 0.451120 0.937500 +v -0.195090 0.394214 0.937500 +v 0.000000 0.375000 0.937500 +v 0.195091 0.394215 0.937500 +v 0.382684 0.451120 0.937500 +v 0.555571 0.543530 0.937500 +v 0.707107 0.667893 0.937500 +v 0.831470 0.819430 0.937500 +v 0.923880 0.992317 0.937500 +v 0.980785 1.179910 0.937500 +v 1.000000 1.375001 0.937500 +v 0.980785 1.570091 0.937500 +v 0.923879 1.757684 0.937500 +v 0.831469 1.930571 0.937500 +v 0.707106 2.082108 0.937500 +v 0.555569 2.206470 0.937500 +v 0.382682 2.298880 0.937500 +v 0.195089 2.355785 0.937500 +v -0.000000 2.500000 0.937500 +v -0.219477 2.478383 0.937500 +v -0.430519 2.414364 0.937500 +v -0.625016 2.310403 0.937500 +v -0.795495 2.170495 0.937500 +v -0.935403 2.000016 0.937500 +v -1.039364 1.805518 0.937500 +v -1.103383 1.594476 0.937500 +v -1.125000 1.375000 0.937500 +v -1.103383 1.155523 0.937500 +v -1.039364 0.944481 0.937500 +v -0.935403 0.749983 0.937500 +v -0.795495 0.579504 0.937500 +v -0.625016 0.439596 0.937500 +v -0.430519 0.335635 0.937500 +v -0.219476 0.271616 0.937500 +v 0.000000 0.250000 0.937500 +v 0.219477 0.271616 0.937500 +v 0.430519 0.335635 0.937500 +v 0.625017 0.439597 0.937500 +v 0.795496 0.579505 0.937500 +v 0.935404 0.749984 0.937500 +v 1.039365 0.944482 0.937500 +v 1.103384 1.155524 0.937500 +v 1.125000 1.375001 0.937500 +v 1.103383 1.594477 0.937500 +v 1.039364 1.805520 0.937500 +v 0.935403 2.000017 0.937500 +v 0.795494 2.170496 0.937500 +v 0.625015 2.310404 0.937500 +v 0.430517 2.414365 0.937500 +v 0.219475 2.478383 0.937500 +v -0.000000 1.500000 0.875000 +v -0.000000 1.500000 1.000000 +v 0.088388 1.463388 0.875000 +v 0.088388 1.463388 1.000000 +v 0.125000 1.375000 0.875000 +v 0.125000 1.375000 1.000000 +v 0.088388 1.286612 0.875000 +v 0.088388 1.286612 1.000000 +v -0.000000 1.250000 0.875000 +v -0.000000 1.250000 1.000000 +v -0.088388 1.286612 0.875000 +v -0.088388 1.286612 1.000000 +v -0.125000 1.375000 0.875000 +v -0.125000 1.375000 1.000000 +v -0.088388 1.463388 0.875000 +v -0.088388 1.463388 1.000000 +v -0.000000 2.375000 0.937500 +v -0.195090 2.355785 0.937500 +v -0.382683 2.298879 0.937500 +v -0.555570 2.206470 0.937500 +v -0.707107 2.082107 0.937500 +v -0.831470 1.930570 0.937500 +v -0.923879 1.757683 0.937500 +v -0.980785 1.570090 0.937500 +v -1.000000 1.375000 0.937500 +v -0.980785 1.179909 0.937500 +v -0.923880 0.992316 0.937500 +v -0.831470 0.819430 0.937500 +v -0.707107 0.667893 0.937500 +v -0.555570 0.543530 0.937500 +v -0.382683 0.451120 0.937500 +v -0.195090 0.394214 0.937500 +v 0.000000 0.375000 0.937500 +v 0.195091 0.394215 0.937500 +v 0.382684 0.451120 0.937500 +v 0.555571 0.543530 0.937500 +v 0.707107 0.667893 0.937500 +v 0.831470 0.819430 0.937500 +v 0.923880 0.992317 0.937500 +v 0.980785 1.179910 0.937500 +v 1.000000 1.375001 0.937500 +v 0.980785 1.570091 0.937500 +v 0.923879 1.757684 0.937500 +v 0.831469 1.930571 0.937500 +v 0.707106 2.082108 0.937500 +v 0.555569 2.206470 0.937500 +v 0.382682 2.298880 0.937500 +v 0.195089 2.355785 0.937500 +v -0.000000 2.500000 0.937500 +v -0.219477 2.478383 0.937500 +v -0.430519 2.414364 0.937500 +v -0.625016 2.310403 0.937500 +v -0.795495 2.170495 0.937500 +v -0.935403 2.000016 0.937500 +v -1.039364 1.805518 0.937500 +v -1.103383 1.594476 0.937500 +v -1.125000 1.375000 0.937500 +v -1.103383 1.155523 0.937500 +v -1.039364 0.944481 0.937500 +v -0.935403 0.749983 0.937500 +v -0.795495 0.579504 0.937500 +v -0.625016 0.439596 0.937500 +v -0.430519 0.335635 0.937500 +v -0.219476 0.271616 0.937500 +v 0.000000 0.250000 0.937500 +v 0.219477 0.271616 0.937500 +v 0.430519 0.335635 0.937500 +v 0.625017 0.439597 0.937500 +v 0.795496 0.579505 0.937500 +v 0.935404 0.749984 0.937500 +v 1.039365 0.944482 0.937500 +v 1.103384 1.155524 0.937500 +v 1.125000 1.375001 0.937500 +v 1.103383 1.594477 0.937500 +v 1.039364 1.805520 0.937500 +v 0.935403 2.000017 0.937500 +v 0.795494 2.170496 0.937500 +v 0.625015 2.310404 0.937500 +v 0.430517 2.414365 0.937500 +v 0.219475 2.478383 0.937500 +vt 0.393893 0.464761 +vt 0.487778 0.608696 +vt 0.391822 0.749524 +vt 0.410360 0.747091 +vt 0.412547 0.764585 +vt 0.428225 0.739281 +vt 0.432646 0.755798 +vt 0.444731 0.726392 +vt 0.451216 0.741298 +vt 0.459244 0.708920 +vt 0.467543 0.721642 +vt 0.471206 0.687537 +vt 0.480999 0.697587 +vt 0.480157 0.663065 +vt 0.491069 0.670055 +vt 0.485753 0.636444 +vt 0.497364 0.640106 +vt 0.499643 0.608891 +vt 0.486157 0.580889 +vt 0.497819 0.577607 +vt 0.480949 0.554091 +vt 0.491961 0.547460 +vt 0.472357 0.529332 +vt 0.482294 0.519605 +vt 0.460709 0.507562 +vt 0.469191 0.495115 +vt 0.446454 0.489620 +vt 0.453154 0.474930 +vt 0.430139 0.476194 +vt 0.434800 0.459826 +vt 0.412392 0.467800 +vt 0.414833 0.450382 +vt 0.394023 0.446963 +vt 0.375355 0.467194 +vt 0.373167 0.449700 +vt 0.357489 0.475005 +vt 0.353068 0.458487 +vt 0.340983 0.487894 +vt 0.334498 0.472988 +vt 0.326470 0.505366 +vt 0.318171 0.492644 +vt 0.314508 0.526749 +vt 0.304715 0.516700 +vt 0.305557 0.551222 +vt 0.294645 0.544231 +vt 0.299962 0.577843 +vt 0.288350 0.574181 +vt 0.297936 0.605591 +vt 0.286071 0.605396 +vt 0.299558 0.633397 +vt 0.287896 0.636679 +vt 0.304765 0.660195 +vt 0.293754 0.666827 +vt 0.313358 0.684955 +vt 0.303420 0.694681 +vt 0.325006 0.706724 +vt 0.316524 0.719171 +vt 0.339261 0.724666 +vt 0.332561 0.739356 +vt 0.355576 0.738092 +vt 0.350916 0.754460 +vt 0.373323 0.746485 +vt 0.370882 0.763903 +vt 0.391692 0.767322 +vt 0.523810 0.767857 +vt 0.517857 0.750000 +vt 0.523810 0.750000 +vt 0.517857 0.767857 +vt 0.511905 0.750000 +vt 0.511905 0.767857 +vt 0.505952 0.750000 +vt 0.505952 0.767857 +vt 0.500000 0.750000 +vt 0.547619 0.767857 +vt 0.541667 0.750000 +vt 0.547619 0.750000 +vt 0.541667 0.767857 +vt 0.535714 0.750000 +vt 0.519557 0.720664 +vt 0.522727 0.732143 +vt 0.501083 0.732143 +vt 0.535714 0.767857 +vt 0.529762 0.750000 +vt 0.529762 0.767857 +vt 0.504252 0.774236 +vt 0.519557 0.774236 +vt 0.519557 0.797193 +vt 0.430139 0.476194 +vt 0.305557 0.551222 +vt 0.355576 0.738092 +vt 0.391822 0.749524 +vt 0.412547 0.764585 +vt 0.410360 0.747091 +vt 0.432646 0.755798 +vt 0.428225 0.739281 +vt 0.451216 0.741298 +vt 0.444731 0.726392 +vt 0.467543 0.721642 +vt 0.459244 0.708920 +vt 0.480999 0.697587 +vt 0.471206 0.687537 +vt 0.491069 0.670055 +vt 0.480157 0.663065 +vt 0.497364 0.640106 +vt 0.485753 0.636444 +vt 0.499643 0.608891 +vt 0.487778 0.608696 +vt 0.497819 0.577607 +vt 0.486157 0.580889 +vt 0.491961 0.547460 +vt 0.480949 0.554091 +vt 0.482294 0.519605 +vt 0.472357 0.529332 +vt 0.469191 0.495115 +vt 0.460709 0.507562 +vt 0.453154 0.474930 +vt 0.446454 0.489620 +vt 0.434800 0.459826 +vt 0.414833 0.450382 +vt 0.412392 0.467800 +vt 0.394023 0.446963 +vt 0.393893 0.464761 +vt 0.373167 0.449700 +vt 0.375355 0.467194 +vt 0.353068 0.458487 +vt 0.357489 0.475005 +vt 0.334498 0.472988 +vt 0.340983 0.487894 +vt 0.318171 0.492644 +vt 0.326470 0.505366 +vt 0.304715 0.516700 +vt 0.314508 0.526749 +vt 0.294645 0.544231 +vt 0.288350 0.574181 +vt 0.299962 0.577843 +vt 0.286071 0.605396 +vt 0.297936 0.605591 +vt 0.287896 0.636679 +vt 0.299558 0.633397 +vt 0.293754 0.666827 +vt 0.304765 0.660195 +vt 0.303420 0.694681 +vt 0.313358 0.684955 +vt 0.316524 0.719171 +vt 0.325006 0.706724 +vt 0.332561 0.739356 +vt 0.339261 0.724666 +vt 0.350916 0.754460 +vt 0.370882 0.763903 +vt 0.373323 0.746485 +vt 0.391692 0.767322 +vt 0.500000 0.767857 +vt 0.519557 0.743622 +vt 0.511905 0.748376 +vt 0.504252 0.743622 +vt 0.504252 0.720664 +vt 0.511905 0.715910 +vt 0.511905 0.801947 +vt 0.504252 0.797193 +vt 0.501083 0.785714 +vt 0.511905 0.769481 +vt 0.522727 0.785714 +vn 0.0000 -0.0000 1.0000 +vn 0.3827 0.9239 0.0000 +vn 0.9239 0.3827 0.0000 +vn 0.9239 -0.3827 0.0000 +vn 0.3827 -0.9239 0.0000 +vn -0.3827 -0.9239 0.0000 +vn -0.9239 -0.3827 0.0000 +vn -0.9239 0.3827 0.0000 +vn -0.3827 0.9239 0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 305/545/53 313/546/53 289/547/53 +f 289/547/53 320/548/53 352/549/53 +f 320/548/53 319/550/53 351/551/53 +f 319/550/53 318/552/53 350/553/53 +f 318/552/53 317/554/53 349/555/53 +f 317/554/53 316/556/53 348/557/53 +f 316/556/53 315/558/53 347/559/53 +f 315/558/53 314/560/53 346/561/53 +f 314/560/53 313/546/53 345/562/53 +f 313/546/53 312/563/53 344/564/53 +f 312/563/53 311/565/53 343/566/53 +f 311/565/53 310/567/53 342/568/53 +f 310/567/53 309/569/53 341/570/53 +f 309/569/53 308/571/53 340/572/53 +f 308/571/53 307/573/53 339/574/53 +f 307/573/53 306/575/53 338/576/53 +f 306/575/53 305/545/53 337/577/53 +f 305/545/53 304/578/53 336/579/53 +f 304/578/53 303/580/53 335/581/53 +f 303/580/53 302/582/53 334/583/53 +f 302/582/53 301/584/53 333/585/53 +f 301/584/53 300/586/53 332/587/53 +f 300/586/53 299/588/53 331/589/53 +f 299/588/53 298/590/53 330/591/53 +f 298/590/53 297/592/53 329/593/53 +f 297/592/53 296/594/53 328/595/53 +f 296/594/53 295/596/53 327/597/53 +f 295/596/53 294/598/53 326/599/53 +f 294/598/53 293/600/53 325/601/53 +f 293/600/53 292/602/53 324/603/53 +f 292/602/53 291/604/53 323/605/53 +f 291/604/53 290/606/53 322/607/53 +f 290/606/53 289/547/53 321/608/53 +f 354/609/54 355/610/54 353/611/54 +f 356/612/55 357/613/55 355/610/55 +f 358/614/56 359/615/56 357/613/56 +f 360/616/57 361/617/57 359/615/57 +f 362/618/58 363/619/58 361/620/58 +f 364/621/59 365/622/59 363/619/59 +f 360/623/53 358/624/53 366/625/53 +f 366/626/60 367/627/60 365/622/60 +f 368/628/61 353/611/61 367/627/61 +f 359/629/62 363/630/62 367/631/62 +f 387/632/62 379/633/62 371/634/62 +f 369/635/62 432/636/62 400/637/62 +f 400/637/62 431/638/62 399/639/62 +f 399/639/62 430/640/62 398/641/62 +f 398/641/62 429/642/62 397/643/62 +f 397/643/62 428/644/62 396/645/62 +f 396/645/62 427/646/62 395/647/62 +f 395/647/62 426/648/62 394/649/62 +f 394/649/62 425/650/62 393/651/62 +f 393/651/62 424/652/62 392/653/62 +f 392/653/62 423/654/62 391/655/62 +f 391/655/62 422/656/62 390/657/62 +f 390/657/62 421/658/62 389/659/62 +f 389/659/62 420/660/62 388/661/62 +f 388/661/62 419/662/62 387/632/62 +f 387/632/62 418/663/62 386/664/62 +f 386/664/62 417/665/62 385/666/62 +f 385/666/62 416/667/62 384/668/62 +f 384/668/62 415/669/62 383/670/62 +f 383/670/62 414/671/62 382/672/62 +f 382/672/62 413/673/62 381/674/62 +f 381/674/62 412/675/62 380/676/62 +f 380/676/62 411/677/62 379/633/62 +f 379/633/62 410/678/62 378/679/62 +f 378/679/62 409/680/62 377/681/62 +f 377/681/62 408/682/62 376/683/62 +f 376/683/62 407/684/62 375/685/62 +f 375/685/62 406/686/62 374/687/62 +f 374/687/62 405/688/62 373/689/62 +f 373/689/62 404/690/62 372/691/62 +f 372/691/62 403/692/62 371/634/62 +f 371/634/62 402/693/62 370/694/62 +f 370/694/62 401/695/62 369/635/62 +f 289/547/53 290/606/53 291/604/53 +f 291/604/53 292/602/53 293/600/53 +f 293/600/53 294/598/53 297/592/53 +f 294/598/53 295/596/53 297/592/53 +f 295/596/53 296/594/53 297/592/53 +f 297/592/53 298/590/53 299/588/53 +f 299/588/53 300/586/53 301/584/53 +f 301/584/53 302/582/53 303/580/53 +f 303/580/53 304/578/53 305/545/53 +f 305/545/53 306/575/53 309/569/53 +f 306/575/53 307/573/53 309/569/53 +f 307/573/53 308/571/53 309/569/53 +f 309/569/53 310/567/53 313/546/53 +f 310/567/53 311/565/53 313/546/53 +f 311/565/53 312/563/53 313/546/53 +f 313/546/53 314/560/53 317/554/53 +f 314/560/53 315/558/53 317/554/53 +f 315/558/53 316/556/53 317/554/53 +f 317/554/53 318/552/53 319/550/53 +f 319/550/53 320/548/53 289/547/53 +f 289/547/53 291/604/53 297/592/53 +f 291/604/53 293/600/53 297/592/53 +f 297/592/53 299/588/53 305/545/53 +f 299/588/53 301/584/53 305/545/53 +f 301/584/53 303/580/53 305/545/53 +f 317/554/53 319/550/53 313/546/53 +f 319/550/53 289/547/53 313/546/53 +f 305/545/53 309/569/53 313/546/53 +f 289/547/53 297/592/53 305/545/53 +f 354/609/54 356/612/54 355/610/54 +f 356/612/55 358/614/55 357/613/55 +f 358/614/56 360/616/56 359/615/56 +f 360/616/57 362/696/57 361/617/57 +f 362/618/58 364/621/58 363/619/58 +f 364/621/59 366/626/59 365/622/59 +f 358/624/53 356/697/53 366/625/53 +f 356/697/53 354/698/53 366/625/53 +f 354/698/53 368/699/53 366/625/53 +f 366/625/53 364/700/53 362/701/53 +f 362/701/53 360/623/53 366/625/53 +f 366/626/60 368/628/60 367/627/60 +f 368/628/61 354/609/61 353/611/61 +f 367/631/62 353/702/62 355/703/62 +f 355/703/62 357/704/62 359/629/62 +f 359/629/62 361/705/62 363/630/62 +f 363/630/62 365/706/62 367/631/62 +f 367/631/62 355/703/62 359/629/62 +f 371/634/62 370/694/62 399/639/62 +f 370/694/62 369/635/62 399/639/62 +f 369/635/62 400/637/62 399/639/62 +f 399/639/62 398/641/62 397/643/62 +f 397/643/62 396/645/62 399/639/62 +f 396/645/62 395/647/62 399/639/62 +f 395/647/62 394/649/62 393/651/62 +f 393/651/62 392/653/62 391/655/62 +f 391/655/62 390/657/62 389/659/62 +f 389/659/62 388/661/62 391/655/62 +f 388/661/62 387/632/62 391/655/62 +f 387/632/62 386/664/62 383/670/62 +f 386/664/62 385/666/62 383/670/62 +f 385/666/62 384/668/62 383/670/62 +f 383/670/62 382/672/62 381/674/62 +f 381/674/62 380/676/62 383/670/62 +f 380/676/62 379/633/62 383/670/62 +f 379/633/62 378/679/62 377/681/62 +f 377/681/62 376/683/62 375/685/62 +f 375/685/62 374/687/62 371/634/62 +f 374/687/62 373/689/62 371/634/62 +f 373/689/62 372/691/62 371/634/62 +f 395/647/62 393/651/62 391/655/62 +f 379/633/62 377/681/62 375/685/62 +f 371/634/62 399/639/62 395/647/62 +f 395/647/62 391/655/62 371/634/62 +f 391/655/62 387/632/62 371/634/62 +f 387/632/62 383/670/62 379/633/62 +f 379/633/62 375/685/62 371/634/62 +o Main +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v -1.500000 1.000000 1.500000 +v 1.500000 1.000000 1.500000 +v -1.500000 1.000000 -1.500000 +v 1.500000 1.000000 -1.500000 +v -0.625000 1.000000 1.250000 +v 0.625000 1.000000 1.250000 +v -0.625000 1.000000 1.000000 +v 0.625000 1.000000 1.000000 +v -0.500000 1.125000 1.000000 +v -0.500000 1.125000 1.250000 +v 0.500000 1.125000 1.250000 +v 0.500000 1.125000 1.000000 +v -0.500000 1.625000 1.000000 +v -0.500000 1.625000 1.250000 +v 0.500000 1.625000 1.250000 +v 0.500000 1.625000 1.000000 +v -0.250000 1.875000 1.000000 +v -0.250000 1.875000 1.250000 +v 0.250000 1.875000 1.250000 +v 0.250000 1.875000 1.000000 +v -0.625000 1.000000 0.875000 +v 0.625000 1.000000 0.875000 +v -0.500000 1.125000 0.875000 +v 0.500000 1.125000 0.875000 +v -0.500000 1.625000 0.875000 +v 0.500000 1.625000 0.875000 +v -0.250000 1.875000 0.875000 +v 0.250000 1.875000 0.875000 +v 0.625000 1.000000 0.625000 +v -0.625000 1.000000 0.625000 +v -0.500000 1.125000 0.625000 +v 0.500000 1.125000 0.625000 +v 0.500000 1.625000 0.625000 +v -0.500000 1.625000 0.625000 +v 0.250000 1.875000 0.625000 +v -0.250000 1.875000 0.625000 +v -1.000000 1.000000 0.625000 +v 1.000000 1.000000 0.625000 +v -1.000000 1.000000 -1.000000 +v 1.000000 1.000000 -1.000000 +v -1.000000 1.750000 0.625000 +v 1.000000 1.750000 0.625000 +v -1.000000 1.750000 -1.000000 +v 1.000000 1.750000 -1.000000 +v -0.750000 2.000000 -1.000000 +v -0.750000 2.000000 0.625000 +v 0.750000 2.000000 0.625000 +v 0.750000 2.000000 -1.000000 +v -1.250000 1.000000 -1.250000 +v 1.250000 1.000000 -1.250000 +v -1.250000 1.000000 -1.000000 +v 1.250000 1.000000 -1.000000 +v 1.250000 0.625000 -1.250000 +v -1.250000 0.625000 -1.250000 +v 1.250000 0.625000 -1.000000 +v -1.250000 0.625000 -1.000000 +v 0.312500 1.000000 -1.250000 +v 0.812500 1.000000 -1.250000 +v 0.312500 1.000000 -1.375000 +v 0.812500 1.000000 -1.375000 +v 0.312500 1.500000 -1.375000 +v 0.312500 1.500000 -1.250000 +v 0.812500 1.500000 -1.250000 +v 0.812500 1.500000 -1.375000 +v 0.437500 1.625000 -1.375000 +v 0.437500 1.625000 -1.250000 +v 0.687500 1.625000 -1.250000 +v 0.687500 1.625000 -1.375000 +v 1.250000 1.000000 1.000000 +v 1.250000 1.000000 0.875000 +v -1.250000 1.000000 1.000000 +v -1.250000 1.000000 0.875000 +v -1.250000 0.375000 0.875000 +v 1.250000 0.375000 0.875000 +v -1.250000 0.375000 1.000000 +v 1.250000 0.375000 1.000000 +v -0.812500 1.000000 -1.250000 +v -0.312500 1.000000 -1.250000 +v -0.812500 1.000000 -1.375000 +v -0.312500 1.000000 -1.375000 +v -0.812500 1.500000 -1.375000 +v -0.812500 1.500000 -1.250000 +v -0.312500 1.500000 -1.250000 +v -0.312500 1.500000 -1.375000 +v -0.687500 1.625000 -1.375000 +v -0.687500 1.625000 -1.250000 +v -0.437500 1.625000 -1.250000 +v -0.437500 1.625000 -1.375000 +vt 0.285714 0.428571 +vt 0.190476 0.142857 +vt 0.285714 -0.000000 +vt 0.392857 -0.000000 +vt 0.297619 0.008929 +vt 0.297619 -0.000000 +vt 0.095238 0.142857 +vt -0.000000 -0.000000 +vt 0.095238 0.285714 +vt 0.000000 0.428571 +vt 0.190476 0.285714 +vt 0.398810 0.160714 +vt 0.392857 0.026786 +vt 0.398810 0.017857 +vt 0.297619 0.178571 +vt 0.392857 0.169643 +vt 0.392857 0.178571 +vt 0.404762 0.160714 +vt 0.404762 0.017857 +vt 0.285714 0.017857 +vt 0.291667 0.160714 +vt 0.285714 0.160714 +vt 0.386905 0.017857 +vt 0.303571 0.026786 +vt 0.303571 0.017857 +vt 0.291667 0.017857 +vt 0.297619 0.151786 +vt 0.392857 0.008929 +vt 0.297619 0.169643 +vt 0.386905 0.160714 +vt 0.386905 0.151786 +vt 0.303571 0.151786 +vt 0.303571 0.160714 +vt 0.392857 0.151786 +vt 0.386905 0.026786 +vt 0.297619 0.026786 +vt 0.285714 0.428571 +vt -0.000000 0.571429 +vt 0.000000 0.428571 +vt -0.000000 0.571429 +vt 0.285714 0.428571 +vt -0.000000 0.571429 +vt 0.000000 0.428571 +vt 0.285714 0.428571 +vt -0.000000 0.571429 +vt 0.000000 0.428571 +vt 0.023810 0.964286 +vt 0.285714 1.000000 +vt -0.000000 1.000000 +vt 0.976190 0.178571 +vt 0.928571 0.142857 +vt 0.976190 0.142857 +vt 0.833333 0.035714 +vt 0.940476 0.017857 +vt 0.928571 0.035714 +vt 0.988095 0.178571 +vt 0.988095 0.142857 +vt 0.773810 0.142857 +vt 0.785714 0.178571 +vt 0.773810 0.178571 +vt 0.928571 0.178571 +vt 0.904762 0.142857 +vt 0.785714 0.142857 +vt 0.833333 0.178571 +vt 0.857143 0.178571 +vt 0.857143 0.142857 +vt 0.833333 0.142857 +vt 0.928571 0.285714 +vt 0.821429 0.303571 +vt 0.833333 0.285714 +vt 0.928571 0.357143 +vt 0.904762 0.464286 +vt 0.857143 0.464286 +vt 0.857143 0.500000 +vt 0.976190 0.464286 +vt 0.928571 0.500000 +vt 0.928571 0.464286 +vt 0.785714 0.464286 +vt 0.773810 0.500000 +vt 0.773810 0.464286 +vt 0.904762 0.500000 +vt 0.833333 0.464286 +vt 0.785714 0.500000 +vt 0.988095 0.464286 +vt 0.976190 0.500000 +vt 0.833333 0.500000 +vt 0.690476 0.375000 +vt 0.761905 0.142857 +vt 0.761905 0.375000 +vt 0.500000 0.142857 +vt 0.428571 0.375000 +vt 0.428571 0.142857 +vt 0.500000 0.517857 +vt 0.666667 0.375000 +vt 0.690476 0.517857 +vt 0.523810 0.375000 +vt 0.500000 0.375000 +vt 0.523810 0.142857 +vt 0.666667 0.142857 +vt 0.690476 0.142857 +vt 0.690476 0.000000 +vt 0.500000 0.000000 +vt 0.523810 0.892857 +vt 0.547619 0.839286 +vt 0.547619 0.892857 +vt 0.261905 0.928571 +vt 0.261905 0.660714 +vt 0.023810 0.928571 +vt 0.285714 0.839286 +vt 0.523810 0.803571 +vt 0.523810 0.839286 +vt 0.785714 0.839286 +vt 0.785714 0.892857 +vt 0.809524 0.839286 +vt 0.809524 0.892857 +vt 0.285714 0.892857 +vt 0.285714 0.267857 +vt 0.333333 0.285714 +vt 0.285714 0.285714 +vt 0.428571 0.285714 +vt 0.380952 0.267857 +vt 0.428571 0.267857 +vt 0.369048 0.267857 +vt 0.345238 0.267857 +vt 0.333333 0.250000 +vt 0.345238 0.285714 +vt 0.369048 0.285714 +vt 0.333333 0.267857 +vt 0.380952 0.285714 +vt 0.380952 0.303571 +vt 0.380952 0.375000 +vt 0.333333 0.375000 +vt 0.523810 1.000000 +vt 0.535714 0.910714 +vt 0.535714 1.000000 +vt 0.285714 0.571429 +vt 0.023810 0.642857 +vt 0.285714 0.910714 +vt 0.523810 0.892857 +vt 0.523810 0.910714 +vt 0.773810 1.000000 +vt 0.785714 0.910714 +vt 0.785714 1.000000 +vt 0.773810 0.910714 +vt 0.285714 1.000000 +vt 0.285714 0.267857 +vt 0.333333 0.285714 +vt 0.285714 0.285714 +vt 0.428571 0.285714 +vt 0.380952 0.267857 +vt 0.428571 0.267857 +vt 0.369048 0.267857 +vt 0.345238 0.267857 +vt 0.333333 0.250000 +vt 0.345238 0.285714 +vt 0.369048 0.285714 +vt 0.333333 0.267857 +vt 0.380952 0.285714 +vt 0.380952 0.303571 +vt 0.380952 0.375000 +vt 0.333333 0.375000 +vt 0.285714 0.571429 +vt 0.285714 0.571429 +vt 0.285714 0.571429 +vt 0.261905 0.964286 +vt 0.928571 0.107143 +vt 0.833333 0.107143 +vt 0.821429 0.017857 +vt 0.904762 0.178571 +vt 0.833333 0.214286 +vt 0.928571 0.214286 +vt 0.940476 0.303571 +vt 0.833333 0.357143 +vt 0.821429 0.339286 +vt 0.940476 0.339286 +vt 0.928571 0.428571 +vt 0.833333 0.428571 +vt 0.988095 0.500000 +vt 0.500000 0.410714 +vt 0.690476 0.410714 +vt 0.690476 0.107143 +vt 0.500000 0.107143 +vt 0.261905 0.642857 +vt 0.023810 0.660714 +vt 0.285714 0.803571 +vt 0.333333 0.178571 +vt 0.380952 0.178571 +vt 0.380952 0.250000 +vt 0.333333 0.303571 +vt 0.285714 0.892857 +vt 0.333333 0.178571 +vt 0.380952 0.178571 +vt 0.380952 0.250000 +vt 0.333333 0.303571 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +s off +f 434/707/63 440/708/63 436/709/63 +f 440/710/64 441/711/64 439/712/64 +f 436/709/63 439/713/63 435/714/63 +f 435/714/63 437/715/63 433/716/63 +f 433/716/63 438/717/63 434/707/63 +f 443/718/63 448/719/63 444/720/63 +f 437/721/65 443/722/65 438/723/65 +f 438/724/66 444/720/66 440/725/66 +f 439/726/67 442/727/67 437/728/67 +f 448/729/65 449/730/65 445/731/65 +f 441/732/63 446/733/63 442/727/63 +f 444/734/63 445/731/63 441/711/63 +f 442/735/63 447/736/63 443/722/63 +f 449/730/63 451/737/63 450/738/63 +f 446/739/64 451/737/64 447/736/64 +f 447/740/67 452/741/67 448/719/67 +f 445/742/66 450/738/66 446/733/66 +f 435/743/65 456/744/65 436/745/65 +f 434/707/64 453/746/64 433/716/64 +f 436/747/67 454/748/67 434/749/67 +f 433/750/66 455/751/66 435/752/66 +f 501/753/68 456/754/68 455/755/68 +f 464/756/67 467/757/67 463/758/67 +f 462/759/64 458/760/64 463/761/64 +f 460/762/69 463/758/69 458/763/69 +f 457/764/70 461/765/70 459/766/70 +f 468/767/69 471/768/69 467/757/69 +f 462/769/66 465/770/66 461/765/66 +f 471/768/68 469/771/68 470/772/68 +f 466/773/70 469/771/70 465/770/70 +f 464/774/65 459/775/65 461/776/65 +f 476/777/64 480/778/64 479/779/64 +f 480/778/68 488/780/68 479/779/68 +f 476/781/67 485/782/67 478/783/67 +f 475/784/70 482/785/70 473/786/70 +f 478/783/69 487/787/69 480/778/69 +f 477/788/66 483/789/66 475/784/66 +f 474/790/69 484/791/69 476/781/69 +f 479/779/70 486/792/70 477/788/70 +f 496/793/67 490/794/67 492/795/67 +f 493/796/66 491/797/66 489/798/66 +f 491/799/65 500/800/65 492/801/65 +f 493/796/70 497/802/70 495/803/70 +f 498/804/68 500/800/68 497/802/68 +f 496/793/69 499/805/69 494/806/69 +f 490/807/64 498/804/64 489/808/64 +f 502/809/66 507/810/66 504/811/66 +f 456/754/68 504/812/68 522/813/68 +f 503/814/68 501/753/68 455/755/68 +f 503/814/68 522/813/68 504/812/68 +f 506/815/68 507/816/68 505/817/68 +f 504/811/65 508/818/65 503/819/65 +f 503/819/67 506/820/67 501/821/67 +f 501/822/64 505/817/64 502/809/64 +f 512/823/67 515/824/67 510/825/67 +f 509/826/66 513/827/66 511/828/66 +f 517/829/65 520/830/65 516/831/65 +f 519/832/68 517/829/68 518/833/68 +f 516/834/69 519/832/69 515/824/69 +f 514/835/70 517/829/70 513/827/70 +f 514/836/64 509/837/64 510/838/64 +f 522/839/66 528/840/66 521/841/66 +f 454/842/68 523/843/68 453/746/68 +f 525/844/68 528/845/68 526/846/68 +f 523/847/67 525/848/67 524/849/67 +f 521/841/65 527/850/65 523/847/65 +f 524/851/64 526/846/64 522/839/64 +f 532/852/67 535/853/67 530/854/67 +f 529/855/66 533/856/66 531/857/66 +f 537/858/65 540/859/65 536/860/65 +f 539/861/68 537/858/68 538/862/68 +f 536/863/69 539/861/69 535/853/69 +f 534/864/70 537/858/70 533/856/70 +f 534/865/64 529/866/64 530/867/64 +f 434/707/63 438/717/63 440/708/63 +f 440/710/64 444/734/64 441/711/64 +f 436/709/63 440/708/63 439/713/63 +f 435/714/63 439/713/63 437/715/63 +f 433/716/63 437/715/63 438/717/63 +f 443/718/63 447/740/63 448/719/63 +f 437/721/65 442/735/65 443/722/65 +f 438/724/66 443/718/66 444/720/66 +f 439/726/67 441/732/67 442/727/67 +f 448/729/65 452/741/65 449/730/65 +f 441/732/63 445/742/63 446/733/63 +f 444/734/63 448/729/63 445/731/63 +f 442/735/63 446/739/63 447/736/63 +f 449/730/63 452/741/63 451/737/63 +f 446/739/64 450/738/64 451/737/64 +f 447/740/67 451/737/67 452/741/67 +f 445/742/66 449/730/66 450/738/66 +f 435/743/65 455/868/65 456/744/65 +f 434/707/64 454/842/64 453/746/64 +f 436/747/67 456/869/67 454/748/67 +f 433/750/66 453/870/66 455/751/66 +f 501/753/68 502/871/68 456/754/68 +f 464/756/67 468/767/67 467/757/67 +f 463/761/64 467/872/64 462/759/64 +f 467/872/64 471/768/64 462/759/64 +f 471/768/64 470/772/64 466/873/64 +f 462/759/64 457/874/64 458/760/64 +f 471/768/64 466/873/64 462/759/64 +f 460/762/69 464/756/69 463/758/69 +f 457/764/70 462/769/70 461/765/70 +f 468/767/69 472/875/69 471/768/69 +f 462/769/66 466/773/66 465/770/66 +f 471/768/68 472/875/68 469/771/68 +f 466/773/70 470/772/70 469/771/70 +f 461/776/65 465/876/65 464/774/65 +f 465/876/65 469/771/65 464/774/65 +f 469/771/65 472/875/65 468/877/65 +f 464/774/65 460/878/65 459/775/65 +f 469/771/65 468/877/65 464/774/65 +f 475/879/64 473/880/64 474/881/64 +f 476/777/64 478/882/64 480/778/64 +f 475/879/64 474/881/64 476/777/64 +f 479/779/64 477/883/64 476/777/64 +f 477/883/64 475/879/64 476/777/64 +f 480/778/68 487/787/68 488/780/68 +f 476/781/67 484/791/67 485/782/67 +f 475/784/70 483/789/70 482/785/70 +f 478/783/69 485/782/69 487/787/69 +f 477/788/66 486/792/66 483/789/66 +f 474/790/69 481/884/69 484/791/69 +f 479/779/70 488/780/70 486/792/70 +f 496/793/67 494/806/67 490/794/67 +f 493/796/66 495/803/66 491/797/66 +f 491/799/65 495/885/65 497/802/65 +f 497/802/65 500/800/65 491/799/65 +f 500/800/65 496/886/65 492/801/65 +f 493/796/70 498/804/70 497/802/70 +f 498/804/68 499/805/68 500/800/68 +f 496/793/69 500/800/69 499/805/69 +f 490/807/64 494/887/64 499/805/64 +f 499/805/64 498/804/64 490/807/64 +f 498/804/64 493/888/64 489/808/64 +f 502/809/66 505/817/66 507/810/66 +f 521/889/68 454/842/68 522/813/68 +f 454/842/68 456/754/68 522/813/68 +f 456/754/68 502/871/68 504/812/68 +f 455/755/68 453/746/68 524/890/68 +f 453/746/68 523/843/68 524/890/68 +f 524/890/68 503/814/68 455/755/68 +f 503/814/68 524/890/68 522/813/68 +f 506/815/68 508/891/68 507/816/68 +f 504/811/65 507/810/65 508/818/65 +f 503/819/67 508/818/67 506/820/67 +f 501/822/64 506/815/64 505/817/64 +f 512/823/67 516/834/67 515/824/67 +f 509/826/66 514/835/66 513/827/66 +f 516/831/65 512/892/65 511/893/65 +f 511/893/65 513/894/65 516/831/65 +f 513/894/65 517/829/65 516/831/65 +f 519/832/68 520/830/68 517/829/68 +f 516/834/69 520/830/69 519/832/69 +f 514/835/70 518/833/70 517/829/70 +f 510/838/64 515/895/64 514/836/64 +f 515/895/64 519/832/64 514/836/64 +f 519/832/64 518/833/64 514/836/64 +f 522/839/66 526/846/66 528/840/66 +f 454/842/68 521/889/68 523/843/68 +f 525/844/68 527/896/68 528/845/68 +f 523/847/67 527/850/67 525/848/67 +f 521/841/65 528/840/65 527/850/65 +f 524/851/64 525/844/64 526/846/64 +f 532/852/67 536/863/67 535/853/67 +f 529/855/66 534/864/66 533/856/66 +f 536/860/65 532/897/65 531/898/65 +f 531/898/65 533/899/65 536/860/65 +f 533/899/65 537/858/65 536/860/65 +f 539/861/68 540/859/68 537/858/68 +f 536/863/69 540/859/69 539/861/69 +f 534/864/70 538/862/70 537/858/70 +f 530/867/64 535/900/64 534/865/64 +f 535/900/64 539/861/64 534/865/64 +f 539/861/64 538/862/64 534/865/64 diff --git a/src/main/resources/assets/hbm/textures/models/machines/sawmill.png b/src/main/resources/assets/hbm/textures/models/machines/sawmill.png new file mode 100644 index 0000000000000000000000000000000000000000..9a369ddf39264e547a11c920875c20237cd347a1 GIT binary patch literal 6452 zcmV-48O!F0P)4Nklx>*;?vSrybo*8>)u#4TzwM{k+ni_4~B z0yG=sAwZB6?L&dI@5Md@=wsg+AVq*Y6n*GJfD}Q36m2osqMHIu)7jmmGqXG68PE7` zSr<|gB~m2&KpmQ-C|MFIiL&(phDeHs=UDpmpa1;-cg`VS{n8f=%qT=roOTl~9sc=W z{*6q#4R&zA?0(UbBu%>sbBr0>v>V_TXL}E!=>}MafaSV>{94=SdA-(bVevE`o;52XW)` zzxO+iPck0mAh736PRDr&EP!^~UIYF$A? z(EtE(fdv3G6b-Gm4giR73;>|j)**6j$8~xC1R{n7rVZzK4RM8AT(Xkj4(2zCM6%`4AM_p0TRt=n1n~tuH zc4tCNu)eH$`SbE⋘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 O0000 Date: Wed, 7 Sep 2022 16:48:08 +0200 Subject: [PATCH 044/111] yummy sawdust --- .../com/hbm/blocks/machine/MachineSawmill.java | 9 +++++++++ src/main/java/com/hbm/items/ModItems.java | 8 +++++++- src/main/java/com/hbm/main/CraftingManager.java | 1 + .../com/hbm/render/item/ItemRenderLibrary.java | 16 ++++++++++++++++ .../tileentity/machine/TileEntitySawmill.java | 7 +++++++ .../hbm/textures/items/briquette_sawdust.png | Bin 0 -> 267 bytes .../hbm/textures/items/powder_sawdust.png | Bin 0 -> 304 bytes .../assets/hbm/textures/items/sawblade.png | Bin 0 -> 330 bytes 8 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/hbm/textures/items/briquette_sawdust.png create mode 100644 src/main/resources/assets/hbm/textures/items/powder_sawdust.png create mode 100644 src/main/resources/assets/hbm/textures/items/sawblade.png diff --git a/src/main/java/com/hbm/blocks/machine/MachineSawmill.java b/src/main/java/com/hbm/blocks/machine/MachineSawmill.java index b33c3d5d9..2b975c001 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSawmill.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSawmill.java @@ -6,6 +6,7 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; +import com.hbm.items.ModItems; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntitySawmill; import com.hbm.util.BobMathUtil; @@ -75,6 +76,14 @@ public class MachineSawmill extends BlockDummyable implements ILookOverlay, IToo TileEntitySawmill sawmill = (TileEntitySawmill)world.getTileEntity(pos[0], pos[1], pos[2]); + if(!sawmill.hasBlade && player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.sawblade) { + player.getHeldItem().stackSize--; + sawmill.hasBlade = true; + sawmill.markDirty(); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:item.upgradePlug", 1.5F, 0.75F); + return true; + } + if(sawmill.slots[1] != null || sawmill.slots[2] != null) { for(int i = 1; i < 3; i++) { if(sawmill.slots[i] != null) { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 9de70bc27..af622b770 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -495,6 +495,7 @@ public class ModItems { public static Item powder_magic; public static Item powder_cloud; public static Item powder_balefire; + public static Item powder_sawdust; public static Item fragment_neodymium; public static Item fragment_cobalt; @@ -636,8 +637,9 @@ public class ModItems { public static Item pellet_coal; public static Item ring_starmetal; public static Item flywheel_beryllium; - + public static Item gear_large; + public static Item sawblade; public static Item toothpicks; public static Item ducttape; @@ -3010,6 +3012,7 @@ public class ModItems { powder_magic = new Item().setUnlocalizedName("powder_magic").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_magic"); powder_cloud = new Item().setUnlocalizedName("powder_cloud").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_cloud"); powder_balefire = new Item().setUnlocalizedName("powder_balefire").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_balefire"); + powder_sawdust = new Item().setUnlocalizedName("powder_sawdust").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_sawdust"); powder_coltan_ore = new Item().setUnlocalizedName("powder_coltan_ore").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_coltan_ore"); powder_coltan = new Item().setUnlocalizedName("powder_coltan").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_coltan"); powder_tektite = new Item().setUnlocalizedName("powder_tektite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_tektite"); @@ -3068,6 +3071,7 @@ public class ModItems { parts_legendary = new ItemEnumMulti(EnumLegendaryType.class, false, true).setUnlocalizedName("parts_legendary").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":parts_legendary"); gear_large = new ItemGear().setUnlocalizedName("gear_large").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gear_large"); + sawblade = new Item().setUnlocalizedName("sawblade").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":sawblade"); cap_aluminium = new Item().setUnlocalizedName("cap_aluminium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":cap_aluminium"); hull_small_steel = new Item().setUnlocalizedName("hull_small_steel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":hull_small_steel"); @@ -6005,6 +6009,7 @@ public class ModItems { GameRegistry.registerItem(powder_asbestos, powder_asbestos.getUnlocalizedName()); GameRegistry.registerItem(powder_magic, powder_magic.getUnlocalizedName()); GameRegistry.registerItem(powder_cloud, powder_cloud.getUnlocalizedName()); + GameRegistry.registerItem(powder_sawdust, powder_sawdust.getUnlocalizedName()); GameRegistry.registerItem(powder_balefire, powder_balefire.getUnlocalizedName()); GameRegistry.registerItem(powder_semtex_mix, powder_semtex_mix.getUnlocalizedName()); GameRegistry.registerItem(powder_desh_mix, powder_desh_mix.getUnlocalizedName()); @@ -6230,6 +6235,7 @@ public class ModItems { GameRegistry.registerItem(part_generic, part_generic.getUnlocalizedName()); GameRegistry.registerItem(parts_legendary, parts_legendary.getUnlocalizedName()); GameRegistry.registerItem(gear_large, gear_large.getUnlocalizedName()); + GameRegistry.registerItem(sawblade, sawblade.getUnlocalizedName()); //Plant Products GameRegistry.registerItem(plant_item, plant_item.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 2f30e19ee..5f4344b4f 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -220,6 +220,7 @@ public class CraftingManager { addShapelessAuto(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE, 1), new Object[] { Items.string, Items.string, Items.string }); addRecipeAuto(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE, 4), new Object[] { "W", "W", "W", 'W', DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.WEED) }); addRecipeAuto(new ItemStack(ModItems.rag, 16), new Object[] { "WW", "WW", 'W', DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.WEED) }); + addRecipeAuto(new ItemStack(Items.paper, 3), new Object[] { "SSS", 'S', ModItems.powder_sawdust }); ItemStack infinity = new ItemStack(Items.enchanted_book); EnchantmentUtil.addEnchantment(infinity, Enchantment.infinity, 1); diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 5a7d42d3a..031ade89c 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -1360,6 +1360,22 @@ public class ItemRenderLibrary { ResourceManager.stirling.renderPart("Cog"); }}); + renderers.put(ModItems.sawblade, new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -7, 0); + GL11.glScaled(6, 6, 6); + GL11.glRotated(-45, 0, 1, 0); + GL11.glRotated(30, 1, 0, 0); + GL11.glTranslated(0, 1.375, 0); + GL11.glRotated(System.currentTimeMillis() % 3600 * 0.2F, 0, 0, 1); + GL11.glTranslated(0, -1.375, 0); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glTranslated(0, 0, -0.875); + bindTexture(ResourceManager.sawmill_tex); + ResourceManager.stirling.renderPart("Blade"); + }}); + //hi there! it seems you are trying to register a new item renderer, most likely for a tile entity. //please refer to the comment at the start of the file on how to do this without adding to this gigantic pile of feces. } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index a9512d229..39f8b2be3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine; import java.util.List; +import com.hbm.items.ModItems; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCraftingAuto; @@ -61,6 +62,12 @@ public class TileEntitySawmill extends TileEntityMachineBase { progress = 0; slots[0] = null; slots[1] = result; + + float chance = result.getItem() == Items.stick ? 0.05F : 0.5F; + if(worldObj.rand.nextFloat() < chance) { + slots[2] = new ItemStack(ModItems.powder_sawdust); + } + this.markDirty(); } diff --git a/src/main/resources/assets/hbm/textures/items/briquette_sawdust.png b/src/main/resources/assets/hbm/textures/items/briquette_sawdust.png new file mode 100644 index 0000000000000000000000000000000000000000..885b03ba98918e9810079a010ad5d5460122cc4a GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfcn z=FOYZKd!%#zVLL;mv6Ou@7kVQa$v%i`<_cW0&WFdJ0;Ay%;Tr#;uTVtD!c#%iVa0~7uA)HS OFnGH9xvX1up$2xQzrRq*KZgDe#QW|{ATmkkz^ zu9<)LNa6^oH2uzFlahfCOQrc5wCr`sB)kVpr2$Cd2!Nl}o+OU$CaL*Ykd@742bBpo0`^Im)34R=}lT|3jlJ?MxtL40W${x2;Y!X zN&tW{2JUAs{%4?_RVX4xrbex`i{>(de>4%noD*|SGxDPufq%H1vtiCTaU4egfPLRr zjL}FmdhcOl=0HRsBAfXsQc4gJhzLq4>oSkxc?tl~?kOdVG0=NA-F7pu1Q8*|h&#F$ z1Gg=dQkHg762fU<~=XqX6W9Hyj3IHEX;KyL*@XJ4A cW4+b<0Ue5^J6(thsQ>@~07*qoM6N<$g3%a)NB{r; literal 0 HcmV?d00001 From 0eb267926494bb0e4c629f4972c7f9cd6b605d2b Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 7 Sep 2022 22:03:24 +0200 Subject: [PATCH 045/111] more sawdust more sawdust --- .../java/com/hbm/render/item/ItemRenderLibrary.java | 2 +- .../hbm/tileentity/machine/TileEntitySawmill.java | 12 +++++++++--- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 031ade89c..835852f59 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -1373,7 +1373,7 @@ public class ItemRenderLibrary { public void renderCommonWithStack(ItemStack item) { GL11.glTranslated(0, 0, -0.875); bindTexture(ResourceManager.sawmill_tex); - ResourceManager.stirling.renderPart("Blade"); + ResourceManager.sawmill.renderPart("Blade"); }}); //hi there! it seems you are trying to register a new item renderer, most likely for a tile entity. diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index 39f8b2be3..4e1c44e75 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -63,9 +63,11 @@ public class TileEntitySawmill extends TileEntityMachineBase { slots[0] = null; slots[1] = result; - float chance = result.getItem() == Items.stick ? 0.05F : 0.5F; - if(worldObj.rand.nextFloat() < chance) { - slots[2] = new ItemStack(ModItems.powder_sawdust); + if(result.getItem() != ModItems.powder_sawdust) { + float chance = result.getItem() == Items.stick ? 0.05F : 0.5F; + if(worldObj.rand.nextFloat() < chance) { + slots[2] = new ItemStack(ModItems.powder_sawdust); + } } this.markDirty(); @@ -196,6 +198,10 @@ public class TileEntitySawmill extends TileEntityMachineBase { List names = ItemStackUtil.getOreDictNames(input); + if(names.contains("stickWood")) { + return new ItemStack(ModItems.powder_sawdust); + } + if(names.contains("logWood")) { for(Object o : CraftingManager.getInstance().getRecipeList()) { IRecipe recipe = (IRecipe) o; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 5eb9e96c4..ac204dfd5 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2360,6 +2360,7 @@ item.powder_power.name=Energiepulver item.powder_quartz.name=Quarzstaub item.powder_red_copper.name=Roter Kupfer Staub item.powder_reiium.name=Reiiumstaub +item.powder_sawdust.name=Sägespäne item.powder_schrabidate.name=Eisenschrabidatstaub item.powder_schrabidium.name=Schrabidiumstaub item.powder_semtex_mix.name=Semtexmischung diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index f5f460306..320ebe570 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2713,6 +2713,7 @@ item.powder_quartz.name=Quartz Powder item.powder_ra226.name=Radium-226 Powder item.powder_red_copper.name=Red Copper Powder item.powder_reiium.name=Reiium Powder +item.powder_sawdust.name=Sawdust item.powder_schrabidate.name=Ferric Schrabidate Powder item.powder_schrabidium.name=Schrabidium Powder item.powder_semtex_mix.name=Semtex Blend From 7a500e3fb5a864df4b2649b48810765c820aa6bc Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 9 Sep 2022 14:55:05 +0200 Subject: [PATCH 046/111] tintable WIAJ arrow, EntityThrowableInterp --- .../com/hbm/entity/projectile/EntityCog.java | 52 +---------- .../projectile/EntityThrowableInterp.java | 82 ++++++++++++++++++ .../com/hbm/main/ModEventHandlerClient.java | 2 +- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 75 +++++++++------- .../com/hbm/wiaj/actors/ActorFancyPanel.java | 30 +++++-- .../com/hbm/wiaj/cannery/CanneryBase.java | 7 ++ .../hbm/wiaj/cannery/CanneryCentrifuge.java | 21 +++-- .../com/hbm/wiaj/cannery/CanneryFEnSU.java | 11 ++- .../com/hbm/wiaj/cannery/CanneryFirebox.java | 25 +++--- .../com/hbm/wiaj/cannery/CannerySILEX.java | 33 ++++--- .../com/hbm/wiaj/cannery/CanneryStirling.java | 30 +++++-- src/main/resources/assets/hbm/lang/de_DE.lang | 5 ++ src/main/resources/assets/hbm/lang/en_US.lang | 5 ++ .../assets/hbm/textures/gui/gui_utility.png | Bin 3954 -> 4480 bytes 14 files changed, 247 insertions(+), 131 deletions(-) create mode 100644 src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java diff --git a/src/main/java/com/hbm/entity/projectile/EntityCog.java b/src/main/java/com/hbm/entity/projectile/EntityCog.java index d58d542ac..84c27bb77 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityCog.java +++ b/src/main/java/com/hbm/entity/projectile/EntityCog.java @@ -13,27 +13,13 @@ 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.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.util.MovingObjectPosition.MovingObjectType; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class EntityCog extends EntityThrowableNT { - - private int turnProgress; - private double syncPosX; - private double syncPosY; - private double syncPosZ; - private double syncYaw; - private double syncPitch; - @SideOnly(Side.CLIENT) - private double velocityX; - @SideOnly(Side.CLIENT) - private double velocityY; - @SideOnly(Side.CLIENT) - private double velocityZ; +public class EntityCog extends EntityThrowableInterp { public EntityCog(World world) { super(world); @@ -145,41 +131,9 @@ public class EntityCog extends EntityThrowableNT { if(orientation >= 6 && !this.inGround) { this.dataWatcher.updateObject(10, orientation - 6); } - super.onUpdate(); - } else { - if(this.turnProgress > 0) { - double interpX = this.posX + (this.syncPosX - this.posX) / (double) this.turnProgress; - double interpY = this.posY + (this.syncPosY - this.posY) / (double) this.turnProgress; - double interpZ = this.posZ + (this.syncPosZ - this.posZ) / (double) this.turnProgress; - double d = MathHelper.wrapAngleTo180_double(this.syncYaw - (double) this.rotationYaw); - this.rotationYaw = (float) ((double) this.rotationYaw + d / (double) this.turnProgress); - this.rotationPitch = (float)((double)this.rotationPitch + (this.syncPitch - (double)this.rotationPitch) / (double)this.turnProgress); - --this.turnProgress; - this.setPosition(interpX, interpY, interpZ); - } else { - this.setPosition(this.posX, this.posY, this.posZ); - } } - } - - @SideOnly(Side.CLIENT) - public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_) { - this.velocityX = this.motionX = p_70016_1_; - this.velocityY = this.motionY = p_70016_3_; - this.velocityZ = this.motionZ = p_70016_5_; - } - - @SideOnly(Side.CLIENT) - public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int theNumberThree) { - this.syncPosX = x; - this.syncPosY = y; - this.syncPosZ = z; - this.syncYaw = yaw; - this.syncPitch = pitch; - this.turnProgress = theNumberThree; - this.motionX = this.velocityX; - this.motionY = this.velocityY; - this.motionZ = this.velocityZ; + + super.onUpdate(); } @Override diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java new file mode 100644 index 000000000..d211ce964 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java @@ -0,0 +1,82 @@ +package com.hbm.entity.projectile; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public abstract class EntityThrowableInterp extends EntityThrowableNT { + + private int turnProgress; + private double syncPosX; + private double syncPosY; + private double syncPosZ; + private double syncYaw; + private double syncPitch; + @SideOnly(Side.CLIENT) + private double velocityX; + @SideOnly(Side.CLIENT) + private double velocityY; + @SideOnly(Side.CLIENT) + private double velocityZ; + + public EntityThrowableInterp(World world) { + super(world); + } + + public EntityThrowableInterp(World world, double x, double y, double z) { + super(world, x, y, z); + } + + @Override + public void onUpdate() { + + if(!worldObj.isRemote) { + int orientation = this.dataWatcher.getWatchableObjectInt(10); + if(orientation >= 6 && !this.inGround) { + this.dataWatcher.updateObject(10, orientation - 6); + } + super.onUpdate(); + } else { + if(this.turnProgress > 0) { + double interpX = this.posX + (this.syncPosX - this.posX) / (double) this.turnProgress; + double interpY = this.posY + (this.syncPosY - this.posY) / (double) this.turnProgress; + double interpZ = this.posZ + (this.syncPosZ - this.posZ) / (double) this.turnProgress; + double d = MathHelper.wrapAngleTo180_double(this.syncYaw - (double) this.rotationYaw); + this.rotationYaw = (float) ((double) this.rotationYaw + d / (double) this.turnProgress); + this.rotationPitch = (float)((double)this.rotationPitch + (this.syncPitch - (double)this.rotationPitch) / (double)this.turnProgress); + --this.turnProgress; + this.setPosition(interpX, interpY, interpZ); + } else { + this.setPosition(this.posX, this.posY, this.posZ); + } + } + } + + @SideOnly(Side.CLIENT) + public void setVelocity(double velX, double velY, double velZ) { + this.velocityX = this.motionX = velX; + this.velocityY = this.motionY = velY; + this.velocityZ = this.motionZ = velZ; + } + + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int theNumberThree) { + this.syncPosX = x; + this.syncPosY = y; + this.syncPosZ = z; + this.syncYaw = yaw; + this.syncPitch = pitch; + this.turnProgress = theNumberThree + approachNum(); + this.motionX = this.velocityX; + this.motionY = this.velocityY; + this.motionZ = this.velocityZ; + } + + /** + * @return a number added to the basic "3" of the approach progress value. Larger numbers make the approach smoother, but lagging behind the true value more. + */ + public int approachNum() { + return 0; + } +} diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index e9d63a7cc..a39a1dc51 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -758,7 +758,7 @@ public class ModEventHandlerClient { CanneryBase cannery = Jars.canneries.get(comp); if(cannery != null) { - FMLCommonHandler.instance().showGuiScreen(new GuiWorldInAJar(cannery.createScript(), cannery.getIcon())); + FMLCommonHandler.instance().showGuiScreen(new GuiWorldInAJar(cannery.createScript(), cannery.getName(), cannery.getIcon())); } break; diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 153031df3..a6403503b 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -10,7 +10,10 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import com.hbm.lib.RefStrings; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.actors.ActorFancyPanel; import com.hbm.wiaj.actors.ISpecialActor; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; import com.hbm.wiaj.cannery.*; import net.minecraft.client.Minecraft; @@ -33,19 +36,23 @@ public class GuiWorldInAJar extends GuiScreen { private static final ResourceLocation guiUtil = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_utility.png"); RenderBlocks renderer; - JarScript testScript; + JarScript jarScript; ItemStack icon; + ActorFancyPanel titlePanel; CanneryBase[] seeAlso; + ActorFancyPanel[] seeAlsoTitles; - public GuiWorldInAJar(JarScript script, ItemStack icon, CanneryBase... seeAlso) { + public GuiWorldInAJar(JarScript script, String title, ItemStack icon, CanneryBase... seeAlso) { super(); this.fontRendererObj = Minecraft.getMinecraft().fontRenderer; - this.testScript = script; + this.jarScript = script; this.icon = icon; this.seeAlso = seeAlso; - renderer = new RenderBlocks(testScript.world); - renderer.enableAO = true; + this.renderer = new RenderBlocks(jarScript.world); + this.renderer.enableAO = true; + + this.titlePanel = new ActorFancyPanel(fontRendererObj, 40, 27, new Object[][] {{I18nUtil.resolveKey(title)}}, 0).setColors(CanneryBase.colorGold).setOrientation(Orientation.LEFT); /*WorldInAJar world = new WorldInAJar(15, 15, 15); @@ -143,11 +150,11 @@ public class GuiWorldInAJar extends GuiScreen { @Override public void drawScreen(int mouseX, int mouseY, float f) { this.drawDefaultBackground(); - shittyHack = this; + //shittyHack = this; try { - if(testScript != null) { - testScript.run(); + if(jarScript != null) { + jarScript.run(); } this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); GL11.glDisable(GL11.GL_LIGHTING); @@ -170,25 +177,25 @@ public class GuiWorldInAJar extends GuiScreen { if(width / 2 - 12 <= mouseX && width / 2 - 12 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - if(this.testScript.isPaused()) { - this.testScript.unpause(); + if(this.jarScript.isPaused()) { + this.jarScript.unpause(); } else { - this.testScript.pause(); + this.jarScript.pause(); } } if(width / 2 - 12 - 36 <= mouseX && width / 2 - 12 - 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { - if(this.testScript.sceneNumber > 0) { - this.testScript.rewindOne(); + if(this.jarScript.sceneNumber > 0) { + this.jarScript.rewindOne(); mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); } } if(width / 2 - 12 + 36 <= mouseX && width / 2 - 12 + 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { - if(this.testScript.sceneNumber < this.testScript.scenes.size()) { - this.testScript.forwardOne(); + if(this.jarScript.sceneNumber < this.jarScript.scenes.size()) { + this.jarScript.forwardOne(); mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); } } @@ -196,9 +203,9 @@ public class GuiWorldInAJar extends GuiScreen { private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - for(Entry actor : this.testScript.actors.entrySet()) { + for(Entry actor : this.jarScript.actors.entrySet()) { GL11.glPushMatrix(); - actor.getValue().drawForegroundComponent(this.width, this.height, this.testScript.ticksElapsed, this.testScript.interp); + actor.getValue().drawForegroundComponent(this.width, this.height, this.jarScript.ticksElapsed, this.jarScript.interp); GL11.glPopMatrix(); } @@ -212,21 +219,21 @@ public class GuiWorldInAJar extends GuiScreen { RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL11.GL_DEPTH_TEST); - int playButton = this.testScript.isPaused() ? 64 : 40; + int playButton = this.jarScript.isPaused() ? 64 : 40; if(width / 2 - 12 <= mouseX && width / 2 - 12 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) this.drawTexturedModalRect(width / 2 - 12, height - 36, playButton, 24, 24, 24); else this.drawTexturedModalRect(width / 2 - 12, height - 36, playButton, 48, 24, 24); - if(this.testScript.sceneNumber == 0) + if(this.jarScript.sceneNumber == 0) this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 72, 24, 24); else if(width / 2 - 12 - 36 <= mouseX && width / 2 - 12 - 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 24, 24, 24); else this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 48, 24, 24); - if(this.testScript.sceneNumber >= this.testScript.scenes.size()) + if(this.jarScript.sceneNumber >= this.jarScript.scenes.size()) this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 72, 24, 24); else if(width / 2 - 12 + 36 <= mouseX && width / 2 - 12 + 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 24, 24, 24); @@ -238,6 +245,10 @@ public class GuiWorldInAJar extends GuiScreen { itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.renderEngine, this.icon, 19, 19); itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.renderEngine, this.icon, 19, 19, null); RenderHelper.disableStandardItemLighting(); + + if(15 <= mouseX && 39 > mouseX && 15 < mouseY && 39 >= mouseY) { + this.titlePanel.drawForegroundComponent(0, 0, this.jarScript.ticksElapsed, this.jarScript.interp); + } } private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { @@ -249,10 +260,10 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glShadeModel(GL11.GL_SMOOTH); Tessellator.instance.startDrawingQuads(); - for(int x = 0; x < testScript.world.sizeX; x++) { - for(int y = 0; y < testScript.world.sizeY; y++) { - for(int z = 0; z < testScript.world.sizeZ; z++) { - renderer.renderBlockByRenderType(testScript.world.getBlock(x, y, z), x, y, z); + for(int x = 0; x < jarScript.world.sizeX; x++) { + for(int y = 0; y < jarScript.world.sizeY; y++) { + for(int z = 0; z < jarScript.world.sizeZ; z++) { + renderer.renderBlockByRenderType(jarScript.world.getBlock(x, y, z), x, y, z); } } } @@ -269,9 +280,9 @@ public class GuiWorldInAJar extends GuiScreen { RenderHelper.enableStandardItemLighting(); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); - for(Entry actor : this.testScript.actors.entrySet()) { + for(Entry actor : this.jarScript.actors.entrySet()) { GL11.glPushMatrix(); - actor.getValue().drawBackgroundComponent(this.testScript.ticksElapsed, this.testScript.interp); + actor.getValue().drawBackgroundComponent(this.jarScript.ticksElapsed, this.jarScript.interp); GL11.glPopMatrix(); } @@ -286,13 +297,13 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glScaled(scale, scale, scale); GL11.glScaled(1, 1, 0.5); //incredible flattening power - double zoom = testScript.zoom(); + double zoom = jarScript.zoom(); GL11.glScaled(zoom, zoom, zoom); - GL11.glRotated(testScript.pitch(), 1, 0, 0); - GL11.glRotated(testScript.yaw(), 0, 1, 0); - GL11.glTranslated(testScript.world.sizeX / -2D, -testScript.world.sizeY / 2D , testScript.world.sizeZ / -2D); - GL11.glTranslated(testScript.offsetX(), testScript.offsetY(), testScript.offsetZ()); + GL11.glRotated(jarScript.pitch(), 1, 0, 0); + GL11.glRotated(jarScript.yaw(), 0, 1, 0); + GL11.glTranslated(jarScript.world.sizeX / -2D, -jarScript.world.sizeY / 2D , jarScript.world.sizeZ / -2D); + GL11.glTranslated(jarScript.offsetX(), jarScript.offsetY(), jarScript.offsetZ()); } @Override @@ -300,7 +311,7 @@ public class GuiWorldInAJar extends GuiScreen { return false; } - public static GuiWorldInAJar shittyHack; + //ublic static GuiWorldInAJar shittyHack; public void drawStackText(List lines, int x, int y, FontRenderer font) { diff --git a/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java index 3bf696701..c1b4de34f 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java @@ -93,6 +93,10 @@ public class ActorFancyPanel implements ISpecialActor { return this; } + public ActorFancyPanel setColors(int[] colors) { + return setColors(colors[0], colors[1], colors[2], colors[3]); + } + public int getTallestElement() { if(this.tallestElement > 0) { return this.tallestElement; @@ -260,20 +264,18 @@ public class ActorFancyPanel implements ISpecialActor { Minecraft.getMinecraft().getTextureManager().bindTexture(guiUtil); - int off = 28; - switch(o) { case TOP: - this.drawTexturedModalRect(posX + width / 2 - 7, posY - 15, 40 + off, 14, 14, 10); + this.drawArrow(posX + width / 2 - 7, posY - 15, 40, 14, 14, 10); break; case BOTTOM: - this.drawTexturedModalRect(posX + width / 2 - 7, posY + height + 5, 54 + off, 14, 14, 10); + this.drawArrow(posX + width / 2 - 7, posY + height + 5, 54, 14, 14, 10); break; case LEFT: - this.drawTexturedModalRect(posX - 15, posY + height / 2 - 7, 40 + off, 0, 10, 14); + this.drawArrow(posX - 15, posY + height / 2 - 7, 40, 0, 10, 14); break; case RIGHT: - this.drawTexturedModalRect(posX + width + 5, posY + height / 2 - 7, 50 + off, 0, 10, 14); + this.drawArrow(posX + width + 5, posY + height / 2 - 7, 50, 0, 10, 14); break; case CENTER: break; } @@ -307,6 +309,13 @@ public class ActorFancyPanel implements ISpecialActor { GL11.glEnable(GL12.GL_RESCALE_NORMAL); } + private void drawArrow(int posX, int posY, int sourceX, int sourceY, int sizeX, int sizeY) { + this.drawTexturedModalRect(posX, posY, sourceX + 28 * 0, sourceY, sizeX, sizeY, this.colorBrighter); + this.drawTexturedModalRect(posX, posY, sourceX + 28 * 1, sourceY, sizeX, sizeY, this.colorFrame); + this.drawTexturedModalRect(posX, posY, sourceX + 28 * 2, sourceY, sizeX, sizeY, this.colorDarker); + this.drawTexturedModalRect(posX, posY, sourceX + 28 * 3, sourceY, sizeX, sizeY, this.colorBg); + } + private void drawElement(int x, int y, Object element) { if(element instanceof String) { @@ -373,11 +382,20 @@ public class ActorFancyPanel implements ISpecialActor { } public void drawTexturedModalRect(int posX, int posY, int u, int v, int sizeX, int sizeY) { + drawTexturedModalRect(posX, posY, u, v, sizeX, sizeY, 0xffffff); + } + + public void drawTexturedModalRect(int posX, int posY, int u, int v, int sizeX, int sizeY, int color) { double zLevel = 300D; + float a = (float) (color >> 24 & 255) / 255.0F; + float r = (float) (color >> 16 & 255) / 255.0F; + float g = (float) (color >> 8 & 255) / 255.0F; + float b = (float) (color & 255) / 255.0F; float f = 0.00390625F; float f1 = 0.00390625F; Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(r, g, b, a); tessellator.addVertexWithUV(posX + 0, posY + sizeY, zLevel, (u + 0) * f, (v + sizeY) * f1); tessellator.addVertexWithUV(posX + sizeX, posY + sizeY, zLevel, (u + sizeX) * f, (v + sizeY) * f1); tessellator.addVertexWithUV(posX + sizeX, posY + 0, zLevel, (u + sizeX) * f, (v + 0) * f1); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java b/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java index f80399ab9..c94397274 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java @@ -6,6 +6,13 @@ import net.minecraft.item.ItemStack; public abstract class CanneryBase { + public static final int[] colorCopper = new int[] {0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xFF1A1F22}; + public static final int[] colorGold = new int[] {0xFFFFFDE0, 0xFFFAD64A, 0xFFDC9613, 0xFF1A1F22}; + public static final int[] colorBlue = new int[] {0xFFA5D9FF, 0xFF39ACFF, 0xFF1A6CA7, 0xFF1A1F22}; + public static final int[] colorGrey = new int[] {0xFFA5D9FF, 0xFF39ACFF, 0xFF1A6CA7, 0xFF1A1F22}; + public abstract ItemStack getIcon(); + public abstract String getName(); public abstract JarScript createScript(); + public CanneryBase[] seeAlso() { return new CanneryBase[0]; } } diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java index 135dbbd9c..fe8cde550 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java @@ -34,6 +34,11 @@ public class CanneryCentrifuge extends CanneryBase { return new ItemStack(ModBlocks.machine_gascent); } + @Override + public String getName() { + return "cannery.centrifuge"; + } + public JarScript createScript() { WorldInAJar world = new WorldInAJar(9, 5, 5); JarScript script = new JarScript(world); @@ -73,7 +78,7 @@ public class CanneryCentrifuge extends CanneryBase { } scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, -50, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.0")}}, 200) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); scene0.add(new ActionRemoveActor(1)); @@ -81,7 +86,7 @@ public class CanneryCentrifuge extends CanneryBase { JarScene scene1 = new JarScene(script); scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, 10, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.1")}}, 200) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); + .setColors(colorCopper).setOrientation(Orientation.CENTER))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(1)); @@ -89,7 +94,7 @@ public class CanneryCentrifuge extends CanneryBase { scene1.add(new ActionSetZoom(4, 20)); scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 40, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.2")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.LEFT))); + .setColors(colorCopper).setOrientation(Orientation.LEFT))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(1)); @@ -101,14 +106,14 @@ public class CanneryCentrifuge extends CanneryBase { scene1.add(new ActionWait(10)); scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.3")}}, 200) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); + .setColors(colorCopper).setOrientation(Orientation.CENTER))); scene1.add(new ActionWait(100)); scene1.add(new ActionRemoveActor(2)); scene1.add(new ActionSetZoom(-2, 20)); scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.4")}}, 200) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); + .setColors(colorCopper).setOrientation(Orientation.CENTER))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(2)); @@ -121,16 +126,16 @@ public class CanneryCentrifuge extends CanneryBase { scene1.add(new ActionWait(10)); scene1.add(new ActionCreateActor(4, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.5")}}, 200) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.CENTER))); + .setColors(colorCopper).setOrientation(Orientation.CENTER))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(4)); scene1.add(new ActionCreateActor(4, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 28, -30, new Object[][] {{new ItemStack(ModItems.upgrade_gc_speed)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionCreateActor(5, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 45, 35, new Object[][] {{" = ", new ItemStack(ModItems.nugget_u238, 11), new ItemStack(ModItems.nugget_u235)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.LEFT))); + .setColors(colorCopper).setOrientation(Orientation.LEFT))); script.addScene(scene0).addScene(scene1); return script; diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java index 6ae2c95f8..dcd1e22ee 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java @@ -29,6 +29,11 @@ public class CanneryFEnSU extends CanneryBase { return new ItemStack(ModBlocks.machine_fensu); } + @Override + public String getName() { + return "cannery.fensu"; + } + public JarScript createScript() { WorldInAJar world = new WorldInAJar(11, 5, 5); JarScript script = new JarScript(world); @@ -45,19 +50,19 @@ public class CanneryFEnSU extends CanneryBase { scene0.add(new ActionCreateActor(0, new ActorTileEntity(new RenderFENSU(), fensu))); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -50, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.0")}}, 200) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(80)); scene0.add(new ActionRemoveActor(1)); scene0.add(new ActionWait(10)); scene0.add(new ActionRotateBy(45, 90, 20)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.1")}}, 200) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.TOP))); + .setColors(colorCopper).setOrientation(Orientation.TOP))); scene0.add(new ActionWait(60)); scene0.add(new ActionRemoveActor(1)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.2")}}, 200) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.TOP))); + .setColors(colorCopper).setOrientation(Orientation.TOP))); scene0.add(new ActionWait(60)); scene0.add(new ActionRemoveActor(1)); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java index 1e99f4172..3429c3404 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java @@ -37,6 +37,11 @@ public class CanneryFirebox extends CanneryBase { return new ItemStack(ModBlocks.heater_firebox); } + @Override + public String getName() { + return "cannery.firebox"; + } + public JarScript createScript() { WorldInAJar world = new WorldInAJar(5, 5, 5); @@ -61,12 +66,12 @@ public class CanneryFirebox extends CanneryBase { scene0.add(new ActionWait(10)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.0")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.1")}}, 250) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); scene0.add(new ActionRemoveActor(1)); @@ -77,19 +82,19 @@ public class CanneryFirebox extends CanneryBase { scene0.add(new ActionUpdateActor(0, "isOn", true)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(Items.coal)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); scene0.add(new ActionWait(10)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.coke)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); scene0.add(new ActionWait(10)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.solid_fuel)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); scene0.add(new ActionWait(10)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.rocket_fuel)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); scene0.add(new ActionWait(10)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.solid_fuel_bf)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); scene0.add(new ActionWait(10)); scene0.add(new ActionRemoveActor(1)); scene0.add(new ActionWait(10)); @@ -97,12 +102,12 @@ public class CanneryFirebox extends CanneryBase { scene0.add(new ActionWait(30)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.2")}}, 250) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(80)); scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.3")}}, 250) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); scene0.add(new ActionRemoveActor(1)); @@ -121,7 +126,7 @@ public class CanneryFirebox extends CanneryBase { scene1.add(new ActionWait(10)); scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.4")}}, 250) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(2)); scene1.add(new ActionWait(10)); diff --git a/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java index 224d0b7d4..5fbb1481b 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java +++ b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java @@ -42,6 +42,11 @@ public class CannerySILEX extends CanneryBase{ return new ItemStack(ModBlocks.machine_silex); } + @Override + public String getName() { + return "cannery.silex"; + } + public JarScript createScript() { WorldInAJar world = new WorldInAJar(17, 5, 5); JarScript script = new JarScript(world); @@ -69,30 +74,30 @@ public class CannerySILEX extends CanneryBase{ scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorFEL(), fel))); scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 15, -5, new Object[][] {{I18nUtil.resolveKey("cannery.silex.0")}}, 100) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.LEFT))); + .setColors(colorCopper).setOrientation(Orientation.LEFT))); scene0.add(new ActionWait(80)); scene0.add(new ActionRemoveActor(3)); scene0.add(new ActionWait(10)); scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_co2)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionUpdateActor(0, "mode", 1)); scene0.add(new ActionWait(20)); scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_bismuth)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionUpdateActor(0, "mode", 2)); scene0.add(new ActionWait(20)); scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_cmb)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionUpdateActor(0, "mode", 3)); scene0.add(new ActionWait(20)); scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_dnt)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionUpdateActor(0, "mode", 4)); scene0.add(new ActionWait(20)); scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_digamma)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionUpdateActor(0, "mode", 5)); scene0.add(new ActionWait(20)); @@ -108,7 +113,7 @@ public class CannerySILEX extends CanneryBase{ } scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.1")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionUpdateActor(0, "mode", 3)); scene0.add(new ActionUpdateActor(0, "length", 4)); @@ -132,7 +137,7 @@ public class CannerySILEX extends CanneryBase{ } scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.2")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(40)); scene0.add(new ActionRemoveActor(3)); @@ -162,17 +167,17 @@ public class CannerySILEX extends CanneryBase{ scene1.add(new ActionWait(20)); scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.3")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(80)); scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 60, 32, new Object[][] {{I18nUtil.resolveKey("cannery.silex.4")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); scene1.add(new ActionWait(60)); scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 12, 32, new Object[][] {{I18nUtil.resolveKey("cannery.silex.5")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(3)); @@ -195,17 +200,17 @@ public class CannerySILEX extends CanneryBase{ scene1.add(new ActionWait(10)); scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.6")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(80)); scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.7")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(60)); scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.8")}}, 150) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(3)); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java b/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java index 78641f227..e150b4959 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java @@ -35,6 +35,16 @@ public class CanneryStirling extends CanneryBase { return new ItemStack(ModBlocks.machine_stirling); } + @Override + public String getName() { + return "cannery.stirling"; + } + public CanneryBase[] seeAlso() { + return new CanneryBase[] { + new CanneryFirebox() + }; + } + @Override public JarScript createScript() { @@ -61,24 +71,28 @@ public class CanneryStirling extends CanneryBase { NBTTagCompound stirling = new NBTTagCompound(); stirling.setDouble("x", 2); - stirling.setDouble("y", 2); stirling.setDouble("z", 2); stirling.setInteger("rotation", 2); - stirling.setInteger("type", 0); - stirling.setBoolean("hasCog", true); scene0.add(new ActionCreateActor(1, new ActorTileEntity(new RenderStirling(), stirling))); + /* + * When rewinding, the NBT tag persists. We have to manually set all variable values with UpdateActor. + */ scene0.add(new ActionUpdateActor(1, "speed", 0F)); scene0.add(new ActionUpdateActor(1, "y", 2D)); + scene0.add(new ActionUpdateActor(1, "type", 0)); + scene0.add(new ActionUpdateActor(1, "hasCog", true)); + scene0.add(new ActionUpdateActor(1, "spin", 0F)); + scene0.add(new ActionUpdateActor(1, "lastSpin", 0F)); scene0.add(new ActionWait(10)); scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.0")}}, 250) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 40, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.1")}}, 250) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene0.add(new ActionWait(60)); scene0.add(new ActionRemoveActor(2)); @@ -87,7 +101,7 @@ public class CanneryStirling extends CanneryBase { scene0.add(new ActionWait(30)); scene0.add(new ActionUpdateActor(0, "isOn", true)); scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(Items.coal)}}, 0) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.RIGHT))); + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); scene0.add(new ActionWait(20)); scene0.add(new ActionRemoveActor(2)); scene0.add(new ActionWait(10)); @@ -115,7 +129,7 @@ public class CanneryStirling extends CanneryBase { JarScene scene1 = new JarScene(script); scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.2")}}, 250) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(2)); @@ -145,7 +159,7 @@ public class CanneryStirling extends CanneryBase { scene1.add(new ActionWait(20)); scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.3")}}, 250) - .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); scene1.add(new ActionWait(60)); scene1.add(new ActionRemoveActor(2)); scene1.add(new ActionWait(20)); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index ac204dfd5..a9815652b 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -130,6 +130,7 @@ book.test.page1=Testseite 1 cannery.f1=[ Drücke F1 für Hilfe ] +cannery.centrifuge=Gaszentrifuge cannery.centrifuge.0=Gaszentrifugen können mit Flüssigkeitsrohren versorgt werden. cannery.centrifuge.1=Die meisten Rezepte benötigen mehrere Zentrifugen, Zwischenprodukte können nicht mit Rohren transportiert werden. cannery.centrifuge.2=Diese Seite dient als Verbindung, die Zwischenprodukte in anliegende Zentrifugen überträgt. @@ -137,16 +138,19 @@ cannery.centrifuge.3=Uranhexafluorid kann mit nur zwei Zentrifugen verarbeitet w cannery.centrifuge.4=Mit vier Zentrifugen kann es vollständig in Uran-235 und Uran238 verarbeitet werden. cannery.centrifuge.5=Manche Rezepte benötigen das Zentrifugen-Geschwingidkeitsupgrade. +cannery.fensu=FEnSU cannery.fensu.0=Die FEnSU kann absurde Mengen Energie speichern, über 9EHE (eine Neun gefolgt von 18 Nullen). cannery.fensu.1=Es gibt nur einen Kontakt auf der Unterseite. cannery.fensu.2=Das ist auch der einzige Ort, an dem die FEnSU ein Redstone-Signal empfangen kann. +cannery.firebox=Feuerbüchse cannery.firebox.0=Die Feuerbüchse verbrennt Gegenstände, um Hitze zu erzeugen. cannery.firebox.1=Sie kann alle brennbaren Gegenstände verwenden, aber hochwertigere Brennstoffe wie Kohle, Koks oder Festbrennstoff brennen länger und heißer. cannery.firebox.2=Hitze wird von dem Kupferkontakt an der Oberseite abgegeben. Maschinen mit einem identischen Kontakt an der Unterseite können Hitze annehmen, wenn sie darauf platziert werden. cannery.firebox.3=Wenn die Hitze nicht verbraucht wird hält die Feuerbüchse an, um keinen Brennstoff zu verschwenden. cannery.firebox.4=Eine solche Maschine ist der Stirlingmotor, welcher aus Hitze direkt Energie erzeugt. +cannery.silex=FEL & SILEX cannery.silex.0=Der Freieilektonenlaser (FEL) verwendet Energie und einen Laserkristall um einen starken Laserstrahl zu erzeugen. cannery.silex.1=Vorsicht, der Laser kann sich durch schwächere Blöcke hindurchbrennen... cannery.silex.2=...aber nicht durch sprengsichere. @@ -157,6 +161,7 @@ cannery.silex.6=Zusätzlich zu den zwei Öffnungen gibt es an der Unterseite ein cannery.silex.7=Jedes Rezept benötigt einen speziellen Laser-Typ. Stärkere Typen beschleunigen den Vorgang. cannery.silex.8=Ein FEL kann bis zu fünf SILEX betreiben. Jedes SILEX muss einen Block Abstand halten. +cannery.stirling=Stirlingmotor cannery.stirling.0=Der Stirlingmotor verwendet Hitze aus einer externen Quelle um Energie zu erzeugen. cannery.stirling.1=Er muss auf einem Hitzeerzeuger platziert werden, zum Beispiel der Feuerbüchse. cannery.stirling.2=Die Hitze die maximal verwendet werden kann ist limitiert, Übergeschwindigkeit kann zu katastrophalen Fehlfunktionen führen. diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 320ebe570..fe7ccfb47 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -316,6 +316,7 @@ book.starter.page18=vær is just a guy who has been trapped in the grey void fea cannery.f1=[ Press F1 for help ] +cannery.centrifuge=Gas Centrifuge cannery.centrifuge.0=Gas centrifuges can be supplied with fluid using regular fluid ducts. cannery.centrifuge.1=Most recipes require multiple centrifuges. The intermediate products cannot be transported via pipes. cannery.centrifuge.2=This side acts as a connector which outputs the intermediate product into an adjacent centrifuge. @@ -323,16 +324,19 @@ cannery.centrifuge.3=Uranium hexafluoride can be processed with just two centrif cannery.centrifuge.4=Fully processing it into Uranium-235 and Uranium-238 requires a total of four centrifuges. cannery.centrifuge.5=Some recipes also require the centrifuge overclocking upgrade. +cannery.fensu=FEnSU cannery.fensu.0=The FEnSU is capable of storing absurd amounts of energy, over 9EHE (that's a nine followed by 18 zeros). cannery.fensu.1=There is only one energy connector which can be found on the bottom. cannery.fensu.2=This is also the only place where the FEnSU can receive a redstone signal. +cannery.firebox=Firebox cannery.firebox.0=The firebox burns flammable items to generate heat. cannery.firebox.1=It can burn any flammable item, although higher quality fuels such as coal, coke and solid fuel burn longer and hotter. cannery.firebox.2=Heat is given off by the copper contact at the top of the firebox. Machines with an identical contact on the bottom can receive heat by being placed on top of the firebox. cannery.firebox.3=If heat isn't being used up and the heat buffer becomes full, the firebox will shut off to prevent wasting of fuel. cannery.firebox.4=One such machine is the stirling engine, which will turn heat directly into energy. +cannery.silex=FEL & SILEX cannery.silex.0=The Free Electron Laser (FEL) uses energy and a laser crystal to create a powerful laser beam. cannery.silex.1=Be careful, as the laser will burn/melt through weaker blocks... cannery.silex.2=...but not blast-proof ones. @@ -343,6 +347,7 @@ cannery.silex.6=In addition to the two connectors on the sides, there is a third cannery.silex.7=Each recipe requires a specific laser type. Using a stronger type than required will process items faster. cannery.silex.8=One FEL can supply up to 5 SILEX. Each SILEX has to be one block apart from one another. +cannery.stirling=Stirling Engine cannery.stirling.0=The Stirling engine uses heat energy from external sources to create power. cannery.stirling.1=It needs to be placed on top of a heat-producing machine, such as the firebox. cannery.stirling.2=The amount of heat it can utilize however is limited, overspinning can lead to catastrophic malfunction. diff --git a/src/main/resources/assets/hbm/textures/gui/gui_utility.png b/src/main/resources/assets/hbm/textures/gui/gui_utility.png index 9c33f4a0e91a04573386fc433b4ac7bfbee76af1..ec502b69ed79091dcb7dd8b8b853f8a221e4ce82 100644 GIT binary patch delta 4239 zcmV;A5ODAE9)Kf|Gk*~`Nkl4edpXX$lUyuy1rxXg6L(F*x9xnj+j{a*>--Hy4su#JDN#Rt4FTkGfL2 z6}zGfiF#A0RN6R_70Ei&i*w#{W@gXKyzk8W&N;LCen5D4{(rph?D{;<`)_78(*8JB zK>Pn7s&)R&(;8bq9FML$ilQj_z1dc);sS9T$05t#X2yQLQXAJL9Zc`9@yq4^i-V3N z>D8RQZ#Q=#F7g5}xy^TwW)n`{wh*>k!ilAR&<`9xAT4LM#Ruz0axBFW387FY^_>a$ zaS0(WN#w~SkAMA3Zl~YOIo>uHOs~L4;Fxlrv z@dN$;F0a>10&z~y18Fm#yEKI$4*XXv_;bynHuREIPS z{tE}11XH{)s>jaBy zoxT%J=(>`1`Z%WWd?_9LCF&*t*qJFmWb*2Eud4*hjLm2Q0UoC=8`+4XmwAOvjC%9rbut<&H9o17&2s%nk@_b=Iv|LZR8 zRXL~b3PRI8j;du;8A3SMp?=G~ydmjkq-eieqZ|)f|Kkp=KkRj+{1(`Dg03m9fmtW8 zswROpB%E<|+a6n`jth}=JT^;v_DO)?4=*(d=zlURKPk2!SRbvbYYW*_Ao{8^S+|d4 zid={^n$WvhUKGLKj8p>HzvM6;e>>-EOUXpznsmy7#pg{qHg)-`($1;< zO%hn%Ao!bVr6}k2VvN_3rhnouD;YShK~$&CvNA(2snsbmw){b*Ih!hVViKw_1KhWdyLIoKv`MS5cEd! z&OoXBsXv>b9`{rs?DU5KufINi@9EO)(5SrN3%QOSBH_49D%#ZLYdB(Cmdi>->O5)7 zZNbMkqS7Q#dJFMj)nH70ybqv6dJ@nC{J4aWmn8CJlE;$cs=-ob&cUYTO&(*rTz^(& zUtSXMF@x`taD3eql?-Uxgp-#9T!LR3Jn%Cn3E192n73rea{zX>)zg4^AIzdz^(u*> zN?mp8tXh|Coi^LX)ors)Dt{m-@2S7C`vz=+pZ5V2OZNb(w(_p$4VYHGsCVG2mCLrI zb%H;y%(Cru6VA9}%X%HI!Ebv#$$z@D*Ow|svU(aY@2S7M+laYY$d7an;Ph$xaewl- z3UdX?E`GMVpC>L+cE0(*+IG|JuBy1MWO=p$UbilnI*ZuWZF8)-!>{OHo@`H`Eclb- z{)qPh6sp$)Xjq*fsZxf|B;e!PZR)b=;Y^I#x@u z0xZ31Hw0+v^%v>=OgjHbe)+%p zo%2pX%6Q+ej+Ea5myXSA4u2VJmj>70|EN|yd2U=<)4{KOmGUQ8{&vyrc4JAJpPz44 zib~A^*mTKL8dwD|e12Hwoa+$lwVx_ z8@Km*DgSD~UPaSP@NaHzrna>u38Z@fuFv>4Gz7@=(;Gh-ex3aA=YMVYReoKr<^J@> zPn_yE<(Hik>gRi0B!hqX{D+dH<1hZ!a9znJZhe!u=Ep%^@P8Z2=Ra&sPoTdF(DLAHN|OQQs~(boUuD5>ET8{S?|$#B*4Eav zxVRXfIdf(zlR)S6-xiPKPuHCH`SPXnwa)+6%k}E_t%-p0T|P-*#8|Gka_fF3C$6UyO3RNyiV8krhRey2l&}a$MrJOo-CRZ4I z+qw*RXK8#w$V(D=GRfn_i4#tzpF4NXt-gkZ2&m8jN)i~U6I4~st#Z!3efylxaWzT+ zRa$#AJs0aslfDk&22Ys3_sJ^rP-aoBuR?no}x&K<5*F& zLz1+jt`tl6K7YTjN1xvfdVOXNA*9hVU^0k{lEIy&@%!_(XPi5CZfxtGw;gEG?5;2N zA0djQXl6!=X7n#t{$3X^e=yvB@yZA4{_8(!^~YB<)7hid>z9Y;o3B@|UrznY?#muC zDO-mCwyk+G*emoNlEL2A!1vjbHq|oI`sbVJ?2+O~Gk;N}UjOes4fh>8`rEqr@dr9~ z^aUMz?gd@^_=h_7+zXmjFSoqIzkal|PMc#wO1}`qCishvu{gh|yWggvK!`xP`u!gT zy&>mu4}LQff9TMmvE%F6U0;wQsi(OAHUabM5GnDp!dNCTM2dCy!Tn&@d${)x`op>Z z($ewSV1G}=_Im)fEqL}g6YzI3|IJAR*_Pe}yxHECIf0OYWRigI@(KRY13S|ANx8cZ z?rV1Eo_?^$8U%a3SdnITJ>mIE(~{3jJi78`yyGi>>UBA=^W`rUuhU=q&li2x*LqC^ zlJ6uy@Q-fZDVkaDeSS~c^@NIFC6e4R>J6-3zkeL8JD+?K({~c+Nck=9ma%zWi=W+} zBd^8J?w?jo29mENK=7yU+$*11k2MVPI2mWraKHI#W_L%Qe)>O>`eXT!lX-94-m5^VYVw z7k>}u1>#>klC*Ppe&`9kH*W9MjZ14j3jnKwAb8cZBE z$aha*m;jPNc<$V}{O)*OH{WvkFt6OI-GBeQ54o>^4LR8t@)~T<*^WJgD#71p8r8vq ze^NA)*f;v>=K)s%^1N|-@9?E6fA<^v;@|tn&B{q&%Y6V&fmrblz$$gkJ%6b73o0qU zUinu8mOl;dKKN9#JAYZxjzL#nk_q^WAOCQ8+;By3_YU>$-7759%nRfV56bq3mVZhB zg#lUf!5|;w`_QkEqWsC0@5}uBe6+Z@7@H^d{^XBKUVS~ZQ;K6ny(lr&*LUo>{*6FV zPf=$u?tfHXV$tNF33}Jb!>jN9uGZiGNH;F6sZQ%J4HCdKPrjKSl=8P{`JtRSb0%6` zT#O}ICxO|)65wFkFSXC~2<|?(uYWHNh6C{*(`mp^y~T*mjK;b)=hu}@0)IvBJ@}cP z*!iS7J38vcJtdRC?CvKeNi#ck=A0dlnSb#e{8CF20H()F@AU7aTYcrMv~pzleV*)b ztFN3LCX}WmlR%+pw`QUl^?yLN|T+6+2 zY0asAQ-0YwF4ytWJNvZy%2{px)sfV;GKUX;T|fBdrnGWoI2h81sYYp{M(Ji+Ex6R!1hsLgf=YMUlTE6d@aNFxM z!SDKW*j{s$-_uL)?6V5~?D0DfO!zO&mgs$cPj`Ruzlvte5MXpeP=5(fQXCDx{^v^{ z6qYycWgpp>hfMNiAX3YF08KIh)#Tr`t6QJ1Yp&Y$4_#IWy+@Dq^ZTD^cIO_&aZmRi z{+|y2+E+#ge0Dqiy?@d-@tCj2-Pn`eHtCmvNF)F!O(p?f_4v5vTPv4`-F26iKPx*N zm?YQNdK*U$|BCZD4>wNg$M?SNd|nes0FIhS0=~=lam{rCe_T0}m;=bF^1{s{hZmez zF>b9~*4m!wyqSswP(jEf5USis3}L2G-UOh%1xa@IFeH09A%EZPUk3@Gq7VTUIzUMR zs{I#szP6v?cf@5<7hI}LdSj)EFwyim>{`8vqnah9w^B3cg@1+m%wx8`({)>Nk zAn4nB+kZNHzFqLk5A6E&>%m?kx3aRLg@uJs#Wzy^Yp=b=XK;cT0yJP{WhF?t-ELP4 z3k$)^f9tKcyq7&cKd)}L>%CmKApyY3{QSJv@)i~rNB~oS1ORJ3h6AB`E2xG9FagPy z&!%PVcDqh3uqnUn9M|iRRBJe3y8XU;6R3^^Fn=K?2+GFrCSY90`nJJldmTytc74P8 zI+9MEIz_jC%J3|}6sy}>GSP-IB!DU9tE)^BKoJta6!JYzCJ7)931G^Enj|9$U>p*_ z6bU^;P7**C31CVzwLE546aa|?06f-608^r=mO13J185%-z!VAn^c}&EEE2$!36%s0 zerSwC0+>R+lK{bwJS2cAKm|}I40KtzkJPkMjE;IgBl7Q{ggH=`@=I7^i z>eMNxb1=O~02AWUGFNHEZO?JNj&8Th-Gti+2>?!bnaB1*0zfHlAKt!50D+lqbKA?O l+Ygg*4(XGC4h0vJ_5Z-x=MC&$yV?K%002ovPDHLkV1m7mqDcS% literal 3954 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 Ip?kvr0DU!4f&c&j From 8353e313d6fcac4507a5bdaab2af52b9bbe90a7e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 11 Sep 2022 22:58:51 +0200 Subject: [PATCH 047/111] fixes, lung irritant notifications, small crucible --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../java/com/hbm/blocks/gas/BlockGasCoal.java | 3 +- .../hbm/blocks/machine/MachineCrucible.java | 34 + .../java/com/hbm/config/GeneralConfig.java | 3 + .../java/com/hbm/extprop/HbmLivingProps.java | 12 + .../com/hbm/inventory/gui/GUIMachineCoal.java | 15 +- .../gui/GUIMachineElectricFurnace.java | 14 +- .../inventory/recipes/AssemblerRecipes.java | 1 - src/main/java/com/hbm/main/ClientProxy.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 12 + .../java/com/hbm/main/ResourceManager.java | 2 + src/main/java/com/hbm/main/ServerProxy.java | 1 + .../hbm/render/tileentity/RenderCrucible.java | 46 ++ .../java/com/hbm/tileentity/TileMappings.java | 2 + .../machine/TileEntityCrucible.java | 21 + .../TileEntityMachineElectricFurnace.java | 20 +- src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../assets/hbm/models/machines/crucible.obj | 646 ++++++++++++++++++ .../hbm/textures/gui/machine/gui_crucible.png | Bin 0 -> 7412 bytes .../gui/machine/gui_crucible_base.png | Bin 0 -> 2693 bytes .../gui/machine/gui_crucible_brighten_21.png | Bin 0 -> 713 bytes .../gui/machine/gui_crucible_multiply_100.png | Bin 0 -> 944 bytes .../hbm/textures/items/chem_icon_ETHANOL.png | Bin 349 -> 435 bytes .../models/machines/crucible_heat.png | Bin 0 -> 4820 bytes .../hbm/textures/models/machines/lava.png | Bin 0 -> 1361 bytes 26 files changed, 815 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineCrucible.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderCrucible.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java create mode 100644 src/main/resources/assets/hbm/models/machines/crucible.obj create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_crucible.png create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_base.png create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_brighten_21.png create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_multiply_100.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/crucible_heat.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/lava.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 470b4747b..449968504 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -634,6 +634,7 @@ public class ModBlocks { public static Block machine_stirling; public static Block machine_stirling_steel; public static Block machine_sawmill; + public static Block machine_crucible; public static Block machine_difurnace_off; public static Block machine_difurnace_on; @@ -1808,6 +1809,7 @@ public class ModBlocks { machine_stirling = new MachineStirling().setBlockName("machine_stirling").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_stirling_steel = new MachineStirling().setBlockName("machine_stirling_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_sawmill = new MachineSawmill().setBlockName("machine_sawmill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_crucible"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); @@ -2993,6 +2995,7 @@ public class ModBlocks { register(machine_stirling); register(machine_stirling_steel); register(machine_sawmill); + register(machine_crucible); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_rtg_off, machine_difurnace_rtg_off.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/gas/BlockGasCoal.java b/src/main/java/com/hbm/blocks/gas/BlockGasCoal.java index 3edf0a6cd..67dca9fea 100644 --- a/src/main/java/com/hbm/blocks/gas/BlockGasCoal.java +++ b/src/main/java/com/hbm/blocks/gas/BlockGasCoal.java @@ -33,8 +33,9 @@ public class BlockGasCoal extends BlockGasBase { EntityLivingBase living = (EntityLivingBase) entity; - if(!ArmorRegistry.hasProtection(living, 3, HazardClass.PARTICLE_COARSE)) + if(!ArmorRegistry.hasProtection(living, 3, HazardClass.PARTICLE_COARSE)) { HbmLivingProps.incrementBlackLung(living, 10); + } } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java new file mode 100644 index 000000000..d4618952c --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -0,0 +1,34 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.machine.TileEntityCrucible; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class MachineCrucible extends BlockDummyable { + + public MachineCrucible() { + super(Material.rock); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) + return new TileEntityCrucible(); + + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {1, 0, 1, 1, 1, 1}; + } + + @Override + public int getOffset() { + return 1; + } +} diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 484d01fc7..22086512d 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -4,6 +4,8 @@ import net.minecraftforge.common.config.Configuration; public class GeneralConfig { + public static boolean enableThermosPreventer = true; + public static boolean enableDebugMode = true; public static boolean enableMycelium = false; public static boolean enablePlutoniumOre = false; @@ -52,6 +54,7 @@ public class GeneralConfig { public static void loadFromConfig(Configuration config) { final String CATEGORY_GENERAL = CommonConfig.CATEGORY_GENERAL; + enableThermosPreventer = config.get(CATEGORY_GENERAL, "0.00_crashOnThermos", true, "When set to true, will prevent the mod to launch on Thermos servers. Only disable this if you understand what \"tileentities.yml\" is, and how it severely cripples the mod.").getBoolean(true); enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false, "Enable debugging mode").getBoolean(false); enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false, "Allows glowing mycelium to spread").getBoolean(false); enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false, "Enables plutonium ore generation in the nether").getBoolean(false); diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index 2a6ab82a5..bdc929c6e 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -10,6 +10,8 @@ import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.PlayerInformPacket; +import com.hbm.util.ChatBuilder; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; @@ -19,8 +21,10 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.ai.attributes.IAttributeInstance; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.IExtendedEntityProperties; @@ -211,6 +215,10 @@ public class HbmLivingProps implements IExtendedEntityProperties { if(RadiationConfig.disableAsbestos) return; setAsbestos(entity, getAsbestos(entity) + asbestos); incrementFibrosis(entity, asbestos); + + if(entity instanceof EntityPlayerMP) { + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation("info.asbestos").color(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_GAS_HAZARD, 3000), (EntityPlayerMP) entity); + } } @@ -234,6 +242,10 @@ public class HbmLivingProps implements IExtendedEntityProperties { if(RadiationConfig.disableCoal) return; setBlackLung(entity, getBlackLung(entity) + blacklung); incrementFibrosis(entity, blacklung); + + if(entity instanceof EntityPlayerMP) { + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation("info.coaldust").color(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_GAS_HAZARD, 3000), (EntityPlayerMP) entity); + } } /// PULMONARY FIBROSIS /// diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java index cf06316ed..24b1cf2ae 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java @@ -8,7 +8,6 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineCoal; -import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineCoal; @@ -71,27 +70,25 @@ public class GUIMachineCoal extends GuiInfoContainer { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); //It's as horrifying as it is functional. - TileEntityMachineCoal dud = diFurnace; - if(diFurnace.isInvalid() && diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) instanceof TileEntityMachineCoal) - dud = (TileEntityMachineCoal) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); + diFurnace = (TileEntityMachineCoal) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); - if(dud.power > 0) { - int i = (int)dud.getPowerScaled(52); + if(diFurnace.power > 0) { + int i = (int)diFurnace.getPowerScaled(52); drawTexturedModalRect(guiLeft + 152, guiTop + 69 - i, 176, 52 - i, 16, i); } - if(dud.burnTime > 0) + if(diFurnace.burnTime > 0) { drawTexturedModalRect(guiLeft + 79, guiTop + 34, 208, 0, 18, 18); } - if(dud.tank.getFill() <= 0) + if(diFurnace.tank.getFill() <= 0) this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 32, 16, 16, 6); this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 16, 16, 16, 3); - dud.tank.renderTank(guiLeft + 8, guiTop + 69, this.zLevel, 16, 52); + diFurnace.tank.renderTank(guiLeft + 8, guiTop + 69, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java index eb56115a9..1f97b7216 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java @@ -7,6 +7,7 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.container.ContainerElectricFurnace; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineElectricFurnace; @@ -57,24 +58,19 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { //if initial ZE is still present, it'll be used instead //works so that container packets can still be used //efficiency! - TileEntityMachineElectricFurnace fs = null; - if(diFurnace.isInvalid() && diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) instanceof TileEntityMachineElectricFurnace) - fs = (TileEntityMachineElectricFurnace) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); - else - fs = diFurnace; + diFurnace = (TileEntityMachineElectricFurnace) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); - if(fs.hasPower()) { + if(diFurnace.hasPower()) { int i = (int)diFurnace.getPowerScaled(52); drawTexturedModalRect(guiLeft + 20, guiTop + 69 - i, 200, 52 - i, 16, i); } - if(diFurnace.canProcess() && diFurnace.hasPower()) - { + if(diFurnace.getWorldObj().getBlock(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) == ModBlocks.machine_electric_furnace_on) { drawTexturedModalRect(guiLeft + 56, guiTop + 35, 176, 0, 16, 16); } - int j1 = fs.getProgressScaled(24); + int j1 = diFurnace.getProgressScaled(24); drawTexturedModalRect(guiLeft + 79, guiTop + 34, 176, 17, j1 + 1, 17); this.drawInfoPanel(guiLeft + 151, guiTop + 19, 8, 8, 8); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index d4024e82d..b4abb39ad 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -63,7 +63,6 @@ public class AssemblerRecipes { for(File file : files) { if(file.getName().equals("hbmAssembler.json")) { - config = file; } } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 49397dc48..c10328f0c 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -264,6 +264,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterOilburner.class, new RenderOilburner()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityStirling.class, new RenderStirling()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySawmill.class, new RenderSawmill()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrucible.class, new RenderCrucible()); //AMS ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSBase.class, new RenderAMSBase()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSEmitter.class, new RenderAMSEmitter()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index dd79757d6..e671273f5 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -863,6 +863,18 @@ public class MainRegistry { ToolConfig.loadFromConfig(config); WeaponConfig.loadFromConfig(config); MobConfig.loadFromConfig(config); + + try { + if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.Thermos") != null) { + throw new IllegalStateException("The mod tried to start on a Thermos server and therefore stopped. To allow the server to start on Thermos, change the appropriate " + + "config entry (0.00 in hbm.cfg). This was done because, by default, Thermos " + + "uses a so-called \"optimization\" feature that reduces tile ticking a lot, which will inevitably break a lot of machines. Most people aren't even aware " + + "of this, and start blaming random mods for all their stuff breaking. In order to adjust or even disable this feature, edit \"tileentities.yml\" in your " + + "Thermos install folder. If you believe that crashing the server until a config option is changed is annoying, then I would agree, but it's still preferable " + + "over wasting hours trying to fix an issue that is really just an \"intended feature\" added by Thermos itself, and not a bug in the mod. You'll have to " + + "change Thermos' config anyway so that extra change in NTM's config can't be that big of a burden."); + } + } catch(ClassNotFoundException e) { } config.save(); } diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index f1a0d6e0e..42722b66b 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -64,6 +64,7 @@ public class ResourceManager { //Heat Engines public static final IModelCustom stirling = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/stirling.obj")); public static final IModelCustom sawmill = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/sawmill.obj")); + public static final IModelCustom crucible_heat = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/crucible.obj")); //Furnaces public static final IModelCustom furnace_iron = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_iron.obj")); @@ -385,6 +386,7 @@ public class ResourceManager { public static final ResourceLocation stirling_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling.png"); public static final ResourceLocation stirling_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling_steel.png"); public static final ResourceLocation sawmill_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/sawmill.png"); + public static final ResourceLocation crucible_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/crucible_heat.png"); //Furnaces public static final ResourceLocation furnace_iron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_iron.png"); diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index 9d4696405..47aadfd5a 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -26,6 +26,7 @@ public class ServerProxy { public static final int ID_DETONATOR = 6; public static final int ID_FLUID_ID = 7; public static final int ID_GUN_MODE = 8; + public static final int ID_GAS_HAZARD = 9; public void registerRenderInfo() { } public void registerTileEntitySpecialRenderer() { } diff --git a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java new file mode 100644 index 000000000..5fd645ad1 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java @@ -0,0 +1,46 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + bindTexture(ResourceManager.crucible_tex); + ResourceManager.crucible_heat.renderAll(); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_crucible); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -1.5, 0); + GL11.glScaled(3.25, 3.25, 3.25); + } + public void renderCommon() { + bindTexture(ResourceManager.crucible_tex); + ResourceManager.crucible_heat.renderAll(); + }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index ae50f7837..3ae08ab0c 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -250,6 +250,8 @@ public class TileMappings { put(TileEntityFurnaceSteel.class, "tileentity_furnace_steel"); put(TileEntityStirling.class, "tileentity_stirling"); put(TileEntitySawmill.class, "tileentity_sawmill"); + put(TileEntityCrucible.class, "tileentity_crucible"); + put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter"); put(TileEntityDiFurnaceRTG.class, "tileentity_rtg_difurnace"); put(TileEntityMachineRadiolysis.class, "tileentity_radiolysis"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java new file mode 100644 index 000000000..50514d291 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -0,0 +1,21 @@ +package com.hbm.tileentity.machine; + +import com.hbm.tileentity.TileEntityMachineBase; + +public class TileEntityCrucible extends TileEntityMachineBase { + + public TileEntityCrucible() { + super(1); + } + + @Override + public String getName() { + return null; + } + + @Override + public void updateEntity() { + + } + +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java index abe14da88..fe1a11bd4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java @@ -23,6 +23,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl public static final long maxPower = 100000; public int maxProgress = 100; public int consumption = 50; + private int cooldown = 0; private static final int[] slots_io = new int[] { 0, 1, 2 }; @@ -96,7 +97,8 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl } public boolean canProcess() { - if(slots[1] == null) { + + if(slots[1] == null || cooldown > 0) { return false; } ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[1]); @@ -145,9 +147,13 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl @Override public void updateEntity() { - boolean flag1 = false; + boolean markDirty = false; if(!worldObj.isRemote) { + + if(cooldown > 0) { + cooldown--; + } power = Library.chargeTEFromItems(slots, 0, power, maxPower); @@ -165,6 +171,10 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl consumption += speedLevel * 50; maxProgress += powerLevel * 10; consumption -= powerLevel * 15; + + if(!hasPower()) { + cooldown = 20; + } if(hasPower() && canProcess()) { progress++; @@ -174,7 +184,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl if(this.progress >= maxProgress) { this.progress = 0; this.processItem(); - flag1 = true; + markDirty = true; } } else { progress = 0; @@ -187,7 +197,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl } if(trigger) { - flag1 = true; + markDirty = true; MachineElectricFurnace.updateBlockState(this.progress > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); } @@ -198,7 +208,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl this.networkPack(data, 50); - if(flag1) { + if(markDirty) { this.markDirty(); } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index a9815652b..21fbfc7ba 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -629,6 +629,8 @@ hbmfluid.watz=Giftiger Schlamm hbmfluid.xenon=Xenongas hbmfluid.xpjuice=Erfahrungssaft +info.asbestos=Meine Lunge brennt. +info.coaldust=Das Atmen fällt mir schwer. info.coil=Spulenstärke info.templatefolder=Hergestellt mit %s info.template_in=Input: diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index fe7ccfb47..c215287bd 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -857,6 +857,8 @@ hbmpseudofluid.pf6=Plutonium Hexafluoride hbmpseudofluid.mud_heavy=Heavy Sludge Fraction hbmpseudofluid.mud=Poisonous Sludge Gas +info.asbestos=My lungs are burning. +info.coaldust=It's hard to breathe here. info.coil=Coil Strength info.templatefolder=Created with %s info.template_in=Input: diff --git a/src/main/resources/assets/hbm/models/machines/crucible.obj b/src/main/resources/assets/hbm/models/machines/crucible.obj new file mode 100644 index 000000000..14e9d2957 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/crucible.obj @@ -0,0 +1,646 @@ +# Blender v2.79 (sub 0) OBJ File: 'crucible.blend' +# www.blender.org +o Lava +v -1.000000 0.500000 -1.000000 +v -1.000000 0.500000 1.000000 +v 1.000000 0.500000 1.000000 +v 1.000000 0.500000 -1.000000 +vt 0.999900 0.000100 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vt 0.999900 0.999900 +vn 0.0000 1.0000 0.0000 +s off +f 2/1/1 4/2/1 1/3/1 +f 2/1/1 3/4/1 4/2/1 +o Main +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.000000 1.500000 1.000000 +v 1.000000 1.500000 1.000000 +v -1.000000 1.500000 -1.000000 +v 1.000000 1.500000 -1.000000 +v -1.250000 1.500000 1.250000 +v 1.250000 1.500000 1.250000 +v -1.250000 1.500000 -1.250000 +v 1.250000 1.500000 -1.250000 +v -1.250000 0.500000 1.250000 +v 1.250000 0.500000 1.250000 +v -1.250000 0.500000 -1.250000 +v 1.250000 0.500000 -1.250000 +v -1.500000 0.250000 -1.500000 +v -1.500000 0.250000 1.500000 +v 1.500000 0.250000 1.500000 +v 1.500000 0.250000 -1.500000 +v -1.000000 0.500000 -1.000000 +v -1.000000 0.500000 1.000000 +v 1.000000 0.500000 1.000000 +v 1.000000 0.500000 -1.000000 +v 1.250000 1.250000 0.875000 +v 1.250000 0.375000 0.875000 +v 1.250000 1.250000 0.625000 +v 1.250000 0.375000 0.625000 +v 1.375000 0.375000 0.875000 +v 1.375000 1.125000 0.875000 +v 1.375000 0.375000 0.625000 +v 1.375000 1.125000 0.625000 +v 1.250000 1.250000 -0.625000 +v 1.250000 0.375000 -0.625000 +v 1.250000 1.250000 -0.875000 +v 1.250000 0.375000 -0.875000 +v 1.375000 0.375000 -0.625000 +v 1.375000 1.125000 -0.625000 +v 1.375000 0.375000 -0.875000 +v 1.375000 1.125000 -0.875000 +v -1.250000 1.250000 -0.875000 +v -1.250000 0.375000 -0.875000 +v -1.250000 1.250000 -0.625000 +v -1.250000 0.375000 -0.625000 +v -1.375000 0.375000 -0.875000 +v -1.375000 1.125000 -0.875000 +v -1.375000 0.375000 -0.625000 +v -1.375000 1.125000 -0.625000 +v -1.250000 1.250000 0.625000 +v -1.250000 0.375000 0.625000 +v -1.250000 1.250000 0.875000 +v -1.250000 0.375000 0.875000 +v -1.375000 0.375000 0.625000 +v -1.375000 1.125000 0.625000 +v -1.375000 0.375000 0.875000 +v -1.375000 1.125000 0.875000 +v 0.875000 1.250000 -1.250000 +v 0.875000 0.375000 -1.250000 +v 0.625000 1.250000 -1.250000 +v 0.625000 0.375000 -1.250000 +v 0.875000 0.375000 -1.375000 +v 0.875000 1.125000 -1.375000 +v 0.625000 0.375000 -1.375000 +v 0.625000 1.125000 -1.375000 +v -0.625000 1.250000 -1.250000 +v -0.625000 0.375000 -1.250000 +v -0.875000 1.250000 -1.250000 +v -0.875000 0.375000 -1.250000 +v -0.625000 0.375000 -1.375000 +v -0.625000 1.125000 -1.375000 +v -0.875000 0.375000 -1.375000 +v -0.875000 1.125000 -1.375000 +v -0.875000 1.250000 1.250000 +v -0.875000 0.375000 1.250000 +v -0.625000 1.250000 1.250000 +v -0.625000 0.375000 1.250000 +v -0.875000 0.375000 1.375000 +v -0.875000 1.125000 1.375000 +v -0.625000 0.375000 1.375000 +v -0.625000 1.125000 1.375000 +v 0.625000 1.250000 1.250000 +v 0.625000 0.375000 1.250000 +v 0.875000 1.250000 1.250000 +v 0.875000 0.375000 1.250000 +v 0.625000 0.375000 1.375000 +v 0.625000 1.125000 1.375000 +v 0.875000 0.375000 1.375000 +v 0.875000 1.125000 1.375000 +v 1.500000 0.625000 0.125000 +v 1.500000 0.375000 0.125000 +v 1.500000 0.625000 -0.125000 +v 1.500000 0.375000 -0.125000 +v 1.500000 0.625000 0.187500 +v 1.500000 0.375000 0.187500 +v 1.500000 0.625000 -0.187500 +v 1.500000 0.375000 -0.187500 +v 1.500000 0.312500 0.125000 +v 1.500000 0.312500 -0.125000 +v 1.250000 0.875000 0.125000 +v 1.250000 0.625000 0.125000 +v 1.250000 0.625000 -0.125000 +v 1.250000 0.875000 -0.125000 +v 1.250000 0.875000 0.187500 +v 1.250000 0.625000 0.187500 +v 1.250000 0.625000 -0.187500 +v 1.250000 0.875000 -0.187500 +v 1.250000 0.562500 0.125000 +v 1.250000 0.562500 -0.125000 +v -1.500000 0.625000 -0.125000 +v -1.500000 0.375000 -0.125000 +v -1.500000 0.625000 0.125000 +v -1.500000 0.375000 0.125000 +v -1.500000 0.625000 -0.187500 +v -1.500000 0.375000 -0.187500 +v -1.500000 0.625000 0.187500 +v -1.500000 0.375000 0.187500 +v -1.500000 0.312500 -0.125000 +v -1.500000 0.312500 0.125000 +v -1.250000 0.875000 -0.125000 +v -1.250000 0.625000 -0.125000 +v -1.250000 0.625000 0.125000 +v -1.250000 0.875000 0.125000 +v -1.250000 0.875000 -0.187500 +v -1.250000 0.625000 -0.187500 +v -1.250000 0.625000 0.187500 +v -1.250000 0.875000 0.187500 +v -1.250000 0.562500 -0.125000 +v -1.250000 0.562500 0.125000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v 1.250000 0.875000 0.125000 +v 1.250000 0.625000 0.125000 +v 1.250000 0.625000 -0.125000 +v 1.250000 0.875000 -0.125000 +v -1.250000 0.875000 -0.125000 +v -1.250000 0.625000 -0.125000 +v -1.250000 0.625000 0.125000 +v -1.250000 0.875000 0.125000 +vt 0.631579 0.428571 +vt 0.421053 0.142857 +vt 0.631579 0.000000 +vt 0.105263 0.964286 +vt 0.052632 0.642857 +vt 0.105263 0.678571 +vt 0.526316 0.964286 +vt 0.052632 1.000000 +vt 0.526316 0.678571 +vt 0.578947 1.000000 +vt 0.578947 0.642857 +vt 0.052632 0.642857 +vt 0.578947 0.500000 +vt 0.578947 0.642857 +vt 0.052632 0.642857 +vt 0.578947 0.500000 +vt 0.578947 0.642857 +vt 0.342105 0.553571 +vt 0.578947 0.642857 +vt 0.289474 0.553571 +vt 0.342105 0.553571 +vt 0.052632 0.500000 +vt 0.631579 0.464286 +vt 0.000000 0.464286 +vt 0.000000 0.428571 +vt 0.631579 0.428571 +vt 0.000000 0.464286 +vt 0.000000 0.428571 +vt 0.631579 0.428571 +vt 0.000000 0.464286 +vt 0.000000 0.428571 +vt 0.631579 0.428571 +vt 0.000000 0.464286 +vt 0.000000 0.428571 +vt 0.052632 0.500000 +vt 0.631579 0.464286 +vt 0.578947 0.500000 +vt 0.052632 0.500000 +vt 0.631579 0.464286 +vt 0.052632 0.500000 +vt 0.631579 0.464286 +vt 0.578947 0.500000 +vt 0.578947 1.000000 +vt 1.000000 0.857143 +vt 1.000000 1.000000 +vt 0.105263 0.964286 +vt 0.526316 0.678571 +vt 0.526316 0.964286 +vt 0.578947 1.000000 +vt 1.000000 0.857143 +vt 1.000000 1.000000 +vt 0.578947 1.000000 +vt 1.000000 0.857143 +vt 1.000000 1.000000 +vt 0.578947 1.000000 +vt 1.000000 0.857143 +vt 1.000000 1.000000 +vt 0.605263 0.696429 +vt 0.657895 0.678571 +vt 0.657895 0.696429 +vt 0.605263 0.571429 +vt 0.657895 0.678571 +vt 0.605263 0.678571 +vt 0.605263 0.696429 +vt 0.657895 0.696429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.605263 0.571429 +vt 0.605263 0.678571 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.605263 0.696429 +vt 0.657895 0.678571 +vt 0.657895 0.696429 +vt 0.605263 0.571429 +vt 0.657895 0.678571 +vt 0.605263 0.678571 +vt 0.605263 0.696429 +vt 0.657895 0.696429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.605263 0.571429 +vt 0.605263 0.678571 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.605263 0.696429 +vt 0.657895 0.678571 +vt 0.657895 0.696429 +vt 0.605263 0.571429 +vt 0.657895 0.678571 +vt 0.605263 0.678571 +vt 0.605263 0.696429 +vt 0.657895 0.696429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.605263 0.571429 +vt 0.605263 0.678571 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.605263 0.696429 +vt 0.657895 0.678571 +vt 0.657895 0.696429 +vt 0.605263 0.571429 +vt 0.657895 0.678571 +vt 0.605263 0.678571 +vt 0.605263 0.696429 +vt 0.657895 0.696429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.605263 0.571429 +vt 0.605263 0.678571 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.763158 0.741071 +vt 0.763158 0.732143 +vt 0.776316 0.741071 +vt 0.710526 0.857143 +vt 0.697368 0.821429 +vt 0.710526 0.821429 +vt 0.763158 0.821429 +vt 0.776316 0.857143 +vt 0.763158 0.857143 +vt 0.763158 0.812500 +vt 0.710526 0.812500 +vt 0.776316 0.821429 +vt 0.710526 0.741071 +vt 0.697368 0.741071 +vt 0.710526 0.732143 +vt 0.776316 0.776786 +vt 0.763158 0.776786 +vt 0.710526 0.776786 +vt 0.776316 0.812500 +vt 0.763158 0.776786 +vt 0.776316 0.776786 +vt 0.644737 0.812500 +vt 0.697368 0.776786 +vt 0.697368 0.812500 +vt 0.631579 0.812500 +vt 0.578947 0.776786 +vt 0.631579 0.776786 +vt 0.828947 0.812500 +vt 0.842105 0.776786 +vt 0.842105 0.812500 +vt 0.644737 0.776786 +vt 0.710526 0.857143 +vt 0.710526 0.776786 +vt 0.894737 0.776786 +vt 0.894737 0.812500 +vt 0.828947 0.776786 +vt 0.776316 0.732143 +vt 0.763158 0.696429 +vt 0.776316 0.696429 +vt 0.644737 0.732143 +vt 0.697368 0.696429 +vt 0.697368 0.732143 +vt 0.631579 0.732143 +vt 0.578947 0.696429 +vt 0.631579 0.696429 +vt 0.828947 0.732143 +vt 0.842105 0.696429 +vt 0.842105 0.732143 +vt 0.644737 0.696429 +vt 0.710526 0.776786 +vt 0.710526 0.696429 +vt 0.894737 0.696429 +vt 0.894737 0.732143 +vt 0.828947 0.696429 +vt 0.421053 0.285714 +vt 0.000000 0.000000 +vt 0.210526 0.285714 +vt 0.210526 0.142857 +vt 0.657895 0.178571 +vt 0.868421 0.169643 +vt 0.868421 0.178571 +vt 0.881579 0.160714 +vt 0.868421 0.026786 +vt 0.881579 0.017857 +vt 0.868421 0.000000 +vt 0.657895 0.008929 +vt 0.657895 0.000000 +vt 0.894737 0.160714 +vt 0.894737 0.017857 +vt 0.631579 0.017857 +vt 0.644737 0.160714 +vt 0.631579 0.160714 +vt 0.671053 0.160714 +vt 0.855263 0.151786 +vt 0.855263 0.160714 +vt 0.644737 0.017857 +vt 0.657895 0.151786 +vt 0.657895 0.169643 +vt 0.868421 0.008929 +vt 0.671053 0.017857 +vt 0.671053 0.026786 +vt 0.855263 0.026786 +vt 0.855263 0.017857 +vt 0.868421 0.151786 +vt 0.657895 0.026786 +vt 0.671053 0.151786 +vt 0.631579 0.535714 +vt 0.578947 0.571429 +vt 0.578947 0.535714 +vt 0.289474 0.553571 +vt 0.342105 0.517857 +vt 0.631579 0.535714 +vt 0.578947 0.571429 +vt 0.578947 0.535714 +vt 0.052632 0.642857 +vt 0.342105 0.517857 +vt 0.578947 0.857143 +vt 0.105263 0.678571 +vt 0.578947 0.857143 +vt 0.578947 0.857143 +vt 0.578947 0.857143 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.697368 0.857143 +vt 0.697368 0.776786 +vt 0.578947 0.812500 +vt 0.763158 0.857143 +vt 0.578947 0.732143 +vt 0.763158 0.776786 +vt 0.631579 0.571429 +vt 0.289474 0.517857 +vt 0.631579 0.571429 +vt 0.289474 0.517857 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn 0.7071 0.7071 0.0000 +vn 0.0000 0.7071 -0.7071 +vn -0.7071 0.7071 0.0000 +vn -0.5774 -0.5774 -0.5774 +vn -0.5774 -0.5774 0.5774 +vn -0.7071 -0.7071 0.0000 +vn 0.5774 -0.5774 0.5773 +vn 0.5774 -0.5774 -0.5774 +vn 0.7071 -0.7071 0.0000 +vn 0.5774 -0.5774 0.5774 +s off +f 8/5/2 135/6/2 7/7/2 +f 9/8/3 14/9/3 10/10/3 +f 11/11/3 13/12/3 9/8/3 +f 12/13/3 15/14/3 11/11/3 +f 10/10/3 16/15/3 12/13/3 +f 16/16/4 19/17/4 15/18/4 +f 13/19/5 18/20/5 14/21/5 +f 14/9/6 152/22/6 16/15/6 +f 13/23/7 153/24/7 156/25/7 +f 17/26/8 23/27/8 18/20/8 +f 8/5/6 23/28/6 6/29/6 +f 5/30/7 21/31/7 7/32/7 +f 7/33/4 24/34/4 8/35/4 +f 6/36/5 22/37/5 5/38/5 +f 18/39/9 24/40/9 20/41/9 +f 20/42/10 21/43/10 19/17/10 +f 19/44/11 22/45/11 17/46/11 +f 9/47/6 25/48/6 11/49/6 +f 26/50/3 28/51/3 25/52/3 +f 11/53/5 28/54/5 12/55/5 +f 10/56/4 26/57/4 9/58/4 +f 12/59/7 27/60/7 10/61/7 +f 37/62/9 44/63/9 39/64/9 +f 33/65/6 36/66/6 34/67/6 +f 29/68/9 36/66/9 31/69/9 +f 30/70/5 34/67/5 29/71/5 +f 41/72/6 44/63/6 42/73/6 +f 32/74/4 36/66/4 35/75/4 +f 38/76/5 42/73/5 37/77/5 +f 40/78/4 44/63/4 43/79/4 +f 53/80/11 60/81/11 55/82/11 +f 49/83/7 52/84/7 50/85/7 +f 45/86/11 52/84/11 47/87/11 +f 46/88/4 50/85/4 45/89/4 +f 57/90/7 60/81/7 58/91/7 +f 48/92/5 52/84/5 51/93/5 +f 54/94/4 58/91/4 53/95/4 +f 56/96/5 60/81/5 59/97/5 +f 69/98/10 76/99/10 71/100/10 +f 65/101/4 68/102/4 66/103/4 +f 61/104/10 68/102/10 63/105/10 +f 62/106/6 66/103/6 61/107/6 +f 73/108/4 76/99/4 74/109/4 +f 64/110/7 68/102/7 67/111/7 +f 70/112/6 74/109/6 69/113/6 +f 72/114/7 76/99/7 75/115/7 +f 85/116/8 92/117/8 87/118/8 +f 81/119/5 84/120/5 82/121/5 +f 77/122/8 84/120/8 79/123/8 +f 78/124/7 82/121/7 77/125/7 +f 89/126/5 92/117/5 90/127/5 +f 80/128/6 84/120/6 83/129/6 +f 86/130/7 90/127/7 85/131/7 +f 88/132/6 92/117/6 91/133/6 +f 116/134/7 122/135/7 120/136/7 +f 93/137/6 98/138/6 94/139/6 +f 96/140/6 99/141/6 95/142/6 +f 94/139/6 102/143/6 96/140/6 +f 94/139/6 98/138/6 101/144/6 +f 96/140/6 102/143/6 100/145/6 +f 114/146/7 118/147/7 121/148/7 +f 114/146/7 122/135/7 116/134/7 +f 116/134/7 119/149/7 115/150/7 +f 113/151/7 118/147/7 114/146/7 +f 100/152/12 112/153/12 109/154/12 +f 97/155/5 108/156/5 98/157/5 +f 93/158/4 104/159/4 103/160/4 +f 99/161/9 106/162/9 95/163/9 +f 93/158/9 107/164/9 97/155/9 +f 96/140/9 104/165/9 94/139/9 +f 98/157/13 111/166/13 101/144/13 +f 95/163/5 105/167/5 96/168/5 +f 101/144/14 112/153/14 102/143/14 +f 99/161/4 109/154/4 110/169/4 +f 120/170/15 132/171/15 129/172/15 +f 117/173/4 128/174/4 118/175/4 +f 113/176/5 124/177/5 123/178/5 +f 119/179/11 126/180/11 115/181/11 +f 113/176/11 127/182/11 117/173/11 +f 116/134/11 124/183/11 114/146/11 +f 118/175/16 131/184/16 121/148/16 +f 115/181/4 125/185/4 116/186/4 +f 121/148/17 132/171/17 122/135/17 +f 119/179/5 129/172/5 130/187/5 +f 6/29/2 136/188/2 8/5/2 +f 5/189/2 134/190/2 6/29/2 +f 7/7/2 133/191/2 5/189/2 +f 134/192/7 140/193/7 136/194/7 +f 140/195/2 141/196/2 137/197/2 +f 135/198/6 138/199/6 133/200/6 +f 136/201/5 137/197/5 135/202/5 +f 133/203/4 139/204/4 134/205/4 +f 143/206/6 148/207/6 144/208/6 +f 138/209/2 143/210/2 139/204/2 +f 139/211/2 144/208/2 140/193/2 +f 137/212/2 142/213/2 138/199/2 +f 148/207/2 146/214/2 145/215/2 +f 141/216/7 146/214/7 142/213/7 +f 144/217/4 145/215/4 141/196/4 +f 142/218/5 147/219/5 143/210/5 +f 151/220/6 149/221/6 150/222/6 +f 18/39/6 149/223/6 14/9/6 +f 151/224/6 18/39/6 20/41/6 +f 152/22/6 20/41/6 16/15/6 +f 155/225/7 153/226/7 154/227/7 +f 19/44/7 153/24/7 15/228/7 +f 155/229/7 19/44/7 17/46/7 +f 156/25/7 17/46/7 13/23/7 +f 8/5/2 136/188/2 135/6/2 +f 9/8/3 13/12/3 14/9/3 +f 11/11/3 15/14/3 13/12/3 +f 12/13/3 16/15/3 15/14/3 +f 10/10/3 14/9/3 16/15/3 +f 16/16/4 20/42/4 19/17/4 +f 13/19/5 17/26/5 18/20/5 +f 14/9/6 149/223/6 152/22/6 +f 13/23/7 15/228/7 153/24/7 +f 17/26/8 22/37/8 23/27/8 +f 8/5/6 24/40/6 23/28/6 +f 5/30/7 22/45/7 21/31/7 +f 7/33/4 21/43/4 24/34/4 +f 6/36/5 23/27/5 22/37/5 +f 18/39/9 23/28/9 24/40/9 +f 20/42/10 24/34/10 21/43/10 +f 19/44/11 21/31/11 22/45/11 +f 9/47/6 26/230/6 25/48/6 +f 26/50/3 27/231/3 28/51/3 +f 11/53/5 25/232/5 28/54/5 +f 10/56/4 27/233/4 26/57/4 +f 12/59/7 28/234/7 27/60/7 +f 37/62/9 42/73/9 44/63/9 +f 33/65/6 35/75/6 36/66/6 +f 29/68/9 34/67/9 36/66/9 +f 30/70/5 33/65/5 34/67/5 +f 41/72/6 43/79/6 44/63/6 +f 32/74/4 31/235/4 36/66/4 +f 38/76/5 41/72/5 42/73/5 +f 40/78/4 39/236/4 44/63/4 +f 53/80/11 58/91/11 60/81/11 +f 49/83/7 51/93/7 52/84/7 +f 45/86/11 50/85/11 52/84/11 +f 46/88/4 49/83/4 50/85/4 +f 57/90/7 59/97/7 60/81/7 +f 48/92/5 47/237/5 52/84/5 +f 54/94/4 57/90/4 58/91/4 +f 56/96/5 55/238/5 60/81/5 +f 69/98/10 74/109/10 76/99/10 +f 65/101/4 67/111/4 68/102/4 +f 61/104/10 66/103/10 68/102/10 +f 62/106/6 65/101/6 66/103/6 +f 73/108/4 75/115/4 76/99/4 +f 64/110/7 63/239/7 68/102/7 +f 70/112/6 73/108/6 74/109/6 +f 72/114/7 71/240/7 76/99/7 +f 85/116/8 90/127/8 92/117/8 +f 81/119/5 83/129/5 84/120/5 +f 77/122/8 82/121/8 84/120/8 +f 78/124/7 81/119/7 82/121/7 +f 89/126/5 91/133/5 92/117/5 +f 80/128/6 79/241/6 84/120/6 +f 86/130/7 89/126/7 90/127/7 +f 88/132/6 87/242/6 92/117/6 +f 93/137/6 97/243/6 98/138/6 +f 96/140/6 100/145/6 99/141/6 +f 94/139/6 101/144/6 102/143/6 +f 114/146/7 121/148/7 122/135/7 +f 116/134/7 120/136/7 119/149/7 +f 113/151/7 117/244/7 118/147/7 +f 100/152/12 102/143/12 112/153/12 +f 97/155/5 107/164/5 108/156/5 +f 93/158/4 94/245/4 104/159/4 +f 99/161/9 110/169/9 106/162/9 +f 93/158/9 103/160/9 107/164/9 +f 96/140/9 105/246/9 104/165/9 +f 98/157/13 108/156/13 111/166/13 +f 95/163/5 106/162/5 105/167/5 +f 101/144/14 111/166/14 112/153/14 +f 99/161/4 100/152/4 109/154/4 +f 120/170/18 122/135/18 132/171/18 +f 117/173/4 127/182/4 128/174/4 +f 113/176/5 114/247/5 124/177/5 +f 119/179/11 130/187/11 126/180/11 +f 113/176/11 123/178/11 127/182/11 +f 116/134/11 125/248/11 124/183/11 +f 118/175/16 128/174/16 131/184/16 +f 115/181/4 126/180/4 125/185/4 +f 121/148/17 131/184/17 132/171/17 +f 119/179/5 120/170/5 129/172/5 +f 6/29/2 134/190/2 136/188/2 +f 5/189/2 133/191/2 134/190/2 +f 7/7/2 135/6/2 133/191/2 +f 134/192/7 139/211/7 140/193/7 +f 140/195/2 144/217/2 141/196/2 +f 135/198/6 137/212/6 138/199/6 +f 136/201/5 140/195/5 137/197/5 +f 133/203/4 138/209/4 139/204/4 +f 143/206/6 147/219/6 148/207/6 +f 138/209/2 142/218/2 143/210/2 +f 139/211/2 143/206/2 144/208/2 +f 137/212/2 141/216/2 142/213/2 +f 148/207/2 147/219/2 146/214/2 +f 141/216/7 145/215/7 146/214/7 +f 144/217/4 148/207/4 145/215/4 +f 142/218/5 146/214/5 147/219/5 +f 151/220/6 152/249/6 149/221/6 +f 18/39/6 150/250/6 149/223/6 +f 151/224/6 150/250/6 18/39/6 +f 152/22/6 151/224/6 20/41/6 +f 155/225/7 156/251/7 153/226/7 +f 19/44/7 154/252/7 153/24/7 +f 155/229/7 154/252/7 19/44/7 +f 156/25/7 155/229/7 17/46/7 diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2435ad62a362456de0aad0607a01f667c08238 GIT binary patch literal 7412 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 F{~wZYBo_bx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_base.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_base.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3ede879de87a54f01f35233c1db0733dbf1ba9 GIT binary patch literal 2693 zcmcIl2~bm67X1Mwh%B}W5ru$bD|Q2ePO}IEBC>`pfG7+C3J53=RALB8h(Xbb3J65g zYS;{$vPfu9LBpoVA_@^y0@8#jSt3NXAZrpbNkF@1s+{U_YF^c?_v-$C&Ohh8TlKGa zxI3ySZB+sQKn3As=LG;D$q@u7Do8f}n0sN8Z4LSW!dp?Y;uViy1^^`(!p_D!E_1x! zEy~|Vvw51EO|bd}N@`Xw+K}t@Yx$id2M|SJ9o-U-|@1Y;+3^>Hi$fr1L~I3?4H5f1m9P2!t}RwA%dNgpM|6hi)>s+bqFit zu^HF8!}#J+(G+32BTqYkNT;W*y+8Q~gUh9l*IoiS(Ce#m10Q?)pi5uR1%{`g z9?lyFZrg<8>kX5ZnQE0m=XQ~%4>oPchdBwv?K6p~@OkuNXP>Q@MTSEoYTrNyU!z#~ z^E?d$58W`EqHO}Av2Oz%-%Un$*(8Q z`Sx#7|B)&(p^d9bJ~uK@JsT0v6{TjsOxkWwZ_DC5!5DU!M&Qfq3S#f(iKCrxw7`WO(QV7cH$``%B)@iEeIa6s` zI_$$GCe?-xKfTO%wec({)Z6u-?x9Kb{oP8`(9Jl0U1&JRg{XEdMpxzdfIcCESr%jk+E;pM+RYG@Iw#rT6oe1L24%x*(;7$_Ehpz z@>29{3vQA>vyG~=G{DR7Lyeyx-o5`g%vOzEb%X3`uSkp9EQvnyQLhKH&z#?$w3nhs z8i7R}vY3b)A9?o_aeMbqNw+Hu4tf_|v28gkXhD z5yA5>5;vb4Sye|vPh8|1@n=~u68;{{1yxSKe(7%b_By1{L*S|Of zf8vlW)Z}N%m;0OqgoB;epSJu~TC^<>T8dJ(W^3t7^rap_QHv22D5~l#gQUYBVo}Jo z&hp2KtqW87t=ziTTa6ACLu%Wh^E#(KmQ)^;jsfIuGnMSReU9@YY9dyF`Ly*q+@VxUw(RItS zsnJboh)p6=ZZA7xa@2?yKn#g>H4310H>PkDuDMrvr-LsUd}JZt<8g(%_(SCO`ehDS z83>`Og4%q?2H&Y*UfzRg#Ul?_Ve^-6jMUeQrKRi9&{R{h~q=j$th!8AhpJe%d5)&qN`y<_#ldh9% z+qi(kC_aXNG!qup3Es~^Wut+)pRJzO3!kR!!$$ojC(deqJF5no30qXc&4GII)DmiV zE3aapk3P!lPMWgJ0m5fc8a5+bC&6k7Xl1rH1{R!{r@ih zkOg>ZiJ)^l4{v3@*xAw8?Q!b2Kqk)QTG#B*kfRxES}bmPjpT2u3QR#BW%XN3;spxe(F-z1;}ynm1F?~1#m)Z*DGw1gXms{ zz#U$-wOxH~*}Xn}v%ftF7Ex#T46b_z4g3ri^#%Qu9yD9Wz6pk+Z}1z9Ux#` z2=INCCu5Pf)H9U>K|2-Cp4qns*w_rLRO|=De!ug7Z)vn>IdcBYnG%I^F6 z=eKY}?;5j{$6Xfu-N}L{KsY|W(7Vsc5ZrN5iiP129GzkAC=%{7WKlS6z<;cOlOdCd zA(82T$UDb1j!6DGQ_K*UcgXOVFXN4mr$g?i^D`Bm{F(W!j^TSDKh!W_ybn$w_mo*% WykXjd`3Xls4)k>Ob6Mw<&;$SukH2XE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_multiply_100.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_multiply_100.png new file mode 100644 index 0000000000000000000000000000000000000000..386ac8145fd335dda16c122a3aab7f7354ebb036 GIT binary patch literal 944 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIE+9%;}yk zjv*Cu-rl{NJ3B$5?cw#%@=a4MB@Q?r5Q#iw_gyBgTP|eXqE$hPY`>eI@9L9v`BThp zH+j1AS>tmxHfKsJzVm&^xBIiF>3d}J9*sRm{?^H#{{1#}nOt6Pyu5YaV)2g9nDy6J zt+JYbKGcsr?0fP%{vRI>*PY>G*dWiuaFB(eiIagvn1Mr$LBNMWVFrVP0b@e~T;li7 zH*9{(FAM$N*s<>Qs`tPD+v%0g-@R`2?YGyilr8)7Zq4(T3?YB(6r&Az4ljKF+w=e0 z89UA&HjwE%{`khFvSt6?tvRfT$9OFEip^v{@N3t))rk`G_QjTE-+s84B|$lFd$er- z@#SslHfle&Y>~a^&0w}~}|H){5iWTgvs z90%IAn4CQBvY>VY8^It!G50fr*`lowhbTAnzWBZG80(g8bIa}5zr-1^F`PRDmtTJQ zGPfi)y!O8S2J<(q3^^x)wm*teQadlS*o?zrMfv?1munesC-5Rg&Kacyg~K)#1uOy? zD--3;SAGB7z~ErAoS`v><47|@OOc{Ls2`)kEO`9sFtGu}ivLEg{rfwq@BI1m%fgD5 z$23gZbG}&rTIJT$PmSXArf=N0=Xu2WEBl!qKi>HG1()8n;=OUJSG}sS3-_(B|KxiO znjjWP_8+c~OMkVUp?#Iq`|rEOIm=Sc2_AU(_;K=9*+zEmhV`H4s^8qsu;y&LJTQe1 dK9CT(pW%@@??f4PxgQ|cdAjY2LGE&;KJwj{FC)4YMVApi+bZNW<;hx54<#nKN)hpwc)2 z6NmsQY-!12`1tW781wVStU%W0FOmsWs*0RV#?kfyaR Rf7bv2002ovPDHLkV1h!&v%UZT delta 285 zcmV+&0pk9%1Kk3UNq@rt01m?e$8V@)0002;Nkl(YmXyYdB=a}QdPdR`#Li{GaF`EcEt-o;l)k}5gJ7ZLP$uK zEUbV?Xy4@vBp+afluwX1NJP9LL`r~&%_iDJLTlP1>N(GO&cDuiEI5JZZ(O(UT?=T3F;8x-@q_&y z?c)woisBq=K}v-+hLu{CcDI8#`9T@#)#_aNzkPKBDWL9q9QMNEylxcpYAfZ}*FCOn ztg_oa1|UfdT1ljkymA=v{x!c8Uyr-Ub{M;pjX_Jv`!)iO!h}ZP(GFv3o~9EgJif8Y z?fsC)D-vHzcH3PxssV2vw0XyRgU2@-{HT@8m2a%!_5C)fv8aKYu;1xH&>+x?@Bi=p zp<@z|QW6Cp(hq3hnPRZz+`aO$R?1l8=gd{a{=YQvJ6GXskhapNTz~FqqP_GL9^?nJ5Br4+vB;rs3`rK!PUvBqMp z<=)N?Kl}L`2qBPCU@biLu6MG%eQ_#&oFoV#&`Pn{-p3m7Jw;*+?bQn>FZofh% z@bpH&8_hN=TJvf%q($pI>@pE!4VDMpil<3CDXB4Ntw@uUIBP6G6vud4lNy7P5-9{y zYm|_ztke()5CUu6@oD+sj5Ua(FhNQ|yWL)d9j3-ugXKYYtrDQZ>~1IS&MPTVO1aLR z3VLCP@B0N;NP!fRdcB4a60MZ$(k2C%iZ2i(Y3jOV=539@gI>ty_9c{(#W?_E-rEa9 z*WG;&fxsB!JX?t31_&Wa@y8mh*$sJYwa(sg7eu}A0O;TO)EIoMinImi7~{n3&2qvlNy7kHA*S>UKA4qK53ddk3b+r-#es~rTN#d zT?U}$X{>eKI7!mND?Crr3qz!oXs!G4FZ&EnYfN^Nj4`G8BL=fTlo$@WQ9-oUQms^+ zCrH;2lQlkyV#q!?ierQj&ReW?y{;sGw|&e?;1XRal}jL_2q`5=k~pJhT{=k;jI~*} zQ>g5Fq>@;iXO-rkG+3irI>^=YjYHXG^E)DXupzUR>kLyR#f<+_koiqsev zyrslKX+FSKt;*vY4Qv(~0^i42n|UQzY;hyfG<732&gQ5+LS5kiX6{4sOM zl$xhG3KO;)^`*xQfc2`6uO$MC?qp1g&O9VZ`}v)xbrA=pa1)towSrQLI8I9QM?Flq z$uYpKJ3Gsd8B&rO%Wk_{G)^gr@AtX;(Nq5sq^2g?3xeW8f z)*7$%mK!s+>Q#QWcgRLHpxrb4-HZP?NjfX=`RAUs39g&F#Mr|Zim$%-(y83jFg6bx z)Wen?Gjfsd&4cNuM6Ff}V~p!cQj#Pot=4?zpr`6#%Z?entb69uwW%9+Vo;eEPSwMb zde!w`;re`j0h9WCB?#Pc)lWyt@eP+7H3F@;bN_IvMz!1R(vx&cf7B5mELZ_z#9+tW zE=~^tQgUN~GoZIdVO0^Wr6v%me@G8{aIBf9jdv z2jJpL9h;5J;6j2ihQRlW?@p3ri2Ipm|Bxh2S+4}edzm_2{F`HJL>$t?vV<~C`uU3Q zc_^(=O3@2Lgy?@}o?qotqO$xUJuE{$C=BAPgUS&1#GnMu!%qIeg7mOKJAT@N+bBt1+iRopRSEm0IxsRYECM5C1& z(zApRrTN#dUFHXOcAOs8jrf~yyf{_j8m0-IZnscS1Eu-;H~-;GiR;OL4`aII+g%Tv z2J=W;15>0!&jpwUJ=%;{l1M`6Nyw(H0+C5j@d zl?q9cV9Dl}#*FA$GV>D8_lid6df2RdaC%snrU(ol{;dz#SrgZ3xOw6_DGwVl*oYps zvOT0{X{CnrtSHJJe`PsUty(3HlR`fNO7VyEFyXPe-A`N(zTQthy-%JkaUJAVKQ)@T zP94LbydKtU9w3Fp*#3i1V=WgiY)!>~m>vc$@r>hy!K}%c6yNg;BZ+Jj9vpr1>!?;M z91U`_#5L!iG}PdGr>+l6(-b)nS9JDTO7~Pd&zbT&sFWf}5{^0@v{ocZijs<2t>Q+) zDfoE<{eeYqZyvOvQXfiOgJ=7RtM$&7xYnLKJ#o!(N(^&)SiUAJ@cqoKr@w=K;L~}q zR|I-vE!9deG<7-61L8PwdYJ0#VRw3lPOHsJ-}<)r{BzG*w4&8&v7g1BXFm23`{K90 zU0PLzGsLiY>0!s6j+=qGlhAs5ZhF`=ANz;}7p(IjpT9RRyf7xq|H8N!_JPd`i7|lY zb~EIo>KLsgm5OGq60mpN&5pYq>FEvE!0pXCx9;rmM1759y8_$q<#sdV{i~kidz!V1 zHyz&?P;k2y@(K*;VFv@(y1Kf`>gwv;xquvk9gXut?F3c0-ylk{fW+UWEpgBwwfp&2x*U0X+ zj*H2;wC)BRg-Nl{ci#LQxgK_2_yVKiDvUAMYlm)BGM$h{JzEnBP^ojLXFzzgk6Z%U zs7h|$Yayh>bR&cSdh_L*cf)>${O7$rs{j#+Us%S${JEgT4BVc zdWBA$uvT$P!++8>+_<`0ct?(T@)KitVsnjF81cK;R`}bu#t;3A#Gv6u43@`|TI3#) zU0SK}!#8(n^&BM1Q3W&Y=_15#_Vwa6@#Pvg=8O*4$#NH07r4+B`Q z_`Ke1lU60aJnEo?V721Y&89KF(u7G0DDJn9S+7;tJMOYp4QO`5h4aq?Q^&A3L&2N9 z2qQdJgy_d0z*>dq83YoGVYROK=}`}k60C*0af~sG<)0Vwx#P*#BL;iVs%En`@Q`5L zFJj8=X2^|8Zns918kaAvt`(==-Vb@AVi(Gv?osZ1FgPWeIQibJRd}P>=GyuScMgu& z@ATNLRY==ikO7@I;f-dyXvASJWG$QJ3mLFk3l_>hPn?_Ai&+$F=3jzxu6)H3!Vo*Hx|IFzv#c7H_jZxjIlK8wV{|Y2san3an$L$xu8jh zV$!1cU%7ef)HW;UXjY1a5|Khi9PGz;f{LDw}piFdqtMU+; z$@26@FeEem$=Al`bNb7l{T+LzIt~qeN*##GLiu0(^oQ*r|1bXeyJH(xR;HQ+{dSL8 zr|}<#GBVRdgMHVm!rJQSkxWGRt^qd29B1J868V!*R;HQ+y{Jc2%SKt5Y7!pq(~mI9 z%2bn}mtEFik+|17VkOW+GST*GeMn}yxKgDZhGS)>anP5pULi?Sk|f6W+y<$9Cq}-2 zH;Uupaelr*A&%XO8{hMm%AbUr_Yc9Z@#Dh?i{_wf5x#rWSFc+B>GeH8(`?5GAtCO6 zR=qkobJ6AZ0xg$631wxfi3SUTQ6hYU>Qv##uIh63WU{6Agx7se6ga z@+VSfpCD$74_$Yt*(D$74_$Ys~onMZA&^MqV>ZJo0G^M=f) zB*4&KBB0m{1Ptv3l0uBs)>#(+ydjreTc<4lyrE~=OO)>g@`b_=oL2;De0J>Vez(y& zOCohYne+oiH;HHZ{y0AW71cBAVO8zTZOcl#-R8pO+4drxH)htuwC^sw>;ksIO;z*M z!xjZSORecej83zB|18x4%3@|cY~E0+T&?Q!!pwTuyfJS*Y*Cn551Y5mPIj}hdf1{c zvmQ2YEJ6=k1mvu>apsL#YxA5pX4b>zjd|-~i^9x$*u3%oLJylOe%1A`1zgClz8*GD zJSuvap0!r=A}~v>>Kq^Z;0Ntss$nzFgki&4Yl~xpBmVck_r0k`GCfOeohXhc$~m** ztlyv4=EVm{php*Y$UIn}bzu_|#YbU3}sbpRnzA`&3Vpv(}fNH)gGG56(Nk_Q$_zcXpbj z#{D>+wWG5)0WOC-u~+lo{_OYcv|d(P51VI^pfY-xlFqAYD>WMHRiqHbl7K<6pw;Z~ z&L^)r%!&jQhHcESmZ|d&;R&2+uIxNVTl`dk-YP7{FlJ^dsPdOZMVtTW_uzY^=igb*0p|99|prCw!qqsGxemv=o? zqkGgvOF0zR%s^gt8Xo!eVNPvPJa%=Ht5-Hz->Px>@>Zq;ZNutcUj-6qof-l zl?1Jvw_0n9iT$YtTXwDKviw1>a9O;2-PowIy}iNeW{s;?H`&?Qr}^NRd-wJ^-0zSM z%-hWw#`#BneONKY$!4M8!k>~7DFtCGq|vBz<=O@I9~@(FX~tW-P1e>{_~mXhV{J|4 zVUPU!u-sr;3fvEX%EIe*cAD({@_@@%Ht8LANv%Z*Q49>ZbLO5p)hHRoF;cpp@sdiR zq@dRe@w6VQ7M|xn`7e^@4alEXFN>cWTuMQj+HBMl95uVV``zzANkLR_{T+{&L(+$?AN{hcR4|Q)iO+ue zllD>GFZs=vUKRkK``qUWiN=`zkMO~OlAGmkCr8+Nz0Q}u^rh((*JbZ_oY#KIgM)t2 u<$UDKN7Iv@BlD?NcHaK}{xr4%;Qs)`Q3;>@qnoz?0000_V^Kl3LbqDZl2mbsU{m&1`Rt3LM z1z{g4X&rwj0V2=smk`H2ejYY6>%3D;T%#7_nMYzNF%2IX-G z=V1ohSqJ{!5BiY`@Mj19?i2Ne3H^Qu>17A|mka!I2mZAV$5000Uk2l32LAIC{@W7j zT?qd76#ASC{iF;1%n#dM2mXl&-Dd{iTn6}|3(Zpn{=N*XK?I^e1^(0z=z$8aMFsqz z4X{WB=XeQr#~NS&00WgtL_t(|UIoB{w(Q1zG$sLP_p#nV>8EX*2f&Y&BE$%ZB)9$9`gRbYW`0U%q`gA}ItM65({Gvl919zBuTI&9Sm zyqM3MS*>8t)C_ovqNw3jAXKV?yE{T6bs7WFKChgewpPYO(IncuT5&g#z7RraSr=XT zdlaunaeZ)0L*-N= zZ3ucY362RGT{W6`f|rxudY08I?!Uw(nHUlMykGb2fFBcuj^t_xmgyq>Wa{LlG~Pet zLlnMr@0HEbp;d;$@bdLZ7rGR?duOQDeN z9==1%TD1ItP=Uhfphc2$9K;VIj%HCuZ!SGRZP;4IJS!yu9^!vK-?3p*0v+v3>qCqg zu}yTQ+RZoq{JdYsW_8g1TsY%umm}G^8DuMu{xO-1|0$4nk8* zb}TNXExdRg*c`5`W|^Q!AV;BKDTPxLP@WRoTy5xvAg(cRIOS~(txgPDpoyR_s4HWz z(-Cp`=*FJyCM)%bg|h!xx=4Jb&1tH~Fw7^owp^jje{aK_`{m^mzc$V)6ipPfT2)U- zi7ev-n8*`yb9nLO*gZL{#FQy{^!>YEQN%2dGp_Cu(0kbO9YyCK(Z~IEB4C)Refng} zF^bwCVmU*CS$fB;?4W<7`}VKD+lSvByKs0Owp%qnyrlgW4BUkSAf;Dfxx6?2b@KTa zTX3qw#>Jq4ItBmgrxTnfd!`*8&hLzTaTLsZ5*{S6HbpWIa8*V&Zv{rBj zQYbOq--RRZA3wEs63S=ubP~j%=F{tZernrMIzYL!hlhT8_wvRW_vkJx|Csn6m*KK_ T(jO{n00000NkvXXu0mjfQ>l*c literal 0 HcmV?d00001 From 7d156d9ff974fb604cb2a1502c78d47366cdcfea Mon Sep 17 00:00:00 2001 From: Vaern Date: Tue, 23 Aug 2022 20:11:34 -0700 Subject: [PATCH 048/111] argh this shit needs to be sorted out --- .../world/worldgen/ComponentNTMFeatures.java | 149 ++++++-- .../hbm/world/worldgen/MapGenNTMFeatures.java | 18 +- .../world/worldgen/components/Feature.java | 326 ++++++++++++++++++ .../components/MilitaryBaseFeatures.java | 186 ++++++++++ 4 files changed, 645 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/hbm/world/worldgen/components/Feature.java create mode 100644 src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java diff --git a/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java index b98219729..49b292dbd 100644 --- a/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java @@ -8,7 +8,10 @@ import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; import com.hbm.lib.HbmChestContents; import com.hbm.tileentity.machine.storage.TileEntityCrateIron; import com.hbm.util.LootGenerator; +import com.hbm.world.worldgen.components.MilitaryBaseFeatures; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.item.ItemDoor; import net.minecraft.nbt.NBTTagCompound; @@ -18,7 +21,10 @@ import net.minecraft.world.World; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.gen.structure.StructureComponent; +import scala.reflect.internal.Trees.This; +//TODO: +//KILL! //Probably one of the more difficult parts. /** Base component file. For structure generation under 32x32 blocks, as Minecraft generates 2x2 chunks for structures. * Larger non-procedural structures should be split up into several bounding boxes, which check if they intersect the chunk bounding box currently being loaded. Doing so will prevent @@ -38,6 +44,9 @@ public class ComponentNTMFeatures { MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin2.class, "NTMRuin2"); MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin3.class, "NTMRuin3"); MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin4.class, "NTMRuin4"); + //aggggggggggg + MapGenStructureIO.func_143031_a(MilitaryBaseFeatures.BasicHelipad.class, "NTMBasicHelipad"); + MapGenStructureIO.func_143031_a(MilitaryBaseFeatures.RadioShack.class, "NTMRadioShack"); } /** Sandstone Ruin 1 */ @@ -93,7 +102,7 @@ public class ComponentNTMFeatures { */ //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); @@ -177,7 +186,7 @@ public class ComponentNTMFeatures { public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { //System.out.print(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); @@ -257,7 +266,7 @@ public class ComponentNTMFeatures { //Loot & Decorations //House 1 - int eastMeta = this.getMetadataForRotatableDeco(4); + int eastMeta = this.getDecoMeta(4); this.placeBlockAtCurrentPosition(world, ModBlocks.machine_boiler_off, 4, 1, 1, 1, box); this.fillWithBlocks(world, box, 1, 2, 1, 1, 3, 1, ModBlocks.deco_pipe_quad_rusted, Blocks.air, false); this.placeBlockAtCurrentPosition(world, ModBlocks.deco_pipe_rim_rusted, 0, 1, featureSizeY, 1, box); @@ -332,7 +341,7 @@ public class ComponentNTMFeatures { public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); @@ -360,7 +369,7 @@ public class ComponentNTMFeatures { this.fillWithAir(world, box, 4, 0, 4, featureSizeX - 1, featureSizeY, featureSizeZ - 1); this.fillWithAir(world, box, 3, 1, featureSizeZ - 1, 3, 2, featureSizeZ - 1); - int pillarMeta = this.getMetadataForRotatablePillar(8); + int pillarMeta = this.getPillarMeta(8); //Pillars this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); @@ -398,7 +407,7 @@ public class ComponentNTMFeatures { //Decorations & Loot this.fillWithMetadataBlocks(world, box, 1, 1, 1, 1, 1, 4, Blocks.dirt, 2, Blocks.air, 0, false); - int westDecoMeta = this.getMetadataForRotatableDeco(5); + int westDecoMeta = this.getDecoMeta(5); this.fillWithMetadataBlocks(world, box, 2, 1, 1, 2, 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); this.fillWithMetadataBlocks(world, box, 2, featureSizeY - 1, 1, 2, featureSizeY - 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); for(byte i = 0; i < 4; i++) { @@ -409,7 +418,7 @@ public class ComponentNTMFeatures { this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, 3, 1, featureSizeZ - 1, box); ItemDoor.placeDoorBlock(world, this.getXWithOffset(3, featureSizeZ - 1), this.getYWithOffset(1), this.getZWithOffset(3, featureSizeZ - 1), doorMeta, ModBlocks.door_office); - int northDecoMeta = this.getMetadataForRotatableDeco(3); + int northDecoMeta = this.getDecoMeta(3); this.fillWithMetadataBlocks(world, box, 5, featureSizeY - 1, 1, featureSizeX - 1, featureSizeY - 1, 1, ModBlocks.steel_scaffold, westDecoMeta, Blocks.air, 0, false); this.fillWithMetadataBlocks(world, box, 5, featureSizeY - 1, 2, featureSizeX - 1, featureSizeY - 1, 2, ModBlocks.steel_wall, northDecoMeta, Blocks.air, 0, false); this.placeBlockAtCurrentPosition(world, ModBlocks.machine_electric_furnace_off, northDecoMeta, 5, 1, 1, box); @@ -469,7 +478,7 @@ public class ComponentNTMFeatures { public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } this.boundingBox.offset(0, -7, 0); @@ -566,10 +575,10 @@ public class ComponentNTMFeatures { this.fillWithRandomizedBlocks(world, box, 1, 4, 1, featureSizeX - 1, 4, featureSizeZ - 1, false, rand, RandomConcreteBricks); //Ceiling //Decorations & Loot - int eastMeta = this.getMetadataForRotatableDeco(4); - int westMeta = this.getMetadataForRotatableDeco(5); - int northMeta = this.getMetadataForRotatableDeco(3); - int southMeta = this.getMetadataForRotatableDeco(2); + int eastMeta = this.getDecoMeta(4); + int westMeta = this.getDecoMeta(5); + int northMeta = this.getDecoMeta(3); + int southMeta = this.getDecoMeta(2); this.placeBlockAtCurrentPosition(world, ModBlocks.crashed_balefire, southMeta, 6, featureSizeY - 2, 3, box); int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 1); @@ -648,7 +657,7 @@ public class ComponentNTMFeatures { public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { ////System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); @@ -681,8 +690,8 @@ public class ComponentNTMFeatures { } //Walls - int pillarMetaWE = this.getMetadataForRotatablePillar(4); - int pillarMetaNS = this.getMetadataForRotatablePillar(8); + int pillarMetaWE = this.getPillarMeta(4); + int pillarMetaNS = this.getPillarMeta(8); this.fillWithBlocks(world, box, 1, 0, 0, 1, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, 0, box); this.fillWithMetadataBlocks(world, box, 2, 4, 0, featureSizeX - 4, 4, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); @@ -713,8 +722,8 @@ public class ComponentNTMFeatures { this.fillWithMetadataBlocks(world, box, featureSizeX - 3, 4, 1, featureSizeX - 3, 4, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall this.fillWithRandomizedBlocks(world, box, featureSizeX - 3, 0, 1, featureSizeX - 3, 3, featureSizeZ - 1, false, rand, RandomSuperConcrete); - pillarMetaWE = this.getMetadataForRotatablePillar(5); - pillarMetaNS = this.getMetadataForRotatablePillar(9); + pillarMetaWE = this.getPillarMeta(5); + pillarMetaNS = this.getPillarMeta(9); this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 2, 1, featureSizeX - 1, 2, 1, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Back Wall this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 2, 1, Blocks.log, 1, Blocks.air, 0, false); this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 1, featureSizeX - 1, 1, 1, Blocks.planks, 1, Blocks.air, 0, false); @@ -735,8 +744,8 @@ public class ComponentNTMFeatures { this.fillWithBlocks(world, box, featureSizeX - 2, 2, 2, featureSizeX - 1, 2, 5, ModBlocks.deco_steel, Blocks.air, false); //Loot & Decorations - int southMeta = this.getMetadataForRotatableDeco(2); - int eastMeta = this.getMetadataForRotatableDeco(5); + int southMeta = this.getDecoMeta(2); + int eastMeta = this.getDecoMeta(5); this.placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 2, featureSizeY - 1, 1, box); this.fillWithBlocks(world, box, 3, featureSizeY - 1, 1, 4, featureSizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); this.fillWithBlocks(world, box, 2, featureSizeY - 1, 2, 4, featureSizeY - 1, 2, ModBlocks.deco_steel, Blocks.air, false); @@ -793,7 +802,7 @@ public class ComponentNTMFeatures { public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); @@ -804,8 +813,8 @@ public class ComponentNTMFeatures { } } - int pillarMetaWE = this.getMetadataForRotatablePillar(4); - int pillarMetaNS = this.getMetadataForRotatablePillar(8); + int pillarMetaWE = this.getPillarMeta(4); + int pillarMetaNS = this.getPillarMeta(8); this.fillWithBlocks(world, box, 0, 0, 0, 0, featureSizeY, 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); @@ -869,7 +878,7 @@ public class ComponentNTMFeatures { public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); @@ -880,8 +889,8 @@ public class ComponentNTMFeatures { } } - int pillarMetaWE = this.getMetadataForRotatablePillar(4); - int pillarMetaNS = this.getMetadataForRotatablePillar(8); + 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, featureSizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); @@ -936,7 +945,7 @@ public class ComponentNTMFeatures { public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); @@ -997,7 +1006,7 @@ public class ComponentNTMFeatures { public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); @@ -1043,6 +1052,8 @@ public class ComponentNTMFeatures { } } + /*Worrying: StructureStart checks for not addComponentParts to remove structure components from iterator, but here successful builds return true. + may be issue with multiple components.*/ abstract static class Feature extends StructureComponent { /** The size of the bounding box for this feature in the X axis */ protected int featureSizeX; @@ -1101,7 +1112,7 @@ public class ComponentNTMFeatures { this.hpos = nbt.getInteger("HPos"); } - protected boolean func_74935_a(World world, StructureBoundingBox box, int y) { + protected boolean setAverageHeight(World world, StructureBoundingBox box, int y) { int j = 0; int k = 0; @@ -1128,7 +1139,7 @@ public class ComponentNTMFeatures { * @param metadata (First two digits are equal to block metadata, other two are equal to orientation * @return metadata adjusted for random orientation */ - protected int getMetadataForRotatablePillar(int metadata) { + protected int getPillarMeta(int metadata) { int blockMeta = metadata & 3; int rotationMeta = metadata >> 2; @@ -1163,7 +1174,7 @@ public class ComponentNTMFeatures { * @param metadata (2 for facing South, 3 for facing North, 4 for facing East, 5 for facing West * @return metadata adjusted for random orientation */ - protected int getMetadataForRotatableDeco(int metadata) { + protected int getDecoMeta(int metadata) { switch(this.coordBaseMode) { case 0: //South switch(metadata) { @@ -1213,6 +1224,40 @@ public class ComponentNTMFeatures { return 0; } + //TODO: Make a lot of these orientation/rotation methods much more transparent about what + //direction they will actually face + + /** + * Places door at specified location with orientation-adjusted meta + * don't ask me which directions are what + */ + protected void placeDoor(World world, StructureBoundingBox box, Block door, int direction, int featureX, int featureY, int featureZ) { + int meta = getMetadataWithOffset(Blocks.wooden_door, direction); + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + this.placeBlockAtCurrentPosition(world, door, meta, featureX, featureY, featureZ, box); + ItemDoor.placeDoorBlock(world, posX, posY, posZ, meta, door); + } + + /** + * Places random bobblehead with a randomized orientation at specified location + */ + protected void placeRandomBobble(World world, StructureBoundingBox box, Random rand, int featureX, int featureY, int featureZ) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureX, featureY, featureZ, box); + TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(posX, posY, posZ); + + if(bobble != null) { + bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; + bobble.markDirty(); + } + } + /** * it feels disgusting to make a method with this many parameters but fuck it, it's easier * @return iron crate with generated content @@ -1232,6 +1277,47 @@ public class ComponentNTMFeatures { return false; } + + @Override + protected void func_151554_b(World world, Block placeBlock, int meta, int featureX, int featureY, int featureZ, StructureBoundingBox box) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + if(box.isVecInside(posX, posY, posZ)) { + Block block = world.getBlock(posX, posY, posZ); + + while ((world.isAirBlock(posX, posY, posZ) || !block.getMaterial().isSolid() || (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && posY > 1) { + world.setBlock(posX, posY, posZ, placeBlock, meta, 2); + block = world.getBlock(posX, --posY, posZ); + } + } + } + + /** + * Places specified blocks on top of pre-existing blocks in a given area, up to a certain height. Does NOT place blocks on top of liquids. + * Useful for stuff like fences and walls most likely. + */ + protected void placeBlocksOnTop(World world, StructureBoundingBox box, Block block, int minX, int minZ, int maxX, int maxZ, int height) { + + for(int x = minX; x <= maxX; x++) { + for(int z = minZ; z <= maxZ; z++) { + int posX = this.getXWithOffset(x, z); + int posZ = this.getZWithOffset(x, z); + int topHeight = world.getTopSolidOrLiquidBlock(posX, posZ); + + if(!world.getBlock(posX, topHeight, posZ).getMaterial().isLiquid()) { + + for(int i = 0; i < height; i++) { + int posY = topHeight + i; + + world.setBlock(posX, posY, posZ, block, 0, 2); + } + } + } + } + } + } //Block Selectors @@ -1276,6 +1362,7 @@ public class ComponentNTMFeatures { } } + //ag static class LabTiles extends StructureComponent.BlockSelector { LabTiles() { } @@ -1305,8 +1392,6 @@ public class ComponentNTMFeatures { @Override public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { this.selectedBlockMetaData = rand.nextInt(6) + 10; - - } } } diff --git a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java index 9f26946be..666f892a3 100644 --- a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java @@ -2,19 +2,25 @@ package com.hbm.world.worldgen; import java.util.Arrays; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Random; import com.hbm.config.GeneralConfig; +import com.hbm.world.worldgen.components.MilitaryBaseFeatures; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.BiomeGenBeach; import net.minecraft.world.biome.BiomeGenMesa; import net.minecraft.world.gen.structure.MapGenStructure; +import net.minecraft.world.gen.structure.MapGenStructureIO; +import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureStart; public class MapGenNTMFeatures extends MapGenStructure { + //BiomeDictionary could be /very/ useful, since it automatically sorts *all* biomes into predefined categories private static List biomelist = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.ocean, BiomeGenBase.river, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver, BiomeGenBase.deepOcean}); /** Maximum distance between structures */ private int maxDistanceBetweenScatteredFeatures; @@ -130,6 +136,8 @@ public class MapGenNTMFeatures extends MapGenStructure { ComponentNTMFeatures.NTMWorkshop1 workshop1 = new ComponentNTMFeatures.NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(workshop1); } + } else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextBoolean()) { + MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg } else { //Everything else if(rand.nextBoolean()) { ComponentNTMFeatures.NTMLab2 lab2 = new ComponentNTMFeatures.NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); @@ -140,8 +148,14 @@ public class MapGenNTMFeatures extends MapGenStructure { } } - if(GeneralConfig.enableDebugMode) - System.out.print("[Debug] StructureStart at " + (chunkX * 16 + 8) + ", " + posY + ", " + (chunkZ * 16 + 8) + "\n"); + if(GeneralConfig.enableDebugMode) { + System.out.print("[Debug] StructureStart at " + (chunkX * 16 + 8) + ", " + posY + ", " + (chunkZ * 16 + 8) + "\n[Debug] Components: "); + this.components.forEach((component) -> { + System.out.print(MapGenStructureIO.func_143036_a((StructureComponent) component) + " "); + }); + + System.out.print("\n"); + } this.updateBoundingBox(); } diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java new file mode 100644 index 000000000..0ffce977c --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -0,0 +1,326 @@ +package com.hbm.world.worldgen.components; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockBobble.BobbleType; +import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; +import com.hbm.tileentity.machine.storage.TileEntityCrateIron; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemDoor; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; +import net.minecraft.world.gen.structure.StructureComponent; + +abstract public class Feature extends StructureComponent { + /** The size of the bounding box for this feature in the X axis */ + protected int sizeX; + /** The size of the bounding box for this feature in the Y axis */ + protected int sizeY; + /** The size of the bounding box for this feature in the Z axis */ + protected int sizeZ; + /** Average height (Presumably stands for height position) */ + protected int hpos = -1; + + protected Feature() { + super(0); + } + + protected Feature(Random rand, int minX, int minY, int minZ, int maxX, int maxY, int maxZ ) { + super(0); + this.sizeX = maxX; + this.sizeY = maxY; + this.sizeZ = maxZ; + this.coordBaseMode = rand.nextInt(4); + + switch(this.coordBaseMode) { + case 0: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + break; + case 1: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); + break; + case 2: + //North (2) and East (3) will result in mirrored structures. Not an issue, but keep in mind. + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + break; + case 3: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + break; + default: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + + } + } + + /** Set to NBT */ + protected void func_143012_a(NBTTagCompound nbt) { + nbt.setInteger("Width", this.sizeX); + nbt.setInteger("Height", this.sizeY); + nbt.setInteger("Depth", this.sizeZ); + nbt.setInteger("HPos", this.hpos); + } + + /** Get from NBT */ + protected void func_143011_b(NBTTagCompound nbt) { + this.sizeX = nbt.getInteger("Width"); + this.sizeY = nbt.getInteger("Height"); + this.sizeZ = nbt.getInteger("Depth"); + this.hpos = nbt.getInteger("HPos"); + } + + protected boolean setAverageHeight(World world, StructureBoundingBox box, int y) { + + int total = 0; + int iterations = 0; + + for(int z = this.boundingBox.minZ; z <= this.boundingBox.maxZ; z++) { + for(int x = this.boundingBox.minX; x <= this.boundingBox.maxX; x++) { + if(box.isVecInside(x, y, z)) { + total += Math.max(world.getTopSolidOrLiquidBlock(x, z), world.provider.getAverageGroundLevel()); + iterations++; + } + } + } + + if(iterations == 0) + return false; + + this.hpos = total / iterations; //finds mean of every block in bounding box + this.boundingBox.offset(0, this.hpos - this.boundingBox.minY, 0); + return true; + } + + /** Metadata for Decoration Methods **/ + + /** + * Gets metadata for rotatable pillars. + * @param metadata (First two digits are equal to block metadata, other two are equal to orientation + * @return metadata adjusted for random orientation + */ + protected int getPillarMeta(int metadata) { + if(this.coordBaseMode % 2 != 0 && this.coordBaseMode != -1) + metadata = metadata ^ 12; + + return metadata; + } + + /** + * Gets metadata for rotatable DecoBlock + * honestly i don't remember how i did this and i'm scared to optimize it because i fail to see any reasonable patterns like the pillar + * seriously, 3 fucking bits for 4 orientations when you can do it easily with 2? + * @param metadata (2 for facing South, 3 for facing North, 4 for facing East, 5 for facing West + */ + protected int getDecoMeta(int metadata) { + switch(this.coordBaseMode) { + case 0: //South + switch(metadata) { + case 2: return 2; + case 3: return 3; + case 4: return 4; + case 5: return 5; + } + case 1: //West + switch(metadata) { + case 2: return 5; + case 3: return 4; + case 4: return 2; + case 5: return 3; + } + case 2: //North + switch(metadata) { + case 2: return 3; + case 3: return 2; + case 4: return 4; + case 5: return 5; + } + case 3: //East + switch(metadata) { + case 2: return 4; + case 3: return 5; + case 4: return 2; + case 5: return 3; + } + } + return 0; + } + + /** + * Places door at specified location with orientation-adjusted meta + * don't ask me which directions are what (take direction such as South/0 and add 1) + */ + protected void placeDoor(World world, StructureBoundingBox box, Block door, int direction, int featureX, int featureY, int featureZ) { + int meta = getMetadataWithOffset(Blocks.wooden_door, direction); + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + this.placeBlockAtCurrentPosition(world, door, meta, featureX, featureY, featureZ, box); + ItemDoor.placeDoorBlock(world, posX, posY, posZ, meta, door); + } + + /** Loot Methods **/ + + /** + * it feels disgusting to make a method with this many parameters but fuck it, it's easier + * @return TE implementing IInventory with randomized contents + */ + protected boolean generateInvContents(World world, StructureBoundingBox box, Random rand, Block block, int featureX, int featureY, int featureZ, WeightedRandomChestContent[] content, int amount) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + this.placeBlockAtCurrentPosition(world, block, 0, featureX, featureY, featureZ, box); + IInventory inventory = (IInventory)world.getTileEntity(posX, posY, posZ); + + if(inventory != null) { + WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount); + return true; + } + + return false; + } + + /** + * Places random bobblehead with a randomized orientation at specified location + */ + protected void placeRandomBobble(World world, StructureBoundingBox box, Random rand, int featureX, int featureY, int featureZ) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureX, featureY, featureZ, box); + TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(posX, posY, posZ); + + if(bobble != null) { + bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; + bobble.markDirty(); + } + } + + /** Block Placement Utility Methods **/ + + /** + * Places blocks underneath location until reaching a solid block; good for foundations + */ + protected void placeFoundationUnderneath(World world, Block placeBlock, int meta, int featureX, int featureY, int featureZ, StructureBoundingBox box) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + if(box.isVecInside(posX, posY, posZ)) { + Block block = world.getBlock(posX, posY, posZ); + + while ((world.isAirBlock(posX, posY, posZ) || !block.getMaterial().isSolid() || (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && posY > 1) { + world.setBlock(posX, posY, posZ, placeBlock, meta, 2); + block = world.getBlock(posX, --posY, posZ); + } + } + } + + /** + * Places specified blocks on top of pre-existing blocks in a given area, up to a certain height. Does NOT place blocks on top of liquids. + * Useful for stuff like fences and walls most likely. + */ + protected void placeBlocksOnTop(World world, StructureBoundingBox box, Block block, int minX, int minZ, int maxX, int maxZ, int height) { + + for(int x = minX; x <= maxX; x++) { + for(int z = minZ; z <= maxZ; z++) { + int posX = this.getXWithOffset(x, z); + int posZ = this.getZWithOffset(x, z); + int topHeight = world.getTopSolidOrLiquidBlock(posX, posZ); + + if(!world.getBlock(posX, topHeight, posZ).getMaterial().isLiquid()) { + + for(int i = 0; i < height; i++) { + int posY = topHeight + i; + + world.setBlock(posX, posY, posZ, block, 0, 2); + } + } + } + } + } + + /** Block Selectors **/ + + static class Sandstone extends StructureComponent.BlockSelector { + + Sandstone() { } + + /** Selects blocks */ + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { + float chance = rand.nextFloat(); + + if(chance > 0.6F) { + this.field_151562_a = Blocks.sandstone; + } else if (chance < 0.5F ) { + this.field_151562_a = ModBlocks.reinforced_sand; + } else { + this.field_151562_a = Blocks.sand; + } + } + } + + static class ConcreteBricks extends StructureComponent.BlockSelector { + + ConcreteBricks() { } + + /** Selects blocks */ + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { + float chance = rand.nextFloat(); + + if(chance < 0.2F) { + this.field_151562_a = ModBlocks.brick_concrete; + } else if (chance < 0.55F) { + this.field_151562_a = ModBlocks.brick_concrete_mossy; + } else if (chance < 0.75F) { + this.field_151562_a = ModBlocks.brick_concrete_cracked; + } else { + this.field_151562_a = ModBlocks.brick_concrete_broken; + } + } + } + + //ag + static class LabTiles extends StructureComponent.BlockSelector { + + LabTiles() { } + + /** Selects blocks */ + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { + float chance = rand.nextFloat(); + + if(chance < 0.5F) { + this.field_151562_a = ModBlocks.tile_lab; + } else if (chance < 0.9F) { + this.field_151562_a = ModBlocks.tile_lab_cracked; + } else { + this.field_151562_a = ModBlocks.tile_lab_broken; + } + } + } + + static class SuperConcrete extends StructureComponent.BlockSelector { + + SuperConcrete() { + this.field_151562_a = ModBlocks.concrete_super; + } + + /** Selects blocks */ + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { + this.selectedBlockMetaData = rand.nextInt(6) + 10; + } + } + +} diff --git a/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java b/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java new file mode 100644 index 000000000..49bf2cad6 --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java @@ -0,0 +1,186 @@ +package com.hbm.world.worldgen.components; + +import java.util.LinkedList; +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.world.worldgen.ComponentNTMFeatures; + +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; + +public class MilitaryBaseFeatures { + + //stop-gap methods until this entire mess can be organized into proper classes/structure groups + public static void smallHelipad(LinkedList components, int chunkX, int posY, int chunkZ, Random rand) { + BasicHelipad helipad = new BasicHelipad(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + int[] chunkPos = getAdjacentChunk(chunkX, chunkZ, rand); + + RadioShack radio = new RadioShack(rand, chunkPos[0] * 16 + 8, posY, chunkPos[1] * 16 + 8); + components.add(helipad); + components.add(radio); + } + + public static int[] getAdjacentChunk(int chunkX, int chunkZ, Random rand) { + int[] chunkPos = new int[2]; + + switch(rand.nextInt(4)) { + case 0: + chunkPos[0] = chunkX; + chunkPos[1] = chunkZ + 1; + break; + case 1: + chunkPos[0] = chunkX - 1; + chunkPos[1] = chunkZ; + break; + case 2: + chunkPos[0] = chunkX; + chunkPos[1] = chunkZ - 1; + break; + case 3: + chunkPos[0] = chunkX + 1; + chunkPos[1] = chunkZ; + break; + } + + return chunkPos; + } + + public static class BasicHelipad extends Feature { + + public BasicHelipad() { super(); } + + protected BasicHelipad(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 12, 0, 12); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return true; + } + + this.boundingBox.offset(0, -1, 0); + + for(int i = 1; i < sizeX; i++) { + for(int j = 1; j < sizeZ; j++) { + func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); + clearCurrentPositionBlocksUpwards(world, i, 1, j, box); + } + } + + for(int i = 0; i <= sizeX; i++) { + for(int j = 0; j <= sizeZ; j++) { + if(i == 0 || i == sizeX || j == 0 || j == sizeX) + func_151554_b(world, Blocks.stonebrick, 0, i, 0, j, box); + } + } + + //Helipad + fillWithBlocks(world, box, 1, 0, 1, 11, 0, 1, ModBlocks.concrete, Blocks.air, false); //this entire time, the second block was actually for anything not at min/max x's, y's, and z's. useful! + fillWithBlocks(world, box, 11, 0, 2, 11, 0, 11, ModBlocks.concrete, Blocks.air, false); + fillWithBlocks(world, box, 1, 0, 11, 10, 0, 11, ModBlocks.concrete, Blocks.air, false); + fillWithBlocks(world, box, 1, 0, 2, 1, 0, 10, ModBlocks.concrete, Blocks.air, false); + + fillWithBlocks(world, box, 2, 0, 2, 10, 0, 10, ModBlocks.concrete_smooth, Blocks.air, false); //i'm not carefully carving out the white H lmao fuck that + fillWithBlocks(world, box, 4, 0, 4, 4, 0, 8, ModBlocks.concrete_colored, Blocks.air, false); //white is 0 + fillWithBlocks(world, box, 8, 0, 4, 8, 0, 8, ModBlocks.concrete_colored, Blocks.air, false); + fillWithBlocks(world, box, 5, 0, 6, 7, 0, 6, ModBlocks.concrete_colored, Blocks.air, false); + + //Surrounding Fences + placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, 0, sizeX, 0, 1); + placeBlocksOnTop(world, box, ModBlocks.fence_metal, sizeX, 1, sizeX, sizeZ, 1); + placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, sizeZ, sizeX - 1, sizeZ, 1); + placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, 1, 0, sizeZ - 1, 1); + + return false; + } + + } + + public static class RadioShack extends Feature { + + private static LabTiles RandomLabTiles = new LabTiles(); + private static ConcreteBricks ConcreteBricks = new ConcreteBricks(); + + public RadioShack() { super(); } + + protected RadioShack(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 6, 4, 5); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return true; + } + + this.boundingBox.offset(0, -1, 0); + + for(int i = 1; i <= sizeX; i++) { + for(int j = 1; j <= sizeZ; j++) { + func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); + } + } + + func_151554_b(world, Blocks.stonebrick, 0, 0, 0, 2, box); + + //Floor & Foundation + fillWithRandomizedBlocks(world, box, 2, 0, 1, 5, 0, 4, false, rand, RandomLabTiles); + placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 1, 0, 1, box); + placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, sizeX, 0, 1, box); + placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 1, 0, sizeZ, box); + placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, sizeX, 0, sizeZ, box); + fillWithBlocks(world, box, 2, 0, 1, sizeX - 1, 0, 1, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, 2, 0, 0, sizeX - 1, 0, 0, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, sizeX, 0, 2, sizeX, 0, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, 2, 0, sizeZ, sizeX - 1, 0, sizeZ, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, 1, 0, 2, 1, 0, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false); + + //Back Wall + fillWithRandomizedBlocks(world, box, 1, 1, 1, 2, sizeY - 1, 1, false, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 2, 1, 0, 5, sizeY - 1, 0, false, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 5, 1, 1, sizeX, sizeY - 1, 1, false, rand, ConcreteBricks); + //Front Wall + fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 2, sizeY - 1, sizeZ, false, rand, ConcreteBricks); + placeBlockAtCurrentPosition(world, ModBlocks.brick_concrete, 0, 3, sizeY - 1, sizeZ, box); + fillWithRandomizedBlocks(world, box, 4, 1, sizeZ, sizeX, sizeY - 1, sizeZ, false, rand, ConcreteBricks); + placeDoor(world, box, ModBlocks.door_metal, 3, 3, 1, sizeZ); + //Left & Right Wall + fillWithRandomizedBlocks(world, box, 1, 1, 2, 1, sizeY - 1, sizeZ - 1, false, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 1, 2, sizeX, sizeY - 1, sizeZ - 1, false, rand, ConcreteBricks); + placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, 1, 2, 3, box); + placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, sizeX, 2, 2, box); + placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, sizeX, 2, 4, box); + //Ceiling + fillWithBlocks(world, box, 3, sizeY - 1, 1, 4, sizeY - 1, 1, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, 2, sizeY - 1, 2, sizeX - 1, sizeY - 1, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false); + + fillWithAir(world, box, 2, 1, 2, sizeX - 1, 2, sizeZ - 1); + + //Decoration + int southMeta = getDecoMeta(2); + int northMeta = getDecoMeta(3); //all of these deco blocks are so inconsistent about what their directions actually are + int eastMeta = getDecoMeta(4); + fillWithMetadataBlocks(world, box, 2, 1, 2, 5, 1, 2, ModBlocks.steel_grate, 7, null, 0, false); //null should be okay here + fillWithBlocks(world, box, 3, 1, 1, 4, 1, 1, ModBlocks.deco_tungsten, null, false); + fillWithMetadataBlocks(world, box, 3, 2, 1, 4, 2, 1, ModBlocks.tape_recorder, northMeta, null, 0, false); + placeBlockAtCurrentPosition(world, ModBlocks.radiorec, southMeta, 2, 2, 2, box); + placeRandomBobble(world, box, rand, sizeX - 1, 2, 2); + fillWithMetadataBlocks(world, box, sizeX - 1, 1, 3, sizeX - 1, 2, 3, ModBlocks.tape_recorder, eastMeta, null, 0, false); + //OutsideDeco + fillWithMetadataBlocks(world, box, 0, 1, 2, 0, 2, 2, ModBlocks.steel_poles, eastMeta, null, 0, false); + placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 0, sizeY - 1, 2, box); + fillWithBlocks(world, box, 0, sizeY, 2, sizeX - 1, sizeY, 2, ModBlocks.steel_roof, null, false); + placeBlockAtCurrentPosition(world, ModBlocks.steel_roof, 0, sizeX - 1, sizeY, 3, box); + + return false; + } + + } + + +} From 5f4c6469c44a70b8142f43f41ef4fc284540f195 Mon Sep 17 00:00:00 2001 From: Vaern Date: Fri, 2 Sep 2022 22:19:04 -0700 Subject: [PATCH 049/111] Organized structure classes, added config for structures and loot within tomorrow we got the epic looking computer deco block coming in it's freaking amazing gamers see you on the battlebus --- .../java/com/hbm/config/CommonConfig.java | 1 + .../java/com/hbm/config/StructureConfig.java | 37 + src/main/java/com/hbm/lib/HbmWorld.java | 22 +- src/main/java/com/hbm/main/MainRegistry.java | 1 + .../world/worldgen/ComponentNTMFeatures.java | 1397 ----------------- .../hbm/world/worldgen/MapGenNTMFeatures.java | 26 +- .../hbm/world/worldgen/NTMWorldGenerator.java | 6 +- .../worldgen/components/CivilianFeatures.java | 761 +++++++++ .../world/worldgen/components/Feature.java | 2 + .../components/MilitaryBaseFeatures.java | 5 +- .../worldgen/components/RuinFeatures.java | 279 ++++ 11 files changed, 1122 insertions(+), 1415 deletions(-) create mode 100644 src/main/java/com/hbm/config/StructureConfig.java delete mode 100644 src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java create mode 100644 src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java create mode 100644 src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java diff --git a/src/main/java/com/hbm/config/CommonConfig.java b/src/main/java/com/hbm/config/CommonConfig.java index 2cbbab121..57495b68a 100644 --- a/src/main/java/com/hbm/config/CommonConfig.java +++ b/src/main/java/com/hbm/config/CommonConfig.java @@ -21,6 +21,7 @@ public class CommonConfig { public static final String CATEGORY_MOBS = "12_mobs"; public static final String CATEGORY_RADIATION = "13_radiation"; public static final String CATEGORY_HAZARD = "14_hazard"; + public static final String CATEGORY_STRUCTURES = "15_structures"; public static final String CATEGORY_528 = "528"; public static final String CATEGORY_LBSM = "LESS BULLSHIT MODE"; diff --git a/src/main/java/com/hbm/config/StructureConfig.java b/src/main/java/com/hbm/config/StructureConfig.java new file mode 100644 index 000000000..2f22d7281 --- /dev/null +++ b/src/main/java/com/hbm/config/StructureConfig.java @@ -0,0 +1,37 @@ +package com.hbm.config; + +import com.hbm.main.MainRegistry; + +import net.minecraftforge.common.config.Configuration; + +public class StructureConfig { + + public static boolean enableStructures = true; + + public static int structureMinChunks = 8; + public static int structureMaxChunks = 24; + + public static double lootAmountFactor = 1D; + + public static void loadFromConfig(Configuration config) { + + final String CATEGORY_STRUCTURES = CommonConfig.CATEGORY_STRUCTURES; + enableStructures = CommonConfig.createConfigBool(config, CATEGORY_STRUCTURES, "5.00_enableStructures", "Switch for whether structures using the MapGenStructure system spawn.", true); + + 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); + + lootAmountFactor = CommonConfig.createConfigDouble(config, CATEGORY_STRUCTURES, "5.03_lootAmountFactor", "General factor for loot spawns. Applies to spawned IInventories, not loot blocks.", 1D); + + structureMinChunks = CommonConfig.setDef(structureMinChunks, 8); + structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 24); + + if(structureMinChunks > structureMaxChunks) { + MainRegistry.logger.error("Fatal error config: Minimum value has been set higher than the maximum value!"); + MainRegistry.logger.error(String.format("Errored values will default back to %1$d and %2$d respectively, PLEASE REVIEW CONFIGURATION DESCRIPTION BEFORE MEDDLING WITH VALUES!", 8, 24)); + structureMinChunks = 8; + structureMaxChunks = 24; + } + + } +} diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index 242899b3e..69294f45c 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -1,8 +1,10 @@ package com.hbm.lib; -import com.hbm.world.worldgen.ComponentNTMFeatures; import com.hbm.world.worldgen.MapGenNTMFeatures; import com.hbm.world.worldgen.NTMWorldGenerator; +import com.hbm.world.worldgen.components.CivilianFeatures.*; +import com.hbm.world.worldgen.components.MilitaryBaseFeatures.*; +import com.hbm.world.worldgen.components.RuinFeatures.*; import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.registry.GameRegistry; @@ -19,7 +21,7 @@ public class HbmWorld { //MapGenStructureIO.registerStructure(StructureStartTest.class, "HFR_STRUCTURE"); //MapGenStructureIO.func_143031_a(StructureComponentTest.class, "HFR_COMPONENT"); MapGenStructureIO.registerStructure(MapGenNTMFeatures.Start.class, "NTMFeatures"); - ComponentNTMFeatures.registerNTMFeatures(); + registerNTMFeatures(); registerWorldGen(new HbmWorldGen(), 1); registerWorldGen(new NTMWorldGenerator(), 1); //Ideally, move everything over from HbmWorldGen to NTMWorldGenerator @@ -29,4 +31,20 @@ public class HbmWorld { public static void registerWorldGen(IWorldGenerator nukerWorldGen, int weightedProbability) { GameRegistry.registerWorldGenerator(nukerWorldGen, weightedProbability); } + + /** Register structures in MapGenStructureIO */ + public static void registerNTMFeatures() { + MapGenStructureIO.func_143031_a(NTMHouse1.class, "NTMHouse1"); + MapGenStructureIO.func_143031_a(NTMHouse2.class, "NTMHouse2"); + MapGenStructureIO.func_143031_a(NTMLab1.class, "NTMLab1"); + MapGenStructureIO.func_143031_a(NTMLab2.class, "NTMLab2"); + MapGenStructureIO.func_143031_a(NTMWorkshop1.class, "NTMWorkshop1"); + 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"); + //aggggggggggg + MapGenStructureIO.func_143031_a(BasicHelipad.class, "NTMBasicHelipad"); + MapGenStructureIO.func_143031_a(RadioShack.class, "NTMRadioShack"); + } } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index e671273f5..615c78c47 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -863,6 +863,7 @@ public class MainRegistry { ToolConfig.loadFromConfig(config); WeaponConfig.loadFromConfig(config); MobConfig.loadFromConfig(config); + StructureConfig.loadFromConfig(config); try { if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.Thermos") != null) { diff --git a/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java deleted file mode 100644 index 49b292dbd..000000000 --- a/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java +++ /dev/null @@ -1,1397 +0,0 @@ -package com.hbm.world.worldgen; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockBobble.BobbleType; -import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; -import com.hbm.lib.HbmChestContents; -import com.hbm.tileentity.machine.storage.TileEntityCrateIron; -import com.hbm.util.LootGenerator; -import com.hbm.world.worldgen.components.MilitaryBaseFeatures; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemDoor; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.MapGenStructureIO; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import scala.reflect.internal.Trees.This; - -//TODO: -//KILL! -//Probably one of the more difficult parts. -/** Base component file. For structure generation under 32x32 blocks, as Minecraft generates 2x2 chunks for structures. - * Larger non-procedural structures should be split up into several bounding boxes, which check if they intersect the chunk bounding box currently being loaded. Doing so will prevent - * cascading world generation. See - * - * TheMasterCaver's advice. */ -public class ComponentNTMFeatures { - - /** Register structures in MapGenStructureIO */ - public static void registerNTMFeatures() { - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMHouse1.class, "NTMHouse1"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMHouse2.class, "NTMHouse2"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMLab1.class, "NTMLab1"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMLab2.class, "NTMLab2"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMWorkshop1.class, "NTMWorkshop1"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin1.class, "NTMRuin1"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin2.class, "NTMRuin2"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin3.class, "NTMRuin3"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin4.class, "NTMRuin4"); - //aggggggggggg - MapGenStructureIO.func_143031_a(MilitaryBaseFeatures.BasicHelipad.class, "NTMBasicHelipad"); - MapGenStructureIO.func_143031_a(MilitaryBaseFeatures.RadioShack.class, "NTMRadioShack"); - } - - /** Sandstone Ruin 1 */ - public static class NTMHouse1 extends ComponentNTMFeatures.Feature { - - private boolean hasPlacedChest; - - private static ComponentNTMFeatures.Sandstone RandomSandstone = new ComponentNTMFeatures.Sandstone(); - - public NTMHouse1() { - super(); - } - - /** Constructor for this feature; takes coordinates for bounding box */ - protected NTMHouse1(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 9, 4, 6); - this.hasPlacedChest = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasChest", this.hasPlacedChest); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedChest = nbt.getBoolean("hasChest"); - } - - /** - * Generates structures. - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - /* - * Places block at current position. Dependent on coordinate mode, i.e. will allow for random rotation, so use this instead of setBlock! - * this.placeBlockAtCurrentPosition(world, block, minX, metadata, x, y, z, box); - * Fills an area with air, self-explanatory. Use to clear interiors of unwanted blocks. - * this.fillWithAir(world, box, minX, minY, minZ, maxX, maxY, maxZ); - * Fills an area with blocks, self-explanatory. - * this.fillWithBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace); - * Fills an area with metadata blocks, self-explanatory. - * this.fillWithMetadataBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockPlaceMeta, blockToReplace, replaceBlockMeta, alwaysReplace); - * Fills an area with randomized blocks, self-explanatory. - * this.fillWithRandomizedBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, alwaysReplace, rand, StructureComponent.blockSelector); - * (BlockSelector is basically a list of blocks that can be randomly picked, except that it can actually be weighted) - * Replaces any air or water blocks with this block down. Useful for foundations - * this.func_151554_b(world, block, metadata, x, startAtY, z, box - * Fills an area with blocks randomly - look into randLimit? - * this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace); - */ - - //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); - - for(byte i = 0; i < this.featureSizeX + 1; i++) { - for(byte j = 0; j < this.featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } - - //Walls - this.fillWithRandomizedBlocks(world, box, 0, 0, 0, featureSizeX, 0, 0, false, rand, RandomSandstone); //Back Wall - this.fillWithRandomizedBlocks(world, box, 0, 1, 0, 1, 1, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 1, 0, box); - this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 5, 1, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, 1, 0, box); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 7, 1, 0, box); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 0, featureSizeX, 1, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 0, 2, 0, featureSizeX - 2, 2, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 0, 1, featureSizeZ, false, rand, RandomSandstone); //Left Wall - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 0, 2, 1, box); - this.fillWithMetadataBlocks(world, box, 0, 2, 3, 0, 2, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, 1, 1, featureSizeZ, false, rand, RandomSandstone); //Front Wall - this.fillWithRandomizedBlocks(world, box, 3, 0, featureSizeZ, featureSizeX, 1, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 1, 2, featureSizeZ, 3, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithMetadataBlocks(world, box, 4, 2, featureSizeZ, 5, 2, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX - 2, 2, featureSizeZ, box); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 0, featureSizeX, 0, featureSizeZ, false, rand, RandomSandstone); //Right Wall - this.randomlyFillWithBlocks(world, box, rand, 0.65F, featureSizeX, 1, 1, featureSizeX, 1, featureSizeZ - 1, Blocks.sand, Blocks.air, false); - - this.fillWithRandomizedBlocks(world, box, 4, 0, 1, 4, 1, 3, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, ModBlocks.reinforced_sand, 0, 4, 0, 4, box); - - //Loot/Sand - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 1, 0, 1, box); - if(!this.hasPlacedChest) - this.hasPlacedChest = this.generateStructureChestContents(world, box, rand, 3, 0, 1, HbmChestContents.modGeneric, rand.nextInt(2) + 8); - this.fillWithBlocks(world, box, 5, 0, 1, 6, 0, 1, ModBlocks.crate, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, Blocks.sand, 0, 7, 0, 1, box); - if(rand.nextFloat() <= 0.25) - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_metal, 0, featureSizeX - 1, 0, 1, box); - this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 2, 3, 0, featureSizeZ - 1, Blocks.sand, Blocks.air, false); - this.randomlyFillWithBlocks(world, box, rand, 0.25F, 5, 0, 2, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.sand, Blocks.air, false); - - return true; - } - - } - - public static class NTMHouse2 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.Sandstone RandomSandstone = new ComponentNTMFeatures.Sandstone(); - - private boolean[] hasPlacedLoot = new boolean[2]; - - public NTMHouse2() { - super(); - } - - protected NTMHouse2(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 15, 5, 9); - this.hasPlacedLoot[0] = false; - this.hasPlacedLoot[1] = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); - nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); - this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - //System.out.print(this.coordBaseMode); - if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < 7; i++) { - for(byte j = 0; j < this.featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } - - for(byte i = 9; i < this.featureSizeX + 1; i++) { - for(byte j = 0; j < this.featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } - - this.fillWithAir(world, box, 1, 0, 1, 5, featureSizeY, featureSizeZ - 1); - - //House 1 - this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 6, 1, 0, false, rand, RandomSandstone); //Back Wall - this.fillWithRandomizedBlocks(world, box, 0, 2, 0, 1, 2, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 2, 0, box); - this.fillWithRandomizedBlocks(world, box, 3, 2, 0, 3, 2, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 4, 2, 0, box); - this.fillWithRandomizedBlocks(world, box, 5, 2, 0, 6, 2, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 0, 3, 0, 6, 3, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 3, featureSizeZ, false, rand, RandomSandstone); //Left Wall - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, 6, 1, featureSizeZ, false, rand, RandomSandstone); //Front Wall - this.fillWithRandomizedBlocks(world, box, 1, 2, featureSizeZ, 1, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithBlocks(world, box, 2, 2, featureSizeZ, 4, 2, featureSizeZ, Blocks.fence, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 5, 2, featureSizeZ, 6, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 1, 3, featureSizeZ, 6, 3, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 6, 0, featureSizeZ - 1, 6, 3, featureSizeZ - 1, false, rand, RandomSandstone); //Right Wall - this.fillWithRandomizedBlocks(world, box, 6, 0, featureSizeZ - 2, 6, 0, featureSizeZ - 2, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 6, 3, featureSizeZ - 2, 6, 3, featureSizeZ - 2, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 6, 0, 1, 6, 3, featureSizeZ - 3, false, rand, RandomSandstone); - - this.fillWithBlocks(world, box, 1, 0, 1, 5, 0, featureSizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor - //this.fillWithRandomizedBlocks(world, box, 1, featureSizeY - 1, 0, 5, featureSizeY - 1, featureSizeZ, false, rand, RandomSandstone); //Ceiling - this.fillWithBlocks(world, box, 1, featureSizeY - 1, 0, 5, featureSizeY - 1, featureSizeZ, Blocks.sandstone, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 0, featureSizeY - 1, 0, 0, featureSizeY - 1, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); //Roof - this.fillWithMetadataBlocks(world, box, 6, featureSizeY - 1, 0, 6, featureSizeY - 1, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 2, featureSizeY, 0, 4, featureSizeY, 0, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 3, featureSizeY, 1, 3, featureSizeY, 2, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 3, featureSizeY, 4, 3, featureSizeY, 6, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 3, featureSizeY, featureSizeZ - 1, box); - this.fillWithMetadataBlocks(world, box, 2, featureSizeY, featureSizeZ, 4, featureSizeY, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); - - //House 2 - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 0, featureSizeX, 0, 0, false, rand, RandomSandstone); //Back Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 1, 0, featureSizeX - 2, 1, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 2, 0, featureSizeX - 6, 2, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX - 6, 2, 0, box); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX - 3, 2, 0, box); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 1, featureSizeX - 6, 3, 1, false, rand, RandomSandstone); //Left Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 2, featureSizeX - 6, 0, 2, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 3, 2, featureSizeX - 6, 3, featureSizeZ - 1, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX - 6, featureSizeY - 1, 2, box); - this.fillWithMetadataBlocks(world, box, featureSizeX - 6, featureSizeY - 1, 4, featureSizeX - 6, featureSizeY - 1, featureSizeZ - 2, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 3, featureSizeX - 6, 1, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 2, featureSizeX - 6, 0, 2, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 2, 3, featureSizeX - 6, 2, 3, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, featureSizeX - 6, 2, 4, box); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 2, 5, featureSizeX - 6, 2, 5, false, rand, RandomSandstone); - this.fillWithBlocks(world, box, featureSizeX - 6, 2, featureSizeZ - 3, featureSizeX - 6, 2, featureSizeZ - 2, Blocks.fence, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 2, featureSizeZ - 1, featureSizeX - 6, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 5, 0, featureSizeZ, featureSizeX, 1, featureSizeZ, false, rand, RandomSandstone); //Front Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX - 5, 2, featureSizeZ, featureSizeX - 5, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 2, featureSizeZ, featureSizeX, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 0, featureSizeZ - 1, false, rand, RandomSandstone); //Right Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 3, featureSizeX, 1, 3, false, rand, RandomSandstone); - this.fillWithMetadataBlocks(world, box, featureSizeX, 1, 4, featureSizeX, 1, 5, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, featureSizeZ - 1, featureSizeX, 1, featureSizeZ - 3, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX, 1, featureSizeZ - 1, box); - - this.fillWithBlocks(world, box, featureSizeX - 5, 0, 1, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor - - //Loot & Decorations - //House 1 - int eastMeta = this.getDecoMeta(4); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_boiler_off, 4, 1, 1, 1, box); - this.fillWithBlocks(world, box, 1, 2, 1, 1, 3, 1, ModBlocks.deco_pipe_quad_rusted, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.deco_pipe_rim_rusted, 0, 1, featureSizeY, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 2, 1, 3, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, 1, 1, featureSizeZ - 4, box); - if(!hasPlacedLoot[0]) { - this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), 1, 1, featureSizeZ - 2, box); - WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.machineParts, (TileEntityChest)world.getTileEntity(this.getXWithOffset(1, featureSizeZ - 2), - this.getYWithOffset(1), this.getZWithOffset(1, featureSizeZ - 2)), 10); - this.hasPlacedLoot[0] = true; - } - this.fillWithBlocks(world, box, 4, 1, featureSizeZ - 1, 5, 1, featureSizeZ - 1, ModBlocks.crate, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 5, 1, 4, 5, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 5, 1, 6, 5, 3, 6, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.steel_grate, 7, 5, 1, 5, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 5, 2, 5, box); - - //House 2 - if(!hasPlacedLoot[1]) { - this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), featureSizeX - 5, 1, 1, box); - WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.antenna, (TileEntityChest)world.getTileEntity(this.getXWithOffset(featureSizeX - 5, 1), - this.getYWithOffset(1), this.getZWithOffset(featureSizeX - 5, 1)), 10); - this.hasPlacedLoot[1] = true; - } - this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureSizeX - 5, 1, 4, box); - TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(featureSizeX - 5, 4), this.getYWithOffset(1), this.getZWithOffset(featureSizeX - 5, 4)); - - if(bobble != null) { - bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; - bobble.markDirty(); - } - - this.randomlyFillWithBlocks(world, box, rand, 0.25F, featureSizeX - 4, 1, 1, featureSizeX - 1, 1, featureSizeZ - 1, Blocks.sand, Blocks.air, false); - - return true; - } - } - - public static class NTMLab1 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - private static ComponentNTMFeatures.LabTiles RandomLabTiles = new ComponentNTMFeatures.LabTiles(); - - private boolean[] hasPlacedLoot = new boolean[2]; - - public NTMLab1() { - super(); - } - - /** Constructor for this feature; takes coordinates for bounding box */ - protected NTMLab1(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 9, 4, 7); - this.hasPlacedLoot[0] = false; - this.hasPlacedLoot[1] = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); - nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); - this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); - } - - @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); - - for(byte i = 0; i < this.featureSizeX + 1; i++) { - for(byte j = 0; j < this.featureSizeZ - 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - for(byte i = 3; i < this.featureSizeX + 1; i++) { - for(byte j = 6; j < this.featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - int stairsMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 0); - if(this.getBlockAtCurrentPosition(world, 2, 0, featureSizeZ - 1, box).getMaterial().isReplaceable() - || this.getBlockAtCurrentPosition(world, 2, 0, featureSizeZ - 1, box) == Blocks.air) { - this.func_151554_b(world, Blocks.stonebrick, 0, 2, -1, featureSizeZ - 1, box); - this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairsMeta, 2, 0, featureSizeZ - 1, box); - } - - this.fillWithAir(world, box, 1, 0, 1, featureSizeX - 1, featureSizeY, 4); - this.fillWithAir(world, box, 4, 0, 4, featureSizeX - 1, featureSizeY, featureSizeZ - 1); - this.fillWithAir(world, box, 3, 1, featureSizeZ - 1, 3, 2, featureSizeZ - 1); - - int pillarMeta = this.getPillarMeta(8); - - //Pillars - this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, featureSizeX, 0, 0, featureSizeX, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, 4, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 0, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false); - this.fillWithBlocks(world, box, 0, 0, featureSizeZ - 2, 0, 3, featureSizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, 3, 0, featureSizeZ - 2, 3, 3, featureSizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, 3, 0, featureSizeZ, 3, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - - //Walls - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, featureSizeX - 1, featureSizeY - 1, 0, false, rand, RandomConcreteBricks); //Back Wall - this.fillWithRandomizedBlocks(world, box, 0, featureSizeY, 0, featureSizeX, featureSizeY, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, featureSizeY - 1, 4, false, rand, RandomConcreteBricks); //Left Wall - this.fillWithRandomizedBlocks(world, box, 0, featureSizeY, 0, 0, featureSizeY, featureSizeZ - 2, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ - 2, 2, featureSizeY, featureSizeZ - 2, false, rand, RandomConcreteBricks); //Front Wall Pt. 1 - this.placeBlockAtCurrentPosition(world, ModBlocks.brick_concrete_broken, 0, 3, featureSizeY, featureSizeZ - 2, box); - this.fillWithRandomizedBlocks(world, box, 3, featureSizeY - 1, featureSizeZ - 1, 3, featureSizeY, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 4, 0, featureSizeZ, featureSizeX - 1, 1, featureSizeZ, false, rand, RandomConcreteBricks); //Front Wall Pt. 2 - this.fillWithRandomizedBlocks(world, box, 4, 2, featureSizeZ, 4, 3, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 2, featureSizeZ, featureSizeX - 1, 3, featureSizeZ, false, rand, RandomConcreteBricks); - this.randomlyFillWithBlocks(world, box, rand, 0.75F, 5, 2, featureSizeZ, featureSizeX - 2, 3, featureSizeZ, Blocks.glass_pane, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 3, featureSizeY, featureSizeZ, featureSizeX, featureSizeY, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 1, featureSizeX, featureSizeY, featureSizeZ - 1, false, rand, RandomConcreteBricks); //Right Wall - - //Floor & Ceiling - this.fillWithRandomizedBlocks(world, box, 1, 0, 1, featureSizeX - 1, 0, 4, false, rand, RandomLabTiles); //Floor - this.fillWithRandomizedBlocks(world, box, 4, 0, featureSizeZ - 2, featureSizeX - 1, 0, featureSizeZ - 1, false, rand, RandomLabTiles); - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 3, 0, featureSizeZ - 1, box); - - this.fillWithBlocks(world, box, 1, featureSizeY - 1, 1, 1, featureSizeY, 4, ModBlocks.reinforced_glass, Blocks.air, false); //Ceiling - this.fillWithBlocks(world, box, 2, featureSizeY, 1, featureSizeX - 1, featureSizeY, 4, ModBlocks.brick_light, Blocks.air, false); - this.fillWithBlocks(world, box, 4, featureSizeY, featureSizeZ - 2, featureSizeX - 1, featureSizeY, featureSizeZ - 1, ModBlocks.brick_light, Blocks.air, false); - - //Decorations & Loot - this.fillWithMetadataBlocks(world, box, 1, 1, 1, 1, 1, 4, Blocks.dirt, 2, Blocks.air, 0, false); - int westDecoMeta = this.getDecoMeta(5); - this.fillWithMetadataBlocks(world, box, 2, 1, 1, 2, 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 2, featureSizeY - 1, 1, 2, featureSizeY - 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); - for(byte i = 0; i < 4; i++) { - this.placeBlockAtCurrentPosition(world, ModBlocks.plant_flower, i, 1, 2, 1 + i, box); - } - - int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 2); - this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, 3, 1, featureSizeZ - 1, box); - ItemDoor.placeDoorBlock(world, this.getXWithOffset(3, featureSizeZ - 1), this.getYWithOffset(1), this.getZWithOffset(3, featureSizeZ - 1), doorMeta, ModBlocks.door_office); - - int northDecoMeta = this.getDecoMeta(3); - this.fillWithMetadataBlocks(world, box, 5, featureSizeY - 1, 1, featureSizeX - 1, featureSizeY - 1, 1, ModBlocks.steel_scaffold, westDecoMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 5, featureSizeY - 1, 2, featureSizeX - 1, featureSizeY - 1, 2, ModBlocks.steel_wall, northDecoMeta, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_electric_furnace_off, northDecoMeta, 5, 1, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_microwave, northDecoMeta, 5, 2, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, 6, 1, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_shredder, 0, featureSizeX - 2, 1, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, featureSizeX - 1, 1, 1, box); - this.fillWithBlocks(world, box, 5, 1, 3, featureSizeX - 1, 1, 3, ModBlocks.deco_titanium, Blocks.air, false); - if(!hasPlacedLoot[0]) { - this.placeBlockAtCurrentPosition(world, ModBlocks.deco_loot, 0, 6, 2, 3, box); - LootGenerator.lootMedicine(world, this.getXWithOffset(6, 3), this.getYWithOffset(2), this.getZWithOffset(6, 3)); - this.hasPlacedLoot[0] = true; - } - - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, featureSizeX - 1, 1, featureSizeZ - 2, box); - if(!hasPlacedLoot[1]) { - this.hasPlacedLoot[1] = this.generateIronCrateContents(world, box, rand, featureSizeX - 1, 1, featureSizeZ - 1, HbmChestContents.modGeneric, 8); - } - - return true; - } - } - - public static class NTMLab2 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.SuperConcrete RandomSuperConcrete = new ComponentNTMFeatures.SuperConcrete(); - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - private static ComponentNTMFeatures.LabTiles RandomLabTiles = new ComponentNTMFeatures.LabTiles(); - - private boolean[] hasPlacedLoot = new boolean[2]; - - public NTMLab2() { - super(); - } - - protected NTMLab2(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 12, 11, 8); - this.hasPlacedLoot[0] = false; - this.hasPlacedLoot[1] = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); - nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); - this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); - } - - @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; - } - this.boundingBox.offset(0, -7, 0); - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < featureSizeX + 1; i++) { - for(byte j = 0; j < featureSizeZ - 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box); - } - } - - for(byte i = 0; i < 7; i++) { - for(byte j = 7; j < featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box); - } - } - - if(this.getBlockAtCurrentPosition(world, featureSizeX - 3, featureSizeY - 4, 7, box).getMaterial().isReplaceable() - || this.getBlockAtCurrentPosition(world, featureSizeX - 3, featureSizeY - 4, 7, box) == Blocks.air) { - int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 2); - this.func_151554_b(world, Blocks.stonebrick, 0, featureSizeX - 3, featureSizeY - 4, 7, box); - this.func_151554_b(world, Blocks.stonebrick, 0, featureSizeX - 2, featureSizeY - 4, 7, box); - this.fillWithMetadataBlocks(world, box, featureSizeX - 3, featureSizeY - 4, 7, featureSizeX - 2, featureSizeY - 4, 7, Blocks.stone_brick_stairs, stairMeta, Blocks.air, 0, false); - } - - - this.fillWithAir(world, box, 1, featureSizeY - 4, 1, featureSizeX - 1, featureSizeY, featureSizeZ - 3); - this.fillWithAir(world, box, 1, featureSizeY - 4, featureSizeZ - 2, 5, featureSizeY, featureSizeZ - 1); - this.fillWithAir(world, box, featureSizeX - 3, featureSizeY - 3, featureSizeZ - 2, featureSizeX - 2, featureSizeY - 2, featureSizeZ - 2); - this.fillWithAir(world, box, 5, 5, 1, 6, 6, 2); - this.fillWithAir(world, box, 2, 0, 2, featureSizeX - 2, 3, featureSizeZ - 2); - - //Walls - this.fillWithRandomizedBlocks(world, box, 0, featureSizeY - 4, 0, featureSizeX, featureSizeY, 0, false, rand, RandomSuperConcrete); //Back Wall - this.fillWithRandomizedBlocks(world, box, 0, featureSizeY - 4, 0, 0, featureSizeY, featureSizeZ, false, rand, RandomSuperConcrete); //Left Wall - this.fillWithRandomizedBlocks(world, box, 1, featureSizeY - 4, featureSizeZ, 5, featureSizeY - 4, featureSizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 1 - this.fillWithBlocks(world, box, 1, featureSizeY - 3, featureSizeZ, 1, featureSizeY - 1, featureSizeZ, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 2, featureSizeY - 4, featureSizeZ, 2, featureSizeY - 1, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 3, featureSizeY - 3, featureSizeZ, 3, featureSizeY - 1, featureSizeZ, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 4, featureSizeY - 4, featureSizeZ, 4, featureSizeY - 1, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 5, featureSizeY - 3, featureSizeZ, 5, featureSizeY - 1, featureSizeZ, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, featureSizeY, featureSizeZ, 5, featureSizeY, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 6, featureSizeY - 4, featureSizeZ - 1, 6, featureSizeY, featureSizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 2 - this.fillWithRandomizedBlocks(world, box, 6, featureSizeY - 4, featureSizeZ - 2, 7, featureSizeY - 2, featureSizeZ - 2, false, rand, RandomSuperConcrete); //Front Wall pt. 3 - this.fillWithBlocks(world, box, 6, featureSizeY - 1, featureSizeZ - 2, 7, featureSizeY - 1, featureSizeZ - 2, ModBlocks.concrete_super_broken, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, featureSizeY - 4, featureSizeZ - 2, featureSizeX, featureSizeY - 4, featureSizeZ - 2, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, featureSizeY - 3, featureSizeZ - 2, featureSizeX - 4, featureSizeY, featureSizeZ - 2, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 3, featureSizeY - 1, featureSizeZ - 2, featureSizeX - 2, featureSizeY, featureSizeZ - 2, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, featureSizeY - 4, featureSizeZ - 2, featureSizeX, featureSizeY, featureSizeZ - 2, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, featureSizeX, featureSizeY - 4, 1, featureSizeX, featureSizeY - 4, featureSizeZ - 3, false, rand, RandomSuperConcrete); //Right Wall - this.fillWithBlocks(world, box, featureSizeX, featureSizeY - 3, featureSizeZ - 3, featureSizeX, featureSizeY - 1, featureSizeZ - 3, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, featureSizeY - 3, 4, featureSizeX, featureSizeY - 1, 4, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, featureSizeX, featureSizeY - 3, 3, featureSizeX, featureSizeY - 1, 3, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, featureSizeY - 3, 2, featureSizeX, featureSizeY - 1, 2, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, featureSizeX, featureSizeY - 3, 1, featureSizeX, featureSizeY - 1, 1, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, featureSizeY, 1, featureSizeX, featureSizeY, featureSizeZ - 3, false, rand, RandomSuperConcrete); - - this.fillWithBlocks(world, box, 1, 0, 1, featureSizeX - 1, 3, 1, ModBlocks.reinforced_stone, Blocks.air, false); //Back Wall - this.fillWithBlocks(world, box, 1, 0, 2, 1, 3, featureSizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Left Wall - this.fillWithBlocks(world, box, 1, 0, featureSizeZ - 1, featureSizeX - 1, 3, featureSizeZ - 1, ModBlocks.reinforced_stone, Blocks.air, false); //Front Wall - this.fillWithBlocks(world, box, featureSizeX - 1, 0, 2, featureSizeX - 1, 3, featureSizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); // Right Wall - this.fillWithBlocks(world, box, 6, 0, 3, 6, 3, featureSizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Internal Wall - - //Floors & Ceiling - this.fillWithRandomizedBlocks(world, box, 1, featureSizeY - 4, 1, 3, featureSizeY - 4, featureSizeZ - 1, false, rand, RandomLabTiles); //Left Floor - this.fillWithRandomizedBlocks(world, box, 4, featureSizeY - 4, featureSizeZ - 2, 5, featureSizeY - 4, featureSizeZ - 1, false, rand, RandomLabTiles); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, featureSizeY - 4, 1, featureSizeX - 1, featureSizeY - 4, featureSizeZ - 3, false, rand, RandomLabTiles); //Right Floor - this.fillWithRandomizedBlocks(world, box, featureSizeX - 3, featureSizeY - 4, featureSizeZ - 2, featureSizeX - 2, featureSizeY - 4, featureSizeZ - 2, false, rand, RandomLabTiles); - this.fillWithBlocks(world, box, 4, featureSizeY - 4, 1, 7, featureSizeY - 4, 1, ModBlocks.tile_lab_broken, Blocks.air, false); //Center Floor (Pain) - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 4, featureSizeY - 4, 2, box); - this.fillWithBlocks(world, box, 4, featureSizeY - 4, 3, 4, featureSizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 5, featureSizeY - 4, 3, box); - this.fillWithBlocks(world, box, 5, featureSizeY - 4, 4, 5, featureSizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 6, featureSizeY - 4, 4, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 6, featureSizeY - 4, 5, box); - this.fillWithBlocks(world, box, 7, featureSizeY - 4, 2, 7, featureSizeY - 4, 3, ModBlocks.tile_lab_broken, Blocks.air, false); - this.fillWithBlocks(world, box, 7, featureSizeY - 4, 4, 7, featureSizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); - - this.fillWithBlocks(world, box, 1, featureSizeY, 1, 2, featureSizeY, featureSizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Left Ceiling - this.fillWithBlocks(world, box, 3, featureSizeY, featureSizeZ - 2, 4, featureSizeY, featureSizeZ - 1, ModBlocks.brick_light, Blocks.air, false); - this.fillWithBlocks(world, box, featureSizeX - 3, featureSizeY, 1, featureSizeX - 1, featureSizeY, featureSizeZ - 3, ModBlocks.brick_light, Blocks.air, false); //Right Ceiling - this.fillWithBlocks(world, box, 3, featureSizeY, 1, 8, featureSizeY, 1, ModBlocks.waste_planks, Blocks.air, false); //Center Ceiling (Pain) - this.fillWithBlocks(world, box, 3, featureSizeY, 2, 4, featureSizeY, 2, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 7, featureSizeY, 2, 8, featureSizeY, 2, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 3, featureSizeY, 3, 3, featureSizeY, 5, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 4, featureSizeY, 4, 4, featureSizeY, 5, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 5, featureSizeY, 6, 5, featureSizeY, featureSizeZ - 1, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 8, featureSizeY, 3, 8, featureSizeY, 5, ModBlocks.waste_planks, Blocks.air, false); - - this.fillWithRandomizedBlocks(world, box, 2, 0, 2, 5, 0, featureSizeZ - 2, false, rand, RandomLabTiles); //Floor - this.fillWithRandomizedBlocks(world, box, 6, 0, 2, 6, 0, 3, false, rand, RandomLabTiles); - this.fillWithRandomizedBlocks(world, box, 7, 0, 2, featureSizeX - 2, 0, featureSizeZ - 2, false, rand, RandomLabTiles); - - this.fillWithRandomizedBlocks(world, box, 1, 4, 1, featureSizeX - 1, 4, featureSizeZ - 1, false, rand, RandomConcreteBricks); //Ceiling - - //Decorations & Loot - int eastMeta = this.getDecoMeta(4); - int westMeta = this.getDecoMeta(5); - int northMeta = this.getDecoMeta(3); - int southMeta = this.getDecoMeta(2); - this.placeBlockAtCurrentPosition(world, ModBlocks.crashed_balefire, southMeta, 6, featureSizeY - 2, 3, box); - - int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 1); - this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, featureSizeX - 3, featureSizeY - 3, featureSizeZ - 2, box); - ItemDoor.placeDoorBlock(world, this.getXWithOffset(featureSizeX - 3, featureSizeZ - 2), this.getYWithOffset(featureSizeY - 3), this.getZWithOffset(featureSizeX - 3, featureSizeZ - 2), - doorMeta, ModBlocks.door_office); - this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, featureSizeX - 2, featureSizeY - 3, featureSizeZ - 2, box); - ItemDoor.placeDoorBlock(world, this.getXWithOffset(featureSizeX - 2, featureSizeZ - 2), this.getYWithOffset(featureSizeY - 3), this.getZWithOffset(featureSizeX - 2, featureSizeZ - 2), - doorMeta, ModBlocks.door_office); - - this.fillWithBlocks(world, box, 1, featureSizeY - 3, 1, 1, featureSizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 1, featureSizeY - 3, 2, 1, featureSizeY - 2, 3, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, westMeta, 1, featureSizeY - 1, 2, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, 1, featureSizeY - 1, 3, box); - this.fillWithBlocks(world, box, 1, featureSizeY - 3, 6, 1, featureSizeY - 1, 6, ModBlocks.deco_pipe_framed_rusted, Blocks.air, false); - - this.fillWithMetadataBlocks(world, box, featureSizeX - 4, featureSizeY - 3, 1, featureSizeX - 4, featureSizeY - 1, 1, ModBlocks.steel_wall, eastMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 3, featureSizeY - 1, 1, featureSizeX - 2, featureSizeY - 1, 1, ModBlocks.steel_grate, 0, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 3, featureSizeY - 2, 1, featureSizeX - 2, featureSizeY - 2, 1, ModBlocks.tape_recorder, northMeta, Blocks.air, 0, false); - this.fillWithBlocks(world, box, featureSizeX - 3, featureSizeY - 3, 1, featureSizeX - 2, featureSizeY - 3, 1, ModBlocks.deco_steel, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 1, featureSizeY - 3, 1, featureSizeX - 1, featureSizeY - 1, 1, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); - - this.fillWithMetadataBlocks(world, box, 2, 1, 2, 2, 1, featureSizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.vitrified_barrel, 0, 2, 2, 2, box); - this.fillWithMetadataBlocks(world, box, 3, 1, 2, 3, 3, 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 3, 1, 4, 3, 3, 4, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 3, 1, featureSizeZ - 2, 3, 3, featureSizeZ - 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 4, 1, featureSizeZ - 2, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_lead, 0, 4, 2, featureSizeZ - 2, box); - if(!hasPlacedLoot[0]) { - this.hasPlacedLoot[0] = this.generateIronCrateContents(world, box, rand, 5, 1, featureSizeZ - 2, HbmChestContents.nuclearFuel, 10); - } - this.fillWithBlocks(world, box, 4, 1, featureSizeZ - 3, 5, 1, featureSizeZ - 3, ModBlocks.crate_lead, Blocks.air, false); - - this.fillWithBlocks(world, box, featureSizeX - 5, 1, featureSizeZ - 2, featureSizeX - 5, 3, featureSizeZ - 2, ModBlocks.deco_steel, Blocks.air, false);; - this.fillWithMetadataBlocks(world, box, featureSizeX - 4, 1, featureSizeZ - 2, featureSizeX - 2, 1, featureSizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 4, 2, featureSizeZ - 2, featureSizeX - 3, 2, featureSizeZ - 2, ModBlocks.tape_recorder, southMeta, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, featureSizeX - 2, 2, featureSizeZ - 2, box); - this.fillWithBlocks(world, box, featureSizeX - 4, 3, featureSizeZ - 2, featureSizeX - 2, 3, featureSizeZ - 2, ModBlocks.steel_roof, Blocks.air, false); - if(!hasPlacedLoot[1]) { - this.hasPlacedLoot[1] = this.generateIronCrateContents(world, box, rand, featureSizeX - 2, 1, 3, HbmChestContents.nukeTrash, 9); - } - - return true; - } - } - - public static class NTMWorkshop1 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.SuperConcrete RandomSuperConcrete = new ComponentNTMFeatures.SuperConcrete(); - - private boolean hasPlacedLoot; - - public NTMWorkshop1() { - super(); - } - - protected NTMWorkshop1(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 10, 6, 8); - this.hasPlacedLoot = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasLoot", this.hasPlacedLoot); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedLoot = nbt.getBoolean("hasLoot"); - } - - @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); - - for(byte i = 1; i < featureSizeX - 2; i++) { - for(byte j = 0; j < featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - for(byte i = 8; i < featureSizeX + 1; i++) { - for(byte j = 1; j < 7; j++) { - this.func_151554_b(world, Blocks.dirt, 0, i, -1, j, box); - } - } - - this.fillWithAir(world, box, 1, 0, 0, featureSizeX - 3, featureSizeY - 2, featureSizeZ); - this.fillWithAir(world, box, featureSizeX - 2, 0, 2, featureSizeX - 1, 2, 5); - - if(this.getBlockAtCurrentPosition(world, 0, 0, 5, box).getMaterial().isReplaceable() - || this.getBlockAtCurrentPosition(world, 0, 0, 5, box) == Blocks.air) { - int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 1); - this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairMeta, 0, 0, 5, box); - - for(byte i = 1; 1 < featureSizeZ; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - } - - this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, featureSizeZ - 1, Blocks.stone_slab, 5, Blocks.air, 0, false); - } - - //Walls - int pillarMetaWE = this.getPillarMeta(4); - int pillarMetaNS = this.getPillarMeta(8); - this.fillWithBlocks(world, box, 1, 0, 0, 1, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, 0, box); - this.fillWithMetadataBlocks(world, box, 2, 4, 0, featureSizeX - 4, 4, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, featureSizeX - 3, 4, 0, box); - this.fillWithBlocks(world, box, featureSizeX - 3, 0, 0, featureSizeX - 3, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 2, 0, 0, featureSizeX - 4, 1, 0, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 2, 0, 2, 2, 0, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 3, 2, 0, 5, 2, 0, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, 2, 0, featureSizeX - 4, 2, 0, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 3, 0, featureSizeX - 4, 3, 0, false, rand, RandomSuperConcrete); - this.fillWithMetadataBlocks(world, box, 1, 4, 1, 1, 4, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, featureSizeZ, box); - this.fillWithBlocks(world, box, 1, 0, featureSizeZ, 1, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 1, 1, 1, 4, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 1, 2, 1, 1, 2, 1, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 1, 2, 2, 1, 2, 3, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 2, 4, 1, 2, 4, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 1, 3, 1, 1, 3, featureSizeZ - 1, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ - 2, 1, 3, featureSizeZ - 1, false, rand, RandomSuperConcrete); - this.fillWithMetadataBlocks(world, box, 2, 4, featureSizeZ, featureSizeX - 4, 4, featureSizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, featureSizeX - 3, 4, featureSizeZ, box); - this.fillWithBlocks(world, box, featureSizeX - 3, 0, featureSizeZ, featureSizeX - 3, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 2, 0, featureSizeZ, featureSizeX - 4, 1, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 2, featureSizeZ, 2, 2, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 3, 2, featureSizeZ, 5, 2, featureSizeZ, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, 2, featureSizeZ, featureSizeX - 4, 2, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 3, featureSizeZ, featureSizeX - 4, 3, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithMetadataBlocks(world, box, featureSizeX - 3, 4, 1, featureSizeX - 3, 4, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX - 3, 0, 1, featureSizeX - 3, 3, featureSizeZ - 1, false, rand, RandomSuperConcrete); - - pillarMetaWE = this.getPillarMeta(5); - pillarMetaNS = this.getPillarMeta(9); - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 2, 1, featureSizeX - 1, 2, 1, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Back Wall - this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 2, 1, Blocks.log, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 1, featureSizeX - 1, 1, 1, Blocks.planks, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX, 2, 2, featureSizeX, 2, 5, Blocks.log, pillarMetaNS, Blocks.air, 0, false); //Right Wall - this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 6, featureSizeX, 2, 6, Blocks.log, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 3, featureSizeX, 1, 5, Blocks.planks, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 2, 6, featureSizeX - 1, 2, 6, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Front Wall - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 6, featureSizeX - 1, 1, 6, Blocks.planks, 1, Blocks.air, 0, false); - - //Floor & Ceiling - this.fillWithBlocks(world, box, 2, 0, 1, 6, 0, featureSizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Floor - this.placeBlockAtCurrentPosition(world, ModBlocks.brick_light, 0, 1, 0, 5, box); - this.fillWithRandomizedBlocks(world, box, 2, 4, 1, 6, 4, 3, false, rand, RandomSuperConcrete); //Ceiling - this.fillWithRandomizedBlocks(world, box, 2, 4, 4, 2, 4, 4, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 5, 4, 4, 6, 4, 4, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 4, featureSizeZ - 3, 6, 4, featureSizeZ - 1, false, rand, RandomSuperConcrete); - - this.fillWithBlocks(world, box, featureSizeX - 2, 2, 2, featureSizeX - 1, 2, 5, ModBlocks.deco_steel, Blocks.air, false); - - //Loot & Decorations - int southMeta = this.getDecoMeta(2); - int eastMeta = this.getDecoMeta(5); - this.placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 2, featureSizeY - 1, 1, box); - this.fillWithBlocks(world, box, 3, featureSizeY - 1, 1, 4, featureSizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); - this.fillWithBlocks(world, box, 2, featureSizeY - 1, 2, 4, featureSizeY - 1, 2, ModBlocks.deco_steel, Blocks.air, false); - this.fillWithBlocks(world, box, 2, featureSizeY, 1, 4, featureSizeY, 2, ModBlocks.steel_roof, Blocks.air, false); - this.fillWithBlocks(world, box, 2, 1, 1, 2, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false); - this.fillWithBlocks(world, box, 3, 1, 1, 3, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_generator, 0, 4, 1, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_detector, 0, 4, 1, 2, box); - this.fillWithBlocks(world, box, 5, 1, 1, 5, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false); - this.fillWithBlocks(world, box, 6, 1, 1, 6, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false); - this.fillWithBlocks(world, box, 3, 1, 4, 4, 1, 4, ModBlocks.concrete_super_broken, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 6, 1, 4, 6, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 6, 1, 5, 6, 1, 7, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.radiorec, eastMeta, 6, 2, featureSizeZ - 1, box); - this.fillWithMetadataBlocks(world, box, 2, 1, featureSizeZ - 1, 3, 1, featureSizeZ - 1, ModBlocks.machine_electric_furnace_off, southMeta, Blocks.air, 0, false); - if(!hasPlacedLoot) { - this.hasPlacedLoot = this.generateIronCrateContents(world, box, rand, 4, 1, featureSizeZ - 1, HbmChestContents.machineParts, 11); - } - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 5, 3, 1, box); - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 2, 1, 2, box); - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 1, 2, box); - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 2, 5, box); - - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 5, featureSizeX - 1, 0, 5, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, southMeta, featureSizeX - 2, 1, 5, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureSizeX - 1, 1, 5, box); - TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(featureSizeX - 1, 5), this.getYWithOffset(1), this.getZWithOffset(featureSizeX - 1, 5)); - - if(bobble != null) { - bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; - bobble.markDirty(); - } - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 2, featureSizeX - 2, 0, 3, Blocks.log, pillarMetaWE, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, Blocks.log, pillarMetaWE, featureSizeX - 2, 1, 2, box); - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, featureSizeX - 2, 1, 3, box); - - return true; - } - } - - public static class NTMRuin1 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - - public NTMRuin1() { - super(); - } - - protected NTMRuin1(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, 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); - - for(byte i = 0; i < featureSizeX + 1; i++) { - for(byte j = 0; j < featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - int pillarMetaWE = this.getPillarMeta(4); - int pillarMetaNS = this.getPillarMeta(8); - - this.fillWithBlocks(world, box, 0, 0, 0, 0, featureSizeY, 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, featureSizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 5, 3, 0, featureSizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.fillWithBlocks(world, box, featureSizeX, 0, 0, featureSizeX, featureSizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 3, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 0, 0, featureSizeX - 1, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 3, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 1, 0, 5, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 0, featureSizeX - 1, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 4, 0, 3, 4, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 4, 0, featureSizeX - 1, 4, 0, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall - this.fillWithBlocks(world, box, 0, 0, featureSizeZ, 0, featureSizeY - 1, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 2, 2, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 2, 6, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, featureSizeZ - 2, 0, 2, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 4, 1, 0, 4, 5, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 5, 1, 0, 5, 2, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 4, featureSizeZ - 2, 0, 4, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, 1, 3, featureSizeZ, 3, 3, featureSizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall - this.fillWithBlocks(world, box, 4, 0, featureSizeZ, 4, featureSizeY - 2, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 5, 3, featureSizeZ, featureSizeX - 1, 3, featureSizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, featureSizeY - 2, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, 3, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 0, featureSizeZ, featureSizeX - 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, featureSizeZ, 1, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 3, 1, featureSizeZ, 3, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 1, featureSizeZ, 5, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, featureSizeZ, featureSizeX - 1, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, featureSizeX, 3, 1, featureSizeX, 3, 2, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall - this.fillWithMetadataBlocks(world, box, featureSizeX, 3, featureSizeZ - 1, featureSizeX, 3, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 0, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 1, featureSizeX, 2, 2, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 6, featureSizeX, 0, 6, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, featureSizeZ - 2, featureSizeX, 1, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 2, featureSizeZ - 1, featureSizeX, 2, featureSizeZ - 1, false, rand, RandomConcreteBricks); - - this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.gravel, Blocks.air, false); - - return true; - } - } - - public static class NTMRuin2 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - - public NTMRuin2() { - super(); - } - - protected NTMRuin2(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, 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); - - for(byte i = 0; i < featureSizeX + 1; i++) { - for(byte j = 0; j < featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, 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, featureSizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.fillWithBlocks(world, box, featureSizeX, 0, 0, featureSizeX, featureSizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, featureSizeX - 1, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 4, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 0, featureSizeX - 1, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 3, 4, 0, featureSizeX - 1, 4, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, featureSizeY, 0, featureSizeX - 1, featureSizeY, 0, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall - this.fillWithBlocks(world, box, 0, 0, 5, 0, 0, 5, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, 0, 0, featureSizeZ, 0, 2, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 2, 3, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 0, featureSizeZ - 3, 0, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, featureSizeZ - 1, 0, 1, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, featureSizeX - 1, 3, featureSizeZ, featureSizeX - 1, 3, featureSizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, featureSizeX - 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, featureSizeZ, 1, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, featureSizeZ, featureSizeX - 1, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, featureSizeX, 3, 1, featureSizeX, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall - this.fillWithBlocks(world, box, featureSizeX, 0, 5, featureSizeX, 4, 5, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, featureSizeX, 3, featureSizeZ - 2, featureSizeX, 3, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 0, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 1, featureSizeX, 2, 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 3, featureSizeX, 2, 3, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 4, featureSizeX, 1, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 6, featureSizeX, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 6, featureSizeX, 1, 7, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, featureSizeZ - 1, featureSizeX, 2, featureSizeZ - 1, false, rand, RandomConcreteBricks); - - this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.gravel, Blocks.air, false); - - return true; - } - } - - public static class NTMRuin3 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - - public NTMRuin3() { - super(); - } - - protected NTMRuin3(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, 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); - - for(byte i = 0; i < featureSizeZ + 1; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - this.func_151554_b(world, Blocks.stonebrick, 0, featureSizeX, -1, i, box); - } - - for(byte i = 1; i < featureSizeX; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 0, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 4, box); - } - - this.fillWithBlocks(world, box, 0, 0, 0, 0, featureSizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall - this.fillWithBlocks(world, box, featureSizeX, 0, 0, featureSizeX, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, featureSizeX - 1, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 1, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 0, featureSizeX - 1, 1, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 2, 0, featureSizeX - 2, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, 0, 0, 4, 0, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Left Wall - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 0, 0, featureSizeZ, box); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, 3, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 0, 5, 0, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 5, 0, 1, 5, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 7, 0, 1, 7, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, featureSizeX, 0, 4, featureSizeX, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, 1, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 1, 3, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 5, featureSizeX, 0, 6, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, featureSizeZ - 1, featureSizeX, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 0, featureSizeZ, featureSizeX - 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - 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, featureSizeX - 1, 1, 4, false, rand, RandomConcreteBricks); - - this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, featureSizeX - 1, 0, 3, Blocks.gravel, Blocks.air, false); - this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 5, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.gravel, Blocks.air, false); - - return true; - } - } - - public static class NTMRuin4 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - - public NTMRuin4() { - super(); - } - - protected NTMRuin4(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, 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); - - for(byte i = 0; i < featureSizeZ + 1; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i >= 5 ? featureSizeX : 5, -1, i, box); //elegant solution - } - - for(byte i = 1; i < featureSizeX; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, featureSizeZ, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, i > 4 ? 5 : 0, box); //ternary operators my beloved - } - - 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, featureSizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 4, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, 5, 0, 5, 5, featureSizeY, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 1 - this.fillWithRandomizedBlocks(world, box, 5, 0, 1, 5, 0, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 1, 1, 5, 1, 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 1, 4, 5, 1, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 2, 1, 5, 2, 4, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, featureSizeX, 0, 5, featureSizeX, 1, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 2 - this.fillWithRandomizedBlocks(world, box, 6, 0, 5, featureSizeX - 1, 0, 5, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 6, 1, 5, 6, 1, 5, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 5, featureSizeX - 1, 1, 5, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, 1, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 2 - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 6, featureSizeX, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 6, featureSizeX, 1, featureSizeZ - 3, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, 0, 0, featureSizeZ, 0, 0, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Front Wall - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 6, 0, featureSizeZ, 7, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 0, featureSizeZ, featureSizeX - 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, featureSizeZ - 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, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.gravel, Blocks.air, false); - - return true; - } -} - - /*Worrying: StructureStart checks for not addComponentParts to remove structure components from iterator, but here successful builds return true. - may be issue with multiple components.*/ - abstract static class Feature extends StructureComponent { - /** The size of the bounding box for this feature in the X axis */ - protected int featureSizeX; - /** The size of the bounding box for this feature in the Y axis */ - protected int featureSizeY; - /** The size of the bounding box for this feature in the Z axis */ - protected int featureSizeZ; - /** Average height? */ - protected int hpos = -1; - - - protected Feature() { - super(0); - } - - protected Feature(Random rand, int minX, int minY, int minZ, int maxX, int maxY, int maxZ ) { - super(0); - this.featureSizeX = maxX; - this.featureSizeY = maxY; - this.featureSizeZ = maxZ; - this.coordBaseMode = rand.nextInt(4); - - switch(this.coordBaseMode) { - case 0: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - break; - case 1: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); - break; - case 2: - //North (2) and East (3) will result in mirrored structures. Not an issue, but keep in mind. - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - break; - case 3: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - break; - default: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - - } - } - - /** Set to NBT */ - protected void func_143012_a(NBTTagCompound nbt) { - nbt.setInteger("Width", this.featureSizeX); - nbt.setInteger("Height", this.featureSizeY); - nbt.setInteger("Depth", this.featureSizeZ); - nbt.setInteger("HPos", this.hpos); - } - - /** Get from NBT */ - protected void func_143011_b(NBTTagCompound nbt) { - this.featureSizeX = nbt.getInteger("Width"); - this.featureSizeY = nbt.getInteger("Height"); - this.featureSizeZ = nbt.getInteger("Depth"); - this.hpos = nbt.getInteger("HPos"); - } - - protected boolean setAverageHeight(World world, StructureBoundingBox box, int y) { - - int j = 0; - int k = 0; - - for(int l = this.boundingBox.minZ; l <= this.boundingBox.maxZ; l++) { - for(int i = this.boundingBox.minX; i <= this.boundingBox.maxX; i++) { - if(box.isVecInside(i, y, l)) { - j += Math.max(world.getTopSolidOrLiquidBlock(i, l), world.provider.getAverageGroundLevel()); - k++; - } - } - } - - if(k == 0) - return false; - - this.hpos = j / k; - this.boundingBox.offset(0, this.hpos - this.boundingBox.minY, 0); - return true; - } - - /** - * Gets metadata for rotatable pillars. - * @param metadata (First two digits are equal to block metadata, other two are equal to orientation - * @return metadata adjusted for random orientation - */ - protected int getPillarMeta(int metadata) { - int blockMeta = metadata & 3; - int rotationMeta = metadata >> 2; - - if(rotationMeta == 0) - return metadata; - - if(this.coordBaseMode == 0 || this.coordBaseMode == 2) { //North & South - switch(rotationMeta) { - case 1: - rotationMeta = 4; - break; - case 2: - rotationMeta = 8; - break; - } - } else if(this.coordBaseMode == 1 || this.coordBaseMode == 3) { //East & West - switch(rotationMeta) { - case 1: - rotationMeta = 8; - break; - case 2: - rotationMeta = 4; - break; - } - } - - return blockMeta | rotationMeta; - } - - /** - * Gets metadata for rotatable DecoBlock - * @param metadata (2 for facing South, 3 for facing North, 4 for facing East, 5 for facing West - * @return metadata adjusted for random orientation - */ - protected int getDecoMeta(int metadata) { - switch(this.coordBaseMode) { - case 0: //South - switch(metadata) { - case 2: - return 2; - case 3: - return 3; - case 4: - return 4; - case 5: - return 5; - } - case 1: //West - switch(metadata) { - case 2: - return 5; - case 3: - return 4; - case 4: - return 2; - case 5: - return 3; - } - case 2: //North - switch(metadata) { - case 2: - return 3; - case 3: - return 2; - case 4: - return 4; - case 5: - return 5; - } - case 3: //East - switch(metadata) { - case 2: - return 4; - case 3: - return 5; - case 4: - return 2; - case 5: - return 3; - } - } - return 0; - } - - //TODO: Make a lot of these orientation/rotation methods much more transparent about what - //direction they will actually face - - /** - * Places door at specified location with orientation-adjusted meta - * don't ask me which directions are what - */ - protected void placeDoor(World world, StructureBoundingBox box, Block door, int direction, int featureX, int featureY, int featureZ) { - int meta = getMetadataWithOffset(Blocks.wooden_door, direction); - int posX = this.getXWithOffset(featureX, featureZ); - int posY = this.getYWithOffset(featureY); - int posZ = this.getZWithOffset(featureX, featureZ); - - this.placeBlockAtCurrentPosition(world, door, meta, featureX, featureY, featureZ, box); - ItemDoor.placeDoorBlock(world, posX, posY, posZ, meta, door); - } - - /** - * Places random bobblehead with a randomized orientation at specified location - */ - protected void placeRandomBobble(World world, StructureBoundingBox box, Random rand, int featureX, int featureY, int featureZ) { - int posX = this.getXWithOffset(featureX, featureZ); - int posY = this.getYWithOffset(featureY); - int posZ = this.getZWithOffset(featureX, featureZ); - - placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureX, featureY, featureZ, box); - TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(posX, posY, posZ); - - if(bobble != null) { - bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; - bobble.markDirty(); - } - } - - /** - * it feels disgusting to make a method with this many parameters but fuck it, it's easier - * @return iron crate with generated content - */ - protected boolean generateIronCrateContents(World world, StructureBoundingBox box, Random rand, int featureX, int featureY, int featureZ, WeightedRandomChestContent[] content, int amount) { - int posX = this.getXWithOffset(featureX, featureZ); - int posY = this.getYWithOffset(featureY); - int posZ = this.getZWithOffset(featureX, featureZ); - - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_iron, 0, featureX, featureY, featureZ, box); - TileEntityCrateIron crate = (TileEntityCrateIron)world.getTileEntity(posX, posY, posZ); - - if(crate != null) { - WeightedRandomChestContent.generateChestContents(rand, content, crate, amount); - return true; - } - - return false; - } - - @Override - protected void func_151554_b(World world, Block placeBlock, int meta, int featureX, int featureY, int featureZ, StructureBoundingBox box) { - int posX = this.getXWithOffset(featureX, featureZ); - int posY = this.getYWithOffset(featureY); - int posZ = this.getZWithOffset(featureX, featureZ); - - if(box.isVecInside(posX, posY, posZ)) { - Block block = world.getBlock(posX, posY, posZ); - - while ((world.isAirBlock(posX, posY, posZ) || !block.getMaterial().isSolid() || (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && posY > 1) { - world.setBlock(posX, posY, posZ, placeBlock, meta, 2); - block = world.getBlock(posX, --posY, posZ); - } - } - } - - /** - * Places specified blocks on top of pre-existing blocks in a given area, up to a certain height. Does NOT place blocks on top of liquids. - * Useful for stuff like fences and walls most likely. - */ - protected void placeBlocksOnTop(World world, StructureBoundingBox box, Block block, int minX, int minZ, int maxX, int maxZ, int height) { - - for(int x = minX; x <= maxX; x++) { - for(int z = minZ; z <= maxZ; z++) { - int posX = this.getXWithOffset(x, z); - int posZ = this.getZWithOffset(x, z); - int topHeight = world.getTopSolidOrLiquidBlock(posX, posZ); - - if(!world.getBlock(posX, topHeight, posZ).getMaterial().isLiquid()) { - - for(int i = 0; i < height; i++) { - int posY = topHeight + i; - - world.setBlock(posX, posY, posZ, block, 0, 2); - } - } - } - } - } - - } - - //Block Selectors - - static class Sandstone extends StructureComponent.BlockSelector { - - Sandstone() { } - - /** Selects blocks */ - @Override - public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { - float chance = rand.nextFloat(); - - if(chance > 0.6F) { - this.field_151562_a = Blocks.sandstone; - } else if (chance < 0.5F ) { - this.field_151562_a = ModBlocks.reinforced_sand; - } else { - this.field_151562_a = Blocks.sand; - } - } - } - - static class ConcreteBricks extends StructureComponent.BlockSelector { - - ConcreteBricks() { } - - /** Selects blocks */ - @Override - public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { - float chance = rand.nextFloat(); - - if(chance < 0.2F) { - this.field_151562_a = ModBlocks.brick_concrete; - } else if (chance < 0.55F) { - this.field_151562_a = ModBlocks.brick_concrete_mossy; - } else if (chance < 0.75F) { - this.field_151562_a = ModBlocks.brick_concrete_cracked; - } else { - this.field_151562_a = ModBlocks.brick_concrete_broken; - } - } - } - - //ag - static class LabTiles extends StructureComponent.BlockSelector { - - LabTiles() { } - - /** Selects blocks */ - @Override - public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { - float chance = rand.nextFloat(); - - if(chance < 0.5F) { - this.field_151562_a = ModBlocks.tile_lab; - } else if (chance < 0.9F) { - this.field_151562_a = ModBlocks.tile_lab_cracked; - } else { - this.field_151562_a = ModBlocks.tile_lab_broken; - } - } - } - - static class SuperConcrete extends StructureComponent.BlockSelector { - - SuperConcrete() { - this.field_151562_a = ModBlocks.concrete_super; - } - - /** Selects blocks */ - @Override - public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { - this.selectedBlockMetaData = rand.nextInt(6) + 10; - } - } -} diff --git a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java index 666f892a3..59fe2c35c 100644 --- a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java @@ -7,7 +7,11 @@ import java.util.List; import java.util.Random; import com.hbm.config.GeneralConfig; +import com.hbm.config.StructureConfig; +import com.hbm.world.worldgen.components.CivilianFeatures.*; import com.hbm.world.worldgen.components.MilitaryBaseFeatures; +import com.hbm.world.worldgen.components.MilitaryBaseFeatures.*; +import com.hbm.world.worldgen.components.RuinFeatures.*; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; @@ -28,8 +32,8 @@ public class MapGenNTMFeatures extends MapGenStructure { private int minDistanceBetweenScatteredFeatures; public MapGenNTMFeatures() { - this.maxDistanceBetweenScatteredFeatures = 24; - this.minDistanceBetweenScatteredFeatures = 8; + this.maxDistanceBetweenScatteredFeatures = StructureConfig.structureMaxChunks; + this.minDistanceBetweenScatteredFeatures = StructureConfig.structureMinChunks; } /** String ID for this MapGen */ @@ -107,43 +111,43 @@ public class MapGenNTMFeatures extends MapGenStructure { if(rand.nextBoolean()) { //Empty Ruin Structures switch(rand.nextInt(4)) { case 0: - ComponentNTMFeatures.NTMRuin1 ruin1 = new ComponentNTMFeatures.NTMRuin1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMRuin1 ruin1 = new NTMRuin1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(ruin1); break; case 1: - ComponentNTMFeatures.NTMRuin2 ruin2 = new ComponentNTMFeatures.NTMRuin2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMRuin2 ruin2 = new NTMRuin2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(ruin2); break; case 2: - ComponentNTMFeatures.NTMRuin3 ruin3 = new ComponentNTMFeatures.NTMRuin3(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMRuin3 ruin3 = new NTMRuin3(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(ruin3); break; case 3: - ComponentNTMFeatures.NTMRuin4 ruin4 = new ComponentNTMFeatures.NTMRuin4(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMRuin4 ruin4 = new NTMRuin4(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(ruin4); } } else if(biome.temperature >= 1.0 && biome.rainfall == 0 && !(biome instanceof BiomeGenMesa)) { //Desert & Savannah if(rand.nextBoolean()) { - ComponentNTMFeatures.NTMHouse1 house1 = new ComponentNTMFeatures.NTMHouse1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMHouse1 house1 = new NTMHouse1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(house1); } else { - ComponentNTMFeatures.NTMHouse2 house2 = new ComponentNTMFeatures.NTMHouse2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMHouse2 house2 = new NTMHouse2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(house2); } } else if(biome.temperature >= 0.25 && biome.temperature <= 0.3 && biome.rainfall >= 0.6 && biome.rainfall <= 0.9) { //Taiga & Mega Taiga if(rand.nextBoolean()) { - ComponentNTMFeatures.NTMWorkshop1 workshop1 = new ComponentNTMFeatures.NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMWorkshop1 workshop1 = new NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(workshop1); } } else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextBoolean()) { MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg } else { //Everything else if(rand.nextBoolean()) { - ComponentNTMFeatures.NTMLab2 lab2 = new ComponentNTMFeatures.NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMLab2 lab2 = new NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(lab2); } else { - ComponentNTMFeatures.NTMLab1 lab1 = new ComponentNTMFeatures.NTMLab1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMLab1 lab1 = new NTMLab1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(lab1); } } diff --git a/src/main/java/com/hbm/world/worldgen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/worldgen/NTMWorldGenerator.java index 1205d04ac..01c7b7acc 100644 --- a/src/main/java/com/hbm/world/worldgen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/worldgen/NTMWorldGenerator.java @@ -2,7 +2,7 @@ package com.hbm.world.worldgen; import java.util.Random; -import com.hbm.config.GeneralConfig; +import com.hbm.config.StructureConfig; import cpw.mods.fml.common.IWorldGenerator; import net.minecraft.block.Block; @@ -39,12 +39,12 @@ public class NTMWorldGenerator implements IWorldGenerator { //WorldConfig.enableStructures /** Spawns structure starts. Utilizes canSpawnStructureAtCoords() + if else checks in Start constructor */ - if(GeneralConfig.enableDungeons) { + if(StructureConfig.enableStructures) { this.NTMFeatureGenerator.func_151539_a(chunkGenerator, world, chunkX, chunkZ, ablock); } /** Actually generates structures in a given chunk. */ - if(GeneralConfig.enableDungeons) { + if(StructureConfig.enableStructures) { this.NTMFeatureGenerator.generateStructuresInChunk(world, rand, chunkX, chunkZ); } } diff --git a/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java b/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java new file mode 100644 index 000000000..88b2e9d9c --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java @@ -0,0 +1,761 @@ +package com.hbm.world.worldgen.components; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockBobble.BobbleType; +import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; +import com.hbm.lib.HbmChestContents; +import com.hbm.util.LootGenerator; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemDoor; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; + +/* Described as "Civilian", as that's the overarching connection between all of these structures. Unlike the ruins, there's not enough to + * compartmentalize even further. Just in general many of the structures I consider lower-quality (except for the sandstone houses; those are actually pretty nice). + */ +public class CivilianFeatures { + + /** Sandstone Ruin 1 */ + public static class NTMHouse1 extends Feature { + + private boolean hasPlacedChest; + + private static Sandstone RandomSandstone = new Sandstone(); + + public NTMHouse1() { + super(); + } + + /** Constructor for this feature; takes coordinates for bounding box */ + public NTMHouse1(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 9, 4, 6); + this.hasPlacedChest = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasChest", this.hasPlacedChest); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedChest = nbt.getBoolean("hasChest"); + } + + /** + * Generates structures. + */ + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + /* + * Places block at current position. Dependent on coordinate mode, i.e. will allow for random rotation, so use this instead of setBlock! + * this.placeBlockAtCurrentPosition(world, block, minX, metadata, x, y, z, box); + * Fills an area with air, self-explanatory. Use to clear interiors of unwanted blocks. + * this.fillWithAir(world, box, minX, minY, minZ, maxX, maxY, maxZ); + * Fills an area with blocks, self-explanatory. + * this.fillWithBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace); + * Fills an area with metadata blocks, self-explanatory. + * this.fillWithMetadataBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockPlaceMeta, blockToReplace, replaceBlockMeta, alwaysReplace); + * Fills an area with randomized blocks, self-explanatory. + * this.fillWithRandomizedBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, alwaysReplace, rand, StructureComponent.blockSelector); + * (BlockSelector is basically a list of blocks that can be randomly picked, except that it can actually be weighted) + * Replaces any air or water blocks with this block down. Useful for foundations + * this.func_151554_b(world, block, metadata, x, startAtY, z, box + * Fills an area with blocks randomly - look into randLimit? + * this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace); + */ + + //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); + + for(byte i = 0; i < this.sizeX + 1; i++) { + for(byte j = 0; j < this.sizeZ + 1; j++) { + this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); + } + } + + //Walls + this.fillWithRandomizedBlocks(world, box, 0, 0, 0, sizeX, 0, 0, false, rand, RandomSandstone); //Back Wall + this.fillWithRandomizedBlocks(world, box, 0, 1, 0, 1, 1, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 1, 0, box); + this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 5, 1, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, 1, 0, box); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 7, 1, 0, box); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX, 1, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 0, 2, 0, sizeX - 2, 2, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 0, 1, sizeZ, false, rand, RandomSandstone); //Left Wall + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 0, 2, 1, box); + this.fillWithMetadataBlocks(world, box, 0, 2, 3, 0, 2, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 1, 1, sizeZ, false, rand, RandomSandstone); //Front Wall + this.fillWithRandomizedBlocks(world, box, 3, 0, sizeZ, sizeX, 1, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 1, 2, sizeZ, 3, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithMetadataBlocks(world, box, 4, 2, sizeZ, 5, 2, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 2, 2, sizeZ, box); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 0, sizeX, 0, sizeZ, false, rand, RandomSandstone); //Right Wall + this.randomlyFillWithBlocks(world, box, rand, 0.65F, sizeX, 1, 1, sizeX, 1, sizeZ - 1, Blocks.sand, Blocks.air, false); + + this.fillWithRandomizedBlocks(world, box, 4, 0, 1, 4, 1, 3, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, ModBlocks.reinforced_sand, 0, 4, 0, 4, box); + + //Loot/Sand + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 1, 0, 1, box); + if(!this.hasPlacedChest) + this.hasPlacedChest = this.generateStructureChestContents(world, box, rand, 3, 0, 1, HbmChestContents.modGeneric, rand.nextInt(2) + 8); + this.fillWithBlocks(world, box, 5, 0, 1, 6, 0, 1, ModBlocks.crate, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, Blocks.sand, 0, 7, 0, 1, box); + if(rand.nextFloat() <= 0.25) + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_metal, 0, sizeX - 1, 0, 1, box); + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 2, 3, 0, sizeZ - 1, Blocks.sand, Blocks.air, false); + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 5, 0, 2, sizeX - 1, 0, sizeZ - 1, Blocks.sand, Blocks.air, false); + + return true; + } + + } + + public static class NTMHouse2 extends Feature { + + private static Sandstone RandomSandstone = new Sandstone(); + + private boolean[] hasPlacedLoot = new boolean[2]; + + public NTMHouse2() { + super(); + } + + public NTMHouse2(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 15, 5, 9); + this.hasPlacedLoot[0] = false; + this.hasPlacedLoot[1] = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); + nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); + this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + //System.out.print(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + for(byte i = 0; i < 7; i++) { + for(byte j = 0; j < this.sizeZ + 1; j++) { + this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); + } + } + + for(byte i = 9; i < this.sizeX + 1; i++) { + for(byte j = 0; j < this.sizeZ + 1; j++) { + this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); + } + } + + this.fillWithAir(world, box, 1, 0, 1, 5, sizeY, sizeZ - 1); + + //House 1 + this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 6, 1, 0, false, rand, RandomSandstone); //Back Wall + this.fillWithRandomizedBlocks(world, box, 0, 2, 0, 1, 2, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 2, 0, box); + this.fillWithRandomizedBlocks(world, box, 3, 2, 0, 3, 2, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 4, 2, 0, box); + this.fillWithRandomizedBlocks(world, box, 5, 2, 0, 6, 2, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 0, 3, 0, 6, 3, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 3, sizeZ, false, rand, RandomSandstone); //Left Wall + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 6, 1, sizeZ, false, rand, RandomSandstone); //Front Wall + this.fillWithRandomizedBlocks(world, box, 1, 2, sizeZ, 1, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithBlocks(world, box, 2, 2, sizeZ, 4, 2, sizeZ, Blocks.fence, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 5, 2, sizeZ, 6, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 1, 3, sizeZ, 6, 3, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ - 1, 6, 3, sizeZ - 1, false, rand, RandomSandstone); //Right Wall + this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ - 2, 6, 0, sizeZ - 2, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 6, 3, sizeZ - 2, 6, 3, sizeZ - 2, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 6, 0, 1, 6, 3, sizeZ - 3, false, rand, RandomSandstone); + + this.fillWithBlocks(world, box, 1, 0, 1, 5, 0, sizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor + //this.fillWithRandomizedBlocks(world, box, 1, sizeY - 1, 0, 5, sizeY - 1, sizeZ, false, rand, RandomSandstone); //Ceiling + this.fillWithBlocks(world, box, 1, sizeY - 1, 0, 5, sizeY - 1, sizeZ, Blocks.sandstone, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 0, sizeY - 1, 0, 0, sizeY - 1, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); //Roof + this.fillWithMetadataBlocks(world, box, 6, sizeY - 1, 0, 6, sizeY - 1, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 2, sizeY, 0, 4, sizeY, 0, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 3, sizeY, 1, 3, sizeY, 2, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 3, sizeY, 4, 3, sizeY, 6, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 3, sizeY, sizeZ - 1, box); + this.fillWithMetadataBlocks(world, box, 2, sizeY, sizeZ, 4, sizeY, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); + + //House 2 + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 0, sizeX, 0, 0, false, rand, RandomSandstone); //Back Wall + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 1, 0, sizeX - 2, 1, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 0, sizeX - 6, 2, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 6, 2, 0, box); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 3, 2, 0, box); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 1, sizeX - 6, 3, 1, false, rand, RandomSandstone); //Left Wall + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 2, sizeX - 6, 0, 2, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 3, 2, sizeX - 6, 3, sizeZ - 1, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 6, sizeY - 1, 2, box); + this.fillWithMetadataBlocks(world, box, sizeX - 6, sizeY - 1, 4, sizeX - 6, sizeY - 1, sizeZ - 2, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 3, sizeX - 6, 1, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 2, sizeX - 6, 0, 2, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 3, sizeX - 6, 2, 3, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, sizeX - 6, 2, 4, box); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 5, sizeX - 6, 2, 5, false, rand, RandomSandstone); + this.fillWithBlocks(world, box, sizeX - 6, 2, sizeZ - 3, sizeX - 6, 2, sizeZ - 2, Blocks.fence, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, sizeZ - 1, sizeX - 6, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 5, 0, sizeZ, sizeX, 1, sizeZ, false, rand, RandomSandstone); //Front Wall + this.fillWithRandomizedBlocks(world, box, sizeX - 5, 2, sizeZ, sizeX - 5, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, sizeZ - 1, false, rand, RandomSandstone); //Right Wall + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 3, sizeX, 1, 3, false, rand, RandomSandstone); + this.fillWithMetadataBlocks(world, box, sizeX, 1, 4, sizeX, 1, 5, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, sizeZ - 1, sizeX, 1, sizeZ - 3, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX, 1, sizeZ - 1, box); + + this.fillWithBlocks(world, box, sizeX - 5, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor + + //Loot & Decorations + //House 1 + int eastMeta = this.getDecoMeta(4); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_boiler_off, 4, 1, 1, 1, box); + this.fillWithBlocks(world, box, 1, 2, 1, 1, 3, 1, ModBlocks.deco_pipe_quad_rusted, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.deco_pipe_rim_rusted, 0, 1, sizeY, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 2, 1, 3, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, 1, 1, sizeZ - 4, box); + if(!hasPlacedLoot[0]) { + this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), 1, 1, sizeZ - 2, box); + WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.machineParts, (TileEntityChest)world.getTileEntity(this.getXWithOffset(1, sizeZ - 2), + this.getYWithOffset(1), this.getZWithOffset(1, sizeZ - 2)), 10); + this.hasPlacedLoot[0] = true; + } + this.fillWithBlocks(world, box, 4, 1, sizeZ - 1, 5, 1, sizeZ - 1, ModBlocks.crate, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 5, 1, 4, 5, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 5, 1, 6, 5, 3, 6, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.steel_grate, 7, 5, 1, 5, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 5, 2, 5, box); + + //House 2 + if(!hasPlacedLoot[1]) { + this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), sizeX - 5, 1, 1, box); + WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.antenna, (TileEntityChest)world.getTileEntity(this.getXWithOffset(sizeX - 5, 1), + this.getYWithOffset(1), this.getZWithOffset(sizeX - 5, 1)), 10); + this.hasPlacedLoot[1] = true; + } + this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), sizeX - 5, 1, 4, box); + TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(sizeX - 5, 4), this.getYWithOffset(1), this.getZWithOffset(sizeX - 5, 4)); + + if(bobble != null) { + bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; + bobble.markDirty(); + } + + this.randomlyFillWithBlocks(world, box, rand, 0.25F, sizeX - 4, 1, 1, sizeX - 1, 1, sizeZ - 1, Blocks.sand, Blocks.air, false); + + return true; + } + } + + public static class NTMLab1 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + private static LabTiles RandomLabTiles = new LabTiles(); + + private boolean[] hasPlacedLoot = new boolean[2]; + + public NTMLab1() { + super(); + } + + /** Constructor for this feature; takes coordinates for bounding box */ + public NTMLab1(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 9, 4, 7); + this.hasPlacedLoot[0] = false; + this.hasPlacedLoot[1] = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); + nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); + this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); + } + + @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); + + for(byte i = 0; i < this.sizeX + 1; i++) { + for(byte j = 0; j < this.sizeZ - 1; j++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); + } + } + + for(byte i = 3; i < this.sizeX + 1; i++) { + for(byte j = 6; j < this.sizeZ + 1; j++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); + } + } + + int stairsMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 0); + if(this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box).getMaterial().isReplaceable() + || this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box) == Blocks.air) { + this.func_151554_b(world, Blocks.stonebrick, 0, 2, -1, sizeZ - 1, box); + this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairsMeta, 2, 0, sizeZ - 1, box); + } + + this.fillWithAir(world, box, 1, 0, 1, sizeX - 1, sizeY, 4); + this.fillWithAir(world, box, 4, 0, 4, sizeX - 1, sizeY, sizeZ - 1); + this.fillWithAir(world, box, 3, 1, sizeZ - 1, 3, 2, sizeZ - 1); + + int pillarMeta = this.getPillarMeta(8); + + //Pillars + this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, 4, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX, 0, 1, sizeX, 0, sizeZ - 1, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false); + this.fillWithBlocks(world, box, 0, 0, sizeZ - 2, 0, 3, sizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, 3, 0, sizeZ - 2, 3, 3, sizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, 3, 0, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + + //Walls + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, sizeY - 1, 0, false, rand, RandomConcreteBricks); //Back Wall + this.fillWithRandomizedBlocks(world, box, 0, sizeY, 0, sizeX, sizeY, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, sizeY - 1, 4, false, rand, RandomConcreteBricks); //Left Wall + this.fillWithRandomizedBlocks(world, box, 0, sizeY, 0, 0, sizeY, sizeZ - 2, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ - 2, 2, sizeY, sizeZ - 2, false, rand, RandomConcreteBricks); //Front Wall Pt. 1 + this.placeBlockAtCurrentPosition(world, ModBlocks.brick_concrete_broken, 0, 3, sizeY, sizeZ - 2, box); + this.fillWithRandomizedBlocks(world, box, 3, sizeY - 1, sizeZ - 1, 3, sizeY, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 4, 0, sizeZ, sizeX - 1, 1, sizeZ, false, rand, RandomConcreteBricks); //Front Wall Pt. 2 + this.fillWithRandomizedBlocks(world, box, 4, 2, sizeZ, 4, 3, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX - 1, 3, sizeZ, false, rand, RandomConcreteBricks); + this.randomlyFillWithBlocks(world, box, rand, 0.75F, 5, 2, sizeZ, sizeX - 2, 3, sizeZ, Blocks.glass_pane, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 3, sizeY, sizeZ, sizeX, sizeY, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, sizeY, sizeZ - 1, false, rand, RandomConcreteBricks); //Right Wall + + //Floor & Ceiling + this.fillWithRandomizedBlocks(world, box, 1, 0, 1, sizeX - 1, 0, 4, false, rand, RandomLabTiles); //Floor + this.fillWithRandomizedBlocks(world, box, 4, 0, sizeZ - 2, sizeX - 1, 0, sizeZ - 1, false, rand, RandomLabTiles); + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 3, 0, sizeZ - 1, box); + + this.fillWithBlocks(world, box, 1, sizeY - 1, 1, 1, sizeY, 4, ModBlocks.reinforced_glass, Blocks.air, false); //Ceiling + this.fillWithBlocks(world, box, 2, sizeY, 1, sizeX - 1, sizeY, 4, ModBlocks.brick_light, Blocks.air, false); + this.fillWithBlocks(world, box, 4, sizeY, sizeZ - 2, sizeX - 1, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); + + //Decorations & Loot + this.fillWithMetadataBlocks(world, box, 1, 1, 1, 1, 1, 4, Blocks.dirt, 2, Blocks.air, 0, false); + int westDecoMeta = this.getDecoMeta(5); + this.fillWithMetadataBlocks(world, box, 2, 1, 1, 2, 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 2, sizeY - 1, 1, 2, sizeY - 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); + for(byte i = 0; i < 4; i++) { + this.placeBlockAtCurrentPosition(world, ModBlocks.plant_flower, i, 1, 2, 1 + i, box); + } + + int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 2); + this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, 3, 1, sizeZ - 1, box); + ItemDoor.placeDoorBlock(world, this.getXWithOffset(3, sizeZ - 1), this.getYWithOffset(1), this.getZWithOffset(3, sizeZ - 1), doorMeta, ModBlocks.door_office); + + int northDecoMeta = this.getDecoMeta(3); + this.fillWithMetadataBlocks(world, box, 5, sizeY - 1, 1, sizeX - 1, sizeY - 1, 1, ModBlocks.steel_scaffold, westDecoMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 5, sizeY - 1, 2, sizeX - 1, sizeY - 1, 2, ModBlocks.steel_wall, northDecoMeta, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_electric_furnace_off, northDecoMeta, 5, 1, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_microwave, northDecoMeta, 5, 2, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, 6, 1, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_shredder, 0, sizeX - 2, 1, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, sizeX - 1, 1, 1, box); + this.fillWithBlocks(world, box, 5, 1, 3, sizeX - 1, 1, 3, ModBlocks.deco_titanium, Blocks.air, false); + if(!hasPlacedLoot[0]) { + this.placeBlockAtCurrentPosition(world, ModBlocks.deco_loot, 0, 6, 2, 3, box); + LootGenerator.lootMedicine(world, this.getXWithOffset(6, 3), this.getYWithOffset(2), this.getZWithOffset(6, 3)); + this.hasPlacedLoot[0] = true; + } + + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, sizeX - 1, 1, sizeZ - 2, box); + if(!hasPlacedLoot[1]) { + this.hasPlacedLoot[1] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, sizeX - 1, 1, sizeZ - 1, HbmChestContents.modGeneric, 8); + } + + return true; + } + } + + public static class NTMLab2 extends Feature { + + private static SuperConcrete RandomSuperConcrete = new SuperConcrete(); + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + private static LabTiles RandomLabTiles = new LabTiles(); + + private boolean[] hasPlacedLoot = new boolean[2]; + + public NTMLab2() { + super(); + } + + public NTMLab2(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 12, 11, 8); + this.hasPlacedLoot[0] = false; + this.hasPlacedLoot[1] = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); + nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); + this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); + } + + @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; + } + this.boundingBox.offset(0, -7, 0); + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + for(byte i = 0; i < sizeX + 1; i++) { + for(byte j = 0; j < sizeZ - 1; j++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box); + } + } + + for(byte i = 0; i < 7; i++) { + for(byte j = 7; j < sizeZ + 1; j++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box); + } + } + + if(this.getBlockAtCurrentPosition(world, sizeX - 3, sizeY - 4, 7, box).getMaterial().isReplaceable() + || this.getBlockAtCurrentPosition(world, sizeX - 3, sizeY - 4, 7, box) == Blocks.air) { + int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 2); + this.func_151554_b(world, Blocks.stonebrick, 0, sizeX - 3, sizeY - 4, 7, box); + this.func_151554_b(world, Blocks.stonebrick, 0, sizeX - 2, sizeY - 4, 7, box); + this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 4, 7, sizeX - 2, sizeY - 4, 7, Blocks.stone_brick_stairs, stairMeta, Blocks.air, 0, false); + } + + + this.fillWithAir(world, box, 1, sizeY - 4, 1, sizeX - 1, sizeY, sizeZ - 3); + this.fillWithAir(world, box, 1, sizeY - 4, sizeZ - 2, 5, sizeY, sizeZ - 1); + this.fillWithAir(world, box, sizeX - 3, sizeY - 3, sizeZ - 2, sizeX - 2, sizeY - 2, sizeZ - 2); + this.fillWithAir(world, box, 5, 5, 1, 6, 6, 2); + this.fillWithAir(world, box, 2, 0, 2, sizeX - 2, 3, sizeZ - 2); + + //Walls + this.fillWithRandomizedBlocks(world, box, 0, sizeY - 4, 0, sizeX, sizeY, 0, false, rand, RandomSuperConcrete); //Back Wall + this.fillWithRandomizedBlocks(world, box, 0, sizeY - 4, 0, 0, sizeY, sizeZ, false, rand, RandomSuperConcrete); //Left Wall + this.fillWithRandomizedBlocks(world, box, 1, sizeY - 4, sizeZ, 5, sizeY - 4, sizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 1 + this.fillWithBlocks(world, box, 1, sizeY - 3, sizeZ, 1, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 2, sizeY - 4, sizeZ, 2, sizeY - 1, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 3, sizeY - 3, sizeZ, 3, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 4, sizeY - 4, sizeZ, 4, sizeY - 1, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 5, sizeY - 3, sizeZ, 5, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, sizeY, sizeZ, 5, sizeY, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 6, sizeY - 4, sizeZ - 1, 6, sizeY, sizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 2 + this.fillWithRandomizedBlocks(world, box, 6, sizeY - 4, sizeZ - 2, 7, sizeY - 2, sizeZ - 2, false, rand, RandomSuperConcrete); //Front Wall pt. 3 + this.fillWithBlocks(world, box, 6, sizeY - 1, sizeZ - 2, 7, sizeY - 1, sizeZ - 2, ModBlocks.concrete_super_broken, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 4, sizeZ - 2, sizeX, sizeY - 4, sizeZ - 2, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 3, sizeZ - 2, sizeX - 4, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, sizeX - 3, sizeY - 1, sizeZ - 2, sizeX - 2, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, sizeY - 4, sizeZ - 2, sizeX, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 4, 1, sizeX, sizeY - 4, sizeZ - 3, false, rand, RandomSuperConcrete); //Right Wall + this.fillWithBlocks(world, box, sizeX, sizeY - 3, sizeZ - 3, sizeX, sizeY - 1, sizeZ - 3, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 3, 4, sizeX, sizeY - 1, 4, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, sizeX, sizeY - 3, 3, sizeX, sizeY - 1, 3, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 3, 2, sizeX, sizeY - 1, 2, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, sizeX, sizeY - 3, 1, sizeX, sizeY - 1, 1, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX, sizeY, 1, sizeX, sizeY, sizeZ - 3, false, rand, RandomSuperConcrete); + + this.fillWithBlocks(world, box, 1, 0, 1, sizeX - 1, 3, 1, ModBlocks.reinforced_stone, Blocks.air, false); //Back Wall + this.fillWithBlocks(world, box, 1, 0, 2, 1, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Left Wall + this.fillWithBlocks(world, box, 1, 0, sizeZ - 1, sizeX - 1, 3, sizeZ - 1, ModBlocks.reinforced_stone, Blocks.air, false); //Front Wall + this.fillWithBlocks(world, box, sizeX - 1, 0, 2, sizeX - 1, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); // Right Wall + this.fillWithBlocks(world, box, 6, 0, 3, 6, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Internal Wall + + //Floors & Ceiling + this.fillWithRandomizedBlocks(world, box, 1, sizeY - 4, 1, 3, sizeY - 4, sizeZ - 1, false, rand, RandomLabTiles); //Left Floor + this.fillWithRandomizedBlocks(world, box, 4, sizeY - 4, sizeZ - 2, 5, sizeY - 4, sizeZ - 1, false, rand, RandomLabTiles); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 4, 1, sizeX - 1, sizeY - 4, sizeZ - 3, false, rand, RandomLabTiles); //Right Floor + this.fillWithRandomizedBlocks(world, box, sizeX - 3, sizeY - 4, sizeZ - 2, sizeX - 2, sizeY - 4, sizeZ - 2, false, rand, RandomLabTiles); + this.fillWithBlocks(world, box, 4, sizeY - 4, 1, 7, sizeY - 4, 1, ModBlocks.tile_lab_broken, Blocks.air, false); //Center Floor (Pain) + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 4, sizeY - 4, 2, box); + this.fillWithBlocks(world, box, 4, sizeY - 4, 3, 4, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 5, sizeY - 4, 3, box); + this.fillWithBlocks(world, box, 5, sizeY - 4, 4, 5, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 6, sizeY - 4, 4, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 6, sizeY - 4, 5, box); + this.fillWithBlocks(world, box, 7, sizeY - 4, 2, 7, sizeY - 4, 3, ModBlocks.tile_lab_broken, Blocks.air, false); + this.fillWithBlocks(world, box, 7, sizeY - 4, 4, 7, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); + + this.fillWithBlocks(world, box, 1, sizeY, 1, 2, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Left Ceiling + this.fillWithBlocks(world, box, 3, sizeY, sizeZ - 2, 4, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); + this.fillWithBlocks(world, box, sizeX - 3, sizeY, 1, sizeX - 1, sizeY, sizeZ - 3, ModBlocks.brick_light, Blocks.air, false); //Right Ceiling + this.fillWithBlocks(world, box, 3, sizeY, 1, 8, sizeY, 1, ModBlocks.waste_planks, Blocks.air, false); //Center Ceiling (Pain) + this.fillWithBlocks(world, box, 3, sizeY, 2, 4, sizeY, 2, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 7, sizeY, 2, 8, sizeY, 2, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 3, sizeY, 3, 3, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 4, sizeY, 4, 4, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 5, sizeY, 6, 5, sizeY, sizeZ - 1, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 8, sizeY, 3, 8, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false); + + this.fillWithRandomizedBlocks(world, box, 2, 0, 2, 5, 0, sizeZ - 2, false, rand, RandomLabTiles); //Floor + this.fillWithRandomizedBlocks(world, box, 6, 0, 2, 6, 0, 3, false, rand, RandomLabTiles); + this.fillWithRandomizedBlocks(world, box, 7, 0, 2, sizeX - 2, 0, sizeZ - 2, false, rand, RandomLabTiles); + + this.fillWithRandomizedBlocks(world, box, 1, 4, 1, sizeX - 1, 4, sizeZ - 1, false, rand, RandomConcreteBricks); //Ceiling + + //Decorations & Loot + int eastMeta = this.getDecoMeta(4); + int westMeta = this.getDecoMeta(5); + int northMeta = this.getDecoMeta(3); + int southMeta = this.getDecoMeta(2); + this.placeBlockAtCurrentPosition(world, ModBlocks.crashed_balefire, southMeta, 6, sizeY - 2, 3, box); + + int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 1); + this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, sizeX - 3, sizeY - 3, sizeZ - 2, box); + ItemDoor.placeDoorBlock(world, this.getXWithOffset(sizeX - 3, sizeZ - 2), this.getYWithOffset(sizeY - 3), this.getZWithOffset(sizeX - 3, sizeZ - 2), + doorMeta, ModBlocks.door_office); + this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, sizeX - 2, sizeY - 3, sizeZ - 2, box); + ItemDoor.placeDoorBlock(world, this.getXWithOffset(sizeX - 2, sizeZ - 2), this.getYWithOffset(sizeY - 3), this.getZWithOffset(sizeX - 2, sizeZ - 2), + doorMeta, ModBlocks.door_office); + + this.fillWithBlocks(world, box, 1, sizeY - 3, 1, 1, sizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 1, sizeY - 3, 2, 1, sizeY - 2, 3, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, westMeta, 1, sizeY - 1, 2, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, 1, sizeY - 1, 3, box); + this.fillWithBlocks(world, box, 1, sizeY - 3, 6, 1, sizeY - 1, 6, ModBlocks.deco_pipe_framed_rusted, Blocks.air, false); + + this.fillWithMetadataBlocks(world, box, sizeX - 4, sizeY - 3, 1, sizeX - 4, sizeY - 1, 1, ModBlocks.steel_wall, eastMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 1, 1, sizeX - 2, sizeY - 1, 1, ModBlocks.steel_grate, 0, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 2, 1, sizeX - 2, sizeY - 2, 1, ModBlocks.tape_recorder, northMeta, Blocks.air, 0, false); + this.fillWithBlocks(world, box, sizeX - 3, sizeY - 3, 1, sizeX - 2, sizeY - 3, 1, ModBlocks.deco_steel, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, sizeX - 1, sizeY - 3, 1, sizeX - 1, sizeY - 1, 1, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); + + this.fillWithMetadataBlocks(world, box, 2, 1, 2, 2, 1, sizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.vitrified_barrel, 0, 2, 2, 2, box); + this.fillWithMetadataBlocks(world, box, 3, 1, 2, 3, 3, 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 3, 1, 4, 3, 3, 4, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 3, 1, sizeZ - 2, 3, 3, sizeZ - 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 4, 1, sizeZ - 2, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_lead, 0, 4, 2, sizeZ - 2, box); + if(!hasPlacedLoot[0]) { + this.hasPlacedLoot[0] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, 5, 1, sizeZ - 2, HbmChestContents.nuclearFuel, 10); + } + this.fillWithBlocks(world, box, 4, 1, sizeZ - 3, 5, 1, sizeZ - 3, ModBlocks.crate_lead, Blocks.air, false); + + this.fillWithBlocks(world, box, sizeX - 5, 1, sizeZ - 2, sizeX - 5, 3, sizeZ - 2, ModBlocks.deco_steel, Blocks.air, false);; + this.fillWithMetadataBlocks(world, box, sizeX - 4, 1, sizeZ - 2, sizeX - 2, 1, sizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 4, 2, sizeZ - 2, sizeX - 3, 2, sizeZ - 2, ModBlocks.tape_recorder, southMeta, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, sizeX - 2, 2, sizeZ - 2, box); + this.fillWithBlocks(world, box, sizeX - 4, 3, sizeZ - 2, sizeX - 2, 3, sizeZ - 2, ModBlocks.steel_roof, Blocks.air, false); + if(!hasPlacedLoot[1]) { + this.hasPlacedLoot[1] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, sizeX - 2, 1, 3, HbmChestContents.nukeTrash, 9); + } + + return true; + } + } + + public static class NTMWorkshop1 extends Feature { + + private static SuperConcrete RandomSuperConcrete = new SuperConcrete(); + + private boolean hasPlacedLoot; + + public NTMWorkshop1() { + super(); + } + + public NTMWorkshop1(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 10, 6, 8); + this.hasPlacedLoot = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot", this.hasPlacedLoot); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot = nbt.getBoolean("hasLoot"); + } + + @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); + + for(byte i = 1; i < sizeX - 2; i++) { + for(byte j = 0; j < sizeZ + 1; j++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); + } + } + + for(byte i = 8; i < sizeX + 1; i++) { + for(byte j = 1; j < 7; j++) { + this.func_151554_b(world, Blocks.dirt, 0, i, -1, j, box); + } + } + + this.fillWithAir(world, box, 1, 0, 0, sizeX - 3, sizeY - 2, sizeZ); + this.fillWithAir(world, box, sizeX - 2, 0, 2, sizeX - 1, 2, 5); + + if(this.getBlockAtCurrentPosition(world, 0, 0, 5, box).getMaterial().isReplaceable() + || this.getBlockAtCurrentPosition(world, 0, 0, 5, box) == Blocks.air) { + int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 1); + this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairMeta, 0, 0, 5, box); + + for(byte i = 1; 1 < sizeZ; i++) { + this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); + } + + this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, Blocks.stone_slab, 5, Blocks.air, 0, false); + } + + //Walls + int pillarMetaWE = this.getPillarMeta(4); + int pillarMetaNS = this.getPillarMeta(8); + this.fillWithBlocks(world, box, 1, 0, 0, 1, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, 0, box); + this.fillWithMetadataBlocks(world, box, 2, 4, 0, sizeX - 4, 4, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, sizeX - 3, 4, 0, box); + this.fillWithBlocks(world, box, sizeX - 3, 0, 0, sizeX - 3, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 2, 0, 0, sizeX - 4, 1, 0, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 2, 0, 2, 2, 0, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 3, 2, 0, 5, 2, 0, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, 2, 0, sizeX - 4, 2, 0, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 3, 0, sizeX - 4, 3, 0, false, rand, RandomSuperConcrete); + this.fillWithMetadataBlocks(world, box, 1, 4, 1, 1, 4, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, sizeZ, box); + this.fillWithBlocks(world, box, 1, 0, sizeZ, 1, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 1, 1, 1, 4, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 1, 2, 1, 1, 2, 1, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 1, 2, 2, 1, 2, 3, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 2, 4, 1, 2, 4, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 1, 3, 1, 1, 3, sizeZ - 1, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ - 2, 1, 3, sizeZ - 1, false, rand, RandomSuperConcrete); + this.fillWithMetadataBlocks(world, box, 2, 4, sizeZ, sizeX - 4, 4, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, sizeX - 3, 4, sizeZ, box); + this.fillWithBlocks(world, box, sizeX - 3, 0, sizeZ, sizeX - 3, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 2, 0, sizeZ, sizeX - 4, 1, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 2, sizeZ, 2, 2, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 3, 2, sizeZ, 5, 2, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, 2, sizeZ, sizeX - 4, 2, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 3, sizeZ, sizeX - 4, 3, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithMetadataBlocks(world, box, sizeX - 3, 4, 1, sizeX - 3, 4, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall + this.fillWithRandomizedBlocks(world, box, sizeX - 3, 0, 1, sizeX - 3, 3, sizeZ - 1, false, rand, RandomSuperConcrete); + + pillarMetaWE = this.getPillarMeta(5); + pillarMetaNS = this.getPillarMeta(9); + this.fillWithMetadataBlocks(world, box, sizeX - 2, 2, 1, sizeX - 1, 2, 1, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Back Wall + this.fillWithMetadataBlocks(world, box, sizeX, 0, 1, sizeX, 2, 1, Blocks.log, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 1, sizeX - 1, 1, 1, Blocks.planks, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX, 2, 2, sizeX, 2, 5, Blocks.log, pillarMetaNS, Blocks.air, 0, false); //Right Wall + this.fillWithMetadataBlocks(world, box, sizeX, 0, 6, sizeX, 2, 6, Blocks.log, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX, 0, 3, sizeX, 1, 5, Blocks.planks, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 2, 2, 6, sizeX - 1, 2, 6, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Front Wall + this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 6, sizeX - 1, 1, 6, Blocks.planks, 1, Blocks.air, 0, false); + + //Floor & Ceiling + this.fillWithBlocks(world, box, 2, 0, 1, 6, 0, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Floor + this.placeBlockAtCurrentPosition(world, ModBlocks.brick_light, 0, 1, 0, 5, box); + this.fillWithRandomizedBlocks(world, box, 2, 4, 1, 6, 4, 3, false, rand, RandomSuperConcrete); //Ceiling + this.fillWithRandomizedBlocks(world, box, 2, 4, 4, 2, 4, 4, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 5, 4, 4, 6, 4, 4, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 4, sizeZ - 3, 6, 4, sizeZ - 1, false, rand, RandomSuperConcrete); + + this.fillWithBlocks(world, box, sizeX - 2, 2, 2, sizeX - 1, 2, 5, ModBlocks.deco_steel, Blocks.air, false); + + //Loot & Decorations + int southMeta = this.getDecoMeta(2); + int eastMeta = this.getDecoMeta(5); + this.placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 2, sizeY - 1, 1, box); + this.fillWithBlocks(world, box, 3, sizeY - 1, 1, 4, sizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); + this.fillWithBlocks(world, box, 2, sizeY - 1, 2, 4, sizeY - 1, 2, ModBlocks.deco_steel, Blocks.air, false); + this.fillWithBlocks(world, box, 2, sizeY, 1, 4, sizeY, 2, ModBlocks.steel_roof, Blocks.air, false); + this.fillWithBlocks(world, box, 2, 1, 1, 2, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false); + this.fillWithBlocks(world, box, 3, 1, 1, 3, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_generator, 0, 4, 1, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_detector, 0, 4, 1, 2, box); + this.fillWithBlocks(world, box, 5, 1, 1, 5, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false); + this.fillWithBlocks(world, box, 6, 1, 1, 6, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false); + this.fillWithBlocks(world, box, 3, 1, 4, 4, 1, 4, ModBlocks.concrete_super_broken, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 6, 1, 4, 6, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 6, 1, 5, 6, 1, 7, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.radiorec, eastMeta, 6, 2, sizeZ - 1, box); + this.fillWithMetadataBlocks(world, box, 2, 1, sizeZ - 1, 3, 1, sizeZ - 1, ModBlocks.machine_electric_furnace_off, southMeta, Blocks.air, 0, false); + if(!hasPlacedLoot) { + this.hasPlacedLoot = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, 4, 1, sizeZ - 1, HbmChestContents.machineParts, 11); + } + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 5, 3, 1, box); + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 2, 1, 2, box); + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 1, 2, box); + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 2, 5, box); + + this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 5, sizeX - 1, 0, 5, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, southMeta, sizeX - 2, 1, 5, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), sizeX - 1, 1, 5, box); + TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(sizeX - 1, 5), this.getYWithOffset(1), this.getZWithOffset(sizeX - 1, 5)); + + if(bobble != null) { + bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; + bobble.markDirty(); + } + this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 2, sizeX - 2, 0, 3, Blocks.log, pillarMetaWE, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, Blocks.log, pillarMetaWE, sizeX - 2, 1, 2, box); + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, sizeX - 2, 1, 3, box); + + return true; + } + } + +} diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index 0ffce977c..8eb36dc6a 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -5,6 +5,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; +import com.hbm.config.StructureConfig; import com.hbm.tileentity.machine.storage.TileEntityCrateIron; import net.minecraft.block.Block; @@ -180,6 +181,7 @@ abstract public class Feature extends StructureComponent { IInventory inventory = (IInventory)world.getTileEntity(posX, posY, posZ); if(inventory != null) { + amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor); WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount); return true; } diff --git a/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java b/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java index 49bf2cad6..d6dcbfe9a 100644 --- a/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java @@ -4,12 +4,12 @@ import java.util.LinkedList; import java.util.Random; import com.hbm.blocks.ModBlocks; -import com.hbm.world.worldgen.ComponentNTMFeatures; import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; +//These structures are... kind of? low quality, but they test out new methods so whatev. public class MilitaryBaseFeatures { //stop-gap methods until this entire mess can be organized into proper classes/structure groups @@ -21,7 +21,8 @@ public class MilitaryBaseFeatures { components.add(helipad); components.add(radio); } - + + //ugh public static int[] getAdjacentChunk(int chunkX, int chunkZ, Random rand) { int[] chunkPos = new int[2]; diff --git a/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java b/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java new file mode 100644 index 000000000..7dd67bd39 --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java @@ -0,0 +1,279 @@ +package com.hbm.world.worldgen.components; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; + +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; + +public class RuinFeatures { + + public static class NTMRuin1 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + + public NTMRuin1() { + super(); + } + + public NTMRuin1(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, 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); + + for(byte i = 0; i < sizeX + 1; i++) { + for(byte j = 0; j < sizeZ + 1; j++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); + } + } + + int pillarMetaWE = this.getPillarMeta(4); + int pillarMetaNS = this.getPillarMeta(8); + + this.fillWithBlocks(world, box, 0, 0, 0, 0, sizeY, 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, sizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 5, 3, 0, sizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, sizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 3, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 3, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 1, 0, 5, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 4, 0, 3, 4, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 4, 0, sizeX - 1, 4, 0, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall + this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, sizeY - 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 2, 2, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 2, 6, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, sizeZ - 2, 0, 2, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 4, 1, 0, 4, 5, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 5, 1, 0, 5, 2, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 4, sizeZ - 2, 0, 4, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, 1, 3, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall + this.fillWithBlocks(world, box, 4, 0, sizeZ, 4, sizeY - 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 5, 3, sizeZ, sizeX - 1, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, sizeY - 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 3, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 1, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 3, 1, sizeZ, 3, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 1, sizeZ, 5, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, sizeZ, sizeX - 1, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, sizeX, 3, 1, sizeX, 3, 2, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall + this.fillWithMetadataBlocks(world, box, sizeX, 3, sizeZ - 1, sizeX, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, 2, 2, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, 6, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, sizeZ - 2, sizeX, 1, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 2, sizeZ - 1, sizeX, 2, sizeZ - 1, false, rand, RandomConcreteBricks); + + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false); + + return true; + } + } + + public static class NTMRuin2 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + + public NTMRuin2() { + super(); + } + + public NTMRuin2(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, 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); + + for(byte i = 0; i < sizeX + 1; i++) { + for(byte j = 0; j < sizeZ + 1; j++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, 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, sizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 4, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 3, 4, 0, sizeX - 1, 4, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, sizeY, 0, sizeX - 1, sizeY, 0, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall + this.fillWithBlocks(world, box, 0, 0, 5, 0, 0, 5, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 2, 3, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 0, sizeZ - 3, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, sizeZ - 1, 0, 1, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, sizeX - 1, 3, sizeZ, sizeX - 1, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 1, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, sizeZ, sizeX - 1, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, sizeX, 3, 1, sizeX, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall + this.fillWithBlocks(world, box, sizeX, 0, 5, sizeX, 4, 5, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, sizeX, 3, sizeZ - 2, sizeX, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, 2, 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 3, sizeX, 2, 3, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 4, sizeX, 1, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 6, sizeX, 1, 7, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, sizeZ - 1, sizeX, 2, sizeZ - 1, false, rand, RandomConcreteBricks); + + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false); + + return true; + } + } + + public static class NTMRuin3 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + + public NTMRuin3() { + super(); + } + + public NTMRuin3(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, 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); + + for(byte i = 0; i < sizeZ + 1; i++) { + this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); + this.func_151554_b(world, Blocks.stonebrick, 0, sizeX, -1, i, box); + } + + for(byte i = 1; i < sizeX; i++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 0, box); + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 4, box); + } + + this.fillWithBlocks(world, box, 0, 0, 0, 0, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall + this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 1, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 1, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 2, 0, sizeX - 2, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, 0, 0, 4, 0, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Left Wall + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 0, 0, sizeZ, box); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, 3, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 0, 5, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 5, 0, 1, 5, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 7, 0, 1, 7, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, sizeX, 0, 4, sizeX, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 1, 3, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 5, sizeX, 0, 6, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, sizeZ - 1, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks); + 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, sizeX - 1, 1, 4, false, rand, RandomConcreteBricks); + + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, sizeX - 1, 0, 3, Blocks.gravel, Blocks.air, false); + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 5, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false); + + return true; + } + } + + public static class NTMRuin4 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + + public NTMRuin4() { + super(); + } + + public NTMRuin4(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, 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); + + for(byte i = 0; i < sizeZ + 1; i++) { + this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); + this.func_151554_b(world, Blocks.stonebrick, 0, i >= 5 ? sizeX : 5, -1, i, box); //elegant solution + } + + for(byte i = 1; i < sizeX; i++) { + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, sizeZ, box); + this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, i > 4 ? 5 : 0, box); //ternary operators my beloved + } + + 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, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 4, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, 5, 0, 5, 5, sizeY, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 1 + this.fillWithRandomizedBlocks(world, box, 5, 0, 1, 5, 0, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 1, 1, 5, 1, 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 1, 4, 5, 1, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 2, 1, 5, 2, 4, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, sizeX, 0, 5, sizeX, 1, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 2 + this.fillWithRandomizedBlocks(world, box, 6, 0, 5, sizeX - 1, 0, 5, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 6, 1, 5, 6, 1, 5, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 5, sizeX - 1, 1, 5, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 2 + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 6, sizeX, 1, sizeZ - 3, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, 0, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Front Wall + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ, 7, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 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, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false); + + return true; + } + } + +} From 5060276173b026e4885a5f95f9b85bca876a6880 Mon Sep 17 00:00:00 2001 From: Vaern Date: Sun, 4 Sep 2022 00:42:22 -0700 Subject: [PATCH 050/111] BlockDecoModel class, or more importantly, DECO COMPUTERS! remind me to figure out how smooth-shading works for ISBRHs tomorrow as it is half past midnight --- src/main/java/com/hbm/blocks/ModBlocks.java | 7 +- .../hbm/blocks/generic/BlockDecoModel.java | 102 ++ src/main/java/com/hbm/main/ClientProxy.java | 3 +- .../java/com/hbm/main/ResourceManager.java | 2 + .../render/block/RenderBlockDecoModel.java | 91 ++ .../assets/hbm/models/blocks/puter.obj | 966 ++++++++++++++++++ .../hbm/textures/blocks/deco_computer_0.png | Bin 0 -> 1832 bytes 7 files changed, 1169 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockDecoModel.java create mode 100644 src/main/java/com/hbm/render/block/RenderBlockDecoModel.java create mode 100644 src/main/resources/assets/hbm/models/blocks/puter.obj create mode 100644 src/main/resources/assets/hbm/textures/blocks/deco_computer_0.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 449968504..0a02fa292 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -387,6 +387,8 @@ public class ModBlocks { public static Block brick_dungeon_circle; public static Block brick_forgotten; + + public static Block deco_computer; public static Block tape_recorder; public static Block steel_poles; @@ -1640,7 +1642,9 @@ public class ModBlocks { brick_dungeon_circle = new BlockGeneric(Material.rock).setBlockName("brick_dungeon_circle").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":brick_dungeon_circle"); brick_forgotten = new BlockGeneric(Material.rock).setBlockName("brick_forgotten").setCreativeTab(MainRegistry.blockTab).setBlockUnbreakable().setResistance(1000000).setBlockTextureName(RefStrings.MODID + ":brick_forgotten"); - + + deco_computer = new BlockDecoModel(Material.iron, 1).setBlockName("deco_computer").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":deco_computer"); + tape_recorder = new DecoTapeRecorder(Material.iron).setBlockName("tape_recorder").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_tape_recorder"); steel_poles = new DecoSteelPoles(Material.iron).setBlockName("steel_poles").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam"); pole_top = new DecoPoleTop(Material.iron).setBlockName("pole_top").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_pole_top"); @@ -2741,6 +2745,7 @@ public class ModBlocks { GameRegistry.registerBlock(brick_dungeon_tile, brick_dungeon_tile.getUnlocalizedName()); GameRegistry.registerBlock(brick_dungeon_circle, brick_dungeon_circle.getUnlocalizedName()); GameRegistry.registerBlock(brick_forgotten, brick_forgotten.getUnlocalizedName()); + GameRegistry.registerBlock(deco_computer, ItemBlockMeta.class, deco_computer.getUnlocalizedName()); GameRegistry.registerBlock(tape_recorder, tape_recorder.getUnlocalizedName()); GameRegistry.registerBlock(steel_poles, steel_poles.getUnlocalizedName()); GameRegistry.registerBlock(pole_top, pole_top.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java new file mode 100644 index 000000000..d62ae2d39 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java @@ -0,0 +1,102 @@ +package com.hbm.blocks.generic; + +import java.util.List; + +import com.hbm.lib.RefStrings; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class BlockDecoModel extends Block { + + //Allows between 1-4 differently colored/textured sub-blocks altogether. + int subTypes; + + public BlockDecoModel(Material mat, int types) { + super(mat); + subTypes = types; + } + + @SideOnly(Side.CLIENT) + protected IIcon[] icons; + + @Override + public int damageDropped(int meta) { + return meta & 12; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tabs, List list) { + for(byte i = 0; i < subTypes; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + icons = new IIcon[subTypes]; + + for(byte i = 0; i < subTypes; i++) + icons[i] = iconRegister.registerIcon(this.textureName + "_" + i); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return this.icons[(meta >> 2) % this.icons.length]; + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + //Did somebody say - pain? + //Alright fuckers, looks like 2/b010 = North, 3/b011 = South, 4/b100 = West, 5/b101 = East for sides. + //I'll just opt for something similar (0/b00 North, 1/b01 South, 2/b10 West, 3/b11 East) + + //Assumes meta is using the third and fourth bits. + @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; + + int meta; + + if((i & 1) != 1) + meta = i >> 1; //For North(b00>b00) and South(b10>b01), shift bits right by one + else { + if(i == 3) + meta = 2; //For West(b11>b10), just set to 2 + else + meta = 3; //For East(b01>b11), just set to 3 + } + + world.setBlockMetadataWithNotify(x, y, z, meta, 2); + } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index c10328f0c..62d6468a3 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -739,7 +739,8 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderBlockSideRotation()); RenderingRegistry.registerBlockHandler(new RenderDiode()); RenderingRegistry.registerBlockHandler(new RenderBoxDuct()); - + RenderingRegistry.registerBlockHandler(new RenderBlockDecoModel(ModBlocks.deco_computer.getRenderType(), ResourceManager.deco_computer)); + RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite)); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4)); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 42722b66b..38eb82021 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1249,6 +1249,8 @@ public class ResourceManager { public static final IModelCustom pipe_quad = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/pipe_quad.obj")); public static final IModelCustom pipe_frame = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/pipe_frame.obj")); + public static final IModelCustom deco_computer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/puter.obj")); + public static final IModelCustom rbmk_element = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_element.obj")); public static final IModelCustom rbmk_reflector = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_reflector.obj")); public static final IModelCustom rbmk_rods = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_rods.obj")); diff --git a/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java b/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java new file mode 100644 index 000000000..4f0b97a2f --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java @@ -0,0 +1,91 @@ +package com.hbm.render.block; + +import org.lwjgl.opengl.GL11; + +import com.hbm.render.util.ObjUtil; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.model.IModelCustom; +import net.minecraftforge.client.model.obj.WavefrontObject; + +public class RenderBlockDecoModel implements ISimpleBlockRenderingHandler { + + private int renderID; + private IModelCustom model; + + public RenderBlockDecoModel(int renderType, IModelCustom IModelCustom) { + renderID = renderType; + model = IModelCustom; + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + GL11.glPushMatrix(); + Tessellator tessellator = Tessellator.instance; + IIcon iicon = block.getIcon(0, metadata); + tessellator.setColorOpaque_F(1, 1, 1); + + if(renderer.hasOverrideBlockTexture()) { + iicon = renderer.overrideBlockTexture; + } + + tessellator.startDrawingQuads(); + ObjUtil.renderWithIcon((WavefrontObject) model, iicon, tessellator, modelId, false); + + tessellator.draw(); + + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int meta = world.getBlockMetadata(x, y, z); + IIcon iicon = block.getIcon(0, meta & 12); + tessellator.setColorOpaque_F(1, 1, 1); + + if(renderer.hasOverrideBlockTexture()) { + iicon = renderer.overrideBlockTexture; + } + + tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); + tessellator.setColorOpaque_F(1, 1, 1); + + float rotation = 0; + + switch(meta & 3) { + default: //North + rotation = (float) Math.PI; break; + case 1: //South + break; + case 2: //West + rotation = 1.5F * (float) Math.PI;break; + case 3: //East + rotation = 0.5F * (float) Math.PI; break; + } + + tessellator.addTranslation(x + 0.5F, y + 0.5F, z + 0.5F); + ObjUtil.renderWithIcon((WavefrontObject) model, iicon, tessellator, rotation, true); + tessellator.addTranslation(-x - 0.5F, -y - 0.5F, -z - 0.5F); + + return false; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return this.renderID; + } + +} diff --git a/src/main/resources/assets/hbm/models/blocks/puter.obj b/src/main/resources/assets/hbm/models/blocks/puter.obj new file mode 100644 index 000000000..9445788f7 --- /dev/null +++ b/src/main/resources/assets/hbm/models/blocks/puter.obj @@ -0,0 +1,966 @@ +# Blender v3.2.0 OBJ File: 'puter.blend' +# www.blender.org +o Cube.001_Cube.005 +v -0.369039 -0.501855 0.479973 +v -0.369039 -0.459563 0.479973 +v -0.369039 -0.501855 0.209191 +v -0.369039 -0.433180 0.209191 +v 0.369039 -0.501855 0.479973 +v 0.369039 -0.459563 0.479973 +v 0.369039 -0.501855 0.209191 +v 0.369039 -0.433180 0.209191 +vt 0.175000 0.175000 +vt -0.000000 0.150000 +vt 0.175000 0.150000 +vt 0.350000 0.225000 +vt 0.175000 0.200000 +vt 0.350000 0.200000 +vt 0.175000 0.225000 +vt -0.000000 0.200000 +vt -0.000000 0.225000 +vt 0.175000 0.225000 +vt 0.350000 0.250000 +vt 0.175000 0.250000 +vt 0.350000 0.150000 +vt 0.175000 0.200000 +vt 0.175000 0.150000 +vt -0.000000 0.150000 +vt 0.350000 0.000000 +vt 0.350000 0.150000 +vt -0.000000 0.200000 +vt 0.175000 0.225000 +vt 0.175000 0.175000 +vt 0.350000 0.225000 +vt 0.350000 0.200000 +vt -0.000000 0.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.9953 0.0970 +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/6/2 +f 7/7/3 6/8/3 5/9/3 +f 6/10/4 1/11/4 5/12/4 +f 7/13/5 1/14/5 3/15/5 +f 4/16/6 6/17/6 8/18/6 +f 2/1/1 4/19/1 3/2/1 +f 4/4/2 8/20/2 7/5/2 +f 7/7/3 8/21/3 6/8/3 +f 6/10/4 2/22/4 1/11/4 +f 7/13/5 5/23/5 1/14/5 +f 4/16/6 2/24/6 6/17/6 +o Cube +v 0.262500 0.290571 0.025979 +v -0.061658 -0.358688 -0.212822 +v -0.077958 -0.358688 -0.229123 +v 0.262500 -0.234429 0.025979 +v -0.262500 0.290571 0.025979 +v -0.262500 -0.234429 0.025979 +v -0.077958 -0.358688 -0.352438 +v 0.131250 0.290571 0.034371 +v 0.000000 0.290571 0.035881 +v -0.061658 -0.358688 -0.368738 +v -0.131250 0.290571 0.034371 +v -0.131250 -0.234429 0.034371 +v 0.077958 -0.358688 -0.229123 +v 0.000000 -0.234429 0.035881 +v 0.061658 -0.358688 -0.212822 +v 0.131250 -0.234429 0.034371 +v -0.262500 -0.103179 0.034371 +v -0.262500 0.028071 0.035881 +v -0.262500 0.159321 0.034371 +v 0.061658 -0.358688 -0.368738 +v 0.262500 0.159321 0.034371 +v 0.077958 -0.358688 -0.352438 +v 0.262500 0.028071 0.035881 +v 0.262500 -0.103179 0.034371 +v 0.131250 0.159321 0.040787 +v -0.065019 -0.247914 -0.242045 +v -0.048736 -0.247914 -0.225761 +v 0.131250 0.028071 0.044501 +v 0.131250 -0.103179 0.040787 +v -0.048736 -0.247914 -0.355799 +v -0.065019 -0.247914 -0.339516 +v 0.000000 0.159321 0.044501 +v 0.000000 0.028071 0.049025 +v 0.065019 -0.247914 -0.339516 +v 0.000000 -0.103179 0.044501 +v 0.048736 -0.247914 -0.355799 +v -0.131250 0.159321 0.040787 +v 0.048736 -0.247914 -0.225761 +v -0.131250 0.028071 0.044501 +v 0.065019 -0.247914 -0.242045 +v -0.131250 -0.103179 0.040787 +v -0.065019 -0.337090 -0.339524 +v -0.048744 -0.337090 -0.355799 +v 0.262500 0.290571 0.092896 +v 0.048744 -0.337090 -0.355799 +v -0.262500 0.290571 0.092896 +v 0.262500 -0.234429 0.092896 +v 0.065019 -0.337090 -0.339524 +v 0.065019 -0.337090 -0.242037 +v -0.262500 -0.234429 0.092896 +v -0.262500 0.256505 -0.133796 +v 0.048744 -0.337090 -0.225761 +v -0.228434 0.290571 -0.133796 +v -0.065019 -0.337090 -0.242037 +v 0.228434 0.290571 -0.133796 +v -0.048744 -0.337090 -0.225761 +v 0.262500 0.256505 -0.133796 +v 0.262500 -0.200363 -0.133796 +v 0.228434 -0.234429 -0.133796 +v -0.228434 -0.234429 -0.133796 +v -0.262500 -0.200363 -0.133796 +v -0.305185 -0.311180 -0.084290 +v -0.339251 -0.277114 -0.084290 +v 0.339251 0.333256 -0.084290 +v 0.305185 0.367322 -0.084290 +v -0.305185 0.367322 -0.084290 +v -0.339251 0.333256 -0.084290 +v 0.339251 -0.277114 -0.084290 +v 0.305185 -0.311180 -0.084290 +v 0.339251 0.333342 0.092896 +v 0.305271 0.367322 0.092896 +v 0.316748 0.344819 0.092896 +v -0.305271 0.367322 0.092896 +v -0.339251 0.333342 0.092896 +v -0.316748 0.344819 0.092896 +v 0.305271 -0.311180 0.092896 +v 0.339251 -0.277200 0.092896 +v 0.316748 -0.288677 0.092896 +v -0.339251 -0.277200 0.092896 +v -0.305271 -0.311180 0.092896 +v -0.316748 -0.288677 0.092896 +v 0.219945 0.269868 -0.499021 +v 0.228515 0.290571 -0.478319 +v 0.241798 0.248016 -0.499021 +v 0.262500 0.256586 -0.478319 +v 0.241798 -0.150854 -0.499021 +v 0.262500 -0.159424 -0.478319 +v 0.219945 -0.172706 -0.499021 +v 0.228515 -0.193409 -0.478319 +v -0.241798 0.248016 -0.499021 +v -0.262500 0.256586 -0.478319 +v -0.219945 0.269868 -0.499021 +v -0.228515 0.290571 -0.478319 +v -0.219945 -0.172706 -0.499021 +v -0.228515 -0.193409 -0.478319 +v -0.241798 -0.150854 -0.499021 +v -0.262500 -0.159424 -0.478319 +v -0.131250 -0.234429 0.101749 +v 0.000000 -0.233661 0.104777 +v 0.131250 -0.234429 0.101749 +v 0.131250 0.290571 0.101749 +v 0.000000 0.291339 0.105210 +v -0.131250 0.290571 0.101749 +v -0.057767 -0.234429 -0.364857 +v 0.074076 -0.234429 -0.348548 +v 0.057767 -0.234429 -0.364857 +v -0.074076 -0.234429 -0.348548 +v -0.074076 -0.234429 -0.233013 +v 0.074076 -0.234429 -0.233013 +v 0.057767 -0.234429 -0.216704 +v -0.057767 -0.234429 -0.216704 +vt 0.325000 0.725000 +vt 0.375000 0.737500 +vt 0.325000 0.737500 +vt 0.450000 0.675000 +vt 0.500000 0.725000 +vt 0.450000 0.725000 +vt 0.500000 0.675000 +vt 0.450000 0.662500 +vt 0.500000 0.662500 +vt 0.387500 0.725000 +vt 0.437500 0.737500 +vt 0.387500 0.737500 +vt 0.512500 0.725000 +vt 0.562500 0.737500 +vt 0.512500 0.737500 +vt 0.512500 0.675000 +vt 0.562500 0.725000 +vt 0.325000 0.675000 +vt 0.375000 0.725000 +vt 0.387500 0.675000 +vt 0.437500 0.725000 +vt 0.325000 0.787500 +vt 0.375000 0.800000 +vt 0.387500 0.750000 +vt 0.562500 0.662500 +vt 0.562500 0.675000 +vt 0.375000 0.675000 +vt 0.325000 0.662500 +vt 0.375000 0.662500 +vt 0.437500 0.662500 +vt 0.437500 0.675000 +vt 0.512500 0.737500 +vt 0.575000 0.737500 +vt 0.575000 0.725000 +vt 0.512500 0.662500 +vt 0.575000 0.675000 +vt 0.575000 0.662500 +vt 0.387500 0.662500 +vt 0.450000 0.737500 +vt 0.375000 0.737500 +vt 0.337500 0.737500 +vt 0.325000 0.750000 +vt 0.337500 0.800000 +vt 0.387500 0.787500 +vt 0.112500 0.737500 +vt 0.062500 0.687500 +vt 0.112500 0.687500 +vt 0.387500 0.262500 +vt 0.375000 0.375000 +vt 0.375000 0.262500 +vt 0.262500 0.687500 +vt 0.212500 0.737500 +vt 0.212500 0.687500 +vt 0.162500 0.737500 +vt 0.162500 0.687500 +vt 0.187500 0.262500 +vt 0.200000 0.375000 +vt 0.187500 0.375000 +vt 0.162500 0.537500 +vt 0.112500 0.587500 +vt 0.112500 0.537500 +vt 0.162500 0.587500 +vt 0.112500 0.637500 +vt 0.162500 0.637500 +vt 0.212500 0.587500 +vt 0.212500 0.537500 +vt 0.212500 0.637500 +vt 0.262500 0.587500 +vt 0.262500 0.537500 +vt 0.262500 0.637500 +vt 0.562500 0.262500 +vt 0.575000 0.375000 +vt 0.562500 0.375000 +vt 0.600000 0.262500 +vt 0.750000 0.375000 +vt 0.062500 0.587500 +vt 0.062500 0.537500 +vt 0.062500 0.637500 +vt 0.387500 0.412500 +vt 0.387500 0.375000 +vt 0.012500 0.412500 +vt 0.012500 0.375000 +vt -0.000000 0.787500 +vt 0.037500 0.762500 +vt 0.012500 0.787500 +vt 0.562500 0.475000 +vt 0.562500 0.412500 +vt 0.575000 0.412500 +vt 0.187500 0.475000 +vt 0.187500 0.412500 +vt 0.200000 0.412500 +vt 0.212500 0.512500 +vt 0.262500 0.512500 +vt 0.287500 0.737500 +vt 0.012500 0.475000 +vt 0.312500 0.475000 +vt 0.287500 0.512500 +vt 0.325000 0.787500 +vt 0.287500 0.762500 +vt 0.287500 0.687500 +vt 0.312500 0.800000 +vt 0.012500 0.800000 +vt 0.037500 0.537500 +vt 0.750000 0.475000 +vt 0.575000 0.475000 +vt 0.112500 0.762500 +vt 0.200000 0.475000 +vt 0.375000 0.412500 +vt 0.375000 0.475000 +vt -0.000000 0.487500 +vt 0.012500 0.487500 +vt 0.312500 0.787500 +vt 0.325000 0.487500 +vt 0.312500 0.487500 +vt 0.012500 0.475000 +vt -0.000000 0.412500 +vt 0.350000 0.262500 +vt 0.450000 0.312500 +vt 0.450000 0.337500 +vt 0.500000 0.337500 +vt 0.487500 0.350000 +vt 0.012500 0.262500 +vt -0.000000 0.375000 +vt 0.387500 0.475000 +vt -0.000000 0.262500 +vt 0.200000 0.250000 +vt 0.187500 0.250000 +vt 0.575000 0.250000 +vt 0.562500 0.250000 +vt -0.000000 0.250000 +vt 0.375000 0.250000 +vt 0.200000 0.262500 +vt 0.350000 0.250000 +vt 0.750000 0.250000 +vt 0.750000 0.262500 +vt 0.337500 0.475000 +vt 0.325000 0.487500 +vt 0.325000 0.650000 +vt 0.112500 0.512500 +vt 0.062500 0.512500 +vt 0.162500 0.512500 +vt 0.062500 0.737500 +vt 0.062500 0.762500 +vt 0.212500 0.762500 +vt 0.262500 0.737500 +vt 0.262500 0.762500 +vt 0.162500 0.762500 +vt 0.500000 0.312500 +vt 0.487500 0.300000 +vt 0.462500 0.300000 +vt 0.462500 0.350000 +vt 0.575000 0.262500 +vt 0.037500 0.637500 +vt 0.037500 0.512500 +vt 0.037500 0.575000 +vt 0.037500 0.687500 +vt 0.750000 0.412500 +vt 0.287500 0.537500 +vt 0.287500 0.575000 +vt 0.287500 0.637500 +vt 0.037500 0.737500 +vt -0.000000 0.475000 +vt 0.012500 0.250000 +vt 0.387500 0.250000 +vt 0.600000 0.250000 +vt 0.337500 0.662500 +vt 0.525000 0.662500 +vt 0.537500 0.650000 +vt 0.537500 0.487500 +vt 0.525000 0.475000 +vn 0.8578 0.5139 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.8301 -0.5576 0.0000 +vn 0.0000 0.5139 0.8578 +vn 0.0000 0.5139 -0.8578 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 -0.5576 -0.8301 +vn 0.8301 -0.5576 0.0000 +vn 0.0000 -0.5576 0.8301 +vn -0.5130 -0.6882 0.5130 +vn -0.5397 0.6460 -0.5397 +vn 0.5397 0.6460 -0.5397 +vn 0.5397 0.6460 0.5397 +vn -0.7071 0.0001 0.7071 +vn -0.5130 -0.6882 -0.5130 +vn 0.5130 -0.6882 -0.5130 +vn 0.5130 -0.6882 0.5130 +vn -0.7071 0.0001 -0.7071 +vn 0.7071 0.0001 -0.7071 +vn 0.7071 0.0001 0.7071 +vn -0.5397 0.6460 0.5397 +vn -0.8578 0.5139 0.0000 +vn -0.0339 0.0525 0.9980 +vn -0.0525 0.0339 0.9980 +vn -0.0385 0.0385 0.9985 +vn -0.7046 -0.7046 -0.0837 +vn 0.0525 0.0339 0.9980 +vn 0.0339 0.0525 0.9980 +vn 0.0385 0.0385 0.9985 +vn 0.0000 0.0572 0.9984 +vn 0.0000 0.0484 0.9988 +vn -0.7071 0.7071 0.0002 +vn -0.0000 -0.0572 0.9984 +vn -0.0385 -0.0385 0.9985 +vn -0.0339 -0.0525 0.9980 +vn -0.0000 -0.0484 0.9988 +vn -0.0484 0.0000 0.9988 +vn 0.0385 -0.0385 0.9985 +vn 0.0339 -0.0525 0.9980 +vn 0.0484 -0.0000 0.9988 +vn 0.0525 -0.0339 0.9980 +vn 0.0637 -0.0637 0.9959 +vn 0.0572 -0.0000 0.9984 +vn 0.7046 -0.7046 -0.0837 +vn -0.0525 -0.0339 0.9980 +vn -0.0637 -0.0637 0.9959 +vn -0.0572 0.0000 0.9984 +vn -0.0000 -0.5420 -0.8403 +vn 0.0000 0.5420 -0.8403 +vn 0.0204 0.0104 0.9997 +vn 0.0297 -0.0165 0.9994 +vn 0.5420 0.0000 -0.8403 +vn 0.0000 1.0000 0.0000 +vn -0.5420 0.0000 -0.8403 +vn 0.0008 1.0000 -0.0002 +vn 0.0052 0.9999 0.0090 +vn -0.0297 0.0165 0.9994 +vn 0.0201 -0.0104 0.9997 +vn 0.0297 0.0165 0.9994 +vn 0.0286 -0.0504 0.9983 +vn 0.0009 -1.0000 0.0018 +vn 0.0020 -1.0000 0.0094 +vn -0.0204 0.0104 0.9997 +vn -0.0201 -0.0104 0.9997 +vn 0.7071 0.7071 -0.0003 +vn -0.7071 0.7071 -0.0003 +vn -0.0653 -0.9968 -0.0469 +vn -0.1280 -0.9858 -0.1089 +vn 0.0653 -0.9968 -0.0469 +vn 0.2934 -0.2934 -0.9098 +vn 0.2934 0.2934 -0.9098 +vn -0.2934 -0.2934 -0.9098 +vn -0.2934 0.2934 -0.9098 +vn -0.7071 -0.7071 -0.0003 +vn 0.7071 -0.7071 -0.0003 +vn 0.7071 0.7071 0.0002 +vn -0.5000 0.5000 -0.7070 +vn 0.5000 -0.5000 -0.7070 +vn 0.5000 0.5000 -0.7070 +vn -0.5000 -0.5000 -0.7070 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.0009 1.0000 -0.0018 +vn -0.0024 1.0000 -0.0093 +vn -0.0007 0.9999 -0.0122 +vn -0.0020 1.0000 -0.0095 +vn -0.0052 -0.9999 -0.0091 +vn -0.0008 -1.0000 0.0002 +vn 0.0023 -1.0000 0.0093 +vn 0.1280 -0.9858 -0.1089 +vn 0.0502 -0.9610 -0.2719 +vn 0.0989 -0.9734 -0.2067 +vn -0.0989 -0.9734 -0.2067 +vn -0.0502 -0.9610 -0.2719 +vn -0.0637 0.0637 0.9959 +vn 0.0637 0.0637 0.9959 +vn 0.0000 0.1434 0.9897 +vn -0.0297 -0.0165 0.9994 +vn -0.0320 0.0425 0.9986 +vn 0.0320 0.0425 0.9986 +vn -0.0286 -0.0504 0.9983 +vn 0.0000 -0.1379 0.9904 +vn 0.0007 -0.9999 0.0121 +usemtl Material +s off +f 56/25/7 21/26/7 30/27/7 +f 34/28/8 50/29/8 62/30/8 +f 39/31/9 116/32/9 115/33/9 +f 60/34/10 10/35/10 23/36/10 +f 51/37/11 28/38/11 18/39/11 +f 38/40/12 53/41/12 51/37/12 +f 42/42/13 57/43/13 56/25/13 +f 46/44/14 64/45/14 60/34/14 +f 15/46/15 28/47/15 21/48/15 +f 38/40/16 114/49/16 44/50/16 +f 48/51/17 113/52/17 117/53/17 +f 46/44/18 119/54/18 35/55/18 +f 116/32/19 35/55/19 119/54/19 +f 51/37/20 15/56/20 50/29/20 +f 30/57/21 53/41/21 56/58/21 +f 23/36/22 57/43/22 60/34/22 +f 35/55/23 62/30/23 64/45/23 +f 39/31/24 112/59/24 38/40/24 +f 42/60/25 114/49/25 113/61/25 +f 48/51/26 118/62/26 46/44/26 +f 51/37/27 39/31/27 38/40/27 +f 56/58/28 44/50/28 42/60/28 +f 60/34/29 48/51/29 46/44/29 +f 10/35/30 62/30/30 11/63/30 +f 62/30/31 15/56/31 11/63/31 +f 56/25/7 57/43/7 21/26/7 +f 34/28/8 39/31/8 50/29/8 +f 39/31/9 34/28/9 116/32/9 +f 60/34/10 64/45/10 10/35/10 +f 51/37/11 53/41/11 28/38/11 +f 38/40/12 44/50/12 53/41/12 +f 42/42/13 48/51/13 57/43/13 +f 46/44/14 35/55/14 64/45/14 +f 21/48/15 23/64/15 10/65/15 +f 10/65/15 11/66/15 15/46/15 +f 15/46/15 18/67/15 28/47/15 +f 28/47/15 30/68/15 21/48/15 +f 21/48/15 10/65/15 15/46/15 +f 38/40/16 112/59/16 114/49/16 +f 48/51/17 42/42/17 113/52/17 +f 46/44/18 118/62/18 119/54/18 +f 116/32/19 34/28/19 35/55/19 +f 51/37/20 18/39/20 15/56/20 +f 30/57/21 28/38/21 53/41/21 +f 23/36/22 21/26/22 57/43/22 +f 35/55/23 34/28/23 62/30/23 +f 39/31/24 115/33/24 112/59/24 +f 42/60/25 44/50/25 114/49/25 +f 48/51/26 117/53/26 118/62/26 +f 51/37/27 50/29/27 39/31/27 +f 56/58/28 53/41/28 44/50/28 +f 60/34/29 57/43/29 48/51/29 +f 10/35/30 64/45/30 62/30/30 +f 62/30/31 50/29/31 15/56/31 +s 1 +f 19/69/32 27/70/33 45/71/34 +f 103/72/35 69/73/35 105/74/35 +f 29/75/36 16/76/37 33/77/38 +f 33/77/38 17/78/39 40/79/40 +f 17/78/39 45/71/34 40/79/40 +f 101/80/41 59/81/41 61/82/41 +f 22/83/42 49/84/43 20/85/44 +f 43/86/45 47/87/46 49/84/43 +f 40/79/40 47/87/46 41/88/14 +f 37/89/47 22/83/42 24/90/48 +f 36/91/49 43/86/45 37/89/47 +f 36/91/49 40/79/40 41/88/14 +f 32/92/50 24/90/48 12/93/51 +f 31/94/52 37/89/47 32/92/50 +f 31/94/52 33/77/38 36/91/49 +f 97/95/53 66/96/53 67/97/53 +f 95/98/13 65/99/13 66/96/13 +f 20/85/44 25/100/54 14/101/55 +f 49/84/43 26/102/56 25/100/54 +f 45/71/34 26/102/56 47/87/46 +f 67/97/57 70/103/57 68/104/57 +f 61/82/58 73/105/58 63/106/58 +f 79/107/59 52/108/60 80/109/14 +f 84/110/15 70/103/15 77/111/15 +f 65/99/61 76/112/61 66/96/61 +f 81/113/62 73/105/62 74/114/62 +f 69/73/63 75/115/63 59/81/63 +f 12/93/64 108/116/65 55/117/62 +f 52/118/8 29/75/8 31/94/8 +f 82/119/14 87/120/14 58/121/66 +f 84/122/67 55/123/68 108/124/69 +f 85/125/14 78/126/14 52/108/60 +f 58/127/13 25/100/13 26/102/13 +f 76/112/13 78/128/13 85/129/13 +f 111/130/70 19/69/15 17/78/71 +f 82/131/8 71/132/8 87/133/8 +f 78/126/14 79/107/59 80/109/14 +f 81/134/72 82/119/14 83/135/14 +f 84/122/67 85/125/14 86/136/14 +f 87/120/14 88/137/73 89/138/14 +f 79/139/74 72/140/74 73/105/74 +f 74/114/75 82/131/75 81/113/75 +f 59/81/8 105/141/8 69/73/8 +f 68/104/76 115/142/77 116/143/15 +f 117/144/15 67/97/78 118/145/15 +f 77/111/79 66/96/79 76/112/79 +f 101/80/62 63/106/62 91/146/62 +f 63/106/80 72/140/80 65/147/80 +f 71/132/81 68/104/81 70/103/81 +f 61/82/82 75/115/82 74/114/82 +f 88/148/83 71/132/83 70/103/83 +f 77/111/84 85/129/84 84/110/84 +f 63/106/85 93/149/85 91/146/85 +f 98/150/86 101/80/86 100/151/86 +f 94/152/87 97/95/87 96/153/87 +f 92/154/88 91/146/88 93/149/88 +f 104/155/89 103/72/89 105/74/89 +f 103/72/90 96/153/90 97/95/90 +f 99/156/91 104/157/91 105/141/91 +f 91/146/92 100/151/92 101/80/92 +f 95/98/93 92/158/93 93/159/93 +f 102/160/12 104/161/12 98/162/12 +f 106/163/94 14/101/62 58/164/62 +f 108/116/65 12/93/64 107/165/95 +f 107/165/95 24/90/96 22/83/97 +f 13/166/15 111/130/70 54/167/15 +f 109/168/98 9/169/99 52/170/15 +f 110/171/100 9/169/99 109/168/98 +f 113/172/101 67/97/78 117/144/15 +f 114/173/102 97/95/103 113/172/101 +f 103/72/104 114/173/102 112/174/105 +f 115/142/77 103/72/104 112/174/105 +f 119/175/15 68/104/76 116/143/15 +f 118/145/15 68/104/76 119/175/15 +f 19/69/32 13/166/106 27/70/33 +f 103/72/35 68/104/35 69/73/35 +f 29/75/36 9/169/107 16/76/37 +f 33/77/38 16/76/37 17/78/39 +f 17/78/39 19/69/32 45/71/34 +f 101/80/41 99/156/41 59/81/41 +f 22/83/42 43/86/45 49/84/43 +f 43/86/45 41/88/14 47/87/46 +f 40/79/40 45/71/34 47/87/46 +f 37/89/47 43/86/45 22/83/42 +f 36/91/49 41/88/14 43/86/45 +f 36/91/49 33/77/38 40/79/40 +f 32/92/50 37/89/47 24/90/48 +f 31/94/52 36/91/49 37/89/47 +f 31/94/52 29/75/36 33/77/38 +f 97/95/53 95/176/53 66/96/53 +f 95/98/13 93/159/13 65/99/13 +f 20/85/44 49/84/43 25/100/54 +f 49/84/43 47/87/46 26/102/56 +f 45/71/34 27/70/33 26/102/56 +f 67/97/57 77/111/57 70/103/57 +f 61/82/58 74/114/58 73/105/58 +f 79/107/59 81/134/72 110/177/108 +f 81/134/72 83/135/14 54/178/109 +f 110/177/108 81/134/72 111/179/110 +f 54/178/109 111/179/110 81/134/72 +f 110/177/108 109/180/111 79/107/59 +f 109/180/111 52/108/60 79/107/59 +f 84/110/15 88/148/15 70/103/15 +f 65/99/61 72/181/61 76/112/61 +f 81/113/62 79/139/62 73/105/62 +f 69/73/63 71/132/63 75/115/63 +f 12/93/8 55/182/8 32/92/8 +f 55/182/8 52/118/8 31/94/8 +f 32/92/8 55/182/8 31/94/8 +f 52/118/8 9/169/8 29/75/8 +f 87/120/14 89/138/14 58/121/66 +f 58/121/66 54/178/109 82/119/14 +f 54/178/109 83/135/14 82/119/14 +f 106/183/112 58/121/66 88/137/73 +f 58/121/66 89/138/14 88/137/73 +f 88/137/73 84/122/67 107/184/113 +f 106/183/112 88/137/73 107/184/113 +f 84/122/67 86/136/14 55/123/68 +f 108/124/69 107/184/113 84/122/67 +f 78/126/14 80/109/14 52/108/60 +f 52/108/60 55/123/68 85/125/14 +f 55/123/68 86/136/14 85/125/14 +f 13/166/13 54/185/13 27/70/13 +f 54/185/13 58/127/13 26/102/13 +f 27/70/13 54/185/13 26/102/13 +f 58/127/13 14/101/13 25/100/13 +f 76/112/13 72/181/13 78/128/13 +f 9/169/99 110/171/100 16/76/114 +f 110/171/100 111/130/70 17/78/71 +f 16/76/114 110/171/100 17/78/71 +f 111/130/70 13/166/15 19/69/15 +f 82/131/8 75/115/8 71/132/8 +f 79/139/74 78/186/74 72/140/74 +f 74/114/75 75/115/75 82/131/75 +f 59/81/8 99/156/8 105/141/8 +f 68/104/76 103/72/104 115/142/77 +f 77/111/79 67/97/79 66/96/79 +f 101/80/62 61/82/62 63/106/62 +f 63/106/80 73/105/80 72/140/80 +f 71/132/81 69/73/81 68/104/81 +f 61/82/82 59/81/82 75/115/82 +f 88/148/83 87/133/83 71/132/83 +f 77/111/84 76/112/84 85/129/84 +f 63/106/85 65/147/85 93/149/85 +f 98/150/86 99/156/86 101/80/86 +f 94/152/87 95/176/87 97/95/87 +f 92/154/88 90/187/88 91/146/88 +f 104/155/89 102/188/89 103/72/89 +f 103/72/90 102/188/90 96/153/90 +f 99/156/91 98/150/91 104/157/91 +f 91/146/92 90/187/92 100/151/92 +f 95/98/93 94/189/93 92/158/93 +f 98/162/12 100/190/12 102/160/12 +f 100/190/12 90/191/12 102/160/12 +f 90/191/12 92/192/12 94/193/12 +f 94/193/12 96/194/12 90/191/12 +f 96/194/12 102/160/12 90/191/12 +f 14/101/62 106/163/94 20/85/62 +f 106/163/94 107/165/95 22/83/97 +f 20/85/62 106/163/94 22/83/97 +f 107/165/95 12/93/64 24/90/96 +f 113/172/101 97/95/103 67/97/78 +f 103/72/104 97/95/103 114/173/102 +f 118/145/15 67/97/78 68/104/76 +o Cube.002 +v -0.182506 -0.376577 0.025979 +v -0.202175 -0.376577 0.006310 +v -0.202175 -0.376577 -0.479353 +v -0.182475 -0.376637 -0.499021 +v 0.202175 -0.376577 0.006310 +v -0.236819 -0.500000 0.112318 +v 0.182506 -0.376577 0.025979 +v -0.262500 -0.500000 0.000000 +v 0.182509 -0.376637 -0.499021 +v -0.262500 -0.376637 0.000000 +v -0.236819 -0.376637 0.112318 +v 0.202175 -0.376577 -0.479353 +v 0.262500 -0.500000 0.000000 +v -0.168634 -0.353125 -0.007583 +v -0.202175 -0.356313 0.006310 +v 0.236819 -0.500000 0.112318 +v 0.236819 -0.376637 0.112318 +v -0.182506 -0.356313 0.025979 +v 0.262500 -0.376637 0.000000 +v -0.168634 -0.353125 -0.465459 +v -0.262500 -0.500000 -0.434422 +v -0.182506 -0.356313 -0.499021 +v -0.242168 -0.500000 -0.499021 +v -0.242168 -0.376637 -0.499021 +v -0.202175 -0.356313 -0.479353 +v -0.262500 -0.376637 -0.434422 +v 0.168634 -0.353125 -0.007583 +v 0.242168 -0.500000 -0.499021 +v 0.262500 -0.500000 -0.434422 +v 0.182506 -0.356313 0.025979 +v 0.262500 -0.376637 -0.434422 +v 0.202175 -0.356313 0.006310 +v 0.242168 -0.376637 -0.499021 +v -0.236819 -0.391892 0.112318 +v 0.168634 -0.353125 -0.465459 +v 0.202175 -0.356313 -0.479353 +v -0.262500 -0.391892 0.000000 +v 0.236819 -0.391892 0.112318 +v 0.182506 -0.356313 -0.499021 +v 0.262500 -0.391892 0.000000 +v 0.243379 -0.391892 0.123162 +v -0.269772 -0.391892 0.010843 +v -0.243379 -0.500000 0.123162 +v -0.269772 -0.500000 0.010843 +v 0.243379 -0.500000 0.123162 +v 0.269772 -0.500000 0.010843 +v -0.243379 -0.391892 0.123162 +v 0.269772 -0.391892 0.010843 +vt 0.737500 0.775000 +vt 0.750000 0.787500 +vt 0.737500 0.787500 +vt 0.975000 0.787500 +vt 0.962500 0.775000 +vt 0.975000 0.775000 +vt 0.962500 0.725000 +vt 0.750000 0.712500 +vt 0.962500 0.712500 +vt 0.962500 0.062500 +vt 0.962500 0.350000 +vt 0.750000 0.062500 +vt 0.975000 0.725000 +vt 0.937500 0.400000 +vt 0.925000 0.712500 +vt 0.925000 0.400000 +vt 0.737500 0.787500 +vt 0.962500 0.787500 +vt 0.962500 0.712500 +vt 0.975000 0.400000 +vt 0.975000 0.712500 +vt 0.950000 0.700000 +vt 0.950000 0.412500 +vt 0.750000 0.750000 +vt 0.962500 0.750000 +vt 0.950000 0.412500 +vt 0.962500 0.400000 +vt 0.750000 0.775000 +vt 0.962500 0.750000 +vt 0.750000 0.725000 +vt 0.737500 0.712500 +vt 0.650000 0.075000 +vt 0.362500 0.062500 +vt 0.650000 0.062500 +vt 0.575000 0.475000 +vt 0.700000 0.475000 +vt 0.575000 0.662500 +vt 0.350000 0.162500 +vt 0.412500 0.225000 +vt 0.350000 0.225000 +vt 0.425000 0.225000 +vt 0.425000 0.162500 +vt 0.687500 0.162500 +vt 0.350000 0.150000 +vt 0.425000 0.137500 +vt 0.350000 0.137500 +vt 0.425000 0.075000 +vt 0.412500 0.137500 +vt 0.725000 0.000000 +vt 0.937500 0.000000 +vt 0.975000 0.062500 +vt 0.725000 0.075000 +vt 0.687500 0.150000 +vt 0.725000 0.150000 +vt 0.725000 0.237500 +vt 0.687500 0.237500 +vt 0.750000 0.487500 +vt 0.712500 0.475000 +vt 0.762500 0.487500 +vt 0.537500 0.150000 +vt 0.350000 0.162500 +vt 0.350000 0.150000 +vt 0.762500 0.650000 +vt 0.750000 0.650000 +vt 0.350000 0.225000 +vt 0.425000 0.237500 +vt 0.350000 0.237500 +vt 0.587500 0.162500 +vt 0.537500 0.162500 +vt 0.350000 0.137500 +vt 0.412500 0.075000 +vt 0.350000 0.075000 +vt 0.412500 0.162500 +vt 0.687500 0.075000 +vt 0.587500 0.162500 +vt 0.637500 0.150000 +vt 0.637500 0.162500 +vt 0.712500 0.662500 +vt 0.700000 0.662500 +vt 0.350000 0.062500 +vt 0.662500 0.000000 +vt 0.662500 0.062500 +vt 0.912500 0.412500 +vt 0.862500 0.687500 +vt 0.862500 0.375000 +vt 0.750000 0.775000 +vt 0.750000 0.350000 +vt 0.975000 0.712500 +vt 0.937500 0.712500 +vt 0.737500 0.725000 +vt 0.750000 0.750000 +vt 0.737500 0.775000 +vt 0.950000 0.700000 +vt 0.362500 0.075000 +vt 0.537500 0.650000 +vt 0.537500 0.487500 +vt 0.425000 0.150000 +vt 0.975000 0.000000 +vt 0.662500 0.062500 +vt 0.662500 0.000000 +vt 0.725000 0.162500 +vt 0.587500 0.150000 +vt 0.587500 0.150000 +vt 0.350000 0.000000 +vt 0.862500 0.687500 +vt 0.875000 0.700000 +vt 0.825000 0.700000 +vt 0.812500 0.650000 +vt 0.812500 0.350000 +vt 0.862500 0.375000 +vt 0.925000 0.350000 +vt 0.925000 0.400000 +vt 0.812500 0.350000 +vt 0.812500 0.650000 +vt 0.762500 0.375000 +vt 0.800000 0.700000 +vt 0.762500 0.687500 +vt 0.750000 0.700000 +vt 0.925000 0.712500 +vt 0.925000 0.662500 +vt 0.912500 0.650000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0946 0.9955 0.0000 +vn 0.0000 0.9955 0.0946 +vn 0.0946 0.9955 0.0000 +vn 0.0000 0.9955 -0.0946 +vn -0.7071 0.0000 0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.9735 0.0000 0.2288 +vn -0.9748 0.0000 0.2229 +vn -0.8305 0.0000 -0.5570 +vn -0.9539 0.0000 -0.3002 +vn 0.9539 0.0000 -0.3002 +vn 0.9748 0.0000 0.2229 +vn -0.9735 0.0000 0.2288 +vn 0.8305 0.0000 -0.5570 +vn 0.0000 1.0000 0.0007 +vn -0.7066 -0.0011 -0.7077 +vn 0.7072 0.0001 -0.7071 +vn -0.0669 0.9955 0.0669 +vn -0.0669 0.9955 -0.0669 +vn 0.0669 0.9955 -0.0669 +vn 0.0669 0.9955 0.0669 +vn 0.0000 1.0000 -0.0031 +vn -0.0013 1.0000 -0.0004 +vn -0.0010 1.0000 0.0000 +vn 0.0010 1.0000 0.0002 +vn 0.0010 1.0000 0.0000 +vn 0.0013 1.0000 -0.0004 +vn -0.0010 1.0000 0.0002 +vn -0.0004 1.0000 0.0004 +vn 0.0004 1.0000 0.0004 +s off +f 141/195/115 122/196/115 144/197/115 +f 131/198/116 158/199/116 155/200/116 +f 149/201/117 120/202/117 126/203/117 +f 146/204/118 154/205/118 133/206/118 +f 126/203/119 151/207/119 149/201/119 +f 134/208/120 122/209/120 121/210/120 +f 123/211/121 158/199/121 128/212/121 +f 155/213/122 124/214/122 131/215/122 +f 139/216/123 134/208/123 133/217/123 +f 133/218/124 149/201/124 146/219/124 +f 155/213/125 146/220/125 151/221/125 +f 141/222/126 154/223/126 158/199/126 +f 137/224/127 121/225/127 120/202/127 +f 136/226/117 153/227/117 157/228/117 +f 148/229/128 132/230/128 140/231/128 +f 164/232/129 167/233/129 160/234/129 +f 159/235/122 132/236/122 148/237/122 +f 130/238/130 156/239/130 153/240/130 +f 127/241/131 161/242/131 156/239/131 +f 123/243/121 128/244/121 147/245/121 +f 142/246/132 145/247/132 143/248/132 +f 148/237/133 152/249/133 150/250/133 +f 135/251/128 165/252/128 164/253/128 +f 153/254/118 160/255/118 157/256/118 +f 135/251/128 162/257/128 125/258/128 +f 157/259/134 138/260/134 136/261/134 +f 153/254/118 161/262/118 166/263/118 +f 166/264/135 163/265/135 162/266/135 +f 159/235/136 165/267/136 132/236/136 +f 140/268/120 156/239/120 145/247/120 +f 157/269/118 167/270/118 159/271/118 +f 125/258/128 163/272/128 127/273/128 +f 166/274/117 164/275/117 160/276/117 +f 126/277/137 130/278/137 136/279/137 +f 141/195/138 123/280/138 122/196/138 +f 131/198/139 128/212/139 158/199/139 +f 149/201/117 137/224/117 120/202/117 +f 139/281/118 133/206/118 154/205/118 +f 126/203/119 124/282/119 151/207/119 +f 134/208/120 144/283/120 122/209/120 +f 123/211/121 141/195/121 158/199/121 +f 155/213/122 151/221/122 124/214/122 +f 133/218/140 134/284/140 137/224/140 +f 139/285/141 141/222/141 144/286/141 +f 154/223/142 155/200/142 158/199/142 +f 146/219/143 149/201/143 151/207/143 +f 139/216/123 144/283/123 134/208/123 +f 133/218/124 137/224/124 149/201/124 +f 155/213/125 154/287/125 146/220/125 +f 141/222/126 139/285/126 154/223/126 +f 137/224/127 134/284/127 121/225/127 +f 136/226/117 130/288/117 153/227/117 +f 132/230/128 135/251/128 125/258/128 +f 125/258/128 127/273/128 132/230/128 +f 127/273/128 140/231/128 132/230/128 +f 140/231/128 142/289/128 147/290/128 +f 147/290/128 148/229/128 140/231/128 +f 164/232/129 165/267/129 167/233/129 +f 148/237/122 150/250/122 159/235/122 +f 150/250/122 138/260/122 159/235/122 +f 130/238/130 129/291/130 156/239/130 +f 127/241/131 163/265/131 161/242/131 +f 128/244/121 152/292/121 147/245/121 +f 147/245/121 142/293/121 123/243/121 +f 142/293/121 143/294/121 123/243/121 +f 142/246/132 140/268/132 145/247/132 +f 148/237/133 147/295/133 152/249/133 +f 135/251/128 132/230/128 165/252/128 +f 153/254/118 166/263/118 160/255/118 +f 135/251/128 164/253/128 162/257/128 +f 157/259/134 159/235/134 138/260/134 +f 153/254/118 156/296/118 161/262/118 +f 166/264/135 161/242/135 163/265/135 +f 159/235/136 167/233/136 165/267/136 +f 127/241/120 156/239/120 140/268/120 +f 156/239/120 129/291/120 145/247/120 +f 157/269/118 160/297/118 167/270/118 +f 125/258/128 162/257/128 163/272/128 +f 166/274/117 162/298/117 164/275/117 +f 122/299/144 123/300/144 143/301/144 +f 143/301/145 145/302/145 122/299/145 +f 145/302/146 129/303/146 121/304/146 +f 136/279/147 138/305/147 124/306/147 +f 138/307/148 150/308/148 124/309/148 +f 150/308/149 152/310/149 131/311/149 +f 152/310/144 128/312/144 131/311/144 +f 145/302/146 121/304/146 122/299/146 +f 129/313/150 130/278/150 121/314/150 +f 150/308/148 131/311/148 124/309/148 +f 120/315/151 121/314/151 130/278/151 +f 136/279/152 124/306/152 126/277/152 +f 126/277/137 120/315/137 130/278/137 diff --git a/src/main/resources/assets/hbm/textures/blocks/deco_computer_0.png b/src/main/resources/assets/hbm/textures/blocks/deco_computer_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fab8d3cd29d30ca65fe69a95c6644973ad8c4c65 GIT binary patch literal 1832 zcmV+@2iN$CP)Px#1ZP1_K>z@;j|==^1poj5U{Fj{MZC18g@1LrvZTGWr@pqRxv`_Wv!%DMp})7O zz__ZxxvRFWpa1{>|NsBEu%d>5cDS&kwXUGTx~#*yt+lP6I5sjjH8D9iGpnSR92*%U zBqK62F|DSVsidAaI5q$P0B8w(F8}}lAaqhrQ~&?}|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|NsC009;%f?EnA(32;bRa{vGi!vFvd!vV){sAK>D1|>;EK~z{r?U(Cz+cpq{ zSpbA7yJ6d;P7~Ly-v2H0&Fm5pb+K|z`mY|v5(xscvllFp>G&Vxo$%-JPWbb9C;WN* z9|>>c7a^zpICAkd+$Ee!&a7>kX8s!f=8({*npc7Qgac-NU_FBkW-z!K59^|0Lt0kdh}nhNt)8@~>yWi53dakW_)GLSxPhrU|95 zCr{wR2M9rO?2uFeMXRGtyg)w?&K)sHm4L9;wI;_7Np%TyA+y|cnddz@cF5%kd8(u= zx+v>B%_8J(NuGhFlCtF3A(=Kzz48gxG9AKYsY#vzo=?+nNpgxL+Mt9GIrtu@rAJbH zn>+)NwOUp^4fFaoD2|x|q|g{*BKNq-pYBaq$~A>$uGD@2^Hhi8&Ke5#iF#g&e3e1S zcxnyZgosU^f!Su6{kWOWW%kFqbS<6az~j|hTZC9TB+tNFld+SWFyFk)qa=bGZC&k< z+S|cgB)5jb`NCz^seAApyey5@k#>wePX~*ihz^8PIauK%!jorUiA`XPjRllQBU{Qy z4uQ3{P-MYn0mGq9*0$e)z}ZcQ+ihgK^6mx{Lm zKUAitcI<85n!_@l_P($+qOt^Q+mP>w7-%7d34m>Ps!%Z^LP4{}6nhp+WuAx~{Gha` zoR9pqksM~1jS#G`nzK@}gfPnv^%!M(0Fw3C-C7x=yEE%!Y+2fYNtWd@nV z9quXeQpw++%ctq1O|ZaEOD(+Fw465N?#E>$hnP`^A2WtPUSVb1nwrDAv6DVWfr!lq zRKct4S+GQH$!W{dxmlVB^$0M1^v!6(VC@IEL?nB9|JPAc_=A^Qauh?HPle}wQyx~OBF|QI)!>{(#(*O zc_$U`79txA#W zzEOrvh`}p;Qw)@zYu@H#gyPl+CGZH3C@50`XHWIxi!c&1SrS4rs%f3#YznCZpx1v~ z>1WsYMCdoxMc;&ec<45h_bz>J6XU$`iBJjgeHilAq#C<0Y2jWu}14~DI#iIHe(!DV z8tu+q;}fASWzDsiTT_`~yigZZ3{7ig-)Pd41u#)FdbRq~#wWr|7r;VpO%8o_5{1my zQa`22k4RN!MJf_mQM|M9Z7#FKlKdwq2OI$Wm@^QBbcLm^?swH&(IyPmZjDcb{GH%= zha9{KtYP`2@o6j`Z3v>z@$+oQ6xNkWDr zWr~LpjqjXri`@qN&<^t4T7pcUSuqgddE>jPF#Pv7nRC$f|4bE}vf6}?e5{OlW_3BNw`@A~In*<3WfdkPgkroL4+`^J|F zZ+yP~K-owgv$n=}PoZYNSvFwT`0gsaS2hU@GlRx=PvP;#DTH-~OW?HeY3x+f{`2*D zX)k{>Eux;%8n3L^o5zzo3a9Dig=zmJIw!AxL4RfN`tigHPeh%57+2=3%cm{tWNE9f z)&}9l@#Ky|YY0z;cvWKM6+f>ZPeS34WQ>i&PAT1oSG_R`4OBXHmXgboeR(`N9=`$1 WAUb+)kQ2xN0000 Date: Sun, 4 Sep 2022 22:55:50 -0700 Subject: [PATCH 051/111] meh --- src/main/java/com/hbm/render/block/RenderBlockDecoModel.java | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java b/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java index 4f0b97a2f..769c53838 100644 --- a/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java +++ b/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java @@ -35,6 +35,7 @@ public class RenderBlockDecoModel implements ISimpleBlockRenderingHandler { iicon = renderer.overrideBlockTexture; } + GL11.glRotated(-15, 0, 1, 0); tessellator.startDrawingQuads(); ObjUtil.renderWithIcon((WavefrontObject) model, iicon, tessellator, modelId, false); diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c215287bd..cb6f6b8b1 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3681,6 +3681,7 @@ tile.crystal_virus.name=Dark Crystal tile.deco_aluminium.name=Aluminium Deco Block tile.deco_asbestos.name=Asbestos Roof tile.deco_beryllium.name=Beryllium Deco Block +tile.deco_computer.name=IBM Personal Computer 300PL tile.deco_emitter.name=Deco Light Emitter tile.deco_lead.name=Lead Deco Block tile.deco_rbmk.name=RBMK Deco Block From bf385c831da34b465a27407e51ba92d972dbaa4b Mon Sep 17 00:00:00 2001 From: Vaern Date: Mon, 5 Sep 2022 20:52:23 -0700 Subject: [PATCH 052/111] big office building --- .../java/com/hbm/lib/HbmChestContents.java | 15 ++ .../world/worldgen/components/Feature.java | 64 +++++- .../worldgen/components/OfficeFeatures.java | 197 ++++++++++++++++++ 3 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java diff --git a/src/main/java/com/hbm/lib/HbmChestContents.java b/src/main/java/com/hbm/lib/HbmChestContents.java index 242f67ceb..56cb0a257 100644 --- a/src/main/java/com/hbm/lib/HbmChestContents.java +++ b/src/main/java/com/hbm/lib/HbmChestContents.java @@ -335,4 +335,19 @@ public class HbmChestContents { new WeightedRandomChestContent(ModItems.warhead_mirv, 0, 1, 1, 1), new WeightedRandomChestContent(ModItems.battery_schrabidium_cell, 0, 1, 1, 1), new WeightedRandomChestContent(ModItems.powder_nitan_mix, 0, 16, 32, 1) }; + + public static WeightedRandomChestContent[] officeTrash = new WeightedRandomChestContent[] { + //Meta, Min amount, Max amount, Weight + new WeightedRandomChestContent(Items.paper, 0, 1, 12, 10), + new WeightedRandomChestContent(Items.book, 0, 1, 3, 4), + new WeightedRandomChestContent(ModItems.twinkie, 0, 1, 2, 6), + new WeightedRandomChestContent(ModItems.coffee, 0, 1, 1, 4), + new WeightedRandomChestContent(ModItems.flame_politics, 0, 1, 1, 2), + new WeightedRandomChestContent(ModItems.ring_pull, 0, 1, 1, 4), + new WeightedRandomChestContent(ModItems.can_empty, 0, 1, 1, 2), + new WeightedRandomChestContent(ModItems.can_creature, 0, 1, 2, 2), + new WeightedRandomChestContent(ModItems.can_smart, 0, 1, 3, 2), + new WeightedRandomChestContent(ModItems.can_mrsugar, 0, 1, 2, 2), + new WeightedRandomChestContent(ModItems.book_guide, 3, 1, 1, 1), + new WeightedRandomChestContent(Item.getItemFromBlock(ModBlocks.deco_computer), 0, 1, 1, 1)}; } diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index 8eb36dc6a..54333f173 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -6,6 +6,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; import com.hbm.config.StructureConfig; +import com.hbm.tileentity.machine.TileEntityLockableBase; import com.hbm.tileentity.machine.storage.TileEntityCrateIron; import net.minecraft.block.Block; @@ -14,6 +15,7 @@ import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemDoor; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; @@ -152,6 +154,19 @@ abstract public class Feature extends StructureComponent { return 0; } + /** + * + * @param metadata (0 for facing North, 1 for facing South, 2 for facing West, 3 for facing East) + */ + protected int getDecoModelMeta(int metadata) { + //N: 0b00, S: 0b01, W: 0b10, E: 0b11 + int rot = metadata & 3; + + + + return 0; + } + /** * Places door at specified location with orientation-adjusted meta * don't ask me which directions are what (take direction such as South/0 and add 1) @@ -182,7 +197,36 @@ abstract public class Feature extends StructureComponent { if(inventory != null) { amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor); - WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount); + WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount < 1 ? 1 : amount); + return true; + } + + return false; + } + + + /** + * Block TE MUST extend TileEntityLockableBase, otherwise this will not work and crash! + * @return TE implementing IInventory and extending TileEntityLockableBase with randomized contents + lock + */ + protected boolean generateLockableContents(World world, StructureBoundingBox box, Random rand, Block block, int featureX, int featureY, int featureZ, + WeightedRandomChestContent[] content, int amount, double mod) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + this.placeBlockAtCurrentPosition(world, block, 0, featureX, featureY, featureZ, box); + TileEntity tile = world.getTileEntity(posX, posY, posZ); + TileEntityLockableBase lock = (TileEntityLockableBase) tile; + IInventory inventory = (IInventory) tile; + + if(inventory != null && lock != null) { + lock.setPins(rand.nextInt(999) + 1); + lock.setMod(mod); + lock.lock(); + + amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor); + WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount < 1 ? 1 : amount); return true; } @@ -250,6 +294,24 @@ abstract public class Feature extends StructureComponent { } } + /** Methods that remove the replaceBlock and alwaysReplace, and other parameters: as they are useless and only serve as a time sink normally. */ + + protected void fillWithBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) { + this.fillWithBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, block, block, false); + } + + protected void fillWithMetadataBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block, int meta) { + this.fillWithMetadataBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, block, meta, block, meta, false); + } + + protected void randomlyFillWithBlocks(World world, StructureBoundingBox box, Random rand, float randLimit, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) { + this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, block); + } + + protected void fillWithRandomizedBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Random rand, BlockSelector selector) { + this.fillWithRandomizedBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, false, rand, selector); + } + /** Block Selectors **/ static class Sandstone extends StructureComponent.BlockSelector { diff --git a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java new file mode 100644 index 000000000..46169e4d9 --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java @@ -0,0 +1,197 @@ +package com.hbm.world.worldgen.components; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.lib.HbmChestContents; +import com.hbm.world.worldgen.components.Feature.ConcreteBricks; + +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; + +//Oh my fucking god TM +public class OfficeFeatures { + + public static class LargeOffice extends Feature { + + private static ConcreteBricks ConcreteBricks = new ConcreteBricks(); + + private boolean[] hasPlacedLoot = new boolean[2]; + + public LargeOffice() { + super(); + } + + public LargeOffice(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 14, 5, 12); + this.hasPlacedLoot[0] = false; + this.hasPlacedLoot[1] = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); + nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); + this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); + } + + //Holy shit I despise this method so goddamn much + //TODO BOB: please i beg you make some sort of utility tool to simplify this + //ideally we'd invent something like the structure blocks or even a more advanced + //schematic to java tool + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return true; + } + + this.boundingBox.offset(0, -1, 0); + + //Pillars + fillWithBlocks(world, box, 0, 0, 2, 0, 4, 2, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 5, 0, 0, 5, 4, 0, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 4, 0, ModBlocks.concrete_pillar); + + fillWithBlocks(world, box, 0, 0, 5, 0, 3, 5, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 0, 0, sizeZ, 0, 3, sizeZ, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 3, 0, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 6, 0, sizeZ, 6, 3, sizeZ, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 9, 0, sizeZ, 9, 3, sizeZ, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 9, 0, 7, 9, 3, 7, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 4, sizeZ, ModBlocks.concrete_pillar); + + //Walls + //Back + fillWithRandomizedBlocks(world, box, 1, 0, 2, 5, 4, 2, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 5, 0, 1, 5, 4, 1, rand, ConcreteBricks); + + fillWithRandomizedBlocks(world, box, 6, 0, 0, sizeX - 1, 1, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 6, 2, 0, 6, 2, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 9, 2, 0, 10, 2, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX - 2, 2, 0, sizeX - 1, 2, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 6, 3, 0, sizeX - 1, 4, 0, rand, ConcreteBricks); + //Right + fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 1, sizeZ - 1, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 2, 1, sizeX, 2, 2, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 2, 5, sizeX, 2, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 2, sizeZ - 2, sizeX, 2, sizeZ - 1, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 3, 1, sizeX, 4, sizeZ - 1, rand, ConcreteBricks); + //Front + fillWithRandomizedBlocks(world, box, 0, 4, sizeZ, sizeX - 1, 4, sizeZ, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 10, 0, sizeZ, sizeX - 1, 1, sizeZ, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 10, 2, sizeZ, 10, 2, sizeZ, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX - 1, 2, sizeZ, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 10, 3, sizeZ, sizeX - 1, 3, sizeZ, rand, ConcreteBricks); + + fillWithRandomizedBlocks(world, box, 9, 0, 8, 9, 3, sizeZ - 1, rand, ConcreteBricks); + + fillWithRandomizedBlocks(world, box, 1, 0, 7, 8, 0, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 1, 1, 7, 1, 2, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 4, 1, 7, 8, 4, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 1, 4, 7, 3, 4, 7, rand, ConcreteBricks); + //Left + fillWithRandomizedBlocks(world, box, 0, 4, 3, 0, 4, sizeZ - 1, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 0, 0, 3, 0, 1, 6, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 0, 2, 3, 0, 3, 3, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 0, 2, 6, 0, 3, 6, rand, ConcreteBricks); + //Interior + fillWithRandomizedBlocks(world, box, 5, 1, 3, 5, 3, 5, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 5, 3, 6, 5, 3, 6, rand, ConcreteBricks); + + //Trim + randomlyFillWithBlocks(world, box, rand, 0.75F, 0, sizeY, 2, 5, sizeY, 2, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.75F, 5, sizeY, 1, 5, sizeY, 1, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.75F, 5, sizeY, 0, sizeX, sizeY, 0, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, sizeY, 1, sizeX, sizeY, sizeZ, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.75F, 0, sizeY, sizeZ, sizeX - 1, sizeY, sizeZ, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.75F, 0, sizeY, 3, 0, sizeY, sizeZ - 1, Blocks.stone_slab); + + //Floor + fillWithMetadataBlocks(world, box, 1, 0, 3, 4, 6, hpos, Blocks.wool, 13); //Green Wool + fillWithBlocks(world, box, 5, 0, 3, 5, 0, 6, ModBlocks.brick_light); + fillWithBlocks(world, box, 1, 0, 1, sizeX - 1, 0, 6, ModBlocks.brick_light); + fillWithBlocks(world, box, 10, 0, 7, sizeX - 1, 0, sizeZ - 1, ModBlocks.brick_light); + //Ceiling + fillWithBlocks(world, box, 6, 4, 1, sizeX - 1, 4, 2, ModBlocks.brick_light); + fillWithBlocks(world, box, 1, 4, 3, sizeX - 1, 4, sizeZ - 1, ModBlocks.brick_light); + + //Decorations + //Carpet + fillWithMetadataBlocks(world, box, 9, 1, 3, 11, 1, 6, Blocks.carpet, 8); //Light gray + //Windows + randomlyFillWithBlocks(world, box, rand, 0.75F, 0, 2, 4, 0, 3, 5, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, 7, 2, 0, 8, 2, 0, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, 0, sizeX - 2, 2, 0, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, 2, 3, sizeX, 2, 4, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, 2, 8, sizeX, 2, 9, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, sizeZ, sizeX - 2, 2, sizeZ, Blocks.glass_pane); + //Fuwnituwe >w< + int stairMetaE = this.getMetadataWithOffset(Blocks.oak_stairs, 1); //East + int stairMetaN = this.getMetadataWithOffset(Blocks.oak_stairs, 2); //Nowth :3 + int stairMetaS = this.getMetadataWithOffset(Blocks.oak_stairs, 3); //South + int stairMetaWU = this.getMetadataWithOffset(Blocks.oak_stairs, 5); //West, Upside-down + int stairMetaEU = this.getMetadataWithOffset(Blocks.oak_stairs, 5); //East, Upside-down + int stairMetaNU = this.getMetadataWithOffset(Blocks.oak_stairs, 6); //Nowth, Upside-down uwu + int stairMetaSU = this.getMetadataWithOffset(Blocks.oak_stairs, 7); //South, Upside-down + //Desk 1 :3 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 1, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 2, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, 3, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 3, 1, 2, box); //Chaiw :3 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(0), 1, 2, 4, box); //Nowth-facing Computer :33 + //Desk 2 :3 + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 7, 1, 3, box); //Chaiw :3 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 6, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 7, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.planks, 1, 8, 1, 4, box); //Spwuce Pwanks :3 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(0), 7, 2, 4, box); //Nowth-facing Computer X3 + placeBlockAtCurrentPosition(world, Blocks.flower_pot, 0, 8, 2, 4, box); + //Desk 3 :3 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 10, 1, 1, box); + fillWithMetadataBlocks(world, box, 11, 1, 1, sizeX - 1, 1, 1, Blocks.spruce_stairs, stairMetaSU); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, 2, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaSU, sizeX - 1, 1, 3, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, sizeX - 1, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, 5, box); + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaN, 11, 1, 2, box); //Chaiw ;3 + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaE, sizeX - 2, 1, 4, box); //Chaiw :333 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(1), sizeX - 3, 2, 1, box); //South-facing Computer :3 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(2), sizeX - 1, 2, 5, box); //West-facing Computer ^w^ + placeBlockAtCurrentPosition(world, Blocks.flower_pot, 0, sizeX - 1, 2, 3, box); + placeBlockAtCurrentPosition(world, ModBlocks.radiorec, getDecoMeta(3), sizeX - 1, 2, 2, box); //Wadio + //Desk 4 DX + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 10, 1, 8, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 11, 1, 8, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaN, 10, 1, 9, box); //Chaiw ;3 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(1), 10, 2, 8, box); //South-facing Computer :33 + //Desk 5 :333 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaSU, sizeX - 1, 1, sizeZ - 3, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, sizeX - 1, 1, sizeZ - 2, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, sizeZ - 1, box); + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaE, sizeX - 3, 1, sizeZ - 1, box); //UwU... Chaiw!!!! :333 I wove chaiws XD :333 OwO what's this?? chaiw???? :333333333333333333 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(2), sizeX - 1, 2, sizeZ - 1, box); //West-facing Computer >w< + //Cobwebs pwobabwy + + //Woot + if(!this.hasPlacedLoot[0]) + this.hasPlacedLoot[0] = generateInvContents(world, box, rand, Blocks.chest, sizeX - 4, 1, sizeZ - 1, HbmChestContents.officeTrash, 10); + if(!this.hasPlacedLoot[1]) + this.hasPlacedLoot[1] = generateLockableContents(world, box, rand, ModBlocks.safe, 6, 1, 1, null, 10, 0.2D); + + //TODO: add book with funny lore to safe, add cobwebs too + return false; + } + + } + +} From a5a3a96bdcc2ed345b89b5d35dc81125c4af7e20 Mon Sep 17 00:00:00 2001 From: Vaern Date: Tue, 6 Sep 2022 20:56:58 -0700 Subject: [PATCH 053/111] hm --- src/main/java/com/hbm/lib/HbmWorld.java | 2 + .../hbm/world/worldgen/MapGenNTMFeatures.java | 16 ++++-- .../world/worldgen/components/Feature.java | 2 +- .../worldgen/components/OfficeFeatures.java | 50 +++++++++++-------- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index 69294f45c..4f2c9444f 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -4,6 +4,7 @@ import com.hbm.world.worldgen.MapGenNTMFeatures; import com.hbm.world.worldgen.NTMWorldGenerator; import com.hbm.world.worldgen.components.CivilianFeatures.*; import com.hbm.world.worldgen.components.MilitaryBaseFeatures.*; +import com.hbm.world.worldgen.components.OfficeFeatures.*; import com.hbm.world.worldgen.components.RuinFeatures.*; import cpw.mods.fml.common.IWorldGenerator; @@ -46,5 +47,6 @@ public class HbmWorld { //aggggggggggg MapGenStructureIO.func_143031_a(BasicHelipad.class, "NTMBasicHelipad"); MapGenStructureIO.func_143031_a(RadioShack.class, "NTMRadioShack"); + MapGenStructureIO.func_143031_a(LargeOffice.class, "NTMLargeOffice"); } } diff --git a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java index 59fe2c35c..02665da95 100644 --- a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java @@ -11,6 +11,7 @@ import com.hbm.config.StructureConfig; import com.hbm.world.worldgen.components.CivilianFeatures.*; import com.hbm.world.worldgen.components.MilitaryBaseFeatures; import com.hbm.world.worldgen.components.MilitaryBaseFeatures.*; +import com.hbm.world.worldgen.components.OfficeFeatures.*; import com.hbm.world.worldgen.components.RuinFeatures.*; import net.minecraft.world.World; @@ -107,7 +108,7 @@ public class MapGenNTMFeatures extends MapGenStructure { * chance/location fails for all other structures. Might not even be necessary, but whatever. * Rainfall & Temperature Check */ - + //TODO: Do something about this so it's nice-looking and easily readable. Plus, test compatibility against mods like BoP if(rand.nextBoolean()) { //Empty Ruin Structures switch(rand.nextInt(4)) { case 0: @@ -135,13 +136,21 @@ public class MapGenNTMFeatures extends MapGenStructure { NTMHouse2 house2 = new NTMHouse2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(house2); } + } else if(biome.temperature >= 0.25 && biome.temperature <= 0.3 && biome.rainfall >= 0.6 && biome.rainfall <= 0.9) { //Taiga & Mega Taiga if(rand.nextBoolean()) { NTMWorkshop1 workshop1 = new NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(workshop1); } - } else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextBoolean()) { - MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg + + } else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextBoolean()) { //Everything except jungles, extra-hilly areas, and beaches + //if(rand.nextBoolean()) + // MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg + //else { + LargeOffice office = new LargeOffice(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + this.components.add(office); + //} + } else { //Everything else if(rand.nextBoolean()) { NTMLab2 lab2 = new NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); @@ -150,6 +159,7 @@ public class MapGenNTMFeatures extends MapGenStructure { NTMLab1 lab1 = new NTMLab1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(lab1); } + } if(GeneralConfig.enableDebugMode) { diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index 54333f173..164526226 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -305,7 +305,7 @@ abstract public class Feature extends StructureComponent { } protected void randomlyFillWithBlocks(World world, StructureBoundingBox box, Random rand, float randLimit, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) { - this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, block); + this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, block, block, false); } protected void fillWithRandomizedBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Random rand, BlockSelector selector) { diff --git a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java index 46169e4d9..4faa80eae 100644 --- a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java @@ -58,11 +58,12 @@ public class OfficeFeatures { this.boundingBox.offset(0, -1, 0); //Pillars + //Back fillWithBlocks(world, box, 0, 0, 2, 0, 4, 2, ModBlocks.concrete_pillar); fillWithBlocks(world, box, 5, 0, 0, 5, 4, 0, ModBlocks.concrete_pillar); fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 4, 0, ModBlocks.concrete_pillar); - - fillWithBlocks(world, box, 0, 0, 5, 0, 3, 5, ModBlocks.concrete_pillar); + //Front + fillWithBlocks(world, box, 0, 0, 7, 0, 3, 7, ModBlocks.concrete_pillar); fillWithBlocks(world, box, 0, 0, sizeZ, 0, 3, sizeZ, ModBlocks.concrete_pillar); fillWithBlocks(world, box, 3, 0, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar); fillWithBlocks(world, box, 6, 0, sizeZ, 6, 3, sizeZ, ModBlocks.concrete_pillar); @@ -97,8 +98,8 @@ public class OfficeFeatures { fillWithRandomizedBlocks(world, box, 1, 0, 7, 8, 0, 7, rand, ConcreteBricks); fillWithRandomizedBlocks(world, box, 1, 1, 7, 1, 2, 7, rand, ConcreteBricks); - fillWithRandomizedBlocks(world, box, 4, 1, 7, 8, 4, 7, rand, ConcreteBricks); - fillWithRandomizedBlocks(world, box, 1, 4, 7, 3, 4, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 4, 1, 7, 8, 3, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 1, 3, 7, 3, 3, 7, rand, ConcreteBricks); //Left fillWithRandomizedBlocks(world, box, 0, 4, 3, 0, 4, sizeZ - 1, rand, ConcreteBricks); fillWithRandomizedBlocks(world, box, 0, 0, 3, 0, 1, 6, rand, ConcreteBricks); @@ -109,17 +110,17 @@ public class OfficeFeatures { fillWithRandomizedBlocks(world, box, 5, 3, 6, 5, 3, 6, rand, ConcreteBricks); //Trim - randomlyFillWithBlocks(world, box, rand, 0.75F, 0, sizeY, 2, 5, sizeY, 2, Blocks.stone_slab); - randomlyFillWithBlocks(world, box, rand, 0.75F, 5, sizeY, 1, 5, sizeY, 1, Blocks.stone_slab); - randomlyFillWithBlocks(world, box, rand, 0.75F, 5, sizeY, 0, sizeX, sizeY, 0, Blocks.stone_slab); - randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, sizeY, 1, sizeX, sizeY, sizeZ, Blocks.stone_slab); - randomlyFillWithBlocks(world, box, rand, 0.75F, 0, sizeY, sizeZ, sizeX - 1, sizeY, sizeZ, Blocks.stone_slab); - randomlyFillWithBlocks(world, box, rand, 0.75F, 0, sizeY, 3, 0, sizeY, sizeZ - 1, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, 2, 5, sizeY, 2, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 5, sizeY, 1, 5, sizeY, 1, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 5, sizeY, 0, sizeX, sizeY, 0, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, sizeX, sizeY, 1, sizeX, sizeY, sizeZ, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, sizeZ, sizeX - 1, sizeY, sizeZ, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, 3, 0, sizeY, sizeZ - 1, Blocks.stone_slab); //Floor - fillWithMetadataBlocks(world, box, 1, 0, 3, 4, 6, hpos, Blocks.wool, 13); //Green Wool + fillWithMetadataBlocks(world, box, 1, 0, 3, 4, 0, 6, Blocks.wool, 13); //Green Wool fillWithBlocks(world, box, 5, 0, 3, 5, 0, 6, ModBlocks.brick_light); - fillWithBlocks(world, box, 1, 0, 1, sizeX - 1, 0, 6, ModBlocks.brick_light); + fillWithBlocks(world, box, 6, 0, 1, sizeX - 1, 0, 6, ModBlocks.brick_light); fillWithBlocks(world, box, 10, 0, 7, sizeX - 1, 0, sizeZ - 1, ModBlocks.brick_light); //Ceiling fillWithBlocks(world, box, 6, 4, 1, sizeX - 1, 4, 2, ModBlocks.brick_light); @@ -137,17 +138,17 @@ public class OfficeFeatures { randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, sizeZ, sizeX - 2, 2, sizeZ, Blocks.glass_pane); //Fuwnituwe >w< int stairMetaE = this.getMetadataWithOffset(Blocks.oak_stairs, 1); //East - int stairMetaN = this.getMetadataWithOffset(Blocks.oak_stairs, 2); //Nowth :3 - int stairMetaS = this.getMetadataWithOffset(Blocks.oak_stairs, 3); //South - int stairMetaWU = this.getMetadataWithOffset(Blocks.oak_stairs, 5); //West, Upside-down + int stairMetaS = this.getMetadataWithOffset(Blocks.oak_stairs, 2); //South + int stairMetaN = this.getMetadataWithOffset(Blocks.oak_stairs, 3); //Nowth :3 + int stairMetaWU = this.getMetadataWithOffset(Blocks.oak_stairs, 4); //West, Upside-down int stairMetaEU = this.getMetadataWithOffset(Blocks.oak_stairs, 5); //East, Upside-down int stairMetaNU = this.getMetadataWithOffset(Blocks.oak_stairs, 6); //Nowth, Upside-down uwu - int stairMetaSU = this.getMetadataWithOffset(Blocks.oak_stairs, 7); //South, Upside-down + int stairMetaSU = this.getMetadataWithOffset(Blocks.oak_stairs, 7); //South, Upside-down //Desk 1 :3 placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 1, 1, 4, box); - placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 2, 1, 4, box); - placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, 3, 1, 4, box); - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 3, 1, 2, box); //Chaiw :3 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, 2, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 3, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 2, 1, 3, box); //Chaiw :3 placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(0), 1, 2, 4, box); //Nowth-facing Computer :33 //Desk 2 :3 placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 7, 1, 3, box); //Chaiw :3 @@ -172,7 +173,7 @@ public class OfficeFeatures { //Desk 4 DX placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 10, 1, 8, box); placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 11, 1, 8, box); - placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaN, 10, 1, 9, box); //Chaiw ;3 + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaN, 10, 1, 9, box); //Chaiw ;3 placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(1), 10, 2, 8, box); //South-facing Computer :33 //Desk 5 :333 placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaSU, sizeX - 1, 1, sizeZ - 3, box); @@ -181,14 +182,21 @@ public class OfficeFeatures { placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaE, sizeX - 3, 1, sizeZ - 1, box); //UwU... Chaiw!!!! :333 I wove chaiws XD :333 OwO what's this?? chaiw???? :333333333333333333 placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(2), sizeX - 1, 2, sizeZ - 1, box); //West-facing Computer >w< //Cobwebs pwobabwy + //Maybe make a method for this eventually? + //Something where the tops of ceilings + empty corners along walls get most cobwebs, + //with no cobwebs hanging midair + it not being performance intensive + randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 3, 3, 4, 3, 6, Blocks.web); + randomlyFillWithBlocks(world, box, rand, 0.25F, 6, 3, 1, sizeX - 1, 3, 6, Blocks.web); + randomlyFillWithBlocks(world, box, rand, 0.25F, 10, 3, 7, sizeX - 1, 3, sizeZ - 1, Blocks.web); //Woot if(!this.hasPlacedLoot[0]) this.hasPlacedLoot[0] = generateInvContents(world, box, rand, Blocks.chest, sizeX - 4, 1, sizeZ - 1, HbmChestContents.officeTrash, 10); if(!this.hasPlacedLoot[1]) - this.hasPlacedLoot[1] = generateLockableContents(world, box, rand, ModBlocks.safe, 6, 1, 1, null, 10, 0.2D); + this.hasPlacedLoot[1] = generateLockableContents(world, box, rand, ModBlocks.safe, 6, 1, 1, HbmChestContents.machineParts, 10, 0.5D); //TODO: add book with funny lore to safe, add cobwebs too + //0b00/0 West, 0b01/1 East, 0b10/2 North, 0b11/3 South, 0b100/4 West UD, 0b101 East UD, 0b110 North UD, 0b111 South UD return false; } From ea1a79f55947676da8c641dd11a6cbba03d474f0 Mon Sep 17 00:00:00 2001 From: Vaern Date: Wed, 7 Sep 2022 20:57:30 -0700 Subject: [PATCH 054/111] h --- .../com/hbm/world/worldgen/MapGenNTMFeatures.java | 12 ++++++------ .../hbm/world/worldgen/components/Feature.java | 13 +++++++++++-- .../world/worldgen/components/OfficeFeatures.java | 15 ++++++++------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java index 02665da95..3308d46f3 100644 --- a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java @@ -109,7 +109,7 @@ public class MapGenNTMFeatures extends MapGenStructure { * Rainfall & Temperature Check */ //TODO: Do something about this so it's nice-looking and easily readable. Plus, test compatibility against mods like BoP - if(rand.nextBoolean()) { //Empty Ruin Structures + /*if(rand.nextBoolean()) { //Empty Ruin Structures switch(rand.nextInt(4)) { case 0: NTMRuin1 ruin1 = new NTMRuin1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); @@ -144,12 +144,12 @@ public class MapGenNTMFeatures extends MapGenStructure { } } else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextBoolean()) { //Everything except jungles, extra-hilly areas, and beaches - //if(rand.nextBoolean()) - // MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg - //else { + if(rand.nextBoolean()) + MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg + else {*/ LargeOffice office = new LargeOffice(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(office); - //} + /*} } else { //Everything else if(rand.nextBoolean()) { @@ -160,7 +160,7 @@ public class MapGenNTMFeatures extends MapGenStructure { this.components.add(lab1); } - } + }*/ if(GeneralConfig.enableDebugMode) { System.out.print("[Debug] StructureStart at " + (chunkX * 16 + 8) + ", " + posY + ", " + (chunkZ * 16 + 8) + "\n[Debug] Components: "); diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index 164526226..0d4b568a3 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -162,9 +162,18 @@ abstract public class Feature extends StructureComponent { //N: 0b00, S: 0b01, W: 0b10, E: 0b11 int rot = metadata & 3; + switch(this.coordBaseMode) { + default: //South + break; + case 1: //West + break; //N & S can just have NOT used + case 2: //North + break; + case 3: //East + break; + } - - return 0; + return metadata | rot; } /** diff --git a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java index 4faa80eae..c27c30b56 100644 --- a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java @@ -137,13 +137,14 @@ public class OfficeFeatures { randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, 2, 8, sizeX, 2, 9, Blocks.glass_pane); randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, sizeZ, sizeX - 2, 2, sizeZ, Blocks.glass_pane); //Fuwnituwe >w< + //North and south are reversed?????? But east and west aren't???? int stairMetaE = this.getMetadataWithOffset(Blocks.oak_stairs, 1); //East - int stairMetaS = this.getMetadataWithOffset(Blocks.oak_stairs, 2); //South - int stairMetaN = this.getMetadataWithOffset(Blocks.oak_stairs, 3); //Nowth :3 - int stairMetaWU = this.getMetadataWithOffset(Blocks.oak_stairs, 4); //West, Upside-down - int stairMetaEU = this.getMetadataWithOffset(Blocks.oak_stairs, 5); //East, Upside-down - int stairMetaNU = this.getMetadataWithOffset(Blocks.oak_stairs, 6); //Nowth, Upside-down uwu - int stairMetaSU = this.getMetadataWithOffset(Blocks.oak_stairs, 7); //South, Upside-down + int stairMetaS = this.getMetadataWithOffset(Blocks.oak_stairs, 2); //*SHOULD* be north, but south + int stairMetaN = this.getMetadataWithOffset(Blocks.oak_stairs, 3); //Ditto, but north :3 + int stairMetaWU = this.getMetadataWithOffset(Blocks.oak_stairs, 0) | 4; //West, Upside-down + int stairMetaEU = this.getMetadataWithOffset(Blocks.oak_stairs, 1) | 4; //East, Upside-down + int stairMetaSU = this.getMetadataWithOffset(Blocks.oak_stairs, 2) | 4; //Ditto, but south, Upside-down uwu + int stairMetaNU = this.getMetadataWithOffset(Blocks.oak_stairs, 3) | 4; //Ditto, but north, Upside-down //Desk 1 :3 placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 1, 1, 4, box); placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, 2, 1, 4, box); @@ -169,7 +170,7 @@ public class OfficeFeatures { placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(1), sizeX - 3, 2, 1, box); //South-facing Computer :3 placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(2), sizeX - 1, 2, 5, box); //West-facing Computer ^w^ placeBlockAtCurrentPosition(world, Blocks.flower_pot, 0, sizeX - 1, 2, 3, box); - placeBlockAtCurrentPosition(world, ModBlocks.radiorec, getDecoMeta(3), sizeX - 1, 2, 2, box); //Wadio + placeBlockAtCurrentPosition(world, ModBlocks.radiorec, getDecoMeta(5), sizeX - 1, 2, 2, box); //Wadio //Desk 4 DX placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 10, 1, 8, box); placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 11, 1, 8, box); From c0e116f56a3836f975a45bb2c787e133b5071ce8 Mon Sep 17 00:00:00 2001 From: Vaern Date: Thu, 8 Sep 2022 20:55:28 -0700 Subject: [PATCH 055/111] how do you fuck this up that badly thanks mojang --- .../world/worldgen/components/Feature.java | 71 ++++++++++++++++--- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index 0d4b568a3..73aaf49bc 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -50,11 +50,10 @@ abstract public class Feature extends StructureComponent { this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); break; case 2: - //North (2) and East (3) will result in mirrored structures. Not an issue, but keep in mind. this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); break; case 3: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); break; default: this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); @@ -140,15 +139,15 @@ abstract public class Feature extends StructureComponent { switch(metadata) { case 2: return 3; case 3: return 2; - case 4: return 4; - case 5: return 5; + case 4: return 5; + case 5: return 4; } case 3: //East switch(metadata) { case 2: return 4; case 3: return 5; - case 4: return 2; - case 5: return 3; + case 4: return 3; + case 5: return 2; } } return 0; @@ -160,25 +159,42 @@ abstract public class Feature extends StructureComponent { */ protected int getDecoModelMeta(int metadata) { //N: 0b00, S: 0b01, W: 0b10, E: 0b11 - int rot = metadata & 3; switch(this.coordBaseMode) { default: //South break; case 1: //West - break; //N & S can just have NOT used + if((metadata & 3) < 2) //N & S can just have bits toggled + metadata = metadata ^ 3; + else //W & E can just have first bit set to 0 + metadata = metadata ^ 2; + break; case 2: //North + metadata = metadata ^ 1; //N, W, E & S can just have first bit toggled break; case 3: //East + if((metadata & 3) < 2)//N & S can just have second bit set to 1 + metadata = metadata ^ 2; + else //W & E can just have bits toggled + metadata = metadata ^ 3; break; } - return metadata | rot; + return metadata; } + //TODO: fix metadata finder for doors + //TODO: add method for stairs + /* For Later: + * 0/S: S->S; W->W; N->N; E->E + * 1/W: S->W; W->N; N->E; E->S + * 2/N: S->N; W->E; N->S; E->W + * 3/E: S->E; W->S; N->W; E->N + */ + /** * Places door at specified location with orientation-adjusted meta - * don't ask me which directions are what (take direction such as South/0 and add 1) + * 0 = West, 1 = North, 2 = East, 3 = South */ protected void placeDoor(World world, StructureBoundingBox box, Block door, int direction, int featureX, int featureY, int featureZ) { int meta = getMetadataWithOffset(Blocks.wooden_door, direction); @@ -303,6 +319,41 @@ abstract public class Feature extends StructureComponent { } } + /** getXWithOffset & getZWithOffset Methods that are actually fixed **/ + //Turns out, this entire time every single minecraft structure is mirrored instead of rotated when facing East and North + //Also turns out, it's a scarily easy fix that they somehow didn't see *entirely* + @Override + protected int getXWithOffset(int x, int z) { + switch(this.coordBaseMode) { + case 0: + return this.boundingBox.minX + x; + case 1: + return this.boundingBox.maxX - z; + case 2: + return this.boundingBox.maxX - x; + case 3: + return this.boundingBox.minX + z; + default: + return x; + } + } + + @Override + protected int getZWithOffset(int x, int z) { + switch(this.coordBaseMode) { + case 0: + return this.boundingBox.minZ + z; + case 1: + return this.boundingBox.minZ + x; + case 2: + return this.boundingBox.maxZ - z; + case 3: + return this.boundingBox.maxZ - x; + default: + return x; + } + } + /** Methods that remove the replaceBlock and alwaysReplace, and other parameters: as they are useless and only serve as a time sink normally. */ protected void fillWithBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) { From f37ac604232a3ec8c3a2b28d267c767637409a9a Mon Sep 17 00:00:00 2001 From: "Dr. Maniac, PHD" Date: Fri, 9 Sep 2022 15:43:31 -0700 Subject: [PATCH 056/111] stair meta working --- .../world/worldgen/components/Feature.java | 26 ++++++++++++++++++- .../worldgen/components/OfficeFeatures.java | 15 +++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index 73aaf49bc..f25d3a03e 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -154,7 +154,7 @@ abstract public class Feature extends StructureComponent { } /** - * + * Get orientation-offset metadata for BlockDecoModel * @param metadata (0 for facing North, 1 for facing South, 2 for facing West, 3 for facing East) */ protected int getDecoModelMeta(int metadata) { @@ -190,7 +190,31 @@ abstract public class Feature extends StructureComponent { * 1/W: S->W; W->N; N->E; E->S * 2/N: S->N; W->E; N->S; E->W * 3/E: S->E; W->S; N->W; E->N + * 0/b00/W, 1/b01/E, 2/b10/N, 3/b11/S */ + protected int getStairMeta(int metadata) { + switch(this.coordBaseMode) { + default: //South + break; + case 1: //West + if((metadata & 3) < 2) //Flip second bit for E/W + metadata = metadata ^ 2; + else + metadata = metadata ^ 3; //Flip both bits for N/S + break; + case 2: //North + metadata = metadata ^ 1; //Flip first bit + break; + case 3: //East + if((metadata & 3) < 2) //Flip both bits for E/W + metadata = metadata ^ 3; + else //Flip second bit for N/S + metadata = metadata ^ 2; + break; + } + + return metadata; + } /** * Places door at specified location with orientation-adjusted meta diff --git a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java index c27c30b56..e4ce0f193 100644 --- a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java @@ -137,14 +137,13 @@ public class OfficeFeatures { randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, 2, 8, sizeX, 2, 9, Blocks.glass_pane); randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, sizeZ, sizeX - 2, 2, sizeZ, Blocks.glass_pane); //Fuwnituwe >w< - //North and south are reversed?????? But east and west aren't???? - int stairMetaE = this.getMetadataWithOffset(Blocks.oak_stairs, 1); //East - int stairMetaS = this.getMetadataWithOffset(Blocks.oak_stairs, 2); //*SHOULD* be north, but south - int stairMetaN = this.getMetadataWithOffset(Blocks.oak_stairs, 3); //Ditto, but north :3 - int stairMetaWU = this.getMetadataWithOffset(Blocks.oak_stairs, 0) | 4; //West, Upside-down - int stairMetaEU = this.getMetadataWithOffset(Blocks.oak_stairs, 1) | 4; //East, Upside-down - int stairMetaSU = this.getMetadataWithOffset(Blocks.oak_stairs, 2) | 4; //Ditto, but south, Upside-down uwu - int stairMetaNU = this.getMetadataWithOffset(Blocks.oak_stairs, 3) | 4; //Ditto, but north, Upside-down + int stairMetaE = getStairMeta(1); //East + int stairMetaN = getStairMeta(2); //*SHOULD* be north + int stairMetaS = getStairMeta(3); //South :3 + int stairMetaWU = getStairMeta(0) | 4; //West, Upside-down + int stairMetaEU = stairMetaE | 4; //East, Upside-down + int stairMetaNU = stairMetaN | 4; //North, Upside-down uwu + int stairMetaSU = stairMetaS | 4; //South, Upside-down //Desk 1 :3 placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 1, 1, 4, box); placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, 2, 1, 4, box); From 0826e7ca50785bf23419cad2de2d30b2d8bb1e26 Mon Sep 17 00:00:00 2001 From: Vaern Date: Fri, 9 Sep 2022 22:39:32 -0700 Subject: [PATCH 057/111] fixed placedoor, shifted structure spawns and stuff --- .../hbm/world/worldgen/MapGenNTMFeatures.java | 28 ++++----- .../worldgen/components/CivilianFeatures.java | 3 +- .../world/worldgen/components/Feature.java | 57 ++++++++++++------- .../worldgen/components/OfficeFeatures.java | 11 +++- 4 files changed, 60 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java index 3308d46f3..7045891e0 100644 --- a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java @@ -109,7 +109,7 @@ public class MapGenNTMFeatures extends MapGenStructure { * Rainfall & Temperature Check */ //TODO: Do something about this so it's nice-looking and easily readable. Plus, test compatibility against mods like BoP - /*if(rand.nextBoolean()) { //Empty Ruin Structures + if(rand.nextBoolean()) { //Empty Ruin Structures switch(rand.nextInt(4)) { case 0: NTMRuin1 ruin1 = new NTMRuin1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); @@ -137,30 +137,26 @@ public class MapGenNTMFeatures extends MapGenStructure { this.components.add(house2); } - } else if(biome.temperature >= 0.25 && biome.temperature <= 0.3 && biome.rainfall >= 0.6 && biome.rainfall <= 0.9) { //Taiga & Mega Taiga - if(rand.nextBoolean()) { + } else if(biome.temperature >= 0.25 && biome.temperature <= 0.3 && biome.rainfall >= 0.6 && biome.rainfall <= 0.9 && rand.nextBoolean()) { //Taiga & Mega Taiga NTMWorkshop1 workshop1 = new NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(workshop1); - } - } else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextBoolean()) { //Everything except jungles, extra-hilly areas, and beaches - if(rand.nextBoolean()) + } else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextInt(3) == 0) { //Everything except jungles, extra-hilly areas, and beaches MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg - else {*/ - LargeOffice office = new LargeOffice(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); - this.components.add(office); - /*} } else { //Everything else - if(rand.nextBoolean()) { + switch(rand.nextInt(3)) { + case 0: NTMLab2 lab2 = new NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); - this.components.add(lab2); - } else { + this.components.add(lab2); break; + case 1: NTMLab1 lab1 = new NTMLab1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); - this.components.add(lab1); + this.components.add(lab1); break; + case 2: + LargeOffice office = new LargeOffice(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + this.components.add(office); break; } - - }*/ + } if(GeneralConfig.enableDebugMode) { System.out.print("[Debug] StructureStart at " + (chunkX * 16 + 8) + ", " + posY + ", " + (chunkZ * 16 + 8) + "\n[Debug] Components: "); diff --git a/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java b/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java index 88b2e9d9c..afcf72df3 100644 --- a/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java @@ -330,11 +330,10 @@ public class CivilianFeatures { } } - int stairsMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 0); if(this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box).getMaterial().isReplaceable() || this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box) == Blocks.air) { this.func_151554_b(world, Blocks.stonebrick, 0, 2, -1, sizeZ - 1, box); - this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairsMeta, 2, 0, sizeZ - 1, box); + this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(0), 2, 0, sizeZ - 1, box); } this.fillWithAir(world, box, 1, 0, 1, sizeX - 1, sizeY, 4); diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index f25d3a03e..d185fb4c3 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -183,14 +183,9 @@ abstract public class Feature extends StructureComponent { return metadata; } - //TODO: fix metadata finder for doors - //TODO: add method for stairs - /* For Later: - * 0/S: S->S; W->W; N->N; E->E - * 1/W: S->W; W->N; N->E; E->S - * 2/N: S->N; W->E; N->S; E->W - * 3/E: S->E; W->S; N->W; E->N - * 0/b00/W, 1/b01/E, 2/b10/N, 3/b11/S + /** + * Gets orientation-adjusted meta for stairs. + * 0 = West, 1 = East, 2 = North, 3 = South */ protected int getStairMeta(int metadata) { switch(this.coordBaseMode) { @@ -216,12 +211,29 @@ abstract public class Feature extends StructureComponent { return metadata; } + /* For Later: + * 0/S: S->S; W->W; N->N; E->E + * 1/W: S->W; W->N; N->E; E->S + * 2/N: S->N; W->E; N->S; E->W + * 3/E: S->E; W->S; N->W; E->N + * 0/b00/W, 1/b01/N, 2/b10/E, 3/b11/S + */ /** * Places door at specified location with orientation-adjusted meta * 0 = West, 1 = North, 2 = East, 3 = South */ - protected void placeDoor(World world, StructureBoundingBox box, Block door, int direction, int featureX, int featureY, int featureZ) { - int meta = getMetadataWithOffset(Blocks.wooden_door, direction); + protected void placeDoor(World world, StructureBoundingBox box, Block door, int meta, int featureX, int featureY, int featureZ) { + switch(this.coordBaseMode) { + default: + break; + case 1: + meta = (meta + 1) % 4; break; + case 2: + meta = meta ^ 2; break; //Flip second bit + case 3: + meta = (meta - 1) % 4; break; + } + int posX = this.getXWithOffset(featureX, featureZ); int posY = this.getYWithOffset(featureY); int posZ = this.getZWithOffset(featureX, featureZ); @@ -304,17 +316,22 @@ abstract public class Feature extends StructureComponent { /** * Places blocks underneath location until reaching a solid block; good for foundations */ - protected void placeFoundationUnderneath(World world, Block placeBlock, int meta, int featureX, int featureY, int featureZ, StructureBoundingBox box) { - int posX = this.getXWithOffset(featureX, featureZ); - int posY = this.getYWithOffset(featureY); - int posZ = this.getZWithOffset(featureX, featureZ); + protected void placeFoundationUnderneath(World world, Block placeBlock, int meta, int minX, int minZ, int maxX, int maxZ, int featureY, StructureBoundingBox box) { - if(box.isVecInside(posX, posY, posZ)) { - Block block = world.getBlock(posX, posY, posZ); - - while ((world.isAirBlock(posX, posY, posZ) || !block.getMaterial().isSolid() || (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && posY > 1) { - world.setBlock(posX, posY, posZ, placeBlock, meta, 2); - block = world.getBlock(posX, --posY, posZ); + for(int featureX = minX; featureX <= maxX; featureX++) { + for(int featureZ = minZ; featureZ <= maxZ; featureZ++) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + if(box.isVecInside(posX, posY, posZ)) { + Block block = world.getBlock(posX, posY, posZ); + + while ((world.isAirBlock(posX, posY, posZ) || !block.getMaterial().isSolid() || (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && posY > 1) { + world.setBlock(posX, posY, posZ, placeBlock, meta, 2); + block = world.getBlock(posX, --posY, posZ); + } + } } } } diff --git a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java index e4ce0f193..870f515a7 100644 --- a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java @@ -57,6 +57,11 @@ public class OfficeFeatures { this.boundingBox.offset(0, -1, 0); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 0, sizeX, 1, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 2, sizeX, 7, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 8, 8, sizeZ, 0, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 9, 8, sizeX, sizeZ, -1, box); + //Pillars //Back fillWithBlocks(world, box, 0, 0, 2, 0, 4, 2, ModBlocks.concrete_pillar); @@ -79,7 +84,7 @@ public class OfficeFeatures { fillWithRandomizedBlocks(world, box, 6, 0, 0, sizeX - 1, 1, 0, rand, ConcreteBricks); fillWithRandomizedBlocks(world, box, 6, 2, 0, 6, 2, 0, rand, ConcreteBricks); fillWithRandomizedBlocks(world, box, 9, 2, 0, 10, 2, 0, rand, ConcreteBricks); - fillWithRandomizedBlocks(world, box, sizeX - 2, 2, 0, sizeX - 1, 2, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX - 1, 2, 0, sizeX - 1, 2, 0, rand, ConcreteBricks); fillWithRandomizedBlocks(world, box, 6, 3, 0, sizeX - 1, 4, 0, rand, ConcreteBricks); //Right fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 1, sizeZ - 1, rand, ConcreteBricks); @@ -188,6 +193,10 @@ public class OfficeFeatures { randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 3, 3, 4, 3, 6, Blocks.web); randomlyFillWithBlocks(world, box, rand, 0.25F, 6, 3, 1, sizeX - 1, 3, 6, Blocks.web); randomlyFillWithBlocks(world, box, rand, 0.25F, 10, 3, 7, sizeX - 1, 3, sizeZ - 1, Blocks.web); + //Doors + placeDoor(world, box, ModBlocks.door_office, 3, 2, 1, 7); + placeDoor(world, box, ModBlocks.door_office, 3, 3, 1, 7); + placeDoor(world, box, ModBlocks.door_office, 0, 5, 1, 6); //Woot if(!this.hasPlacedLoot[0]) From 34d3b117139c8d07069184cf734b82744a7c6792 Mon Sep 17 00:00:00 2001 From: Vaern Date: Sat, 10 Sep 2022 20:07:57 -0700 Subject: [PATCH 058/111] bozo get btfo'd kekW --- .../java/com/hbm/lib/HbmChestContents.java | 33 +++++++++++++++++++ .../world/worldgen/components/Feature.java | 16 +++++++++ .../worldgen/components/OfficeFeatures.java | 8 ++++- src/main/resources/assets/hbm/lang/en_US.lang | 6 ++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/lib/HbmChestContents.java b/src/main/java/com/hbm/lib/HbmChestContents.java index 56cb0a257..e8b53cd74 100644 --- a/src/main/java/com/hbm/lib/HbmChestContents.java +++ b/src/main/java/com/hbm/lib/HbmChestContents.java @@ -6,10 +6,16 @@ import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBreedingRod.*; +import com.hbm.util.I18nUtil; import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; import net.minecraft.util.WeightedRandomChestContent; +import net.minecraft.world.World; public class HbmChestContents { @@ -350,4 +356,31 @@ public class HbmChestContents { new WeightedRandomChestContent(ModItems.can_mrsugar, 0, 1, 2, 2), new WeightedRandomChestContent(ModItems.book_guide, 3, 1, 1, 1), new WeightedRandomChestContent(Item.getItemFromBlock(ModBlocks.deco_computer), 0, 1, 1, 1)}; + + /** Nowhere else to put this and this seems like the most fitting place **/ + public static ItemStack genetateBook(String key) { + + String author = I18nUtil.resolveKey("book.lore." + key + ".author"); + String title = I18nUtil.resolveKey("book.lore." + key + ".title"); + + ItemStack book = new ItemStack(Items.written_book); + book.stackTagCompound = new NBTTagCompound(); + book.stackTagCompound.setString("author", author); + book.stackTagCompound.setString("title", title); + NBTTagList nbt = new NBTTagList(); + + for(byte i = 1; i <= 50; i++) { + String unloc = "book.lore." + key + ".page" + i; + String page = I18nUtil.resolveKey(unloc); + + if(page.equals(unloc)) + break; + else + nbt.appendTag(new NBTTagString(page)); + } + + book.stackTagCompound.setTag("pages", nbt); + + return book; + } } diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index d185fb4c3..4a7a82703 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -6,6 +6,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; import com.hbm.config.StructureConfig; +import com.hbm.lib.HbmChestContents; import com.hbm.tileentity.machine.TileEntityLockableBase; import com.hbm.tileentity.machine.storage.TileEntityCrateIron; @@ -14,6 +15,7 @@ import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemDoor; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.WeightedRandomChestContent; @@ -294,6 +296,20 @@ abstract public class Feature extends StructureComponent { return false; } + protected void generateLoreBook(World world, StructureBoundingBox box, int featureX, int featureY, int featureZ, int slot, String key) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + IInventory inventory = (IInventory) world.getTileEntity(posX, posY, posZ); + + if(inventory != null) { + ItemStack book = HbmChestContents.genetateBook(key); + + inventory.setInventorySlotContents(slot, book); + } + } + /** * Places random bobblehead with a randomized orientation at specified location */ diff --git a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java index 870f515a7..ebcdeb079 100644 --- a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java @@ -62,6 +62,10 @@ public class OfficeFeatures { placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 8, 8, sizeZ, 0, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 9, 8, sizeX, sizeZ, -1, box); + fillWithAir(world, box, 1, 1, 3, 4, 3, 6); + fillWithAir(world, box, 6, 1, 1, sizeX - 1, 3, 6); + fillWithAir(world, box, 10, 1, 7, sizeX - 1, 3, sizeZ - 1); + //Pillars //Back fillWithBlocks(world, box, 0, 0, 2, 0, 4, 2, ModBlocks.concrete_pillar); @@ -201,8 +205,10 @@ public class OfficeFeatures { //Woot if(!this.hasPlacedLoot[0]) this.hasPlacedLoot[0] = generateInvContents(world, box, rand, Blocks.chest, sizeX - 4, 1, sizeZ - 1, HbmChestContents.officeTrash, 10); - if(!this.hasPlacedLoot[1]) + if(!this.hasPlacedLoot[1]) { this.hasPlacedLoot[1] = generateLockableContents(world, box, rand, ModBlocks.safe, 6, 1, 1, HbmChestContents.machineParts, 10, 0.5D); + generateLoreBook(world, box, 6, 1, 1, 7, "office" + rand.nextInt(1)); + } //TODO: add book with funny lore to safe, add cobwebs too //0b00/0 West, 0b01/1 East, 0b10/2 North, 0b11/3 South, 0b100/4 West UD, 0b101 East UD, 0b110 North UD, 0b111 South UD diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cb6f6b8b1..0cd04cc47 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -314,6 +314,12 @@ book.starter.page18=vær is just a guy who has been trapped in the grey void fea #book.rbmk.title16=Meltdown #book.rbmk.page16=§4§lAvoid. +book.lore.office0.title=Letter of Resignation +book.lore.office0.author=Kosma +book.lore.office0.page1=Management downsized our department again yesterday. Those idiots only have themselves to blame, I don't know what they were expecting after the Panay fiasco. Who the hell leaks that sort of information? We're losing millions and +book.lore.office0.page2=it's ME who's the one out of a job now. I'M the one being asked to resign. I hope you asshats finally learn from your overabundance of mistakes and take that stick out of your ass. +book.lore.office0.page3=I'm not coming back tomorrow. Just send the paycheck. + cannery.f1=[ Press F1 for help ] cannery.centrifuge=Gas Centrifuge From df7277cf8321b6d5ffea08eb2f25f544e4666f73 Mon Sep 17 00:00:00 2001 From: Vaern Date: Sun, 11 Sep 2022 13:23:45 -0700 Subject: [PATCH 059/111] screw it --- .../hbm/inventory/recipes/anvil/AnvilRecipes.java | 12 ++++++++++++ src/main/resources/assets/hbm/lang/en_US.lang | 7 ++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 8780d34ae..233771927 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -493,6 +493,18 @@ public class AnvilRecipes { new AnvilOutput(new ItemStack(ModItems.ingot_tcalloy, 1), 0.25F) } ).setTier(3)); + + constructionRecipes.add(new AnvilConstructionRecipe( + new ComparableStack(ModBlocks.deco_computer), + new AnvilOutput[] { + new AnvilOutput(new ItemStack(ModItems.crt_display, 1)), + new AnvilOutput(new ItemStack(ModItems.scrap, 3)), + new AnvilOutput(new ItemStack(ModItems.wire_copper, 4)), + new AnvilOutput(new ItemStack(ModItems.circuit_red_copper, 1), 0.25F), + new AnvilOutput(new ItemStack(ModItems.circuit_copper, 2)) + + } + ).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( new ComparableStack(ModItems.circuit_raw), diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 0cd04cc47..987258ebc 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -318,7 +318,12 @@ book.lore.office0.title=Letter of Resignation book.lore.office0.author=Kosma book.lore.office0.page1=Management downsized our department again yesterday. Those idiots only have themselves to blame, I don't know what they were expecting after the Panay fiasco. Who the hell leaks that sort of information? We're losing millions and book.lore.office0.page2=it's ME who's the one out of a job now. I'M the one being asked to resign. I hope you asshats finally learn from your overabundance of mistakes and take that stick out of your ass. -book.lore.office0.page3=I'm not coming back tomorrow. Just send the paycheck. +book.lore.office0.page3=I'm not coming back on Friday. Just send the paycheck. + +book.lore.office1.title=Note +book.lore.office1.author=Jonas +book.lore.office1.page1= +book.lore.office2.page2= cannery.f1=[ Press F1 for help ] From f608d55f93148c16dd8deb9b65d0574d324d8907 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 12 Sep 2022 16:59:29 +0200 Subject: [PATCH 060/111] small material test --- .../inventory/material/MaterialShapes.java | 20 +++++++++++ .../java/com/hbm/inventory/material/Mats.java | 5 +++ .../hbm/inventory/material/NTMMaterial.java | 33 +++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/main/java/com/hbm/inventory/material/MaterialShapes.java create mode 100644 src/main/java/com/hbm/inventory/material/Mats.java create mode 100644 src/main/java/com/hbm/inventory/material/NTMMaterial.java diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java new file mode 100644 index 000000000..d22cc8c70 --- /dev/null +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -0,0 +1,20 @@ +package com.hbm.inventory.material; + +public enum MaterialShapes { + + QUANTUM(1), // 1/72 of an ingot, allows the ingot to be divisible through 2, 4, 6, 8, 9, 12, 24 and 36 + NUGGET(8, "nugget"), + WIRE(9), + INGOT(NUGGET.quantity * 9, "ingot"), + DUST(INGOT.quantity, "dust"), + PLATE(INGOT.quantity, "plate"), + BLOCK(INGOT.quantity * 9, "block"); + + int quantity; + String[] prefixes; + + private MaterialShapes(int quantity, String... prefixes) { + this.quantity = quantity; + this.prefixes = prefixes; + } +} diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java new file mode 100644 index 000000000..065c7da19 --- /dev/null +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -0,0 +1,5 @@ +package com.hbm.inventory.material; + +public class Mats { + +} diff --git a/src/main/java/com/hbm/inventory/material/NTMMaterial.java b/src/main/java/com/hbm/inventory/material/NTMMaterial.java new file mode 100644 index 000000000..38bf7fec2 --- /dev/null +++ b/src/main/java/com/hbm/inventory/material/NTMMaterial.java @@ -0,0 +1,33 @@ +package com.hbm.inventory.material; + +/** + * Encapsulates most materials that are currently listed as DictFrames, even vanilla ones. + * @author hbm + * + */ +public class NTMMaterial { + + public String[] names; + public MaterialShapes[] shapes = new MaterialShapes[0]; + public boolean omitItemGen = false; + public boolean smeltable = false; + + public NTMMaterial(String... names) { + this.names = names; + } + + public NTMMaterial setShapes(MaterialShapes... shapes) { + this.shapes = shapes; + return this; + } + + public NTMMaterial omit() { + this.omitItemGen = true; + return this; + } + + public NTMMaterial smeltable() { + this.smeltable = true; + return this; + } +} From 5a87f9be640ea197a14791f0a946215093ab316c Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 12 Sep 2022 23:21:39 +0200 Subject: [PATCH 061/111] crucible GUI, smeltable material definitions --- .../hbm/blocks/machine/MachineCrucible.java | 6 ++ .../container/ContainerCrucible.java | 73 ++++++++++++++++++ .../com/hbm/inventory/gui/GUICrucible.java | 46 +++++++++++ .../java/com/hbm/inventory/material/Mats.java | 12 +++ .../hbm/inventory/material/NTMMaterial.java | 25 +++++- .../machine/TileEntityCrucible.java | 52 ++++++++++++- .../hbm/textures/gui/machine/gui_crucible.png | Bin 7412 -> 0 bytes .../textures/gui/processing/gui_crucible.png | Bin 0 -> 7853 bytes .../gui_crucible_base.png | Bin .../gui_crucible_brighten_21.png | Bin .../gui_crucible_multiply_100.png | Bin .../hbm/textures/items/crucible_template.png | Bin 0 -> 233 bytes 12 files changed, 207 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerCrucible.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUICrucible.java delete mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_crucible.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png rename src/main/resources/assets/hbm/textures/gui/{machine => processing}/gui_crucible_base.png (100%) rename src/main/resources/assets/hbm/textures/gui/{machine => processing}/gui_crucible_brighten_21.png (100%) rename src/main/resources/assets/hbm/textures/gui/{machine => processing}/gui_crucible_multiply_100.png (100%) create mode 100644 src/main/resources/assets/hbm/textures/items/crucible_template.png diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java index d4618952c..d9d0285b4 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -4,6 +4,7 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.tileentity.machine.TileEntityCrucible; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -21,6 +22,11 @@ public class MachineCrucible extends BlockDummyable { return null; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return this.standardOpenBehavior(world, x, y, z, player, 0); + } @Override public int[] getDimensions() { diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java new file mode 100644 index 000000000..3f9fb375f --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java @@ -0,0 +1,73 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.machine.TileEntityCrucible; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerCrucible extends Container { + + protected TileEntityCrucible crucible; + + public ContainerCrucible(InventoryPlayer invPlayer, TileEntityCrucible crucible) { + this.crucible = crucible; + + //input + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 3; j++) { + this.addSlotToContainer(new Slot(crucible, j + i * 3, 107 + j * 18, 18 + i * 18)); + } + } + + //template + this.addSlotToContainer(new Slot(crucible, 9, 107, 81)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 132 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 190)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack stack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack originalStack = slot.getStack(); + stack = originalStack.copy(); + + if(index <= 9) { + if(!this.mergeItemStack(originalStack, 10, this.inventorySlots.size(), true)) { + return null; + } + + slot.onSlotChange(originalStack, stack); + + } else if(!this.mergeItemStack(originalStack, 0, 10, false)) { + return null; + } + + if(originalStack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return stack; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return crucible.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUICrucible.java b/src/main/java/com/hbm/inventory/gui/GUICrucible.java new file mode 100644 index 000000000..61345bd6c --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUICrucible.java @@ -0,0 +1,46 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerCrucible; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityCrucible; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUICrucible extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_crucible.png"); + private TileEntityCrucible crucible; + + public GUICrucible(InventoryPlayer invPlayer, TileEntityCrucible tedf) { + super(new ContainerCrucible(invPlayer, tedf)); + crucible = tedf; + + this.xSize = 176; + this.ySize = 214; + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.crucible.hasCustomInventoryName() ? this.crucible.getInventoryName() : I18n.format(this.crucible.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 0xffffff); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + } +} diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 065c7da19..d89b7e858 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -1,5 +1,17 @@ package com.hbm.inventory.material; +/* with every new rewrite, optimization and improvement, the code becomes more gregian */ public class Mats { + public static NTMMaterial + + IRON = make("Iron"), + GOLD = make("Gold"), + STEEL = make("Steel"), + TUNGSTEN = make("Tungsten"), + COPPER = make("Copper"); + + public static NTMMaterial make(String... names) { + return new NTMMaterial(names); + } } diff --git a/src/main/java/com/hbm/inventory/material/NTMMaterial.java b/src/main/java/com/hbm/inventory/material/NTMMaterial.java index 38bf7fec2..d013df374 100644 --- a/src/main/java/com/hbm/inventory/material/NTMMaterial.java +++ b/src/main/java/com/hbm/inventory/material/NTMMaterial.java @@ -10,24 +10,41 @@ public class NTMMaterial { public String[] names; public MaterialShapes[] shapes = new MaterialShapes[0]; public boolean omitItemGen = false; - public boolean smeltable = false; + public SmeltingBehavior smeltable = SmeltingBehavior.NOT_SMELTABLE; + public int moltenColor = 0xFF4A00; public NTMMaterial(String... names) { this.names = names; } + /** Shapes for autogen */ public NTMMaterial setShapes(MaterialShapes... shapes) { this.shapes = shapes; return this; } - public NTMMaterial omit() { + /** Turn off autogen for this material, use this for vanilla stuff */ + public NTMMaterial omitAutoGen() { this.omitItemGen = true; return this; } - public NTMMaterial smeltable() { - this.smeltable = true; + /** Defines smelting behavior */ + public NTMMaterial smeltable(SmeltingBehavior behavior) { + this.smeltable = behavior; return this; } + + public NTMMaterial setMoltenColor(int color) { + this.moltenColor = color; + return this; + } + + public static enum SmeltingBehavior { + NOT_SMELTABLE, //anything that can't be smelted or otherwise doesn't belong in a smelter, like diamond + VAPORIZES, //can't be smelted because the material would skadoodle + BREAKS, //can't be smelted because the material doesn't survive the temperatures + SMELTABLE, //metal, mostly + ADDITIVE //stuff like coal which isn't smeltable but can be put in a crucible anyway + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 50514d291..8f366ba37 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -1,16 +1,27 @@ package com.hbm.tileentity.machine; +import com.hbm.inventory.container.ContainerCrucible; +import com.hbm.inventory.gui.GUICrucible; +import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -public class TileEntityCrucible extends TileEntityMachineBase { +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class TileEntityCrucible extends TileEntityMachineBase implements IGUIProvider { public TileEntityCrucible() { - super(1); + super(10); } @Override public String getName() { - return null; + return "container.machineCrucible"; } @Override @@ -18,4 +29,39 @@ public class TileEntityCrucible extends TileEntityMachineBase { } + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerCrucible(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUICrucible(player.inventory, this); + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 2, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } } diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible.png deleted file mode 100644 index fc2435ad62a362456de0aad0607a01f667c08238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7412 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 F{~wZYBo_bx diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa4a1287aa77690941a067fe3f0f60ddf72cf64 GIT binary patch literal 7853 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_base.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_base.png similarity index 100% rename from src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_base.png rename to src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_base.png diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_brighten_21.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_brighten_21.png similarity index 100% rename from src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_brighten_21.png rename to src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_brighten_21.png diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_multiply_100.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_multiply_100.png similarity index 100% rename from src/main/resources/assets/hbm/textures/gui/machine/gui_crucible_multiply_100.png rename to src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_multiply_100.png diff --git a/src/main/resources/assets/hbm/textures/items/crucible_template.png b/src/main/resources/assets/hbm/textures/items/crucible_template.png new file mode 100644 index 0000000000000000000000000000000000000000..959edefae489c46405e021fdd7d2dcf03409ca92 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf)Z4KKDmG!9;o}?#K{1a4SOg^u%H8}wYPQ0)?QjnHs(59%f zBWIPrbH?h;R;w@iBo(wo?JfOo^BEc#D3}~N@XW45I{_$D@oysI zQSKLdEBrSnJA6|+V{Nhbg2ihAH;Dx12r%motHJsMPcGh6aaT5S=)W|Pi-AwaS$pR3 S$q#^TW$<+Mb6Mw<&;$U}#8|li literal 0 HcmV?d00001 From c0cb5b3ebc267506fe2b65b0d29e29bef9a8075a Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 13 Sep 2022 16:59:48 +0200 Subject: [PATCH 062/111] material def using DictFrames --- .../com/hbm/inventory/OreDictManager.java | 2 +- .../inventory/material/MaterialShapes.java | 6 +++ .../java/com/hbm/inventory/material/Mats.java | 42 ++++++++++++++----- .../hbm/inventory/material/NTMMaterial.java | 10 +++-- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 67858355b..906e35be7 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -526,7 +526,7 @@ public class OreDictManager { } public static class DictFrame { - String[] mats; + public String[] mats; float hazMult = 1.0F; List hazards = new ArrayList(); diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java index d22cc8c70..7de3a9e84 100644 --- a/src/main/java/com/hbm/inventory/material/MaterialShapes.java +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -4,7 +4,9 @@ public enum MaterialShapes { QUANTUM(1), // 1/72 of an ingot, allows the ingot to be divisible through 2, 4, 6, 8, 9, 12, 24 and 36 NUGGET(8, "nugget"), + DUSTTINY(NUGGET.quantity, "dustTiny"), WIRE(9), + BILLET(NUGGET.quantity * 6, "billet"), INGOT(NUGGET.quantity * 9, "ingot"), DUST(INGOT.quantity, "dust"), PLATE(INGOT.quantity, "plate"), @@ -16,5 +18,9 @@ public enum MaterialShapes { private MaterialShapes(int quantity, String... prefixes) { this.quantity = quantity; this.prefixes = prefixes; + + for(String prefix : prefixes) { + Mats.prefixByName.put(prefix, this); + } } } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index d89b7e858..80998bc6b 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -1,17 +1,39 @@ package com.hbm.inventory.material; -/* with every new rewrite, optimization and improvement, the code becomes more gregian */ -public class Mats { +import static com.hbm.inventory.material.MaterialShapes.*; +import java.util.HashMap; + +import com.hbm.inventory.OreDictManager; +import com.hbm.inventory.OreDictManager.DictFrame; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; + +/* with every new rewrite, optimization and improvement, the code becomes more gregian */ +/** + * Defines materials that wrap around DictFrames to more accurately describe that material. + * Direct uses are the crucible and possibly item auto-gen, depending on what traits are set. + * @author hbm + */ +public class Mats { + + public static HashMap prefixByName = new HashMap(); + public static HashMap matByName = new HashMap(); + public static NTMMaterial + IRON = makeSmeltable(OreDictManager.IRON, 0).omitAutoGen(), + GOLD = makeSmeltable(OreDictManager.GOLD, 0).omitAutoGen(), + STEEL = makeSmeltable(OreDictManager.STEEL, 0).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK), + TUNGSTEN = makeSmeltable(OreDictManager.W, 0).setShapes(WIRE, INGOT, DUST, BLOCK), + COPPER = makeSmeltable(OreDictManager.CU, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), + ALUMINIUM = makeSmeltable(OreDictManager.AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), + MINGRADE = makeSmeltable(OreDictManager.MINGRADE, 0).setShapes(WIRE, INGOT, DUST, BLOCK), + ALLOY = makeSmeltable(OreDictManager.ALLOY, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + + public static NTMMaterial make(DictFrame dict) { + return new NTMMaterial(dict); + } - IRON = make("Iron"), - GOLD = make("Gold"), - STEEL = make("Steel"), - TUNGSTEN = make("Tungsten"), - COPPER = make("Copper"); - - public static NTMMaterial make(String... names) { - return new NTMMaterial(names); + public static NTMMaterial makeSmeltable(DictFrame dict, int color) { + return new NTMMaterial(dict).smeltable(SmeltingBehavior.SMELTABLE).setMoltenColor(color); } } diff --git a/src/main/java/com/hbm/inventory/material/NTMMaterial.java b/src/main/java/com/hbm/inventory/material/NTMMaterial.java index d013df374..5d1a01636 100644 --- a/src/main/java/com/hbm/inventory/material/NTMMaterial.java +++ b/src/main/java/com/hbm/inventory/material/NTMMaterial.java @@ -1,5 +1,7 @@ package com.hbm.inventory.material; +import com.hbm.inventory.OreDictManager.DictFrame; + /** * Encapsulates most materials that are currently listed as DictFrames, even vanilla ones. * @author hbm @@ -7,14 +9,16 @@ package com.hbm.inventory.material; */ public class NTMMaterial { - public String[] names; public MaterialShapes[] shapes = new MaterialShapes[0]; public boolean omitItemGen = false; public SmeltingBehavior smeltable = SmeltingBehavior.NOT_SMELTABLE; public int moltenColor = 0xFF4A00; - public NTMMaterial(String... names) { - this.names = names; + public NTMMaterial(DictFrame dict) { + + for(String name : dict.mats) { + Mats.matByName.put(name, this); + } } /** Shapes for autogen */ From b0647c39501044183d14fa1f8fe002985feb4ae4 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 13 Sep 2022 22:40:39 +0200 Subject: [PATCH 063/111] more material shenanigans --- .../com/hbm/inventory/OreDictManager.java | 21 +--- src/main/java/com/hbm/inventory/OreNames.java | 21 ++++ .../inventory/material/MatDistribution.java | 65 +++++++++++ .../inventory/material/MaterialShapes.java | 9 ++ .../java/com/hbm/inventory/material/Mats.java | 103 ++++++++++++++++-- .../hbm/inventory/material/NTMMaterial.java | 3 + .../com/hbm/main/ModEventHandlerClient.java | 10 ++ .../machine/TileEntityCrucible.java | 33 ++++++ 8 files changed, 238 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/OreNames.java create mode 100644 src/main/java/com/hbm/inventory/material/MatDistribution.java diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 906e35be7..8d5cb58c3 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -9,6 +9,7 @@ import java.util.List; import static com.hbm.items.ModItems.*; import static com.hbm.blocks.ModBlocks.*; import static com.hbm.inventory.OreDictManager.DictFrame.*; +import static com.hbm.inventory.OreNames.*; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.BlockEnums.EnumStoneType; @@ -17,6 +18,7 @@ import com.hbm.hazard.HazardData; import com.hbm.hazard.HazardEntry; import com.hbm.hazard.HazardRegistry; import com.hbm.hazard.HazardSystem; +import com.hbm.inventory.material.MatDistribution; import com.hbm.items.ItemEnums.EnumCokeType; import com.hbm.items.ItemEnums.EnumTarType; import com.hbm.main.MainRegistry; @@ -82,23 +84,6 @@ public class OreDictManager { public static final String KEY_TOOL_CHEMISTRYSET = "ntmchemistryset"; public static final String KEY_CIRCUIT_BISMUTH = "circuitVersatile"; - - /* - * PREFIXES - */ - public static final String ANY = "any"; - public static final String NUGGET = "nugget"; - public static final String TINY = "tiny"; - public static final String INGOT = "ingot"; - public static final String DUSTTINY = "dustTiny"; - public static final String DUST = "dust"; - public static final String GEM = "gem"; - public static final String CRYSTAL = "crystal"; - public static final String PLATE = "plate"; - public static final String BILLET = "billet"; - public static final String BLOCK = "block"; - public static final String ORE = "ore"; - public static final String ORENETHER = "oreNether"; /* * MATERIALS @@ -492,6 +477,8 @@ public class OreDictManager { OreDictionary.registerOre("blockGlassLime", glass_trinitite); OreDictionary.registerOre("blockGlassRed", glass_polonium); OreDictionary.registerOre("blockGlassBlack", glass_ash); + + MatDistribution.register(); //TEMP } public static String getReflector() { diff --git a/src/main/java/com/hbm/inventory/OreNames.java b/src/main/java/com/hbm/inventory/OreNames.java new file mode 100644 index 000000000..ab7653b78 --- /dev/null +++ b/src/main/java/com/hbm/inventory/OreNames.java @@ -0,0 +1,21 @@ +package com.hbm.inventory; + +public class OreNames { + + /* + * PREFIXES + */ + public static final String ANY = "any"; + public static final String NUGGET = "nugget"; + public static final String TINY = "tiny"; + public static final String INGOT = "ingot"; + public static final String DUSTTINY = "dustTiny"; + public static final String DUST = "dust"; + public static final String GEM = "gem"; + public static final String CRYSTAL = "crystal"; + public static final String PLATE = "plate"; + public static final String BILLET = "billet"; + public static final String BLOCK = "block"; + public static final String ORE = "ore"; + public static final String ORENETHER = "oreNether"; +} diff --git a/src/main/java/com/hbm/inventory/material/MatDistribution.java b/src/main/java/com/hbm/inventory/material/MatDistribution.java new file mode 100644 index 000000000..50427522a --- /dev/null +++ b/src/main/java/com/hbm/inventory/material/MatDistribution.java @@ -0,0 +1,65 @@ +package com.hbm.inventory.material; + +import static com.hbm.inventory.material.Mats.*; +import static com.hbm.inventory.material.MaterialShapes.*; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.inventory.OreDictManager; +import com.hbm.inventory.RecipesCommon.ComparableStack; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class MatDistribution { + + public static void register() { + registerEntry(Blocks.rail, MAT_IRON, INGOT.q(6, 16)); + registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6)); + registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6)); + registerEntry(Items.minecart, MAT_IRON, INGOT.q(5)); + + registerOre(OreDictManager.COAL.ore(), MAT_IRON, INGOT.q(4), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.IRON.ore(), MAT_IRON, INGOT.q(3), MAT_TITANIUM, INGOT.q(1), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.GOLD.ore(), MAT_GOLD, INGOT.q(3), MAT_LEAD, INGOT.q(1), MAT_STONE, QUART.q(1)); + } + + public static void registerEntry(Object key, Object... matDef) { + ComparableStack comp = null; + + if(key instanceof Item) comp = new ComparableStack((Item) key); + if(key instanceof Block) comp = new ComparableStack((Block) key); + if(key instanceof ItemStack) comp = new ComparableStack((ItemStack) key); + + if(comp == null) return; + if(matDef.length % 2 == 1) return; + + List stacks = new ArrayList(); + + for(int i = 0; i < matDef.length; i += 2) { + stacks.add(new MaterialStack((NTMMaterial) matDef[i], (int) matDef[i + 1])); + } + + if(stacks.isEmpty()) return; + + materialEntries.put(comp, stacks); + } + + public static void registerOre(String key, Object... matDef) { + if(matDef.length % 2 == 1) return; + + List stacks = new ArrayList(); + + for(int i = 0; i < matDef.length; i += 2) { + stacks.add(new MaterialStack((NTMMaterial) matDef[i], (int) matDef[i + 1])); + } + + if(stacks.isEmpty()) return; + + materialOreEntries.put(key, stacks); + } +} diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java index 7de3a9e84..56b3cbd99 100644 --- a/src/main/java/com/hbm/inventory/material/MaterialShapes.java +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -10,6 +10,7 @@ public enum MaterialShapes { INGOT(NUGGET.quantity * 9, "ingot"), DUST(INGOT.quantity, "dust"), PLATE(INGOT.quantity, "plate"), + QUART(162), BLOCK(INGOT.quantity * 9, "block"); int quantity; @@ -23,4 +24,12 @@ public enum MaterialShapes { Mats.prefixByName.put(prefix, this); } } + + public int q(int amount) { + return this.quantity * amount; + } + + public int q(int unitsUsed, int itemsProduced) { //eg rails: INOGT.q(6, 16) since the recipe uses 6 ton ingots producing 16 individual rail blocks + return this.quantity * unitsUsed / itemsProduced; + } } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 80998bc6b..75e2f46b7 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -1,12 +1,19 @@ package com.hbm.inventory.material; +import static com.hbm.inventory.OreDictManager.*; import static com.hbm.inventory.material.MaterialShapes.*; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; -import com.hbm.inventory.OreDictManager; import com.hbm.inventory.OreDictManager.DictFrame; +import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; +import com.hbm.util.ItemStackUtil; + +import net.minecraft.item.ItemStack; /* with every new rewrite, optimization and improvement, the code becomes more gregian */ /** @@ -18,16 +25,22 @@ public class Mats { public static HashMap prefixByName = new HashMap(); public static HashMap matByName = new HashMap(); + public static HashMap> materialEntries = new HashMap(); + public static HashMap> materialOreEntries = new HashMap(); - public static NTMMaterial - IRON = makeSmeltable(OreDictManager.IRON, 0).omitAutoGen(), - GOLD = makeSmeltable(OreDictManager.GOLD, 0).omitAutoGen(), - STEEL = makeSmeltable(OreDictManager.STEEL, 0).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK), - TUNGSTEN = makeSmeltable(OreDictManager.W, 0).setShapes(WIRE, INGOT, DUST, BLOCK), - COPPER = makeSmeltable(OreDictManager.CU, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), - ALUMINIUM = makeSmeltable(OreDictManager.AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), - MINGRADE = makeSmeltable(OreDictManager.MINGRADE, 0).setShapes(WIRE, INGOT, DUST, BLOCK), - ALLOY = makeSmeltable(OreDictManager.ALLOY, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial + MAT_STONE = makeSmeltable(new DictFrame("Stone"), 0), + MAT_COAL = make(COAL).smeltable(SmeltingBehavior.ADDITIVE), + MAT_IRON = makeSmeltable(IRON, 0).omitAutoGen(), + MAT_GOLD = makeSmeltable(GOLD, 0).omitAutoGen(), + MAT_STEEL = makeSmeltable(STEEL, 0).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK), + MAT_TUNGSTEN = makeSmeltable(W, 0).setShapes(WIRE, INGOT, DUST, BLOCK), + MAT_COPPER = makeSmeltable(CU, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), + MAT_ALUMINIUM = makeSmeltable(AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), + MAT_MINGRADE = makeSmeltable(MINGRADE, 0).setShapes(WIRE, INGOT, DUST, BLOCK), + MAT_ALLOY = makeSmeltable(ALLOY, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), + MAT_TITANIUM = makeSmeltable(TI, 0).setShapes(INGOT, DUST, PLATE, BLOCK), + MAT_LEAD = makeSmeltable(PB, 0).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); public static NTMMaterial make(DictFrame dict) { return new NTMMaterial(dict); @@ -36,4 +49,74 @@ public class Mats { public static NTMMaterial makeSmeltable(DictFrame dict, int color) { return new NTMMaterial(dict).smeltable(SmeltingBehavior.SMELTABLE).setMoltenColor(color); } + + public static List getMaterialsFromItem(ItemStack stack) { + List list = new ArrayList(); + List names = ItemStackUtil.getOreDictNames(stack); + + if(!names.isEmpty()) { + outer: + for(String name : names) { + + List oreEntries = materialOreEntries.get(name); + + if(oreEntries != null) { + list.addAll(oreEntries); + break outer; + } + + for(Entry prefixEntry : prefixByName.entrySet()) { + String prefix = prefixEntry.getKey(); + + if(name.startsWith(prefix)) { + String materialName = name.substring(prefix.length()); + NTMMaterial material = matByName.get(materialName); + + if(material != null) { + list.add(new MaterialStack(material, prefixEntry.getValue().quantity)); + break outer; + } + } + } + } + } + + List entries = materialEntries.get(new ComparableStack(stack)); + + if(entries != null) { + list.addAll(entries); + } + + return list; + } + + public static class MaterialStack { + //final fields to prevent accidental changing + public final NTMMaterial material; + public final int amount; + + public MaterialStack(NTMMaterial material, int amount) { + this.material = material; + this.amount = amount; + } + } + + public static String formatAmount(int amount) { + String format = ""; + + int blocks = amount / BLOCK.quantity; + amount -= BLOCK.q(blocks); + int ingots = amount / INGOT.quantity; + amount -= INGOT.q(ingots); + int nuggets = amount / NUGGET.quantity; + amount -= NUGGET.q(nuggets); + int quanta = amount; + + if(blocks > 0) format += blocks + " Blocks "; + if(ingots > 0) format += ingots + " Ingots "; + if(nuggets > 0) format += nuggets + " Nuggets "; + if(quanta > 0) format += quanta + " Quanta "; + + return format.trim(); + } } diff --git a/src/main/java/com/hbm/inventory/material/NTMMaterial.java b/src/main/java/com/hbm/inventory/material/NTMMaterial.java index 5d1a01636..7a7c5d2c1 100644 --- a/src/main/java/com/hbm/inventory/material/NTMMaterial.java +++ b/src/main/java/com/hbm/inventory/material/NTMMaterial.java @@ -9,6 +9,7 @@ import com.hbm.inventory.OreDictManager.DictFrame; */ public class NTMMaterial { + public String[] names; public MaterialShapes[] shapes = new MaterialShapes[0]; public boolean omitItemGen = false; public SmeltingBehavior smeltable = SmeltingBehavior.NOT_SMELTABLE; @@ -16,6 +17,8 @@ public class NTMMaterial { public NTMMaterial(DictFrame dict) { + this.names = dict.mats; + for(String name : dict.mats) { Mats.matByName.put(name, this); } diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index a39a1dc51..faebbcd73 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -25,6 +25,8 @@ import com.hbm.interfaces.IItemHUD; import com.hbm.interfaces.Spaghetti; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.ModItems; import com.hbm.items.armor.ArmorFSB; import com.hbm.items.armor.ArmorFSBPowered; @@ -625,6 +627,14 @@ public class ModEventHandlerClient { if(cannery != null) { list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("cannery.f1")); } + + List materials = Mats.getMaterialsFromItem(new ComparableStack(stack).makeSingular().toStack()); + + if(!materials.isEmpty()) { + for(MaterialStack mat : materials) { + list.add(EnumChatFormatting.DARK_PURPLE + mat.material.names[0] + ": " + Mats.formatAmount(mat.amount * stack.stackSize)); + } + } } private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 8f366ba37..67f969c72 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -5,15 +5,21 @@ import com.hbm.inventory.gui.GUICrucible; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; public class TileEntityCrucible extends TileEntityMachineBase implements IGUIProvider { + + public int heat; + public static final int maxHeat = 100_000; + public static final double diffusion = 0.25D; public TileEntityCrucible() { super(10); @@ -27,6 +33,33 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro @Override public void updateEntity() { + if(!worldObj.isRemote) { + tryPullHeat(); + } + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + int diff = source.getHeatStored() - this.heat; + + if(diff == 0) { + return; + } + + if(diff > 0) { + diff = (int) Math.ceil(diff * diffusion); + source.useUpHeat(diff); + this.heat += diff; + if(this.heat > this.maxHeat) + this.heat = this.maxHeat; + return; + } + } + + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); } @Override From 48fc913ac296fc49f0522dc26a873e9982444dcc Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 14 Sep 2022 17:00:10 +0200 Subject: [PATCH 064/111] more material stuff, artillery turret basecode for greg & HIM --- .../java/com/hbm/crafting/MineralRecipes.java | 26 ++++---- .../inventory/material/MatDistribution.java | 4 +- .../inventory/material/MaterialShapes.java | 2 +- .../java/com/hbm/inventory/material/Mats.java | 60 +++++++++++++------ .../turret/TileEntityTurretArty.java | 38 +----------- .../turret/TileEntityTurretBaseArtillery.java | 43 +++++++++++++ .../turret/TileEntityTurretHIMARS.java | 9 ++- 7 files changed, 112 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java diff --git a/src/main/java/com/hbm/crafting/MineralRecipes.java b/src/main/java/com/hbm/crafting/MineralRecipes.java index 752b13e54..08bf58939 100644 --- a/src/main/java/com/hbm/crafting/MineralRecipes.java +++ b/src/main/java/com/hbm/crafting/MineralRecipes.java @@ -95,17 +95,17 @@ public class MineralRecipes { addBillet(ModItems.billet_cobalt, ModItems.ingot_cobalt, ModItems.nugget_cobalt); addBillet(ModItems.billet_co60, ModItems.ingot_co60, ModItems.nugget_co60); - addBillet(ModItems.billet_sr90, ModItems.ingot_sr90, ModItems.nugget_sr90, "nuggetStrontium90", "tinySr90"); - addBillet(ModItems.billet_uranium, ModItems.ingot_uranium, ModItems.nugget_uranium, "nuggetUranium"); - addBillet(ModItems.billet_u233, ModItems.ingot_u233, ModItems.nugget_u233, "nuggetUranium233", "tinyU233"); - addBillet(ModItems.billet_u235, ModItems.ingot_u235, ModItems.nugget_u235, "nuggetUranium235", "tinyU235"); - addBillet(ModItems.billet_u238, ModItems.ingot_u238, ModItems.nugget_u238, "nuggetUranium238", "tinyU238"); - addBillet(ModItems.billet_th232, ModItems.ingot_th232, ModItems.nugget_th232, "nuggetThorium232", "tinyTh232"); - addBillet(ModItems.billet_plutonium, ModItems.ingot_plutonium, ModItems.nugget_plutonium, "nuggetPlutonium"); - addBillet(ModItems.billet_pu238, ModItems.ingot_pu238, ModItems.nugget_pu238, "nuggetPlutonium238", "tinyPu238"); - addBillet(ModItems.billet_pu239, ModItems.ingot_pu239, ModItems.nugget_pu239, "nuggetPlutonium239", "tinyPu239"); - addBillet(ModItems.billet_pu240, ModItems.ingot_pu240, ModItems.nugget_pu240, "nuggetPlutonium240", "tinyPu240"); - addBillet(ModItems.billet_pu241, ModItems.ingot_pu241, ModItems.nugget_pu241, "nuggetPlutonium241", "tinyPu241"); + addBillet(ModItems.billet_sr90, ModItems.ingot_sr90, ModItems.nugget_sr90, SR90.allNuggets()); + addBillet(ModItems.billet_uranium, ModItems.ingot_uranium, ModItems.nugget_uranium, U.allNuggets()); + addBillet(ModItems.billet_u233, ModItems.ingot_u233, ModItems.nugget_u233, U233.allNuggets()); + addBillet(ModItems.billet_u235, ModItems.ingot_u235, ModItems.nugget_u235, U235.allNuggets()); + addBillet(ModItems.billet_u238, ModItems.ingot_u238, ModItems.nugget_u238, U238.allNuggets()); + addBillet(ModItems.billet_th232, ModItems.ingot_th232, ModItems.nugget_th232, TH232.allNuggets()); + addBillet(ModItems.billet_plutonium, ModItems.ingot_plutonium, ModItems.nugget_plutonium, PU.allNuggets()); + addBillet(ModItems.billet_pu238, ModItems.ingot_pu238, ModItems.nugget_pu238, PU238.allNuggets()); + addBillet(ModItems.billet_pu239, ModItems.ingot_pu239, ModItems.nugget_pu239, PU239.allNuggets()); + addBillet(ModItems.billet_pu240, ModItems.ingot_pu240, ModItems.nugget_pu240, PU240.allNuggets()); + addBillet(ModItems.billet_pu241, ModItems.ingot_pu241, ModItems.nugget_pu241, PU241.allNuggets()); addBillet(ModItems.billet_pu_mix, ModItems.ingot_pu_mix, ModItems.nugget_pu_mix); addBillet(ModItems.billet_am241, ModItems.ingot_am241, ModItems.nugget_am241, AM241.allNuggets()); addBillet(ModItems.billet_am242, ModItems.ingot_am242, ModItems.nugget_am242, AM242.allNuggets()); @@ -115,8 +115,8 @@ public class MineralRecipes { addBillet(ModItems.billet_technetium, ModItems.ingot_technetium, ModItems.nugget_technetium, TC99.allNuggets()); addBillet(ModItems.billet_au198, ModItems.ingot_au198, ModItems.nugget_au198, AU198.allNuggets()); addBillet(ModItems.billet_pb209, ModItems.ingot_pb209, ModItems.nugget_pb209, PB209.allNuggets()); //and so forth - addBillet(ModItems.billet_ra226, ModItems.ingot_ra226, ModItems.nugget_ra226, "nuggetRa226"); - addBillet(ModItems.billet_actinium, ModItems.ingot_actinium, ModItems.nugget_actinium, "nuggetActinium227", "tinyAc227"); + addBillet(ModItems.billet_ra226, ModItems.ingot_ra226, ModItems.nugget_ra226, RA226.allNuggets()); + addBillet(ModItems.billet_actinium, ModItems.ingot_actinium, ModItems.nugget_actinium, AC227.allNuggets()); addBillet(ModItems.billet_schrabidium, ModItems.ingot_schrabidium, ModItems.nugget_schrabidium, "nuggetSchrabidium"); addBillet(ModItems.billet_solinium, ModItems.ingot_solinium, ModItems.nugget_solinium, "nuggetSolinium"); addBillet(ModItems.billet_gh336, ModItems.ingot_gh336, ModItems.nugget_gh336, GH336.allNuggets()); diff --git a/src/main/java/com/hbm/inventory/material/MatDistribution.java b/src/main/java/com/hbm/inventory/material/MatDistribution.java index 50427522a..58c00b1dd 100644 --- a/src/main/java/com/hbm/inventory/material/MatDistribution.java +++ b/src/main/java/com/hbm/inventory/material/MatDistribution.java @@ -19,8 +19,8 @@ public class MatDistribution { public static void register() { registerEntry(Blocks.rail, MAT_IRON, INGOT.q(6, 16)); - registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6)); - registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6)); + registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6), MAT_REDSTONE, DUST.q(1)); + registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6), MAT_REDSTONE, DUST.q(1)); registerEntry(Items.minecart, MAT_IRON, INGOT.q(5)); registerOre(OreDictManager.COAL.ore(), MAT_IRON, INGOT.q(4), MAT_STONE, QUART.q(1)); diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java index 56b3cbd99..4dcc41a1e 100644 --- a/src/main/java/com/hbm/inventory/material/MaterialShapes.java +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -13,7 +13,7 @@ public enum MaterialShapes { QUART(162), BLOCK(INGOT.quantity * 9, "block"); - int quantity; + private int quantity; String[] prefixes; private MaterialShapes(int quantity, String... prefixes) { diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 75e2f46b7..af6bf1b4f 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -16,6 +16,7 @@ import com.hbm.util.ItemStackUtil; import net.minecraft.item.ItemStack; /* with every new rewrite, optimization and improvement, the code becomes more gregian */ + /** * Defines materials that wrap around DictFrames to more accurately describe that material. * Direct uses are the crucible and possibly item auto-gen, depending on what traits are set. @@ -28,19 +29,40 @@ public class Mats { public static HashMap> materialEntries = new HashMap(); public static HashMap> materialOreEntries = new HashMap(); - public static final NTMMaterial - MAT_STONE = makeSmeltable(new DictFrame("Stone"), 0), - MAT_COAL = make(COAL).smeltable(SmeltingBehavior.ADDITIVE), - MAT_IRON = makeSmeltable(IRON, 0).omitAutoGen(), - MAT_GOLD = makeSmeltable(GOLD, 0).omitAutoGen(), - MAT_STEEL = makeSmeltable(STEEL, 0).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK), - MAT_TUNGSTEN = makeSmeltable(W, 0).setShapes(WIRE, INGOT, DUST, BLOCK), - MAT_COPPER = makeSmeltable(CU, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), - MAT_ALUMINIUM = makeSmeltable(AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), - MAT_MINGRADE = makeSmeltable(MINGRADE, 0).setShapes(WIRE, INGOT, DUST, BLOCK), - MAT_ALLOY = makeSmeltable(ALLOY, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK), - MAT_TITANIUM = makeSmeltable(TI, 0).setShapes(INGOT, DUST, PLATE, BLOCK), - MAT_LEAD = makeSmeltable(PB, 0).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); + //Vanilla + public static final NTMMaterial MAT_STONE = makeSmeltable(df("Stone"), 0); + public static final NTMMaterial MAT_COAL = make(COAL).smeltable(SmeltingBehavior.ADDITIVE); + public static final NTMMaterial MAT_IRON = makeSmeltable(IRON, 0).omitAutoGen(); + public static final NTMMaterial MAT_GOLD = makeSmeltable(GOLD, 0).omitAutoGen(); + public static final NTMMaterial MAT_REDSTONE = makeSmeltable(REDSTONE, 0).omitAutoGen(); + + //Radioactive + public static final NTMMaterial MAT_URANIUM = makeSmeltable(U, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_THORIUM = makeSmeltable(TH232, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(PU, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_RADIUM = makeSmeltable(RA226, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + + //Base metals + public static final NTMMaterial MAT_TITANIUM = makeSmeltable(TI, 0).setShapes(INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_COPPER = makeSmeltable(CU, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(W, 0).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_LEAD = makeSmeltable(PB, 0).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_BISMUTH = makeSmeltable(df("Bismuth"), 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ARSENIC = makeSmeltable(AS, 0).setShapes(NUGGET, INGOT); + public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(TA, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(NB, 0).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(BE, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_COBALT = makeSmeltable(CO, 0).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BORON = makeSmeltable(B, 0).setShapes(DUSTTINY, INGOT, DUST, BLOCK); + + //Alloys + public static final NTMMaterial MAT_STEEL = makeSmeltable(STEEL, 0).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_MINGRADE = makeSmeltable(MINGRADE, 0).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALLOY = makeSmeltable(ALLOY, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_TCALLOY = makeSmeltable(TCALLOY, 0).setShapes(INGOT, DUST); + public static final NTMMaterial MAT_DURA = makeSmeltable(DURA, 0).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(MAGTUNG, 0).setShapes(INGOT, DUST, BLOCK); public static NTMMaterial make(DictFrame dict) { return new NTMMaterial(dict); @@ -50,6 +72,10 @@ public class Mats { return new NTMMaterial(dict).smeltable(SmeltingBehavior.SMELTABLE).setMoltenColor(color); } + public static DictFrame df(String string) { + return new DictFrame(string); + } + public static List getMaterialsFromItem(ItemStack stack) { List list = new ArrayList(); List names = ItemStackUtil.getOreDictNames(stack); @@ -73,7 +99,7 @@ public class Mats { NTMMaterial material = matByName.get(materialName); if(material != null) { - list.add(new MaterialStack(material, prefixEntry.getValue().quantity)); + list.add(new MaterialStack(material, prefixEntry.getValue().q(1))); break outer; } } @@ -104,11 +130,11 @@ public class Mats { public static String formatAmount(int amount) { String format = ""; - int blocks = amount / BLOCK.quantity; + int blocks = amount / BLOCK.q(1); amount -= BLOCK.q(blocks); - int ingots = amount / INGOT.quantity; + int ingots = amount / INGOT.q(1); amount -= INGOT.q(ingots); - int nuggets = amount / NUGGET.quantity; + int nuggets = amount / NUGGET.q(1); amount -= NUGGET.q(nuggets); int quanta = amount; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index 978394914..cfc551c83 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -18,7 +18,6 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.Item; @@ -28,7 +27,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUIProvider { +public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implements IGUIProvider { public short mode = 0; public static final short MODE_ARTILLERY = 0; @@ -39,8 +38,6 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI public double barrelPos = 0; public double lastBarrelPos = 0; - private List targetQueue = new ArrayList(); - @Override @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { @@ -57,15 +54,6 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI return ammoStacks; } - public void enqueueTarget(double x, double y, double z) { - - Vec3 pos = this.getTurretPos(); - Vec3 delta = Vec3.createVectorHelper(x - pos.xCoord, y - pos.yCoord, z - pos.zCoord); - if(delta.lengthVector() <= this.getDecetorRange()) { - this.targetQueue.add(Vec3.createVectorHelper(x, y, z)); - } - } - @Override protected List getAmmoList() { return new ArrayList(); @@ -132,28 +120,8 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI } @Override - protected void seekNewTarget() { - super.seekNewTarget(); - } - - @Override - public boolean entityInLOS(Entity e) { - - if(this.mode == this.MODE_CANNON) { - return super.entityInLOS(e); - } else { - - Vec3 pos = this.getTurretPos(); - Vec3 ent = this.getEntityPos(e); - Vec3 delta = Vec3.createVectorHelper(ent.xCoord - pos.xCoord, ent.yCoord - pos.yCoord, ent.zCoord - pos.zCoord); - double length = delta.lengthVector(); - - if(length < this.getDecetorGrace() || length > this.getDecetorRange() * 1.1) //the latter statement is only relevant for entities that have already been detected - return false; - - int height = worldObj.getHeightValue((int) Math.floor(e.posX), (int) Math.floor(e.posZ)); - return height < (e.posY + e.height); - } + public boolean doLOSCheck() { + return this.mode == this.MODE_CANNON; } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java new file mode 100644 index 000000000..35d211872 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java @@ -0,0 +1,43 @@ +package com.hbm.tileentity.turret; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.util.Vec3; + +public abstract class TileEntityTurretBaseArtillery extends TileEntityTurretBaseNT { + + protected List targetQueue = new ArrayList(); + + public void enqueueTarget(double x, double y, double z) { + + Vec3 pos = this.getTurretPos(); + Vec3 delta = Vec3.createVectorHelper(x - pos.xCoord, y - pos.yCoord, z - pos.zCoord); + if(delta.lengthVector() <= this.getDecetorRange()) { + this.targetQueue.add(Vec3.createVectorHelper(x, y, z)); + } + } + + public abstract boolean doLOSCheck(); + + @Override + public boolean entityInLOS(Entity e) { + + if(doLOSCheck()) { + return super.entityInLOS(e); + + } else { + Vec3 pos = this.getTurretPos(); + Vec3 ent = this.getEntityPos(e); + Vec3 delta = Vec3.createVectorHelper(ent.xCoord - pos.xCoord, ent.yCoord - pos.yCoord, ent.zCoord - pos.zCoord); + double length = delta.lengthVector(); + + if(length < this.getDecetorGrace() || length > this.getDecetorRange() * 1.1) //the latter statement is only relevant for entities that have already been detected + return false; + + int height = worldObj.getHeightValue((int) Math.floor(e.posX), (int) Math.floor(e.posZ)); + return height < (e.posY + e.height); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index 1c9a61779..98e3b661a 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -17,8 +17,8 @@ import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class TileEntityTurretHIMARS extends TileEntityTurretBaseNT implements IGUIProvider { - +public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implements IGUIProvider { + @Override @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { @@ -50,6 +50,11 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseNT implements IG return 1_000_000; } + @Override + public boolean doLOSCheck() { + return false; + } + @Override public void updateFiringTick() { From 896b91d9608ba9cce0db7d4122fc49c6736c7206 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 15 Sep 2022 14:09:47 +0200 Subject: [PATCH 065/111] structure analysis wands --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + src/main/java/com/hbm/items/ModItems.java | 11 ++ .../hbm/items/tool/ItemStructurePattern.java | 56 +++++++++ .../hbm/items/tool/ItemStructureSingle.java | 37 ++++++ .../hbm/items/tool/ItemStructureSolid.java | 45 +++++++ .../com/hbm/items/tool/ItemStructureTool.java | 116 ++++++++++++++++++ .../com/hbm/main/ModEventHandlerClient.java | 10 +- .../hbm/textures/blocks/structure_anchor.png | Bin 0 -> 193 bytes .../hbm/textures/items/structure_pattern.png | Bin 0 -> 179 bytes .../hbm/textures/items/structure_single.png | Bin 0 -> 187 bytes .../hbm/textures/items/structure_solid.png | Bin 0 -> 187 bytes 11 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hbm/items/tool/ItemStructurePattern.java create mode 100644 src/main/java/com/hbm/items/tool/ItemStructureSingle.java create mode 100644 src/main/java/com/hbm/items/tool/ItemStructureSolid.java create mode 100644 src/main/java/com/hbm/items/tool/ItemStructureTool.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/structure_anchor.png create mode 100644 src/main/resources/assets/hbm/textures/items/structure_pattern.png create mode 100644 src/main/resources/assets/hbm/textures/items/structure_single.png create mode 100644 src/main/resources/assets/hbm/textures/items/structure_solid.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 0a02fa292..58c2b2422 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -56,6 +56,7 @@ public class ModBlocks { public static Block test_rail; public static Block test_bb_bork; public static Block test_bb_inf; + public static Block structure_anchor; public static Block ore_uranium; public static Block ore_uranium_scorched; @@ -1310,6 +1311,7 @@ public class ModBlocks { test_rail = new TestRail(Material.iron).setBlockName("test_rail").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_rail"); test_bb_bork = new TestBB(Material.iron).setBlockName("test_bb_bork").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_bb_bork"); test_bb_inf = new TestBB(Material.iron).setBlockName("test_bb_inf").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_bb_inf"); + structure_anchor = new BlockGeneric(Material.iron).setBlockName("structure_anchor").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":structure_anchor"); ore_uranium = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_uranium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_uranium"); ore_uranium_scorched = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_uranium_scorched").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_uranium_scorched"); @@ -2383,6 +2385,7 @@ public class ModBlocks { GameRegistry.registerBlock(test_rail, test_rail.getUnlocalizedName()); GameRegistry.registerBlock(test_bb_bork, test_bb_bork.getUnlocalizedName()); GameRegistry.registerBlock(test_bb_inf, test_bb_inf.getUnlocalizedName()); + GameRegistry.registerBlock(structure_anchor, structure_anchor.getUnlocalizedName()); //Ores GameRegistry.registerBlock(ore_uranium, ore_uranium.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index af622b770..0d6b682b9 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2309,6 +2309,10 @@ public class ModItems { public static Item wand_s; public static Item wand_d; + public static Item structure_single; + public static Item structure_solid; + public static Item structure_pattern; + public static Item rod_of_discord; public static Item cape_test; @@ -4732,6 +4736,10 @@ public class ModItems { wand = new ItemWand().setUnlocalizedName("wand_k").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand"); wand_s = new ItemWandS().setUnlocalizedName("wand_s").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand_s"); wand_d = new ItemWandD().setUnlocalizedName("wand_d").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand_d"); + + structure_single = new ItemStructureSingle().setUnlocalizedName("structure_single").setMaxStackSize(1).setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":structure_single"); + structure_solid = new ItemStructureSolid().setUnlocalizedName("structure_solid").setMaxStackSize(1).setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":structure_solid"); + structure_pattern = new ItemStructurePattern().setUnlocalizedName("structure_pattern").setMaxStackSize(1).setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":structure_pattern"); rod_of_discord = new ItemDiscord().setUnlocalizedName("rod_of_discord").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":rod_of_discord"); @@ -8097,6 +8105,9 @@ public class ModItems { GameRegistry.registerItem(wand, wand.getUnlocalizedName()); GameRegistry.registerItem(wand_s, wand_s.getUnlocalizedName()); GameRegistry.registerItem(wand_d, wand_d.getUnlocalizedName()); + GameRegistry.registerItem(structure_single, structure_single.getUnlocalizedName()); + GameRegistry.registerItem(structure_solid, structure_solid.getUnlocalizedName()); + GameRegistry.registerItem(structure_pattern, structure_pattern.getUnlocalizedName()); GameRegistry.registerItem(rod_of_discord, rod_of_discord.getUnlocalizedName()); //GameRegistry.registerItem(analyzer, analyzer.getUnlocalizedName()); //GameRegistry.registerItem(remote, remote.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/tool/ItemStructurePattern.java b/src/main/java/com/hbm/items/tool/ItemStructurePattern.java new file mode 100644 index 000000000..9fa41ace7 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemStructurePattern.java @@ -0,0 +1,56 @@ +package com.hbm.items.tool; + +import java.util.List; + +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemStructurePattern extends ItemStructureTool { + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + super.addInformation(stack, player, list, ext); + list.add(EnumChatFormatting.YELLOW + "Click to print all "); + list.add(EnumChatFormatting.YELLOW + "lines for the current selection with blocks and metadata."); + } + + @Override + protected boolean dualUse() { + return true; + } + + @Override + protected void doTheThing(ItemStack stack, World world, int x, int y, int z) { + + BlockPos pos = this.getAnchor(stack); + if(pos == null) return; + + int savedX = stack.stackTagCompound.getInteger("x"); + int savedY = stack.stackTagCompound.getInteger("y"); + int savedZ = stack.stackTagCompound.getInteger("z"); + + int minX = Math.min(savedX, x) - pos.getX(); + int minY = Math.min(savedY, y) - pos.getY(); + int minZ = Math.min(savedZ, z) - pos.getZ(); + int maxX = Math.max(savedX, x) - pos.getX(); + int maxY = Math.max(savedY, y) - pos.getY(); + int maxZ = Math.max(savedZ, z) - pos.getZ(); + + for(int ix = minX; ix <= maxX; ix++) { + for(int iy = minX; iy <= maxY; iy++) { + for(int iz = minX; iz <= maxZ; iz++) { + + Block b = world.getBlock(ix + pos.getX(), iy + pos.getY(), iz + pos.getZ()); + int meta = world.getBlockMetadata(ix + pos.getX(), iy + pos.getY(), iz + pos.getZ()); + + System.out.println("this.placeBlockAtCurrentPosition(world, " + b.getUnlocalizedName() + ", " + meta + ", " + ix + ", " + iy + ", " + iz + ", box)"); + } + } + } + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemStructureSingle.java b/src/main/java/com/hbm/items/tool/ItemStructureSingle.java new file mode 100644 index 000000000..b35974d32 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemStructureSingle.java @@ -0,0 +1,37 @@ +package com.hbm.items.tool; + +import java.util.List; + +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemStructureSingle extends ItemStructureTool { + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + super.addInformation(stack, player, list, ext); + list.add(EnumChatFormatting.YELLOW + "Click to print exactly one "); + list.add(EnumChatFormatting.YELLOW + "line with the targted block and metadata"); + } + + @Override + protected void doTheThing(ItemStack stack, World world, int x, int y, int z) { + + BlockPos pos = this.getAnchor(stack); + if(pos == null) return; + + int ix = x - pos.getX(); + int iy = y - pos.getX(); + int iz = z - pos.getX(); + + Block b = world.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + + System.out.println("this.placeBlockAtCurrentPosition(world, " + b.getUnlocalizedName() + ", " + meta + ", " + x + ", " + y + ", " + z + ", box)"); + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemStructureSolid.java b/src/main/java/com/hbm/items/tool/ItemStructureSolid.java new file mode 100644 index 000000000..8267f96b8 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemStructureSolid.java @@ -0,0 +1,45 @@ +package com.hbm.items.tool; + +import java.util.List; + +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemStructureSolid extends ItemStructureTool { + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + super.addInformation(stack, player, list, ext); + list.add(EnumChatFormatting.YELLOW + "Click to print a "); + list.add(EnumChatFormatting.YELLOW + "line with wildcard block and metadata."); + } + + @Override + protected boolean dualUse() { + return true; + } + + @Override + protected void doTheThing(ItemStack stack, World world, int x, int y, int z) { + + BlockPos pos = this.getAnchor(stack); + if(pos == null) return; + + int savedX = stack.stackTagCompound.getInteger("x"); + int savedY = stack.stackTagCompound.getInteger("y"); + int savedZ = stack.stackTagCompound.getInteger("z"); + + int minX = Math.min(savedX, x) - pos.getX(); + int minY = Math.min(savedY, y) - pos.getY(); + int minZ = Math.min(savedZ, z) - pos.getZ(); + int maxX = Math.max(savedX, x) - pos.getX(); + int maxY = Math.max(savedY, y) - pos.getY(); + int maxZ = Math.max(savedZ, z) - pos.getZ(); + + System.out.println("this.fillWithMetadataBlocks(world, box, " + minX + ", " + minY + ", " + minZ + ", " + maxX + ", " + maxY + ", " + maxZ + ", , , Blocks.air, 0, false)"); + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemStructureTool.java b/src/main/java/com/hbm/items/tool/ItemStructureTool.java new file mode 100644 index 000000000..c72f6a392 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemStructureTool.java @@ -0,0 +1,116 @@ +package com.hbm.items.tool; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ModBlocks; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public abstract class ItemStructureTool extends Item implements ILookOverlay { + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + BlockPos anchor = this.getAnchor(stack); + + if(anchor == null) { + list.add(EnumChatFormatting.RED + "No anchor set! Right click an anchor to get started."); + } + } + + public static BlockPos getAnchor(ItemStack stack) { + + if(!stack.hasTagCompound()) { + return null; + } + + return new BlockPos(stack.stackTagCompound.getInteger("anchorX"), stack.stackTagCompound.getInteger("anchorY"), stack.stackTagCompound.getInteger("anchorZ")); + } + + public static void setAnchor(ItemStack stack, int x, int y, int z) { + + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setInteger("anchorX", x); + stack.stackTagCompound.setInteger("anchorY", y); + stack.stackTagCompound.setInteger("anchorZ", z); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + + Block b = world.getBlock(x, y, z); + + if(b == ModBlocks.structure_anchor) { + this.setAnchor(stack, x, y, z); + return true; + } + + if(this.getAnchor(stack) == null) { + return false; + } + + if(!this.dualUse()) { + this.doTheThing(stack, world, x, y, z); + } else { + + if(!stack.stackTagCompound.hasKey("x")) { + stack.stackTagCompound.setInteger("x", x); + stack.stackTagCompound.setInteger("y", y); + stack.stackTagCompound.setInteger("z", z); + } else { + this.doTheThing(stack, world, x, y, z); + stack.stackTagCompound.removeTag("x"); + stack.stackTagCompound.removeTag("y"); + stack.stackTagCompound.removeTag("z"); + } + } + + return true; + } + + protected boolean dualUse() { + return false; + } + + protected abstract void doTheThing(ItemStack stack, World world, int x, int y, int z); + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + ItemStack stack = Minecraft.getMinecraft().thePlayer.getHeldItem(); + List text = new ArrayList(); + + BlockPos anchor = getAnchor(stack); + + if(anchor == null) { + text.add(EnumChatFormatting.RED + "No Anchor"); + } else { + + int dX = x - anchor.getX(); + int dY = y - anchor.getY(); + int dZ = z - anchor.getZ(); + text.add(EnumChatFormatting.YELLOW + "Position: " + dX + " / " + dY + " / " + dZ); + + if(this.dualUse() && stack.stackTagCompound.hasKey("x")) { + int sX = Math.abs(x - stack.stackTagCompound.getInteger("x")) + 1; + int sY = Math.abs(y - stack.stackTagCompound.getInteger("y")) + 1; + int sZ = Math.abs(z - stack.stackTagCompound.getInteger("z")) + 1; + text.add(EnumChatFormatting.GOLD + "Selection: " + sX + " / " + sY + " / " + sZ); + } + } + + ILookOverlay.printGeneric(event, this.getItemStackDisplayName(stack), 0xffff00, 0x404000, text); + } +} diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index faebbcd73..b984d3e1e 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -155,8 +155,14 @@ public class ModEventHandlerClient { World world = mc.theWorld; MovingObjectPosition mop = mc.objectMouseOver; - if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK && world.getBlock(mop.blockX, mop.blockY, mop.blockZ) instanceof ILookOverlay) { - ((ILookOverlay) world.getBlock(mop.blockX, mop.blockY, mop.blockZ)).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK ) { + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ILookOverlay) { + ((ILookOverlay) player.getHeldItem().getItem()).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); + + } else if(world.getBlock(mop.blockX, mop.blockY, mop.blockZ) instanceof ILookOverlay) { + ((ILookOverlay) world.getBlock(mop.blockX, mop.blockY, mop.blockZ)).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); + } } /*if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { diff --git a/src/main/resources/assets/hbm/textures/blocks/structure_anchor.png b/src/main/resources/assets/hbm/textures/blocks/structure_anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..b0de5a33b16c704cb3940d5eff622119a383b845 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfU$A8N|nw4C((&V^x=#=3vk3Sp?t_%GbF8s^iyhU1|GbV7d^6Le) zZ}nK;gh()cFtoEwcpcfpIAPoMi|dN{j86CzH=KFrqkaDngUy#0Iu-Ng?vdGWKtS%c o#5>sylR4%wg-PddcHRHUbj3v>U{}o~kQ*30UHx3vIVCg!09-Lg3jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/structure_pattern.png b/src/main/resources/assets/hbm/textures/items/structure_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fad870d3f35eeb3e6dea1b0cc0e90cc2bf6898 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf3}) zq3)Lq!Rxd0Uv}LwZoGNnJ`2yaslQh`iZ5dmj!=1@z)~-qBXO;H@4>>`i&4AYM1p!i$NjVeEGMTM+z)vwFzmR zdl1tYJ1K}Ma>DH+880Rt?3=~Uqhj5$p>)}Fp0xGO>>-I(3z(VT%Wiov!{Onh{u1U( jx!Z+864j*oKC$&rd?qVn{RNaxrWa|U8ox#)9&t;ucLK6UC?nC(i literal 0 HcmV?d00001 From 77c0ae1834e710740e6f4556c21785ff8da45601 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 15 Sep 2022 16:22:02 +0200 Subject: [PATCH 066/111] some minor crystal funnies and rocket artillery code --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../hbm/blocks/machine/MachineTeleanchor.java | 32 +++ .../hbm/blocks/machine/MachineTeleporter.java | 5 +- .../com/hbm/blocks/siege/SiegeShield.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 3 + .../com/hbm/items/machine/ItemBattery.java | 6 +- .../com/hbm/items/tool/ItemAnchorRemote.java | 105 ++++++++++ .../java/com/hbm/items/tool/ItemDiscord.java | 34 ++-- .../java/com/hbm/main/CraftingManager.java | 3 + .../turret/TileEntityTurretHIMARS.java | 187 ++++++++++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../hbm/textures/blocks/tele_anchor_side.png | Bin 0 -> 622 bytes .../hbm/textures/blocks/tele_anchor_top.png | Bin 0 -> 771 bytes .../hbm/textures/items/anchor_remote.png | Bin 0 -> 444 bytes 15 files changed, 360 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java create mode 100644 src/main/java/com/hbm/items/tool/ItemAnchorRemote.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/tele_anchor_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/tele_anchor_top.png create mode 100644 src/main/resources/assets/hbm/textures/items/anchor_remote.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 58c2b2422..1b7256727 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -910,6 +910,7 @@ public class ModBlocks { public static Block machine_teleporter; public static final int guiID_machine_teleporter = 36; + public static Block teleanchor; public static Block machine_reix_mainframe; public static final int guiID_machine_reix_mainframe = 38; @@ -1898,6 +1899,7 @@ public class ModBlocks { machine_combine_factory = new MachineCMBFactory(Material.iron).setBlockName("machine_combine_factory").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_teleporter = new MachineTeleporter(Material.iron).setBlockName("machine_teleporter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + teleanchor = new MachineTeleanchor().setBlockName("teleanchor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_rtg_grey = new MachineRTG(Material.iron).setBlockName("machine_rtg_grey").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rtg"); //machine_rtg_red = new MachineRTG(Material.iron).setBlockName("machine_rtg_red").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -3206,6 +3208,7 @@ public class ModBlocks { GameRegistry.registerBlock(machine_schrabidium_transmutator, machine_schrabidium_transmutator.getUnlocalizedName()); GameRegistry.registerBlock(machine_combine_factory, machine_combine_factory.getUnlocalizedName()); GameRegistry.registerBlock(machine_teleporter, machine_teleporter.getUnlocalizedName()); + GameRegistry.registerBlock(teleanchor, teleanchor.getUnlocalizedName()); GameRegistry.registerBlock(machine_satlinker, machine_satlinker.getUnlocalizedName()); GameRegistry.registerBlock(machine_keyforge, machine_keyforge.getUnlocalizedName()); GameRegistry.registerBlock(machine_armor_table, machine_armor_table.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java b/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java new file mode 100644 index 000000000..5b1d5b7db --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java @@ -0,0 +1,32 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.BlockBase; +import com.hbm.lib.RefStrings; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; + +public class MachineTeleanchor extends BlockBase { + + @SideOnly(Side.CLIENT) private IIcon iconTop; + + public MachineTeleanchor() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":teleanchor_top"); + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":teleanchor_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return side == 1 ? this.iconTop : this.blockIcon; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineTeleporter.java b/src/main/java/com/hbm/blocks/machine/MachineTeleporter.java index 645f3fe18..ac7db1bec 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTeleporter.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTeleporter.java @@ -22,9 +22,8 @@ import net.minecraft.world.World; public class MachineTeleporter extends BlockContainer { - @SideOnly(Side.CLIENT) - private IIcon iconTop; - private IIcon iconBottom; + @SideOnly(Side.CLIENT) private IIcon iconTop; + @SideOnly(Side.CLIENT) private IIcon iconBottom; @Override @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/blocks/siege/SiegeShield.java b/src/main/java/com/hbm/blocks/siege/SiegeShield.java index 32bdf2827..3080671bb 100644 --- a/src/main/java/com/hbm/blocks/siege/SiegeShield.java +++ b/src/main/java/com/hbm/blocks/siege/SiegeShield.java @@ -19,7 +19,7 @@ public class SiegeShield extends SiegeBase { @Override public void updateTick(World world, int x, int y, int z, Random rand) { - if(SiegeOrchestrator.siegeMobCount > SiegeOrchestrator.getExpansionThreshold(world) || !SiegeOrchestrator.enableBaseSpawning(world)) + if(SiegeOrchestrator.siegeMobCount > SiegeOrchestrator.getExpansionThreshold(world) || !SiegeOrchestrator.enableBaseSpawning(world) || !SiegeOrchestrator.siegeEnabled(world)) return; int succ = 0; diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 0d6b682b9..728a13cda 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2400,6 +2400,7 @@ public class ModItems { public static Item crate_caller; public static Item bomb_caller; public static Item meteor_remote; + public static Item anchor_remote; public static Item remote; //public static Item turret_control; public static Item turret_chip; @@ -4820,6 +4821,7 @@ public class ModItems { crate_caller = new ItemCrateCaller().setUnlocalizedName("crate_caller").setMaxStackSize(1).setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":crate_caller"); bomb_caller = new ItemBombCaller().setUnlocalizedName("bomb_caller").setMaxStackSize(1).setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":bomb_caller"); meteor_remote = new ItemMeteorRemote().setUnlocalizedName("meteor_remote").setMaxStackSize(1).setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":meteor_remote"); + anchor_remote = new ItemAnchorRemote().setUnlocalizedName("anchor_remote").setMaxStackSize(1).setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":anchor_remote"); spawn_chopper = new ItemChopper().setUnlocalizedName("chopper").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":chopper"); spawn_worm = new ItemChopper().setUnlocalizedName("spawn_worm").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":spawn_worm"); spawn_ufo = new ItemChopper().setUnlocalizedName("spawn_ufo").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":spawn_ufo"); @@ -8013,6 +8015,7 @@ public class ModItems { GameRegistry.registerItem(crate_caller, crate_caller.getUnlocalizedName()); GameRegistry.registerItem(bomb_caller, bomb_caller.getUnlocalizedName()); GameRegistry.registerItem(meteor_remote, meteor_remote.getUnlocalizedName()); + GameRegistry.registerItem(anchor_remote, anchor_remote.getUnlocalizedName()); GameRegistry.registerItem(defuser, defuser.getUnlocalizedName()); GameRegistry.registerItem(reacher, reacher.getUnlocalizedName()); GameRegistry.registerItem(bismuth_tool, bismuth_tool.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemBattery.java b/src/main/java/com/hbm/items/machine/ItemBattery.java index 3f281f9e2..4f0fda9a7 100644 --- a/src/main/java/com/hbm/items/machine/ItemBattery.java +++ b/src/main/java/com/hbm/items/machine/ItemBattery.java @@ -17,9 +17,9 @@ import net.minecraft.nbt.NBTTagCompound; public class ItemBattery extends Item implements IBatteryItem { - private long maxCharge; - private long chargeRate; - private long dischargeRate; + protected long maxCharge; + protected long chargeRate; + protected long dischargeRate; public ItemBattery(long dura, long chargeRate, long dischargeRate) { this.maxCharge = dura; diff --git a/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java b/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java new file mode 100644 index 000000000..9fb384f23 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java @@ -0,0 +1,105 @@ +package com.hbm.items.tool; + +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemBattery; +import com.hbm.util.BobMathUtil; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class ItemAnchorRemote extends ItemBattery { + + public ItemAnchorRemote() { + super(1_000_000, 10_000, 0); + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + + long charge = maxCharge; + + if(itemstack.hasTagCompound()) + charge = getCharge(itemstack); + + if(itemstack.getItem() != ModItems.fusion_core && itemstack.getItem() != ModItems.energy_core) { + list.add("Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); + } else { + String charge1 = BobMathUtil.getShortNumber((charge * 100) / this.maxCharge); + list.add("Charge: " + charge1 + "%"); + list.add("(" + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE)"); + } + + list.add("Charge rate: " + BobMathUtil.getShortNumber(chargeRate) + "HE/t"); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + + if(world.getBlock(x, y, z) == ModBlocks.teleanchor) { + + if(!stack.hasTagCompound()) + stack.stackTagCompound = new NBTTagCompound(); + + stack.stackTagCompound.setInteger("x", x); + stack.stackTagCompound.setInteger("y", y); + stack.stackTagCompound.setInteger("z", z); + + return true; + } + + return false; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + + if(player.isSneaking() || world.isRemote) { + return stack; + } + + if(!stack.hasTagCompound()) { + world.playSoundAtEntity(player, "random.orb", 0.25F, 0.75F); + return stack; + } + + if(this.getCharge(stack) < 10_000) { + world.playSoundAtEntity(player, "random.orb", 0.25F, 0.75F); + return stack; + } + + int x = stack.stackTagCompound.getInteger("x"); + int y = stack.stackTagCompound.getInteger("y"); + int z = stack.stackTagCompound.getInteger("z"); + + world.getChunkProvider().loadChunk(x >> 4, z >> 4); + + if(world.getBlock(x, y, z) == ModBlocks.teleanchor) { + + if(player.isRiding()) { + player.mountEntity(null); + } + + world.newExplosion(player, x + 0.5, y + 1 + player.height / 2, z + 0.5, 2F, false, false); + world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); + player.setPositionAndUpdate(x + 0.5, y + 1, z + 0.5); + //world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); + player.fallDistance = 0.0F; + + for(int i = 0; i < 32; ++i) { + world.spawnParticle("portal", player.posX, player.posY + player.getRNG().nextDouble() * 2.0D, player.posZ, player.getRNG().nextGaussian(), 0.0D, player.getRNG().nextGaussian()); + } + + this.dischargeBattery(stack, 10_000); + + } else { + world.playSoundAtEntity(player, "random.orb", 0.25F, 0.75F); + } + + return stack; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemDiscord.java b/src/main/java/com/hbm/items/tool/ItemDiscord.java index bb29d102e..75f8893de 100644 --- a/src/main/java/com/hbm/items/tool/ItemDiscord.java +++ b/src/main/java/com/hbm/items/tool/ItemDiscord.java @@ -14,33 +14,33 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class ItemDiscord extends Item { - + @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - + MovingObjectPosition pos = Library.rayTrace(player, 100, 1); - + if(pos.typeOfHit == MovingObjectType.BLOCK) { if(!world.isRemote) { - - if(player.isRiding()) - player.mountEntity(null); - - ForgeDirection dir = ForgeDirection.getOrientation(pos.sideHit); - world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); - - player.setPositionAndUpdate(pos.hitVec.xCoord + dir.offsetX, pos.hitVec.yCoord + dir.offsetY - 1, pos.hitVec.zCoord + dir.offsetZ); - - world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); - player.fallDistance = 0.0F; + if(player.isRiding()) + player.mountEntity(null); + + ForgeDirection dir = ForgeDirection.getOrientation(pos.sideHit); + + world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); + + player.setPositionAndUpdate(pos.hitVec.xCoord + dir.offsetX, pos.hitVec.yCoord + dir.offsetY - 1, pos.hitVec.zCoord + dir.offsetZ); + + world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); + player.fallDistance = 0.0F; } - for (int i = 0; i < 32; ++i) - world.spawnParticle("portal", player.posX, player.posY + player.getRNG().nextDouble() * 2.0D, player.posZ, player.getRNG().nextGaussian(), 0.0D, player.getRNG().nextGaussian()); + for(int i = 0; i < 32; ++i) + world.spawnParticle("portal", player.posX, player.posY + player.getRNG().nextDouble() * 2.0D, player.posZ, player.getRNG().nextGaussian(), 0.0D, player.getRNG().nextGaussian()); } - + return stack; } diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 5f4344b4f..5d63e14df 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -896,6 +896,9 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.charger, 16), new Object[] { "G", "S", "C", 'G', Blocks.glowstone, 'S', STEEL.block(), 'C', ModItems.coil_copper_torus }); addRecipeAuto(new ItemStack(ModBlocks.press_preheater), new Object[] { "CCC", "SLS", "TST", 'C', ModItems.board_copper, 'S', Blocks.stone, 'L', Fluids.LAVA.getDict(1000), 'T', W.ingot() }); addRecipeAuto(new ItemStack(ModItems.fluid_identifier_multi), new Object[] { "D", "C", "P", 'D', "dye", 'C', ModItems.circuit_aluminium, 'P', ANY_PLASTIC.ingot() }); + + addShapelessAuto(ItemBattery.getEmptyBattery(ModItems.anchor_remote), new Object[] { DIAMOND.gem(), ModItems.ducttape, ModItems.circuit_red_copper }); + addRecipeAuto(new ItemStack(ModBlocks.teleanchor), new Object[] { "ODO", "EAE", "ODO", 'O', Blocks.obsidian, 'D', DIAMOND.gem(), 'E', ModItems.powder_magic, 'A', ModItems.gem_alexandrite }); addShapelessAuto(new ItemStack(ModItems.holotape_image, 1, EnumHoloImage.HOLO_RESTORED.ordinal()), new Object[] { new ItemStack(ModItems.holotape_image, 1, EnumHoloImage.HOLO_DIGAMMA.ordinal()), KEY_TOOL_SCREWDRIVER, ModItems.ducttape, ModItems.armor_polish }); addShapelessAuto(new ItemStack(ModItems.holotape_damaged), new Object[] { DictFrame.fromOne(ModItems.holotape_image, EnumHoloImage.HOLO_RESTORED), ModBlocks.muffler, ModItems.crt_display, ModItems.gem_alexandrite /* placeholder for amplifier */ }); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index 98e3b661a..1bb2d49c9 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -6,6 +6,7 @@ import java.util.List; import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.inventory.gui.GUITurretHIMARS; import com.hbm.items.ModItems; +import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; @@ -15,10 +16,16 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Vec3; import net.minecraft.world.World; public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implements IGUIProvider { + public short mode = 0; + public static final short MODE_AUOT = 0; + public static final short MODE_MANUAL = 1; + @Override @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { @@ -50,14 +57,194 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem return 1_000_000; } + @Override + public double getBarrelLength() { + return 3D; + } + + @Override + public double getAcceptableInaccuracy() { + return 0; + } + + @Override + public double getHeightOffset() { + return 3D; + } + + @Override + public double getDecetorRange() { + return 5000D; + } + + @Override + public double getDecetorGrace() { + return 32D; + } + + @Override + public double getTurretYawSpeed() { + return 1D; + } + + @Override + public double getTurretPitchSpeed() { + return 0.5D; + } + @Override public boolean doLOSCheck() { return false; } + + @Override + protected void alignTurret() { + + Vec3 pos = this.getTurretPos(); + + Vec3 delta = Vec3.createVectorHelper(tPos.xCoord - pos.xCoord, tPos.yCoord - pos.yCoord, tPos.zCoord - pos.zCoord); + double targetYaw = -Math.atan2(delta.xCoord, delta.zCoord); + double targetPitch = Math.PI / 4D; + + this.turnTowardsAngle(targetPitch, targetYaw); + } + + @Override + public void updateEntity() { + + if(this.mode == this.MODE_MANUAL) { + if(!this.targetQueue.isEmpty()) { + this.tPos = this.targetQueue.get(0); + } + } else { + this.targetQueue.clear(); + } + + if(worldObj.isRemote) { + this.lastRotationPitch = this.rotationPitch; + this.lastRotationYaw = this.rotationYaw; + } + + this.aligned = false; + + if(!worldObj.isRemote) { + + this.updateConnections(); + + if(this.target != null && !target.isEntityAlive()) { + this.target = null; + this.stattrak++; + } + } + + if(target != null && this.mode != this.MODE_MANUAL) { + if(!this.entityInLOS(this.target)) { + this.target = null; + } + } + + if(!worldObj.isRemote) { + + if(target != null) { + this.tPos = this.getEntityPos(target); + } else { + if(this.mode != this.MODE_MANUAL) { + this.tPos = null; + } + } + } + + if(isOn() && hasPower()) { + + if(tPos != null) + this.alignTurret(); + } else { + + this.target = null; + this.tPos = null; + } + + if(!worldObj.isRemote) { + + if(this.target != null && !target.isEntityAlive()) { + this.target = null; + this.tPos = null; + this.stattrak++; + } + + if(isOn() && hasPower()) { + searchTimer--; + + this.setPower(this.getPower() - this.getConsumption()); + + if(searchTimer <= 0) { + searchTimer = this.getDecetorInterval(); + + if(this.target == null && this.mode != this.MODE_MANUAL) + this.seekNewTarget(); + } + } else { + searchTimer = 0; + } + + if(this.aligned) { + this.updateFiringTick(); + } + + this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); + + NBTTagCompound data = this.writePacket(); + this.networkPack(data, 250); + + } else { + + Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); + vec.rotateAroundZ((float) -this.rotationPitch); + vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); + + //this will fix the interpolation error when the turret crosses the 360° point + if(Math.abs(this.lastRotationYaw - this.rotationYaw) > Math.PI) { + + if(this.lastRotationYaw < this.rotationYaw) + this.lastRotationYaw += Math.PI * 2; + else + this.lastRotationYaw -= Math.PI * 2; + } + } + } @Override public void updateFiringTick() { + // *chirp* *chirp* *chirp* + } + + @Override + public void handleButtonPacket(int value, int meta) { + if(meta == 5) { + this.mode++; + if(this.mode > 1) + this.mode = 0; + + this.tPos = null; + this.targetQueue.clear(); + + } else{ + super.handleButtonPacket(value, meta); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.mode = nbt.getShort("mode"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setShort("mode", this.mode); } @Override diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 21fbfc7ba..69b6ebdd9 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -843,6 +843,7 @@ item.ams_focus_limiter.name=Beschränkender Stabilisierungsfokus item.ams_lens.name=Stabilisierer-Linse item.ams_muzzle.name=Strahlenemissions-Mündung item.analyzer.name=Analysierer +item.anchor_remote.name=Rückrufgerät item.antiknock.name=Tetraethyblei-Antiklopfmittel item.apple_euphemium.name=Euphemiumapfel item.apple_lead.name=Bleiapfel @@ -3774,6 +3775,7 @@ tile.taint.name=Korrupter Schmutz tile.taint_barrel.name=IMP-Rückstandsfass tile.tape_recorder.name=Tonbandgerät tile.tektite.name=Tektit +tile.teleanchor.name=Teleportations-Anker tile.tesla.name=Teslaspule tile.test_nuke.name=Test Atombombe tile.therm_endo.name=Endothermische Bombe diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 987258ebc..3701a136c 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1085,6 +1085,7 @@ item.ams_lens.name=Stabilizer Lens item.ams_muzzle.name=Ray-Emission Muzzle item.ams_muzzle.desc=...it emits an energy-beam thingy. item.analyzer.name=Analyzer +item.anchor_remote.name=Recall Device item.antiknock.name=Tetraethyllead Antiknock Agent item.apple_euphemium.name=Euphemium Apple item.apple_lead.name=Lead Apple @@ -4227,6 +4228,7 @@ tile.taint.name=Taint tile.taint_barrel.name=IMP Residue Barrel tile.tape_recorder.name=Tape Recorder tile.tektite.name=Tektite +tile.teleanchor.name=Teleportation Anchor tile.tesla.name=Tesla Coil tile.test_nuke.name=Test Nuke tile.therm_endo.name=Endothermic Bomb diff --git a/src/main/resources/assets/hbm/textures/blocks/tele_anchor_side.png b/src/main/resources/assets/hbm/textures/blocks/tele_anchor_side.png new file mode 100644 index 0000000000000000000000000000000000000000..346d3471afa577b5f26467ab27d29f6501082289 GIT binary patch literal 622 zcmV-!0+IcRP)QcA2w@qseKx+-HHLW$QwHRYiN}-ejKq-ZYAR-uJczSxm zDy6u-zQ!2CJkJRKNkAK7d+0POAUF^(g(R*W&cyu5IJe%?KD&S8x)U8{4BoHMVl zuK*0gfKrN_GuB$3pP#w7xIjdDUoSs-@4Le(C34OfWANT%j3LH|h)_zQl+rh5wboc` zX|17@B7}go7VkaIIkwv^N-4C~h{!+p|Jd&y*IH?uaJwAOgl`l7YQ9|&GCvw{1)Ap}H(i;D}4Qi_w46GVi%t`QNm)=a0P&KgXnL%49NO_2t(TOOJJ$a@kWJSh7TOkR>F}GE0O%nw~|`@Z&dEeDy>)Jv~J$ zrAX71Zir~BNS%<3G`o|5eB zp`2h7A)k&I89{Pb?u>}dg05KO{XW;%*INOl6x|TXjG(l_?2mcx<9$ASIwM9{bv*}} zWAVTd+m5bY;=Skg_I4W~NfO3ZIB=F%(~OUvJ>u;r6WTB!O7YNHcCApXYJ9b1=*oM* z3_#nqSiQy7CPLpU=HIW-T9GnE8Cp<>e*w`J4~} z&N-TuXBYly#R-Ut9F0$0;%W|f*C2FHH!Ywd|J7WoCtY$3MZ7wBa+<9$BQBv{G1c$v)r z7>f{wAx+ClRb3MVtplS{^Tkz4c1=?U#Mv8-Mrt1mEqrR=%QFfYo$K=`is)CXz~=~) zQ&=eL=>A^v`8-?e>)h<`6O_x~dF+%*e8ZXX^1c&yg}H2CLZ mgFk-bVGszwo9AWr5AXqT5}k4UZVTxE0000 Date: Thu, 15 Sep 2022 22:28:51 +0200 Subject: [PATCH 067/111] better BlockDummyable collisions, some more sawmill stuff --- .../java/com/hbm/blocks/BlockDummyable.java | 50 ++++++++++++++++ .../hbm/blocks/machine/MachineCrucible.java | 7 +++ .../hbm/blocks/machine/MachineSawmill.java | 58 +++++++++++++++++++ .../hbm/blocks/machine/MachineTeleanchor.java | 4 +- .../java/com/hbm/handler/FuelHandler.java | 43 +++++--------- .../inventory/recipes/anvil/AnvilRecipes.java | 9 +++ .../java/com/hbm/main/CraftingManager.java | 1 + .../tileentity/machine/TileEntitySawmill.java | 12 ++++ src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + 10 files changed, 156 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index a8eecd64d..3ef2e8dff 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -13,6 +13,7 @@ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -22,6 +23,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -412,4 +414,52 @@ public abstract class BlockDummyable extends BlockContainer { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); } + + public boolean useDetailedHitbox() { + return !bounding.isEmpty(); + } + + public List bounding = new ArrayList(); + + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + if(!this.useDetailedHitbox()) { + super.addCollisionBoxesToList(world, x, y, z, entityBounding, list, entity); + return; + } + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return; + + x = pos[0]; + y = pos[1]; + z = pos[2]; + + for(AxisAlignedBB aabb :this.bounding) { + AxisAlignedBB boxlet = getAABBRotationOffset(aabb, x, y, z, ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - this.offset).getRotation(ForgeDirection.UP)); + + if(entityBounding.intersectsWith(boxlet)) { + list.add(boxlet); + } + } + } + + public static AxisAlignedBB getAABBRotationOffset(AxisAlignedBB aabb, int x, int y, int z, ForgeDirection dir) { + + AxisAlignedBB newBox = null; + + if(dir == ForgeDirection.NORTH) newBox = AxisAlignedBB.getBoundingBox(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ); + if(dir == ForgeDirection.EAST) newBox = AxisAlignedBB.getBoundingBox(-aabb.maxZ, aabb.minY, aabb.minX, -aabb.minZ, aabb.maxY, aabb.maxX); + if(dir == ForgeDirection.SOUTH) newBox = AxisAlignedBB.getBoundingBox(-aabb.maxX, aabb.minY, -aabb.maxZ, -aabb.minX, aabb.maxY, -aabb.minZ); + if(dir == ForgeDirection.WEST) newBox = AxisAlignedBB.getBoundingBox(aabb.minZ, aabb.minY, -aabb.maxX, aabb.maxZ, aabb.maxY, -aabb.minX); + + if(newBox != null) { + newBox.offset(x + 0.5, y, z + 0.5); + return newBox; + } + + return AxisAlignedBB.getBoundingBox(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ).offset(x + 0.5, y + 0.5, z + 0.5); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java index d9d0285b4..f55de661f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -6,12 +6,19 @@ import com.hbm.tileentity.machine.TileEntityCrucible; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; public class MachineCrucible extends BlockDummyable { public MachineCrucible() { super(Material.rock); + + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0D, -1.5D, 1.5D, 0.5D, 1.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.25D, 0.5D, -1.25D, 1.25D, 1.5D, -1D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.25D, 0.5D, -1.25D, -1D, 1.5D, 1.25D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.25D, 0.5D, 1D, 1.25D, 1.5D, 1.25D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(1D, 0.5D, -1.25D, 1.25D, 1.5D, 1.25D)); } @Override diff --git a/src/main/java/com/hbm/blocks/machine/MachineSawmill.java b/src/main/java/com/hbm/blocks/machine/MachineSawmill.java index 2b975c001..e79978f1e 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSawmill.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSawmill.java @@ -13,10 +13,14 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; @@ -25,6 +29,10 @@ public class MachineSawmill extends BlockDummyable implements ILookOverlay, IToo public MachineSawmill() { super(Material.iron); + + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0D, -1.5D, 1.5D, 1D, 1.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.25D, 1D, -0.5D, -0.625D, 1.875D, 0.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.625D, 1D, -1D, 1.375D, 2D, 1D)); } @Override @@ -112,6 +120,56 @@ public class MachineSawmill extends BlockDummyable implements ILookOverlay, IToo return false; } + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + super.onBlockPlacedBy(world, x, y, z, player, itemStack); + + if(itemStack.getItemDamage() == 1) { + + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + int o = -getOffset(); + + ForgeDirection dir = ForgeDirection.NORTH; + if(i == 0) dir = ForgeDirection.getOrientation(2); + if(i == 1) dir = ForgeDirection.getOrientation(5); + if(i == 2) dir = ForgeDirection.getOrientation(3); + if(i == 3) dir = ForgeDirection.getOrientation(4); + + dir = getDirModified(dir); + + TileEntity te = world.getTileEntity(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o); + + if(te instanceof TileEntitySawmill) { + ((TileEntitySawmill) te).hasBlade = false; + } + } + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + + int count = quantityDropped(metadata, fortune, world.rand); + int dmg = 0; + + int[] pos = this.findCore(world, x, y, z); + + if(pos != null) { + TileEntitySawmill stirling = (TileEntitySawmill)world.getTileEntity(pos[0], pos[1], pos[2]); + if(!stirling.hasBlade) { + dmg = 1; + } + } + + for(int i = 0; i < count; i++) { + Item item = getItemDropped(metadata, world.rand, fortune); + if(item != null) { + ret.add(new ItemStack(item, 1, dmg)); + } + } + return ret; + } + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { } diff --git a/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java b/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java index 5b1d5b7db..9e1dd5283 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java @@ -20,8 +20,8 @@ public class MachineTeleanchor extends BlockBase { @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { - this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":teleanchor_top"); - this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":teleanchor_side"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":tele_anchor_top"); + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":tele_anchor_side"); } @Override diff --git a/src/main/java/com/hbm/handler/FuelHandler.java b/src/main/java/com/hbm/handler/FuelHandler.java index d55bc7284..e7651a481 100644 --- a/src/main/java/com/hbm/handler/FuelHandler.java +++ b/src/main/java/com/hbm/handler/FuelHandler.java @@ -22,34 +22,21 @@ public class FuelHandler implements IFuelHandler { if(fuel.getItem().equals(ModItems.solid_fuel_presto_triplet_bf)) return single * 2000; if(fuel.getItem().equals(ModItems.rocket_fuel)) return single * 32; - if(fuel.getItem().equals(ModItems.biomass)) - return 800; - if(fuel.getItem().equals(ModItems.biomass_compressed)) - return 2400; - if(fuel.getItem().equals(ModItems.powder_coal)) - return 1600; - if(fuel.getItem().equals(ModItems.scrap)) - return 800; - if(fuel.getItem().equals(ModItems.dust)) - return 400; - if(fuel.getItem().equals(ModItems.powder_fire)) - return 6400; - if(fuel.getItem().equals(Item.getItemFromBlock(ModBlocks.block_scrap))) - return 4000; - if(fuel.getItem() == ModItems.lignite) - return 1200; - if(fuel.getItem() == ModItems.powder_lignite) - return 1200; - if(fuel.getItem() == ModItems.briquette_lignite) - return 1600; - if(fuel.getItem() == ModItems.coke) - return 3200; - if(fuel.getItem() == ModItems.book_guide) - return 800; - if(fuel.getItem() == ModItems.coal_infernal) - return 4800; - if(fuel.getItem() == ModItems.crystal_coal) - return 6400; + if(fuel.getItem().equals(ModItems.biomass)) return 800; + if(fuel.getItem().equals(ModItems.biomass_compressed)) return 2400; + if(fuel.getItem().equals(ModItems.powder_coal)) return 1600; + if(fuel.getItem().equals(ModItems.scrap)) return 800; + if(fuel.getItem().equals(ModItems.dust)) return 400; + if(fuel.getItem().equals(ModItems.powder_fire)) return 6400; + if(fuel.getItem().equals(Item.getItemFromBlock(ModBlocks.block_scrap))) return 4000; + if(fuel.getItem() == ModItems.lignite) return 1200; + if(fuel.getItem() == ModItems.powder_lignite) return 1200; + if(fuel.getItem() == ModItems.briquette_lignite) return 1600; + if(fuel.getItem() == ModItems.coke) return 3200; + if(fuel.getItem() == ModItems.book_guide) return 800; + if(fuel.getItem() == ModItems.coal_infernal) return 4800; + if(fuel.getItem() == ModItems.crystal_coal) return 6400; + if(fuel.getItem() == ModItems.powder_sawdust) return 100; return 0; } diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 233771927..48dd30ebb 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -214,6 +214,15 @@ public class AnvilRecipes { new ComparableStack(ModItems.gear_large, 1, 1) }, new AnvilOutput(new ItemStack(ModBlocks.machine_stirling_steel))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(KEY_PLANKS, 16), + new OreDictStack(STEEL.plate(), 6), + new OreDictStack(CU.ingot(), 8), + new OreDictStack(IRON.ingot(), 4), + new ComparableStack(ModItems.sawblade) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_sawmill))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 6), diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 5d63e14df..27c23e376 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -950,6 +950,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.gear_large, 1, 0), new Object[] { "III", "ICI", "III", 'I', IRON.plate(), 'C', CU.ingot()}); addRecipeAuto(new ItemStack(ModItems.gear_large, 1, 1), new Object[] { "III", "ICI", "III", 'I', STEEL.plate(), 'C', TI.ingot()}); + addRecipeAuto(new ItemStack(ModItems.sawblade), new Object[] { "III", "ICI", "III", 'I', STEEL.plate(), 'C', IRON.ingot()}); addShapelessAuto(new ItemStack(ModItems.upgrade_5g), new Object[] { ModItems.upgrade_template, ModItems.gem_alexandrite }); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index 4e1c44e75..51c2c47e3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -2,7 +2,9 @@ package com.hbm.tileentity.machine; import java.util.List; +import com.hbm.blocks.BlockDummyable; import com.hbm.items.ModItems; +import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCraftingAuto; @@ -11,6 +13,7 @@ import com.hbm.util.ItemStackUtil; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; @@ -19,6 +22,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; public class TileEntitySawmill extends TileEntityMachineBase { @@ -76,6 +80,14 @@ public class TileEntitySawmill extends TileEntityMachineBase { } else { this.progress = 0; } + + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(-1D, 0.375D, -1D, -0.875, 2.375D, 1D); + aabb = BlockDummyable.getAABBRotationOffset(aabb, xCoord, yCoord, zCoord, ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getRotation(ForgeDirection.UP)); + for(Object o : worldObj.getEntitiesWithinAABB(EntityLivingBase.class, aabb)) { + EntityLivingBase living = (EntityLivingBase) o; + living.attackEntityFrom(ModDamageSource.turbofan, 100); + } + } else { this.progress = 0; } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 69b6ebdd9..3dd603b58 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2654,6 +2654,7 @@ item.sat_miner.name=Asteroiden-Förderschiff item.sat_radar.name=Radar-Überwachungssatellit item.sat_resonator.name=Xenium-Resonator-Satellit item.sat_scanner.name=Satellit mit Tiefenscanning-Modul +item.sawblade.name=Sägeblatt item.schnitzel_vegan.name=Veganes Schnitzel item.schrabidium_axe.name=Schrabidiumaxt item.schrabidium_boots.name=Schrabidiumstiefel diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 3701a136c..ba2e8ce3d 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3076,6 +3076,7 @@ item.sat_miner.name=Asteroid Mining Ship item.sat_radar.name=Radar Survey Satellite item.sat_resonator.name=Xenium Resonator Satellite item.sat_scanner.name=Satellite with Depth-Resource Scanning Module +item.sawblade.name=Sawblade item.schnitzel_vegan.name=Vegan Schnitzel item.schrabidium_axe.name=Schrabidium Axe item.schrabidium_boots.name=Schrabidium Boots From a311e87ccdbab1052c8c5fb399e01ce799999dd1 Mon Sep 17 00:00:00 2001 From: Vaern <90118520+Vaern@users.noreply.github.com> Date: Fri, 16 Sep 2022 00:15:24 -0700 Subject: [PATCH 068/111] Update README.md --- README.md | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9f6813dc5..85bc0819a 100644 --- a/README.md +++ b/README.md @@ -40,17 +40,45 @@ Please note that these installation instructions are assuming you're running Mic ## Contributing If you want to make some changes to the mod, follow this guide: -1. Follow steps 1-4 from *Building from source* section -2. Setup forge decompilation workspace +1. Follow steps 1-2 from *Building from source* section +2. Create a directory where the repository will reside, using a name that is not "Hbm-s-Nuclear-Tech-GIT" +3. Download the forge src from [here](https://files.minecraftforge.net/net/minecraftforge/forge/index_1.7.10.html) and extract it into the directory. +4. Download the source code: + * Using Git Bash, enter wherever your directory is located: +```bash + cd $HOME/Downloads +``` + * Download the source code: +```bash + git clone https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git + ``` + * Move or copy every file within the new folder into your directory, making sure to overwrite any files. + * Feel free to delete the remaining folder and rename your directory (such as "Hbm-s-Nuclear-Tech-GIT") +5. Enter the source directory +```bash + cd Hbm-s-Nuclear-Tech-GIT +``` +6. Setup forge decompilation workspace ```bash ./gradlew setupDecompWorkspace ``` -3. (OPTIONAL, but needed if you use eclipse) Generate eclipse files +### Necessary for Eclipse users +7. Generate eclipse files ```bash ./gradlew eclipse ``` -4. Open up the project directory in eclipse using *Open existing project from file system* -5. Code! +8. Switch to the **eclipse** folder inside your directory as a workspace. +9. If necessary, make sure that Eclipse is using the JDK8. + * On Linux, enter Windows>Preferences>Java>Installed JREs. + * Click search to navigate to /usr/lib/jvm and open it. Select the Java 8 JDK (e.g., java-8-openjdk). + * Afterwards, enter Execution Environment, select JavaSE-1.8, and select the jre listed as a **[perfect match]** + * On Windows, you may need to set your JAVA_HOME. + * Search for Environment Variables and click Edit the System Environment Variables. + * Click Environment Variables. Click new under System Variables. + * Enter **JAVA_HOME** under Variable Name and enter the path to your JDK 8 under Variable Value (e.g., C:\Program-Files\Java\jdk1.8.0_102). + * In Eclipse, now enter Windows>Preferences>Java>Installed JREs. + * Click **Add Standard VM**; in the JRE home, navigate to the directory where the JDK is installed, then click finish and select it. +10. Code! # License This software is licensed under the GNU Public License version 3. In short: This software is free, you may run the software freely, create modified versions, distribute this software and distribute modified versions, as long as the modified software too has a free software license. You win this round, Stallman. The full license can be found in the `LICENSE` file. From ba21416f69b6f1d52ea6f63c8df5d006ee6dde86 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 16 Sep 2022 15:14:47 +0200 Subject: [PATCH 069/111] small test with finite fluids --- src/main/java/com/hbm/blocks/ModBlocks.java | 6 ++ .../hbm/blocks/fluid/GenericFiniteFluid.java | 52 ++++++++++++++++++ .../com/hbm/items/tool/ItemModBucket.java | 48 +++++++++++++++- .../hbm/textures/blocks/concrete_liquid.png | Bin 0 -> 646 bytes .../blocks/concrete_liquid_flowing.png | Bin 0 -> 744 bytes 5 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/fluid/GenericFiniteFluid.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/concrete_liquid.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/concrete_liquid_flowing.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 1b7256727..a9e7c586f 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1231,6 +1231,8 @@ public class ModBlocks { public static Block sulfuric_acid_block; public static Fluid sulfuric_acid_fluid; + public static Block concrete_liquid; + public static Block volcano_core; public static Block dummy_block_flare; @@ -2319,6 +2321,9 @@ public class ModBlocks { sulfuric_acid_fluid = new GenericFluid("sulfuric_acid_fluid").setDensity(1840).setViscosity(1000).setTemperature(273); FluidRegistry.registerFluid(sulfuric_acid_fluid); sulfuric_acid_block = new GenericFluidBlock(sulfuric_acid_fluid, Material.water, "sulfuric_acid_still", "sulfuric_acid_flowing").setDamage(ModDamageSource.acid, 5F).setBlockName("sulfuric_acid_block").setResistance(500F); + + Fluid liquidConcrete = new GenericFluid("concrete_liquid").setViscosity(2000); + concrete_liquid = new GenericFiniteFluid(liquidConcrete, Material.rock, "concrete_liquid", "concrete_liquid_flowing").setQuantaPerBlock(4).setBlockName("concrete_liquid").setResistance(500F); dummy_block_flare = new DummyBlockFlare(Material.iron, false).setBlockName("dummy_block_flare").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); dummy_port_flare = new DummyBlockFlare(Material.iron, true).setBlockName("dummy_port_flare").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); @@ -3363,6 +3368,7 @@ public class ModBlocks { GameRegistry.registerBlock(corium_block, corium_block.getUnlocalizedName()); GameRegistry.registerBlock(volcanic_lava_block, volcanic_lava_block.getUnlocalizedName()); GameRegistry.registerBlock(sulfuric_acid_block, sulfuric_acid_block.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_liquid, concrete_liquid.getUnlocalizedName()); //Multiblock Dummy Blocks GameRegistry.registerBlock(dummy_block_flare, dummy_block_flare.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/fluid/GenericFiniteFluid.java b/src/main/java/com/hbm/blocks/fluid/GenericFiniteFluid.java new file mode 100644 index 000000000..df77a5130 --- /dev/null +++ b/src/main/java/com/hbm/blocks/fluid/GenericFiniteFluid.java @@ -0,0 +1,52 @@ +package com.hbm.blocks.fluid; + +import java.util.Random; + +import com.hbm.lib.RefStrings; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.fluids.BlockFluidFinite; +import net.minecraftforge.fluids.Fluid; + +public class GenericFiniteFluid extends BlockFluidFinite { + + @SideOnly(Side.CLIENT) + public static IIcon stillIcon; + @SideOnly(Side.CLIENT) + public static IIcon flowingIcon; + public Random rand = new Random(); + + private String stillName; + private String flowingName; + + public GenericFiniteFluid(Fluid fluid, Material material, String still, String flowing) { + super(fluid, material); + setCreativeTab(null); + stillName = still; + flowingName = flowing; + displacements.put(this, false); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return (side == 0 || side == 1) ? stillIcon : flowingIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + stillIcon = register.registerIcon(RefStrings.MODID + ":" + stillName); + flowingIcon = register.registerIcon(RefStrings.MODID + ":" + flowingName); + } + + @Override + public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int meta) { + return this.quantaPerBlock - 1; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemModBucket.java b/src/main/java/com/hbm/items/tool/ItemModBucket.java index 33c5b7c4b..86caf2476 100644 --- a/src/main/java/com/hbm/items/tool/ItemModBucket.java +++ b/src/main/java/com/hbm/items/tool/ItemModBucket.java @@ -1,12 +1,56 @@ package com.hbm.items.tool; import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemBucket; +import net.minecraft.world.World; public class ItemModBucket extends ItemBucket { + + protected int overrideFluidMeta = 0; + protected Block containedFluid; - public ItemModBucket(Block p_i45331_1_) { - super(p_i45331_1_); + public ItemModBucket(Block fluid) { + super(fluid); + this.containedFluid = fluid; + } + + public ItemModBucket(Block fluid, int meta) { + this(fluid); + this.overrideFluidMeta = meta; + } + + @Override + public boolean tryPlaceContainedLiquid(World world, int x, int y, int z) { + + if(this.containedFluid == Blocks.air) { + return false; + } else { + Material material = world.getBlock(x, y, z).getMaterial(); + boolean flag = !material.isSolid(); + + if(!world.isAirBlock(x, y, z) && !flag) { + return false; + } else { + if(world.provider.isHellWorld && this.containedFluid == Blocks.flowing_water) { + world.playSoundEffect((double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), "random.fizz", 0.5F, + 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + + for(int l = 0; l < 8; ++l) { + world.spawnParticle("largesmoke", (double) x + Math.random(), (double) y + Math.random(), (double) z + Math.random(), 0.0D, 0.0D, 0.0D); + } + } else { + if(!world.isRemote && flag && !material.isLiquid()) { + world.func_147480_a(x, y, z, true); + } + + world.setBlock(x, y, z, this.containedFluid, overrideFluidMeta, 3); + } + + return true; + } + } } } diff --git a/src/main/resources/assets/hbm/textures/blocks/concrete_liquid.png b/src/main/resources/assets/hbm/textures/blocks/concrete_liquid.png new file mode 100644 index 0000000000000000000000000000000000000000..5d76282fe5c8438b922d95686c704a2396eb572e GIT binary patch literal 646 zcmV;10(t$3P)*cR5k zi@XS)Hd=_8IY;N4KVM&8f9H9|drzL{e1CsqjN$qDnd9*Yz%)&4+eQe15CX$6pp>Gj zDt6N}F^(f41gfgy^YfEo7yt+%q~aJO<2d5IM{5nhJkRXLab%h%>bk~zk8_U4xn8eW zYni4AV+iAp_Jl$J|`;xd7h(`;&!{;8z`mH1b}fI z)BW=DLS5Hrtr3xALu<{tuB_{da?T+lbX~_ZO;~F&#*pVZzrVk{zP>U|6W)82Qiw?U zaIH1Udrt^~x3{-csI_LEXRNifZHrQhx~}QEjx5U%5!Q7j%QALVRZ*7Z|6+6xLeic}^TCtu<}iQWOQlFwnLwP167{ z3TcoDeOVS_j2L6?5C1Jo2!TA$IUbM6O4oH< zE|)u%5BcLbvfu9kxZQ3^W?k0_AQ1uJ{r#P)s&LM+^WIaIB_e`zF2(b(BO)|SL*Mr} g=Qy2C06cc+AKE5D8*cmd+5i9m07*qoM6N<$f(yhcMgRZ+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/concrete_liquid_flowing.png b/src/main/resources/assets/hbm/textures/blocks/concrete_liquid_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..13ce2f116cd520a22f3b9bab02b640d20ee3fbc0 GIT binary patch literal 744 zcmVP)lVurso@0z5NfMM&91e#lB|w^{ zD5bbwuK+CNS4ydP!rMf*_ineNEK9W3h)9%CYt1;0jN|xi!hhkFa}E*Va=FlT9oAZm zF{EkA*Vh+MPfv7RhxZ<(6e1EYoYtD9yz<@?Lg4xNIf7bi`o70n%jtANDMeY9TrL-q zBtb+N$B`sSSjw-8q9D)nZ#J3dnTLl54u=EA7|OC_nkLrkHGSVBB519drirEe>ShV= zJt9H~0c$PJIbL61@!nI{H6p?=42mvMgh> z*^p&f{DD#`2G7mMOL?WW=5#udWf@J=a5|l+stSOnX$T=8A{0e|F@|9nFvc*?GXP6@ zWsIS!DnbZ&?@5w`d7eqrlq}2e-s8Oo;BYvw*=%CiXsubws}Mqz>E>mn6adb-m|Vj! zV6EkNJR%|}rRe*frM$YGZWspUdBzy?`@^4Q5keqMQ?}b}l=5=9a6BGK)0CyWy2;nJ zE$j6ffa~=dWh%=u28f6N@bdCPQ4~1mSjw-w_vCqwh~S)y_PEI@B2-mHUDr70*zfni z_Z_f=UsY8_-}j8;$Zofb`#edKZ=0(qikNVJ>jVGF-}}J558V5}y${^`z`YOL`@nzi a1HS-iZ2B5uxhg9F0000 Date: Sun, 18 Sep 2022 21:04:28 +0200 Subject: [PATCH 070/111] crucible fun --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../com/hbm/config/FalloutConfigJSON.java | 4 - .../java/com/hbm/config/GeneralConfig.java | 4 +- .../java/com/hbm/inventory/RecipesCommon.java | 19 ++- .../java/com/hbm/inventory/material/Mats.java | 9 +- .../inventory/recipes/CrucibleRecipes.java | 110 ++++++++++++ .../recipes/loader/SerializableRecipe.java | 1 + src/main/java/com/hbm/items/ModItems.java | 3 + .../items/machine/ItemCrucibleTemplate.java | 53 ++++++ .../machine/TileEntityCrucible.java | 161 +++++++++++++++++- .../textures/gui/processing/gui_crucible.png | Bin 7853 -> 9311 bytes 11 files changed, 350 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java create mode 100644 src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index a9e7c586f..f3f2e043a 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -3368,7 +3368,7 @@ public class ModBlocks { GameRegistry.registerBlock(corium_block, corium_block.getUnlocalizedName()); GameRegistry.registerBlock(volcanic_lava_block, volcanic_lava_block.getUnlocalizedName()); GameRegistry.registerBlock(sulfuric_acid_block, sulfuric_acid_block.getUnlocalizedName()); - GameRegistry.registerBlock(concrete_liquid, concrete_liquid.getUnlocalizedName()); + //GameRegistry.registerBlock(concrete_liquid, concrete_liquid.getUnlocalizedName()); //Multiblock Dummy Blocks GameRegistry.registerBlock(dummy_block_flare, dummy_block_flare.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/config/FalloutConfigJSON.java b/src/main/java/com/hbm/config/FalloutConfigJSON.java index 869138164..4232fc527 100644 --- a/src/main/java/com/hbm/config/FalloutConfigJSON.java +++ b/src/main/java/com/hbm/config/FalloutConfigJSON.java @@ -104,10 +104,6 @@ public class FalloutConfigJSON { entries.add(new FalloutEntry() .mB(Blocks.mossy_cobblestone) .prim(new Triplet(Blocks.coal_ore, 0, 1))); - entries.add(new FalloutEntry() - .mB(Blocks.coal_ore) - .prim(new Triplet(Blocks.diamond_ore, 0, 3), new Triplet(Blocks.emerald_ore, 0, 2)) - .c(0.2)); entries.add(new FalloutEntry() .mB(Blocks.coal_ore) .prim(new Triplet(Blocks.diamond_ore, 0, 3), new Triplet(Blocks.emerald_ore, 0, 2)) diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 22086512d..ade474aa7 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -26,6 +26,7 @@ public class GeneralConfig { public static boolean enableRenderDistCheck = true; public static boolean enableCustomDashKeybind = false; public static boolean enableReEval = true; + public static boolean enableSilentCompStackErrors = true; public static int hintPos = 0; public static boolean enable528 = false; @@ -75,8 +76,9 @@ public class GeneralConfig { enableRenderDistCheck = config.get(CATEGORY_GENERAL, "1.25_enableRenderDistCheck", true, "Check invalid render distances (over 16, without OptiFine) and fix it").getBoolean(true); enableCustomDashKeybind = config.get(CATEGORY_GENERAL, "1.26_enableCustomDashKeybind", false, "Enable custom dash keybind instead of shift").getBoolean(false); enableReEval = config.get(CATEGORY_GENERAL, "1.27_enableReEval", true, "Allows re-evaluating power networks on link remove instead of destroying and recreating").getBoolean(true); + enableSilentCompStackErrors = config.get(CATEGORY_GENERAL, "1.28_enableSilentCompStackErrors", false, "Enabling this will disable log spam created by unregistered items in ComparableStack instances.").getBoolean(false); - hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.27_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); + hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.29_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); final String CATEGORY_528 = CommonConfig.CATEGORY_528; diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index 740b909b8..f26af74e1 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -4,10 +4,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import com.hbm.config.GeneralConfig; +import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import net.minecraft.block.Block; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -179,17 +180,21 @@ public class RecipesCommon { public int hashCode() { if(item == null) { - MainRegistry.logger.error("ComparableStack has a null item! This is a serious issue!"); - Thread.currentThread().dumpStack(); - item = Items.stick; + if(!GeneralConfig.enableSilentCompStackErrors) { + MainRegistry.logger.error("ComparableStack has a null item! This is a serious issue!"); + Thread.currentThread().dumpStack(); + } + item = ModItems.nothing; } String name = Item.itemRegistry.getNameForObject(item); if(name == null) { - MainRegistry.logger.error("ComparableStack holds an item that does not seem to be registered. How does that even happen?"); - Thread.currentThread().dumpStack(); - item = Items.stick; //we know sticks have a name, so sure, why not + if(!GeneralConfig.enableSilentCompStackErrors) { + MainRegistry.logger.error("ComparableStack holds an item that does not seem to be registered. How does that even happen? This error can be turned off with the config . Item name: " + item.getUnlocalizedName()); + Thread.currentThread().dumpStack(); + } + item = ModItems.nothing; } final int prime = 31; diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index af6bf1b4f..bda8a5b9a 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -76,6 +76,7 @@ public class Mats { return new DictFrame(string); } + /** will not respect stacksizes - all stacks will be treated as a singular */ public static List getMaterialsFromItem(ItemStack stack) { List list = new ArrayList(); List names = ItemStackUtil.getOreDictNames(stack); @@ -107,7 +108,7 @@ public class Mats { } } - List entries = materialEntries.get(new ComparableStack(stack)); + List entries = materialEntries.get(new ComparableStack(stack).makeSingular()); if(entries != null) { list.addAll(entries); @@ -119,12 +120,16 @@ public class Mats { public static class MaterialStack { //final fields to prevent accidental changing public final NTMMaterial material; - public final int amount; + public int amount; public MaterialStack(NTMMaterial material, int amount) { this.material = material; this.amount = amount; } + + public MaterialStack copy() { + return new MaterialStack(material, amount); + } } public static String formatAmount(int amount) { diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java new file mode 100644 index 000000000..991c2198f --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -0,0 +1,110 @@ +package com.hbm.inventory.recipes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.google.gson.JsonElement; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; + +public class CrucibleRecipes extends SerializableRecipe { + + public static HashMap indexMapping = new HashMap(); + public static List recipes = new ArrayList(); + + + @Override + public void registerDefaults() { + + recipes.add(new CrucibleRecipe(0, "crucible.steel", 1) + .inputs(new MaterialStack(Mats.MAT_IRON, 10), new MaterialStack(Mats.MAT_COAL, 15)) + .outputs(new MaterialStack(Mats.MAT_STEEL, 10))); + + recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 1) + .inputs(new MaterialStack(Mats.MAT_STEEL, 10), new MaterialStack(Mats.MAT_REDSTONE, 10)) + .outputs(new MaterialStack(Mats.MAT_MINGRADE, 20))); + + recipes.add(new CrucibleRecipe(2, "crucible.aa", 1) + .inputs(new MaterialStack(Mats.MAT_STEEL, 10), new MaterialStack(Mats.MAT_MINGRADE, 10)) + .outputs(new MaterialStack(Mats.MAT_ALLOY, 20))); + } + + public static class CrucibleRecipe { + public MaterialStack[] input; + public MaterialStack[] output; + private int id; + private String name; + public int frequency; + + public CrucibleRecipe(int id, String name, int frequency) { + this.id = id; + this.name = name; + this.frequency = frequency; + + if(!indexMapping.containsKey(id)) { + indexMapping.put(id, this); + } else { + throw new IllegalStateException("Crucible recipe " + name + " has been registered with duplicate id " + id + " used by " + indexMapping.get(id).name + "!"); + } + } + + public CrucibleRecipe inputs(MaterialStack... input) { + this.input = input; + return this; + } + + public CrucibleRecipe outputs(MaterialStack... output) { + this.output = output; + return this; + } + + public int getId() { + return this.id; + } + + public String getName() { + return this.name; + } + + public int getInputAmount() { + + int content = 0; + + for(MaterialStack stack : input) { + content += stack.amount; + } + + return content; + } + } + + @Override + public String getFileName() { + return "hbmCrucible.json"; + } + + @Override + public Object getRecipeObject() { + return this.recipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + + } + + @Override + public void deleteRecipes() { + this.indexMapping.clear(); + this.recipes.clear(); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index c601a4222..2b53ced81 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -40,6 +40,7 @@ public abstract class SerializableRecipe { public static void registerAllHandlers() { recipeHandlers.add(new ShredderRecipes()); recipeHandlers.add(new ChemplantRecipes()); + recipeHandlers.add(new CrucibleRecipes()); recipeHandlers.add(new CentrifugeRecipes()); recipeHandlers.add(new CyclotronRecipes()); recipeHandlers.add(new HadronRecipes()); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 728a13cda..703e05aa6 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1247,6 +1247,7 @@ public class ModItems { public static Item assembly_template; public static Item chemistry_template; public static Item chemistry_icon; + public static Item crucible_template; public static Item fluid_identifier; public static Item fluid_identifier_multi; public static Item fluid_icon; @@ -4869,6 +4870,7 @@ public class ModItems { assembly_template = new ItemAssemblyTemplate().setUnlocalizedName("assembly_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":assembly_template"); chemistry_template = new ItemChemistryTemplate().setUnlocalizedName("chemistry_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":chemistry_template"); chemistry_icon = new ItemChemistryIcon().setUnlocalizedName("chemistry_icon").setMaxStackSize(1).setCreativeTab(null); + crucible_template = new ItemCrucibleTemplate().setUnlocalizedName("crucible_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":crucible_template"); fluid_identifier = new ItemFluidIdentifier().setUnlocalizedName("fluid_identifier").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":fluid_identifier"); fluid_identifier_multi = new ItemFluidIDMulti().setUnlocalizedName("fluid_identifier_multi").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":fluid_identifier_multi"); fluid_icon = new ItemFluidIcon().setUnlocalizedName("fluid_icon").setCreativeTab(null).setTextureName(RefStrings.MODID + ":fluid_icon"); @@ -6679,6 +6681,7 @@ public class ModItems { GameRegistry.registerItem(assembly_template, assembly_template.getUnlocalizedName()); GameRegistry.registerItem(chemistry_template, chemistry_template.getUnlocalizedName()); GameRegistry.registerItem(chemistry_icon, chemistry_icon.getUnlocalizedName()); + GameRegistry.registerItem(crucible_template, crucible_template.getUnlocalizedName()); //Machine Items GameRegistry.registerItem(fuse, fuse.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java new file mode 100644 index 000000000..b6171bd28 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java @@ -0,0 +1,53 @@ +package com.hbm.items.machine; + +import java.util.List; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemCrucibleTemplate extends Item { + + public ItemCrucibleTemplate() { + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) { + list.add(new ItemStack(item, 1, CrucibleRecipes.recipes.get(i).getId())); + } + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + + CrucibleRecipe recipe = CrucibleRecipes.indexMapping.get(stack.getItemDamage()); + + if(recipe == null) { + return; + } + + list.add("Input:"); + + for(MaterialStack in : recipe.input) { + list.add("- " + in.material.names[0] + ": " + Mats.formatAmount(in.amount)); + } + + list.add("Output:"); + + for(MaterialStack out : recipe.output) { + list.add("- " + out.material.names[0] + ": " + Mats.formatAmount(out.amount)); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 67f969c72..fab95b937 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -1,7 +1,17 @@ package com.hbm.tileentity.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.inventory.container.ContainerCrucible; import com.hbm.inventory.gui.GUICrucible; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -11,16 +21,24 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; public class TileEntityCrucible extends TileEntityMachineBase implements IGUIProvider { - + public int heat; public static final int maxHeat = 100_000; + public int progress; + public static final int processTime = 20_000; public static final double diffusion = 0.25D; + public final int recipeCapacity = MaterialShapes.BLOCK.q(16); + public final int wasteCapacity = MaterialShapes.BLOCK.q(16); + public List recipeStack = new ArrayList(); + public List wasteStack = new ArrayList(); + public TileEntityCrucible() { super(10); } @@ -30,11 +48,20 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return "container.machineCrucible"; } + @Override + public int getInventoryStackLimit() { + return 1; //prevents clogging + } + @Override public void updateEntity() { if(!worldObj.isRemote) { tryPullHeat(); + + if(!trySmelt()) { + this.progress = 0; + } } } @@ -61,6 +88,138 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); } + + protected boolean trySmelt() { + + if(this.heat < maxHeat / 2) return false; + + int slot = this.getFirstSmeltableSlot(); + if(slot == -1) return false; + + int delta = this.heat - (maxHeat / 2); + delta *= 0.05; + + this.progress += delta; + this.heat -= delta; + + if(this.progress >= processTime) { + this.progress = 0; + + List materials = Mats.getMaterialsFromItem(slots[slot]); + CrucibleRecipe recipe = getLoadedRecipe(); + + for(MaterialStack material : materials) { + boolean mainStack = recipe != null && getQuantaFromType(recipe.input, material.material) > 0; + + if(mainStack) { + this.addToStack(this.recipeStack, material); + } else { + this.addToStack(this.wasteStack, material); + } + } + + this.decrStackSize(slot, 1); + } + + return true; + } + + protected int getFirstSmeltableSlot() { + + for(int i = 1; i < 10; i++) { + + ItemStack stack = slots[i]; + + if(stack != null && isItemSmeltable(stack)) { + return i; + } + } + + return -1; + } + + public boolean isItemSmeltable(ItemStack stack) { + + List materials = Mats.getMaterialsFromItem(stack); + + //if there's no materials in there at all, don't smelt + if(materials.isEmpty()) + return false; + + CrucibleRecipe recipe = getLoadedRecipe(); + + //needs to be true, will always be true if there's no recipe loaded + boolean matchesRecipe = recipe == null; + + //the amount of material in the entire recipe input + int recipeContent = recipe != null ? recipe.getInputAmount() : 0; + //the total amount of the current waste stack, used for simulation + int wasteAmount = getQuantaFromType(this.wasteStack, null); + + for(MaterialStack mat : materials) { + //if no recipe is loaded, everything will land in the waste stack + int recipeInputRequired = recipe != null ? getQuantaFromType(recipe.input, mat.material) : 0; + + if(recipeInputRequired == 0) { + //if this type isn't required by the recipe, add it to the waste stack + wasteAmount += mat.amount; + } else { + + //the maximum is the recipe's ratio scaled up to the recipe stack's capacity + int matMaximum = recipeInputRequired * this.recipeCapacity / recipeContent; + int amountStored = getQuantaFromType(recipeStack, mat.material); + + matchesRecipe = true; + + //if the amount of that input would exceed the amount dictated by the recipe, return false + if(recipe != null && amountStored + mat.amount > matMaximum) + return false; + } + } + + //if the waste amount doesn't exceed the capacity and the recipe matches (or isn't null), return true + return wasteAmount <= this.wasteCapacity && matchesRecipe; + } + + public void addToStack(List stack, MaterialStack matStack) { + + for(MaterialStack mat : stack) { + if(mat.material == matStack.material) { + mat.amount += matStack.amount; + return; + } + } + + stack.add(matStack.copy()); + } + + public CrucibleRecipe getLoadedRecipe() { + + if(slots[0] != null && slots[0].getItem() == ModItems.crucible_template) { + return CrucibleRecipes.indexMapping.get(slots[0].getItemDamage()); + } + + return null; + } + + /* "Arrays and Lists don't have a common ancestor" my fucking ass */ + public int getQuantaFromType(MaterialStack[] stacks, NTMMaterial mat) { + for(MaterialStack stack : stacks) { + if(mat == null || stack.material == mat) { + return stack.amount; + } + } + return 0; + } + + public int getQuantaFromType(List stacks, NTMMaterial mat) { + for(MaterialStack stack : stacks) { + if(mat == null || stack.material == mat) { + return stack.amount; + } + } + return 0; + } @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png index 4fa4a1287aa77690941a067fe3f0f60ddf72cf64..ce81e589dbbbc559938b3856d8752a1bb9c737aa 100644 GIT binary patch literal 9311 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 From 60b6ec494cfb58c242a76e73a37f8ca0617cace3 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 20 Sep 2022 17:00:05 +0200 Subject: [PATCH 071/111] crucible GUI work, material IDs --- .../com/hbm/inventory/gui/GUICrucible.java | 15 +++ .../java/com/hbm/inventory/material/Mats.java | 90 +++++++++++------- .../hbm/inventory/material/NTMMaterial.java | 6 +- .../machine/TileEntityCrucible.java | 32 +++++++ .../textures/gui/processing/gui_crucible.png | Bin 9311 -> 11227 bytes .../gui/processing/gui_crystallizer_alt.png | Bin 0 -> 2912 bytes 6 files changed, 109 insertions(+), 34 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_crystallizer_alt.png diff --git a/src/main/java/com/hbm/inventory/gui/GUICrucible.java b/src/main/java/com/hbm/inventory/gui/GUICrucible.java index 61345bd6c..a41d3c199 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrucible.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrucible.java @@ -1,8 +1,11 @@ package com.hbm.inventory.gui; +import java.util.List; + import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCrucible; +import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCrucible; @@ -42,5 +45,17 @@ public class GUICrucible extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int pGauge = crucible.progress * 33 / crucible.processTime; + if(pGauge > 0) drawTexturedModalRect(guiLeft + 126, guiTop + 82, 176, 0, pGauge, 5); + int hGauge = crucible.heat * 33 / crucible.maxHeat; + if(hGauge > 0) drawTexturedModalRect(guiLeft + 126, guiTop + 91, 176, 5, hGauge, 5); + + if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, 62, 97); + if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, 17, 97); + } + + protected void drawStack(List stack, int x, int y) { + } } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index bda8a5b9a..5c812dbed 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -23,53 +23,77 @@ import net.minecraft.item.ItemStack; * @author hbm */ public class Mats { - + public static HashMap prefixByName = new HashMap(); + public static HashMap matById = new HashMap(); public static HashMap matByName = new HashMap(); + //public static HashMap matRemap = new HashMap(); public static HashMap> materialEntries = new HashMap(); public static HashMap> materialOreEntries = new HashMap(); - //Vanilla - public static final NTMMaterial MAT_STONE = makeSmeltable(df("Stone"), 0); - public static final NTMMaterial MAT_COAL = make(COAL).smeltable(SmeltingBehavior.ADDITIVE); - public static final NTMMaterial MAT_IRON = makeSmeltable(IRON, 0).omitAutoGen(); - public static final NTMMaterial MAT_GOLD = makeSmeltable(GOLD, 0).omitAutoGen(); - public static final NTMMaterial MAT_REDSTONE = makeSmeltable(REDSTONE, 0).omitAutoGen(); + /* + * ItemStacks are saved with their metadata being truncated to a short, so the max meta is 32767 + * Format for elements: Atomic number *100, plus the last two digits of the mass number. Mass number is 0 for generic/undefined/mixed materials. + * Vanilla numbers are in vanilla space (0-29), basic alloys use alloy space (30-99) + */ + + /* Vanilla Space, up to 30 materials, */ + public static final int _VS = 0; + /* Alloy Space, up to 70 materials. Use >20_000 as an extension.*/ + public static final int _AS = 30; + + //Vanilla and vanilla-like + public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0); + public static final NTMMaterial MAT_COAL = makeAdditive( 1400, COAL, 0); + public static final NTMMaterial MAT_LIGNITE = makeAdditive( 1401, LIGNITE, 0); + public static final NTMMaterial MAT_COALCOKE = makeAdditive( 1410, COALCOKE, 0); + public static final NTMMaterial MAT_PETCOKE = makeAdditive( 1411, PETCOKE, 0); + public static final NTMMaterial MAT_LIGCOKE = makeAdditive( 1412, LIGCOKE, 0); + public static final NTMMaterial MAT_GRAPHITE = makeAdditive( 1420, GRAPHITE, 0); + public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0).omitAutoGen(); + public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0).omitAutoGen(); + public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0).omitAutoGen(); //Radioactive - public static final NTMMaterial MAT_URANIUM = makeSmeltable(U, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_THORIUM = makeSmeltable(TH232, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(PU, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_RADIUM = makeSmeltable(RA226, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_THORIUM = makeSmeltable(9232, TH232, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(9400, PU, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); //Base metals - public static final NTMMaterial MAT_TITANIUM = makeSmeltable(TI, 0).setShapes(INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_COPPER = makeSmeltable(CU, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(W, 0).setShapes(WIRE, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_LEAD = makeSmeltable(PB, 0).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_BISMUTH = makeSmeltable(df("Bismuth"), 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_ARSENIC = makeSmeltable(AS, 0).setShapes(NUGGET, INGOT); - public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(TA, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(NB, 0).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(BE, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_COBALT = makeSmeltable(CO, 0).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_BORON = makeSmeltable(B, 0).setShapes(DUSTTINY, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0).setShapes(INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, df("Bismuth"), 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0).setShapes(NUGGET, INGOT); + public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(7300, TA, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(4100, NB, 0).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(400, BE, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_COBALT = makeSmeltable(2700, CO, 0).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BORON = makeSmeltable(500, B, 0).setShapes(DUSTTINY, INGOT, DUST, BLOCK); //Alloys - public static final NTMMaterial MAT_STEEL = makeSmeltable(STEEL, 0).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_MINGRADE = makeSmeltable(MINGRADE, 0).setShapes(WIRE, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_ALLOY = makeSmeltable(ALLOY, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_TCALLOY = makeSmeltable(TCALLOY, 0).setShapes(INGOT, DUST); - public static final NTMMaterial MAT_DURA = makeSmeltable(DURA, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(MAGTUNG, 0).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0).setShapes(INGOT, DUST); + public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(_AS + 7, MAGTUNG, 0).setShapes(INGOT, DUST, BLOCK); - public static NTMMaterial make(DictFrame dict) { - return new NTMMaterial(dict); + public static NTMMaterial make(int id, DictFrame dict) { + return new NTMMaterial(id, dict); } - public static NTMMaterial makeSmeltable(DictFrame dict, int color) { - return new NTMMaterial(dict).smeltable(SmeltingBehavior.SMELTABLE).setMoltenColor(color); + public static NTMMaterial makeSmeltable(int id, DictFrame dict, int color) { + return new NTMMaterial(id, dict).smeltable(SmeltingBehavior.SMELTABLE).setMoltenColor(color); + } + + public static NTMMaterial makeAdditive(int id, DictFrame dict, int color) { + return new NTMMaterial(id, dict).smeltable(SmeltingBehavior.ADDITIVE).setMoltenColor(color); } public static DictFrame df(String string) { diff --git a/src/main/java/com/hbm/inventory/material/NTMMaterial.java b/src/main/java/com/hbm/inventory/material/NTMMaterial.java index 7a7c5d2c1..68bb321cf 100644 --- a/src/main/java/com/hbm/inventory/material/NTMMaterial.java +++ b/src/main/java/com/hbm/inventory/material/NTMMaterial.java @@ -9,19 +9,23 @@ import com.hbm.inventory.OreDictManager.DictFrame; */ public class NTMMaterial { + public final int id; public String[] names; public MaterialShapes[] shapes = new MaterialShapes[0]; public boolean omitItemGen = false; public SmeltingBehavior smeltable = SmeltingBehavior.NOT_SMELTABLE; public int moltenColor = 0xFF4A00; - public NTMMaterial(DictFrame dict) { + public NTMMaterial(int id, DictFrame dict) { this.names = dict.mats; + this.id = id; for(String name : dict.mats) { Mats.matByName.put(name, this); } + + Mats.matById.put(id, this); } /** Shapes for autogen */ diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index fab95b937..fd5ce804d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -22,6 +22,7 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @@ -62,8 +63,39 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro if(!trySmelt()) { this.progress = 0; } + + NBTTagCompound data = new NBTTagCompound(); + int[] rec = new int[recipeStack.size() * 2]; + int[] was = new int[wasteStack.size() * 2]; + for(int i = 0; i < recipeStack.size(); i++) { MaterialStack sta = recipeStack.get(i); rec[i * 2] = sta.material.id; rec[i * 2 + 1] = sta.amount; } + for(int i = 0; i < wasteStack.size(); i++) { MaterialStack sta = wasteStack.get(i); was[i * 2] = sta.material.id; was[i * 2 + 1] = sta.amount; } + data.setIntArray("rec", rec); + data.setIntArray("was", was); + data.setInteger("progress", progress); + data.setInteger("heat", heat); + this.networkPack(data, 25); } } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + + this.recipeStack.clear(); + this.wasteStack.clear(); + + int[] rec = nbt.getIntArray("rec"); + for(int i = 0; i < rec.length / 2; i++) { + recipeStack.add(new MaterialStack(Mats.matById.get(rec[i * 2]), rec[i * 2 + 1])); + } + + int[] was = nbt.getIntArray("was"); + for(int i = 0; i < was.length / 2; i++) { + recipeStack.add(new MaterialStack(Mats.matById.get(was[i * 2]), was[i * 2 + 1])); + } + + this.progress = nbt.getInteger("progress"); + this.heat = nbt.getInteger("heat"); + } protected void tryPullHeat() { TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png index ce81e589dbbbc559938b3856d8752a1bb9c737aa..93ede32354bbc7a5ddabad00bfab28d1065ef555 100644 GIT binary patch literal 11227 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 XdpU%(Q53kX3%RYKr(UjR6ZO9UrOz0f literal 9311 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

Ov z)s1k{lP6}z`u}b2B)wGJmoYctW#B(?gieJE%`|Ju7moD%_T)DT#n2tc(4 zATPs#mEga+MRUmNS9Tx!hhq1wWILjGsR8nz86~!;ove?#X5C1Sg^|~j9KjDsjP5q| z=={$s{Y}I~%b{EEQHou<3t}j9>FiEfihRa|ECxF`wYcL@g9&Wrc8f8Znd(rr0=nnt@ literal 0 HcmV?d00001 From 377108166d92c521f33b9f7e6d2312dafb4d88a6 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 21 Sep 2022 16:43:34 +0200 Subject: [PATCH 072/111] foundry utility block base code, more crucible stuff --- .../java/api/hbm/block/ICrucibleAcceptor.java | 25 +++++++ .../container/ContainerCrucible.java | 11 +-- .../com/hbm/inventory/gui/GUICrucible.java | 53 ++++++++++++- .../hbm/inventory/gui/GUICrystallizer.java | 1 - .../hbm/inventory/gui/GUIFurnaceSteel.java | 1 - .../machine/TileEntityCrucible.java | 28 ++++++- .../machine/TileEntityFoundryBase.java | 70 ++++++++++++++++++ src/main/java/com/hbm/util/InventoryUtil.java | 9 +++ .../gui/processing/gui_crystallizer_alt.png | Bin 2912 -> 2635 bytes 9 files changed, 187 insertions(+), 11 deletions(-) create mode 100644 src/main/java/api/hbm/block/ICrucibleAcceptor.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java diff --git a/src/main/java/api/hbm/block/ICrucibleAcceptor.java b/src/main/java/api/hbm/block/ICrucibleAcceptor.java new file mode 100644 index 000000000..3d7724972 --- /dev/null +++ b/src/main/java/api/hbm/block/ICrucibleAcceptor.java @@ -0,0 +1,25 @@ +package api.hbm.block; + +import com.hbm.inventory.material.Mats.MaterialStack; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public interface ICrucibleAcceptor { + + /* + * Pouring: The metal leaves the channel/crucible and usually (but not always) falls down. The additional double coords give a more precise impact location. + * Also useful for entities like large crucibles since they are filled from the top. + */ + public boolean canAcceptPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + public MaterialStack canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + public void pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + + /* + * Flowing: The "safe" transfer of metal using a channel or other means, usually from block to block and usually horizontally (but not necessarily). + * May also be used for entities like minecarts that could be loaded from the side. + */ + public boolean canAcceptFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); + public MaterialStack canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); + public void flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java index 3f9fb375f..7d7074a47 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java @@ -1,6 +1,7 @@ package com.hbm.inventory.container; import com.hbm.tileentity.machine.TileEntityCrucible; +import com.hbm.util.InventoryUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; @@ -15,16 +16,16 @@ public class ContainerCrucible extends Container { public ContainerCrucible(InventoryPlayer invPlayer, TileEntityCrucible crucible) { this.crucible = crucible; + //template + this.addSlotToContainer(new Slot(crucible, 0, 107, 81)); + //input for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { - this.addSlotToContainer(new Slot(crucible, j + i * 3, 107 + j * 18, 18 + i * 18)); + this.addSlotToContainer(new Slot(crucible, j + i * 3 + 1, 107 + j * 18, 18 + i * 18)); } } - //template - this.addSlotToContainer(new Slot(crucible, 9, 107, 81)); - for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 132 + i * 18)); @@ -52,7 +53,7 @@ public class ContainerCrucible extends Container { slot.onSlotChange(originalStack, stack); - } else if(!this.mergeItemStack(originalStack, 0, 10, false)) { + } else if(!InventoryUtil.mergeItemStack(this.inventorySlots, originalStack, 0, 10, false)) { return null; } diff --git a/src/main/java/com/hbm/inventory/gui/GUICrucible.java b/src/main/java/com/hbm/inventory/gui/GUICrucible.java index a41d3c199..959394c0e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrucible.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrucible.java @@ -1,17 +1,22 @@ package com.hbm.inventory.gui; +import java.awt.Color; +import java.util.ArrayList; import java.util.List; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCrucible; +import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCrucible; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; public class GUICrucible extends GuiInfoContainer { @@ -30,6 +35,12 @@ public class GUICrucible extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { super.drawScreen(x, y, interp); + + drawStackInfo(crucible.wasteStack, x, y, 16, 17); + drawStackInfo(crucible.recipeStack, x, y, 61, 17); + + this.drawCustomInfoStat(x, y, guiLeft + 125, guiTop + 81, 34, 7, x, y, new String[] { String.format("%,d", crucible.progress) + " / " + String.format("%,d", crucible.processTime) + "TU" }); + this.drawCustomInfoStat(x, y, guiLeft + 125, guiTop + 90, 34, 7, x, y, new String[] { String.format("%,d", crucible.heat) + " / " + String.format("%,d", crucible.maxHeat) + "TU" }); } @Override @@ -51,11 +62,47 @@ public class GUICrucible extends GuiInfoContainer { int hGauge = crucible.heat * 33 / crucible.maxHeat; if(hGauge > 0) drawTexturedModalRect(guiLeft + 126, guiTop + 91, 176, 5, hGauge, 5); - if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, 62, 97); - if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, 17, 97); + if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, crucible.recipeCapacity, 62, 97); + if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, crucible.wasteCapacity, 17, 97); } - protected void drawStack(List stack, int x, int y) { + protected void drawStackInfo(List stack, int mouseX, int mouseY, int x, int y) { + List list = new ArrayList(); + + if(stack.isEmpty()) + list.add(EnumChatFormatting.RED + "Empty"); + + for(MaterialStack sta : stack) { + list.add(EnumChatFormatting.YELLOW + sta.material.names[0] + ": " + Mats.formatAmount(sta.amount)); + } + + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + x, guiTop + y, 36, 81, mouseX, mouseY, list); + } + + protected void drawStack(List stack, int capacity, int x, int y) { + + if(stack.isEmpty()) return; + + int lastHeight = 0; + int lastQuant = 0; + + for(MaterialStack sta : stack) { + + int targetHeight = (lastQuant + sta.amount) * 79 / capacity; + + if(lastHeight == targetHeight) continue; //skip draw calls that would be 0 pixels high + + int offset = sta.material.smeltable == SmeltingBehavior.ADDITIVE ? 34 : 0; //additives use a differnt texture + + Color color = new Color(sta.material.moltenColor); + GL11.glColor3f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + drawTexturedModalRect(guiLeft + x, guiTop + y - targetHeight, 176 + offset, 89 - targetHeight, 34, targetHeight - lastHeight); + + lastQuant += sta.amount; + lastHeight = targetHeight; + } + + GL11.glColor3f(255, 255, 255); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java b/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java index 6f1a1d418..e9b03cea8 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java @@ -3,7 +3,6 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCrystallizer; -import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineCrystallizer; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIFurnaceSteel.java b/src/main/java/com/hbm/inventory/gui/GUIFurnaceSteel.java index cad0be5e6..a7dcb6eb8 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFurnaceSteel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFurnaceSteel.java @@ -32,7 +32,6 @@ public class GUIFurnaceSteel extends GuiInfoContainer { this.drawCustomInfoStat(x, y, guiLeft + 53, guiTop + 17 + 18 * i, 70, 7, x, y, new String[] { String.format("%,d", furnace.progress[i]) + " / " + String.format("%,d", furnace.processTime) + "TU" }); this.drawCustomInfoStat(x, y, guiLeft + 53, guiTop + 26 + 18 * i, 70, 7, x, y, new String[] { "Bonus: " + furnace.bonus[i] + "%" }); } - //this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 44, 71, 7, x, y, new String[] { (furnace.burnTime / 20) + "s" }); this.drawCustomInfoStat(x, y, guiLeft + 151, guiTop + 18, 9, 50, x, y, new String[] { String.format("%,d", furnace.heat) + " / " + String.format("%,d", furnace.maxHeat) + "TU" }); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index fd5ce804d..d16a8a914 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -19,6 +19,7 @@ import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; @@ -60,6 +61,31 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro if(!worldObj.isRemote) { tryPullHeat(); + if(worldObj.getTotalWorldTime() % 5 == 0) { + List list = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord + 0.5, zCoord - 0.5, xCoord + 1.5, yCoord + 1, zCoord + 1.5)); + + for(EntityItem item : list) { + ItemStack stack = item.getEntityItem(); + if(this.isItemSmeltable(stack)) { + + for(int i = 1; i < 10; i++) { + if(slots[i] == null) { + + if(stack.stackSize == 1) { + slots[i] = stack.copy(); + } else { + slots[i] = stack.copy(); + slots[i].stackSize = 1; + stack.stackSize--; + } + + this.markChanged(); + } + } + } + } + } + if(!trySmelt()) { this.progress = 0; } @@ -90,7 +116,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro int[] was = nbt.getIntArray("was"); for(int i = 0; i < was.length / 2; i++) { - recipeStack.add(new MaterialStack(Mats.matById.get(was[i * 2]), was[i * 2 + 1])); + wasteStack.add(new MaterialStack(Mats.matById.get(was[i * 2]), was[i * 2 + 1])); } this.progress = nbt.getInteger("progress"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java new file mode 100644 index 000000000..5b4aa28ae --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java @@ -0,0 +1,70 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.NTMMaterial; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; + +/** + * Base class for all foundry channel type blocks - channels, casts, basins, tanks, etc. + * Foundry type blocks can only hold one type at a time and usually either store or move it around. + * @author hbm + * + */ +public abstract class TileEntityFoundryBase extends TileEntity { + + public NTMMaterial type; + protected NTMMaterial lastType; + public int amount; + protected int lastAmount; + + @Override + public void updateEntity() { + + if(worldObj.isRemote) { + + if(this.lastType != this.type || this.lastAmount != this.amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + this.lastType = this.type; + this.lastAmount = this.amount; + } + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.type = Mats.matById.get(nbt.getInteger("type")); + this.amount = nbt.getInteger("amount"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + if(this.type == null) + nbt.setInteger("type", -1); + else + nbt.setInteger("type", this.type.id); + + nbt.setInteger("amount", this.amount); + } + + public abstract int getCapacity(); +} diff --git a/src/main/java/com/hbm/util/InventoryUtil.java b/src/main/java/com/hbm/util/InventoryUtil.java index 8132c728a..492ce36f2 100644 --- a/src/main/java/com/hbm/util/InventoryUtil.java +++ b/src/main/java/com/hbm/util/InventoryUtil.java @@ -448,6 +448,15 @@ public class InventoryUtil { return true; } + /** + * A fixed re-implementation of the original Container.mergeItemStack that repects stack size and slot restrictions. + * @param slots + * @param stack + * @param start + * @param end + * @param reverse + * @return + */ public static boolean mergeItemStack(List slots, ItemStack stack, int start, int end, boolean reverse) { boolean success = false; diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crystallizer_alt.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crystallizer_alt.png index a427d1652dff3da7237ecb8c85b4b880acc396ee..ae0884951f3620178de4a4653b06c3bf13375093 100644 GIT binary patch literal 2635 zcmb7Fdpy)x8$UCKnPl9<&ZMEskQ8}P-z>?b zlC;Pwa>=c=ED4P#*$ieXK)k1$5P~mnb+%T}jV0>=^AdfuZaK!D}z4_td+ZWH_&|?#Y zXTI@2@2x?_o*@0cP2c0_&jsGdc6m+HGmnVg+ant*0_EGP4Z9E*gE)6QjD3@wa6UWs zg;1mkMXj>KIek$jwhMe~zLiqYoWJL2^{V9EGAw&*%jI1{t~QL$tnjDi*J7CKFP2+g z3zr=~Om@}}y^@yRmVDp3s{AuwBJJc%3d%i=5^ruAQjB6W9 zm(Ck%L_3bOx3~9}22_2UG*}t>qj~5^gevm#LUJ0=T4m~Yys~0ebVsb7wqf!Yzc!U# zt%?y&^@nH_u!A1+W_&Vtg=2=Y5R`N2>FIVD-M3S#&i;yw)U`PP1AhWMEU8(8&b()?Q+X(4!nBx7B|+bDXG)uHJ2v-RnYP^ z=z6AUVDpi%lFG zmdFSlw81a=WT=`18B!uSe;yklFt58;Oa4r#N#n-+gJ%~Fq;RGlO zakF0^$qFR8M4J9u;}1+=XDf;kZokMAew)5KDbs;w&&;vA1?bQ;3hr z5HbDIXbbw*dy^D!oKEaoPo~(M&rC0rVf{&l@;ec}{IArYGT8gZh46*qo$KXbSnIbwgR$ki!E93c{s6)zop$z)2{dw0;3EAO({k6Vp4t0D3S3 z>urr1zzL$PBRx|e=%516@@_#Mq7{u|L**;nZjte$}Vt4QR0Zti-UZE3;Ig#Zoma{ z*;A%V6rl?zs|iQJo7#FLTY@hy3k^YppE|-Nk~nstV(c^=8;1kFW87 zJDKWwfPh{Y5RS%G@~s+UQ*c%_r&mc-*G`xq)|_>7ZF{yl1EhXWXfW$F3OobX%KKI& z`c0T0&KLP129OYi1(Cq?rM_QSaLlLo9_uA{xJMBx(0B|#yKgMjeRE5Bxc|bfW9f~O zZBLO&PDfLOC4D-j72k6bcyY-#j*gBmu2Z;Un7%)fM zs5bgyy7Ow)&?}Fq0tz`{JJ=)IIC!`HN<_p*Gt_Uk+v69ohk%{_cbkSlZkEiNql!HOf*vyT4|tA;K_TEsTsGlXz4;J-uA>sT}jr3J)dp1?CD>iC{A~Z>LqE-I3=$To+sO@L9L$R9SI`z4rSM z4~Zl&4*rd|1R~=PBcf~M^;?Lnq*}3I1MRUi`Hk~eg4k^K z(#G<{fKq0z;`0l|RNcfJFQo+s9Y&Ii9&>kBf4@6MH?i4Ar75rejoV+aUCyf| znKEA{2ezq!JI095f$-gTEE7uYqwirJy&L0Ms1#Z|qs{~@G45e{b_IVf+1BZL$fu+Y z%NGGt$rNJ;XA~{{?*CYx=iY*xWvKxe#>x{Ud*>76GkB%Olfj97V6PLPG@(8R-ac)Z zRj5;(4>K_C4l}qCUW@woDs>F{Kj!(@YT9Kv5i>Z=%{TNkRWmvOk-sp^TeD*+Y==5p pZR4MLmLS{MqEGeoS);KJ6X?sT>>Wa?6mD%ian#wN#LoMNe*i^SiFE(~ literal 2912 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

Ov z)s1k{lP6}z`u}b2B)wGJmoYctW#B(?gieJE%`|Ju7moD%_T)DT#n2tc(4 zATPs#mEga+MRUmNS9Tx!hhq1wWILjGsR8nz86~!;ove?#X5C1Sg^|~j9KjDsjP5q| z=={$s{Y}I~%b{EEQHou<3t}j9>FiEfihRa|ECxF`wYcL@g9&Wrc8f8Znd(rr0=nnt@ From 4479b8bcb9a72e904f0145a2a9e47a46926941c6 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 21 Sep 2022 23:08:08 +0200 Subject: [PATCH 073/111] glowier molten materials, mat colors --- .../java/com/hbm/inventory/gui/GUICrucible.java | 14 ++++++++++++-- .../java/com/hbm/inventory/material/Mats.java | 16 ++++++++-------- .../tileentity/machine/TileEntityCrucible.java | 8 ++++++-- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUICrucible.java b/src/main/java/com/hbm/inventory/gui/GUICrucible.java index 959394c0e..65b7dfdb8 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrucible.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrucible.java @@ -14,6 +14,7 @@ import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCrucible; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.EnumChatFormatting; @@ -87,6 +88,8 @@ public class GUICrucible extends GuiInfoContainer { int lastHeight = 0; int lastQuant = 0; + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + for(MaterialStack sta : stack) { int targetHeight = (lastQuant + sta.amount) * 79 / capacity; @@ -95,14 +98,21 @@ public class GUICrucible extends GuiInfoContainer { int offset = sta.material.smeltable == SmeltingBehavior.ADDITIVE ? 34 : 0; //additives use a differnt texture - Color color = new Color(sta.material.moltenColor); + int hex = sta.material.moltenColor; + //hex = 0xC18336; + Color color = new Color(hex); GL11.glColor3f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); drawTexturedModalRect(guiLeft + x, guiTop + y - targetHeight, 176 + offset, 89 - targetHeight, 34, targetHeight - lastHeight); + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1F, 1F, 1F, 0.3F); + drawTexturedModalRect(guiLeft + x, guiTop + y - targetHeight, 176 + offset, 89 - targetHeight, 34, targetHeight - lastHeight); + GL11.glDisable(GL11.GL_BLEND); lastQuant += sta.amount; lastHeight = targetHeight; } - + + OpenGlHelper.glBlendFunc(770, 771, 1, 0); GL11.glColor3f(255, 255, 255); } } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 5c812dbed..758d8ca42 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -43,16 +43,16 @@ public class Mats { public static final int _AS = 30; //Vanilla and vanilla-like - public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0); - public static final NTMMaterial MAT_COAL = makeAdditive( 1400, COAL, 0); - public static final NTMMaterial MAT_LIGNITE = makeAdditive( 1401, LIGNITE, 0); + public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0x4D2F23); + public static final NTMMaterial MAT_COAL = makeAdditive( 1400, COAL, 0x583434); + public static final NTMMaterial MAT_LIGNITE = makeAdditive( 1401, LIGNITE, 0x715444); public static final NTMMaterial MAT_COALCOKE = makeAdditive( 1410, COALCOKE, 0); public static final NTMMaterial MAT_PETCOKE = makeAdditive( 1411, PETCOKE, 0); public static final NTMMaterial MAT_LIGCOKE = makeAdditive( 1412, LIGCOKE, 0); public static final NTMMaterial MAT_GRAPHITE = makeAdditive( 1420, GRAPHITE, 0); - public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0).omitAutoGen(); - public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0).omitAutoGen(); - public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0).omitAutoGen(); + public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0xFFA259).omitAutoGen(); + public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0xE8D754).omitAutoGen(); + public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0x7A0300).omitAutoGen(); //Radioactive public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); @@ -61,8 +61,8 @@ public class Mats { public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); //Base metals - public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0).setShapes(INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xA99E79).setShapes(INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xC18336).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0).setShapes(WIRE, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index d16a8a914..672beb8a2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -271,12 +271,16 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } public int getQuantaFromType(List stacks, NTMMaterial mat) { + int sum = 0; for(MaterialStack stack : stacks) { - if(mat == null || stack.material == mat) { + if(stack.material == mat) { return stack.amount; } + if(mat == null) { + return sum += stack.amount; + } } - return 0; + return sum; } @Override From 90299bd1ba1da6d12416681d1c6b4e54876c49a6 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 22 Sep 2022 16:54:37 +0200 Subject: [PATCH 074/111] foundry basin, updated crucible block API --- .../java/api/hbm/block/ICrucibleAcceptor.java | 12 ++-- src/main/java/com/hbm/blocks/ModBlocks.java | 4 ++ .../com/hbm/blocks/machine/FoundryBasin.java | 54 +++++++++++++++++ .../java/com/hbm/main/ModEventHandler.java | 2 +- .../machine/TileEntityFoundryBase.java | 10 +++- .../machine/TileEntityFoundryBasin.java | 60 +++++++++++++++++++ 6 files changed, 133 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/FoundryBasin.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java diff --git a/src/main/java/api/hbm/block/ICrucibleAcceptor.java b/src/main/java/api/hbm/block/ICrucibleAcceptor.java index 3d7724972..0f140f941 100644 --- a/src/main/java/api/hbm/block/ICrucibleAcceptor.java +++ b/src/main/java/api/hbm/block/ICrucibleAcceptor.java @@ -11,15 +11,15 @@ public interface ICrucibleAcceptor { * Pouring: The metal leaves the channel/crucible and usually (but not always) falls down. The additional double coords give a more precise impact location. * Also useful for entities like large crucibles since they are filled from the top. */ - public boolean canAcceptPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); - public MaterialStack canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); - public void pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + //public boolean canAcceptPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); /* * Flowing: The "safe" transfer of metal using a channel or other means, usually from block to block and usually horizontally (but not necessarily). * May also be used for entities like minecarts that could be loaded from the side. */ - public boolean canAcceptFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); - public MaterialStack canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); - public void flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); + //public boolean canAcceptFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f3f2e043a..1ea3b62cb 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -639,6 +639,8 @@ public class ModBlocks { public static Block machine_sawmill; public static Block machine_crucible; + public static Block foundry_basin; + public static Block machine_difurnace_off; public static Block machine_difurnace_on; public static Block machine_difurnace_rtg_off; @@ -1820,6 +1822,8 @@ public class ModBlocks { machine_sawmill = new MachineSawmill().setBlockName("machine_sawmill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_crucible"); + foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":foundry_basin"); + machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); machine_difurnace_rtg_off = new MachineDiFurnaceRTG(false).setBlockName("machine_difurnace_rtg_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java new file mode 100644 index 000000000..81b55214c --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java @@ -0,0 +1,54 @@ +package com.hbm.blocks.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.tileentity.machine.TileEntityFoundryBasin; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryBasin extends BlockContainer implements ICrucibleAcceptor { + + public FoundryBasin() { + super(Material.rock); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryBasin(); + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryBasin) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryBasin) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } +} diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index f0f346ffc..177ec8055 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -1336,7 +1336,7 @@ public class ModEventHandler { private static final String hash = "41eb77f138ce350932e33b6b26b233df9aad0c0c80c6a49cb9a54ddd8fae3f83"; - @SubscribeEvent + //@SubscribeEvent public void onClickSign(PlayerInteractEvent event) { int x = event.x; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java index 5b4aa28ae..ebb1e4c88 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.NTMMaterial; +import api.hbm.block.ICrucibleAcceptor; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; @@ -15,7 +16,7 @@ import net.minecraft.tileentity.TileEntity; * @author hbm * */ -public abstract class TileEntityFoundryBase extends TileEntity { +public abstract class TileEntityFoundryBase extends TileEntity implements ICrucibleAcceptor { public NTMMaterial type; protected NTMMaterial lastType; @@ -27,13 +28,18 @@ public abstract class TileEntityFoundryBase extends TileEntity { if(worldObj.isRemote) { - if(this.lastType != this.type || this.lastAmount != this.amount) { + if(shouldClientReRender() && this.lastType != this.type || this.lastAmount != this.amount) { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); this.lastType = this.type; this.lastAmount = this.amount; } } } + + /** Recommended FALSE for things that update a whole lot. TRUE if updates only happen once every few ticks. */ + protected boolean shouldClientReRender() { + return true; + } @Override public Packet getDescriptionPacket() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java new file mode 100644 index 000000000..212218f1e --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java @@ -0,0 +1,60 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats.MaterialStack; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; + +public class TileEntityFoundryBasin extends TileEntityFoundryBase { + + @Override + public int getCapacity() { + return MaterialShapes.BLOCK.q(1); + } + + @Override + public void updateEntity() { + super.updateEntity(); + + //TODO: cool off + } + + //TODO: move to block + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + + if(side != ForgeDirection.UP) return false; //reject from any direction other than the top + if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material + + for(String name : stack.material.names) { + String od = "block" + name; + + if(!OreDictionary.getOres(od).isEmpty()) { + return true; //at least one block for this material? return TRUE + } + } + + return false; //no OD match -> no pouring + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + + if(stack.amount + this.amount <= this.getCapacity()) { + this.amount += stack.amount; + return null; + } + + int required = this.getCapacity() - this.amount; + this.amount = this.getCapacity(); + + stack.amount -= required; + + return stack; + } + + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } +} From 428cd342bdc2e32dbb0285fcfe732b2d42cdfe02 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 25 Sep 2022 00:26:45 +0200 Subject: [PATCH 075/111] the mcdonalds among us meal --- src/main/java/com/hbm/blocks/ModBlocks.java | 9 +- .../com/hbm/blocks/machine/FoundryBasin.java | 26 ++ .../hbm/blocks/machine/FoundryChannel.java | 101 +++++ .../com/hbm/blocks/machine/FoundryMold.java | 87 ++++ .../hbm/blocks/machine/MachineDiFurnace.java | 2 - .../java/com/hbm/crafting/MineralRecipes.java | 4 + .../com/hbm/crafting/SmeltingRecipes.java | 1 + src/main/java/com/hbm/items/ModItems.java | 6 + src/main/java/com/hbm/main/ClientProxy.java | 7 + .../com/hbm/render/block/RenderBasin.java | 101 +++++ .../com/hbm/render/block/RenderChannel.java | 382 ++++++++++++++++++ .../java/com/hbm/render/block/RenderMold.java | 101 +++++ .../hbm/render/tileentity/RenderCrucible.java | 8 + .../hbm/render/tileentity/RenderFoundry.java | 72 ++++ .../java/com/hbm/tileentity/TileMappings.java | 4 + .../tileentity/machine/IRenderFoundry.java | 14 + .../machine/TileEntityCrucible.java | 44 ++ .../machine/TileEntityFoundryBasin.java | 38 +- .../machine/TileEntityFoundryChannel.java | 158 ++++++++ .../machine/TileEntityFoundryMold.java | 128 ++++++ .../hbm/textures/blocks/foundry_basin.png | Bin 0 -> 651 bytes .../textures/blocks/foundry_basin_bottom.png | Bin 0 -> 515 bytes .../textures/blocks/foundry_basin_inner.png | Bin 0 -> 533 bytes .../textures/blocks/foundry_basin_side.png | Bin 0 -> 599 bytes .../hbm/textures/blocks/foundry_basin_top.png | Bin 0 -> 466 bytes .../blocks/foundry_channel_bottom.png | Bin 0 -> 515 bytes .../textures/blocks/foundry_channel_inner.png | Bin 0 -> 329 bytes .../textures/blocks/foundry_channel_side.png | Bin 0 -> 319 bytes .../textures/blocks/foundry_channel_top.png | Bin 0 -> 523 bytes .../textures/blocks/foundry_mold_bottom.png | Bin 0 -> 515 bytes .../textures/blocks/foundry_mold_inner.png | Bin 0 -> 329 bytes .../hbm/textures/blocks/foundry_mold_side.png | Bin 0 -> 319 bytes .../hbm/textures/blocks/foundry_mold_top.png | Bin 0 -> 466 bytes .../assets/hbm/textures/blocks/lava_gray.png | Bin 0 -> 751 bytes .../hbm/textures/items/ball_fireclay.png | Bin 0 -> 425 bytes .../hbm/textures/items/ingot_firebrick.png | Bin 0 -> 403 bytes .../textures/models/machines/lava_gray.png | Bin 0 -> 751 bytes 37 files changed, 1288 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/FoundryChannel.java create mode 100644 src/main/java/com/hbm/blocks/machine/FoundryMold.java create mode 100644 src/main/java/com/hbm/render/block/RenderBasin.java create mode 100644 src/main/java/com/hbm/render/block/RenderChannel.java create mode 100644 src/main/java/com/hbm/render/block/RenderMold.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderFoundry.java create mode 100644 src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_basin.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_basin_bottom.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_basin_inner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_basin_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_basin_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_channel_bottom.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_channel_inner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_channel_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_channel_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_mold_bottom.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_mold_inner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_mold_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_mold_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/lava_gray.png create mode 100644 src/main/resources/assets/hbm/textures/items/ball_fireclay.png create mode 100644 src/main/resources/assets/hbm/textures/items/ingot_firebrick.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/lava_gray.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 1ea3b62cb..9c1a06c9e 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -638,8 +638,10 @@ public class ModBlocks { public static Block machine_stirling_steel; public static Block machine_sawmill; public static Block machine_crucible; - + + public static Block foundry_mold; public static Block foundry_basin; + public static Block foundry_channel; public static Block machine_difurnace_off; public static Block machine_difurnace_on; @@ -1822,7 +1824,9 @@ public class ModBlocks { machine_sawmill = new MachineSawmill().setBlockName("machine_sawmill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_crucible"); + foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":foundry_mold"); foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":foundry_basin"); + foundry_channel = new FoundryChannel().setBlockName("foundry_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":foundry_channel"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); @@ -3015,6 +3019,9 @@ public class ModBlocks { register(machine_stirling_steel); register(machine_sawmill); register(machine_crucible); + register(foundry_mold); + register(foundry_basin); + register(foundry_channel); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_rtg_off, machine_difurnace_rtg_off.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java index 81b55214c..5b05e610b 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java @@ -1,21 +1,47 @@ package com.hbm.blocks.machine; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFoundryBasin; import api.hbm.block.ICrucibleAcceptor; import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class FoundryBasin extends BlockContainer implements ICrucibleAcceptor { + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + public FoundryBasin() { super(Material.rock); } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_inner"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } @Override public TileEntity createNewTileEntity(World world, int meta) { diff --git a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java new file mode 100644 index 000000000..f4103c90d --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java @@ -0,0 +1,101 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryChannel; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + @SideOnly(Side.CLIENT) public IIcon iconLava; + + public FoundryChannel() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_inner"); + this.iconLava = iconRegister.registerIcon(RefStrings.MODID + ":lava_gray"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryChannel(); + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + } + + public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir) { + + if(dir == ForgeDirection.UP || dir == ForgeDirection.DOWN || dir == ForgeDirection.UNKNOWN) + return false; + + Block b = world.getBlock(x + dir.offsetX, y, z + dir.offsetZ); + + return b == ModBlocks.foundry_channel || b == ModBlocks.foundry_mold; + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/FoundryMold.java b/src/main/java/com/hbm/blocks/machine/FoundryMold.java new file mode 100644 index 000000000..26edda4e5 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryMold.java @@ -0,0 +1,87 @@ +package com.hbm.blocks.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryMold; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryMold extends BlockContainer implements ICrucibleAcceptor { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + + public FoundryMold() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_inner"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryMold(); + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryMold) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryMold) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryMold) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryMold) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineDiFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineDiFurnace.java index 6696b38e3..c99c41064 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineDiFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineDiFurnace.java @@ -28,7 +28,6 @@ import net.minecraft.world.World; public class MachineDiFurnace extends BlockContainer { private final Random field_149933_a = new Random(); - private Random rand; private final boolean isActive; private static boolean keepInventory; @@ -39,7 +38,6 @@ public class MachineDiFurnace extends BlockContainer { public MachineDiFurnace(boolean blockState) { super(Material.iron); - rand = new Random(); isActive = blockState; } diff --git a/src/main/java/com/hbm/crafting/MineralRecipes.java b/src/main/java/com/hbm/crafting/MineralRecipes.java index 08bf58939..e0a7f7179 100644 --- a/src/main/java/com/hbm/crafting/MineralRecipes.java +++ b/src/main/java/com/hbm/crafting/MineralRecipes.java @@ -5,6 +5,8 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRTGPelletDepleted.DepletedRTGMaterial; import com.hbm.items.special.ItemWasteLong; import com.hbm.items.special.ItemWasteShort; +import com.hbm.main.CraftingManager; + import static com.hbm.inventory.OreDictManager.*; import cpw.mods.fml.common.registry.GameRegistry; @@ -432,6 +434,8 @@ public class MineralRecipes { GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.ingot_pu_mix, 1), new Object[] { "tinyPu239", "tinyPu239", "tinyPu239", "tinyPu239", "tinyPu239", "tinyPu239", "tinyPu240", "tinyPu240", "tinyPu240" })); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.ingot_am_mix, 1), new Object[] { "nuggetAmericium241", "nuggetAmericium241", "nuggetAmericium241", "nuggetAmericium242", "nuggetAmericium242", "nuggetAmericium242", "nuggetAmericium242", "nuggetAmericium242", "nuggetAmericium242" })); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.ingot_am_mix, 1), new Object[] { "tinyAm241", "tinyAm241", "tinyAm241", "tinyAm242", "tinyAm242", "tinyAm242", "tinyAm242", "tinyAm242", "tinyAm242" })); + + CraftingManager.addShapelessAuto(new ItemStack(ModItems.ball_fireclay, 4), new Object[] { Items.clay_ball, Items.clay_ball, Items.clay_ball, AL.dust() }); } //Bundled 1/9 recipes diff --git a/src/main/java/com/hbm/crafting/SmeltingRecipes.java b/src/main/java/com/hbm/crafting/SmeltingRecipes.java index 69ad39366..202457866 100644 --- a/src/main/java/com/hbm/crafting/SmeltingRecipes.java +++ b/src/main/java/com/hbm/crafting/SmeltingRecipes.java @@ -110,6 +110,7 @@ public class SmeltingRecipes { GameRegistry.addSmelting(ModItems.rag_damp, new ItemStack(ModItems.rag), 0.1F); GameRegistry.addSmelting(ModItems.rag_piss, new ItemStack(ModItems.rag), 0.1F); GameRegistry.addSmelting(DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.TOBACCO), DictFrame.fromOne(ModItems.plant_item, EnumPlantType.TOBACCO), 0.1F); + GameRegistry.addSmelting(ModItems.ball_fireclay, new ItemStack(ModItems.ingot_firebrick), 0.1F); //GameRegistry.addSmelting(Items.bone, new ItemStack(Items.slime_ball, 3), 0.0F); //GameRegistry.addSmelting(new ItemStack(Items.dye, 1, 15), new ItemStack(Items.slime_ball, 1), 0.0F); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 703e05aa6..8d3f1e0fb 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -147,6 +147,7 @@ public class ModItems { public static Item ingot_c4; public static Item ingot_boron; public static Item ingot_graphite; + public static Item ingot_firebrick; public static Item ingot_smore; public static Item ingot_gh336; @@ -1207,6 +1208,7 @@ public class ModItems { public static Item ballistite; public static Item ball_dynamite; public static Item ball_tnt; + public static Item ball_fireclay; public static Item pellet_cluster; public static Item powder_fire; @@ -2641,6 +2643,7 @@ public class ModItems { ingot_cobalt = new Item().setUnlocalizedName("ingot_cobalt").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_cobalt"); ingot_boron = new Item().setUnlocalizedName("ingot_boron").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_boron"); ingot_graphite = new Item().setUnlocalizedName("ingot_graphite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_graphite"); + ingot_firebrick = new Item().setUnlocalizedName("ingot_firebrick").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_firebrick"); ingot_smore = new ItemFood(10, 20F, false).setUnlocalizedName("ingot_smore").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_smore"); sulfur = new Item().setUnlocalizedName("sulfur").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":sulfur"); @@ -3992,6 +3995,7 @@ public class ModItems { ballistite = new Item().setUnlocalizedName("ballistite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ballistite"); ball_dynamite = new Item().setUnlocalizedName("ball_dynamite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ball_dynamite"); ball_tnt = new Item().setUnlocalizedName("ball_tnt").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ball_tnt"); + ball_fireclay = new Item().setUnlocalizedName("ball_fireclay").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ball_fireclay"); pellet_gas = new ItemCustomLore().setUnlocalizedName("pellet_gas").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellet_gas"); magnetron = new ItemCustomLore().setUnlocalizedName("magnetron").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":magnetron_alt"); pellet_buckshot = new Item().setUnlocalizedName("pellet_buckshot").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellets_lead"); @@ -5807,6 +5811,7 @@ public class ModItems { GameRegistry.registerItem(ingot_cobalt, ingot_cobalt.getUnlocalizedName()); GameRegistry.registerItem(ingot_boron, ingot_boron.getUnlocalizedName()); GameRegistry.registerItem(ingot_graphite, ingot_graphite.getUnlocalizedName()); + GameRegistry.registerItem(ingot_firebrick, ingot_firebrick.getUnlocalizedName()); GameRegistry.registerItem(ingot_dura_steel, ingot_dura_steel.getUnlocalizedName()); GameRegistry.registerItem(ingot_polymer, ingot_polymer.getUnlocalizedName()); GameRegistry.registerItem(ingot_bakelite, ingot_bakelite.getUnlocalizedName()); @@ -6048,6 +6053,7 @@ public class ModItems { GameRegistry.registerItem(ballistite, ballistite.getUnlocalizedName()); GameRegistry.registerItem(ball_dynamite, ball_dynamite.getUnlocalizedName()); GameRegistry.registerItem(ball_tnt, ball_tnt.getUnlocalizedName()); + GameRegistry.registerItem(ball_fireclay, ball_fireclay.getUnlocalizedName()); //Crystals GameRegistry.registerItem(crystal_coal, crystal_coal.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 62d6468a3..8cc2be030 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -265,6 +265,9 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityStirling.class, new RenderStirling()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySawmill.class, new RenderSawmill()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrucible.class, new RenderCrucible()); + //Foundry + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryBasin.class, new RenderFoundry()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryMold.class, new RenderFoundry()); //AMS ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSBase.class, new RenderAMSBase()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSEmitter.class, new RenderAMSEmitter()); @@ -740,6 +743,10 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderDiode()); RenderingRegistry.registerBlockHandler(new RenderBoxDuct()); RenderingRegistry.registerBlockHandler(new RenderBlockDecoModel(ModBlocks.deco_computer.getRenderType(), ResourceManager.deco_computer)); + + RenderingRegistry.registerBlockHandler(new RenderBasin()); + RenderingRegistry.registerBlockHandler(new RenderMold()); + RenderingRegistry.registerBlockHandler(new RenderChannel()); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite)); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4)); diff --git a/src/main/java/com/hbm/render/block/RenderBasin.java b/src/main/java/com/hbm/render/block/RenderBasin.java new file mode 100644 index 000000000..a13e97ca4 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderBasin.java @@ -0,0 +1,101 @@ +package com.hbm.render.block; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.FoundryBasin; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +public class RenderBasin implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + FoundryBasin basin = (FoundryBasin) block; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryBasin basin = (FoundryBasin) block; + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryBasin.renderID; + } +} diff --git a/src/main/java/com/hbm/render/block/RenderChannel.java b/src/main/java/com/hbm/render/block/RenderChannel.java new file mode 100644 index 000000000..3ae945e39 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderChannel.java @@ -0,0 +1,382 @@ +package com.hbm.render.block; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.FoundryChannel; +import com.hbm.lib.Library; +import com.hbm.tileentity.machine.TileEntityFoundryChannel; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public class RenderChannel implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + double height = 0.5D; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + FoundryChannel channel = (FoundryChannel) block; + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + + //center + renderer.setRenderBounds(0.375D, 0D, 0.375D, 0.625D, 0.125D, 0.625D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + renderer.setRenderBounds(0.3125D, 0D, 0.3125D, 0.6875D, 0.125D, 0.6875D); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + //pos X bottom + renderer.setRenderBounds(0.625D, 0D, 0.3125D, 1D, 0.125D, 0.6875D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + //pos X + renderer.setRenderBounds(0.625D, 0D, 0.3125D, 1D, height, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + renderer.setRenderBounds(0.625D, 0D, 0.625D, 1D, height, 0.6875D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + //neg x bottom + renderer.setRenderBounds(0D, 0D, 0.3125D, 0.375D, 0.125D, 0.6875D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + + //neg x + renderer.setRenderBounds(0D, 0D, 0.3125D, 0.375D, height, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + + renderer.setRenderBounds(0D, 0D, 0.625D, 0.375D, height, 0.6875D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + + //pos Z bottom + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.6875D, 0.125D, 1D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + //pos z + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.375D, height, 1D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + renderer.setRenderBounds(0.625D, 0D, 0.625D, 0.6875D, height, 1D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + //neg z bottom + renderer.setRenderBounds(0.3125D, 0D, 0D, 0.6875D, 0.125D, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + + //neg z + renderer.setRenderBounds(0.3125D, 0D, 0D, 0.375D, height, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + + renderer.setRenderBounds(0.625D, 0D, 0D, 0.6875D, height, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryChannel channel = (FoundryChannel) block; + + TileEntity te = world.getTileEntity(x, y, z); + TileEntityFoundryChannel tile = null; + + if(te instanceof TileEntityFoundryChannel) { + tile = (TileEntityFoundryChannel) te; + } + + boolean doRender = tile != null ? (tile.amount > 0 && tile.type != null) : false; + double level = doRender ? tile.amount * 0.25D / tile.getCapacity() : 0; + Color color = doRender ? new Color(tile.type.moltenColor).brighter() : null; + + boolean posX = channel.canConnectTo(world, x, y, z, Library.POS_X); + boolean negX = channel.canConnectTo(world, x, y, z, Library.NEG_X); + boolean posZ = channel.canConnectTo(world, x, y, z, Library.POS_Z); + boolean negZ = channel.canConnectTo(world, x, y, z, Library.NEG_Z); + + double height = 0.5D; + + renderer.setRenderBounds(0.375D, 0D, 0.375D, 0.625D, 0.125D, 0.625D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + renderer.setRenderBounds(0.3125D, 0D, 0.3125D, 0.6875D, 0.125D, 0.6875D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + if(doRender) { + renderer.setRenderBounds(0.375D, 0.125D, 0.375D, 0.625D, 0.125D + level, 0.625D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + } + + if(posX) { + renderer.setRenderBounds(0.625D, 0D, 0.3125D, 1D, 0.125D, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + renderer.setRenderBounds(0.625D, 0D, 0.3125D, 1D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + + renderer.setRenderBounds(0.625D, 0D, 0.625D, 1D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + if(doRender) { + renderer.setRenderBounds(0.625D, 0.125D, 0.3125D, 1D, 0.125D + level, 0.6875D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + renderer.renderFaceXPos(block, x, y, z, channel.iconLava); + } + + } else { + renderer.setRenderBounds(0.625, 0D, 0.3125D, 0.6875D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + } + + if(negX) { + renderer.setRenderBounds(0D, 0D, 0.3125D, 0.375D, 0.125D, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + renderer.setRenderBounds(0D, 0D, 0.3125D, 0.375D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + + renderer.setRenderBounds(0D, 0D, 0.625D, 0.375D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + if(doRender) { + renderer.setRenderBounds(0D, 0.125D, 0.3125D, 0.375D, 0.125D + level, 0.6875D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + renderer.renderFaceXNeg(block, x, y, z, channel.iconLava); + } + + } else { + renderer.setRenderBounds(0.3125D, 0D, 0.3125D, 0.375D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + } + + if(posZ) { + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.6875D, 0.125D, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.375D, height, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + + renderer.setRenderBounds(0.625D, 0D, 0.625D, 0.6875D, height, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + if(doRender) { + renderer.setRenderBounds(0.3125D, 0.125D, 0.625D, 0.6875D, 0.125D + level, 1D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + renderer.renderFaceZPos(block, x, y, z, channel.iconLava); + } + + } else { + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.6875D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + } + + if(negZ) { + renderer.setRenderBounds(0.3125D, 0D, 0D, 0.6875D, 0.125D, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + renderer.setRenderBounds(0.3125D, 0D, 0D, 0.375D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + + renderer.setRenderBounds(0.625D, 0D, 0D, 0.6875D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + if(doRender) { + renderer.setRenderBounds(0.3125D, 0.125D, 0D, 0.6875D, 0.125D + level, 0.375D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + renderer.renderFaceZNeg(block, x, y, z, channel.iconLava); + } + + } else { + renderer.setRenderBounds(0.3125D, 0D, 0.3125D, 0.6875D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryChannel.renderID; + } +} diff --git a/src/main/java/com/hbm/render/block/RenderMold.java b/src/main/java/com/hbm/render/block/RenderMold.java new file mode 100644 index 000000000..c1793ee2c --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderMold.java @@ -0,0 +1,101 @@ +package com.hbm.render.block; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.FoundryMold; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +public class RenderMold implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + FoundryMold basin = (FoundryMold) block; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y - 0.5D, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryMold mold = (FoundryMold) block; + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y - 0.5D, z, mold.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, mold.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, mold.iconBottom); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, mold.iconSide); + renderer.renderFaceXNeg(block, x, y, z, mold.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, mold.iconInner); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, mold.iconInner); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, mold.iconSide); + renderer.renderFaceZNeg(block, x, y, z, mold.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, mold.iconInner); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, mold.iconInner); + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryMold.renderID; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java index 5fd645ad1..3bcb5f57f 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java @@ -2,6 +2,7 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; @@ -19,6 +20,13 @@ public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRe GL11.glTranslated(x + 0.5D, y, z + 0.5D); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + } bindTexture(ResourceManager.crucible_tex); ResourceManager.crucible_heat.renderAll(); diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java new file mode 100644 index 000000000..c27f25fe9 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -0,0 +1,72 @@ +package com.hbm.render.tileentity; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.IRenderFoundry; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +public class RenderFoundry extends TileEntitySpecialRenderer { + + public static final ResourceLocation lava = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lava_gray.png"); + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + IRenderFoundry foundry = (IRenderFoundry) tile; + + if(!foundry.shouldRender()) return; + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + GL11.glDepthMask(false); + Tessellator tess = Tessellator.instance; + this.bindTexture(lava); + + int hex = foundry.getMat().moltenColor; + Color color = new Color(hex); + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1F); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.minX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); + tess.draw(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(1F, 1F, 1F, 0.3F); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.minX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); + tess.draw(); + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopAttrib(); + GL11.glPopMatrix(); + + GL11.glDepthMask(true); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 3ae08ab0c..4bf7992a5 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -251,6 +251,10 @@ public class TileMappings { put(TileEntityStirling.class, "tileentity_stirling"); put(TileEntitySawmill.class, "tileentity_sawmill"); put(TileEntityCrucible.class, "tileentity_crucible"); + + put(TileEntityFoundryMold.class, "tileentity_foundry_mold"); + put(TileEntityFoundryBasin.class, "tileentity_foundry_basin"); + put(TileEntityFoundryChannel.class, "tileentity_foundry_channel"); put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter"); put(TileEntityDiFurnaceRTG.class, "tileentity_rtg_difurnace"); diff --git a/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java b/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java new file mode 100644 index 000000000..b5d0011c8 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java @@ -0,0 +1,14 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.NTMMaterial; + +public interface IRenderFoundry { + + public boolean shouldRender(); + public double getLevel(); + public NTMMaterial getMat(); + public double minX(); + public double maxX(); + public double minZ(); + public double maxZ(); +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 672beb8a2..febaef81e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import java.util.ArrayList; import java.util.List; +import com.hbm.blocks.BlockDummyable; import com.hbm.inventory.container.ContainerCrucible; import com.hbm.inventory.gui.GUICrucible; import com.hbm.inventory.material.MaterialShapes; @@ -15,18 +16,22 @@ import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import api.hbm.block.ICrucibleAcceptor; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class TileEntityCrucible extends TileEntityMachineBase implements IGUIProvider { @@ -90,6 +95,45 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro this.progress = 0; } + /* TEMP */ + if(!this.wasteStack.isEmpty()) { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); + + outer: + for(MaterialStack stack : this.wasteStack) { + + for(int i = 0; i < 4; i++) { + int x = xCoord + dir.offsetX * 2; + int z = zCoord + dir.offsetZ * 2; + int y = yCoord - i - 1; + Block b = worldObj.getBlock(x, y, z); + if(b.isAir(worldObj, x, y, z)) continue; + + if(b instanceof ICrucibleAcceptor) { + + ICrucibleAcceptor acc = (ICrucibleAcceptor) b; + int pourAmount = Math.min(MaterialShapes.NUGGET.q(1), stack.amount); + MaterialStack toPour = new MaterialStack(stack.material, pourAmount); + + if(acc.canAcceptPartialPour(worldObj, x, y, z, 0.5, 1, 0.5, ForgeDirection.UP, toPour)) { + int prev = pourAmount; + MaterialStack left = acc.pour(worldObj, x, y, z, 0.5, 1, 0.5, ForgeDirection.UP, toPour); + + int diff = prev - (left != null ? left.amount : 0); + stack.amount -= diff; + + break outer; + } + } else { + break; + } + } + } + } + + this.wasteStack.removeIf(x -> x.amount <= 0); + NBTTagCompound data = new NBTTagCompound(); int[] rec = new int[recipeStack.size() * 2]; int[] was = new int[wasteStack.size() * 2]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java index 212218f1e..ca3972325 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java @@ -2,12 +2,13 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.oredict.OreDictionary; -public class TileEntityFoundryBasin extends TileEntityFoundryBase { +public class TileEntityFoundryBasin extends TileEntityFoundryBase implements IRenderFoundry { @Override public int getCapacity() { @@ -18,15 +19,24 @@ public class TileEntityFoundryBasin extends TileEntityFoundryBase { public void updateEntity() { super.updateEntity(); + if(!worldObj.isRemote) { + + if(this.lastType != this.type || this.lastAmount != this.amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + this.lastType = this.type; + this.lastAmount = this.amount; + } + } + //TODO: cool off } - //TODO: move to block @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { if(side != ForgeDirection.UP) return false; //reject from any direction other than the top if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material + if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full for(String name : stack.material.names) { String od = "block" + name; @@ -42,6 +52,10 @@ public class TileEntityFoundryBasin extends TileEntityFoundryBase { @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + if(this.type == null) { + this.type = stack.material; + } + if(stack.amount + this.amount <= this.getCapacity()) { this.amount += stack.amount; return null; @@ -57,4 +71,24 @@ public class TileEntityFoundryBasin extends TileEntityFoundryBase { @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } + + @Override + public boolean shouldRender() { + return this.type != null && this.amount > 0; + } + + @Override + public double getLevel() { + return 0.125 + this.amount * 0.75D / this.getCapacity(); + } + + @Override + public NTMMaterial getMat() { + return this.type; + } + + @Override public double minX() { return 0.125D; } + @Override public double maxX() { return 0.875D; } + @Override public double minZ() { return 0.125D; } + @Override public double maxZ() { return 0.875D; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java new file mode 100644 index 000000000..47bd3718c --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java @@ -0,0 +1,158 @@ +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats.MaterialStack; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFoundryChannel extends TileEntityFoundryBase { + + @Override + public void updateEntity() { + super.updateEntity(); + + if(!worldObj.isRemote) { + + if(this.type == null && this.amount != 0) { + this.amount = 0; + } + + if(this.lastType != this.type || this.lastAmount != this.amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + this.lastType = this.type; + this.lastAmount = this.amount; + } + + if(worldObj.rand.nextInt(10) == 0 && this.amount > 0 && this.type != null) { + + List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; + Collections.shuffle(ints); + + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + Block b = worldObj.getBlock(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof ICrucibleAcceptor && b != ModBlocks.foundry_channel) { + ICrucibleAcceptor acc = (ICrucibleAcceptor) b; + + if(acc.canAcceptPartialFlow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount))) { + MaterialStack left = acc.flow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount)); + if(left == null) { + this.type = null; + this.amount = 0; + } else { + this.amount = left.amount; + } + return; + } + } + } + + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof TileEntityFoundryChannel) { + TileEntityFoundryChannel acc = (TileEntityFoundryChannel) b; + + if(acc.type == null || acc.type == this.type) { + acc.type = this.type; + + if(worldObj.rand.nextInt(5) == 0) { + //1:4 chance that the fill states are simply swapped + //this promotes faster spreading and prevents spread limits + int buf = this.amount; + this.amount = acc.amount; + acc.amount = buf; + + } else { + //otherwise, equalize the neighbors + int diff = this.amount - acc.amount; + + if(diff > 0) { + diff /= 2; + this.amount -= diff; + acc.amount += diff; + } + } + } + } + } + } + } + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + + if(side != ForgeDirection.UP) return false; //reject from any direction other than the top + if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material + if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full + + return true; //pour + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + + if(this.type == null) { + this.type = stack.material; + } + + if(stack.amount + this.amount <= this.getCapacity()) { + this.amount += stack.amount; + return null; + } + + int required = this.getCapacity() - this.amount; + this.amount = this.getCapacity(); + + stack.amount -= required; + + return stack; + } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + + if(side == ForgeDirection.UP || side == ForgeDirection.DOWN) return false; + if(this.type != null && this.type != stack.material) return false; + if(this.amount >= this.getCapacity()) return false; + + return true; //pour + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + + if(this.type == null) { + this.type = stack.material; + } + + if(stack.amount + this.amount <= this.getCapacity()) { + this.amount += stack.amount; + return null; + } + + int required = this.getCapacity() - this.amount; + this.amount = this.getCapacity(); + + stack.amount -= required; + + return stack; + } + + @Override + public int getCapacity() { + return MaterialShapes.INGOT.q(1); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java new file mode 100644 index 000000000..f5118a71a --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java @@ -0,0 +1,128 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; + +public class TileEntityFoundryMold extends TileEntityFoundryBase implements IRenderFoundry { + + @Override + public int getCapacity() { + return MaterialShapes.INGOT.q(1); + } + + @Override + public void updateEntity() { + super.updateEntity(); + + if(!worldObj.isRemote) { + + if(this.lastType != this.type || this.lastAmount != this.amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + this.lastType = this.type; + this.lastAmount = this.amount; + } + } + + //TODO: cool off + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + + if(side != ForgeDirection.UP) return false; //reject from any direction other than the top + if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material + if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full + + for(String name : stack.material.names) { + String od = "ingot" + name; + + if(!OreDictionary.getOres(od).isEmpty()) { + return true; //at least one block for this material? return TRUE + } + } + + return false; //no OD match -> no pouring + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + + if(this.type == null) { + this.type = stack.material; + } + + if(stack.amount + this.amount <= this.getCapacity()) { + this.amount += stack.amount; + return null; + } + + int required = this.getCapacity() - this.amount; + this.amount = this.getCapacity(); + + stack.amount -= required; + + return stack; + } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + + if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material + if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full + + for(String name : stack.material.names) { + String od = "ingot" + name; + + if(!OreDictionary.getOres(od).isEmpty()) { + return true; //at least one block for this material? return TRUE + } + } + + return false; //no OD match -> no pouring + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + + if(this.type == null) { + this.type = stack.material; + } + + if(stack.amount + this.amount <= this.getCapacity()) { + this.amount += stack.amount; + return null; + } + + int required = this.getCapacity() - this.amount; + this.amount = this.getCapacity(); + + stack.amount -= required; + + return stack; + } + + @Override + public boolean shouldRender() { + return this.type != null && this.amount > 0; + } + + @Override + public double getLevel() { + return 0.125 + this.amount * 0.25D / this.getCapacity(); + } + + @Override + public NTMMaterial getMat() { + return this.type; + } + + @Override public double minX() { return 0.125D; } + @Override public double maxX() { return 0.875D; } + @Override public double minZ() { return 0.125D; } + @Override public double maxZ() { return 0.875D; } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin.png b/src/main/resources/assets/hbm/textures/blocks/foundry_basin.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b5094ccff24edbbb94f8ff188d3fe1ba60675f GIT binary patch literal 651 zcmV;60(AX}P)CJZ_1#k`-+Nz0l~^9A>N5p}zyZw#OS`21%@ z>pc>X03#bROE=U_!|!#D5`uvZ>4h4AP-&{B1>h>%Fp4bz!^ohgm0()dI1$hjg11*U z?BTsaln#N!;}|50uj>-l4c^0SyG1`9XePUf0E|NRo}4c$PLC1*>ekUX2ZP~(dcLU8 zlh|^x%s3wPxLmDSuZi5~I#^qD^#0KyA|5O^F(6tO9a9T|k+4w5KBzj!q6v;pVK zil>7Btt2+k46WgMWAD^Y#@z-F`Uz*3ztG>VZ@KP5TJM?dvH=hW8YKm*qQ(&daGe+I z^CSBv0H9|yVW2R&3(IuX5oYOzs%=qHAa@$pRYM$f898|1oTs0}2hIP(1N|swofilx zajr!O(9a)^kphz46EW)6Eb1*E)0QWrfaCFidA0$d=_|C7NFn)fQ=^@Cd|za=&ZFc% zn-_TrrjOBzcR#M~)FdFKq;|T?!6Gl&d$GqPwkXv#-EI!G#NFa`9(Y0P9ZD*|?e6Gu lkQWsmcgVs1UjRg*;V-?A5Tu+8(mntH002ovPDHLkV1n*+A4mWI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..53406350fa015e77948f54ae5f07880b0c7b6a65 GIT binary patch literal 515 zcmV+e0{s1nP)B@dw6ZoCj;E>jGz$c{)GJf^Sd&W z@IX}f`FUezjNTce0}zoEMP*S{EO$hNW=6|MB7&@ zNsEZRX-0Uk?#BRgEqZH2CZ>vtpshWR0h*cZ1K*uZ6*B_?LU>;nV~nS%s2~U)v1K4U z2>*AEOvdQ6)-Y8>jRMnQV);46WMP$-j!_4;CTpY(BA~qs|$`@T#(TJd`IA5=g zq`Q!JvpE-t?EPAZ$YxW8d^|AQl(Gt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..79de6ddee9ca2dafc11ff315da273349dfe574ae GIT binary patch literal 533 zcmV+w0_y#VP)R{&423^CKli;-gb<<|fgLbrzyLPKl3)P{MyR6-L9143 z-%VnhL2fUw0z65S*ykJ{TRwhx6A!I(tcA}%PrQC{Kt;J-8y8Ow-1ot=!@}jw9p4^; zSI-yDO6I-~0P^?iI{?nwV5yah^D{nOUU7SBe7X9?%kv}6u6epFKmy?Fj~grk1?2s^ zw_)z&oCpv4n8-;LbEo8txsz1+JIoysA*VD^Z5XObQYEDX0+?`GS8A<$p{O7T!)yW| z{KH`G`&nxt=S)&XLz&-@sbyATsa0BO+5x1On58l%^z)01GUPS_-FiC8b2Ig@_=hgt?<4gen2#$KHn- zDuPE)N}>18@p!<7F~*ea?nDG-SOWsEV6+r~D=z#|Y5Qc9%F8%;_OQ$bQ?sTGgdoQ5EFGtCS$1K_l-00000NkvXXu0mjfZ#?I0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin_side.png b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_side.png new file mode 100644 index 0000000000000000000000000000000000000000..1573c1d22df8fd1d8b45a5a2ae6a5c16b074a5b9 GIT binary patch literal 599 zcmV-d0;v6oP)7`f)6g&V4ft@;_cn3mWjK?9w&MA(- z-dc>I_OPT~U85NStyS2?)#3czUDI7H-oAe2i@G6>Le5tur;iL$NYbiiJ}~SX%fx6F z+l)_z=j2F}go=G*0Z^Bl41lDz=qO@7OnASzAuVe@+^l&#jH%lVBdvh|fR8`6wB92D z2{1Jg%XCL=E#LD!fe?&M#4u6-M1i8REdbZqj%i{5n8X^js053$#)*)j5WKs-WvWnI?w1wY|8D=n-$uPJRCX2rm#q;BgG%m|amE$RGswFoTS;Us`t&t@kVs+W<&HMIZ&+qQ(&cu-X^g?MIGu z2*6M)qA)Zw9mDIYA)t&eK?nloIbfDhQBLBBcbt lT1#UsMr#n@oTF_WKLNs1Sd^roY0ERIK|E zEck-9dsJ3ciXe&7xN&07jP065MAr3PKIt7@-TR*N_0z}pO&ar%Z5SsJw=2W3Y{-ql z>q!=y5+!@|eUG!rAwT})966SvssWGyrLA~3O!mXjmAoIOJZZy+QObO)=_`-Lst@bE*Dqd9bTwQ;OgRYd$-7te_N0HrGDw|UPVzMhb;Ibp& zc4Yt%*V7ro5uF{p4IGYTgIH_J+Sty3NfMJAgD`c&=)ms`c+$I?#V`u?^>tC`?rucb zrskEeIs@igjgmb?tQ6BM?+oZGkG}6Af7d;z+s=UJ_L;NEA@U^cZXe)gsZn`@c*r({ zuIvmr9rzqM7U$cS^Y;H^+$=Sx10UfC*2XeA@F}WY$kQz6SJ`rsDneJX+?LF@8hO9k z1sK{I<#~*vkn8D;wYL16Ju-{}Y_lR(3g`iFx5yYL5o|U805C+O8bj!frT_o{07*qo IM6N<$f}gtGKmY&$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_channel_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..53406350fa015e77948f54ae5f07880b0c7b6a65 GIT binary patch literal 515 zcmV+e0{s1nP)B@dw6ZoCj;E>jGz$c{)GJf^Sd&W z@IX}f`FUezjNTce0}zoEMP*S{EO$hNW=6|MB7&@ zNsEZRX-0Uk?#BRgEqZH2CZ>vtpshWR0h*cZ1K*uZ6*B_?LU>;nV~nS%s2~U)v1K4U z2>*AEOvdQ6)-Y8>jRMnQV);46WMP$-j!_4;CTpY(BA~qs|$`@T#(TJd`IA5=g zq`Q!JvpE-t?EPAZ$YxW8d^|AQl(Gt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_channel_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..62c97bacff6796ef91469355b8b7fb50e9d8692a GIT binary patch literal 329 zcmV-P0k-~$P)C}49e2^N5$La8DIi4rM^ zpFQ&^0z|BUhEv_<{@|Z~K<@9Z$~O0mQqAN0j?1$a6=l_BrbjKCe&D2Sm@U`5Yzr5s z4dc3E(+>btuZuMR<2=x$#B?&|VK!&A%RJ3LIG>EjzTmiN00ZFpZHbqH0&;tET|9!S zGD;NsVV`WOcm#D-;SreXujw9vh)|jBQ+;q$6;s8`KmZqZT}Mjk@L2^x7~ByN^t%xe zJmO2rkD+ZE+?~N4k09rsh#=K9DuTK@01-hc1v4We5QNH%C``Q{rC znx@(P@ehTzZU3fz3plAx@m?@B)+r$(m>I!)L_#gZQZTF&!B2_erX%dpm_w>4mh|F2^EFaE!Iq!S!g+jgFy{ixQ zI=aX|Jbj?|cQysLir|;F`8J4(m>|tqsrrHofzI**y=lO^0zV$cVi>?Eg2U4;h7y>o zWkuV{1y}n!n|h_{b3BY`TRFCAFbWfLonxC8{b`6}nY0%xjKT!dP;9I&@#*J;mP)X$ zHL3(@27p(xn58MEp}4u+VjRU>Z`SC|A|`Q+X(+B-TBJ7(h?A5?y(~RF-@2jSKE5Z? z{`hQHzqo%(aA7via+(!a2#=!}+Z35gfrelHXX*d)O7lD}6iD)nMb{CHy;+1~nS!f> zy^cN_M6B0c3}x_p7BC7EnhPGyic65r1y9b#jKYM=6_>A}X07Jnl`O3OG{muOn!d;3 zX&2ivFb&1YV9e+484bTok`M768`DsK?aep&(jSS9c=hm(e)DKcr2YQMwtl&N`{KXw zBQqfreVpraHddDe7XoWF86d#XAi|l*r!21UeKf@@$$PKYU0Ny;{0~CEr0w0;Us3=7 N002ovPDHLkV1ggf@4o;5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_mold_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..53406350fa015e77948f54ae5f07880b0c7b6a65 GIT binary patch literal 515 zcmV+e0{s1nP)B@dw6ZoCj;E>jGz$c{)GJf^Sd&W z@IX}f`FUezjNTce0}zoEMP*S{EO$hNW=6|MB7&@ zNsEZRX-0Uk?#BRgEqZH2CZ>vtpshWR0h*cZ1K*uZ6*B_?LU>;nV~nS%s2~U)v1K4U z2>*AEOvdQ6)-Y8>jRMnQV);46WMP$-j!_4;CTpY(BA~qs|$`@T#(TJd`IA5=g zq`Q!JvpE-t?EPAZ$YxW8d^|AQl(Gt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_mold_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..62c97bacff6796ef91469355b8b7fb50e9d8692a GIT binary patch literal 329 zcmV-P0k-~$P)C}49e2^N5$La8DIi4rM^ zpFQ&^0z|BUhEv_<{@|Z~K<@9Z$~O0mQqAN0j?1$a6=l_BrbjKCe&D2Sm@U`5Yzr5s z4dc3E(+>btuZuMR<2=x$#B?&|VK!&A%RJ3LIG>EjzTmiN00ZFpZHbqH0&;tET|9!S zGD;NsVV`WOcm#D-;SreXujw9vh)|jBQ+;q$6;s8`KmZqZT}Mjk@L2^x7~ByN^t%xe zJmO2rkD+ZE+?~N4k09rsh#=K9DuTK@01-hc1v4We5QNH%C``Q{rC znx@(P@ehTzZU3fz3plAx@m?@B)+r$(m>I!)Ls1Sd^roY0ERIK|E zEck-9dsJ3ciXe&7xN&07jP065MAr3PKIt7@-TR*N_0z}pO&ar%Z5SsJw=2W3Y{-ql z>q!=y5+!@|eUG!rAwT})966SvssWGyrLA~3O!mXjmAoIOJZZy+QObO)=_`-Lst@bE*Dqd9bTwQ;OgRYd$-7te_N0HrGDw|UPVzMhb;Ibp& zc4Yt%*V7ro5uF{p4IGYTgIH_J+Sty3NfMJAgD`c&=)ms`c+$I?#V`u?^>tC`?rucb zrskEeIs@igjgmb?tQ6BM?+oZGkG}6Af7d;z+s=UJ_L;NEA@U^cZXe)gsZn`@c*r({ zuIvmr9rzqM7U$cS^Y;H^+$=Sx10UfC*2XeA@F}WY$kQz6SJ`rsDneJX+?LF@8hO9k z1sK{I<#~*vkn8D;wYL16Ju-{}Y_lR(3g`iFx5yYL5o|U805C+O8bj!frT_o{07*qo IM6N<$f}gtGKmY&$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/lava_gray.png b/src/main/resources/assets/hbm/textures/blocks/lava_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8ddc411d10e6fede7ace69edd35a16a8460e0c GIT binary patch literal 751 zcmVRs1G2tnWX)OF4Id?rZ}CX)%rlI@Rx3{;f*K4vY!;0e=V+?to zQ`a?BRnfLBRaGH`z_x9s(wOaA|`brpv%;$3ewAKs;16zcc}JNmxIaU8-hWIP`K|ALefr4&jjrqd}84-dS&ys+JFaU2J&HCk(Y-~YYS zwr#quBZ?yI!C-*z`@b@6w_8r96Mf&aUatv)fcyJ<0It_7UteE%p2z8QVmh5-2_Xj@E1Zck5>s^T%-U1002ovPDHLkV1fmbTK}qf+h{S7g{b6IY7Ed|MnfVSg@V_-zD5}M!qWZ1J z`pF1T-l%YP;WIphN;q(EST%ZkzZK>RMYX)T&P2w;j)1V?^3unN!u{VxfrhjrrBq}d97-s22hp}Fr0E(n9pNdaDAmOpk4#$!gEk(W$o({ zA%f$hs*xTycP)=J->=x^u^rSNCk TlXDjH00000NkvXXu0mjf*0Q?M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/ingot_firebrick.png b/src/main/resources/assets/hbm/textures/items/ingot_firebrick.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6650152986d9dd4f57882144938ccfcb9149e6 GIT binary patch literal 403 zcmV;E0c`$>P)NklA#2cU4FXB8sdG2|;L2?$Nuq?JD#icJ}7Iqd_RB zbP!7lBwRmM*>!i?4!X0NNY{EVGtA8M{N@Y(OqW;~@S=0?{jh3=k zunFDYUf{R^0DXJ5DUuRpUs41BEJZ*<)np6sJX%m|v=qfMjZpO#R7(XMH=u9NSc(AG z|00u0NNDOVd9|lfdVQRsZM&-@l=E30o?fVy3IOYrURs1G2tnWX)OF4Id?rZ}CX)%rlI@Rx3{;f*K4vY!;0e=V+?to zQ`a?BRnfLBRaGH`z_x9s(wOaA|`brpv%;$3ewAKs;16zcc}JNmxIaU8-hWIP`K|ALefr4&jjrqd}84-dS&ys+JFaU2J&HCk(Y-~YYS zwr#quBZ?yI!C-*z`@b@6w_8r96Mf&aUatv)fcyJ<0It_7UteE%p2z8QVmh5-2_Xj@E1Zck5>s^T%-U1002ovPDHLkV1fmbT Date: Sun, 25 Sep 2022 21:31:33 +0200 Subject: [PATCH 076/111] molds and channels and basins --- .../java/com/hbm/blocks/BlockDummyable.java | 13 +- .../com/hbm/blocks/machine/FoundryBasin.java | 54 ++-- .../blocks/machine/FoundryCastingBase.java | 54 ++++ .../hbm/blocks/machine/FoundryChannel.java | 43 ++++ .../com/hbm/blocks/machine/FoundryMold.java | 59 ++--- .../hbm/blocks/machine/MachineCentrifuge.java | 16 -- src/main/java/com/hbm/items/ModItems.java | 10 + .../java/com/hbm/items/machine/ItemMold.java | 107 ++++++++ .../java/com/hbm/main/CraftingManager.java | 5 + .../com/hbm/render/block/RenderChannel.java | 14 ++ .../java/com/hbm/render/block/RenderMold.java | 8 +- .../hbm/render/tileentity/RenderFoundry.java | 5 + .../tileentity/machine/IRenderFoundry.java | 5 + .../machine/TileEntityFoundryBase.java | 7 + .../machine/TileEntityFoundryBasin.java | 58 +---- .../machine/TileEntityFoundryCastingBase.java | 232 ++++++++++++++++++ .../machine/TileEntityFoundryChannel.java | 9 +- .../machine/TileEntityFoundryMold.java | 98 +------- src/main/resources/assets/hbm/lang/de_DE.lang | 20 +- src/main/resources/assets/hbm/lang/en_US.lang | 18 ++ .../hbm/textures/blocks/foundry_channel.png | Bin 0 -> 651 bytes .../hbm/textures/blocks/foundry_mold.png | Bin 0 -> 651 bytes .../assets/hbm/textures/items/mold_base.png | Bin 0 -> 288 bytes .../assets/hbm/textures/items/mold_billet.png | Bin 0 -> 398 bytes .../assets/hbm/textures/items/mold_block.png | Bin 0 -> 373 bytes .../assets/hbm/textures/items/mold_ingot.png | Bin 0 -> 364 bytes .../assets/hbm/textures/items/mold_ingots.png | Bin 0 -> 484 bytes .../assets/hbm/textures/items/mold_nugget.png | Bin 0 -> 328 bytes .../assets/hbm/textures/items/mold_plate.png | Bin 0 -> 419 bytes .../assets/hbm/textures/items/mold_plates.png | Bin 0 -> 414 bytes .../assets/hbm/textures/items/mold_wire.png | Bin 0 -> 423 bytes 31 files changed, 600 insertions(+), 235 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java create mode 100644 src/main/java/com/hbm/items/machine/ItemMold.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_channel.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_mold.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_base.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_billet.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_block.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_ingot.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_ingots.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_nugget.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_plate.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_plates.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_wire.png diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 3ef2e8dff..908c9316a 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -25,6 +25,7 @@ import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -420,7 +421,8 @@ public abstract class BlockDummyable extends BlockContainer { } public List bounding = new ArrayList(); - + + @Override public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { if(!this.useDetailedHitbox()) { @@ -462,4 +464,13 @@ public abstract class BlockDummyable extends BlockContainer { return AxisAlignedBB.getBoundingBox(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ).offset(x + 0.5, y + 0.5, z + 0.5); } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + if(!this.useDetailedHitbox()) { + super.setBlockBoundsBasedOnState(world, x, y, z); + } else { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.999F, 1.0F); //for some fucking reason setting maxY to something that isn't 1 magically fixes item collisions + } + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java index 5b05e610b..f4df32c6d 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java @@ -1,23 +1,24 @@ package com.hbm.blocks.machine; +import java.util.List; + import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFoundryBasin; -import api.hbm.block.ICrucibleAcceptor; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class FoundryBasin extends BlockContainer implements ICrucibleAcceptor { +public class FoundryBasin extends FoundryCastingBase { @SideOnly(Side.CLIENT) public IIcon iconTop; @SideOnly(Side.CLIENT) public IIcon iconSide; @@ -25,7 +26,7 @@ public class FoundryBasin extends BlockContainer implements ICrucibleAcceptor { @SideOnly(Side.CLIENT) public IIcon iconInner; public FoundryBasin() { - super(Material.rock); + super(); } @Override @@ -38,24 +39,39 @@ public class FoundryBasin extends BlockContainer implements ICrucibleAcceptor { this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_inner"); } - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { - return true; - } - @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityFoundryBasin(); } @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryBasin) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + AxisAlignedBB[] bbs = new AxisAlignedBB[] { + AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 0.125D, z + 1D), + AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 1D, z + 0.125D), + AxisAlignedBB.getBoundingBox(x, y, z, x + 0.125D, y + 1D, z + 1D), + AxisAlignedBB.getBoundingBox(x + 0.875D, y, z, x + 1D, y + 1D, z + 1D), + AxisAlignedBB.getBoundingBox(x, y, z + 0.875, x + 1D, y + 1D, z + 1D), + }; + + for(AxisAlignedBB bb : bbs) { + if(entityBounding.intersectsWith(bb)) { + list.add(bb); + } + } } @Override - public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryBasin) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.999F, 1.0F); //for some fucking reason setting maxY to something that isn't 1 magically fixes item collisions + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + 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 boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } @@ -67,14 +83,4 @@ public class FoundryBasin extends BlockContainer implements ICrucibleAcceptor { public int getRenderType() { return renderID; } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java new file mode 100644 index 000000000..bb9ea6f92 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -0,0 +1,54 @@ +package com.hbm.blocks.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class FoundryCastingBase extends BlockContainer implements ICrucibleAcceptor { + + protected FoundryCastingBase() { + super(Material.rock); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java index f4103c90d..615d9d54a 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java @@ -1,7 +1,11 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.blocks.ModBlocks; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFoundryChannel; @@ -13,7 +17,9 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -52,6 +58,43 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor return new TileEntityFoundryChannel(); } + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + List bbs = new ArrayList(); + + bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.3125D, x + 0.6875D, y + 0.5D, z + 0.6875D)); + + if(canConnectTo(world, x, y, z, Library.POS_X)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.6875D, y, z + 0.3125D, x + 1D, y + 0.5D, z + 0.6875D)); + if(canConnectTo(world, x, y, z, Library.NEG_X)) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z + 0.3125D, x + 0.3125D, y + 0.5D, z + 0.6875D)); + if(canConnectTo(world, x, y, z, Library.POS_Z)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.6875D, x + 0.6875D, y + 0.5D, z + 1D)); + if(canConnectTo(world, x, y, z, Library.NEG_Z)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z, x + 0.6875D, y + 0.5D, z + 0.3125D)); + + for(AxisAlignedBB bb : bbs) { + if(entityBounding.intersectsWith(bb)) { + list.add(bb); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + 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 void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds( + canConnectTo(world, x, y, z, Library.NEG_X) ? 0F : 0.3125F, + 0F, + canConnectTo(world, x, y, z, Library.NEG_Z) ? 0F : 0.3125F, + canConnectTo(world, x, y, z, Library.POS_X) ? 1F : 0.6875F, + 0.5F, + canConnectTo(world, x, y, z, Library.POS_Z) ? 1F : 0.6875F); + } + @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryMold.java b/src/main/java/com/hbm/blocks/machine/FoundryMold.java index 26edda4e5..5bb037991 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryMold.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryMold.java @@ -1,23 +1,22 @@ package com.hbm.blocks.machine; -import com.hbm.inventory.material.Mats.MaterialStack; +import java.util.List; + import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFoundryMold; -import api.hbm.block.ICrucibleAcceptor; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class FoundryMold extends BlockContainer implements ICrucibleAcceptor { +public class FoundryMold extends FoundryCastingBase { @SideOnly(Side.CLIENT) public IIcon iconTop; @SideOnly(Side.CLIENT) public IIcon iconSide; @@ -25,7 +24,7 @@ public class FoundryMold extends BlockContainer implements ICrucibleAcceptor { @SideOnly(Side.CLIENT) public IIcon iconInner; public FoundryMold() { - super(Material.rock); + super(); } @Override @@ -38,34 +37,38 @@ public class FoundryMold extends BlockContainer implements ICrucibleAcceptor { this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_inner"); } - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { - return true; - } - @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityFoundryMold(); } @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryMold) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + AxisAlignedBB[] bbs = new AxisAlignedBB[] { + AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 0.125D, z + 1D), + AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 0.5D, z + 0.125D), + AxisAlignedBB.getBoundingBox(x, y, z, x + 0.125D, y + 0.5D, z + 1D), + AxisAlignedBB.getBoundingBox(x + 0.875D, y, z, x + 1D, y + 0.5D, z + 1D), + AxisAlignedBB.getBoundingBox(x, y, z + 0.875, x + 1D, y + 0.5D, z + 1D), + }; + + for(AxisAlignedBB bb : bbs) { + if(entityBounding.intersectsWith(bb)) { + list.add(bb); + } + } } @Override - public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryMold) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); } @Override - public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryMold) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); - } - - @Override - public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryMold) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 0.5D, z + 1D); } public static int renderID = RenderingRegistry.getNextAvailableRenderId(); @@ -74,14 +77,4 @@ public class FoundryMold extends BlockContainer implements ICrucibleAcceptor { public int getRenderType() { return renderID; } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java b/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java index eb1964ab5..740ee50fa 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java @@ -1,32 +1,16 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.handler.MultiblockHandler; import com.hbm.interfaces.IMultiblock; -import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineCentrifuge; -import com.hbm.tileentity.machine.TileEntityMachineGasCent; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 8d3f1e0fb..a1c9af8ae 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -742,6 +742,9 @@ public class ModItems { public static Item blades_schrabidium; public static Item blades_desh; + public static Item mold_base; + public static Item mold; + public static Item part_lithium; public static Item part_beryllium; public static Item part_carbon; @@ -3350,6 +3353,9 @@ public class ModItems { blades_schrabidium = new ItemBlades(2000).setUnlocalizedName("blades_schrabidium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":blades_schrabidium"); blades_desh = new ItemBlades(0).setUnlocalizedName("blades_desh").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":blades_desh"); + mold_base = new Item().setUnlocalizedName("mold_base").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":mold_base"); + mold = new ItemMold().setUnlocalizedName("mold").setCreativeTab(MainRegistry.controlTab); + part_lithium = new Item().setUnlocalizedName("part_lithium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_lithium"); part_beryllium = new Item().setUnlocalizedName("part_beryllium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_beryllium"); part_carbon = new Item().setUnlocalizedName("part_carbon").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_carbon"); @@ -6645,6 +6651,10 @@ public class ModItems { GameRegistry.registerItem(stamp_9, stamp_9.getUnlocalizedName()); GameRegistry.registerItem(stamp_50, stamp_50.getUnlocalizedName()); + //Molds + GameRegistry.registerItem(mold_base, mold_base.getUnlocalizedName()); + GameRegistry.registerItem(mold, mold.getUnlocalizedName()); + //Machine Upgrades GameRegistry.registerItem(upgrade_template, upgrade_template.getUnlocalizedName()); GameRegistry.registerItem(upgrade_speed_1, upgrade_speed_1.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java new file mode 100644 index 000000000..9156f4e8e --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -0,0 +1,107 @@ +package com.hbm.items.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.lib.RefStrings; +import com.hbm.util.I18nUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; + +public class ItemMold extends Item { + + public List molds = new ArrayList(); + + public ItemMold() { + this.molds.add(new Mold(0, 0, "nugget", MaterialShapes.NUGGET)); + this.molds.add(new Mold(1, 0, "billet", MaterialShapes.BILLET)); + this.molds.add(new Mold(2, 0, "ingot", MaterialShapes.INGOT)); + this.molds.add(new Mold(3, 0, "plate", MaterialShapes.PLATE)); + this.molds.add(new Mold(4, 0, "wire", MaterialShapes.WIRE, 8)); + this.molds.add(new Mold(5, 1, "ingots", MaterialShapes.INGOT, 9)); + this.molds.add(new Mold(6, 1, "plates", MaterialShapes.PLATE, 9)); + this.molds.add(new Mold(7, 1, "block", MaterialShapes.BLOCK)); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < molds.size(); i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + protected IIcon[] icons; + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + + icons = new IIcon[molds.size()]; + + for(int i = 0; i < molds.size(); i++) { + Mold mold = molds.get(i); + this.icons[i] = reg.registerIcon(RefStrings.MODID + ":mold_" + mold.name); + } + } + + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + return this.icons[Math.abs(meta % icons.length)]; + } + + /*@Override + public String getUnlocalizedName(ItemStack stack) { + int meta = Math.abs(stack.getItemDamage() % molds.size()); + return super.getUnlocalizedName(stack) + "_" + molds.get(meta).name; + }*/ + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + Mold mold = getMold(stack); + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("shape." + mold.shape.name().toLowerCase()) + " x" + mold.amount); + + if(mold.size == 0) list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey(ModBlocks.foundry_mold.getUnlocalizedName() + ".name")); + if(mold.size == 1) list.add(EnumChatFormatting.RED + I18nUtil.resolveKey(ModBlocks.foundry_basin.getUnlocalizedName() + ".name")); + } + + public Mold getMold(ItemStack stack) { + int meta = Math.abs(stack.getItemDamage() % molds.size()); + Mold mold = molds.get(meta); + return mold; + } + + public class Mold { + + public MaterialShapes shape; + public int amount; + public int id; + public int size; + public String name; + + public Mold(int id, int size, String name, MaterialShapes shape) { + this(id, size, name, shape, 1); + } + + public Mold(int id, int size, String name, MaterialShapes shape, int amount) { + this.id = id; + this.size = size; + this.shape = shape; + this.amount = amount; + this.name = name; + } + + public int getCost() { + return shape.q(amount); + } + } +} diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 27c23e376..0524fb0c2 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -951,6 +951,11 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.gear_large, 1, 0), new Object[] { "III", "ICI", "III", 'I', IRON.plate(), 'C', CU.ingot()}); addRecipeAuto(new ItemStack(ModItems.gear_large, 1, 1), new Object[] { "III", "ICI", "III", 'I', STEEL.plate(), 'C', TI.ingot()}); addRecipeAuto(new ItemStack(ModItems.sawblade), new Object[] { "III", "ICI", "III", 'I', STEEL.plate(), 'C', IRON.ingot()}); + + addRecipeAuto(new ItemStack(ModBlocks.foundry_basin), new Object[] { "B B", "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addRecipeAuto(new ItemStack(ModBlocks.foundry_mold), new Object[] { "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addRecipeAuto(new ItemStack(ModBlocks.foundry_channel, 4), new Object[] { "B B", " S ", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addRecipeAuto(new ItemStack(ModItems.mold_base), new Object[] { " B ", "BIB", " B ", 'B', ModItems.ingot_firebrick, 'I', IRON.ingot() }); addShapelessAuto(new ItemStack(ModItems.upgrade_5g), new Object[] { ModItems.upgrade_template, ModItems.gem_alexandrite }); diff --git a/src/main/java/com/hbm/render/block/RenderChannel.java b/src/main/java/com/hbm/render/block/RenderChannel.java index 3ae945e39..af00974f7 100644 --- a/src/main/java/com/hbm/render/block/RenderChannel.java +++ b/src/main/java/com/hbm/render/block/RenderChannel.java @@ -177,6 +177,10 @@ public class RenderChannel implements ISimpleBlockRenderingHandler { float mulZ = 0.8F; float mulX = 0.6F; + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + int fullBright = 240; + tessellator.setBrightness(brightness); + if(EntityRenderer.anaglyphEnable) { float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; float aG = (r * 30.0F + g * 70.0F) / 100.0F; @@ -216,7 +220,9 @@ public class RenderChannel implements ISimpleBlockRenderingHandler { if(doRender) { renderer.setRenderBounds(0.375D, 0.125D, 0.375D, 0.625D, 0.125D + level, 0.625D); tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); } if(posX) { @@ -243,8 +249,10 @@ public class RenderChannel implements ISimpleBlockRenderingHandler { if(doRender) { renderer.setRenderBounds(0.625D, 0.125D, 0.3125D, 1D, 0.125D + level, 0.6875D); tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); renderer.renderFaceYPos(block, x, y, z, channel.iconLava); renderer.renderFaceXPos(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); } } else { @@ -280,8 +288,10 @@ public class RenderChannel implements ISimpleBlockRenderingHandler { if(doRender) { renderer.setRenderBounds(0D, 0.125D, 0.3125D, 0.375D, 0.125D + level, 0.6875D); tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); renderer.renderFaceYPos(block, x, y, z, channel.iconLava); renderer.renderFaceXNeg(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); } } else { @@ -317,8 +327,10 @@ public class RenderChannel implements ISimpleBlockRenderingHandler { if(doRender) { renderer.setRenderBounds(0.3125D, 0.125D, 0.625D, 0.6875D, 0.125D + level, 1D); tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); renderer.renderFaceYPos(block, x, y, z, channel.iconLava); renderer.renderFaceZPos(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); } } else { @@ -354,8 +366,10 @@ public class RenderChannel implements ISimpleBlockRenderingHandler { if(doRender) { renderer.setRenderBounds(0.3125D, 0.125D, 0D, 0.6875D, 0.125D + level, 0.375D); tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); renderer.renderFaceYPos(block, x, y, z, channel.iconLava); renderer.renderFaceZNeg(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); } } else { diff --git a/src/main/java/com/hbm/render/block/RenderMold.java b/src/main/java/com/hbm/render/block/RenderMold.java index c1793ee2c..d2dbacf7a 100644 --- a/src/main/java/com/hbm/render/block/RenderMold.java +++ b/src/main/java/com/hbm/render/block/RenderMold.java @@ -26,8 +26,8 @@ public class RenderMold implements ISimpleBlockRenderingHandler { tessellator.startDrawingQuads(); tessellator.setNormal(0F, 1F, 0F); - renderer.renderFaceYPos(block, x, y - 0.5D, z, basin.iconTop); - renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, basin.iconBottom); tessellator.setNormal(0F, -1F, 0F); renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); tessellator.setNormal(1F, 0F, 0F); @@ -71,8 +71,8 @@ public class RenderMold implements ISimpleBlockRenderingHandler { FoundryMold mold = (FoundryMold) block; tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); - renderer.renderFaceYPos(block, x, y - 0.5D, z, mold.iconTop); - renderer.renderFaceYPos(block, x, y - 0.875D, z, mold.iconBottom); + renderer.renderFaceYPos(block, x, y, z, mold.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, mold.iconBottom); tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); renderer.renderFaceYNeg(block, x, y, z, mold.iconBottom); tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java index c27f25fe9..b6fbf9f85 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -10,6 +10,7 @@ import com.hbm.tileentity.machine.IRenderFoundry; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; @@ -67,6 +68,10 @@ public class RenderFoundry extends TileEntitySpecialRenderer { GL11.glDepthMask(true); + if(foundry instanceof IInventory) { + IInventory inv = (IInventory) foundry; + } + GL11.glPopMatrix(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java b/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java index b5d0011c8..057a05c42 100644 --- a/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java +++ b/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java @@ -4,9 +4,14 @@ import com.hbm.inventory.material.NTMMaterial; public interface IRenderFoundry { + /** Returns whether a molten metal layer should be rendered in the TESR */ public boolean shouldRender(); + /** Returns the Y-offset of the molten metal layer */ public double getLevel(); + /** Returns the NTM Mat used, mainly for the color */ public NTMMaterial getMat(); + + /* Return size constraints for the rectangle */ public double minX(); public double maxX(); public double minZ(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java index ebb1e4c88..20838c62e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java @@ -33,6 +33,13 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci this.lastType = this.type; this.lastAmount = this.amount; } + } else { + + if(this.lastType != this.type || this.lastAmount != this.amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + this.lastType = this.type; + this.lastAmount = this.amount; + } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java index ca3972325..1d2a7a390 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java @@ -1,74 +1,24 @@ package com.hbm.tileentity.machine; -import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; -public class TileEntityFoundryBasin extends TileEntityFoundryBase implements IRenderFoundry { - - @Override - public int getCapacity() { - return MaterialShapes.BLOCK.q(1); - } +public class TileEntityFoundryBasin extends TileEntityFoundryCastingBase implements IRenderFoundry { @Override public void updateEntity() { super.updateEntity(); - - if(!worldObj.isRemote) { - - if(this.lastType != this.type || this.lastAmount != this.amount) { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - this.lastType = this.type; - this.lastAmount = this.amount; - } - } - - //TODO: cool off } @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - - if(side != ForgeDirection.UP) return false; //reject from any direction other than the top - if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material - if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full - - for(String name : stack.material.names) { - String od = "block" + name; - - if(!OreDictionary.getOres(od).isEmpty()) { - return true; //at least one block for this material? return TRUE - } - } - - return false; //no OD match -> no pouring - } - - @Override - public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - - if(this.type == null) { - this.type = stack.material; - } - - if(stack.amount + this.amount <= this.getCapacity()) { - this.amount += stack.amount; - return null; - } - - int required = this.getCapacity() - this.amount; - this.amount = this.getCapacity(); - - stack.amount -= required; - - return stack; + public int getMoldSize() { + return 1; } + /* Basin can't accept sideways flowing */ @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java new file mode 100644 index 000000000..48183a52f --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -0,0 +1,232 @@ +package com.hbm.tileentity.machine; + +import java.util.List; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMold; +import com.hbm.items.machine.ItemMold.Mold; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; + +/** + * Thank god we have a base class now. Now with documentation and as little redundtand crap in the child classes as possible. + * @author hbm + * + */ +public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase implements IInventory { + + public ItemStack slots[] = new ItemStack[2]; + public int cooloff = 100; + + @Override + public void updateEntity() { + super.updateEntity(); + + if(!worldObj.isRemote) { + Mold mold = this.getInstalledMold(); + + if(mold != null && this.amount == this.getCapacity() && slots[1] == null) { + cooloff--; + + if(cooloff <= 0) { + this.amount = 0; + + for(String name : this.type.names) { + String od = mold.shape.name().toLowerCase() + name; + List ores = OreDictionary.getOres(od); + + if(!ores.isEmpty()) { + slots[1] = ores.get(0).copy(); + slots[1].stackSize = mold.amount; + } + } + + cooloff = 100; + } + + } else { + cooloff = 100; + } + } + } + + /** Checks slot 0 to see what mold type is installed. Returns null if no mold is found or an incorrect size was used. */ + public Mold getInstalledMold() { + if(slots[0] == null) return null; + + if(slots[0].getItem() == ModItems.mold) { + Mold mold = ((ItemMold) slots[0].getItem()).getMold(slots[0]); + + if(mold.size == this.getMoldSize()) + return mold; + } + + return null; + } + + /** Returns the amount of quanta this casting block can hold, depending on the installed mold or 0 if no mold is found. */ + @Override + public int getCapacity() { + Mold mold = this.getInstalledMold(); + return mold == null ? 0 : mold.getCost(); + } + + /** Standard check with no additional limitations added */ + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return this.standardCheck(world, x, y, z, side, stack); + } + + /** Standard flow, no special handling required */ + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return standardAdd(world, x, y, z, side, stack); + } + + /** Standard check, but with the additional limitation that the only valid source direction is UP */ + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + if(side != ForgeDirection.UP) return false; + return this.standardCheck(world, x, y, z, side, stack); + } + + /** Standard flow, no special handling required */ + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return standardAdd(world, x, y, z, side, stack); + } + + /** + * Standard check for testing if this material stack can be added to the casting block. Checks:
+ * - type matching
+ * - amount being at max
+ * - whether a mold is installed
+ * - whether the mold can accept this type + */ + public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material + if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full + if(this.slots[1] != null) return false; //reject if a freshly casted item is still present + Mold mold = this.getInstalledMold(); + if(mold == null) return false; + + for(String name : stack.material.names) { + String od = mold.shape.name().toLowerCase() + name; + + if(!OreDictionary.getOres(od).isEmpty()) { + return true; //at least one block for this material? return TRUE + } + } + + return false; //no OD match -> no pouring + } + + /** + * Standardized adding of material via pouring or flowing. Does:
+ * - sets material to match the input + * - adds the amount, not exceeding the maximum + * - returns the amount that cannot be added + */ + public MaterialStack standardAdd(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + + if(this.type == null) { + this.type = stack.material; + } + + if(stack.amount + this.amount <= this.getCapacity()) { + this.amount += stack.amount; + return null; + } + + int required = this.getCapacity() - this.amount; + this.amount = this.getCapacity(); + + stack.amount -= required; + + return stack; + } + + /** Returns an integer determining the mold size, 0 for small molds and 1 for the basin */ + public abstract int getMoldSize(); + + @Override + public int getSizeInventory() { + return slots.length; + } + + @Override + public ItemStack getStackInSlot(int i) { + return slots[i]; + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) { + if(slots[i] != null) { + ItemStack itemStack = slots[i]; + slots[i] = null; + return itemStack; + } else { + return null; + } + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemStack) { + slots[i] = itemStack; + if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public ItemStack decrStackSize(int slot, int amount) { + if(slots[slot] != null) { + if(slots[slot].stackSize <= amount) { + ItemStack itemStack = slots[slot]; + slots[slot] = null; + return itemStack; + } + ItemStack itemStack1 = slots[slot].splitStack(amount); + if(slots[slot].stackSize == 0) { + slots[slot] = null; + } + return itemStack1; + } else { + return null; + } + } + + @Override + public String getInventoryName() { + return "ntmFoundry"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + return false; + } + + @Override public void openInventory() { } + @Override public void closeInventory() { } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java index 47bd3718c..a9d73912b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java @@ -18,7 +18,6 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { @Override public void updateEntity() { - super.updateEntity(); if(!worldObj.isRemote) { @@ -26,12 +25,6 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { this.amount = 0; } - if(this.lastType != this.type || this.lastAmount != this.amount) { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - this.lastType = this.type; - this.lastAmount = this.amount; - } - if(worldObj.rand.nextInt(10) == 0 && this.amount > 0 && this.type != null) { List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; @@ -89,6 +82,8 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { } } } + + super.updateEntity(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java index f5118a71a..43c33ffce 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java @@ -1,109 +1,17 @@ package com.hbm.tileentity.machine; -import com.hbm.inventory.material.MaterialShapes; -import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; - -public class TileEntityFoundryMold extends TileEntityFoundryBase implements IRenderFoundry { - - @Override - public int getCapacity() { - return MaterialShapes.INGOT.q(1); - } +public class TileEntityFoundryMold extends TileEntityFoundryCastingBase implements IRenderFoundry { @Override public void updateEntity() { super.updateEntity(); - - if(!worldObj.isRemote) { - - if(this.lastType != this.type || this.lastAmount != this.amount) { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - this.lastType = this.type; - this.lastAmount = this.amount; - } - } - - //TODO: cool off } @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - - if(side != ForgeDirection.UP) return false; //reject from any direction other than the top - if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material - if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full - - for(String name : stack.material.names) { - String od = "ingot" + name; - - if(!OreDictionary.getOres(od).isEmpty()) { - return true; //at least one block for this material? return TRUE - } - } - - return false; //no OD match -> no pouring - } - - @Override - public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - - if(this.type == null) { - this.type = stack.material; - } - - if(stack.amount + this.amount <= this.getCapacity()) { - this.amount += stack.amount; - return null; - } - - int required = this.getCapacity() - this.amount; - this.amount = this.getCapacity(); - - stack.amount -= required; - - return stack; - } - - @Override - public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - - if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material - if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full - - for(String name : stack.material.names) { - String od = "ingot" + name; - - if(!OreDictionary.getOres(od).isEmpty()) { - return true; //at least one block for this material? return TRUE - } - } - - return false; //no OD match -> no pouring - } - - @Override - public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - - if(this.type == null) { - this.type = stack.material; - } - - if(stack.amount + this.amount <= this.getCapacity()) { - this.amount += stack.amount; - return null; - } - - int required = this.getCapacity() - this.amount; - this.amount = this.getCapacity(); - - stack.amount -= required; - - return stack; + public int getMoldSize() { + return 0; } @Override diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 3dd603b58..7c7bd4541 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -885,6 +885,7 @@ item.balefire_and_ham.name=Ham and Balefire-Eggs item.balefire_and_steel.name=Balefire-Zeug item.balefire_scrambled.name=Rühr-Balefire-Ei item.ball_dynamite.name=Dynamit +item.ball_fireclay.name=Schamott item.ball_tnt.name=TNT item.ballistite.name=Ballistit item.bandaid.name=Samtenes Pflaster @@ -1750,6 +1751,7 @@ item.ingot_electronium.name=Elektroniumbarren item.ingot_euphemium.name=Euphemiumbarren item.ingot_ferrouranium.name=Ferrouranbarren item.ingot_fiberglass.name=Fiberglasstafel +item.ingot_firebrick.name=Schamottstein item.ingot_gh336.name=Ghiorsium-336-Barren item.ingot_gh336.desc=Seaborgiums Kollege. item.ingot_graphite.name=Graphitbarren @@ -1961,6 +1963,8 @@ item.missile_strong.name=Starke HE Rakete item.missile_taint.name=Verdorbene Rakete item.missile_volcano.name=Tectonic Missile item.missile_volcano.desc=Mit der Kraft von Kernwaffen können wir einen Vulkan beschwören! +item.mold_base.name=Blanke Gussform +item.mold.name=Gussform item.morning_glory.name=Zaunwinde item.motor.name=Motor item.motor_desh.name=Desh-Motor @@ -2638,7 +2642,7 @@ item.safety_fuse.name=Zündschnur item.sat_base.name=Satellitenkörper item.sat_chip.name=Satelliten-ID-Chip item.sat_coord.name=Satelliten-Zielmarkierer -item.sat_designator.name=atelliten-Laserzielmarkierer +item.sat_designator.name=Satelliten-Laserzielmarkierer item.sat_foeq.name=PEAF - Mk.I FOEQ Dunasonde mit experimenter nuklearer Schubdüse item.sat_gerald.name=Gerald der Konstruktionsandroid item.sat_head_laser.name=Todesstrahl @@ -2991,6 +2995,17 @@ rbmk.rod.xenon=Xenonvergiftung: %s rbmk.rod.coreTemp=Kerntemperatur: %s rbmk.rod.skinTemp=Außentemperatur: %s / %s +shape.quantum=Quantum +shape.nugget=Nugget +shape.dusttiny=Winziger Haufen +shape.wire=Draht +shape.billet=Billet +shape.ingot=Barren +shape.dust=Haufen +shape.plate=Platte +shape.quart=Viertel Block +shape.block=Block + soundCategory.ntmMachines=NTM Maschinen tile.absorber.name=Strahlungs-Absorber @@ -3323,6 +3338,9 @@ tile.float_bomb.name=Schwebebombe tile.fluid_duct.name=Universelles Flüssigkeitsrohr tile.fluid_duct_solid.name=Geschirmtes universelles Flüssigkeitsrohr tile.foam_layer.name=Schaumdecke +tile.foundry_basin.name=Gussbecken +tile.foundry_channel.name=Gusskanal +tile.foundry_mold.name=Seichtes Gussbecken tile.fraction_spacer.name=Fraktionierungsturm-Teiler tile.frozen_dirt.name=Gefrorene Erde tile.frozen_grass.name=Gefrorenes Gras diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index ba2e8ce3d..64e77a8c7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1127,6 +1127,7 @@ item.balefire_and_ham.name=Ham and Balefire Eggs item.balefire_and_steel.name=Balefire and Steel item.balefire_scrambled.name=Scrambled Balefire Egg item.ball_dynamite.name=Dynamite +item.ball_fireclay.name=Fireclay item.ball_tnt.name=TNT item.ballistite.name=Ballistite item.bandaid.name=Velvet Band-Aid @@ -2036,6 +2037,7 @@ item.ingot_euphemium.desc=A very special and yet strange element. item.ingot_ferrouranium.name=Ferrouranium Ingot item.ingot_fiberglass.name=Fiberglass Bar item.ingot_fiberglass.desc=High in fiber, high in glass. Everything the body needs. +item.ingot_firebrick.name=Firebrick item.ingot_gh336.name=Ghiorsium-336 Ingot item.ingot_gh336.desc=Seaborgium's colleague. item.ingot_graphite.name=Graphite Ingot @@ -2269,6 +2271,8 @@ item.missile_strong.name=Strong HE Missile item.missile_taint.name=Taint-Tipped Missile item.missile_volcano.name=Tectonic Missile item.missile_volcano.desc=Using the power of nuclear explosives, we can summon a volcano! +item.mold_base.name=Blank Foundry Mold +item.mold.name=Foundry Mold item.morning_glory.name=Morning Glory item.motor.name=Motor item.motor_desh.name=Desh Motor @@ -3436,6 +3440,17 @@ rbmk.screen.rod=Control: %s rbmk.screen.temp=Temp: %s rbmk.screen.xenon=Xenon: %s +shape.quantum=Quantum +shape.nugget=Nugget +shape.dusttiny=Tiny Dust +shape.wire=Wire +shape.billet=Billet +shape.ingot=Ingot +shape.dust=Dust +shape.plate=Plate +shape.quart=Quarter Block +shape.block=Block + soundCategory.ntmMachines=NTM Machines tile.absorber.name=Radiation Absorber @@ -3773,6 +3788,9 @@ tile.float_bomb.name=Levitation Bomb tile.fluid_duct.name=Universal Fluid Duct tile.fluid_duct_solid.name=Coated Universal Fluid Duct tile.foam_layer.name=Foam layer +tile.foundry_basin.name=Foundry Basin +tile.foundry_channel.name=Foundry Channel +tile.foundry_mold.name=Shallow Foundry Basin tile.fraction_spacer.name=Fractioning Tower Separator tile.frozen_dirt.name=Frozen Dirt tile.frozen_grass.name=Frozen Grass diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_channel.png b/src/main/resources/assets/hbm/textures/blocks/foundry_channel.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b5094ccff24edbbb94f8ff188d3fe1ba60675f GIT binary patch literal 651 zcmV;60(AX}P)CJZ_1#k`-+Nz0l~^9A>N5p}zyZw#OS`21%@ z>pc>X03#bROE=U_!|!#D5`uvZ>4h4AP-&{B1>h>%Fp4bz!^ohgm0()dI1$hjg11*U z?BTsaln#N!;}|50uj>-l4c^0SyG1`9XePUf0E|NRo}4c$PLC1*>ekUX2ZP~(dcLU8 zlh|^x%s3wPxLmDSuZi5~I#^qD^#0KyA|5O^F(6tO9a9T|k+4w5KBzj!q6v;pVK zil>7Btt2+k46WgMWAD^Y#@z-F`Uz*3ztG>VZ@KP5TJM?dvH=hW8YKm*qQ(&daGe+I z^CSBv0H9|yVW2R&3(IuX5oYOzs%=qHAa@$pRYM$f898|1oTs0}2hIP(1N|swofilx zajr!O(9a)^kphz46EW)6Eb1*E)0QWrfaCFidA0$d=_|C7NFn)fQ=^@Cd|za=&ZFc% zn-_TrrjOBzcR#M~)FdFKq;|T?!6Gl&d$GqPwkXv#-EI!G#NFa`9(Y0P9ZD*|?e6Gu lkQWsmcgVs1UjRg*;V-?A5Tu+8(mntH002ovPDHLkV1n*+A4mWI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_mold.png b/src/main/resources/assets/hbm/textures/blocks/foundry_mold.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b5094ccff24edbbb94f8ff188d3fe1ba60675f GIT binary patch literal 651 zcmV;60(AX}P)CJZ_1#k`-+Nz0l~^9A>N5p}zyZw#OS`21%@ z>pc>X03#bROE=U_!|!#D5`uvZ>4h4AP-&{B1>h>%Fp4bz!^ohgm0()dI1$hjg11*U z?BTsaln#N!;}|50uj>-l4c^0SyG1`9XePUf0E|NRo}4c$PLC1*>ekUX2ZP~(dcLU8 zlh|^x%s3wPxLmDSuZi5~I#^qD^#0KyA|5O^F(6tO9a9T|k+4w5KBzj!q6v;pVK zil>7Btt2+k46WgMWAD^Y#@z-F`Uz*3ztG>VZ@KP5TJM?dvH=hW8YKm*qQ(&daGe+I z^CSBv0H9|yVW2R&3(IuX5oYOzs%=qHAa@$pRYM$f898|1oTs0}2hIP(1N|swofilx zajr!O(9a)^kphz46EW)6Eb1*E)0QWrfaCFidA0$d=_|C7NFn)fQ=^@Cd|za=&ZFc% zn-_TrrjOBzcR#M~)FdFKq;|T?!6Gl&d$GqPwkXv#-EI!G#NFa`9(Y0P9ZD*|?e6Gu lkQWsmcgVs1UjRg*;V-?A5Tu+8(mntH002ovPDHLkV1n*+A4mWI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_base.png b/src/main/resources/assets/hbm/textures/items/mold_base.png new file mode 100644 index 0000000000000000000000000000000000000000..21a8f9729c7c2be1979bf30b292ef6ddc5aa32bb GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfTiFi)3Co3~(T6obRRW&G9& zAA6YFDh^D1cc<{H=#Jm^9JimH6MUef!qmdw`Cd_%>v+Uo=6{bP0l+XkKUej_J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_billet.png b/src/main/resources/assets/hbm/textures/items/mold_billet.png new file mode 100644 index 0000000000000000000000000000000000000000..186a7dea34716cf2d8dda6aa87dafcc2ac78d5b7 GIT binary patch literal 398 zcmV;90df9`P)h|7?KP)S6otRcWHNy)Vi#Hj!KKihOIJ$4r5k-S@r`@}aZ%_t zP*++@2;`?pT!fis+7u(6&7FJZ&f(0N#Cv(XYqc+lL(L{H0Gzdf;r91@?Msq%%9qZ` zii$`pl67haBCW`ZiiD0!NGQeCcf(cb)MLD|=>(irA1dI6$ud5{hfRh5-b)ywDJBw6EM*z6< z3dTkgOt|oO;a}lD3IKQo5^!d@IXlK;K07FT!UdY04R8s#Bivt2@wQ$aoNDaWPp0_g z#J^<6J_w9N=82nP1^abQe-?qU%ovaBa{2!8)7&;e9>OUnoZ%Zgn4`xEi!9dw0000< KMNUMnLSTZU*_O`$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_ingots.png b/src/main/resources/assets/hbm/textures/items/mold_ingots.png new file mode 100644 index 0000000000000000000000000000000000000000..455976e43d4332dbc7904140959467157145a7f1 GIT binary patch literal 484 zcmVvj#KnM<|Be5FxVboV z?dW2mi=&fNS}ZsPDit&>C6MHLi9>qV{HWgY-hJP@kMF&A77Rr3{5L;LAH<|;=V0Nk%EA1p+qS{v0IUBVX|=1Y1H;RkRPej zsNupo27t_-W&d{1LKq2@G@9Yb{ncsgxNG=gldNVN<;mk|e(8tM$DiN3VjgDVU$~5h aM(_&)quv*nd-{z40000-p(x9^rOPN78 ztshv*44rk*7%+|2V?U-xLW8tSImXA)S?BA7Yj7lUk>pCUjkzUr{S65&#!e*u7b+D2 ziO7|NZtfRDvDxl@U6lpu^@=6&3OLDCS)eKle7wC*Y^YQW1OR{2kJ=Cf#tOKTCnT;P z2sjJ%dWGZRYa)9r|0xUHvL|?!Bp?_+B(f0?aW*^w{VW1wnK2&s#qM;z54%3db2#NJ aS>O-rBd~-HZTMgS0000 zj=lpj1C`3zdBH4el+XQ zYIoQ@tQI@iq?Gd+O2b_WqoNZJJzNp0j0I%LaLqJR0>{;XEAlm-av} zk}~lsWnF1;>y$WeBGjLy$m6|jK3)eaMN1vLynSZL@w5I1zJ9FmF<(#>9$ldj&^^|OZkZt*bU3kF?HxY}>VvcTx|W0jnxmAH*pQP&8*0lQ1LoKT*~&j0`b07*qo IM6N<$f|U`hXaE2J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_wire.png b/src/main/resources/assets/hbm/textures/items/mold_wire.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f9db61c5a8fbbc6f59aedb0336c8d58712d373 GIT binary patch literal 423 zcmV;Y0a*TtP)>G zk~G7&kl5!XJmDZoGnL>82m8E4f)-1VDeOlUuqko=_72V%s-{t%%#6dp$KCa1%ix&i z&Bd8Ik2ptBRT#3_bb`%#)ixNr0tqsNfsfgAGFU(sEtV+jTEpy}%;5W*27@@~T^Hoa=_@%hyymxbm};p82Q;TJso!GfP6 Rd}IIs002ovPDHLkV1oapw$lIr literal 0 HcmV?d00001 From 05d370e7d111b4ec1d570359419540fd25c7733e Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 26 Sep 2022 14:06:31 +0200 Subject: [PATCH 077/111] better base code organization for foundry blocks, standardized pouring --- .../java/api/hbm/block/ICrucibleAcceptor.java | 84 ++++++++++++++++- src/main/java/com/hbm/blocks/ModBlocks.java | 9 +- .../com/hbm/blocks/machine/FoundryOutlet.java | 80 ++++++++++++++++ src/main/java/com/hbm/items/ModItems.java | 4 +- src/main/java/com/hbm/lib/Library.java | 4 +- src/main/java/com/hbm/main/NEIConfig.java | 4 +- .../machine/TileEntityCrucible.java | 52 +++++------ .../machine/TileEntityFoundryBase.java | 64 +++++++++++++ .../machine/TileEntityFoundryCastingBase.java | 88 +++--------------- .../machine/TileEntityFoundryChannel.java | 61 ------------ .../machine/TileEntityFoundryOutlet.java | 17 ++++ .../{foundry_basin.png => brick_fire.png} | Bin .../hbm/textures/blocks/brick_light_alt.png | Bin 0 -> 434 bytes .../hbm/textures/blocks/foundry_channel.png | Bin 651 -> 0 bytes .../hbm/textures/blocks/foundry_mold.png | Bin 651 -> 0 bytes 15 files changed, 294 insertions(+), 173 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/FoundryOutlet.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java rename src/main/resources/assets/hbm/textures/blocks/{foundry_basin.png => brick_fire.png} (100%) create mode 100644 src/main/resources/assets/hbm/textures/blocks/brick_light_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_channel.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_mold.png diff --git a/src/main/java/api/hbm/block/ICrucibleAcceptor.java b/src/main/java/api/hbm/block/ICrucibleAcceptor.java index 0f140f941..b94433534 100644 --- a/src/main/java/api/hbm/block/ICrucibleAcceptor.java +++ b/src/main/java/api/hbm/block/ICrucibleAcceptor.java @@ -1,7 +1,13 @@ package api.hbm.block; -import com.hbm.inventory.material.Mats.MaterialStack; +import java.util.List; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; + +import net.minecraft.block.Block; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -22,4 +28,80 @@ public interface ICrucibleAcceptor { //public boolean canAcceptFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); + + /** + * Standard pouring, casting a hitscan straight down at the given coordinates with the given range. Returns the materialStack that has been removed. + * The method doesn't make copies of the MaterialStacks in the list, so the materials being subtracted or outright removed will apply to the original list. + */ + public static MaterialStack tryPour(World world, double x, double y, double z, double range, boolean safe, List stacks, int quanta, Vec3 impactPos) { + + if(stacks.isEmpty()) return null; + + Vec3 start = Vec3.createVectorHelper(x, y, z); + Vec3 end = Vec3.createVectorHelper(x, y - range, z); + + MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true); + + //if the pour misses + if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) { + return spill(mop, safe, stacks, quanta, impactPos); + } + + Block b = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); + + if(!(b instanceof ICrucibleAcceptor)) { + return spill(mop, safe, stacks, quanta, impactPos); + } + + ICrucibleAcceptor acc = (ICrucibleAcceptor) b; + Vec3 hit = mop.hitVec; + MaterialStack pouredStack = null; + + for(MaterialStack stack : stacks) { + + if(stack.material.smeltable != SmeltingBehavior.SMELTABLE) + continue; + + if(acc.canAcceptPartialPour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit).getOpposite(), stack)) { + MaterialStack left = acc.pour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit).getOpposite(), stack); + if(left == null) { + left = new MaterialStack(stack.material, 0); + } + + pouredStack = new MaterialStack(stack.material, stack.amount - left.amount); + stack.amount -= pouredStack.amount; + impactPos.xCoord = hit.xCoord; + impactPos.yCoord = hit.yCoord; + impactPos.zCoord = hit.zCoord; + + break; + } + } + + return pouredStack; + } + + public static MaterialStack spill(MovingObjectPosition mop, boolean safe, List stacks, int quanta, Vec3 impactPos) { + + //do nothing if safe mode is on + if(safe) { + return null; + } + + //simply use the first available material + MaterialStack top = stacks.get(0); + MaterialStack toWaste = new MaterialStack(top.material, Math.min(top.amount, quanta)); + top.amount -= toWaste.amount; + //remove all stacks with no content + stacks.removeIf(o -> o.amount <= 0); + + //if there is a vec3 reference, set the impact coordinates + if(impactPos != null && mop != null) { + impactPos.xCoord = mop.hitVec.xCoord; + impactPos.yCoord = mop.hitVec.yCoord; + impactPos.zCoord = mop.hitVec.zCoord; + } + + return toWaste; + } } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 9c1a06c9e..321f3e122 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -642,6 +642,7 @@ public class ModBlocks { public static Block foundry_mold; public static Block foundry_basin; public static Block foundry_channel; + public static Block foundry_outlet; public static Block machine_difurnace_off; public static Block machine_difurnace_on; @@ -1824,9 +1825,10 @@ public class ModBlocks { machine_sawmill = new MachineSawmill().setBlockName("machine_sawmill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_crucible"); - foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":foundry_mold"); - foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":foundry_basin"); - foundry_channel = new FoundryChannel().setBlockName("foundry_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":foundry_channel"); + foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_channel = new FoundryChannel().setBlockName("foundry_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_outlet = new FoundryOutlet().setBlockName("foundry_outlet").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); @@ -3022,6 +3024,7 @@ public class ModBlocks { register(foundry_mold); register(foundry_basin); register(foundry_channel); + register(foundry_outlet); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_rtg_off, machine_difurnace_rtg_off.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java new file mode 100644 index 000000000..82b0698cf --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -0,0 +1,80 @@ +package com.hbm.blocks.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryOutlet; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + + public FoundryOutlet() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_inner"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryOutlet(); + } + + @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryOutlet) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryOutlet) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index a1c9af8ae..c5038b221 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -3604,8 +3604,8 @@ public class ModItems { coin_maskman = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("coin_maskman").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":coin_maskman"); coin_worm = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("coin_worm").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":coin_worm"); coin_ufo = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("coin_ufo").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":coin_ufo"); - coin_siege = new ItemSiegeCoin().setUnlocalizedName("coin_siege").setCreativeTab(MainRegistry.consumableTab); - source = new ItemCustomLore().setRarity(EnumRarity.epic).setUnlocalizedName("source").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":source"); + coin_siege = new ItemSiegeCoin().setUnlocalizedName("coin_siege").setCreativeTab(null); + source = new ItemCustomLore().setRarity(EnumRarity.epic).setUnlocalizedName("source").setCreativeTab(null).setTextureName(RefStrings.MODID + ":source"); recycled_ground = new Item().setUnlocalizedName("recycled_ground").setCreativeTab(null).setTextureName(RefStrings.MODID + ":recycled_ground"); recycled_rock = new Item().setUnlocalizedName("recycled_rock").setCreativeTab(null).setTextureName(RefStrings.MODID + ":recycled_rock"); diff --git a/src/main/java/com/hbm/lib/Library.java b/src/main/java/com/hbm/lib/Library.java index a4cd31470..78c66c4ec 100644 --- a/src/main/java/com/hbm/lib/Library.java +++ b/src/main/java/com/hbm/lib/Library.java @@ -300,12 +300,12 @@ public class Library { return player.worldObj.func_147447_a(vec3, vec32, false, false, true); } - public static MovingObjectPosition rayTrace(EntityPlayer player, double length, float interpolation, boolean liquids, boolean entity, boolean allowZeroLength) { + public static MovingObjectPosition rayTrace(EntityPlayer player, double length, float interpolation, boolean allowLiquids, boolean disallowNonCollidingBlocks, boolean mopOnMiss) { Vec3 vec3 = getPosition(interpolation, player); vec3.yCoord += player.eyeHeight; Vec3 vec31 = player.getLook(interpolation); Vec3 vec32 = vec3.addVector(vec31.xCoord * length, vec31.yCoord * length, vec31.zCoord * length); - return player.worldObj.func_147447_a(vec3, vec32, liquids, entity, allowZeroLength); + return player.worldObj.func_147447_a(vec3, vec32, allowLiquids, disallowNonCollidingBlocks, mopOnMiss); } public static Vec3 getPosition(float interpolation, EntityPlayer player) { diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 0b79f4212..44e9aed37 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -15,7 +15,6 @@ import codechicken.nei.api.IConfigureNEI; import codechicken.nei.api.IHighlightHandler; import codechicken.nei.api.ItemInfo.Layout; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; @@ -102,8 +101,11 @@ public class NEIConfig implements IConfigureNEI { API.hideItem(new ItemStack(ModBlocks.statue_elb_f)); API.hideItem(new ItemStack(ModBlocks.cheater_virus)); API.hideItem(new ItemStack(ModBlocks.cheater_virus_seed)); + API.hideItem(new ItemStack(ModBlocks.transission_hatch)); API.hideItem(new ItemStack(ModItems.euphemium_kit)); API.hideItem(new ItemStack(ModItems.bobmazon_hidden)); + API.hideItem(new ItemStack(ModItems.coin_siege)); + API.hideItem(new ItemStack(ModItems.source)); if(MainRegistry.polaroidID != 11) { API.hideItem(new ItemStack(ModItems.book_secret)); API.hideItem(new ItemStack(ModItems.book_of_)); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index febaef81e..13e77a1da 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -24,12 +24,12 @@ import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -95,43 +95,39 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro this.progress = 0; } - /* TEMP */ if(!this.wasteStack.isEmpty()) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); + ICrucibleAcceptor.tryPour(worldObj, xCoord + 0.5D + dir.offsetX * 1.75D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.75D, 6, true, this.wasteStack, MaterialShapes.NUGGET.q(1), impact); + } + + if(!this.recipeStack.isEmpty()) { - outer: - for(MaterialStack stack : this.wasteStack) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + List toCast = new ArrayList(); + + CrucibleRecipe recipe = this.getLoadedRecipe(); + //if no recipe is loaded, everything from the recipe stack will be drainable + if(recipe == null) { + toCast.addAll(this.recipeStack); + } else { - for(int i = 0; i < 4; i++) { - int x = xCoord + dir.offsetX * 2; - int z = zCoord + dir.offsetZ * 2; - int y = yCoord - i - 1; - Block b = worldObj.getBlock(x, y, z); - if(b.isAir(worldObj, x, y, z)) continue; - - if(b instanceof ICrucibleAcceptor) { - - ICrucibleAcceptor acc = (ICrucibleAcceptor) b; - int pourAmount = Math.min(MaterialShapes.NUGGET.q(1), stack.amount); - MaterialStack toPour = new MaterialStack(stack.material, pourAmount); - - if(acc.canAcceptPartialPour(worldObj, x, y, z, 0.5, 1, 0.5, ForgeDirection.UP, toPour)) { - int prev = pourAmount; - MaterialStack left = acc.pour(worldObj, x, y, z, 0.5, 1, 0.5, ForgeDirection.UP, toPour); - - int diff = prev - (left != null ? left.amount : 0); - stack.amount -= diff; - - break outer; + for(MaterialStack stack : this.recipeStack) { + for(MaterialStack output : recipe.output) { + if(stack.material == output.material) { + toCast.add(stack); + break; } - } else { - break; } } } + + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); + ICrucibleAcceptor.tryPour(worldObj, xCoord + 0.5D + dir.offsetX * 1.75D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.75D, 6, true, toCast, MaterialShapes.NUGGET.q(1), impact); } - + + this.recipeStack.removeIf(o -> o.amount <= 0); this.wasteStack.removeIf(x -> x.amount <= 0); NBTTagCompound data = new NBTTagCompound(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java index 20838c62e..6e5743fdc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.material.Mats.MaterialStack; import api.hbm.block.ICrucibleAcceptor; import net.minecraft.nbt.NBTTagCompound; @@ -9,6 +10,8 @@ import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; /** * Base class for all foundry channel type blocks - channels, casts, basins, tanks, etc. @@ -80,4 +83,65 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci } public abstract int getCapacity(); + + /** + * Standard check for testing if this material stack can be added to the casting block. Checks:
+ * - type matching
+ * - amount being at max
+ */ + public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material + if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full + return true; + } + + /** + * Standardized adding of material via pouring or flowing. Does:
+ * - sets material to match the input + * - adds the amount, not exceeding the maximum + * - returns the amount that cannot be added + */ + public MaterialStack standardAdd(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + + if(this.type == null) { + this.type = stack.material; + } + + if(stack.amount + this.amount <= this.getCapacity()) { + this.amount += stack.amount; + return null; + } + + int required = this.getCapacity() - this.amount; + this.amount = this.getCapacity(); + + stack.amount -= required; + + return stack; + } + + /** Standard check with no additional limitations added */ + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return this.standardCheck(world, x, y, z, side, stack); + } + + /** Standard flow, no special handling required */ + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return standardAdd(world, x, y, z, side, stack); + } + + /** Standard check, but with the additional limitation that the only valid source direction is UP */ + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + if(side != ForgeDirection.UP) return false; + return this.standardCheck(world, x, y, z, side, stack); + } + + /** Standard flow, no special handling required */ + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return standardAdd(world, x, y, z, side, stack); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java index 48183a52f..18a513e19 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -76,31 +76,6 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase Mold mold = this.getInstalledMold(); return mold == null ? 0 : mold.getCost(); } - - /** Standard check with no additional limitations added */ - @Override - public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - return this.standardCheck(world, x, y, z, side, stack); - } - - /** Standard flow, no special handling required */ - @Override - public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - return standardAdd(world, x, y, z, side, stack); - } - - /** Standard check, but with the additional limitation that the only valid source direction is UP */ - @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - if(side != ForgeDirection.UP) return false; - return this.standardCheck(world, x, y, z, side, stack); - } - - /** Standard flow, no special handling required */ - @Override - public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - return standardAdd(world, x, y, z, side, stack); - } /** * Standard check for testing if this material stack can be added to the casting block. Checks:
@@ -110,8 +85,7 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase * - whether the mold can accept this type */ public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material - if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full + if(!super.standardCheck(world, x, y, z, side, stack)) return false; //reject if base conditions are not met if(this.slots[1] != null) return false; //reject if a freshly casted item is still present Mold mold = this.getInstalledMold(); if(mold == null) return false; @@ -127,44 +101,9 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase return false; //no OD match -> no pouring } - /** - * Standardized adding of material via pouring or flowing. Does:
- * - sets material to match the input - * - adds the amount, not exceeding the maximum - * - returns the amount that cannot be added - */ - public MaterialStack standardAdd(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - - if(this.type == null) { - this.type = stack.material; - } - - if(stack.amount + this.amount <= this.getCapacity()) { - this.amount += stack.amount; - return null; - } - - int required = this.getCapacity() - this.amount; - this.amount = this.getCapacity(); - - stack.amount -= required; - - return stack; - } - /** Returns an integer determining the mold size, 0 for small molds and 1 for the basin */ public abstract int getMoldSize(); - @Override - public int getSizeInventory() { - return slots.length; - } - - @Override - public ItemStack getStackInSlot(int i) { - return slots[i]; - } - @Override public ItemStack getStackInSlotOnClosing(int i) { if(slots[i] != null) { @@ -203,13 +142,18 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase } @Override - public String getInventoryName() { - return "ntmFoundry"; + public int getSizeInventory() { + return slots.length; } @Override - public boolean hasCustomInventoryName() { - return false; + public ItemStack getStackInSlot(int i) { + return slots[i]; + } + + @Override + public String getInventoryName() { + return "ntmFoundry"; } @Override @@ -217,15 +161,9 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase return 64; } - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return false; - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack stack) { - return false; - } + @Override public boolean hasCustomInventoryName() { return false; } + @Override public boolean isUseableByPlayer(EntityPlayer player) { return false; } + @Override public boolean isItemValidForSlot(int i, ItemStack stack) { return false; } @Override public void openInventory() { } @Override public void closeInventory() { } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java index a9d73912b..87af1488f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java @@ -11,7 +11,6 @@ import com.hbm.inventory.material.Mats.MaterialStack; import api.hbm.block.ICrucibleAcceptor; import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityFoundryChannel extends TileEntityFoundryBase { @@ -86,66 +85,6 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { super.updateEntity(); } - @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - - if(side != ForgeDirection.UP) return false; //reject from any direction other than the top - if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material - if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full - - return true; //pour - } - - @Override - public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - - if(this.type == null) { - this.type = stack.material; - } - - if(stack.amount + this.amount <= this.getCapacity()) { - this.amount += stack.amount; - return null; - } - - int required = this.getCapacity() - this.amount; - this.amount = this.getCapacity(); - - stack.amount -= required; - - return stack; - } - - @Override - public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - - if(side == ForgeDirection.UP || side == ForgeDirection.DOWN) return false; - if(this.type != null && this.type != stack.material) return false; - if(this.amount >= this.getCapacity()) return false; - - return true; //pour - } - - @Override - public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - - if(this.type == null) { - this.type = stack.material; - } - - if(stack.amount + this.amount <= this.getCapacity()) { - this.amount += stack.amount; - return null; - } - - int required = this.getCapacity() - this.amount; - this.amount = this.getCapacity(); - - stack.amount -= required; - - return stack; - } - @Override public int getCapacity() { return MaterialShapes.INGOT.q(1); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java new file mode 100644 index 000000000..8b029c69f --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -0,0 +1,17 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFoundryOutlet extends TileEntityFoundryBase { + + @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } + + @Override + public int getCapacity() { + return 0; + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin.png b/src/main/resources/assets/hbm/textures/blocks/brick_fire.png similarity index 100% rename from src/main/resources/assets/hbm/textures/blocks/foundry_basin.png rename to src/main/resources/assets/hbm/textures/blocks/brick_fire.png diff --git a/src/main/resources/assets/hbm/textures/blocks/brick_light_alt.png b/src/main/resources/assets/hbm/textures/blocks/brick_light_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..5d06218535d3221a05724e39a3697dfe6f107fa2 GIT binary patch literal 434 zcmV;j0ZsmiP)bbzS#+`VU?7GwO~FNjIc+ zbYcTj$Hp#TCScilHxIav$J~1#qxZMx%cuAzOCz@VflW3iF9Z+K9bw>+7lJH}$P2-b z9<#~j$m5AH@BkQ3f(6TTji^HmmgyRG_9*udB`Xv$QL+LcF9efdfg(l`GX|(?jX!hk zfU4Gn_b~we%Kx#2|(aA-WxO4^s*X=tm_Z0`M;YoA*Q+x*a84%h$ul?NtQfRD23 zY3}B2h8f;)jv{6fv>jy*V0Xd~TtpjL6Jv7CJZ_1#k`-+Nz0l~^9A>N5p}zyZw#OS`21%@ z>pc>X03#bROE=U_!|!#D5`uvZ>4h4AP-&{B1>h>%Fp4bz!^ohgm0()dI1$hjg11*U z?BTsaln#N!;}|50uj>-l4c^0SyG1`9XePUf0E|NRo}4c$PLC1*>ekUX2ZP~(dcLU8 zlh|^x%s3wPxLmDSuZi5~I#^qD^#0KyA|5O^F(6tO9a9T|k+4w5KBzj!q6v;pVK zil>7Btt2+k46WgMWAD^Y#@z-F`Uz*3ztG>VZ@KP5TJM?dvH=hW8YKm*qQ(&daGe+I z^CSBv0H9|yVW2R&3(IuX5oYOzs%=qHAa@$pRYM$f898|1oTs0}2hIP(1N|swofilx zajr!O(9a)^kphz46EW)6Eb1*E)0QWrfaCFidA0$d=_|C7NFn)fQ=^@Cd|za=&ZFc% zn-_TrrjOBzcR#M~)FdFKq;|T?!6Gl&d$GqPwkXv#-EI!G#NFa`9(Y0P9ZD*|?e6Gu lkQWsmcgVs1UjRg*;V-?A5Tu+8(mntH002ovPDHLkV1n*+A4mWI diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_mold.png b/src/main/resources/assets/hbm/textures/blocks/foundry_mold.png deleted file mode 100644 index f3b5094ccff24edbbb94f8ff188d3fe1ba60675f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)CJZ_1#k`-+Nz0l~^9A>N5p}zyZw#OS`21%@ z>pc>X03#bROE=U_!|!#D5`uvZ>4h4AP-&{B1>h>%Fp4bz!^ohgm0()dI1$hjg11*U z?BTsaln#N!;}|50uj>-l4c^0SyG1`9XePUf0E|NRo}4c$PLC1*>ekUX2ZP~(dcLU8 zlh|^x%s3wPxLmDSuZi5~I#^qD^#0KyA|5O^F(6tO9a9T|k+4w5KBzj!q6v;pVK zil>7Btt2+k46WgMWAD^Y#@z-F`Uz*3ztG>VZ@KP5TJM?dvH=hW8YKm*qQ(&daGe+I z^CSBv0H9|yVW2R&3(IuX5oYOzs%=qHAa@$pRYM$f898|1oTs0}2hIP(1N|swofilx zajr!O(9a)^kphz46EW)6Eb1*E)0QWrfaCFidA0$d=_|C7NFn)fQ=^@Cd|za=&ZFc% zn-_TrrjOBzcR#M~)FdFKq;|T?!6Gl&d$GqPwkXv#-EI!G#NFa`9(Y0P9ZD*|?e6Gu lkQWsmcgVs1UjRg*;V-?A5Tu+8(mntH002ovPDHLkV1n*+A4mWI From 52fc3868ffe8269ee9501d3de7b33fe29dfbcc95 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 26 Sep 2022 16:54:24 +0200 Subject: [PATCH 078/111] more base code, usable molds --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../blocks/machine/FoundryCastingBase.java | 98 ++++++++++++++++++- .../hbm/blocks/machine/MachineCyclotron.java | 2 - src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/CraftingManager.java | 2 + .../com/hbm/render/block/RenderOutlet.java | 31 ++++++ .../machine/TileEntityCrucible.java | 1 - .../machine/TileEntityFoundryBase.java | 5 +- .../machine/TileEntityFoundryCastingBase.java | 35 +++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 3 + src/main/resources/assets/hbm/lang/en_US.lang | 3 + 11 files changed, 178 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/hbm/render/block/RenderOutlet.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 321f3e122..3a3620405 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -342,6 +342,7 @@ public class ModBlocks { public static Block brick_light; public static Block brick_compound; public static Block brick_asbestos; + public static Block brick_fire; public static Block cmb_brick; public static Block cmb_brick_reinforced; @@ -1604,6 +1605,7 @@ public class ModBlocks { cmb_brick = new BlockGeneric(Material.rock).setBlockName("cmb_brick").setCreativeTab(MainRegistry.blockTab).setHardness(25.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":cmb_brick"); cmb_brick_reinforced = new BlockGeneric(Material.rock).setBlockName("cmb_brick_reinforced").setCreativeTab(MainRegistry.blockTab).setHardness(25.0F).setResistance(60000.0F).setBlockTextureName(RefStrings.MODID + ":cmb_brick_reinforced"); brick_asbestos = new BlockOutgas(Material.rock, true, 5, true).setBlockName("brick_asbestos").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(1000.0F).setBlockTextureName(RefStrings.MODID + ":brick_asbestos"); + brick_fire = new BlockGeneric(Material.rock).setBlockName("brick_fire").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(160.0F).setBlockTextureName(RefStrings.MODID + ":brick_fire"); ducrete_smooth = new BlockGeneric(Material.rock).setBlockName("ducrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(8000.0F).setBlockTextureName(RefStrings.MODID + ":ducrete"); @@ -2707,6 +2709,7 @@ public class ModBlocks { GameRegistry.registerBlock(brick_compound, ItemBlockBlastInfo.class, brick_compound.getUnlocalizedName()); GameRegistry.registerBlock(brick_light, ItemBlockBlastInfo.class, brick_light.getUnlocalizedName()); GameRegistry.registerBlock(brick_asbestos, brick_asbestos.getUnlocalizedName()); + GameRegistry.registerBlock(brick_fire, ItemBlockBlastInfo.class, brick_fire.getUnlocalizedName()); //CMB Building Elements GameRegistry.registerBlock(cmb_brick, ItemBlockBlastInfo.class, cmb_brick.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index bb9ea6f92..486ddd7f2 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -1,17 +1,31 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMold; +import com.hbm.items.machine.ItemMold.Mold; +import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; +import com.hbm.util.I18nUtil; import api.hbm.block.ICrucibleAcceptor; +import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public abstract class FoundryCastingBase extends BlockContainer implements ICrucibleAcceptor { +public abstract class FoundryCastingBase extends BlockContainer implements ICrucibleAcceptor, IToolable, ILookOverlay { protected FoundryCastingBase() { super(Material.rock); @@ -51,4 +65,86 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc public boolean renderAsNormalBlock() { return false; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + + //remove casted item + if(cast.slots[1] != null) { + if(!player.inventory.addItemStackToInventory(cast.slots[1].copy())) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[1].copy()); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + + cast.slots[1] = null; + cast.markDirty(); + return true; + } + + //insert mold + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.mold && cast.slots[0] == null) { + Mold mold = ((ItemMold) player.getHeldItem().getItem()).getMold(player.getHeldItem()); + + if(mold.size == cast.getMoldSize()) { + cast.slots[0] = player.getHeldItem().copy(); + cast.slots[0].stackSize = 1; + player.getHeldItem().stackSize--; + cast.markDirty(); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); + return true; + } + } + + return false; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) + return false; + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + + if(cast.slots[0] == null) + return false; + + if(!player.inventory.addItemStackToInventory(cast.slots[0].copy())) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[0].copy()); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + + cast.slots[0] = null; + cast.markDirty(); + + return true; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + List text = new ArrayList(); + + if(cast.slots[0] == null) { + text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noMold")); + } else if(cast.slots[0].getItem() == ModItems.mold){ + Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); + text.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("shape." + mold.shape.name().toLowerCase()) + " x" + mold.amount); + } + + if(cast.type != null && cast.amount > 0) { + text.add(EnumChatFormatting.YELLOW + cast.type.names[0] + ": " + cast.amount + " / " + cast.getCapacity()); + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCyclotron.java b/src/main/java/com/hbm/blocks/machine/MachineCyclotron.java index fe0535f3d..7ca40d18f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCyclotron.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCyclotron.java @@ -2,7 +2,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineCyclotron; @@ -10,7 +9,6 @@ import com.hbm.tileentity.machine.TileEntityMachineCyclotron; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 8cc2be030..dd6041aeb 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -747,6 +747,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderBasin()); RenderingRegistry.registerBlockHandler(new RenderMold()); RenderingRegistry.registerBlockHandler(new RenderChannel()); + RenderingRegistry.registerBlockHandler(new RenderOutlet()); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite)); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4)); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 0524fb0c2..7e55fcfc0 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -956,6 +956,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.foundry_mold), new Object[] { "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); addRecipeAuto(new ItemStack(ModBlocks.foundry_channel, 4), new Object[] { "B B", " S ", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); addRecipeAuto(new ItemStack(ModItems.mold_base), new Object[] { " B ", "BIB", " B ", 'B', ModItems.ingot_firebrick, 'I', IRON.ingot() }); + addRecipeAuto(new ItemStack(ModBlocks.brick_fire), new Object[] { "BB", "BB", 'B', ModItems.ingot_firebrick }); + addShapelessAuto(new ItemStack(ModItems.ingot_firebrick, 4), new Object[] { ModBlocks.brick_fire }); addShapelessAuto(new ItemStack(ModItems.upgrade_5g), new Object[] { ModItems.upgrade_template, ModItems.gem_alexandrite }); diff --git a/src/main/java/com/hbm/render/block/RenderOutlet.java b/src/main/java/com/hbm/render/block/RenderOutlet.java new file mode 100644 index 000000000..b7ded4b0c --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderOutlet.java @@ -0,0 +1,31 @@ +package com.hbm.render.block; + +import com.hbm.blocks.machine.FoundryOutlet; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.world.IBlockAccess; + +public class RenderOutlet implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryOutlet.renderID; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 13e77a1da..ddf46931b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -20,7 +20,6 @@ import api.hbm.block.ICrucibleAcceptor; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java index 6e5743fdc..f786db815 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java @@ -74,10 +74,11 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - if(this.type == null) + if(this.type == null) { nbt.setInteger("type", -1); - else + } else { nbt.setInteger("type", this.type.id); + } nbt.setInteger("amount", this.amount); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java index 18a513e19..0ddadd2c5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -10,6 +10,8 @@ import com.hbm.items.machine.ItemMold.Mold; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.oredict.OreDictionary; @@ -167,4 +169,37 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase @Override public void openInventory() { } @Override public void closeInventory() { } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + NBTTagList list = nbt.getTagList("items", 10); + slots = new ItemStack[getSizeInventory()]; + + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound nbt1 = list.getCompoundTagAt(i); + byte b0 = nbt1.getByte("slot"); + if(b0 >= 0 && b0 < slots.length) { + slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList list = new NBTTagList(); + + for(int i = 0; i < slots.length; i++) { + if(slots[i] != null) { + NBTTagCompound nbt1 = new NBTTagCompound(); + nbt1.setByte("slot", (byte) i); + slots[i].writeToNBT(nbt1); + list.appendTag(nbt1); + } + } + nbt.setTag("items", list); + } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 7c7bd4541..66f8a863c 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -489,6 +489,8 @@ fluid.schrabidic_fluid=Schrabidische Säure fluid.toxic_fluid=Stereotypischer grüner Schleim fluid.volcanic_lava_fluid=Vulkanische Lava +foundry.noCast=Keine Form eingelegt! + geiger.chunkRad=Chunk-Strahlung: geiger.envRad=Gesamte Umgebungsstrahlung: geiger.playerRad=Spieler-Kontaminierung: @@ -3173,6 +3175,7 @@ tile.brick_dungeon.name=Berzelianitziegel tile.brick_dungeon_circle.name=Berzelianitkreis tile.brick_dungeon_flat.name=Berzelianitblock tile.brick_dungeon_tile.name=Berzelianitfliese +tile.brick_fire.name=Schamottsteinziegel tile.brick_jungle.name=Enargitziegel tile.brick_jungle_circle.name=Mechanistenzirkel tile.brick_jungle_cracked.name=Rissige Enargitziegel diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 64e77a8c7..91a72b9df 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -719,6 +719,8 @@ fluid.schrabidic_fluid=Schrabidic Acid fluid.toxic_fluid=Stereotypical Green Ooze fluid.volcanic_lava_fluid=Volcanic Lava +foundry.noCast=No mold installed! + geiger.chunkRad=Current chunk radiation: geiger.envRad=Total environmental radiation: geiger.playerRad=Player contamination: @@ -3622,6 +3624,7 @@ tile.brick_dungeon.name=Berzelianite Bricks tile.brick_dungeon_circle.name=Berzelianite Cirlce tile.brick_dungeon_flat.name=Berzelianite Block tile.brick_dungeon_tile.name=Berzelianite Tile +tile.brick_fire.name=Firebricks tile.brick_jungle.name=Enargite Bricks tile.brick_jungle_circle.name=Mechanist's Circle tile.brick_jungle_cracked.name=Cracked Enargite Bricks From 50826c13f6a652ae153128c811990d50da56c9b2 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 26 Sep 2022 23:27:57 +0200 Subject: [PATCH 079/111] fixed pouring, proper item rendering in molds --- .../java/api/hbm/block/ICrucibleAcceptor.java | 7 +- .../blocks/machine/FoundryCastingBase.java | 9 +- .../hbm/render/tileentity/RenderFoundry.java | 146 ++++++++++++------ .../tileentity/machine/IRenderFoundry.java | 2 + .../machine/TileEntityCrucible.java | 4 +- .../machine/TileEntityFoundryBasin.java | 2 + .../machine/TileEntityFoundryCastingBase.java | 11 ++ .../machine/TileEntityFoundryMold.java | 2 + 8 files changed, 133 insertions(+), 50 deletions(-) diff --git a/src/main/java/api/hbm/block/ICrucibleAcceptor.java b/src/main/java/api/hbm/block/ICrucibleAcceptor.java index b94433534..2ecfcd1ee 100644 --- a/src/main/java/api/hbm/block/ICrucibleAcceptor.java +++ b/src/main/java/api/hbm/block/ICrucibleAcceptor.java @@ -59,11 +59,12 @@ public interface ICrucibleAcceptor { for(MaterialStack stack : stacks) { - if(stack.material.smeltable != SmeltingBehavior.SMELTABLE) + if(stack.material.smeltable != SmeltingBehavior.SMELTABLE) { continue; + } - if(acc.canAcceptPartialPour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit).getOpposite(), stack)) { - MaterialStack left = acc.pour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit).getOpposite(), stack); + if(acc.canAcceptPartialPour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack)) { + MaterialStack left = acc.pour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack); if(left == null) { left = new MaterialStack(stack.material, 0); } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index 486ddd7f2..7b968c4aa 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -85,6 +85,7 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc cast.slots[1] = null; cast.markDirty(); + world.markBlockForUpdate(x, y, z); return true; } @@ -96,8 +97,9 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc cast.slots[0] = player.getHeldItem().copy(); cast.slots[0].stackSize = 1; player.getHeldItem().stackSize--; - cast.markDirty(); world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); + cast.markDirty(); + world.markBlockForUpdate(x, y, z); return true; } } @@ -123,6 +125,9 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc player.inventoryContainer.detectAndSendChanges(); } + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + cast.slots[0] = null; cast.markDirty(); @@ -135,7 +140,7 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc List text = new ArrayList(); if(cast.slots[0] == null) { - text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noMold")); + text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noCast")); } else if(cast.slots[0].getItem() == ModItems.mold){ Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); text.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("shape." + mold.shape.name().toLowerCase()) + " x" + mold.amount); diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java index b6fbf9f85..4bc23824e 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -7,69 +7,129 @@ import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.IRenderFoundry; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.ForgeHooksClient; public class RenderFoundry extends TileEntitySpecialRenderer { public static final ResourceLocation lava = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lava_gray.png"); + + private void drawItem(ItemStack stack, double height) { + GL11.glPushMatrix(); + RenderItem render = new RenderItem(); + GL11.glTranslated(0.125D, height, 0.125D); + + double scale = 0.0625D * 12D / 16D; + GL11.glScaled(scale, scale, scale); + + GL11.glRotated(90, 1, 0, 0); + RenderHelper.enableGUIStandardItemLighting(); + if(!ForgeHooksClient.renderInventoryItem(RenderBlocks.getInstance(), Minecraft.getMinecraft().getTextureManager(), stack, true, 0.0F, 1.0F, 0.0F)) { + render.renderItemIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, 0, 0); + } + GL11.glPopMatrix(); + RenderHelper.enableStandardItemLighting(); + } + + private void drawBlock(ItemStack stack, IRenderFoundry foundry) { + Tessellator tess = Tessellator.instance; + Block b = ((ItemBlock)stack.getItem()).field_150939_a; + IIcon icon = b.getIcon(1, stack.getItemDamage()); + bindTexture(TextureMap.locationBlocksTexture); + + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(1F, 1F, 1F, 0.3F); + double h = foundry.outHeight(); + tess.addVertexWithUV(foundry.minX(), h, foundry.minZ(), icon.getMinU(), icon.getMaxV()); + tess.addVertexWithUV(foundry.minX(), h, foundry.maxZ(), icon.getMaxU(), icon.getMaxV()); + tess.addVertexWithUV(foundry.maxX(), h, foundry.maxZ(), icon.getMaxU(), icon.getMinV()); + tess.addVertexWithUV(foundry.maxX(), h, foundry.minZ(), icon.getMinU(), icon.getMinV()); + tess.draw(); + } @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { IRenderFoundry foundry = (IRenderFoundry) tile; - - if(!foundry.shouldRender()) return; + Tessellator tess = Tessellator.instance; GL11.glPushMatrix(); GL11.glTranslated(x, y, z); - GL11.glDepthMask(false); - Tessellator tess = Tessellator.instance; - this.bindTexture(lava); - - int hex = foundry.getMat().moltenColor; - Color color = new Color(hex); - - GL11.glPushMatrix(); - GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); - - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_CULL_FACE); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); - - tess.startDrawingQuads(); - tess.setNormal(0F, 1F, 0F); - tess.setColorRGBA_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1F); - tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.maxX()); - tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.maxX()); - tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.minX()); - tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); - tess.draw(); - - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); - tess.startDrawingQuads(); - tess.setNormal(0F, 1F, 0F); - tess.setColorRGBA_F(1F, 1F, 1F, 0.3F); - tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.maxX()); - tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.maxX()); - tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.minX()); - tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); - tess.draw(); - - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glPopAttrib(); - GL11.glPopMatrix(); - - GL11.glDepthMask(true); - if(foundry instanceof IInventory) { IInventory inv = (IInventory) foundry; + ItemStack mold = inv.getStackInSlot(0); + + if(mold != null) { + drawItem(mold, foundry.moldHeight()); + } + ItemStack out = inv.getStackInSlot(1); + + if(out != null) { + if(out.getItem() instanceof ItemBlock) { + drawBlock(out, foundry); + } else { + drawItem(out, foundry.outHeight()); + } + } + } + + if(foundry.shouldRender()) { + + GL11.glDepthMask(false); + this.bindTexture(lava); + + int hex = foundry.getMat().moltenColor; + Color color = new Color(hex); + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1F); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.minX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); + tess.draw(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(1F, 1F, 1F, 0.3F); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.minX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); + tess.draw(); + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopAttrib(); + GL11.glPopMatrix(); + + GL11.glDepthMask(true); } GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java b/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java index 057a05c42..cae2f1e93 100644 --- a/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java +++ b/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java @@ -16,4 +16,6 @@ public interface IRenderFoundry { public double maxX(); public double minZ(); public double maxZ(); + public double moldHeight(); + public double outHeight(); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index ddf46931b..0f31dd73c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -98,7 +98,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); Vec3 impact = Vec3.createVectorHelper(0, 0, 0); - ICrucibleAcceptor.tryPour(worldObj, xCoord + 0.5D + dir.offsetX * 1.75D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.75D, 6, true, this.wasteStack, MaterialShapes.NUGGET.q(1), impact); + ICrucibleAcceptor.tryPour(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, this.wasteStack, MaterialShapes.NUGGET.q(1), impact); } if(!this.recipeStack.isEmpty()) { @@ -123,7 +123,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } Vec3 impact = Vec3.createVectorHelper(0, 0, 0); - ICrucibleAcceptor.tryPour(worldObj, xCoord + 0.5D + dir.offsetX * 1.75D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.75D, 6, true, toCast, MaterialShapes.NUGGET.q(1), impact); + ICrucibleAcceptor.tryPour(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, toCast, MaterialShapes.NUGGET.q(1), impact); } this.recipeStack.removeIf(o -> o.amount <= 0); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java index 1d2a7a390..145c2159a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java @@ -41,4 +41,6 @@ public class TileEntityFoundryBasin extends TileEntityFoundryCastingBase impleme @Override public double maxX() { return 0.875D; } @Override public double minZ() { return 0.125D; } @Override public double maxZ() { return 0.875D; } + @Override public double moldHeight() { return 0.13D; } + @Override public double outHeight() { return 0.875D; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java index 0ddadd2c5..02c558698 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -31,6 +31,15 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase super.updateEntity(); if(!worldObj.isRemote) { + + if(this.amount > this.getCapacity()) { + this.amount = this.getCapacity(); + } + + if(this.amount == 0) { + this.type = null; + } + Mold mold = this.getInstalledMold(); if(mold != null && this.amount == this.getCapacity() && slots[1] == null) { @@ -123,10 +132,12 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { itemStack.stackSize = getInventoryStackLimit(); } + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } @Override public ItemStack decrStackSize(int slot, int amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); if(slots[slot] != null) { if(slots[slot].stackSize <= amount) { ItemStack itemStack = slots[slot]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java index 43c33ffce..607b1d13c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java @@ -33,4 +33,6 @@ public class TileEntityFoundryMold extends TileEntityFoundryCastingBase implemen @Override public double maxX() { return 0.875D; } @Override public double minZ() { return 0.125D; } @Override public double maxZ() { return 0.875D; } + @Override public double moldHeight() { return 0.13D; } + @Override public double outHeight() { return 0.25D; } } From 462be270d9eb8eaf8f289c523ed8f2988177e17e Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 27 Sep 2022 16:51:58 +0200 Subject: [PATCH 080/111] improved pouring code, crucible util class --- .../java/api/hbm/block/ICrucibleAcceptor.java | 83 --------- .../container/ContainerRBMKStorage.java | 4 +- .../machine/TileEntityCrucible.java | 6 +- .../machine/TileEntityFoundryOutlet.java | 11 ++ src/main/java/com/hbm/util/CrucibleUtil.java | 166 ++++++++++++++++++ 5 files changed, 182 insertions(+), 88 deletions(-) create mode 100644 src/main/java/com/hbm/util/CrucibleUtil.java diff --git a/src/main/java/api/hbm/block/ICrucibleAcceptor.java b/src/main/java/api/hbm/block/ICrucibleAcceptor.java index 2ecfcd1ee..0f140f941 100644 --- a/src/main/java/api/hbm/block/ICrucibleAcceptor.java +++ b/src/main/java/api/hbm/block/ICrucibleAcceptor.java @@ -1,13 +1,7 @@ package api.hbm.block; -import java.util.List; - import com.hbm.inventory.material.Mats.MaterialStack; -import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; -import net.minecraft.block.Block; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -28,81 +22,4 @@ public interface ICrucibleAcceptor { //public boolean canAcceptFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); - - /** - * Standard pouring, casting a hitscan straight down at the given coordinates with the given range. Returns the materialStack that has been removed. - * The method doesn't make copies of the MaterialStacks in the list, so the materials being subtracted or outright removed will apply to the original list. - */ - public static MaterialStack tryPour(World world, double x, double y, double z, double range, boolean safe, List stacks, int quanta, Vec3 impactPos) { - - if(stacks.isEmpty()) return null; - - Vec3 start = Vec3.createVectorHelper(x, y, z); - Vec3 end = Vec3.createVectorHelper(x, y - range, z); - - MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true); - - //if the pour misses - if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) { - return spill(mop, safe, stacks, quanta, impactPos); - } - - Block b = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); - - if(!(b instanceof ICrucibleAcceptor)) { - return spill(mop, safe, stacks, quanta, impactPos); - } - - ICrucibleAcceptor acc = (ICrucibleAcceptor) b; - Vec3 hit = mop.hitVec; - MaterialStack pouredStack = null; - - for(MaterialStack stack : stacks) { - - if(stack.material.smeltable != SmeltingBehavior.SMELTABLE) { - continue; - } - - if(acc.canAcceptPartialPour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack)) { - MaterialStack left = acc.pour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack); - if(left == null) { - left = new MaterialStack(stack.material, 0); - } - - pouredStack = new MaterialStack(stack.material, stack.amount - left.amount); - stack.amount -= pouredStack.amount; - impactPos.xCoord = hit.xCoord; - impactPos.yCoord = hit.yCoord; - impactPos.zCoord = hit.zCoord; - - break; - } - } - - return pouredStack; - } - - public static MaterialStack spill(MovingObjectPosition mop, boolean safe, List stacks, int quanta, Vec3 impactPos) { - - //do nothing if safe mode is on - if(safe) { - return null; - } - - //simply use the first available material - MaterialStack top = stacks.get(0); - MaterialStack toWaste = new MaterialStack(top.material, Math.min(top.amount, quanta)); - top.amount -= toWaste.amount; - //remove all stacks with no content - stacks.removeIf(o -> o.amount <= 0); - - //if there is a vec3 reference, set the impact coordinates - if(impactPos != null && mop != null) { - impactPos.xCoord = mop.hitVec.xCoord; - impactPos.yCoord = mop.hitVec.yCoord; - impactPos.zCoord = mop.hitVec.zCoord; - } - - return toWaste; - } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerRBMKStorage.java b/src/main/java/com/hbm/inventory/container/ContainerRBMKStorage.java index 63c0ededf..d20200a80 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerRBMKStorage.java +++ b/src/main/java/com/hbm/inventory/container/ContainerRBMKStorage.java @@ -33,7 +33,7 @@ public class ContainerRBMKStorage extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + public ItemStack transferStackInSlot(EntityPlayer player, int par2) { ItemStack var3 = null; Slot var4 = (Slot) this.inventorySlots.get(par2); @@ -41,7 +41,7 @@ public class ContainerRBMKStorage extends Container { ItemStack var5 = var4.getStack(); var3 = var5.copy(); - if(par2 == 0) { + if(par2 < 12) { if(!this.mergeItemStack(var5, rbmk.getSizeInventory(), this.inventorySlots.size(), true)) { return null; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 0f31dd73c..0bea94db6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -15,8 +15,8 @@ import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CrucibleUtil; -import api.hbm.block.ICrucibleAcceptor; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -98,7 +98,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); Vec3 impact = Vec3.createVectorHelper(0, 0, 0); - ICrucibleAcceptor.tryPour(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, this.wasteStack, MaterialShapes.NUGGET.q(1), impact); + CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, this.wasteStack, MaterialShapes.NUGGET.q(1), impact); } if(!this.recipeStack.isEmpty()) { @@ -123,7 +123,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } Vec3 impact = Vec3.createVectorHelper(0, 0, 0); - ICrucibleAcceptor.tryPour(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, toCast, MaterialShapes.NUGGET.q(1), impact); + CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, toCast, MaterialShapes.NUGGET.q(1), impact); } this.recipeStack.removeIf(o -> o.amount <= 0); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java index 8b029c69f..f1e906650 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.material.Mats.MaterialStack; +import api.hbm.block.ICrucibleAcceptor; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -10,6 +11,16 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase { @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return this.standardCheck(world, x, y, z, side, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return standardAdd(world, x, y, z, side, stack); + } + @Override public int getCapacity() { return 0; diff --git a/src/main/java/com/hbm/util/CrucibleUtil.java b/src/main/java/com/hbm/util/CrucibleUtil.java new file mode 100644 index 000000000..7b79b5908 --- /dev/null +++ b/src/main/java/com/hbm/util/CrucibleUtil.java @@ -0,0 +1,166 @@ +package com.hbm.util; + +import java.util.List; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.block.Block; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class CrucibleUtil { + + /** + * Standard pouring, casting a hitscan straight down at the given coordinates with the given range. Returns the leftover material, just like ICrucibleAcceptor's pour. + * The method directly modifies the original stack, so be careful and make a copy beforehand if you don't want that. + * Pass an empty Vec3 instance in order to get the impact position of the stream. + */ + public static MaterialStack pourSingleStack(World world, double x, double y, double z, double range, boolean safe, MaterialStack stack, int quanta, Vec3 impactPosHolder) { + + + Vec3 start = Vec3.createVectorHelper(x, y, z); + Vec3 end = Vec3.createVectorHelper(x, y - range, z); + + MovingObjectPosition[] mopHolder = new MovingObjectPosition[1]; + ICrucibleAcceptor acc = getPouringTarget(world, start, end, mopHolder); + MovingObjectPosition mop = mopHolder[0]; + + if(acc == null) { + spill(mop, safe, stack, quanta, impactPosHolder); + return stack; + } + + MaterialStack ret = tryPourStack(world, acc, mop, stack, impactPosHolder); + + if(ret != null) { + return ret; + } + + spill(mop, safe, stack, quanta, impactPosHolder); + return stack; + } + + /** + * Standard pouring, casting a hitscan straight down at the given coordinates with the given range. Returns the materialStack that has been removed. + * The method doesn't make copies of the MaterialStacks in the list, so the materials being subtracted or outright removed will apply to the original list. + * Pass an empty Vec3 instance in order to get the impact position of the stream. + */ + public static MaterialStack pourFullStack(World world, double x, double y, double z, double range, boolean safe, List stacks, int quanta, Vec3 impactPosHolder) { + + if(stacks.isEmpty()) return null; + + Vec3 start = Vec3.createVectorHelper(x, y, z); + Vec3 end = Vec3.createVectorHelper(x, y - range, z); + + MovingObjectPosition[] mopHolder = new MovingObjectPosition[1]; + ICrucibleAcceptor acc = getPouringTarget(world, start, end, mopHolder); + MovingObjectPosition mop = mopHolder[0]; + + if(acc == null) { + return spill(mop, safe, stacks, quanta, impactPosHolder); + } + + for(MaterialStack stack : stacks) { + + MaterialStack left = tryPourStack(world, acc, mop, stack, impactPosHolder); + + if(left != null) { + return new MaterialStack(stack.material, stack.amount - left.amount); + } + } + + return spill(mop, safe, stacks, quanta, impactPosHolder); + } + + /** + * Tries to pour the stack onto the supplied crucible acceptor instance. Also features our friend the Vec3 dummy, which will be filled with the stream's impact position. + * Returns whatever is left of the stack when successful or null when unsuccessful (potential spillage). + */ + public static MaterialStack tryPourStack(World world, ICrucibleAcceptor acc, MovingObjectPosition mop, MaterialStack stack, Vec3 impactPosHolder) { + Vec3 hit = mop.hitVec; + + if(stack.material.smeltable != SmeltingBehavior.SMELTABLE) { + return null; + } + + if(acc.canAcceptPartialPour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack)) { + MaterialStack left = acc.pour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack); + if(left == null) { + left = new MaterialStack(stack.material, 0); + } + + impactPosHolder.xCoord = hit.xCoord; + impactPosHolder.yCoord = hit.yCoord; + impactPosHolder.zCoord = hit.zCoord; + + return left; + } + + return null; + } + + /** + * Uses hitscan to find the target of the pour, from start (the top) to end (the bottom). Pass a single cell MOP array to get the reference of the MOP for later use. + * Now we're thinking with reference types. + */ + public static ICrucibleAcceptor getPouringTarget(World world, Vec3 start, Vec3 end, MovingObjectPosition[] mopHolder) { + + MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true); + + if(mopHolder != null) { + mopHolder[0] = mop; + } + + if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) { + return null; + } + + Block b = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); + + if(!(b instanceof ICrucibleAcceptor)) { + return null; + } + + return (ICrucibleAcceptor) b; + } + + /** + * Regular spillage routine but accepts a stack list instead of a stack. simply uses the first available stack from the list. Assumes list is not empty. + */ + public static MaterialStack spill(MovingObjectPosition mop, boolean safe, List stacks, int quanta, Vec3 impactPos) { + //simply use the first available material + MaterialStack top = stacks.get(0); + MaterialStack ret = spill(mop, safe, top, quanta, impactPos); + //remove all stacks with no content + stacks.removeIf(o -> o.amount <= 0); + + return ret; + } + + /** + * The routine used for then there is no valid crucible acceptor found. Will NOP with safe mode on. Returns the MaterialStack that was lost. + */ + public static MaterialStack spill(MovingObjectPosition mop, boolean safe, MaterialStack stack, int quanta, Vec3 impactPos) { + + //do nothing if safe mode is on + if(safe) { + return null; + } + + MaterialStack toWaste = new MaterialStack(stack.material, Math.min(stack.amount, quanta)); + stack.amount -= toWaste.amount; + + //if there is a vec3 reference, set the impact coordinates + if(impactPos != null && mop != null) { + impactPos.xCoord = mop.hitVec.xCoord; + impactPos.yCoord = mop.hitVec.yCoord; + impactPos.zCoord = mop.hitVec.zCoord; + } + + return toWaste; + } +} From ea18a9b4c95acac0d34152de4ab30325db287556 Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Tue, 27 Sep 2022 19:36:03 +0300 Subject: [PATCH 081/111] Updated ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 9fd4ffdd0..56868a7c1 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -151,6 +151,7 @@ achievement.witchtaunter=Насмехайтесь над ведьмами cannery.f1=[ Press F1 for help ] +cannery.centrifuge=Gas Centrifuge cannery.centrifuge.0=Gas centrifuges can be supplied with fluid using regular fluid ducts. cannery.centrifuge.1=Most recipes require multiple centrifuges. The intermediate products cannot be transported via pipes. cannery.centrifuge.2=This side acts as a connector which outputs the intermediate product into an adjacent centrifuge. @@ -158,16 +159,19 @@ cannery.centrifuge.3=Uranium hexafluoride can be processed with just two centrif cannery.centrifuge.4=Fully processing it into Uranium-235 and Uranium-238 requires a total of four centrifuges. cannery.centrifuge.5=Some recipes also require the centrifuge overclocking upgrade. +cannery.fensu=FEnSU cannery.fensu.0=The FEnSU is capable of storing absurd amounts of energy, over 9EHE (that's a nine followed by 18 zeros). cannery.fensu.1=There is only one energy connector which can be found on the bottom. cannery.fensu.2=This is also the only place where the FEnSU can receive a redstone signal. +cannery.firebox=Firebox cannery.firebox.0=The firebox burns flammable items to generate heat. cannery.firebox.1=It can burn any flammable item, although higher quality fuels such as coal, coke and solid fuel burn longer and hotter. cannery.firebox.2=Heat is given off by the copper contact at the top of the firebox. Machines with an identical contact on the bottom can receive heat by being placed on top of the firebox. cannery.firebox.3=If heat isn't being used up and the heat buffer becomes full, the firebox will shut off to prevent wasting of fuel. cannery.firebox.4=One such machine is the stirling engine, which will turn heat directly into energy. +cannery.silex=FEL & SILEX cannery.silex.0=The Free Electron Laser (FEL) uses energy and a laser crystal to create a powerful laser beam. cannery.silex.1=Be careful, as the laser will burn/melt through weaker blocks... cannery.silex.2=...but not blast-proof ones. @@ -178,6 +182,7 @@ cannery.silex.6=In addition to the two connectors on the sides, there is a third cannery.silex.7=Each recipe requires a specific laser type. Using a stronger type than required will process items faster. cannery.silex.8=One FEL can supply up to 5 SILEX. Each SILEX has to be one block apart from one another. +cannery.stirling=Stirling Engine cannery.stirling.0=The Stirling engine uses heat energy from external sources to create power. cannery.stirling.1=It needs to be placed on top of a heat-producing machine, such as the firebox. cannery.stirling.2=The amount of heat it can utilize however is limited, overspinning can lead to catastrophic malfunction. @@ -224,6 +229,8 @@ weapon.elecGun.glass_cannon.uv=Ультрафиолет weapon.elecGun.glass_cannon.xray=Рентген weapon.elecGun.glass_cannon.gamma=Гамма-лучи +info.asbestos=Мои лёгкие горят. +info.coaldust=Здесь тяжело дышать. info.coil=Сила катушки info.templatefolder=Создано с помощью %s info.template_in=Ввод: @@ -395,6 +402,18 @@ rbmk.screen.rod=Control: %s rbmk.screen.temp=Temp: %s rbmk.screen.xenon=Xenon: %s +shape.quantum=Кванта +shape.nugget=Самородок +shape.dusttiny=Кучка пыли +shape.wire=Провод +shape.billet=Заготовка +shape.ingot=Слиток +shape.dust=Порошок +shape.plate=Пластина +shape.quart=Четверть блока +shape.block=Блок +foundry.noCast=Литейная форма не установлена! + hbm.key=NTM Hotkeys hbm.key.calculator=Калькулятор hbm.key.craneLoad=Загрузить/Разгрузить кран @@ -877,6 +896,18 @@ book.starter.page16=Если вы зашли так далеко, значит, book.starter.title18=Об авторе book.starter.page18=vær - просто парень, который слишком долго был пойман в ловушку серой пустоты, показанной в фильме "Говорящая голова" §o"Раз в жизни"§r. Однажды он нашел дверь студии, но, к своему ужасу, обнаружил, что она была вырезана из картона. +book.lore.office0.title=Заявление об увольнении +book.lore.office0.author=Kosma +book.lore.office0.page1=Вчера руководство снова сократило наш отдел. Эти идиоты должны винить только самих себя, я не знаю, чего они ожидали после фиаско с Панаем. Кто, черт возьми, сливает такую информацию? Мы теряем миллионы, и +book.lore.office0.page2=это Я сейчас без работы. Это меня просят уйти в отставку. Я надеюсь, что вы, придурки, наконец-то извлекли урок из своего переизбытка ошибок и вытащили эту палку из своей задницы. +book.lore.office0.page3=Я не вернусь в пятницу. Просто пришлите чек на зарплату. + +book.lore.office1.title=Заметка +book.lore.office1.author=Jonas Quinn +book.lore.office1.page1= +book.lore.office2.page2= + + hbmfluid.none=Ничего hbmfluid.water=Вода hbmfluid.steam=Пар @@ -1399,6 +1430,9 @@ tile.struct_iter_core.name=Ядро термоядерного реактора tile.machine_difurnace_off.name=Доменная печь tile.machine_difurnace_on.name=Доменная печь container.diFurnace=Доменная печь +tile.foundry_basin.name=Литейный резервуар +tile.foundry_channel.name=Литейный канал +tile.foundry_mold.name=Малый литейный резервуар tile.machine_centrifuge.name=Центрифуга container.centrifuge=Центрифуга tile.machine_gascent.name=Газовая центрифуга @@ -1480,6 +1514,7 @@ container.machineShredder=Измельчитель tile.machine_combine_factory.name=Печь для стали Альянса container.machineCMB=Печь для стали Альянса tile.machine_teleporter.name=Телепорт +tile.teleanchor.name=Телепортационный якорь container.teleporter=Телепорт tile.machine_reix_mainframe.name=Мэйнфрейм Rei-X (WIP) container.reix=Мэйнфрейм Rei-X @@ -1668,6 +1703,7 @@ tile.machine_stirling.name=Генератор Стирлинга tile.machine_stirling.desc=Превращает тепло в энергию. Требует внешний источник тепла.$Скорость теплопередачи: T*0.1 TU/t$Максимальное потребление: 300 TU/t$Эффективность: 50%% tile.machine_stirling_steel.name=Укреплённый генератор Стирлинга tile.machine_stirling_steel.desc=Превращает тепло в энергию. Требует внешний источник тепла.$Использует более тяжёлую шестерню, чтобы выдерживать высокие температуры.$Скорость теплопередачи: T*0.1 TU/t$Максимальное потребление: 1500 TU/t$Эффективность: 50%% +tile.machine_sawmill.name=Лесопилка на генераторе Стирлинга container.hadron=Ускоритель частиц tile.hadron_access.name=Терминал доступа ускорителя частиц @@ -1870,6 +1906,8 @@ item.fluid_identifier_multi.info2=Второй тип: item.assembly_template.name=Шаблон сборочной машины: item.chemistry_template.name=Шаблон химической машины: item.siren_track.name=Трек сирены +item.mold_base.name=Пустая литейная форма +item.mold.name=Литейная форма item.bobmazon_materials.name=Бобмазон: Материалы item.bobmazon_machines.name=Бобмазон: Блоки и машины @@ -1965,6 +2003,7 @@ item.ingot_bismuth.name=Слиток висмута item.cube_power.name=Куб электрония item.ingot_smore.name=Слиток с'мора item.ingot_niobium.name=Ниобиевый слиток +item.ingot_firebrick.name=Шамотный кирпич item.plate_armor_lunar.name=Лунная обшивка item.plate_armor_titanium.name=Титановая обшивка брони @@ -2307,6 +2346,7 @@ tile.block_insulator.name=Рулон изолятора tile.block_fiberglass.name=Рулон стекловолокна tile.block_asbestos.name=Асбест tile.brick_asbestos.name=Асбестовые кирпичи +tile.brick_fire.name=Шамотные кирпичи tile.block_cobalt.name=Кобальтовый блок tile.block_lithium.name=Литиевый блок tile.block_white_phosphorus.name=Блок белого фосфора @@ -2549,6 +2589,7 @@ tile.gneiss_tile.name=Сланцевая плитка tile.brick_ducrete.name=Дюкретовые кирпичи tile.ducrete.name=Дюкретовая плитка tile.ducrete_smooth.name=Дюкрет +tile.ducrete_debris.name=Дюкретовые обломки tile.reinforced_ducrete.name=Усиленный дюкрет tile.asphalt.name=Асфальт tile.asphalt_light.name=Асфальтированный светящийся камень @@ -2731,6 +2772,7 @@ item.powder_tektite.name=Порошок тектита item.powder_ra226.name=Порошок радия-226 item.powder_sr90.name=Порошок стронция-90 item.powder_sr90_tiny.name=Кучка порошка стронция-90 +item.powder_sawdust.name=Древесные опилки item.fragment_neodymium.name=Неодимовый осколок item.fragment_cobalt.name=Кобальтовый осколок @@ -3422,6 +3464,7 @@ tile.frozen_planks.name=Замороженные доски tile.tape_recorder.name=Магнитофон tile.steel_poles.name=Стальные опоры tile.pole_top.name=Антенна +tile.deco_computer.name=Персональный компьютер IBM 300PL tile.pole_satellite_receiver.name=Спутниковая тарелка tile.steel_wall.name=Стальная стенка tile.steel_corner.name=Стальной угол стены @@ -3700,6 +3743,7 @@ item.cordite.name=Кордит item.ballistite.name=Баллистит item.ball_dynamite.name=Динамит item.ball_tnt.name=ТНТ +item.ball_fireclay.name=Шамотная глина item.plate_kevlar.name=Кевларо-керамический состав item.weaponized_starblaster_cell.name=§cСмонтированная энергетическая ячейка Звездного бластера§r @@ -4626,6 +4670,7 @@ item.blades_advanced_alloy.name=Усовершенствованные лезв item.blades_combine_steel.name=Стальные лезвия измельчителя Альянса item.blades_schrabidium.name=Шрабидиевые лезвия измельчителя item.blades_desh.name=Деш-лезвия измельчителя +item.sawblade.name=Лезвие пилорамы item.stamp_stone_flat.name=Плоский штамп (Камень) item.stamp_stone_plate.name=Штамп пластины (Камень) @@ -4750,6 +4795,7 @@ item.rbmk_tool.set=РБМК соединён! item.bismuth_tool.name=Магнитный экстрактор item.reacher.name=Вольфрамовые хваталки item.power_net_tool.name=Анализатор энергосети +item.anchor_remote.name=Устройство вызова item.multitool_dig.name=Силовая перчатка (Добывающий коготь) item.multitool_silk.name=Силовая перчатка (Коготь шёлкового касания) From 35c9833e694d8526c1400b774ad6b51e2f136805 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 27 Sep 2022 23:22:27 +0200 Subject: [PATCH 082/111] fixed pouring, rendering for foundry outlet --- .../hbm/blocks/machine/FoundryChannel.java | 10 +- .../com/hbm/blocks/machine/FoundryOutlet.java | 23 ++- .../java/com/hbm/main/CraftingManager.java | 1 + .../hbm/render/block/RenderBlocksFixed.java | 15 ++ .../com/hbm/render/block/RenderOutlet.java | 142 ++++++++++++++++++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityFoundryChannel.java | 8 +- .../machine/TileEntityFoundryOutlet.java | 30 +++- src/main/java/com/hbm/util/CrucibleUtil.java | 5 +- .../textures/blocks/foundry_outlet_bottom.png | Bin 0 -> 515 bytes .../textures/blocks/foundry_outlet_front.png | Bin 0 -> 192 bytes .../textures/blocks/foundry_outlet_inner.png | Bin 0 -> 329 bytes .../textures/blocks/foundry_outlet_side.png | Bin 0 -> 340 bytes .../textures/blocks/foundry_outlet_top.png | Bin 0 -> 410 bytes 14 files changed, 221 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/hbm/render/block/RenderBlocksFixed.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_outlet_bottom.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_outlet_front.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_outlet_inner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_outlet_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_outlet_top.png diff --git a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java index 615d9d54a..5a5626420 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java @@ -97,22 +97,22 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); } @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); } @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - return ((TileEntityFoundryChannel) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); } public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir) { @@ -122,7 +122,7 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor Block b = world.getBlock(x + dir.offsetX, y, z + dir.offsetZ); - return b == ModBlocks.foundry_channel || b == ModBlocks.foundry_mold; + return b == ModBlocks.foundry_channel || b == ModBlocks.foundry_mold || b == ModBlocks.foundry_outlet; } public static int renderID = RenderingRegistry.getNextAvailableRenderId(); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index 82b0698cf..f92e5817f 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -11,8 +11,11 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -23,6 +26,7 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { @SideOnly(Side.CLIENT) public IIcon iconSide; @SideOnly(Side.CLIENT) public IIcon iconBottom; @SideOnly(Side.CLIENT) public IIcon iconInner; + @SideOnly(Side.CLIENT) public IIcon iconFront; public FoundryOutlet() { super(Material.rock); @@ -32,16 +36,27 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { super.registerBlockIcons(iconRegister); - this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_top"); - this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_side"); - this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_bottom"); - this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_inner"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_inner"); + this.iconFront = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_front"); } @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { return true; } + + @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); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); + } @Override public TileEntity createNewTileEntity(World world, int meta) { diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 7e55fcfc0..1c55dc46f 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -955,6 +955,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.foundry_basin), new Object[] { "B B", "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); addRecipeAuto(new ItemStack(ModBlocks.foundry_mold), new Object[] { "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); addRecipeAuto(new ItemStack(ModBlocks.foundry_channel, 4), new Object[] { "B B", " S ", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addShapelessAuto(new ItemStack(ModBlocks.foundry_outlet), new Object[] { ModBlocks.foundry_channel, STEEL.plate() }); addRecipeAuto(new ItemStack(ModItems.mold_base), new Object[] { " B ", "BIB", " B ", 'B', ModItems.ingot_firebrick, 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.brick_fire), new Object[] { "BB", "BB", 'B', ModItems.ingot_firebrick }); addShapelessAuto(new ItemStack(ModItems.ingot_firebrick, 4), new Object[] { ModBlocks.brick_fire }); diff --git a/src/main/java/com/hbm/render/block/RenderBlocksFixed.java b/src/main/java/com/hbm/render/block/RenderBlocksFixed.java new file mode 100644 index 000000000..6194a36c6 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderBlocksFixed.java @@ -0,0 +1,15 @@ +package com.hbm.render.block; + +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.world.IBlockAccess; + +public class RenderBlocksFixed extends RenderBlocks { + + public RenderBlocksFixed() { + super(); + } + + public RenderBlocksFixed(IBlockAccess world) { + super(world); + } +} diff --git a/src/main/java/com/hbm/render/block/RenderOutlet.java b/src/main/java/com/hbm/render/block/RenderOutlet.java index b7ded4b0c..b60c1f477 100644 --- a/src/main/java/com/hbm/render/block/RenderOutlet.java +++ b/src/main/java/com/hbm/render/block/RenderOutlet.java @@ -1,21 +1,163 @@ package com.hbm.render.block; +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.FoundryChannel; import com.hbm.blocks.machine.FoundryOutlet; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; public class RenderOutlet implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + double bot = 0.0D; + double top = 0.5D; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + FoundryOutlet outlet = (FoundryOutlet) block; + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + + renderer.setRenderBounds(0.3125D, bot, 0D, 0.6875D, top, 0.375D); + + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + + tessellator.setNormal(1F, 0F, 0F); + renderer.field_152631_f = true; + renderer.renderFaceXPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceXPos(block, x - 0.3125D, y, z, outlet.iconInner); + renderer.field_152631_f = false; + + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); + + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); + + tessellator.draw(); } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + double bot = 0.0D; + double top = 0.5D; + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryOutlet outlet = (FoundryOutlet) block; + int meta = world.getBlockMetadata(x, y, z); + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + tessellator.setBrightness(brightness); + + if(meta == 4) { + renderer.setRenderBounds(0.625D, bot, 0.3125D, 1D, top, 0.6875D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.3125D, outlet.iconInner); + renderer.field_152631_f = true; + renderer.renderFaceZNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.3125D, outlet.iconInner); + renderer.field_152631_f = false; + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFront); + } + + if(meta == 5) { + renderer.setRenderBounds(0D, bot, 0.3125D, 0.375D, top, 0.6875D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.3125D, outlet.iconInner); + renderer.field_152631_f = true; + renderer.renderFaceZNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.3125D, outlet.iconInner); + renderer.field_152631_f = false; + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFront); + } + + if(meta == 2) { + renderer.setRenderBounds(0.3125D, bot, 0.625D, 0.6875D, top, 1D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.field_152631_f = true; + renderer.renderFaceXPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceXPos(block, x - 0.3125D, y, z, outlet.iconInner); + renderer.field_152631_f = false; + renderer.renderFaceXNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFront); + } + + if(meta == 3) { + renderer.setRenderBounds(0.3125D, bot, 0D, 0.6875D, top, 0.375D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.field_152631_f = true; + renderer.renderFaceXPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceXPos(block, x - 0.3125D, y, z, outlet.iconInner); + renderer.field_152631_f = false; + renderer.renderFaceXNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); + } + return true; } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 4bf7992a5..4144bc497 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -255,6 +255,7 @@ public class TileMappings { put(TileEntityFoundryMold.class, "tileentity_foundry_mold"); put(TileEntityFoundryBasin.class, "tileentity_foundry_basin"); put(TileEntityFoundryChannel.class, "tileentity_foundry_channel"); + put(TileEntityFoundryOutlet.class, "tileentity_foundry_outlet"); put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter"); put(TileEntityDiFurnaceRTG.class, "tileentity_rtg_difurnace"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java index 87af1488f..80e9a26b7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java @@ -15,6 +15,8 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityFoundryChannel extends TileEntityFoundryBase { + public int nextUpdate; + @Override public void updateEntity() { @@ -24,7 +26,11 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { this.amount = 0; } - if(worldObj.rand.nextInt(10) == 0 && this.amount > 0 && this.type != null) { + nextUpdate--; + + if(nextUpdate <= 0 && this.amount > 0 && this.type != null) { + + nextUpdate = worldObj.rand.nextInt(6) + 10; List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; Collections.shuffle(ints); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java index f1e906650..6c5d54052 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -1,8 +1,11 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.util.CrucibleUtil; import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -10,15 +13,36 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase { @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } - + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - return this.standardCheck(world, x, y, z, side, stack); + + Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); + Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 4, z + 0.5); + + MovingObjectPosition[] mop = new MovingObjectPosition[1]; + ICrucibleAcceptor acc = CrucibleUtil.getPouringTarget(world, start, end, mop); + + if(acc == null) { + return false; + } + + return acc.canAcceptPartialPour(world, mop[0].blockX, mop[0].blockY, mop[0].blockZ, mop[0].hitVec.xCoord, mop[0].hitVec.yCoord, mop[0].hitVec.zCoord, ForgeDirection.UP, stack); } @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - return standardAdd(world, x, y, z, side, stack); + + Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); + Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 4, z + 0.5); + + MovingObjectPosition[] mop = new MovingObjectPosition[1]; + ICrucibleAcceptor acc = CrucibleUtil.getPouringTarget(world, start, end, mop); + + if(acc == null) + return stack; + + return acc.pour(world, mop[0].blockX, mop[0].blockY, mop[0].blockZ, mop[0].hitVec.xCoord, mop[0].hitVec.yCoord, mop[0].hitVec.zCoord, ForgeDirection.UP, stack); } @Override diff --git a/src/main/java/com/hbm/util/CrucibleUtil.java b/src/main/java/com/hbm/util/CrucibleUtil.java index 7b79b5908..e5d06cdbd 100644 --- a/src/main/java/com/hbm/util/CrucibleUtil.java +++ b/src/main/java/com/hbm/util/CrucibleUtil.java @@ -66,9 +66,12 @@ public class CrucibleUtil { for(MaterialStack stack : stacks) { - MaterialStack left = tryPourStack(world, acc, mop, stack, impactPosHolder); + int amountToPour = Math.min(stack.amount, quanta); + MaterialStack toPour = new MaterialStack(stack.material, amountToPour); + MaterialStack left = tryPourStack(world, acc, mop, toPour, impactPosHolder); if(left != null) { + stack.amount -= (amountToPour - left.amount); return new MaterialStack(stack.material, stack.amount - left.amount); } } diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..53406350fa015e77948f54ae5f07880b0c7b6a65 GIT binary patch literal 515 zcmV+e0{s1nP)B@dw6ZoCj;E>jGz$c{)GJf^Sd&W z@IX}f`FUezjNTce0}zoEMP*S{EO$hNW=6|MB7&@ zNsEZRX-0Uk?#BRgEqZH2CZ>vtpshWR0h*cZ1K*uZ6*B_?LU>;nV~nS%s2~U)v1K4U z2>*AEOvdQ6)-Y8>jRMnQV);46WMP$-j!_4;CTpY(BA~qs|$`@T#(TJd`IA5=g zq`Q!JvpE-t?EPAZ$YxW8d^|AQl(Gt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_front.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_front.png new file mode 100644 index 0000000000000000000000000000000000000000..98bb463c75278fe9347fd92894dd469869a41b7e GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfC}49e2^N5$La8DIi4rM^ zpFQ&^0z|BUhEv_<{@|Z~K<@9Z$~O0mQqAN0j?1$a6=l_BrbjKCe&D2Sm@U`5Yzr5s z4dc3E(+>btuZuMR<2=x$#B?&|VK!&A%RJ3LIG>EjzTmiN00ZFpZHbqH0&;tET|9!S zGD;NsVV`WOcm#D-;SreXujw9vh)|jBQ+;q$6;s8`KmZqZT}Mjk@L2^x7~ByN^t%xe zJmO2rkD+ZE+?~N4k09rsh#=K9DuTK@01-hc1v4We5QNH%C-_#nFThV4Tt>YNdRC~ z0000a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_top.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_top.png new file mode 100644 index 0000000000000000000000000000000000000000..8438991842fe2bec38ee431cd0fabacd8b210689 GIT binary patch literal 410 zcmV;L0cHM)P)xY-W}QGF#xb2Xg|G!2?S#!Dj+R-w1Y;q z#50}Zk+CK@ynxKlKJc73a?j+^KaqB4FN9E!RI~- z*(Bk_AQzKqTL3!43FI-2G70^&Za|TUFY@sSQi4PHH!<~le;iaF&Hw-a07*qoM6N<$ Eg8vn$JOBUy literal 0 HcmV?d00001 From 4ee7e680fbb0bca4f54c80232dd97a45777fb3da Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 28 Sep 2022 16:54:42 +0200 Subject: [PATCH 083/111] Too Many Molds there is toxic black mold growing in my brain --- .../blocks/machine/FoundryCastingBase.java | 2 +- .../com/hbm/blocks/machine/FoundryOutlet.java | 39 +++ .../java/com/hbm/inventory/material/Mats.java | 7 +- .../java/com/hbm/items/machine/ItemMold.java | 234 ++++++++++++++++-- .../com/hbm/render/block/RenderOutlet.java | 1 - .../machine/TileEntityFoundryCastingBase.java | 27 +- .../assets/hbm/textures/items/mold_blade.png | Bin 0 -> 353 bytes .../assets/hbm/textures/items/mold_blades.png | Bin 0 -> 533 bytes .../hbm/textures/items/mold_hull_big.png | Bin 0 -> 440 bytes .../hbm/textures/items/mold_hull_small.png | Bin 0 -> 416 bytes .../assets/hbm/textures/items/mold_mogus.png | Bin 0 -> 438 bytes .../assets/hbm/textures/items/mold_pipes.png | Bin 0 -> 398 bytes .../assets/hbm/textures/items/mold_stamp.png | Bin 0 -> 398 bytes 13 files changed, 259 insertions(+), 51 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/mold_blade.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_blades.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_hull_big.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_hull_small.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_mogus.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_pipes.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_stamp.png diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index 7b968c4aa..29a2e1924 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -143,7 +143,7 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noCast")); } else if(cast.slots[0].getItem() == ModItems.mold){ Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); - text.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("shape." + mold.shape.name().toLowerCase()) + " x" + mold.amount); + text.add(EnumChatFormatting.BLUE + mold.getTitle()); } if(cast.type != null && cast.amount > 0) { diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index f92e5817f..6c1c4b235 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -1,6 +1,10 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFoundryOutlet; @@ -11,9 +15,11 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; @@ -63,6 +69,39 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { return new TileEntityFoundryOutlet(); } + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + AxisAlignedBB aabb = null; + int meta = world.getBlockMetadata(x, y, z); + + if(meta == 2) aabb = AxisAlignedBB.getBoundingBox(x + 0.625D, y, z + 0.3125D, x + 1D, y + 0.5D, z + 0.6875D); + if(meta == 3) aabb = AxisAlignedBB.getBoundingBox(x + 0D, y, z + 0.3125D, x + 0.375D, y + 0.5D, z + 0.6875D); + if(meta == 4) aabb = AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.625D, x + 0.6875D, y + 0.5D, z + 1D); + if(meta == 5) aabb = AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0D, x + 0.6875D, y + 0.5D, z + 0.375D); + + if(aabb != null && entityBounding.intersectsWith(aabb)) { + list.add(aabb); + } + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + 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 void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + + int meta = world.getBlockMetadata(x, y, z); + if(meta == 2) this.setBlockBounds(0.625F, 0F, 0.3125F, 1F, 0.5F, 0.6875F); + if(meta == 3) this.setBlockBounds(0F, 0F, 0.3125F, 0.375F, 0.5F, 0.6875F); + if(meta == 4) this.setBlockBounds(0.3125F, 0F, 0.625F, 0.6875F, 0.5F, 1F); + if(meta == 5) this.setBlockBounds(0.3125F, 0F, 0F, 0.6875F, 0.5F, 0.375F); + } + @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 758d8ca42..0b32625ff 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -43,8 +43,8 @@ public class Mats { public static final int _AS = 30; //Vanilla and vanilla-like - public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0x4D2F23); - public static final NTMMaterial MAT_COAL = makeAdditive( 1400, COAL, 0x583434); + public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0x4D2F23).omitAutoGen(); + public static final NTMMaterial MAT_COAL = makeAdditive( 1400, COAL, 0x583434).omitAutoGen(); public static final NTMMaterial MAT_LIGNITE = makeAdditive( 1401, LIGNITE, 0x715444); public static final NTMMaterial MAT_COALCOKE = makeAdditive( 1410, COALCOKE, 0); public static final NTMMaterial MAT_PETCOKE = makeAdditive( 1411, PETCOKE, 0); @@ -53,12 +53,14 @@ public class Mats { public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0xFFA259).omitAutoGen(); public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0xE8D754).omitAutoGen(); public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0x7A0300).omitAutoGen(); + public static final NTMMaterial MAT_OBSIDIAN = makeSmeltable(_VS + 02, df("Obsidian"), 0x4D2F23).omitAutoGen(); //Radioactive public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_THORIUM = makeSmeltable(9232, TH232, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(9400, PU, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SCHRABIDIUM = makeSmeltable(12626, SA326, 0).setShapes(NUGGET, WIRE, BILLET, INGOT, DUST, PLATE, BLOCK); //Base metals public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xA99E79).setShapes(INGOT, DUST, PLATE, BLOCK); @@ -83,6 +85,7 @@ public class Mats { public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0).setShapes(INGOT, DUST, BLOCK); public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0).setShapes(INGOT, DUST); public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(_AS + 7, MAGTUNG, 0).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_CMB = makeSmeltable(_AS + 8, CMB, 0).setShapes(INGOT, DUST, PLATE, BLOCK); public static NTMMaterial make(int id, DictFrame dict) { return new NTMMaterial(id, dict); diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java index 9156f4e8e..049b2e285 100644 --- a/src/main/java/com/hbm/items/machine/ItemMold.java +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -1,10 +1,14 @@ package com.hbm.items.machine; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.util.I18nUtil; @@ -17,27 +21,70 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; +import net.minecraftforge.oredict.OreDictionary; public class ItemMold extends Item { - public List molds = new ArrayList(); + public List molds = new ArrayList(); //molds in "pretty" order, variable between versions + public HashMap moldById = new HashMap(); //molds by their static ID -> stack item damage public ItemMold() { - this.molds.add(new Mold(0, 0, "nugget", MaterialShapes.NUGGET)); - this.molds.add(new Mold(1, 0, "billet", MaterialShapes.BILLET)); - this.molds.add(new Mold(2, 0, "ingot", MaterialShapes.INGOT)); - this.molds.add(new Mold(3, 0, "plate", MaterialShapes.PLATE)); - this.molds.add(new Mold(4, 0, "wire", MaterialShapes.WIRE, 8)); - this.molds.add(new Mold(5, 1, "ingots", MaterialShapes.INGOT, 9)); - this.molds.add(new Mold(6, 1, "plates", MaterialShapes.PLATE, 9)); - this.molds.add(new Mold(7, 1, "block", MaterialShapes.BLOCK)); + int S = 0; + int L = 0; + registerMold(new MoldShape( 0, S, "nugget", MaterialShapes.NUGGET)); + registerMold(new MoldShape( 1, S, "billet", MaterialShapes.BILLET)); + registerMold(new MoldShape( 2, S, "ingot", MaterialShapes.INGOT)); + registerMold(new MoldShape( 3, S, "plate", MaterialShapes.PLATE)); + registerMold(new MoldWire( 4, S, "wire")); + + registerMold(new MoldMulti( 5, S, "blade", MaterialShapes.INGOT.q(3), + Mats.MAT_TITANIUM, new ItemStack(ModItems.blade_titanium), + Mats.MAT_TUNGSTEN, new ItemStack(ModItems.blade_tungsten))); + + registerMold(new MoldMulti( 6, S, "blades", MaterialShapes.INGOT.q(4), + Mats.MAT_GOLD, new ItemStack(ModItems.blades_gold), + Mats.MAT_ALUMINIUM, new ItemStack(ModItems.blades_aluminium), + Mats.MAT_IRON, new ItemStack(ModItems.blades_iron), + Mats.MAT_STEEL, new ItemStack(ModItems.blades_steel), + Mats.MAT_TITANIUM, new ItemStack(ModItems.blades_titanium), + Mats.MAT_ALLOY, new ItemStack(ModItems.blades_advanced_alloy), + Mats.MAT_CMB, new ItemStack(ModItems.blades_combine_steel), + Mats.MAT_SCHRABIDIUM, new ItemStack(ModItems.blades_schrabidium))); + + registerMold(new MoldMulti( 7, S, "blades", MaterialShapes.INGOT.q(4), + Mats.MAT_STONE, new ItemStack(ModItems.stamp_stone_flat), + Mats.MAT_IRON, new ItemStack(ModItems.stamp_iron_flat), + Mats.MAT_STEEL, new ItemStack(ModItems.stamp_steel_flat), + Mats.MAT_TITANIUM, new ItemStack(ModItems.stamp_titanium_flat), + Mats.MAT_OBSIDIAN, new ItemStack(ModItems.stamp_obsidian_flat), + Mats.MAT_SCHRABIDIUM, new ItemStack(ModItems.stamp_schrabidium_flat))); + + registerMold(new MoldMulti( 8, S, "hull_small", MaterialShapes.INGOT.q(2), + Mats.MAT_STEEL, new ItemStack(ModItems.hull_small_steel), + Mats.MAT_ALUMINIUM, new ItemStack(ModItems.hull_small_aluminium))); + + registerMold(new MoldMulti( 9, L, "hull_big", MaterialShapes.INGOT.q(6), + Mats.MAT_STEEL, new ItemStack(ModItems.hull_big_steel), + Mats.MAT_ALUMINIUM, new ItemStack(ModItems.hull_big_aluminium), + Mats.MAT_TITANIUM, new ItemStack(ModItems.hull_big_titanium))); + + registerMold(new MoldShape( 10, L, "ingots", MaterialShapes.INGOT, 9)); + registerMold(new MoldShape( 11, L, "plates", MaterialShapes.PLATE, 9)); + registerMold(new MoldShape( 12, L, "block", MaterialShapes.BLOCK)); + registerMold(new MoldSingle( 13, L, "pipes", new ItemStack(ModItems.pipes_steel), Mats.MAT_STEEL, MaterialShapes.BLOCK.q(3))); + } + + public void registerMold(Mold mold) { + this.molds.add(mold); + this.moldById.put(mold.id, mold); } @Override @SideOnly(Side.CLIENT) public void getSubItems(Item item, CreativeTabs tab, List list) { for(int i = 0; i < molds.size(); i++) { - list.add(new ItemStack(item, 1, i)); + Mold mold = molds.get(i); + list.add(new ItemStack(item, 1, mold.id)); } } @@ -56,7 +103,11 @@ public class ItemMold extends Item { @SideOnly(Side.CLIENT) public IIcon getIconFromDamage(int meta) { - return this.icons[Math.abs(meta % icons.length)]; + Mold mold = this.moldById.get(meta); + if(mold != null) + return this.icons[mold.order]; + + return this.icons[0]; } /*@Override @@ -68,40 +119,171 @@ public class ItemMold extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { Mold mold = getMold(stack); - list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("shape." + mold.shape.name().toLowerCase()) + " x" + mold.amount); + list.add(EnumChatFormatting.YELLOW + mold.getTitle()); if(mold.size == 0) list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey(ModBlocks.foundry_mold.getUnlocalizedName() + ".name")); if(mold.size == 1) list.add(EnumChatFormatting.RED + I18nUtil.resolveKey(ModBlocks.foundry_basin.getUnlocalizedName() + ".name")); } public Mold getMold(ItemStack stack) { - int meta = Math.abs(stack.getItemDamage() % molds.size()); - Mold mold = molds.get(meta); - return mold; + Mold mold = moldById.get(stack.getItemDamage()); + return mold != null ? mold : molds.get(0); } + + public static int nextOrder = 0; - public class Mold { - - public MaterialShapes shape; - public int amount; + public abstract class Mold { + public int order; public int id; public int size; public String name; - public Mold(int id, int size, String name, MaterialShapes shape) { - this(id, size, name, shape, 1); - } - - public Mold(int id, int size, String name, MaterialShapes shape, int amount) { + public Mold(int id, int size, String name) { + this.order = nextOrder++; this.id = id; this.size = size; - this.shape = shape; - this.amount = amount; this.name = name; } + public abstract ItemStack getOutput(NTMMaterial mat); + public abstract int getCost(); + public abstract String getTitle(); + } + + public class MoldShape extends Mold { + + MaterialShapes shape; + int amount; + + public MoldShape(int id, int size, String name, MaterialShapes shape) { + this(id, size, name, shape, 1); + } + + public MoldShape(int id, int size, String name, MaterialShapes shape, int amount) { + super(id, size, name); + this.shape = shape; + this.amount = amount; + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + + for(String name : mat.names) { + String od = shape.name().toLowerCase() + name; + List ores = OreDictionary.getOres(od); + if(!ores.isEmpty()) { + return ores.get(0); + } + } + + return null; + } + + @Override public int getCost() { return shape.q(amount); } + + @Override + public String getTitle() { + return I18nUtil.resolveKey("shape." + shape.name().toLowerCase()) + " x" + amount; + } + } + + public class MoldWire extends Mold { + + public MoldWire(int id, int size, String name) { + super(id, size, name); + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + + if(mat == Mats.MAT_ALUMINIUM) return new ItemStack(ModItems.wire_aluminium, 8); + if(mat == Mats.MAT_ALLOY) return new ItemStack(ModItems.wire_advanced_alloy, 8); + if(mat == Mats.MAT_COPPER) return new ItemStack(ModItems.wire_copper, 8); + if(mat == Mats.MAT_GOLD) return new ItemStack(ModItems.wire_gold, 8); + if(mat == Mats.MAT_MAGTUNG) return new ItemStack(ModItems.wire_magnetized_tungsten, 8); + if(mat == Mats.MAT_MINGRADE) return new ItemStack(ModItems.wire_red_copper, 8); + if(mat == Mats.MAT_SCHRABIDIUM) return new ItemStack(ModItems.wire_schrabidium, 8); + if(mat == Mats.MAT_TUNGSTEN) return new ItemStack(ModItems.wire_tungsten, 8); + return null; + } + + @Override + public int getCost() { + return MaterialShapes.WIRE.q(8); + } + + @Override + public String getTitle() { + return I18nUtil.resolveKey("shape." + MaterialShapes.WIRE.name().toLowerCase()) + " x8"; + } + } + + /* because why not */ + public class MoldSingle extends Mold { + + ItemStack out; + NTMMaterial mat; + int amount; + + public MoldSingle(int id, int size, String name, ItemStack out, NTMMaterial mat, int amount) { + super(id, size, name); + this.out = out; + this.mat = mat; + this.amount = amount; + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + return this.mat == mat ? out.copy() : null; + } + + @Override + public int getCost() { + return amount; + } + + @Override + public String getTitle() { + return out.getDisplayName() + " x" + this.amount; + } + } + + /* not so graceful but it does the job and it does it well */ + public class MoldMulti extends Mold { + + HashMap map = new HashMap(); + int amount; + + public MoldMulti(int id, int size, String name, int amount, Object... inputs) { + super(id, size, name); + this.amount = amount; + + for(int i = 0; i < inputs.length; i += 2) { + map.put((NTMMaterial) inputs[i], (ItemStack) inputs[i + 1]); + } + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + ItemStack out = this.map.get(mat); + + if(out != null) + return out.copy(); + + return out; + } + + @Override + public int getCost() { + return amount; + } + + @Override + public String getTitle() { + return I18nUtil.resolveKey("shape." + name) + " x" + this.amount; + } } } diff --git a/src/main/java/com/hbm/render/block/RenderOutlet.java b/src/main/java/com/hbm/render/block/RenderOutlet.java index b60c1f477..1a67ab3f9 100644 --- a/src/main/java/com/hbm/render/block/RenderOutlet.java +++ b/src/main/java/com/hbm/render/block/RenderOutlet.java @@ -2,7 +2,6 @@ package com.hbm.render.block; import org.lwjgl.opengl.GL11; -import com.hbm.blocks.machine.FoundryChannel; import com.hbm.blocks.machine.FoundryOutlet; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java index 02c558698..dc0f173cd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -1,7 +1,5 @@ package com.hbm.tileentity.machine; -import java.util.List; - import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMold; @@ -14,10 +12,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; /** - * Thank god we have a base class now. Now with documentation and as little redundtand crap in the child classes as possible. + * Thank god we have a base class now. Now with documentation and as little redundant crap in the child classes as possible. * @author hbm * */ @@ -48,14 +45,10 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase if(cooloff <= 0) { this.amount = 0; - for(String name : this.type.names) { - String od = mold.shape.name().toLowerCase() + name; - List ores = OreDictionary.getOres(od); - - if(!ores.isEmpty()) { - slots[1] = ores.get(0).copy(); - slots[1].stackSize = mold.amount; - } + ItemStack out = mold.getOutput(type); + + if(out != null) { + slots[1] = out.copy(); } cooloff = 100; @@ -101,15 +94,7 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase Mold mold = this.getInstalledMold(); if(mold == null) return false; - for(String name : stack.material.names) { - String od = mold.shape.name().toLowerCase() + name; - - if(!OreDictionary.getOres(od).isEmpty()) { - return true; //at least one block for this material? return TRUE - } - } - - return false; //no OD match -> no pouring + return mold.getOutput(stack.material) != null; //no OD match -> no pouring } /** Returns an integer determining the mold size, 0 for small molds and 1 for the basin */ diff --git a/src/main/resources/assets/hbm/textures/items/mold_blade.png b/src/main/resources/assets/hbm/textures/items/mold_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..b078333b4f55cbbc5702ddee8f5b7d38aa8e3a93 GIT binary patch literal 353 zcmV-n0iOPeP)X+k#8Sp%mKb)Vh#_rjypbO`8Axd3mo%qUZaYRx3$jG`q3_@V+f*~NAQSgkkSyxVIbLPSy3$S7iY ze#$&ucnkUviP1r#Y1?4EY!1G_uB?tMj=@OfiHOALU`~sd*EitkMfyhwpc13qJ-7eCHa*oL{Hb3;X6A4v55Eu@W7p&td99Y00000NkvXXu0mjfOSPW! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_blades.png b/src/main/resources/assets/hbm/textures/items/mold_blades.png new file mode 100644 index 0000000000000000000000000000000000000000..09497e5a2d8974ec243df50eaa3555bcddbdcfdf GIT binary patch literal 533 zcmV+w0_y#VP)KWp1i6vcnGB%Z*75fltrx&(vOrAyqYv^aR|5|w613ZbTJ zKR_XL>jwzkg27)PQ%6%n$y9p^P9+d&7JNkte0VWb**Bafq<1_A3_Ktx3t%#$Uz z@q)5!JUPEmg^Dl$=nh@p9_$tV-JwhM{`MV%Jk68y3p!1kd9tK8@~~?bXZ->0Gz7q| zSvc($6W>!a<*F&v$F5m)hb{nVmKE}H_}Uv6yeZG(go-feG;Q2zs6ga^({2IaPD3WX zhpFkr>FQ2G)f5C_q;zhg>a<(XA1HR6rmaBqS)9-td8Ao}U9;3cUgyO36gz;^FJF26 z=mGKa*A|X;8oYnC&%egIm(RJkU0*Yh$#0iqrB^!NY1#nFlTGY&K<)o;n(dm!v)w0r z{PdZ{kF>Z2;E&@u>krhRH1y`mS0G#UMiD@Q$m7YcFCP*lAL}&|(H*)RA36YBdt*#Z z$DM{8A391}oUXXJ@|A%ArPCL?SrA6V=}H}msja=;sy7taruuEXp!DYP!;Jq7qg>)A Xn{@En)x38*00000NkvXXu0mjfO~>;z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_hull_big.png b/src/main/resources/assets/hbm/textures/items/mold_hull_big.png new file mode 100644 index 0000000000000000000000000000000000000000..81e63e8da716b95a7525f53e20056ec9bfafd3c8 GIT binary patch literal 440 zcmV;p0Z0CcP)ualcN)aWAP4blD zaWEoSFHxyA7(Dl^PnyfweV6*$DgaTE;3;K;Ofta5)eV(eV_u+G@X5nZ20syNow4O4 zoU-D(xxsmGr6khx;<8xqIk|gcvr^7Y=nlu0zQN`7E#+!$&OiyVka8Ykt?}ecBMFeC zX-2eV+OWT{35J038JgGSNKKs261!Y$V i(capeuiBDurQi#o>!Ah%WL8H20000i5QV?|^#;0#6|wFFDT-Bbrz=4OUqBy0-1;!$R&ePn z2=3hJMiE*l-AJKQP-7{9{4|M+c#|f!sb@2nGiT0BGWRN1Cx@}nH7rvwbUlFFSweEf zoGx^Yo;~7AxHw)wRT%W_Q7Whk1IG*Kk#IdmDfjLAs8T44Wi0ZOaJ(QrtJ4zGOlCp1 zOp%Uv{n(l*l!)S(^Zl*NVCZ^Og~8>+3(b11w74~}*sj<#Sx08H=WeOZGKvR^t z-6bljh8vC(gQ4qj^VDWzd0}pMIpOWyJ!_jgi2*RD~bI1GmSaczJFB0000< KMNUMnLSTZ!$F_3- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_mogus.png b/src/main/resources/assets/hbm/textures/items/mold_mogus.png new file mode 100644 index 0000000000000000000000000000000000000000..1da1368d6fb8806636f3c7de7e8e4f253694a9e7 GIT binary patch literal 438 zcmV;n0ZIOeP)TcAa(rlABjNz-_Uo9-rU=Q7EgotZapc8%N1)08s`+v4y=2mso*G>H{s zj57+?o8p%X1YwK{H{p8I{6K}92*MaHGR(y^$0i~IlLuw8>O0*Y0Du|>k~GE5aXUYo zGf-*DKoG{bd+VcJuWDoLHd`1veGMbF#Zk0Qw}->+%@Y3j{EAwmsbS0)VTp3F^VRv8 z_Fro>F&;Qs0o&qmy-b*8$!d4Cph#wA2J1{^5zP}=ltIM*Tae1HvSRn~z{wd983@7{ z?RvE|?<%uswm=3fF3ZW@4u(!2y)Um+?EdKmCLxICiB?D(VVMqc@1Ng34z_G;5URzs z5!UGdU?~IR;rb%|7>zYhBs1){j!L&q?q4J`Sd?KRA`tnqq^dF~lT}*$7(woGrv&2|ur`)&#lpDcU4yiG? zvhX^^5q614AvPVXK9b#owYv`MU{yps-`$vKJfqfVQjv;};Tyhk0H`eMGF6 s_{z!aK1V|)af0Y|JKKM@1Y9Zj1=3fM+}@eaegFUf07*qoM6N<$f~9z?qW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_stamp.png b/src/main/resources/assets/hbm/textures/items/mold_stamp.png new file mode 100644 index 0000000000000000000000000000000000000000..16dfddc0b01d261c92583dc64bb491ddbd1962a5 GIT binary patch literal 398 zcmV;90df9`P)S6otRcB$+@LwF@nR;8N($r7NY-r5pQZ(%0w{6uR*V zM6l3ppyEPnDTVxW5*J~noiwG0XLDyx?wot(=8iXddMK4IX-A4xk^(qu1H;w7`O25X z%QfFBVUy;xR6x93+k}=1*rYiz6&JI%+)t9>o5bgrSET2m%hE=J`o7ogaCd!KIoP*( zb8%+Zp_F7=(}dxm&tg8S1lp0Z_5j{LmyL%^<-8~y&R-=dEfpLj9;-Z_Ov#F!GtrI| zn>0sy-qFf+ghG<&Z6#nF>^JEYvO*Kds(k|Zp94ew#R1?ts5h|*ruzqf0o*I}x*djt zexpcMXaXS|&JL0;OFKN{$@HWXD_{nx*X{7wzqge_AsZcpLOOHco0oNab Date: Wed, 28 Sep 2022 22:31:58 +0200 Subject: [PATCH 084/111] mold recipes, casting basin automation --- .../hbm/blocks/machine/FoundryChannel.java | 6 +- .../com/hbm/blocks/machine/FoundryOutlet.java | 16 ++--- .../inventory/recipes/anvil/AnvilRecipes.java | 50 +++++++++++++++ .../anvil/AnvilSmithingCyanideRecipe.java | 1 - .../recipes/anvil/AnvilSmithingMold.java | 61 +++++++++++++++++++ .../java/com/hbm/items/machine/ItemMold.java | 35 +++++------ .../machine/TileEntityFoundryCastingBase.java | 18 +++++- src/main/resources/assets/hbm/lang/de_DE.lang | 21 ++++--- src/main/resources/assets/hbm/lang/en_US.lang | 21 ++++--- 9 files changed, 185 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingMold.java diff --git a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java index 5a5626420..9265797b2 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java @@ -121,8 +121,12 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor return false; Block b = world.getBlock(x + dir.offsetX, y, z + dir.offsetZ); + int meta = world.getBlockMetadata(x + dir.offsetX, y, z + dir.offsetZ); - return b == ModBlocks.foundry_channel || b == ModBlocks.foundry_mold || b == ModBlocks.foundry_outlet; + if(b == ModBlocks.foundry_outlet && meta == dir.ordinal()) + return true; + + return b == ModBlocks.foundry_channel || b == ModBlocks.foundry_mold; } public static int renderID = RenderingRegistry.getNextAvailableRenderId(); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index 6c1c4b235..3458a9785 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -75,10 +75,10 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { AxisAlignedBB aabb = null; int meta = world.getBlockMetadata(x, y, z); - if(meta == 2) aabb = AxisAlignedBB.getBoundingBox(x + 0.625D, y, z + 0.3125D, x + 1D, y + 0.5D, z + 0.6875D); - if(meta == 3) aabb = AxisAlignedBB.getBoundingBox(x + 0D, y, z + 0.3125D, x + 0.375D, y + 0.5D, z + 0.6875D); - if(meta == 4) aabb = AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.625D, x + 0.6875D, y + 0.5D, z + 1D); - if(meta == 5) aabb = AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0D, x + 0.6875D, y + 0.5D, z + 0.375D); + if(meta == 4) aabb = AxisAlignedBB.getBoundingBox(x + 0.625D, y, z + 0.3125D, x + 1D, y + 0.5D, z + 0.6875D); + if(meta == 5) aabb = AxisAlignedBB.getBoundingBox(x + 0D, y, z + 0.3125D, x + 0.375D, y + 0.5D, z + 0.6875D); + if(meta == 2) aabb = AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.625D, x + 0.6875D, y + 0.5D, z + 1D); + if(meta == 3) aabb = AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0D, x + 0.6875D, y + 0.5D, z + 0.375D); if(aabb != null && entityBounding.intersectsWith(aabb)) { list.add(aabb); @@ -96,10 +96,10 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { int meta = world.getBlockMetadata(x, y, z); - if(meta == 2) this.setBlockBounds(0.625F, 0F, 0.3125F, 1F, 0.5F, 0.6875F); - if(meta == 3) this.setBlockBounds(0F, 0F, 0.3125F, 0.375F, 0.5F, 0.6875F); - if(meta == 4) this.setBlockBounds(0.3125F, 0F, 0.625F, 0.6875F, 0.5F, 1F); - if(meta == 5) this.setBlockBounds(0.3125F, 0F, 0F, 0.6875F, 0.5F, 0.375F); + if(meta == 4) this.setBlockBounds(0.625F, 0F, 0.3125F, 1F, 0.5F, 0.6875F); + if(meta == 5) this.setBlockBounds(0F, 0F, 0.3125F, 0.375F, 0.5F, 0.6875F); + if(meta == 2) this.setBlockBounds(0.3125F, 0F, 0.625F, 0.6875F, 0.5F, 1F); + if(meta == 3) this.setBlockBounds(0.3125F, 0F, 0F, 0.6875F, 0.5F, 0.375F); } @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 48dd30ebb..4c5ad09d4 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -67,6 +67,56 @@ public class AnvilRecipes { smithingRecipes.add(new AnvilSmithingRecipe(1916169, new ItemStack(ModItems.wings_murk, 1), new ComparableStack(ModItems.wings_limp), new ComparableStack(ModItems.particle_tachyon))); smithingRecipes.add(new AnvilSmithingRecipe(4, new ItemStack(ModItems.flask_infusion, 1, EnumInfusion.SHIELD.ordinal()), new ComparableStack(ModItems.gem_alexandrite), new ComparableStack(ModItems.bottle_nuka))); + smithingRecipes.add(new AnvilSmithingMold(0, new OreDictStack(GOLD.nugget()), new OreDictStack("nugget"))); + smithingRecipes.add(new AnvilSmithingMold(1, new OreDictStack(U.billet()), new OreDictStack("billet"))); + smithingRecipes.add(new AnvilSmithingMold(2, new OreDictStack(IRON.ingot()), new OreDictStack("ingot"))); + smithingRecipes.add(new AnvilSmithingMold(3, new OreDictStack(IRON.plate()), new OreDictStack("plate"))); + smithingRecipes.add(new AnvilSmithingMold(4, new ComparableStack(ModItems.wire_aluminium, 8), new ItemStack[] { + new ItemStack(ModItems.wire_advanced_alloy, 8), + new ItemStack(ModItems.wire_aluminium, 8), + new ItemStack(ModItems.wire_copper, 8), + new ItemStack(ModItems.wire_gold, 8), + new ItemStack(ModItems.wire_magnetized_tungsten, 8), + new ItemStack(ModItems.wire_red_copper, 8), + new ItemStack(ModItems.wire_schrabidium, 8), + new ItemStack(ModItems.wire_tungsten, 8) + })); + smithingRecipes.add(new AnvilSmithingMold(5, new ComparableStack(ModItems.blade_titanium), new ItemStack[] { + new ItemStack(ModItems.blade_titanium), + new ItemStack(ModItems.blade_tungsten) + })); + smithingRecipes.add(new AnvilSmithingMold(6, new ComparableStack(ModItems.blades_iron), new ItemStack[] { + new ItemStack(ModItems.blades_gold), + new ItemStack(ModItems.blades_aluminium), + new ItemStack(ModItems.blades_iron), + new ItemStack(ModItems.blades_steel), + new ItemStack(ModItems.blades_titanium), + new ItemStack(ModItems.blades_advanced_alloy), + new ItemStack(ModItems.blades_combine_steel), + new ItemStack(ModItems.blades_schrabidium) + })); + smithingRecipes.add(new AnvilSmithingMold(7, new ComparableStack(ModItems.stamp_iron_flat), new ItemStack[] { + new ItemStack(ModItems.stamp_stone_flat), + new ItemStack(ModItems.stamp_iron_flat), + new ItemStack(ModItems.stamp_steel_flat), + new ItemStack(ModItems.stamp_titanium_flat), + new ItemStack(ModItems.stamp_obsidian_flat), + new ItemStack(ModItems.stamp_schrabidium_flat) + })); + smithingRecipes.add(new AnvilSmithingMold(8, new ComparableStack(ModItems.hull_small_steel), new ItemStack[] { + new ItemStack(ModItems.hull_small_aluminium), + new ItemStack(ModItems.hull_small_steel) + })); + smithingRecipes.add(new AnvilSmithingMold(9, new ComparableStack(ModItems.hull_big_steel), new ItemStack[] { + new ItemStack(ModItems.hull_big_steel), + new ItemStack(ModItems.hull_big_aluminium), + new ItemStack(ModItems.hull_big_titanium) + })); + smithingRecipes.add(new AnvilSmithingMold(10, new OreDictStack(IRON.ingot(), 9), new OreDictStack("ingot", 9))); + smithingRecipes.add(new AnvilSmithingMold(11, new OreDictStack(IRON.plate(), 9), new OreDictStack("plate", 9))); + smithingRecipes.add(new AnvilSmithingMold(12, new OreDictStack(IRON.block()), new OreDictStack("block"))); + smithingRecipes.add(new AnvilSmithingMold(13, new ComparableStack(ModItems.pipes_steel), new ItemStack[] {new ItemStack(ModItems.pipes_steel)})); + smithingRecipes.add(new AnvilSmithingCyanideRecipe()); smithingRecipes.add(new AnvilSmithingRenameRecipe()); } diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingCyanideRecipe.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingCyanideRecipe.java index c1ebe933f..5b1db63d5 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingCyanideRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingCyanideRecipe.java @@ -1,6 +1,5 @@ package com.hbm.inventory.recipes.anvil; -import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingMold.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingMold.java new file mode 100644 index 000000000..899e1725c --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingMold.java @@ -0,0 +1,61 @@ +package com.hbm.inventory.recipes.anvil; + +import java.util.List; + +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.items.ModItems; +import com.hbm.util.ItemStackUtil; + +import net.minecraft.item.ItemStack; + +public class AnvilSmithingMold extends AnvilSmithingRecipe { + + OreDictStack matchesPrefix; + ItemStack[] matchesStack; + + public AnvilSmithingMold(int meta, AStack demo, Object o) { + super(1, new ItemStack(ModItems.mold, 1, meta), demo, new ComparableStack(ModItems.mold_base)); + + if(o instanceof OreDictStack) + matchesPrefix = (OreDictStack) o; + if(o instanceof ItemStack[]) + matchesStack = (ItemStack[]) o; + } + + @Override + public boolean matches(ItemStack left, ItemStack right) { + if(!doesStackMatch(right, this.right)) return false; + + if(matchesPrefix != null && left.stackSize == matchesPrefix.stacksize) { + List names = ItemStackUtil.getOreDictNames(left); + + for(String name : names) { + if(name.startsWith(matchesPrefix.name)) { + return true; + } + } + } + + if(matchesStack != null) { + + for(ItemStack stack : matchesStack) { + if(left.getItem() == stack.getItem() && left.getItemDamage() == stack.getItemDamage() && left.stackSize == stack.stackSize) { + return true; + } + } + } + + return false; + } + + @Override + public int matchesInt(ItemStack left, ItemStack right) { + return matches(left, right) ? 0 : -1; + } + + public int amountConsumed(int index, boolean mirrored) { + return index; + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java index 049b2e285..883fa1226 100644 --- a/src/main/java/com/hbm/items/machine/ItemMold.java +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -29,8 +29,12 @@ public class ItemMold extends Item { public HashMap moldById = new HashMap(); //molds by their static ID -> stack item damage public ItemMold() { + + this.setHasSubtypes(true); + this.setMaxDamage(0); + int S = 0; - int L = 0; + int L = 1; registerMold(new MoldShape( 0, S, "nugget", MaterialShapes.NUGGET)); registerMold(new MoldShape( 1, S, "billet", MaterialShapes.BILLET)); registerMold(new MoldShape( 2, S, "ingot", MaterialShapes.INGOT)); @@ -51,7 +55,7 @@ public class ItemMold extends Item { Mats.MAT_CMB, new ItemStack(ModItems.blades_combine_steel), Mats.MAT_SCHRABIDIUM, new ItemStack(ModItems.blades_schrabidium))); - registerMold(new MoldMulti( 7, S, "blades", MaterialShapes.INGOT.q(4), + registerMold(new MoldMulti( 7, S, "stamp", MaterialShapes.INGOT.q(4), Mats.MAT_STONE, new ItemStack(ModItems.stamp_stone_flat), Mats.MAT_IRON, new ItemStack(ModItems.stamp_iron_flat), Mats.MAT_STEEL, new ItemStack(ModItems.stamp_steel_flat), @@ -110,12 +114,6 @@ public class ItemMold extends Item { return this.icons[0]; } - /*@Override - public String getUnlocalizedName(ItemStack stack) { - int meta = Math.abs(stack.getItemDamage() % molds.size()); - return super.getUnlocalizedName(stack) + "_" + molds.get(meta).name; - }*/ - @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { Mold mold = getMold(stack); @@ -152,8 +150,8 @@ public class ItemMold extends Item { public class MoldShape extends Mold { - MaterialShapes shape; - int amount; + public MaterialShapes shape; + public int amount; public MoldShape(int id, int size, String name, MaterialShapes shape) { this(id, size, name, shape, 1); @@ -224,9 +222,9 @@ public class ItemMold extends Item { /* because why not */ public class MoldSingle extends Mold { - ItemStack out; - NTMMaterial mat; - int amount; + public ItemStack out; + public NTMMaterial mat; + public int amount; public MoldSingle(int id, int size, String name, ItemStack out, NTMMaterial mat, int amount) { super(id, size, name); @@ -247,15 +245,16 @@ public class ItemMold extends Item { @Override public String getTitle() { - return out.getDisplayName() + " x" + this.amount; + return out.getDisplayName() + " x" + this.out.stackSize; } } /* not so graceful but it does the job and it does it well */ public class MoldMulti extends Mold { - HashMap map = new HashMap(); - int amount; + public HashMap map = new HashMap(); + public int amount; + public int stacksize; public MoldMulti(int id, int size, String name, int amount, Object... inputs) { super(id, size, name); @@ -263,6 +262,8 @@ public class ItemMold extends Item { for(int i = 0; i < inputs.length; i += 2) { map.put((NTMMaterial) inputs[i], (ItemStack) inputs[i + 1]); + + if(i == 0) stacksize = (((ItemStack) inputs[i + 1])).stackSize; } } @@ -283,7 +284,7 @@ public class ItemMold extends Item { @Override public String getTitle() { - return I18nUtil.resolveKey("shape." + name) + " x" + this.amount; + return I18nUtil.resolveKey("shape." + name) + " x" + this.stacksize; } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java index dc0f173cd..cef301c90 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -7,6 +7,7 @@ import com.hbm.items.machine.ItemMold.Mold; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -18,7 +19,7 @@ import net.minecraftforge.common.util.ForgeDirection; * @author hbm * */ -public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase implements IInventory { +public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase implements ISidedInventory { public ItemStack slots[] = new ItemStack[2]; public int cooloff = 100; @@ -198,4 +199,19 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase } nbt.setTag("items", list); } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] { 1 }; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side) { + return false; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side) { + return slot == 1; + } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 66f8a863c..18a85a063 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2997,16 +2997,21 @@ rbmk.rod.xenon=Xenonvergiftung: %s rbmk.rod.coreTemp=Kerntemperatur: %s rbmk.rod.skinTemp=Außentemperatur: %s / %s -shape.quantum=Quantum -shape.nugget=Nugget -shape.dusttiny=Winziger Haufen -shape.wire=Draht shape.billet=Billet -shape.ingot=Barren -shape.dust=Haufen -shape.plate=Platte -shape.quart=Viertel Block +shape.blade=Turbinenblatt +shape.blades=Sägeblatt shape.block=Block +shape.dust=Haufen +shape.dusttiny=Winziger Haufen +shape.hull_big=Große Hülle +shape.hull_small=Kleine Hülle +shape.ingot=Barren +shape.nugget=Nugget +shape.quantum=Quantum +shape.quart=Viertel Block +shape.plate=Platte +shape.stamp=Stempel +shape.wire=Draht soundCategory.ntmMachines=NTM Maschinen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 91a72b9df..71a959808 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3442,16 +3442,21 @@ rbmk.screen.rod=Control: %s rbmk.screen.temp=Temp: %s rbmk.screen.xenon=Xenon: %s -shape.quantum=Quantum -shape.nugget=Nugget -shape.dusttiny=Tiny Dust -shape.wire=Wire shape.billet=Billet -shape.ingot=Ingot -shape.dust=Dust -shape.plate=Plate -shape.quart=Quarter Block +shape.blade=Blade +shape.blades=Shredder Blades shape.block=Block +shape.dust=Dust +shape.dusttiny=Tiny Dust +shape.hull_big=Big Shell +shape.hull_small=Small Shell +shape.ingot=Ingot +shape.nugget=Nugget +shape.quantum=Quantum +shape.quart=Quarter Block +shape.plate=Plate +shape.stamp=Press Stamp +shape.wire=Wire soundCategory.ntmMachines=NTM Machines From 46f11acb9bf899c025c1f90fc1eb3e45488efe26 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 29 Sep 2022 16:52:05 +0200 Subject: [PATCH 085/111] fixed diode lag, proper limit, functional crucible recipes, scraps --- .../com/hbm/blocks/network/CableDiode.java | 19 ++++- .../inventory/material/MatDistribution.java | 30 +++++++ .../java/com/hbm/inventory/material/Mats.java | 1 + .../hbm/inventory/material/NTMMaterial.java | 2 + .../inventory/recipes/CrucibleRecipes.java | 10 ++- src/main/java/com/hbm/items/ModItems.java | 3 + .../java/com/hbm/items/machine/ItemMold.java | 28 ++++++- .../com/hbm/items/machine/ItemScraps.java | 76 ++++++++++++++++++ .../java/com/hbm/main/CraftingManager.java | 3 +- .../machine/TileEntityCrucible.java | 35 ++++++++ .../assets/hbm/textures/items/mold_c357.png | Bin 0 -> 352 bytes .../assets/hbm/textures/items/mold_c44.png | Bin 0 -> 368 bytes .../assets/hbm/textures/items/mold_c50.png | Bin 0 -> 364 bytes .../assets/hbm/textures/items/mold_c9.png | Bin 0 -> 353 bytes .../hbm/textures/items/mold_cbuckshot.png | Bin 0 -> 351 bytes .../assets/hbm/textures/items/mold_gem.png | Bin 0 -> 478 bytes .../assets/hbm/textures/items/scraps.png | Bin 0 -> 262 bytes 17 files changed, 197 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/hbm/items/machine/ItemScraps.java create mode 100644 src/main/resources/assets/hbm/textures/items/mold_c357.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_c44.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_c50.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_c9.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_cbuckshot.png create mode 100644 src/main/resources/assets/hbm/textures/items/mold_gem.png create mode 100644 src/main/resources/assets/hbm/textures/items/scraps.png diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 25da7bb68..3cec642fc 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -110,7 +110,7 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl TileEntityDiode diode = (TileEntityDiode) te; List text = new ArrayList(); - text.add("Max.: " + BobMathUtil.getShortNumber(diode.getMaxPower()) + "HE/pulse"); + text.add("Max.: " + BobMathUtil.getShortNumber(diode.getMaxPower()) + "HE/t"); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -168,6 +168,8 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl private boolean recursionBrake = false; private long subBuffer; + private long contingent = 0; + private long lastTransfer = 0; @Override public long transferPower(long power) { @@ -175,9 +177,17 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl if(recursionBrake) return power; + if(lastTransfer != worldObj.getTotalWorldTime()) { + lastTransfer = worldObj.getTotalWorldTime(); + contingent = getMaxPower(); + } + + if(contingent <= 0) + return power; + //this part turns "maxPower" from a glorified transfer weight into an actual transfer cap - long overShoot = Math.max(0, power - getMaxPower()); - power = Math.min(power, getMaxPower()); + long overShoot = Math.max(0, power - contingent); + power = Math.min(power, contingent); recursionBrake = true; this.subBuffer = power; @@ -186,6 +196,9 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); long ret = this.subBuffer; + long sent = power - ret; + contingent -= sent; + this.subBuffer = 0; recursionBrake = false; diff --git a/src/main/java/com/hbm/inventory/material/MatDistribution.java b/src/main/java/com/hbm/inventory/material/MatDistribution.java index 58c00b1dd..0c22e9780 100644 --- a/src/main/java/com/hbm/inventory/material/MatDistribution.java +++ b/src/main/java/com/hbm/inventory/material/MatDistribution.java @@ -8,6 +8,7 @@ import java.util.List; import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; import net.minecraft.block.Block; import net.minecraft.init.Blocks; @@ -18,11 +19,40 @@ import net.minecraft.item.ItemStack; public class MatDistribution { public static void register() { + //vanilla crap + registerOre("stone", MAT_STONE, BLOCK.q(1)); + registerOre("cobblestone", MAT_STONE, BLOCK.q(1)); + registerEntry(Blocks.obsidian, MAT_OBSIDIAN, BLOCK.q(1)); registerEntry(Blocks.rail, MAT_IRON, INGOT.q(6, 16)); registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6), MAT_REDSTONE, DUST.q(1)); registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6), MAT_REDSTONE, DUST.q(1)); registerEntry(Items.minecart, MAT_IRON, INGOT.q(5)); + + //castables + registerEntry(ModItems.blade_titanium, MAT_TITANIUM, INGOT.q(2)); + registerEntry(ModItems.blade_tungsten, MAT_TUNGSTEN, INGOT.q(2)); + registerEntry(ModItems.blades_gold, MAT_GOLD, INGOT.q(4)); + registerEntry(ModItems.blades_aluminium, MAT_ALUMINIUM, INGOT.q(4)); + registerEntry(ModItems.blades_iron, MAT_IRON, INGOT.q(4)); + registerEntry(ModItems.blades_steel, MAT_STEEL, INGOT.q(4)); + registerEntry(ModItems.blades_titanium, MAT_TITANIUM, INGOT.q(4)); + registerEntry(ModItems.blades_advanced_alloy, MAT_ALLOY, INGOT.q(4)); + registerEntry(ModItems.blades_combine_steel, MAT_CMB, INGOT.q(4)); + registerEntry(ModItems.blades_schrabidium, MAT_SCHRABIDIUM, INGOT.q(4)); + registerEntry(ModItems.stamp_stone_flat, MAT_STONE, INGOT.q(3)); + registerEntry(ModItems.stamp_iron_flat, MAT_IRON, INGOT.q(3)); + registerEntry(ModItems.stamp_steel_flat, MAT_STEEL, INGOT.q(3)); + registerEntry(ModItems.stamp_titanium_flat, MAT_TITANIUM, INGOT.q(3)); + registerEntry(ModItems.stamp_obsidian_flat, MAT_OBSIDIAN, INGOT.q(3)); + registerEntry(ModItems.stamp_schrabidium_flat, MAT_SCHRABIDIUM, INGOT.q(3)); + registerEntry(ModItems.hull_small_steel, MAT_STEEL, INGOT.q(2)); + registerEntry(ModItems.hull_small_aluminium, MAT_ALUMINIUM, INGOT.q(2)); + registerEntry(ModItems.hull_big_steel, MAT_STEEL, INGOT.q(6)); + registerEntry(ModItems.hull_big_aluminium, MAT_ALUMINIUM, INGOT.q(6)); + registerEntry(ModItems.hull_big_titanium, MAT_TITANIUM, INGOT.q(6)); + registerEntry(ModItems.pipes_steel, MAT_STEEL, BLOCK.q(3)); + //actual ores registerOre(OreDictManager.COAL.ore(), MAT_IRON, INGOT.q(4), MAT_STONE, QUART.q(1)); registerOre(OreDictManager.IRON.ore(), MAT_IRON, INGOT.q(3), MAT_TITANIUM, INGOT.q(1), MAT_STONE, QUART.q(1)); registerOre(OreDictManager.GOLD.ore(), MAT_GOLD, INGOT.q(3), MAT_LEAD, INGOT.q(1), MAT_STONE, QUART.q(1)); diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 0b32625ff..a73da1d2b 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -24,6 +24,7 @@ import net.minecraft.item.ItemStack; */ public class Mats { + public static List orderedList = new ArrayList(); public static HashMap prefixByName = new HashMap(); public static HashMap matById = new HashMap(); public static HashMap matByName = new HashMap(); diff --git a/src/main/java/com/hbm/inventory/material/NTMMaterial.java b/src/main/java/com/hbm/inventory/material/NTMMaterial.java index 68bb321cf..6883f4384 100644 --- a/src/main/java/com/hbm/inventory/material/NTMMaterial.java +++ b/src/main/java/com/hbm/inventory/material/NTMMaterial.java @@ -14,6 +14,7 @@ public class NTMMaterial { public MaterialShapes[] shapes = new MaterialShapes[0]; public boolean omitItemGen = false; public SmeltingBehavior smeltable = SmeltingBehavior.NOT_SMELTABLE; + public int solidColor = 0xFF4A00; //TODO public int moltenColor = 0xFF4A00; public NTMMaterial(int id, DictFrame dict) { @@ -25,6 +26,7 @@ public class NTMMaterial { Mats.matByName.put(name, this); } + Mats.orderedList.add(this); Mats.matById.put(id, this); } diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java index 991c2198f..072faee53 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -15,8 +15,12 @@ public class CrucibleRecipes extends SerializableRecipe { public static HashMap indexMapping = new HashMap(); public static List recipes = new ArrayList(); - - + + /* + * IMPORTANT: crucibles do not have stack size checks for the recipe's result, meaning that they can overflow if the resulting stacks are + * bigger than the input stacks, so make sure that material doesn't "expand". very few things do that IRL when alloying anyway. + */ + @Override public void registerDefaults() { @@ -38,7 +42,7 @@ public class CrucibleRecipes extends SerializableRecipe { public MaterialStack[] output; private int id; private String name; - public int frequency; + public int frequency = 1; public CrucibleRecipe(int id, String name, int frequency) { this.id = id; diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index c5038b221..dfc52f442 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -744,6 +744,7 @@ public class ModItems { public static Item mold_base; public static Item mold; + public static Item scraps; public static Item part_lithium; public static Item part_beryllium; @@ -3355,6 +3356,7 @@ public class ModItems { mold_base = new Item().setUnlocalizedName("mold_base").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":mold_base"); mold = new ItemMold().setUnlocalizedName("mold").setCreativeTab(MainRegistry.controlTab); + scraps = new ItemScraps().setUnlocalizedName("scraps").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":scraps"); part_lithium = new Item().setUnlocalizedName("part_lithium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_lithium"); part_beryllium = new Item().setUnlocalizedName("part_beryllium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_beryllium"); @@ -6654,6 +6656,7 @@ public class ModItems { //Molds GameRegistry.registerItem(mold_base, mold_base.getUnlocalizedName()); GameRegistry.registerItem(mold, mold.getUnlocalizedName()); + GameRegistry.registerItem(scraps, scraps.getUnlocalizedName()); //Machine Upgrades GameRegistry.registerItem(upgrade_template, upgrade_template.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java index 883fa1226..cb8337f32 100644 --- a/src/main/java/com/hbm/items/machine/ItemMold.java +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -17,6 +17,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; @@ -28,10 +29,15 @@ public class ItemMold extends Item { public List molds = new ArrayList(); //molds in "pretty" order, variable between versions public HashMap moldById = new HashMap(); //molds by their static ID -> stack item damage + public HashMap blockOverrides = new HashMap(); + public ItemMold() { this.setHasSubtypes(true); this.setMaxDamage(0); + + blockOverrides.put(Mats.MAT_STONE, new ItemStack(Blocks.stone)); + blockOverrides.put(Mats.MAT_OBSIDIAN, new ItemStack(Blocks.obsidian)); int S = 0; int L = 1; @@ -41,7 +47,7 @@ public class ItemMold extends Item { registerMold(new MoldShape( 3, S, "plate", MaterialShapes.PLATE)); registerMold(new MoldWire( 4, S, "wire")); - registerMold(new MoldMulti( 5, S, "blade", MaterialShapes.INGOT.q(3), + registerMold(new MoldMulti( 5, S, "blade", MaterialShapes.INGOT.q(2), Mats.MAT_TITANIUM, new ItemStack(ModItems.blade_titanium), Mats.MAT_TUNGSTEN, new ItemStack(ModItems.blade_tungsten))); @@ -74,7 +80,7 @@ public class ItemMold extends Item { registerMold(new MoldShape( 10, L, "ingots", MaterialShapes.INGOT, 9)); registerMold(new MoldShape( 11, L, "plates", MaterialShapes.PLATE, 9)); - registerMold(new MoldShape( 12, L, "block", MaterialShapes.BLOCK)); + registerMold(new MoldBlock( 12, L, "block", MaterialShapes.BLOCK)); registerMold(new MoldSingle( 13, L, "pipes", new ItemStack(ModItems.pipes_steel), Mats.MAT_STEEL, MaterialShapes.BLOCK.q(3))); } @@ -188,6 +194,24 @@ public class ItemMold extends Item { } } + public class MoldBlock extends MoldShape { + + public MoldBlock(int id, int size, String name, MaterialShapes shape) { + super(id, size, name, shape); + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + + ItemStack override = blockOverrides.get(mat); + + if(override != null) + return override.copy(); + + return super.getOutput(mat); + } + } + public class MoldWire extends Mold { public MoldWire(int id, int size, String name) { diff --git a/src/main/java/com/hbm/items/machine/ItemScraps.java b/src/main/java/com/hbm/items/machine/ItemScraps.java new file mode 100644 index 000000000..6b20eb094 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemScraps.java @@ -0,0 +1,76 @@ +package com.hbm.items.machine; + +import java.util.List; + +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.inventory.material.NTMMaterial; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemScraps extends Item { + + public ItemScraps() { + this.setHasSubtypes(true); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(NTMMaterial mat : Mats.orderedList) { + list.add(new ItemStack(item, 1, mat.id)); + } + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + MaterialStack contents = getMats(stack); + + if(contents != null) { + list.add(contents.material.names[0] + " " + Mats.formatAmount(contents.amount)); + } + } + + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack stack, int layer) { + + NTMMaterial mat = Mats.matById.get(stack.getItemDamage()); + + if(mat != null) { + return mat.moltenColor; + } + + return 0xffffff; + } + + public static MaterialStack getMats(ItemStack stack) { + + if(stack.getItem() != ModItems.scraps) return null; + + NTMMaterial mat = Mats.matById.get(stack.getItemDamage()); + if(mat == null) return null; + + int amount = MaterialShapes.INGOT.q(1); + + if(stack.hasTagCompound()) { + amount = stack.getTagCompound().getInteger("amount"); + } + + return new MaterialStack(mat, amount); + } + + public static ItemStack create(MaterialStack stack) { + ItemStack scrap = new ItemStack(ModItems.scrap, 1, stack.material.id); + scrap.stackTagCompound = new NBTTagCompound(); + scrap.stackTagCompound.setInteger("amount", stack.amount); + return scrap; + } +} diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 1c55dc46f..e767c9848 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -199,7 +199,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.sphere_steel, 1), new Object[] { "PIP", "I I", "PIP", 'P', STEEL.plate(), 'I', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.pedestal_steel, 1), new Object[] { "P P", "P P", "III", 'P', STEEL.plate(), 'I', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.lemon, 1), new Object[] { " D ", "DSD", " D ", 'D', KEY_YELLOW, 'S', "stone" }); - addRecipeAuto(new ItemStack(ModItems.blade_titanium, 4), new Object[] { "TP", "TP", "TT", 'P', TI.plate(), 'T', TI.ingot() }); + addRecipeAuto(new ItemStack(ModItems.blade_titanium, 2), new Object[] { "TP", "TP", "TT", 'P', TI.plate(), 'T', TI.ingot() }); addRecipeAuto(new ItemStack(ModItems.turbine_titanium, 1), new Object[] { "BBB", "BSB", "BBB", 'B', ModItems.blade_titanium, 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.rotor_steel, 3), new Object[] { "CCC", "SSS", "CCC", 'C', ModItems.coil_gold, 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.generator_steel, 1), new Object[] { "RRR", "CCC", "SSS", 'C', ModItems.coil_gold_torus, 'S', STEEL.ingot(), 'R', ModItems.rotor_steel }); @@ -209,7 +209,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.shimmer_sledge, 1), new Object[] { "H", "G", "G", 'G', ModItems.shimmer_handle, 'H', ModItems.shimmer_head }); addRecipeAuto(new ItemStack(ModItems.shimmer_axe, 1), new Object[] { "H", "G", "G", 'G', ModItems.shimmer_handle, 'H', ModItems.shimmer_axe_head }); addRecipeAuto(new ItemStack(ModItems.definitelyfood, 1), new Object[] { "DDD", "SDS", "DDD", 'D', Blocks.dirt, 'S', STEEL.plate() }); - addRecipeAuto(new ItemStack(ModItems.blade_tungsten, 2), new Object[] { "IP", "TP", "TI", 'P', TI.plate(), 'T', TI.ingot(), 'I', W.ingot() }); addRecipeAuto(new ItemStack(ModItems.turbine_tungsten, 1), new Object[] { "BBB", "BSB", "BBB", 'B', ModItems.blade_tungsten, 'S', DURA.ingot() }); addRecipeAuto(new ItemStack(ModItems.ring_starmetal, 1), new Object[] { " S ", "S S", " S ", 'S', STAR.ingot() }); addRecipeAuto(new ItemStack(ModItems.flywheel_beryllium, 1), new Object[] { "BBB", "BTB", "BBB", 'B', BE.block(), 'T', ModItems.bolt_compound }); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 0bea94db6..b1180e9c1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -65,6 +65,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro if(!worldObj.isRemote) { tryPullHeat(); + /* collect items */ if(worldObj.getTotalWorldTime() % 5 == 0) { List list = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord + 0.5, zCoord - 0.5, xCoord + 1.5, yCoord + 1, zCoord + 1.5)); @@ -90,10 +91,14 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } } + /* smelt items from buffer */ if(!trySmelt()) { this.progress = 0; } + tryRecipe(); + + /* pour wasste stack */ if(!this.wasteStack.isEmpty()) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); @@ -101,6 +106,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, this.wasteStack, MaterialShapes.NUGGET.q(1), impact); } + /* pour recipe stack */ if(!this.recipeStack.isEmpty()) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); @@ -126,9 +132,11 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, toCast, MaterialShapes.NUGGET.q(1), impact); } + /* clean up stacks */ this.recipeStack.removeIf(o -> o.amount <= 0); this.wasteStack.removeIf(x -> x.amount <= 0); + /* sync */ NBTTagCompound data = new NBTTagCompound(); int[] rec = new int[recipeStack.size() * 2]; int[] was = new int[wasteStack.size() * 2]; @@ -221,6 +229,33 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return true; } + protected void tryRecipe() { + CrucibleRecipe recipe = this.getLoadedRecipe(); + + if(recipe == null) return; + if(worldObj.getTotalWorldTime() % recipe.frequency > 0) return; + + for(MaterialStack stack : recipe.input) { + if(getQuantaFromType(this.recipeStack, stack.material) < stack.amount) return; + } + + for(MaterialStack stack : this.recipeStack) { + stack.amount -= getQuantaFromType(recipe.input, stack.material); + } + + for(MaterialStack out : recipe.output) { + + for(MaterialStack stack : this.recipeStack) { + if(stack.material == out.material) { + stack.amount += out.amount; + break; + } + } + + this.recipeStack.add(out.copy()); + } + } + protected int getFirstSmeltableSlot() { for(int i = 1; i < 10; i++) { diff --git a/src/main/resources/assets/hbm/textures/items/mold_c357.png b/src/main/resources/assets/hbm/textures/items/mold_c357.png new file mode 100644 index 0000000000000000000000000000000000000000..2086e490bef49cf6f5e64558c68abaa470893cdf GIT binary patch literal 352 zcmV-m0iXVfP)8aq+L!kjrf@gn&SC9T9@#?Sf=1mF~ zdJWW*#u5UXq)`vD)7@=a;=9bwo5{tLnoj>WsD8QExP?%8O_!FU2d8Vl5B?Kvp6gRxf67kn~d4ASeA$T8> zp2OAgn8V4DQ@C8rjRV_>(0`VnTrTE8-fu&^yuO=@Y8&U=#p^SPdi($~ZMDrvAqiyw O00005BloozNvYkim5yxDpCb|yP`xVdb!3Q1zk!dL)rEfB7oQ(A?jSkaa8{N@z{JipHYF!j#^3*3`fzuC z!tv>uw{bR|I0tPfN?uksIh#&;`R+B;>-@ugn5y*RHeO;B4EO=9Y_R&SrJS|^0000< KMNUMnLSTX%Gn@bb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_c9.png b/src/main/resources/assets/hbm/textures/items/mold_c9.png new file mode 100644 index 0000000000000000000000000000000000000000..4921bd05bcde2024281388b2a6da2634006b5aa4 GIT binary patch literal 353 zcmV-n0iOPeP)yV6f`24l`!ybf-bAS2 zO#Y{r zXnc#I$x*FpDHxg@jc-w5&sC^}`*Is77P6T!Sm0a~5uxUD*V>+8h4JlM%P4B_| zc?xeL0Nh=cI6J=p04&~K4~po*8oB3eW)U01 zHBu49KP%iZoRIPz2QSNy-{N)?#X~$}t_Ju4=997^A*gyd00000NkvXXu0mjf+O3xk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_cbuckshot.png b/src/main/resources/assets/hbm/textures/items/mold_cbuckshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a82cdf756d7d503285bd67a08dbe07e94de84fec GIT binary patch literal 351 zcmV-l0igbgP)NZkY zL8+oh&IByrxp9W7{F~=D+5a0ndwG8PHd>Kb!`YPp!C4@-zE2yi$WA#Q#!-|ta}$%D zavv}^F-2LE@oUS-z3tOgL=q^;BK!6(in8|SXv{Ho$rPf*no-A8l53kl*JoFH>RoKM zyFg#BQUI*dxVFJ6ePPh2yxHzZmkY0_%LVrjk6xEct}>9ssWPn6xcYAjW1YT+E`wl< z|AFrTaMSD6R|^cMaB~TFkqWvm@LG2h*Q+$>I>7O;AB+${C)W5qmp-_*;ds~&SorRD x_dtG@)YgBYZyzvteS5zI*Hs{=>>}f6#t(D2w$ov}*BAf*002ovPDHLkV1fpdo238% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/mold_gem.png b/src/main/resources/assets/hbm/textures/items/mold_gem.png new file mode 100644 index 0000000000000000000000000000000000000000..7009021415b53d56eee330adeb5ffd9fde3c866a GIT binary patch literal 478 zcmV<40U`d0P)c(TfSQ1lUF*C*fr5UaerC9vw{gXCvEQ_DV zZ8o{8U{j_fPVb*M+WSnF=b9S~1NtXERkIs4QvwFV0Ke7b*LbQ}uiL?IH5m*8()_L5 z;5A)PH(sfDm-($G7mrb?iQA|d;$+78Lx|sM5=;^$OU%t(3EyuY@)C}U2BIKet&{)| zOcITI-45K`=~uJ&oSNg3E;DTTd5&f6lwP$@wxeU{7DPd>+fmsPUsYm26}V6wOaH`Y z@1U)OV3MfpUbn;L^(~%l^ZnZw#!;whbcDL`7)RlM1r?Lx>2p-VZ3(JPHrFX5OrN8z zJ1Ew;zH_<6mvFSDWE_R0`CBpj+QWK{z*bV`tm2!+0Pg7bAAO|DtmJp$;yv5q1L)i7 UpT?u0-v9sr07*qoM6N<$g8io52LJ#7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/scraps.png b/src/main/resources/assets/hbm/textures/items/scraps.png new file mode 100644 index 0000000000000000000000000000000000000000..334bf96fa5484df879c86c97c0117e4881b884aa GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf;3ewY8r z(%7?)=M+D;dH!ePKP59`VL@f3;&&f)4UMIZr3EF8XLqpF=U>|XC^d4ysuf$6mWsF@ zHgK^yZ_F@b{pH1ts~%bKEt#_Dq=|1p=#(G@CGqS1)20M5C>+@umUEj;iHV`-aYd#8 zpPzSGRL@Di`TO4gK5ZHo_CYOoov4{<b56nNZEa~f(jPBsS0rUuir>mdK II;Vst07K(sIsgCw literal 0 HcmV?d00001 From 19e5cf36c4b29e5f9832e533fbe231cc27a1310a Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 29 Sep 2022 23:21:30 +0200 Subject: [PATCH 086/111] removable scraps, better textures, outlet redstone control --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../blocks/machine/FoundryCastingBase.java | 20 +++++++++ .../hbm/blocks/machine/FoundryChannel.java | 33 +++++++++++++++ .../com/hbm/blocks/machine/FoundryOutlet.java | 2 - .../java/com/hbm/inventory/material/Mats.java | 16 ++++--- .../java/com/hbm/items/machine/ItemMold.java | 4 +- .../com/hbm/items/machine/ItemScraps.java | 2 +- .../com/hbm/main/ModEventHandlerClient.java | 3 +- .../com/hbm/render/block/RenderChannel.java | 9 ++++ .../hbm/render/tileentity/RenderCrucible.java | 40 ++++++++++++++++++ .../hbm/render/tileentity/RenderFoundry.java | 1 - .../machine/TileEntityCrucible.java | 23 +++++++++- .../machine/TileEntityFoundryBase.java | 7 +-- .../machine/TileEntityFoundryCastingBase.java | 10 +++-- .../machine/TileEntityFoundryChannel.java | 4 +- .../machine/TileEntityFoundryOutlet.java | 13 ++++++ .../textures/blocks/foundry_outlet_filter.png | Bin 0 -> 170 bytes .../textures/blocks/foundry_outlet_lock.png | Bin 0 -> 173 bytes .../assets/hbm/textures/items/scraps.png | Bin 262 -> 272 bytes 19 files changed, 165 insertions(+), 24 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_outlet_filter.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_outlet_lock.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 3a3620405..a56afe4b3 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1825,7 +1825,7 @@ public class ModBlocks { machine_stirling = new MachineStirling().setBlockName("machine_stirling").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_stirling_steel = new MachineStirling().setBlockName("machine_stirling_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_sawmill = new MachineSawmill().setBlockName("machine_sawmill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_crucible"); + machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index 29a2e1924..149ba3f33 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -8,6 +8,7 @@ import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemMold.Mold; +import com.hbm.items.machine.ItemScraps; import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; import com.hbm.util.I18nUtil; @@ -19,6 +20,8 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -104,6 +107,23 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc } } + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + } + return true; + } + return false; } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java index 9265797b2..5d81a660b 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java @@ -5,6 +5,7 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.machine.ItemScraps; import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFoundryChannel; @@ -18,6 +19,10 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; @@ -145,4 +150,32 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor public boolean renderAsNormalBlock() { return false; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } + + TileEntityFoundryChannel cast = (TileEntityFoundryChannel) world.getTileEntity(x, y, z); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + } + return true; + } + + return false; + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index 3458a9785..bb4b8a805 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -1,10 +1,8 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; import java.util.List; import com.hbm.inventory.material.Mats.MaterialStack; -import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFoundryOutlet; diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index a73da1d2b..205882ef5 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -11,6 +11,8 @@ import java.util.Map.Entry; import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; import com.hbm.util.ItemStackUtil; import net.minecraft.item.ItemStack; @@ -53,8 +55,8 @@ public class Mats { public static final NTMMaterial MAT_GRAPHITE = makeAdditive( 1420, GRAPHITE, 0); public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0xFFA259).omitAutoGen(); public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0xE8D754).omitAutoGen(); - public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0x7A0300).omitAutoGen(); - public static final NTMMaterial MAT_OBSIDIAN = makeSmeltable(_VS + 02, df("Obsidian"), 0x4D2F23).omitAutoGen(); + public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0xFF1000).omitAutoGen(); + public static final NTMMaterial MAT_OBSIDIAN = makeSmeltable(_VS + 02, df("Obsidian"), 0x3D234D).omitAutoGen(); //Radioactive public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); @@ -78,9 +80,9 @@ public class Mats { public static final NTMMaterial MAT_BORON = makeSmeltable(500, B, 0).setShapes(DUSTTINY, INGOT, DUST, BLOCK); //Alloys - public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0).setShapes(WIRE, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0x4A4A4A).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xE44C0F).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF7318).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0).setShapes(INGOT, DUST, BLOCK); public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0).setShapes(INGOT, DUST, BLOCK); public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0).setShapes(INGOT, DUST, BLOCK); @@ -142,6 +144,10 @@ public class Mats { list.addAll(entries); } + if(stack.getItem() == ModItems.scraps) { + list.add(ItemScraps.getMats(stack)); + } + return list; } diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java index cb8337f32..fb42c0c7f 100644 --- a/src/main/java/com/hbm/items/machine/ItemMold.java +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -176,7 +176,9 @@ public class ItemMold extends Item { String od = shape.name().toLowerCase() + name; List ores = OreDictionary.getOres(od); if(!ores.isEmpty()) { - return ores.get(0); + ItemStack copy = ores.get(0); + copy.stackSize = this.amount; + return copy; } } diff --git a/src/main/java/com/hbm/items/machine/ItemScraps.java b/src/main/java/com/hbm/items/machine/ItemScraps.java index 6b20eb094..ca3606c70 100644 --- a/src/main/java/com/hbm/items/machine/ItemScraps.java +++ b/src/main/java/com/hbm/items/machine/ItemScraps.java @@ -68,7 +68,7 @@ public class ItemScraps extends Item { } public static ItemStack create(MaterialStack stack) { - ItemStack scrap = new ItemStack(ModItems.scrap, 1, stack.material.id); + ItemStack scrap = new ItemStack(ModItems.scraps, 1, stack.material.id); scrap.stackTagCompound = new NBTTagCompound(); scrap.stackTagCompound.setInteger("amount", stack.amount); return scrap; diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index b984d3e1e..0d5d0abcd 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -634,7 +634,8 @@ public class ModEventHandlerClient { list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("cannery.f1")); } - List materials = Mats.getMaterialsFromItem(new ComparableStack(stack).makeSingular().toStack()); + ItemStack copy = stack.copy(); + List materials = Mats.getMaterialsFromItem(copy); if(!materials.isEmpty()) { for(MaterialStack mat : materials) { diff --git a/src/main/java/com/hbm/render/block/RenderChannel.java b/src/main/java/com/hbm/render/block/RenderChannel.java index af00974f7..8d5cc6423 100644 --- a/src/main/java/com/hbm/render/block/RenderChannel.java +++ b/src/main/java/com/hbm/render/block/RenderChannel.java @@ -202,6 +202,15 @@ public class RenderChannel implements ISimpleBlockRenderingHandler { boolean doRender = tile != null ? (tile.amount > 0 && tile.type != null) : false; double level = doRender ? tile.amount * 0.25D / tile.getCapacity() : 0; Color color = doRender ? new Color(tile.type.moltenColor).brighter() : null; + + if(color != null) { + double brightener = 0.7D; + int nr = (int) (255D - (255D - color.getRed()) * brightener); + int ng = (int) (255D - (255D - color.getGreen()) * brightener); + int nb = (int) (255D - (255D - color.getBlue()) * brightener); + + color = new Color(nr, ng, nb); + } boolean posX = channel.canConnectTo(world, x, y, z, Library.POS_X); boolean negX = channel.canConnectTo(world, x, y, z, Library.NEG_X); diff --git a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java index 3bcb5f57f..5d710e10a 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java @@ -4,15 +4,23 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityCrucible; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRendererProvider { + + public static final ResourceLocation lava = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lava.png"); @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -31,6 +39,38 @@ public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRe bindTexture(ResourceManager.crucible_tex); ResourceManager.crucible_heat.renderAll(); + TileEntityCrucible crucible = (TileEntityCrucible) tile; + + if(!crucible.recipeStack.isEmpty() || !crucible.wasteStack.isEmpty()) { + int totalCap = crucible.recipeCapacity + crucible.wasteCapacity; + int totalMass = 0; + + for(MaterialStack stack : crucible.recipeStack) totalMass += stack.amount; + for(MaterialStack stack : crucible.wasteStack) totalMass += stack.amount; + + double level = ((double) totalMass / (double) totalCap) * 0.875D; + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + + bindTexture(lava); + Tessellator tess = Tessellator.instance; + tess.setNormal(0F, 1F, 0F); + tess.startDrawingQuads(); + tess.addVertexWithUV(-1, 0.5 + level, -1, 0, 0); + tess.addVertexWithUV(-1, 0.5 + level, 1, 0, 1); + tess.addVertexWithUV(1, 0.5 + level, 1, 1, 1); + tess.addVertexWithUV(1, 0.5 + level, -1, 1, 0); + tess.draw(); + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java index 4bc23824e..c9c2d8a21 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -9,7 +9,6 @@ import com.hbm.tileentity.machine.IRenderFoundry; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderHelper; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index b1180e9c1..859e29b88 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -21,6 +21,7 @@ import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -28,6 +29,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -78,6 +80,8 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro if(stack.stackSize == 1) { slots[i] = stack.copy(); + item.setDead(); + break; } else { slots[i] = stack.copy(); slots[i].stackSize = 1; @@ -90,6 +94,20 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } } } + + int totalCap = recipeCapacity + wasteCapacity; + int totalMass = 0; + + for(MaterialStack stack : recipeStack) totalMass += stack.amount; + for(MaterialStack stack : wasteStack) totalMass += stack.amount; + + double level = ((double) totalMass / (double) totalCap) * 0.875D; + + List living = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5 + level, zCoord + 0.5).expand(1, 0, 1)); + for(EntityLivingBase entity : living) { + entity.attackEntityFrom(DamageSource.lava, 5F); + entity.setFire(5); + } /* smelt items from buffer */ if(!trySmelt()) { @@ -243,12 +261,13 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro stack.amount -= getQuantaFromType(recipe.input, stack.material); } + outer: for(MaterialStack out : recipe.output) { for(MaterialStack stack : this.recipeStack) { if(stack.material == out.material) { stack.amount += out.amount; - break; + continue outer; } } @@ -351,7 +370,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return stack.amount; } if(mat == null) { - return sum += stack.amount; + sum += stack.amount; } } return sum; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java index f786db815..9d522c1c0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java @@ -91,7 +91,7 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci * - amount being at max
*/ public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - if(this.type != null && this.type != stack.material) return false; //reject if there's already a different material + if(this.type != null && this.type != stack.material && this.amount > 0) return false; //reject if there's already a different material if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full return true; } @@ -103,10 +103,7 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci * - returns the amount that cannot be added */ public MaterialStack standardAdd(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - - if(this.type == null) { - this.type = stack.material; - } + this.type = stack.material; if(stack.amount + this.amount <= this.getCapacity()) { this.amount += stack.amount; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java index cef301c90..bf2e63a95 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -6,7 +6,6 @@ import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemMold.Mold; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -52,14 +51,19 @@ public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase slots[1] = out.copy(); } - cooloff = 100; + cooloff = 200; } } else { - cooloff = 100; + cooloff = 200; } } } + + @Override + protected boolean shouldClientReRender() { + return false; + } /** Checks slot 0 to see what mold type is installed. Returns null if no mold is found or an incorrect size was used. */ public Mold getInstalledMold() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java index 80e9a26b7..d156bfc0a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java @@ -30,7 +30,7 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { if(nextUpdate <= 0 && this.amount > 0 && this.type != null) { - nextUpdate = worldObj.rand.nextInt(6) + 10; + nextUpdate = worldObj.rand.nextInt(6) + 5; List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; Collections.shuffle(ints); @@ -62,7 +62,7 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { if(b instanceof TileEntityFoundryChannel) { TileEntityFoundryChannel acc = (TileEntityFoundryChannel) b; - if(acc.type == null || acc.type == this.type) { + if(acc.type == null || acc.type == this.type || acc.amount == 0) { acc.type = this.type; if(worldObj.rand.nextInt(5) == 0) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java index 6c5d54052..c12d80656 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; import com.hbm.util.CrucibleUtil; import api.hbm.block.ICrucibleAcceptor; @@ -10,6 +11,15 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityFoundryOutlet extends TileEntityFoundryBase { + + public NTMMaterial filter = null; + /** inverts redstone behavior, i.e. when TRUE, the outlet will be blocked by default and only open with redstone */ + public boolean invertRedstone = false; + + /** if TRUE, prevents all fluids from flowing through the outlet and renders a small barrier */ + public boolean isClosed() { + return invertRedstone ^ this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + } @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } @@ -17,6 +27,9 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase { @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + if(filter != null && filter != stack.material) return false; + if(isClosed()) return false; + Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 4, z + 0.5); diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_filter.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..f04272852d01e63cbfc53ecf3da767bcd6b06d9d GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfv3U6pdk@W>r~f}-WzJOzJ}F%M Q31}IEr>mdKI;Vst0GFvcVE_OC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_lock.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..7b31541d5a548e1b4ca2a873bf9889d47ece33ea GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfWvY3H^?=T26 z9?xHq0u(Itba4#P2#)PztWoCxnHb3;(x*VFUKXz+0P&L zZ+fG<K~y-6?NTug zgD?y{DyFRP0A9p<$P4%v13&QWIg&jgWpx*9rKOcvEA=Ly<+IOmfIqrV$#q@Lte{vtLr6A>dKbMEmiF*6%88xa{Zn}`H|Z_>BoWm%xAsBX0)r4&WOFho4hGXR*c z)1!f^;y4bZl%mNrO;A;oQXnE1*N>KzQUD;twN`A~1|k9gjN^D|5DrdDc3OhUjTZj+X00000NkvXXu0mjf$LeF{ From db5757a28333342f1435f4278808e98697d1e957 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 30 Sep 2022 14:34:04 +0200 Subject: [PATCH 087/111] i forgot to push again - intermission --- .../projectile/EntityArtilleryRocket.java | 50 +++++ src/main/java/com/hbm/items/ISyncButtons.java | 11 ++ .../com/hbm/items/weapon/ItemPlasmaSpear.java | 173 ++++++++++++++++++ src/main/java/com/hbm/main/ClientProxy.java | 5 +- .../com/hbm/main/ModEventHandlerClient.java | 10 + .../java/com/hbm/packet/PacketDispatcher.java | 2 + .../com/hbm/packet/SyncButtonsPacket.java | 56 ++++++ 7 files changed, 306 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java create mode 100644 src/main/java/com/hbm/items/ISyncButtons.java create mode 100644 src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java create mode 100644 src/main/java/com/hbm/packet/SyncButtonsPacket.java diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java new file mode 100644 index 000000000..afcb64f90 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java @@ -0,0 +1,50 @@ +package com.hbm.entity.projectile; + +import com.hbm.entity.logic.IChunkLoader; +import com.hbm.main.MainRegistry; + +import api.hbm.entity.IRadarDetectable; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.common.ForgeChunkManager.Type; + +public class EntityArtilleryRocket extends EntityThrowableInterp implements IChunkLoader, IRadarDetectable { + + private Ticket loaderTicket; + + public EntityArtilleryRocket(World world) { + super(world); + this.ignoreFrustumCheck = true; + } + + @Override + protected void entityInit() { + init(ForgeChunkManager.requestTicket(MainRegistry.instance, worldObj, Type.ENTITY)); + this.dataWatcher.addObject(10, new Integer(0)); + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + + } + + @Override + public RadarTargetType getTargetType() { + return RadarTargetType.ARTILLERY; + } + + @Override + public void init(Ticket ticket) { + if(!worldObj.isRemote && ticket != null) { + if(loaderTicket == null) { + loaderTicket = ticket; + loaderTicket.bindEntity(this); + loaderTicket.getModData(); + } + ForgeChunkManager.forceChunk(loaderTicket, new ChunkCoordIntPair(chunkCoordX, chunkCoordZ)); + } + } +} diff --git a/src/main/java/com/hbm/items/ISyncButtons.java b/src/main/java/com/hbm/items/ISyncButtons.java new file mode 100644 index 000000000..e06e3e78c --- /dev/null +++ b/src/main/java/com/hbm/items/ISyncButtons.java @@ -0,0 +1,11 @@ +package com.hbm.items; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.event.MouseEvent; + +public interface ISyncButtons { + + public boolean canReceiveMouse(EntityPlayer player, ItemStack stack, MouseEvent event, int button, boolean buttonstate); + public void receiveMouse(EntityPlayer player, ItemStack stack, int button, boolean buttonstate); +} diff --git a/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java b/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java new file mode 100644 index 000000000..a9847e544 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java @@ -0,0 +1,173 @@ +package com.hbm.items.weapon; + +import java.util.List; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ISyncButtons; +import com.hbm.lib.ModDamageSource; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import api.hbm.fluid.IFillableItem; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EntityDamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.client.event.MouseEvent; + +public class ItemPlasmaSpear extends Item implements IFillableItem, ISyncButtons { + + public static final int maxFuel = 3_000; + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return getFill(stack) < maxFuel; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return 1 - (double) getFill(stack) / (double) maxFuel; + } + + public int getFill(ItemStack stack) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + setFill(stack, maxFuel); + return maxFuel; + } + + return stack.stackTagCompound.getInteger("fuel"); + } + + public void setFill(ItemStack stack, int fill) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setInteger("fuel", fill); + } + + public static ItemStack getEmptyTool(Item item) { + ItemPlasmaSpear tool = (ItemPlasmaSpear) item; + ItemStack stack = new ItemStack(item); + tool.setFill(stack, 0); + return stack; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + + if(world.isRemote) return stack; + + if(!stack.hasTagCompound()) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setBoolean("melee", !stack.stackTagCompound.getBoolean("melee")); + world.playSoundAtEntity(player, "random.orb", 0.25F, 1.25F); + + return stack; + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { + + if(stack.hasTagCompound() && !stack.stackTagCompound.getBoolean("melee")) { + return true; //cancel hitting, it's ranged + } + + return false; + } + + @Override + public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { + + if(!(entityLiving instanceof EntityPlayerMP)) + return false; + + if(getFill(stack) <= 0) + return false; + + if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("melee")) { + return true; //cancel hitting, it's ranged + } + + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", "anim"); + nbt.setString("mode", "lSwing"); + PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); + + return false; + } + + @Override + public boolean canReceiveMouse(EntityPlayer player, ItemStack stack, MouseEvent event, int button, boolean buttonstate) { + + if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("melee")) { + return false; + } + + if(button == 0) { + event.setCanceled(true); + return true; + } + + return false; + } + + @Override + public void receiveMouse(EntityPlayer player, ItemStack stack, int button, boolean buttonstate) { + Vec3 start = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight() - player.yOffset, player.posZ); + Vec3 look = player.getLookVec(); + Vec3 end = start.addVector(look.xCoord * 100, look.yCoord * 100, look.zCoord * 100); + + List targets = player.worldObj.getEntitiesWithinAABBExcludingEntity(player, AxisAlignedBB.getBoundingBox( + Math.min(start.xCoord, end.xCoord), + Math.min(start.yCoord, end.yCoord), + Math.min(start.zCoord, end.zCoord), + Math.max(start.xCoord, end.xCoord), + Math.max(start.yCoord, end.yCoord), + Math.max(start.zCoord, end.zCoord) + )); + + for(Entity target : targets) { + + AxisAlignedBB aabb = target.boundingBox; + MovingObjectPosition hitMop = aabb.calculateIntercept(start, end); + + if(hitMop != null) { + target.attackEntityFrom(new EntityDamageSource(ModDamageSource.s_laser, player).setDamageBypassesArmor(), 15F); + } + } + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return type == Fluids.SCHRABIDIC; + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + int fill = this.getFill(stack); + int toFill = this.maxFuel - fill; + toFill = Math.min(toFill, amount); + toFill = Math.min(toFill, 10); + + this.setFill(stack, fill + toFill); + + return amount - toFill; + } + + @Override public boolean providesFluid(FluidType type, ItemStack stack) { return false; } + @Override public int tryEmpty(FluidType type, int amount, ItemStack stack) { return 0; } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index dd6041aeb..5f0ba1133 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -1626,6 +1626,7 @@ public class ClientProxy extends ServerProxy { if("anim".equals(type)) { + /* crucible deploy */ if("crucible".equals(data.getString("mode")) && player.getHeldItem() != null) { BusAnimation animation = new BusAnimation() @@ -1637,6 +1638,7 @@ public class ClientProxy extends ServerProxy { HbmAnimations.hotbar[player.inventory.currentItem] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); } + /* crucible swing */ if("cSwing".equals(data.getString("mode"))) { if(HbmAnimations.getRelevantTransformation("SWING_ROT")[0] == 0) { @@ -1659,7 +1661,8 @@ public class ClientProxy extends ServerProxy { } } - if("sSwing".equals(data.getString("mode"))) { + /* chainsaw swing */ + if("sSwing".equals(data.getString("mode")) || "lSwing".equals(data.getString("mode"))) { //temp for lance int forward = 150; int sideways = 100; diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index b984d3e1e..eb673d74d 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -27,6 +27,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ISyncButtons; import com.hbm.items.ModItems; import com.hbm.items.armor.ArmorFSB; import com.hbm.items.armor.ArmorFSBPowered; @@ -38,6 +39,7 @@ import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.GunButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.SyncButtonsPacket; import com.hbm.render.anim.HbmAnimations; import com.hbm.render.anim.HbmAnimations.Animation; import com.hbm.render.block.ct.CTStitchReceiver; @@ -436,6 +438,14 @@ public class ModEventHandlerClient { item.startActionClient(player.getHeldItem(), player.worldObj, player, false); } } + + if(held instanceof ISyncButtons) { + ISyncButtons rec = (ISyncButtons) held; + + if(rec.canReceiveMouse(player, player.getHeldItem(), event, event.button, event.buttonstate)) { + PacketDispatcher.wrapper.sendToServer(new SyncButtonsPacket(event.buttonstate, event.button)); + } + } } } diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 26b8fe391..f426fca8b 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -101,6 +101,8 @@ public class PacketDispatcher { wrapper.registerMessage(ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.Handler.class, ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.class, i++, Side.CLIENT); //Packet to send NBT data from clients to the serverside held item wrapper.registerMessage(NBTItemControlPacket.Handler.class, NBTItemControlPacket.class, i++, Side.SERVER); + //sends a button press to the held item, assuming it is an ISyncButtons + wrapper.registerMessage(SyncButtonsPacket.Handler.class, SyncButtonsPacket.class, i++, Side.SERVER); } } diff --git a/src/main/java/com/hbm/packet/SyncButtonsPacket.java b/src/main/java/com/hbm/packet/SyncButtonsPacket.java new file mode 100644 index 000000000..b460a4141 --- /dev/null +++ b/src/main/java/com/hbm/packet/SyncButtonsPacket.java @@ -0,0 +1,56 @@ +package com.hbm.packet; + +import com.hbm.items.ISyncButtons; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; + +public class SyncButtonsPacket implements IMessage { + + boolean state; + int button; + + public SyncButtonsPacket() { } + + public SyncButtonsPacket(boolean s, int b) { + state = s; + button = b; + } + + @Override + public void fromBytes(ByteBuf buf) { + state = buf.readBoolean(); + button = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeBoolean(state); + buf.writeInt(button); + } + + public static class Handler implements IMessageHandler { + + @Override + public IMessage onMessage(SyncButtonsPacket m, MessageContext ctx) { + + if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) + return null; + + EntityPlayer p = ctx.getServerHandler().playerEntity; + + if(p.getHeldItem() != null && p.getHeldItem().getItem() instanceof ISyncButtons) { + + ISyncButtons item = (ISyncButtons)p.getHeldItem().getItem(); + item.receiveMouse(p, p.getHeldItem(), m.button, m.state); + } + + return null; + } + } +} From 99bd1a3723bddc6f0309ceafcd33a2b3554b754b Mon Sep 17 00:00:00 2001 From: Vaern Date: Sat, 1 Oct 2022 08:14:18 -0700 Subject: [PATCH 088/111] Fixed Infinite loop, added safety for foundation placement --- .../worldgen/components/CivilianFeatures.java | 67 ++++--------------- .../world/worldgen/components/Feature.java | 8 ++- .../components/MilitaryBaseFeatures.java | 22 +++--- .../worldgen/components/RuinFeatures.java | 39 ++++------- 4 files changed, 40 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java b/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java index afcf72df3..b18789236 100644 --- a/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java @@ -79,11 +79,7 @@ public class CivilianFeatures { } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 0; i < this.sizeX + 1; i++) { - for(byte j = 0; j < this.sizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } + placeFoundationUnderneath(world, Blocks.sandstone, 0, 0, 0, sizeX, sizeZ, -1, box); //Walls this.fillWithRandomizedBlocks(world, box, 0, 0, 0, sizeX, 0, 0, false, rand, RandomSandstone); //Back Wall @@ -163,17 +159,8 @@ public class CivilianFeatures { } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 0; i < 7; i++) { - for(byte j = 0; j < this.sizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } - - for(byte i = 9; i < this.sizeX + 1; i++) { - for(byte j = 0; j < this.sizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } + placeFoundationUnderneath(world, Blocks.sandstone, 0, 0, 0, 6, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.sandstone, 0, 9, 0, sizeX, sizeZ, -1, box); this.fillWithAir(world, box, 1, 0, 1, 5, sizeY, sizeZ - 1); @@ -318,21 +305,12 @@ public class CivilianFeatures { } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 0; i < this.sizeX + 1; i++) { - for(byte j = 0; j < this.sizeZ - 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - for(byte i = 3; i < this.sizeX + 1; i++) { - for(byte j = 6; j < this.sizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, sizeZ - 2, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 3, 6, sizeX, sizeZ, -1, box); if(this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box).getMaterial().isReplaceable() || this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box) == Blocks.air) { - this.func_151554_b(world, Blocks.stonebrick, 0, 2, -1, sizeZ - 1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 2, sizeZ - 1, 2, sizeZ - 1, -1, box); this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(0), 2, 0, sizeZ - 1, box); } @@ -455,23 +433,13 @@ public class CivilianFeatures { this.boundingBox.offset(0, -7, 0); //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 0; i < sizeX + 1; i++) { - for(byte j = 0; j < sizeZ - 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box); - } - } - - for(byte i = 0; i < 7; i++) { - for(byte j = 7; j < sizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box); - } - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, sizeZ - 2, 6, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 7, 6, sizeZ, 6, box); if(this.getBlockAtCurrentPosition(world, sizeX - 3, sizeY - 4, 7, box).getMaterial().isReplaceable() || this.getBlockAtCurrentPosition(world, sizeX - 3, sizeY - 4, 7, box) == Blocks.air) { int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 2); - this.func_151554_b(world, Blocks.stonebrick, 0, sizeX - 3, sizeY - 4, 7, box); - this.func_151554_b(world, Blocks.stonebrick, 0, sizeX - 2, sizeY - 4, 7, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, sizeX - 3, 7, sizeX - 2, 7, sizeY - 4, box); this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 4, 7, sizeX - 2, sizeY - 4, 7, Blocks.stone_brick_stairs, stairMeta, Blocks.air, 0, false); } @@ -633,17 +601,8 @@ public class CivilianFeatures { } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 1; i < sizeX - 2; i++) { - for(byte j = 0; j < sizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - for(byte i = 8; i < sizeX + 1; i++) { - for(byte j = 1; j < 7; j++) { - this.func_151554_b(world, Blocks.dirt, 0, i, -1, j, box); - } - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, sizeX - 3, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.dirt, 0, 8, 1, sizeX, 6, -1, box); this.fillWithAir(world, box, 1, 0, 0, sizeX - 3, sizeY - 2, sizeZ); this.fillWithAir(world, box, sizeX - 2, 0, 2, sizeX - 1, 2, 5); @@ -653,9 +612,7 @@ public class CivilianFeatures { int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 1); this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairMeta, 0, 0, 5, box); - for(byte i = 1; 1 < sizeZ; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 1, 0, sizeZ - 1, -1, box); this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, Blocks.stone_slab, 5, Blocks.air, 0, false); } diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index 4a7a82703..ceffa9eca 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -342,10 +342,16 @@ abstract public class Feature extends StructureComponent { if(box.isVecInside(posX, posY, posZ)) { Block block = world.getBlock(posX, posY, posZ); + int brake = 0; - while ((world.isAirBlock(posX, posY, posZ) || !block.getMaterial().isSolid() || (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && posY > 1) { + while ((world.isAirBlock(posX, posY, posZ) || + !block.getMaterial().isSolid() || + (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && + posY > 1 && brake <= 15) { world.setBlock(posX, posY, posZ, placeBlock, meta, 2); block = world.getBlock(posX, --posY, posZ); + + brake++; } } } diff --git a/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java b/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java index d6dcbfe9a..27571adf5 100644 --- a/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java @@ -67,17 +67,16 @@ public class MilitaryBaseFeatures { for(int i = 1; i < sizeX; i++) { for(int j = 1; j < sizeZ; j++) { - func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); clearCurrentPositionBlocksUpwards(world, i, 1, j, box); } } - for(int i = 0; i <= sizeX; i++) { - for(int j = 0; j <= sizeZ; j++) { - if(i == 0 || i == sizeX || j == 0 || j == sizeX) - func_151554_b(world, Blocks.stonebrick, 0, i, 0, j, box); - } - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 1, sizeX - 1, sizeZ - 1, -1, box); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, 0, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 1, 0, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, sizeX, 1, sizeX, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, sizeZ, sizeX - 1, sizeZ, -1, box); //Helipad fillWithBlocks(world, box, 1, 0, 1, 11, 0, 1, ModBlocks.concrete, Blocks.air, false); //this entire time, the second block was actually for anything not at min/max x's, y's, and z's. useful! @@ -121,13 +120,8 @@ public class MilitaryBaseFeatures { this.boundingBox.offset(0, -1, 0); - for(int i = 1; i <= sizeX; i++) { - for(int j = 1; j <= sizeZ; j++) { - func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - func_151554_b(world, Blocks.stonebrick, 0, 0, 0, 2, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 1, sizeX, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 2, 0, 2, 0, box); //Floor & Foundation fillWithRandomizedBlocks(world, box, 2, 0, 1, 5, 0, 4, false, rand, RandomLabTiles); diff --git a/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java b/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java index 7dd67bd39..47953d9da 100644 --- a/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java @@ -31,11 +31,7 @@ public class RuinFeatures { } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 0; i < sizeX + 1; i++) { - for(byte j = 0; j < sizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, sizeZ, -1, box); int pillarMetaWE = this.getPillarMeta(4); int pillarMetaNS = this.getPillarMeta(8); @@ -107,11 +103,7 @@ public class RuinFeatures { } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 0; i < sizeX + 1; i++) { - for(byte j = 0; j < sizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, sizeZ, -1, box); int pillarMetaWE = this.getPillarMeta(4); int pillarMetaNS = this.getPillarMeta(8); @@ -174,15 +166,11 @@ public class RuinFeatures { } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 0; i < sizeZ + 1; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - this.func_151554_b(world, Blocks.stonebrick, 0, sizeX, -1, i, box); - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 0, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, sizeX, 0, sizeX, sizeZ, -1, box); - for(byte i = 1; i < sizeX; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 0, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 4, box); - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, sizeX, 0, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 4, sizeX, 4, -1, box); this.fillWithBlocks(world, box, 0, 0, 0, 0, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); @@ -235,15 +223,14 @@ public class RuinFeatures { } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - for(byte i = 0; i < sizeZ + 1; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i >= 5 ? sizeX : 5, -1, i, box); //elegant solution - } - for(byte i = 1; i < sizeX; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, sizeZ, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, i > 4 ? 5 : 0, box); //ternary operators my beloved - } + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 0, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, sizeX, 5, sizeX, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 0, 5, 4, -1, box); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, sizeZ, sizeX - 1, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, 4, 0, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 5, sizeX - 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, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); From 99f3909bedbeda744984c8af6ba50bcb251c4221 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 1 Oct 2022 23:45:58 +0200 Subject: [PATCH 089/111] crucible templates in folder, storage tanks, recipes --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../com/hbm/blocks/generic/BlockSmolder.java | 30 +-- .../com/hbm/blocks/machine/FoundryBasin.java | 5 + .../blocks/machine/FoundryCastingBase.java | 13 ++ .../com/hbm/blocks/machine/FoundryMold.java | 6 + .../com/hbm/blocks/machine/FoundryOutlet.java | 54 ++++- .../com/hbm/blocks/machine/FoundryTank.java | 122 +++++++++++ .../hbm/blocks/machine/MachineCrucible.java | 45 +++- .../com/hbm/inventory/SlotNonRetarded.java | 24 +++ .../container/ContainerCrucible.java | 5 +- .../com/hbm/inventory/gui/GUICrucible.java | 4 +- .../gui/GUIScreenTemplateFolder.java | 18 +- .../inventory/recipes/CrucibleRecipes.java | 25 ++- .../inventory/recipes/anvil/AnvilRecipes.java | 7 + .../items/machine/ItemCrucibleTemplate.java | 19 +- .../com/hbm/items/machine/ItemScraps.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 9 +- .../java/com/hbm/main/CraftingManager.java | 1 + .../com/hbm/main/ModEventHandlerClient.java | 6 +- .../java/com/hbm/packet/ItemFolderPacket.java | 5 + ...nderBasin.java => RenderFoundryBasin.java} | 2 +- ...Channel.java => RenderFoundryChannel.java} | 2 +- ...RenderMold.java => RenderFoundryMold.java} | 2 +- ...erOutlet.java => RenderFoundryOutlet.java} | 56 ++++- .../hbm/render/block/RenderFoundryTank.java | 201 ++++++++++++++++++ .../hbm/render/tileentity/RenderCrucible.java | 2 +- .../hbm/render/tileentity/RenderFoundry.java | 2 +- .../render/util/RenderAccessoryUtility.java | 2 +- .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityCrucible.java | 22 +- .../machine/TileEntityFoundryChannel.java | 50 +++-- .../machine/TileEntityFoundryOutlet.java | 30 +++ .../machine/TileEntityFoundryTank.java | 117 ++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 7 + src/main/resources/assets/hbm/lang/en_US.lang | 6 + .../textures/blocks/foundry_tank_bottom.png | Bin 0 -> 515 bytes .../textures/blocks/foundry_tank_inner.png | Bin 0 -> 578 bytes .../hbm/textures/blocks/foundry_tank_side.png | Bin 0 -> 600 bytes .../hbm/textures/blocks/foundry_tank_top.png | Bin 0 -> 466 bytes .../textures/blocks/foundry_tank_upper.png | Bin 0 -> 657 bytes .../textures/models/capes/CapeHoboy_mk3.png | Bin 0 -> 12042 bytes 41 files changed, 816 insertions(+), 89 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/FoundryTank.java create mode 100644 src/main/java/com/hbm/inventory/SlotNonRetarded.java rename src/main/java/com/hbm/render/block/{RenderBasin.java => RenderFoundryBasin.java} (97%) rename src/main/java/com/hbm/render/block/{RenderChannel.java => RenderFoundryChannel.java} (99%) rename src/main/java/com/hbm/render/block/{RenderMold.java => RenderFoundryMold.java} (98%) rename src/main/java/com/hbm/render/block/{RenderOutlet.java => RenderFoundryOutlet.java} (73%) create mode 100644 src/main/java/com/hbm/render/block/RenderFoundryTank.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png create mode 100644 src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index a56afe4b3..57b2c7c12 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -643,6 +643,7 @@ public class ModBlocks { public static Block foundry_mold; public static Block foundry_basin; public static Block foundry_channel; + public static Block foundry_tank; public static Block foundry_outlet; public static Block machine_difurnace_off; @@ -1830,6 +1831,7 @@ public class ModBlocks { foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_channel = new FoundryChannel().setBlockName("foundry_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_tank = new FoundryTank().setBlockName("foundry_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_outlet = new FoundryOutlet().setBlockName("foundry_outlet").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -3027,6 +3029,7 @@ public class ModBlocks { register(foundry_mold); register(foundry_basin); register(foundry_channel); + register(foundry_tank); register(foundry_outlet); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockSmolder.java b/src/main/java/com/hbm/blocks/generic/BlockSmolder.java index ea82080a8..2717c8844 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockSmolder.java +++ b/src/main/java/com/hbm/blocks/generic/BlockSmolder.java @@ -17,26 +17,26 @@ public class BlockSmolder extends Block { public BlockSmolder(Material mat) { super(mat); } - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random rand) { - super.randomDisplayTick(world, x, y, z, rand); - - if(world.getBlock(x, y + 1, z).getMaterial() == Material.air) { - world.spawnParticle("lava", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); - world.spawnParticle("flame", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); - } - } + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + super.randomDisplayTick(world, x, y, z, rand); + + if(world.getBlock(x, y + 1, z).getMaterial() == Material.air) { + + world.spawnParticle("lava", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + world.spawnParticle("flame", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + } + } @Override public Item getItemDropped(int i, Random rand, int j) { return ModItems.powder_fire; - } + } - @Override + @Override public void onEntityWalking(World world, int x, int y, int z, Entity entity) { - entity.setFire(3); - } + entity.setFire(3); + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java index f4df32c6d..59014be8e 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java @@ -83,4 +83,9 @@ public class FoundryBasin extends FoundryCastingBase { public int getRenderType() { return renderID; } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side != ForgeDirection.UP; + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index 149ba3f33..ffd799fed 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -2,6 +2,7 @@ package com.hbm.blocks.machine; import java.util.ArrayList; import java.util.List; +import java.util.Random; import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.material.Mats.MaterialStack; @@ -127,6 +128,18 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc return false; } + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + super.randomDisplayTick(world, x, y, z, rand); + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + + if(cast.amount > 0 && cast.amount >= cast.getCapacity()) { + world.spawnParticle("smoke", x + 0.25 + rand.nextDouble() * 0.5, y + this.maxY, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + } + } + @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { diff --git a/src/main/java/com/hbm/blocks/machine/FoundryMold.java b/src/main/java/com/hbm/blocks/machine/FoundryMold.java index 5bb037991..1c3182d49 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryMold.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryMold.java @@ -15,6 +15,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class FoundryMold extends FoundryCastingBase { @@ -77,4 +78,9 @@ public class FoundryMold extends FoundryCastingBase { public int getRenderType() { return renderID; } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side == ForgeDirection.DOWN; + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index bb4b8a805..5905ed152 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -1,10 +1,16 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; import java.util.List; +import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; import com.hbm.tileentity.machine.TileEntityFoundryOutlet; +import com.hbm.util.I18nUtil; import api.hbm.block.ICrucibleAcceptor; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -15,22 +21,27 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { +public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor, ILookOverlay { @SideOnly(Side.CLIENT) public IIcon iconTop; @SideOnly(Side.CLIENT) public IIcon iconSide; @SideOnly(Side.CLIENT) public IIcon iconBottom; @SideOnly(Side.CLIENT) public IIcon iconInner; @SideOnly(Side.CLIENT) public IIcon iconFront; + @SideOnly(Side.CLIENT) public IIcon iconLock; + @SideOnly(Side.CLIENT) public IIcon iconFilter; public FoundryOutlet() { super(Material.rock); @@ -45,6 +56,8 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_bottom"); this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_inner"); this.iconFront = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_front"); + this.iconLock = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_lock"); + this.iconFilter = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_filter"); } @SideOnly(Side.CLIENT) @@ -99,6 +112,30 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { if(meta == 2) this.setBlockBounds(0.3125F, 0F, 0.625F, 0.6875F, 0.5F, 1F); if(meta == 3) this.setBlockBounds(0.3125F, 0F, 0F, 0.6875F, 0.5F, 0.375F); } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } + + if(!player.isSneaking()) { + TileEntityFoundryOutlet tile = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.scraps) { + MaterialStack mat = ItemScraps.getMats(player.getHeldItem()); + if(mat != null) { + tile.filter = mat.material; + } + } else { + tile.invertRedstone = !tile.invertRedstone; + } + tile.markDirty(); + world.markBlockForUpdate(x, y, z); + } + + return true; + } @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } @@ -129,4 +166,19 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { public boolean renderAsNormalBlock() { return false; } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntityFoundryOutlet outlet = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); + List text = new ArrayList(); + + if(outlet.filter != null) { + text.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("foundry.filter", outlet.filter.names[0])); + } + if(outlet.invertRedstone) { + text.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("foundry.inverted")); + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryTank.java b/src/main/java/com/hbm/blocks/machine/FoundryTank.java new file mode 100644 index 000000000..0c8d0a48c --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryTank.java @@ -0,0 +1,122 @@ +package com.hbm.blocks.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.machine.ItemScraps; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryTank; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryTank extends BlockContainer implements ICrucibleAcceptor { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconSideUpper; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + @SideOnly(Side.CLIENT) public IIcon iconLava; + + public FoundryTank() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_side"); + this.iconSideUpper = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_upper"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_inner"); + this.iconLava = iconRegister.registerIcon(RefStrings.MODID + ":lava_gray"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryTank(); + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } + + TileEntityFoundryTank cast = (TileEntityFoundryTank) world.getTileEntity(x, y, z); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + } + return true; + } + + return false; + } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side != ForgeDirection.UP; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java index f55de661f..d3c9f996f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -1,10 +1,20 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.machine.ItemScraps; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityCrucible; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @@ -32,7 +42,40 @@ public class MachineCrucible extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - return this.standardOpenBehavior(world, x, y, z, player, 0); + + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return false; + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + TileEntityCrucible crucible = (TileEntityCrucible) world.getTileEntity(pos[0], pos[1], pos[2]); + List stacks = new ArrayList(); + stacks.addAll(crucible.recipeStack); + stacks.addAll(crucible.wasteStack); + + for(MaterialStack stack : stacks) { + ItemStack scrap = ItemScraps.create(new MaterialStack(stack.material, stack.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + hitX, y + hitY, z + hitZ, scrap); + world.spawnEntityInWorld(item); + } + } + + player.inventoryContainer.detectAndSendChanges(); + crucible.recipeStack.clear(); + crucible.wasteStack.clear(); + crucible.markDirty(); + + } else { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); + } + return true; + } else { + return true; + } } @Override diff --git a/src/main/java/com/hbm/inventory/SlotNonRetarded.java b/src/main/java/com/hbm/inventory/SlotNonRetarded.java new file mode 100644 index 000000000..c2d81ed61 --- /dev/null +++ b/src/main/java/com/hbm/inventory/SlotNonRetarded.java @@ -0,0 +1,24 @@ +package com.hbm.inventory; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +/** + * Because vanilla slots have severe mental disabilities that prevent them from working as expected. + * @author hbm + */ +public class SlotNonRetarded extends Slot { + + public SlotNonRetarded(IInventory inventory, int id, int x, int y) { + super(inventory, id, x, y); + } + + /** + * Dear mojang: Why wasn't that the standard to begin with? What do IInventories have isItemValidForSlot when by default nothing fucking uses it? + */ + @Override + public boolean isItemValid(ItemStack stack) { + return inventory.isItemValidForSlot(this.slotNumber, stack); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java index 7d7074a47..5061bb4a6 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java @@ -1,5 +1,6 @@ package com.hbm.inventory.container; +import com.hbm.inventory.SlotNonRetarded; import com.hbm.tileentity.machine.TileEntityCrucible; import com.hbm.util.InventoryUtil; @@ -17,12 +18,12 @@ public class ContainerCrucible extends Container { this.crucible = crucible; //template - this.addSlotToContainer(new Slot(crucible, 0, 107, 81)); + this.addSlotToContainer(new SlotNonRetarded(crucible, 0, 107, 81)); //input for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { - this.addSlotToContainer(new Slot(crucible, j + i * 3 + 1, 107 + j * 18, 18 + i * 18)); + this.addSlotToContainer(new SlotNonRetarded(crucible, j + i * 3 + 1, 107 + j * 18, 18 + i * 18)); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICrucible.java b/src/main/java/com/hbm/inventory/gui/GUICrucible.java index 65b7dfdb8..aa1893b21 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrucible.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrucible.java @@ -63,8 +63,8 @@ public class GUICrucible extends GuiInfoContainer { int hGauge = crucible.heat * 33 / crucible.maxHeat; if(hGauge > 0) drawTexturedModalRect(guiLeft + 126, guiTop + 91, 176, 5, hGauge, 5); - if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, crucible.recipeCapacity, 62, 97); - if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, crucible.wasteCapacity, 17, 97); + if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, crucible.recipeZCapacity, 62, 97); + if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, crucible.wasteZCapacity, 17, 97); } protected void drawStackInfo(List stack, int mouseX, int mouseY, int x, int y) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index d0041b0e7..91f9f42e1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -13,6 +13,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.AssemblerRecipes; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; +import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCassette; @@ -88,6 +89,11 @@ public class GUIScreenTemplateFolder extends GuiScreen { ChemRecipe chem = ChemplantRecipes.recipes.get(i); allStacks.add(new ItemStack(ModItems.chemistry_template, 1, chem.getId())); } + + // Crucible Templates + for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) { + allStacks.add(new ItemStack(ModItems.crucible_template, 1, CrucibleRecipes.recipes.get(i).getId())); + } } else { for(int i = 0; i < AssemblerRecipes.recipeList.size(); i++) { @@ -290,19 +296,21 @@ public class GUIScreenTemplateFolder extends GuiScreen { public void drawIcon(boolean b) { try { - RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)240 / 1.0F, (float)240 / 1.0F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) 240 / 1.0F, (float) 240 / 1.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); if(stack != null) { if(stack.getItem() == ModItems.assembly_template) itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), AssemblerRecipes.getOutputFromTempate(stack), xPos + 1, yPos + 1); else if(stack.getItem() == ModItems.chemistry_template) itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), new ItemStack(ModItems.chemistry_icon, 1, stack.getItemDamage()), xPos + 1, yPos + 1); + else if(stack.getItem() == ModItems.crucible_template) + itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), CrucibleRecipes.indexMapping.get(stack.getItemDamage()).icon, xPos + 1, yPos + 1); else itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), stack, xPos + 1, yPos + 1); } - GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_LIGHTING); } catch(Exception x) { } } diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java index 072faee53..9234b5487 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -10,6 +10,9 @@ import com.google.gson.stream.JsonWriter; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.ModItems; + +import net.minecraft.item.ItemStack; public class CrucibleRecipes extends SerializableRecipe { @@ -24,17 +27,17 @@ public class CrucibleRecipes extends SerializableRecipe { @Override public void registerDefaults() { - recipes.add(new CrucibleRecipe(0, "crucible.steel", 1) - .inputs(new MaterialStack(Mats.MAT_IRON, 10), new MaterialStack(Mats.MAT_COAL, 15)) - .outputs(new MaterialStack(Mats.MAT_STEEL, 10))); + recipes.add(new CrucibleRecipe(0, "crucible.steel", 1, new ItemStack(ModItems.ingot_steel)) + .inputs(new MaterialStack(Mats.MAT_IRON, 8), new MaterialStack(Mats.MAT_COAL, 8)) + .outputs(new MaterialStack(Mats.MAT_STEEL, 8))); - recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 1) - .inputs(new MaterialStack(Mats.MAT_STEEL, 10), new MaterialStack(Mats.MAT_REDSTONE, 10)) - .outputs(new MaterialStack(Mats.MAT_MINGRADE, 20))); + recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 1, new ItemStack(ModItems.ingot_red_copper)) + .inputs(new MaterialStack(Mats.MAT_COPPER, 8), new MaterialStack(Mats.MAT_REDSTONE, 8)) + .outputs(new MaterialStack(Mats.MAT_MINGRADE, 16))); - recipes.add(new CrucibleRecipe(2, "crucible.aa", 1) - .inputs(new MaterialStack(Mats.MAT_STEEL, 10), new MaterialStack(Mats.MAT_MINGRADE, 10)) - .outputs(new MaterialStack(Mats.MAT_ALLOY, 20))); + recipes.add(new CrucibleRecipe(2, "crucible.aa", 1, new ItemStack(ModItems.ingot_advanced_alloy)) + .inputs(new MaterialStack(Mats.MAT_STEEL, 8), new MaterialStack(Mats.MAT_MINGRADE, 8)) + .outputs(new MaterialStack(Mats.MAT_ALLOY, 16))); } public static class CrucibleRecipe { @@ -43,11 +46,13 @@ public class CrucibleRecipes extends SerializableRecipe { private int id; private String name; public int frequency = 1; + public ItemStack icon; - public CrucibleRecipe(int id, String name, int frequency) { + public CrucibleRecipe(int id, String name, int frequency, ItemStack icon) { this.id = id; this.name = name; this.frequency = frequency; + this.icon = icon; if(!indexMapping.containsKey(id)) { indexMapping.put(id, this); diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 4c5ad09d4..8d1dfcfec 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -273,6 +273,13 @@ public class AnvilRecipes { new ComparableStack(ModItems.sawblade) }, new AnvilOutput(new ItemStack(ModBlocks.machine_sawmill))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new ComparableStack(ModItems.ingot_firebrick, 20), + new OreDictStack(CU.ingot(), 8), + new OreDictStack(STEEL.plate(), 8) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_crucible))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 6), diff --git a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java index b6171bd28..4d062b85b 100644 --- a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java +++ b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java @@ -6,6 +6,7 @@ import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -13,6 +14,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; public class ItemCrucibleTemplate extends Item { @@ -37,17 +39,16 @@ public class ItemCrucibleTemplate extends Item { if(recipe == null) { return; } - - list.add("Input:"); + + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_out_p")); + for(MaterialStack out : recipe.output) { + list.add(out.material.names[0] + ": " + Mats.formatAmount(out.amount)); + } + + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_in_p")); for(MaterialStack in : recipe.input) { - list.add("- " + in.material.names[0] + ": " + Mats.formatAmount(in.amount)); - } - - list.add("Output:"); - - for(MaterialStack out : recipe.output) { - list.add("- " + out.material.names[0] + ": " + Mats.formatAmount(out.amount)); + list.add(in.material.names[0] + ": " + Mats.formatAmount(in.amount)); } } } diff --git a/src/main/java/com/hbm/items/machine/ItemScraps.java b/src/main/java/com/hbm/items/machine/ItemScraps.java index ca3606c70..3e2a0f45e 100644 --- a/src/main/java/com/hbm/items/machine/ItemScraps.java +++ b/src/main/java/com/hbm/items/machine/ItemScraps.java @@ -35,7 +35,7 @@ public class ItemScraps extends Item { MaterialStack contents = getMats(stack); if(contents != null) { - list.add(contents.material.names[0] + " " + Mats.formatAmount(contents.amount)); + list.add(contents.material.names[0] + ", " + Mats.formatAmount(contents.amount)); } } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 5f0ba1133..54a1d2560 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -744,10 +744,11 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderBoxDuct()); RenderingRegistry.registerBlockHandler(new RenderBlockDecoModel(ModBlocks.deco_computer.getRenderType(), ResourceManager.deco_computer)); - RenderingRegistry.registerBlockHandler(new RenderBasin()); - RenderingRegistry.registerBlockHandler(new RenderMold()); - RenderingRegistry.registerBlockHandler(new RenderChannel()); - RenderingRegistry.registerBlockHandler(new RenderOutlet()); + RenderingRegistry.registerBlockHandler(new RenderFoundryBasin()); + RenderingRegistry.registerBlockHandler(new RenderFoundryMold()); + RenderingRegistry.registerBlockHandler(new RenderFoundryChannel()); + RenderingRegistry.registerBlockHandler(new RenderFoundryTank()); + RenderingRegistry.registerBlockHandler(new RenderFoundryOutlet()); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite)); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4)); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index e767c9848..28008617b 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -954,6 +954,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.foundry_basin), new Object[] { "B B", "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); addRecipeAuto(new ItemStack(ModBlocks.foundry_mold), new Object[] { "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); addRecipeAuto(new ItemStack(ModBlocks.foundry_channel, 4), new Object[] { "B B", " S ", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addRecipeAuto(new ItemStack(ModBlocks.foundry_tank), new Object[] { "B B", "I I", "BSB", 'B', ModItems.ingot_firebrick, 'I', STEEL.ingot(), 'S', Blocks.stone_slab }); addShapelessAuto(new ItemStack(ModBlocks.foundry_outlet), new Object[] { ModBlocks.foundry_channel, STEEL.plate() }); addRecipeAuto(new ItemStack(ModItems.mold_base), new Object[] { " B ", "BIB", " B ", 'B', ModItems.ingot_firebrick, 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.brick_fire), new Object[] { "BB", "BB", 'B', ModItems.ingot_firebrick }); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 307565a7c..9f713ec5c 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -25,8 +25,6 @@ import com.hbm.interfaces.IItemHUD; import com.hbm.interfaces.Spaghetti; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; -import com.hbm.inventory.material.Mats; -import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.ISyncButtons; import com.hbm.items.ModItems; import com.hbm.items.armor.ArmorFSB; @@ -644,14 +642,14 @@ public class ModEventHandlerClient { list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("cannery.f1")); } - ItemStack copy = stack.copy(); + /*ItemStack copy = stack.copy(); List materials = Mats.getMaterialsFromItem(copy); if(!materials.isEmpty()) { for(MaterialStack mat : materials) { list.add(EnumChatFormatting.DARK_PURPLE + mat.material.names[0] + ": " + Mats.formatAmount(mat.amount * stack.stackSize)); } - } + }*/ } private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); diff --git a/src/main/java/com/hbm/packet/ItemFolderPacket.java b/src/main/java/com/hbm/packet/ItemFolderPacket.java index 14b9671b2..d585db46b 100644 --- a/src/main/java/com/hbm/packet/ItemFolderPacket.java +++ b/src/main/java/com/hbm/packet/ItemFolderPacket.java @@ -6,6 +6,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCassette; import com.hbm.items.machine.ItemChemistryTemplate; +import com.hbm.items.machine.ItemCrucibleTemplate; import com.hbm.items.machine.ItemFluidIdentifier; import com.hbm.util.InventoryUtil; @@ -85,6 +86,10 @@ public class ItemFolderPacket implements IMessage { tryMakeItem(p, stack, Items.paper, "dye"); return null; } + if(stack.getItem() instanceof ItemCrucibleTemplate) { + tryMakeItem(p, stack, Items.paper, "dye"); + return null; + } if(stack.getItem() instanceof ItemCassette) { tryMakeItem(p, stack, ModItems.plate_polymer, "plateSteel"); return null; diff --git a/src/main/java/com/hbm/render/block/RenderBasin.java b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java similarity index 97% rename from src/main/java/com/hbm/render/block/RenderBasin.java rename to src/main/java/com/hbm/render/block/RenderFoundryBasin.java index a13e97ca4..3cc464284 100644 --- a/src/main/java/com/hbm/render/block/RenderBasin.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; -public class RenderBasin implements ISimpleBlockRenderingHandler { +public class RenderFoundryBasin implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { diff --git a/src/main/java/com/hbm/render/block/RenderChannel.java b/src/main/java/com/hbm/render/block/RenderFoundryChannel.java similarity index 99% rename from src/main/java/com/hbm/render/block/RenderChannel.java rename to src/main/java/com/hbm/render/block/RenderFoundryChannel.java index 8d5cc6423..666373832 100644 --- a/src/main/java/com/hbm/render/block/RenderChannel.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryChannel.java @@ -16,7 +16,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; -public class RenderChannel implements ISimpleBlockRenderingHandler { +public class RenderFoundryChannel implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { diff --git a/src/main/java/com/hbm/render/block/RenderMold.java b/src/main/java/com/hbm/render/block/RenderFoundryMold.java similarity index 98% rename from src/main/java/com/hbm/render/block/RenderMold.java rename to src/main/java/com/hbm/render/block/RenderFoundryMold.java index d2dbacf7a..fb29141a4 100644 --- a/src/main/java/com/hbm/render/block/RenderMold.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryMold.java @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; -public class RenderMold implements ISimpleBlockRenderingHandler { +public class RenderFoundryMold implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { diff --git a/src/main/java/com/hbm/render/block/RenderOutlet.java b/src/main/java/com/hbm/render/block/RenderFoundryOutlet.java similarity index 73% rename from src/main/java/com/hbm/render/block/RenderOutlet.java rename to src/main/java/com/hbm/render/block/RenderFoundryOutlet.java index 1a67ab3f9..743ba6306 100644 --- a/src/main/java/com/hbm/render/block/RenderOutlet.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryOutlet.java @@ -3,6 +3,7 @@ package com.hbm.render.block; import org.lwjgl.opengl.GL11; import com.hbm.blocks.machine.FoundryOutlet; +import com.hbm.tileentity.machine.TileEntityFoundryOutlet; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; @@ -11,7 +12,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; -public class RenderOutlet implements ISimpleBlockRenderingHandler { +public class RenderFoundryOutlet implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { @@ -81,6 +82,7 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { FoundryOutlet outlet = (FoundryOutlet) block; int meta = world.getBlockMetadata(x, y, z); + TileEntityFoundryOutlet tile = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); int brightness = block.getMixedBrightnessForBlock(world, x, y, z); tessellator.setBrightness(brightness); @@ -100,7 +102,20 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { renderer.renderFaceZNeg(block, x, y, z + 0.3125D, outlet.iconInner); renderer.field_152631_f = false; tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFront); renderer.renderFaceXNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.96875D, 0.0625, 0.375D, 0.96875D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.9375D, 0.0625, 0.375D, 0.9375D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconLock); + } } if(meta == 5) { @@ -119,6 +134,19 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { renderer.field_152631_f = false; tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); renderer.renderFaceXPos(block, x, y, z, outlet.iconFront); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.03125D, 0.0625, 0.375D, 0.03125D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.0625D, 0.0625, 0.375D, 0.0625D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconLock); + } } if(meta == 2) { @@ -136,7 +164,20 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { renderer.renderFaceXNeg(block, x, y, z, outlet.iconSide); renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); renderer.renderFaceZNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.375D, 0.0625, 0.96875D, 0.625D, top, 0.96875D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.375D, 0.0625, 0.9375D, 0.625D, top, 0.9375D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconLock); + } } if(meta == 3) { @@ -155,6 +196,19 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.375D, 0.0625D, 0.03125, 0.625D, top, 0.03125D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.375D, 0.0625, 0.0625D, 0.625D, top, 0.0625D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconLock); + } } return true; diff --git a/src/main/java/com/hbm/render/block/RenderFoundryTank.java b/src/main/java/com/hbm/render/block/RenderFoundryTank.java new file mode 100644 index 000000000..9d0863248 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderFoundryTank.java @@ -0,0 +1,201 @@ +package com.hbm.render.block; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.FoundryTank; +import com.hbm.tileentity.machine.TileEntityFoundryTank; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public class RenderFoundryTank implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + FoundryTank basin = (FoundryTank) block; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + int fullBright = 240; + tessellator.setBrightness(brightness); + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryTank tank = (FoundryTank) block; + + TileEntity te = world.getTileEntity(x, y, z); + TileEntityFoundryTank tile = null; + + if(te instanceof TileEntityFoundryTank) { + tile = (TileEntityFoundryTank) te; + } + + boolean conPosX = world.getBlock(x + 1, y, z) == ModBlocks.foundry_tank; + boolean conNegX = world.getBlock(x - 1, y, z) == ModBlocks.foundry_tank; + boolean conPosZ = world.getBlock(x, y, z + 1) == ModBlocks.foundry_tank; + boolean conNegZ = world.getBlock(x, y, z - 1) == ModBlocks.foundry_tank; + boolean conPosY = world.getBlock(x, y + 1, z) == ModBlocks.foundry_tank; + boolean conNegY = world.getBlock(x, y - 1, z) == ModBlocks.foundry_tank; + + boolean doRender = tile != null ? (tile.amount > 0 && tile.type != null) : false; + double max = 0.75D + (conNegY ? 0.125D : 0) + (conPosY ? 0.125D : 0); + double level = doRender ? tile.amount * max / tile.getCapacity() : 0; + Color color = doRender ? new Color(tile.type.moltenColor).brighter() : null; + + if(color != null) { + double brightener = 0.7D; + int nr = (int) (255D - (255D - color.getRed()) * brightener); + int ng = (int) (255D - (255D - color.getGreen()) * brightener); + int nb = (int) (255D - (255D - color.getBlue()) * brightener); + + color = new Color(nr, ng, nb); + } + + renderer.setRenderBounds(0D, 0D, 0D, 1D, 1D, 1D); + + if(!conNegY) { + renderer.setRenderBounds(0D, 0D, 0D, 1D, 0.125D, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, tank.iconBottom); + } + + if(!conPosX) { + renderer.setRenderBounds(0.875D, 0D, 0D, 1D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conNegX) { + renderer.setRenderBounds(0D, 0D, 0D, 0.125D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + renderer.renderFaceXNeg(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conPosZ) { + renderer.setRenderBounds(0D, 0D, 0.875D, 1D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conNegZ) { + renderer.setRenderBounds(0D, 0D, 0D, 1D, 1D, 0.125D); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + renderer.renderFaceZNeg(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(doRender) { + double height = conNegY ? 0D : 0.125D; + renderer.setRenderBounds(0D, height, 0D, 1D, height + level, 1D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); + renderer.renderFaceYPos(block, x, y, z, tank.iconLava); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, tank.iconLava); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, tank.iconLava); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, tank.iconLava); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, tank.iconLava); + tessellator.setBrightness(brightness); + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryTank.renderID; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java index 5d710e10a..abaacf24c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java @@ -42,7 +42,7 @@ public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRe TileEntityCrucible crucible = (TileEntityCrucible) tile; if(!crucible.recipeStack.isEmpty() || !crucible.wasteStack.isEmpty()) { - int totalCap = crucible.recipeCapacity + crucible.wasteCapacity; + int totalCap = crucible.recipeZCapacity + crucible.wasteZCapacity; int totalMass = 0; for(MaterialStack stack : crucible.recipeStack) totalMass += stack.amount; diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java index c9c2d8a21..7f3de13af 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -90,7 +90,6 @@ public class RenderFoundry extends TileEntitySpecialRenderer { if(foundry.shouldRender()) { - GL11.glDepthMask(false); this.bindTexture(lava); int hex = foundry.getMat().moltenColor; @@ -112,6 +111,7 @@ public class RenderFoundry extends TileEntitySpecialRenderer { tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); tess.draw(); + GL11.glDepthMask(false); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); tess.startDrawingQuads(); diff --git a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java index 168311b29..d2ea47b0f 100644 --- a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java +++ b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java @@ -26,7 +26,7 @@ public class RenderAccessoryUtility { private static ResourceLocation nostalgia = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeNostalgia.png"); private static ResourceLocation nostalgia2 = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeNostalgia2.png"); private static ResourceLocation sam = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeSam.png"); - private static ResourceLocation hoboy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeHoboy.png"); + private static ResourceLocation hoboy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeHoboy_mk3.png"); private static ResourceLocation master = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeMaster.png"); private static ResourceLocation mek = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeMek.png"); private static ResourceLocation zippy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeZippySqrl.png"); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 4144bc497..90cf23c00 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -255,6 +255,7 @@ public class TileMappings { put(TileEntityFoundryMold.class, "tileentity_foundry_mold"); put(TileEntityFoundryBasin.class, "tileentity_foundry_basin"); put(TileEntityFoundryChannel.class, "tileentity_foundry_channel"); + put(TileEntityFoundryTank.class, "tileentity_foundry_tank"); put(TileEntityFoundryOutlet.class, "tileentity_foundry_outlet"); put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 859e29b88..76412caa9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -42,8 +42,10 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro public static final int processTime = 20_000; public static final double diffusion = 0.25D; - public final int recipeCapacity = MaterialShapes.BLOCK.q(16); - public final int wasteCapacity = MaterialShapes.BLOCK.q(16); + //because eclipse's auto complete is dumb as a fucking rock, it's now called "ZCapacity" so it's listed AFTER the actual stacks in the auto complete list. + //also martin i know you read these: no i will not switch to intellij after using eclipse for 8 years. + public final int recipeZCapacity = MaterialShapes.BLOCK.q(16); + public final int wasteZCapacity = MaterialShapes.BLOCK.q(16); public List recipeStack = new ArrayList(); public List wasteStack = new ArrayList(); @@ -95,7 +97,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } } - int totalCap = recipeCapacity + wasteCapacity; + int totalCap = recipeZCapacity + wasteZCapacity; int totalMass = 0; for(MaterialStack stack : recipeStack) totalMass += stack.amount; @@ -288,6 +290,16 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return -1; } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + + if(i == 0) { + return stack.getItem() == ModItems.crucible_template; + } + + return isItemSmeltable(stack); + } public boolean isItemSmeltable(ItemStack stack) { @@ -317,7 +329,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } else { //the maximum is the recipe's ratio scaled up to the recipe stack's capacity - int matMaximum = recipeInputRequired * this.recipeCapacity / recipeContent; + int matMaximum = recipeInputRequired * this.recipeZCapacity / recipeContent; int amountStored = getQuantaFromType(recipeStack, mat.material); matchesRecipe = true; @@ -329,7 +341,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } //if the waste amount doesn't exceed the capacity and the recipe matches (or isn't null), return true - return wasteAmount <= this.wasteCapacity && matchesRecipe; + return wasteAmount <= this.wasteZCapacity && matchesRecipe; } public void addToStack(List stack, MaterialStack matStack) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java index d156bfc0a..11525880c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java @@ -30,6 +30,7 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { if(nextUpdate <= 0 && this.amount > 0 && this.type != null) { + boolean hasOp = false; nextUpdate = worldObj.rand.nextInt(6) + 5; List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; @@ -50,36 +51,39 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { } else { this.amount = left.amount; } - return; + hasOp = true; + break; } } } - for(Integer i : ints) { - ForgeDirection dir = ForgeDirection.getOrientation(i); - TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); - - if(b instanceof TileEntityFoundryChannel) { - TileEntityFoundryChannel acc = (TileEntityFoundryChannel) b; + if(!hasOp) { + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); - if(acc.type == null || acc.type == this.type || acc.amount == 0) { - acc.type = this.type; + if(b instanceof TileEntityFoundryChannel) { + TileEntityFoundryChannel acc = (TileEntityFoundryChannel) b; - if(worldObj.rand.nextInt(5) == 0) { - //1:4 chance that the fill states are simply swapped - //this promotes faster spreading and prevents spread limits - int buf = this.amount; - this.amount = acc.amount; - acc.amount = buf; + if(acc.type == null || acc.type == this.type || acc.amount == 0) { + acc.type = this.type; - } else { - //otherwise, equalize the neighbors - int diff = this.amount - acc.amount; - - if(diff > 0) { - diff /= 2; - this.amount -= diff; - acc.amount += diff; + if(worldObj.rand.nextInt(5) == 0) { + //1:4 chance that the fill states are simply swapped + //this promotes faster spreading and prevents spread limits + int buf = this.amount; + this.amount = acc.amount; + acc.amount = buf; + + } else { + //otherwise, equalize the neighbors + int diff = this.amount - acc.amount; + + if(diff > 0) { + diff /= 2; + this.amount -= diff; + acc.amount += diff; + } } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java index c12d80656..484375a16 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -1,10 +1,12 @@ package com.hbm.tileentity.machine; +import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial; import com.hbm.util.CrucibleUtil; import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -15,11 +17,25 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase { public NTMMaterial filter = null; /** inverts redstone behavior, i.e. when TRUE, the outlet will be blocked by default and only open with redstone */ public boolean invertRedstone = false; + public boolean lastClosed = false; /** if TRUE, prevents all fluids from flowing through the outlet and renders a small barrier */ public boolean isClosed() { return invertRedstone ^ this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); } + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote) { + boolean isClosed = isClosed(); + if(this.lastClosed != isClosed) { + this.lastClosed = isClosed; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } @@ -62,4 +78,18 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase { public int getCapacity() { return 0; } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.invertRedstone = nbt.getBoolean("invert"); + this.filter = Mats.matById.get((int) nbt.getShort("filter")); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("invert", this.invertRedstone); + nbt.setShort("filter", this.filter == null ? -1 : (short) this.filter.id); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java new file mode 100644 index 000000000..a9c8c91c5 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java @@ -0,0 +1,117 @@ +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats.MaterialStack; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFoundryTank extends TileEntityFoundryBase { + + public int nextUpdate; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(this.type == null && this.amount != 0) { + this.amount = 0; + } + + nextUpdate--; + + if(nextUpdate <= 0 && this.amount > 0 && this.type != null) { + + boolean hasOp = false; + nextUpdate = worldObj.rand.nextInt(6) + 5; + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(te instanceof TileEntityFoundryTank) { + TileEntityFoundryTank tank = (TileEntityFoundryTank) te; + + if((tank.type == null || tank.type == this.type) && tank.amount < tank.getCapacity()) { + tank.type = this.type; + int toFill = Math.min(this.amount, tank.getCapacity() - tank.amount); + this.amount -= toFill; + tank.amount += toFill; + hasOp = true; + } + } + + List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; + Collections.shuffle(ints); + + if(!hasOp) { + + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + Block b = worldObj.getBlock(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof ICrucibleAcceptor && b != ModBlocks.foundry_channel) { + ICrucibleAcceptor acc = (ICrucibleAcceptor) b; + + if(acc.canAcceptPartialFlow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount))) { + MaterialStack left = acc.flow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount)); + if(left == null) { + this.type = null; + this.amount = 0; + } else { + this.amount = left.amount; + } + hasOp = true; + break; + } + } + } + } + + if(!hasOp) { + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof TileEntityFoundryTank) { + TileEntityFoundryTank acc = (TileEntityFoundryTank) b; + + if(acc.type == null || acc.type == this.type || acc.amount == 0) { + acc.type = this.type; + if(worldObj.rand.nextInt(5) == 0) { + //1:4 chance that the fill states are simply swapped + //this promotes faster spreading and prevents spread limits + int buf = this.amount; + this.amount = acc.amount; + acc.amount = buf; + + } else { + int diff = this.amount - acc.amount; + + if(diff > 0) { + diff /= 2; + this.amount -= diff; + acc.amount += diff; + } + } + } + } + } + } + } + } + + super.updateEntity(); + } + + @Override + public int getCapacity() { + return MaterialShapes.BLOCK.q(1); + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 18a85a063..6c2967c35 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -489,6 +489,8 @@ fluid.schrabidic_fluid=Schrabidische Säure fluid.toxic_fluid=Stereotypischer grüner Schleim fluid.volcanic_lava_fluid=Vulkanische Lava +foundry.filter=Filter: %s +foundry.inverted=Redstone invertiert foundry.noCast=Keine Form eingelegt! geiger.chunkRad=Chunk-Strahlung: @@ -2676,7 +2678,9 @@ item.scrap.name=Schrott item.scrap_nuclear.name=Radioaktiver Schutt item.scrap_oil.name=Öliger Schutt item.scrap_plastic.name=Geschreddertes Plastik +item.scraps.name=Gießerei-Schutt item.screwdriver.name=Schraubenzieher +item.screwdriver.desc=Könnte statt einer Sicherung verwendet werden... item.screwdriver_desh.name=Desh-Schraubenzieher item.scrumpy.name=Flasche Scrumpy item.security_boots.name=Sicherheitsstiefel @@ -3348,7 +3352,9 @@ tile.fluid_duct_solid.name=Geschirmtes universelles Flüssigkeitsrohr tile.foam_layer.name=Schaumdecke tile.foundry_basin.name=Gussbecken tile.foundry_channel.name=Gusskanal +tile.foundry_tank.name=Gießerei-Lagerbecken tile.foundry_mold.name=Seichtes Gussbecken +tile.foundry_outlet.name=Ausguss tile.fraction_spacer.name=Fraktionierungsturm-Teiler tile.frozen_dirt.name=Gefrorene Erde tile.frozen_grass.name=Gefrorenes Gras @@ -3474,6 +3480,7 @@ tile.machine_condenser.name=Dampfkondensierer tile.machine_controller.name=Reaktorfernsteuerung tile.machine_converter_he_rf.name=HE zu RF Konverter tile.machine_converter_rf_he.name=RF zu HE Konverter +tile.machine_crucible.name=Schmelztiegel tile.machine_crystallizer.name=Erzauflöser tile.machine_cyclotron.name=Zyklotron tile.machine_detector.name=Energiedetektor diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 71a959808..07b6a32ec 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -719,6 +719,8 @@ fluid.schrabidic_fluid=Schrabidic Acid fluid.toxic_fluid=Stereotypical Green Ooze fluid.volcanic_lava_fluid=Volcanic Lava +foundry.filter=Filter: %s +foundry.inverted=Redstone inverted foundry.noCast=No mold installed! geiger.chunkRad=Current chunk radiation: @@ -3098,6 +3100,7 @@ item.scrap.name=Scrap item.scrap_nuclear.name=Radioactive Scraps item.scrap_oil.name=Oily Scraps item.scrap_plastic.name=Plastic Scraps +item.scraps.name=Foundry Scraps item.screwdriver.name=Screwdriver item.screwdriver.desc=Could be used instead of a fuse... item.screwdriver_desh.name=Desh Screwdriver @@ -3798,7 +3801,9 @@ tile.fluid_duct_solid.name=Coated Universal Fluid Duct tile.foam_layer.name=Foam layer tile.foundry_basin.name=Foundry Basin tile.foundry_channel.name=Foundry Channel +tile.foundry_tank.name=Foundry Storage Basin tile.foundry_mold.name=Shallow Foundry Basin +tile.foundry_outlet.name=Foundry Outlet tile.fraction_spacer.name=Fractioning Tower Separator tile.frozen_dirt.name=Frozen Dirt tile.frozen_grass.name=Frozen Grass @@ -3924,6 +3929,7 @@ tile.machine_condenser.name=Steam Condenser tile.machine_controller.name=Reactor Remote Control Block tile.machine_converter_he_rf.name=HE to RF Converter tile.machine_converter_rf_he.name=RF to HE Converter +tile.machine_crucible.name=Crucible tile.machine_crystallizer.name=Ore Acidizer tile.machine_cyclotron.name=Cyclotron tile.machine_detector.name=Power Detector diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..53406350fa015e77948f54ae5f07880b0c7b6a65 GIT binary patch literal 515 zcmV+e0{s1nP)B@dw6ZoCj;E>jGz$c{)GJf^Sd&W z@IX}f`FUezjNTce0}zoEMP*S{EO$hNW=6|MB7&@ zNsEZRX-0Uk?#BRgEqZH2CZ>vtpshWR0h*cZ1K*uZ6*B_?LU>;nV~nS%s2~U)v1K4U z2>*AEOvdQ6)-Y8>jRMnQV);46WMP$-j!_4;CTpY(BA~qs|$`@T#(TJd`IA5=g zq`Q!JvpE-t?EPAZ$YxW8d^|AQl(Gt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..58ef85a6177c197b6896f6d25f800d568c4389e4 GIT binary patch literal 578 zcmV-I0=@l-P)-~TH_V`No5B#)kfC2FLKOgZ- z6p$CspQT4oijk3wxiXt79ziVykHA#z<6M^M{*+Pm;@Wj(;wQ}2c%#7A5nMpCjBTx}il?2LN z`*cS|h)im&j4`-gFZgukT*whYW>U8eJ>F>_gE<{CQB`U!-1Z$+rId08`k}j)LL5d% z1gfg^-ceQNoXfbQZF5c{6A{78u)`ZQCCNo#s%)(hnTOMm5iGA(in4omvij*>T^!UoLsi;kh|``0f{Lr&;-BB Qg8%>k07*qoM6N<$f&)ki)&Kwi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc0b9d6638cf0d02bd2059da2db13c302af8291 GIT binary patch literal 600 zcmV-e0;m0nP)f^)7D02Zk08edq9_WSbA%88XqtxUbh~o!a2ucu|P_R zQi@)$w|)2CZ^hk;5pjBY8o37{1TjXewUlLfOBUi6p0yVJau59Vci+uxo(>bVl4OZy zltpH%yYn^2y9R*6L7%g)7wFHkJE@11Hby4b-2kwOMoGbXtz0B}Z= zCJLjwvWyoUVUn+?+ZH7S@_L1$_SmHBhyhln&j1jF=*EA^s m@ZPiWp3E2!5JI4B13v*XAN<_{X@e>N0000s1Sd^roY0ERIK|E zEck-9dsJ3ciXe&7xN&07jP065MAr3PKIt7@-TR*N_0z}pO&ar%Z5SsJw=2W3Y{-ql z>q!=y5+!@|eUG!rAwT})966SvssWGyrLA~3O!mXjmAoIOJZZy+QObO)=_`-Lst@bE*Dqd9bTwQ;OgRYd$-7te_N0HrGDw|UPVzMhb;Ibp& zc4Yt%*V7ro5uF{p4IGYTgIH_J+Sty3NfMJAgD`c&=)ms`c+$I?#V`u?^>tC`?rucb zrskEeIs@igjgmb?tQ6BM?+oZGkG}6Af7d;z+s=UJ_L;NEA@U^cZXe)gsZn`@c*r({ zuIvmr9rzqM7U$cS^Y;H^+$=Sx10UfC*2XeA@F}WY$kQz6SJ`rsDneJX+?LF@8hO9k z1sK{I<#~*vkn8D;wYL16Ju-{}Y_lR(3g`iFx5yYL5o|U805C+O8bj!frT_o{07*qo IM6N<$f}gtGKmY&$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..917d94ed46d725c833de652fa6e91df7c8492157 GIT binary patch literal 657 zcmV;C0&e|@P)4L$H#3bU3g3&3ipP;@#_4KCjj!VZhl{!O4D%6p}?*aoCB; z)-`)^#Bjdkd+vEYh%kXBTh{>SKeHtOrmBg;kV9+uIJ{s{RD8Xd^3Wz!&5Ujo0SbU` zlR1s|NI(MgnMJt1*A3J!)U!mH%Cvf*0ut`0A*PcMG@!c=Num&1JE=Lb<<$D z!Duu>TWgt2CLA0baCv!2nx`KC zIZ{fLQY1;TJFn|{CvI2th||+k&piks@ZMvLAjh{f zi381E?73Rqt`|HXL;yVMb~yVxM*qCJ<+=-Lyl1q@27n1PN($zAg(C#uD$CjCM|PtC z02^t-KoRLSEW>$A7%f(mO@opGxmh7CYfR8)M7(`*;sKoVbUTJsp5M1*_r%@AkY+hT zN}OvD0`$wr1EhdX7;s&b&~L}gt2JL14Nv<4M}r<0%M}21SD}?e3d!f|3hlh(*K|qa zJWAfUJk1J-x;rIAXO>Qz!Io;-9niXul*y4eSQK}W)7Kd8mZt+?VyrA(8B^BT{ rcQ`spLY9|!9NvQv?EVEn5=Q(7C)g8xw2&1%00000NkvXXu0mjf6_FeE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png b/src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png new file mode 100644 index 0000000000000000000000000000000000000000..e0eaab8e749e361b68da57b82bc46b86f7222acc GIT binary patch literal 12042 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 Pw8v8hCdYG*p@01k(Twjs literal 0 HcmV?d00001 From b7456f1c51dec2948c8c139b9721e9d532b30b0e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 2 Oct 2022 20:01:36 +0200 Subject: [PATCH 090/111] NEI handlers, fixes, more matdefs, foundry pieces always dropping mats --- src/main/java/com/hbm/blocks/ModBlocks.java | 8 +- .../blocks/machine/FoundryCastingBase.java | 20 +++ .../hbm/blocks/machine/FoundryChannel.java | 14 ++ .../com/hbm/blocks/machine/FoundryOutlet.java | 1 - .../com/hbm/blocks/machine/FoundryTank.java | 15 ++ .../hbm/blocks/machine/MachineCrucible.java | 26 +++ .../com/hbm/blocks/network/CableDiode.java | 6 +- .../java/com/hbm/crafting/PowderRecipes.java | 20 +-- .../java/com/hbm/entity/EntityMappings.java | 1 + .../hbm/entity/projectile/EntitySawblade.java | 161 ++++++++++++++++++ .../handler/nei/CrucibleAlloyingHandler.java | 152 +++++++++++++++++ .../handler/nei/CrucibleCastingHandler.java | 124 ++++++++++++++ .../handler/nei/CrucibleSmeltingHandler.java | 130 ++++++++++++++ .../hbm/handler/nei/NEIUniversalHandler.java | 5 - .../com/hbm/inventory/OreDictManager.java | 2 + .../com/hbm/inventory/gui/GUICoreEmitter.java | 68 ++++---- .../com/hbm/inventory/gui/GUINukeFstbmb.java | 91 +++++----- .../inventory/material/MatDistribution.java | 19 ++- .../inventory/material/MaterialShapes.java | 2 + .../java/com/hbm/inventory/material/Mats.java | 55 +++--- .../inventory/recipes/AssemblerRecipes.java | 11 -- .../recipes/BlastFurnaceRecipes.java | 11 +- .../inventory/recipes/CrucibleRecipes.java | 111 +++++++++++- .../inventory/recipes/anvil/AnvilRecipes.java | 5 + src/main/java/com/hbm/items/ModItems.java | 2 +- .../java/com/hbm/items/machine/ItemMold.java | 12 +- .../java/com/hbm/lib/HbmChestContents.java | 29 +++- src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/CraftingManager.java | 4 +- src/main/java/com/hbm/main/MainRegistry.java | 4 + src/main/java/com/hbm/main/NEIConfig.java | 6 + .../entity/projectile/RenderSawblade.java | 47 +++++ .../render/tileentity/RenderAssembler.java | 9 +- .../hbm/render/tileentity/RenderFoundry.java | 1 + .../machine/TileEntityCrucible.java | 32 ++++ .../tileentity/machine/TileEntitySawmill.java | 12 ++ src/main/java/com/hbm/util/I18nUtil.java | 7 + src/main/resources/assets/hbm/lang/de_DE.lang | 6 +- src/main/resources/assets/hbm/lang/en_US.lang | 17 +- .../hbm/textures/gui/nei/gui_nei_crucible.png | Bin 0 -> 965 bytes .../gui/nei/gui_nei_crucible_smelting.png | Bin 0 -> 947 bytes .../hbm/textures/gui/nei/gui_nei_foundry.png | Bin 0 -> 5796 bytes .../textures/gui/processing/gui_crucible.png | Bin 11227 -> 11451 bytes .../models/machines/crucible_heat.png | Bin 4820 -> 4828 bytes src/main/resources/mcmod.info | 2 +- 46 files changed, 1059 insertions(+), 192 deletions(-) create mode 100644 src/main/java/com/hbm/entity/projectile/EntitySawblade.java create mode 100644 src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java create mode 100644 src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java create mode 100644 src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java create mode 100644 src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java create mode 100644 src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png create mode 100644 src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png create mode 100644 src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 57b2c7c12..3dbb7cdc2 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -3273,11 +3273,11 @@ public class ModBlocks { //Industrial Factories GameRegistry.registerBlock(factory_titanium_hull, factory_titanium_hull.getUnlocalizedName()); - GameRegistry.registerBlock(factory_titanium_furnace, factory_titanium_furnace.getUnlocalizedName()); - GameRegistry.registerBlock(factory_titanium_conductor, factory_titanium_conductor.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_titanium_furnace, factory_titanium_furnace.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_titanium_conductor, factory_titanium_conductor.getUnlocalizedName()); GameRegistry.registerBlock(factory_advanced_hull, factory_advanced_hull.getUnlocalizedName()); - GameRegistry.registerBlock(factory_advanced_furnace, factory_advanced_furnace.getUnlocalizedName()); - GameRegistry.registerBlock(factory_advanced_conductor, factory_advanced_conductor.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_advanced_furnace, factory_advanced_furnace.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_advanced_conductor, factory_advanced_conductor.getUnlocalizedName()); //The Fluid Inserter //GameRegistry.registerBlock(machine_inserter, machine_inserter.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index ffd799fed..8295df32b 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -17,6 +17,7 @@ import api.hbm.block.ICrucibleAcceptor; import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; @@ -128,6 +129,25 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc return false; } + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + cast.amount = 0; //just for safety + + for(ItemStack stack : cast.slots) { + if(stack != null) { + EntityItem drop = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, stack.copy()); + world.spawnEntityInWorld(drop); + } + } + + super.breakBlock(world, x, y, z, b, i); + } + @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, int x, int y, int z, Random rand) { diff --git a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java index 5d81a660b..bf00c6b60 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java @@ -178,4 +178,18 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor return false; } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryChannel channel = (TileEntityFoundryChannel) world.getTileEntity(x, y, z); + if(channel.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(channel.type, channel.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + channel.amount = 0; + } + + super.breakBlock(world, x, y, z, b, i); + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index 5905ed152..32eac49b1 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -8,7 +8,6 @@ import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemScraps; import com.hbm.lib.RefStrings; -import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; import com.hbm.tileentity.machine.TileEntityFoundryOutlet; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/blocks/machine/FoundryTank.java b/src/main/java/com/hbm/blocks/machine/FoundryTank.java index 0c8d0a48c..fbf7c1538 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryTank.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryTank.java @@ -9,6 +9,7 @@ import api.hbm.block.ICrucibleAcceptor; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -114,6 +115,20 @@ public class FoundryTank extends BlockContainer implements ICrucibleAcceptor { return false; } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryTank tank = (TileEntityFoundryTank) world.getTileEntity(x, y, z); + if(tank.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(tank.type, tank.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + tank.amount = 0; + } + + super.breakBlock(world, x, y, z, b, i); + } @Override public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java index d3c9f996f..702ca3195 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -10,6 +10,7 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityCrucible; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -87,4 +88,29 @@ public class MachineCrucible extends BlockDummyable { public int getOffset() { return 1; } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityCrucible) { + TileEntityCrucible crucible = (TileEntityCrucible) te; + + List stacks = new ArrayList(); + stacks.addAll(crucible.recipeStack); + stacks.addAll(crucible.wasteStack); + + for(MaterialStack stack : stacks) { + ItemStack scrap = ItemScraps.create(new MaterialStack(stack.material, stack.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } + + crucible.recipeStack.clear(); + crucible.wasteStack.clear(); + } + + super.breakBlock(world, x, y, z, b, i); + } } diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 3cec642fc..1e8ea027f 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -170,6 +170,7 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl private long subBuffer; private long contingent = 0; private long lastTransfer = 0; + private int pulses = 0; @Override public long transferPower(long power) { @@ -177,12 +178,15 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl if(recursionBrake) return power; + pulses++; + if(lastTransfer != worldObj.getTotalWorldTime()) { lastTransfer = worldObj.getTotalWorldTime(); contingent = getMaxPower(); + pulses = 0; } - if(contingent <= 0) + if(contingent <= 0 || pulses > 10) return power; //this part turns "maxPower" from a glorified transfer weight into an actual transfer cap diff --git a/src/main/java/com/hbm/crafting/PowderRecipes.java b/src/main/java/com/hbm/crafting/PowderRecipes.java index 2c554ef88..c1c872e9f 100644 --- a/src/main/java/com/hbm/crafting/PowderRecipes.java +++ b/src/main/java/com/hbm/crafting/PowderRecipes.java @@ -49,17 +49,17 @@ public class PowderRecipes { CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_desh_ready, 1), new Object[] { ModItems.powder_desh_mix, ModItems.ingot_mercury, ModItems.ingot_mercury, COAL.dust() }); //Metal powders - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), IRON.dust(), COAL.dust(), CU.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { IRON.dust(), COAL.dust(), MINGRADE.dust(), MINGRADE.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), CU.dust(), STEEL.dust(), STEEL.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 2), new Object[] { MINGRADE.dust(), STEEL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), IRON.dust(), COAL.dust(), CU.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { IRON.dust(), COAL.dust(), MINGRADE.dust(), MINGRADE.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), CU.dust(), STEEL.dust(), STEEL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 2), new Object[] { MINGRADE.dust(), STEEL.dust() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_magnetized_tungsten, 1), new Object[] { W.dust(), SA326.nugget() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_tcalloy, 1), new Object[] { STEEL.dust(), TC99.nugget() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_red_copper, 2), new Object[] { REDSTONE.dust(), CU.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_steel, 2), new Object[] { IRON.dust(), COAL.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), CO.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), W.dust(), W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), CO.dust(), CO.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_red_copper, 2), new Object[] { REDSTONE.dust(), CU.dust() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_steel, 1), new Object[] { IRON.dust(), COAL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), W.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), CO.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), W.dust(), W.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), CO.dust(), CO.dust() }); } } diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 8a0f2a135..aa9e742e4 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -206,6 +206,7 @@ public class EntityMappings { addEntity(EntitySiegeTunneler.class, "entity_meme_tunneler", 1000); addEntity(EntitySPV.class, "entity_self_propelled_vehicle_mark_1", 1000); addEntity(EntityCog.class, "entity_stray_cog", 1000); + addEntity(EntitySawblade.class, "entity_stray_saw", 1000); addEntity(EntityChemical.class, "entity_chemthrower_splash", 1000); addMob(EntityNuclearCreeper.class, "entity_mob_nuclear_creeper", 0x204131, 0x75CE00); diff --git a/src/main/java/com/hbm/entity/projectile/EntitySawblade.java b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java new file mode 100644 index 000000000..9d4a3b592 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java @@ -0,0 +1,161 @@ +package com.hbm.entity.projectile; + +import com.hbm.items.ModItems; +import com.hbm.lib.ModDamageSource; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +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.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class EntitySawblade extends EntityThrowableInterp { + + public EntitySawblade(World world) { + super(world); + this.setSize(1F, 1F); + } + + public EntitySawblade(World world, double x, double y, double z) { + super(world, x, y, z); + this.setSize(1F, 1F); + } + + @Override + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(10, new Integer(0)); + this.dataWatcher.addObject(11, new Integer(0)); + } + + public EntitySawblade setOrientation(int rot) { + this.dataWatcher.updateObject(10, rot); + return this; + } + + public int getOrientation() { + return this.dataWatcher.getWatchableObjectInt(10); + } + + public int getMeta() { + return this.dataWatcher.getWatchableObjectInt(11); + } + + @Override + public boolean interactFirst(EntityPlayer player) { + + if(!worldObj.isRemote) { + + if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.sawblade))) + this.setDead(); + + player.inventoryContainer.detectAndSendChanges(); + } + + return false; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + + if(worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.ENTITY && mop.entityHit.isEntityAlive()) { + Entity e = mop.entityHit; + e.attackEntityFrom(ModDamageSource.rubble, 1000); + if(!e.isEntityAlive() && e instanceof EntityLivingBase) { + NBTTagCompound vdat = new NBTTagCompound(); + vdat.setString("type", "giblets"); + vdat.setInteger("ent", e.getEntityId()); + vdat.setInteger("cDiv", 5); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); + + worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); + } + } + + if(this.ticksExisted > 1 && worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.BLOCK) { + + int orientation = this.dataWatcher.getWatchableObjectInt(10); + + if(orientation < 6) { + + if(Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector() < 0.75) { + this.dataWatcher.updateObject(10, orientation + 6); + orientation += 6; + } else { + ForgeDirection side = ForgeDirection.getOrientation(mop.sideHit); + this.motionX *= 1 - (Math.abs(side.offsetX) * 2); + this.motionY *= 1 - (Math.abs(side.offsetY) * 2); + this.motionZ *= 1 - (Math.abs(side.offsetZ) * 2); + worldObj.createExplosion(this, posX, posY, posZ, 3F, false); + + if(worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ).getExplosionResistance(this) < 50) { + worldObj.func_147480_a(mop.blockX, mop.blockY, mop.blockZ, false); + } + } + } + + if(orientation >= 6) { + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; + this.inGround = true; + } + } + } + + @Override + public void onUpdate() { + + if(!worldObj.isRemote) { + int orientation = this.dataWatcher.getWatchableObjectInt(10); + if(orientation >= 6 && !this.inGround) { + this.dataWatcher.updateObject(10, orientation - 6); + } + } + + super.onUpdate(); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double distance) { + return true; + } + + @Override + public double getGravityVelocity() { + return inGround ? 0 : 0.03D; + } + + @Override + protected int groundDespawn() { + return 0; + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setInteger("rot", this.getOrientation()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + this.setOrientation(nbt.getInteger("rot")); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java new file mode 100644 index 000000000..1f2d9a359 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java @@ -0,0 +1,152 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; +import com.hbm.lib.RefStrings; + +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleAlloyingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + List inputs = new ArrayList(); + PositionedStack template; + PositionedStack crucible; + List outputs = new ArrayList(); + + public RecipeSet(CrucibleRecipe recipe) { + List inputs = new ArrayList(); + List outputs = new ArrayList(); + for(MaterialStack stack : recipe.input) inputs.add(ItemScraps.create(stack)); + for(MaterialStack stack : recipe.output) outputs.add(ItemScraps.create(stack)); + + this.template = new PositionedStack(new ItemStack(ModItems.crucible_template, 1, recipe.getId()), 75, 6); + this.crucible = new PositionedStack(new ItemStack(ModBlocks.machine_crucible), 75, 42); + + for(int i = 0; i < inputs.size(); i++) { + PositionedStack pos = new PositionedStack(inputs.get(i), 12 + (i % 3) * 18, 6 + (i / 3) * 18); + this.inputs.add(pos); + } + + for(int i = 0; i < outputs.size(); i++) { + PositionedStack pos = new PositionedStack(outputs.get(i), 102 + (i % 3) * 18, 6 + (i / 3) * 18); + this.outputs.add(pos); + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, inputs); + } + + @Override + public PositionedStack getResult() { + return outputs.get(0); + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.addAll(inputs); + other.add(crucible); + other.add(template); + other.addAll(outputs); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Alloying"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_crucible.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleAlloying")) { + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + this.arecipes.add(new RecipeSet(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + if(result.getItem() != ModItems.scraps) + return; + + NTMMaterial material = Mats.matById.get(result.getItemDamage()); + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + + for(MaterialStack stack : recipe.output) { + if(stack.material == material) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleAlloying")) { + loadCraftingRecipes("ntmCrucibleAlloying", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + if(ingredient.getItem() != ModItems.scraps) + return; + + NTMMaterial material = Mats.matById.get(ingredient.getItemDamage()); + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + + for(MaterialStack stack : recipe.input) { + if(stack.material == material) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleAlloying")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java new file mode 100644 index 000000000..e8e630024 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java @@ -0,0 +1,124 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.items.machine.ItemMold; +import com.hbm.lib.RefStrings; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleCastingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + PositionedStack input; + PositionedStack mold; + PositionedStack basin; + PositionedStack output; + + public RecipeSet(ItemStack[] stacks) { + this.input = new PositionedStack(stacks[0].copy(), 48, 24); + this.mold = new PositionedStack(stacks[1].copy(), 75, 6); + this.basin = new PositionedStack(stacks[2].copy(), 75, 42); + //through reasons i cannot explain, stacks[3]'s stack size does not survive until this point. + ItemStack o = ItemMold.moldById.get(stacks[1].getItemDamage()).getOutput(Mats.matById.get(stacks[0].getItemDamage())); + this.output = new PositionedStack(o.copy(), 102, 24); + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, Arrays.asList(input, mold, basin)); + } + + @Override + public PositionedStack getResult() { + return output; + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.add(input); + other.add(mold); + other.add(basin); + other.add(output); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Casting"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_foundry.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleFoundry")) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + this.arecipes.add(new RecipeSet(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + if(NEIServerUtils.areStacksSameTypeCrafting(recipe[3], result)) { + this.arecipes.add(new RecipeSet(recipe)); + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleFoundry")) { + loadCraftingRecipes("ntmCrucibleFoundry", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + + for(int i = 0; i < 3; i++) { + if(NEIServerUtils.areStacksSameTypeCrafting(recipe[i], ingredient)) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleFoundry")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java new file mode 100644 index 000000000..b6af31dc1 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java @@ -0,0 +1,130 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.lib.RefStrings; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleSmeltingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + PositionedStack input; + PositionedStack crucible; + List outputs = new ArrayList(); + + public RecipeSet(AStack input, List outputs) { + this.input = new PositionedStack(input.extractForNEI(), 48, 24); + this.crucible = new PositionedStack(new ItemStack(ModBlocks.machine_crucible), 75, 42); + + for(int i = 0; i < outputs.size(); i++) { + PositionedStack pos = new PositionedStack(outputs.get(i), 102 + (i % 3) * 18, 6 + (i / 3) * 18); + this.outputs.add(pos); + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, Arrays.asList(input)); + } + + @Override + public PositionedStack getResult() { + return outputs.get(0); + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.add(input); + other.add(crucible); + other.addAll(outputs); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Smelting"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_crucible_smelting.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleSmelting")) { + + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + + for(ItemStack stack : recipe.getValue()) { + + if(NEIServerUtils.areStacksSameTypeCrafting(stack, result)) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + break; + } + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleSmelting")) { + loadCraftingRecipes("ntmCrucibleSmelting", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + if(recipe.getKey().matchesRecipe(ingredient, true)) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleSmelting")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java index 96a1c667e..dda5d9b04 100644 --- a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java +++ b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java @@ -177,13 +177,8 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler { @Override public void loadTransferRects() { transferRectsGui = new LinkedList(); - //guiGui = new LinkedList>(); - transferRects.add(new RecipeTransferRect(new Rectangle(147, 1, 18, 18), getKey())); - //transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2, 89 - 7 - 11, 18 * 5 - 4, 18 + 16), key)); - //guiGui.add(GUIMachineAssembler.class); RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - //RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); } public abstract String getKey(); diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 8d5cb58c3..b98001f39 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -170,6 +170,7 @@ public class OreDictManager { public static final DictFrame DESH = new DictFrame("WorkersAlloy"); public static final DictFrame STAR = new DictFrame("Starmetal"); public static final DictFrame BIGMT = new DictFrame("Saturnite"); + public static final DictFrame FERRO = new DictFrame("Ferrouranium"); public static final DictFrame EUPH = new DictFrame("Euphemium"); public static final DictFrame DNT = new DictFrame("Dineutronium"); public static final DictFrame FIBER = new DictFrame("Fiberglass"); @@ -338,6 +339,7 @@ public class OreDictManager { DESH .nugget(nugget_desh) .ingot(ingot_desh) .dust(powder_desh) .block(block_desh); STAR .ingot(ingot_starmetal) .block(block_starmetal) .ore(ore_meteor_starmetal); BIGMT .ingot(ingot_saturnite) .plate(plate_saturnite); + FERRO .ingot(ingot_ferrouranium); EUPH .nugget(nugget_euphemium) .ingot(ingot_euphemium) .dust(powder_euphemium) .block(block_euphemium); DNT .nugget(nugget_dineutronium) .ingot(ingot_dineutronium) .dust(powder_dineutronium) .block(block_dineutronium); FIBER .ingot(ingot_fiberglass) .block(block_fiberglass); diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java index e9857b08a..26ad8879d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java @@ -24,29 +24,29 @@ public class GUICoreEmitter extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/dfc/gui_emitter.png"); private TileEntityCoreEmitter emitter; - private GuiTextField field; - + private GuiTextField field; + public GUICoreEmitter(InventoryPlayer invPlayer, TileEntityCoreEmitter tedf) { super(new ContainerCoreEmitter(invPlayer, tedf)); emitter = tedf; - + this.xSize = 176; this.ySize = 166; } - + public void initGui() { super.initGui(); - Keyboard.enableRepeatEvents(true); - this.field = new GuiTextField(this.fontRendererObj, guiLeft + 57, guiTop + 57, 29, 12); - this.field.setTextColor(-1); - this.field.setDisabledTextColour(-1); - this.field.setEnableBackgroundDrawing(false); - this.field.setMaxStringLength(3); - this.field.setText(String.valueOf(emitter.watts)); + Keyboard.enableRepeatEvents(true); + this.field = new GuiTextField(this.fontRendererObj, guiLeft + 57, guiTop + 57, 29, 12); + this.field.setTextColor(-1); + this.field.setDisabledTextColour(-1); + this.field.setEnableBackgroundDrawing(false); + this.field.setMaxStringLength(3); + this.field.setText(String.valueOf(emitter.watts)); } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); @@ -54,38 +54,38 @@ public class GUICoreEmitter extends GuiInfoContainer { emitter.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 17, 16, 52); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 17, 16, 52, emitter.power, emitter.maxPower); } - + protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); this.field.mouseClicked(x, y, i); - if(guiLeft + 97 <= x && guiLeft + 97 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { - - if(NumberUtils.isNumber(field.getText())) { - int j = MathHelper.clamp_int((int)Double.parseDouble(field.getText()), 1, 100); - field.setText(j + ""); - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, j, 0)); - } - } + if(guiLeft + 97 <= x && guiLeft + 97 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { - if(guiLeft + 133 <= x && guiLeft + 133 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { + if(NumberUtils.isNumber(field.getText())) { + int j = MathHelper.clamp_int((int) Double.parseDouble(field.getText()), 1, 100); + field.setText(j + ""); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, j, 0)); + } + } + + if(guiLeft + 133 <= x && guiLeft + 133 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, 0, 1)); - } + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, 0, 1)); + } } @Override - protected void drawGuiContainerForegroundLayer( int i, int j) { + protected void drawGuiContainerForegroundLayer(int i, int j) { String name = I18n.format(this.emitter.getInventoryName()); this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - + this.fontRendererObj.drawString("Output: " + BobMathUtil.getShortNumber(emitter.prev) + "Spk", 50, 30, 0xFF7F7F); - + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); @@ -99,19 +99,19 @@ public class GUICoreEmitter extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 133, guiTop + 52, 192, 0, 18, 18); drawTexturedModalRect(guiLeft + 53, guiTop + 45, 210, 0, emitter.watts * 34 / 100, 4); - + int i = (int) emitter.getPowerScaled(52); drawTexturedModalRect(guiLeft + 26, guiTop + 69 - i, 176, 52 - i, 16, i); - + this.field.drawTextBox(); emitter.tank.renderTank(guiLeft + 8, guiTop + 69, this.zLevel, 16, 52); } - + protected void keyTyped(char p_73869_1_, int p_73869_2_) { - + if(this.field.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - + } else { super.keyTyped(p_73869_1_, p_73869_2_); } diff --git a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java index 1d7fad6de..661f5681d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java +++ b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java @@ -21,8 +21,8 @@ public class GUINukeFstbmb extends GuiInfoContainer { public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/weapon/fstbmbSchematic.png"); private TileEntityNukeBalefire bomb; - private GuiTextField timer; - + private GuiTextField timer; + public GUINukeFstbmb(InventoryPlayer invPlayer, TileEntityNukeBalefire bomb) { super(new ContainerNukeFstbmb(invPlayer, bomb)); this.bomb = bomb; @@ -30,89 +30,88 @@ public class GUINukeFstbmb extends GuiInfoContainer { this.xSize = 176; this.ySize = 222; } - + public void initGui() { super.initGui(); - Keyboard.enableRepeatEvents(true); - this.timer = new GuiTextField(this.fontRendererObj, guiLeft + 94, guiTop + 40, 29, 12); - this.timer.setTextColor(0xff0000); - this.timer.setDisabledTextColour(0x800000); - this.timer.setEnableBackgroundDrawing(false); - this.timer.setMaxStringLength(3); - this.timer.setText(String.valueOf(bomb.timer / 20)); + Keyboard.enableRepeatEvents(true); + this.timer = new GuiTextField(this.fontRendererObj, guiLeft + 94, guiTop + 40, 29, 12); + this.timer.setTextColor(0xff0000); + this.timer.setDisabledTextColour(0x800000); + this.timer.setEnableBackgroundDrawing(false); + this.timer.setMaxStringLength(3); + this.timer.setText(String.valueOf(bomb.timer / 20)); } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); } protected void mouseClicked(int x, int y, int i) { - super.mouseClicked(x, y, i); - this.timer.mouseClicked(x, y, i); - + super.mouseClicked(x, y, i); + this.timer.mouseClicked(x, y, i); if(!bomb.started) { - if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 35 < y && guiTop + 35 + 18 >= y) { - - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, 0, 0)); - } + if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 35 < y && guiTop + 35 + 18 >= y) { + + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, 0, 0)); + } } - } - + } + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - + String name = this.bomb.hasCustomInventoryName() ? this.bomb.getInventoryName() : I18n.format(this.bomb.getInventoryName()); - + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); - + if(bomb.hasBattery()) { String timer = bomb.getMinutes() + ":" + bomb.getSeconds(); double scale = 0.75; GL11.glScaled(scale, scale, scale); - this.fontRendererObj.drawString(timer, (int) ((69 - this.fontRendererObj.getStringWidth(timer) / 2) * (1/scale)), (int) (95.5 * (1/scale)), 0xff0000); + this.fontRendererObj.drawString(timer, (int) ((69 - this.fontRendererObj.getStringWidth(timer) / 2) * (1 / scale)), (int) (95.5 * (1 / scale)), 0xff0000); - GL11.glScaled(1/scale, 1/scale, 1/scale); + GL11.glScaled(1 / scale, 1 / scale, 1 / scale); } } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - + if(bomb.hasEgg()) drawTexturedModalRect(guiLeft + 19, guiTop + 90, 176, 0, 30, 16); - + int battery = bomb.getBattery(); - + if(battery == 1) drawTexturedModalRect(guiLeft + 88, guiTop + 93, 176, 16, 18, 10); else if(battery == 2) drawTexturedModalRect(guiLeft + 88, guiTop + 93, 194, 16, 18, 10); - + if(bomb.started) drawTexturedModalRect(guiLeft + 142, guiTop + 35, 176, 26, 18, 18); - - this.timer.drawTextBox(); - } - - protected void keyTyped(char p_73869_1_, int p_73869_2_) { - - if (this.timer.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - if(NumberUtils.isNumber(timer.getText())) { - int j = MathHelper.clamp_int(Integer.parseInt(timer.getText()), 1, 999); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, j, 1)); - } - - } else { - super.keyTyped(p_73869_1_, p_73869_2_); - } - } + this.timer.drawTextBox(); + } + + protected void keyTyped(char p_73869_1_, int p_73869_2_) { + + if(this.timer.textboxKeyTyped(p_73869_1_, p_73869_2_)) { + + if(NumberUtils.isNumber(timer.getText())) { + int j = MathHelper.clamp_int((int) Double.parseDouble(timer.getText()), 1, 999); + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, j, 1)); + } + + } else { + super.keyTyped(p_73869_1_, p_73869_2_); + } + } } diff --git a/src/main/java/com/hbm/inventory/material/MatDistribution.java b/src/main/java/com/hbm/inventory/material/MatDistribution.java index 0c22e9780..196848068 100644 --- a/src/main/java/com/hbm/inventory/material/MatDistribution.java +++ b/src/main/java/com/hbm/inventory/material/MatDistribution.java @@ -24,8 +24,8 @@ public class MatDistribution { registerOre("cobblestone", MAT_STONE, BLOCK.q(1)); registerEntry(Blocks.obsidian, MAT_OBSIDIAN, BLOCK.q(1)); registerEntry(Blocks.rail, MAT_IRON, INGOT.q(6, 16)); - registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6), MAT_REDSTONE, DUST.q(1)); - registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6), MAT_REDSTONE, DUST.q(1)); + registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6, 6), MAT_REDSTONE, DUST.q(1, 6)); + registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6, 6), MAT_REDSTONE, DUST.q(1, 6)); registerEntry(Items.minecart, MAT_IRON, INGOT.q(5)); //castables @@ -53,9 +53,18 @@ public class MatDistribution { registerEntry(ModItems.pipes_steel, MAT_STEEL, BLOCK.q(3)); //actual ores - registerOre(OreDictManager.COAL.ore(), MAT_IRON, INGOT.q(4), MAT_STONE, QUART.q(1)); - registerOre(OreDictManager.IRON.ore(), MAT_IRON, INGOT.q(3), MAT_TITANIUM, INGOT.q(1), MAT_STONE, QUART.q(1)); - registerOre(OreDictManager.GOLD.ore(), MAT_GOLD, INGOT.q(3), MAT_LEAD, INGOT.q(1), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.COAL.ore(), MAT_COAL, GEM.q(4), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.IRON.ore(), MAT_IRON, INGOT.q(2), MAT_TITANIUM, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.GOLD.ore(), MAT_GOLD, INGOT.q(2), MAT_LEAD, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.U.ore(), MAT_URANIUM, INGOT.q(2), MAT_LEAD, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.TH232.ore(), MAT_THORIUM, INGOT.q(2), MAT_URANIUM, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.TI.ore(), MAT_TITANIUM, INGOT.q(2), MAT_IRON, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.CU.ore(), MAT_COPPER, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.W.ore(), MAT_TUNGSTEN, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.AL.ore(), MAT_ALUMINIUM, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.PB.ore(), MAT_LEAD, INGOT.q(2), MAT_GOLD, NUGGET.q(1), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.BE.ore(), MAT_BERYLLIUM, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.CO.ore(), MAT_COBALT, INGOT.q(1), MAT_STONE, QUART.q(1)); } public static void registerEntry(Object key, Object... matDef) { diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java index 4dcc41a1e..6235c5670 100644 --- a/src/main/java/com/hbm/inventory/material/MaterialShapes.java +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -8,6 +8,8 @@ public enum MaterialShapes { WIRE(9), BILLET(NUGGET.quantity * 6, "billet"), INGOT(NUGGET.quantity * 9, "ingot"), + GEM(INGOT.quantity, "gem"), + CRYSTAL(INGOT.quantity, "crystal"), DUST(INGOT.quantity, "dust"), PLATE(INGOT.quantity, "plate"), QUART(162), diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 205882ef5..e229cadb4 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -49,46 +49,51 @@ public class Mats { public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0x4D2F23).omitAutoGen(); public static final NTMMaterial MAT_COAL = makeAdditive( 1400, COAL, 0x583434).omitAutoGen(); public static final NTMMaterial MAT_LIGNITE = makeAdditive( 1401, LIGNITE, 0x715444); - public static final NTMMaterial MAT_COALCOKE = makeAdditive( 1410, COALCOKE, 0); - public static final NTMMaterial MAT_PETCOKE = makeAdditive( 1411, PETCOKE, 0); - public static final NTMMaterial MAT_LIGCOKE = makeAdditive( 1412, LIGCOKE, 0); - public static final NTMMaterial MAT_GRAPHITE = makeAdditive( 1420, GRAPHITE, 0); + public static final NTMMaterial MAT_COALCOKE = makeAdditive( 1410, COALCOKE, 0x3B3B3B); + public static final NTMMaterial MAT_PETCOKE = makeAdditive( 1411, PETCOKE, 0x71645C); + public static final NTMMaterial MAT_LIGCOKE = makeAdditive( 1412, LIGCOKE, 0x725644); + public static final NTMMaterial MAT_GRAPHITE = makeAdditive( 1420, GRAPHITE, 0x666666); public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0xFFA259).omitAutoGen(); public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0xE8D754).omitAutoGen(); public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0xFF1000).omitAutoGen(); public static final NTMMaterial MAT_OBSIDIAN = makeSmeltable(_VS + 02, df("Obsidian"), 0x3D234D).omitAutoGen(); //Radioactive - public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_THORIUM = makeSmeltable(9232, TH232, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(9400, PU, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_SCHRABIDIUM = makeSmeltable(12626, SA326, 0).setShapes(NUGGET, WIRE, BILLET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U233 = makeSmeltable(9233, U233, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U235 = makeSmeltable(9235, U235, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U238 = makeSmeltable(9238, U238, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_THORIUM = makeSmeltable(9032, TH232, 0xBF825F).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(9400, PU, 0x78817E).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TECHNIETIUM = makeSmeltable(4399, TC99, 0xCADFDF).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0xE9FAF6).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SCHRABIDIUM = makeSmeltable(12626, SA326, 0x32FFFF).setShapes(NUGGET, WIRE, BILLET, INGOT, DUST, PLATE, BLOCK); //Base metals public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xA99E79).setShapes(INGOT, DUST, PLATE, BLOCK); public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xC18336).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0).setShapes(WIRE, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, df("Bismuth"), 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0).setShapes(NUGGET, INGOT); - public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(7300, TA, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(4100, NB, 0).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(400, BE, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_COBALT = makeSmeltable(2700, CO, 0).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_BORON = makeSmeltable(500, B, 0).setShapes(DUSTTINY, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x977474).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xD0B8EB).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0x646470).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, df("Bismuth"), 0xB200FF).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0x558080).setShapes(NUGGET, INGOT); + public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(7300, TA, 0xA89B74).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(4100, NB, 0xD576B1).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(400, BE, 0xAE9572).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_COBALT = makeSmeltable(2700, CO, 0x8F72AE).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BORON = makeSmeltable(500, B, 0xAD72AE).setShapes(DUSTTINY, INGOT, DUST, BLOCK); //Alloys public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0x4A4A4A).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK); public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xE44C0F).setShapes(WIRE, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF7318).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0).setShapes(INGOT, DUST); - public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(_AS + 7, MAGTUNG, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_CMB = makeSmeltable(_AS + 8, CMB, 0).setShapes(INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x376373).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0x4DA3AF).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0xA5A5D3).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0x9CA6A6).setShapes(INGOT, DUST); + public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0x6B6B8B).setShapes(INGOT); + public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(_AS + 8, MAGTUNG, 0x22A2A2).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_CMB = makeSmeltable(_AS + 9, CMB, 0x6F6FB4).setShapes(INGOT, DUST, PLATE, BLOCK); public static NTMMaterial make(int id, DictFrame dict) { return new NTMMaterial(id, dict); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index b4abb39ad..078efd54c 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -1344,17 +1344,6 @@ public class AssemblerRecipes { value.add(((ComparableStack)o).toStack()); } else if(o instanceof OreDictStack) { - - /*List list = new ArrayList(); - OreDictStack oreStack = (OreDictStack)o; - List ores = OreDictionary.getOres(oreStack.name); - - for(ItemStack ore : ores) { - ItemStack copy = ore.copy(); - copy.stackSize = oreStack.stacksize; - list.add(copy); - }*/ - value.add(((OreDictStack)o).extractForNEI()); } } diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java index 3921cbfae..4657e1175 100644 --- a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java @@ -17,6 +17,7 @@ import com.hbm.handler.imc.IMCBlastFurnace; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Triplet; @@ -46,10 +47,10 @@ public class BlastFurnaceRecipes { addRecipe(STEEL, MINGRADE, new ItemStack(ModItems.ingot_advanced_alloy, 2)); addRecipe(W, COAL, new ItemStack(ModItems.neutron_reflector, 2)); addRecipe(W, ANY_COKE, new ItemStack(ModItems.neutron_reflector, 2)); - addRecipe(ModItems.canister_fuel, "slimeball", new ItemStack(ModItems.canister_napalm)); - addRecipe(STEEL, CO, new ItemStack(ModItems.ingot_dura_steel, 2)); - addRecipe(STEEL, W, new ItemStack(ModItems.ingot_dura_steel, 2)); - addRecipe(STEEL, U238, new ItemStack(ModItems.ingot_ferrouranium)); + addRecipe(new ComparableStack(ModItems.canister_full, 1, Fluids.GASOLINE.getID()), "slimeball", new ItemStack(ModItems.canister_napalm)); + //addRecipe(STEEL, CO, new ItemStack(ModItems.ingot_dura_steel, 2)); + //addRecipe(STEEL, W, new ItemStack(ModItems.ingot_dura_steel, 2)); + //addRecipe(STEEL, U238, new ItemStack(ModItems.ingot_ferrouranium)); addRecipe(W, SA326.nugget(), new ItemStack(ModItems.ingot_magnetized_tungsten)); addRecipe(STEEL, TC99.nugget(), new ItemStack(ModItems.ingot_tcalloy)); addRecipe(GOLD.plate(), ModItems.plate_mixed, new ItemStack(ModItems.plate_paa, 2)); @@ -59,7 +60,7 @@ public class BlastFurnaceRecipes { addRecipe(ModBlocks.block_meteor, CO, new ItemStack(ModItems.ingot_meteorite)); if(GeneralConfig.enableLBSMSimpleChemsitry) - addRecipe(ModItems.canister_empty, COAL, new ItemStack(ModItems.canister_oil)); + addRecipe(ModItems.canister_empty, COAL, new ItemStack(ModItems.canister_full, 1, Fluids.OIL.getID())); if(!IMCBlastFurnace.buffer.isEmpty()) { blastFurnaceRecipes.addAll(IMCBlastFurnace.buffer); diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java index 9234b5487..47928e085 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -4,15 +4,28 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map.Entry; import com.google.gson.JsonElement; import com.google.gson.stream.JsonWriter; +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMold; +import com.hbm.items.machine.ItemMold.Mold; +import com.hbm.items.machine.ItemScraps; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; public class CrucibleRecipes extends SerializableRecipe { @@ -26,18 +39,35 @@ public class CrucibleRecipes extends SerializableRecipe { @Override public void registerDefaults() { + + int n = MaterialShapes.NUGGET.q(1); + int i = MaterialShapes.INGOT.q(1); recipes.add(new CrucibleRecipe(0, "crucible.steel", 1, new ItemStack(ModItems.ingot_steel)) - .inputs(new MaterialStack(Mats.MAT_IRON, 8), new MaterialStack(Mats.MAT_COAL, 8)) - .outputs(new MaterialStack(Mats.MAT_STEEL, 8))); + .inputs(new MaterialStack(Mats.MAT_IRON, n), new MaterialStack(Mats.MAT_COAL, n)) + .outputs(new MaterialStack(Mats.MAT_STEEL, n))); - recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 1, new ItemStack(ModItems.ingot_red_copper)) - .inputs(new MaterialStack(Mats.MAT_COPPER, 8), new MaterialStack(Mats.MAT_REDSTONE, 8)) - .outputs(new MaterialStack(Mats.MAT_MINGRADE, 16))); + recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 2, new ItemStack(ModItems.ingot_red_copper)) + .inputs(new MaterialStack(Mats.MAT_COPPER, n), new MaterialStack(Mats.MAT_REDSTONE, n)) + .outputs(new MaterialStack(Mats.MAT_MINGRADE, n * 2))); - recipes.add(new CrucibleRecipe(2, "crucible.aa", 1, new ItemStack(ModItems.ingot_advanced_alloy)) - .inputs(new MaterialStack(Mats.MAT_STEEL, 8), new MaterialStack(Mats.MAT_MINGRADE, 8)) - .outputs(new MaterialStack(Mats.MAT_ALLOY, 16))); + recipes.add(new CrucibleRecipe(2, "crucible.aa", 2, new ItemStack(ModItems.ingot_advanced_alloy)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n), new MaterialStack(Mats.MAT_MINGRADE, n)) + .outputs(new MaterialStack(Mats.MAT_ALLOY, n * 2))); + + recipes.add(new CrucibleRecipe(3, "crucible.hss", 4, new ItemStack(ModItems.ingot_dura_steel)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 2), new MaterialStack(Mats.MAT_TUNGSTEN, n), new MaterialStack(Mats.MAT_COBALT, n)) + .outputs(new MaterialStack(Mats.MAT_DURA, n * 4))); + + recipes.add(new CrucibleRecipe(4, "crucible.ferro", 3, new ItemStack(ModItems.ingot_ferrouranium)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 2), new MaterialStack(Mats.MAT_U238, n), new MaterialStack(Mats.MAT_COAL, n)) + .outputs(new MaterialStack(Mats.MAT_FERRO, n * 3))); + + recipes.add(new CrucibleRecipe(5, "crucible.tcalloy", 9, new ItemStack(ModItems.ingot_tcalloy)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 8), new MaterialStack(Mats.MAT_TECHNIETIUM, n), new MaterialStack(Mats.MAT_COAL, n * 4)) + .outputs(new MaterialStack(Mats.MAT_TCALLOY, i))); + + registerMoldsForNEI(); } public static class CrucibleRecipe { @@ -101,6 +131,11 @@ public class CrucibleRecipes extends SerializableRecipe { return this.recipes; } + @Override + public String getComment() { + return "/// under construction ///"; + } + @Override public void readRecipe(JsonElement recipe) { @@ -116,4 +151,64 @@ public class CrucibleRecipes extends SerializableRecipe { this.indexMapping.clear(); this.recipes.clear(); } + + /** Returns a map containing all recipes where an item becomes a liquid material in the crucible. */ + public static HashMap> getSmeltingRecipes() { + HashMap> map = new HashMap(); + + for(NTMMaterial material : Mats.orderedList) { + for(MaterialShapes shape : MaterialShapes.values()) { + //TODO: buffer these + + String name = shape.toString().toLowerCase() + material.names[0]; + List ores = OreDictionary.getOres(name); + + if(!ores.isEmpty()) { + List stacks = new ArrayList(); + stacks.add(ItemScraps.create(new MaterialStack(material, shape.q(1)))); + map.put(new OreDictStack(name), stacks); + } + } + } + + for(Entry> entry : Mats.materialOreEntries.entrySet()) { + List stacks = new ArrayList(); + for(MaterialStack mat : entry.getValue()) { + stacks.add(ItemScraps.create(mat)); + } + map.put(new OreDictStack(entry.getKey()), stacks); + } + + for(Entry> entry : Mats.materialEntries.entrySet()) { + List stacks = new ArrayList(); + for(MaterialStack mat : entry.getValue()) { + stacks.add(ItemScraps.create(mat)); + } + map.put(entry.getKey().copy(), stacks); + } + + return map; + } + + public static List moldRecipes = new ArrayList(); + + public static void registerMoldsForNEI() { + + for(NTMMaterial material : Mats.orderedList) { + + if(material.smeltable != SmeltingBehavior.SMELTABLE) + continue; + + for(Mold mold : ItemMold.molds) { + ItemStack out = mold.getOutput(material); + if(out != null) { + ItemStack scrap = ItemScraps.create(new MaterialStack(material, mold.getCost())); + ItemStack shape = new ItemStack(ModItems.mold, 1, mold.id); + ItemStack basin = new ItemStack(mold.size == 0 ? ModBlocks.foundry_mold : mold.size == 1 ? ModBlocks.foundry_basin : Blocks.fire); + ItemStack[] entry = new ItemStack[] {scrap, shape, basin, out}; + moldRecipes.add(entry); + } + } + } + } } diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 8d1dfcfec..84c875858 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -116,6 +116,11 @@ public class AnvilRecipes { smithingRecipes.add(new AnvilSmithingMold(11, new OreDictStack(IRON.plate(), 9), new OreDictStack("plate", 9))); smithingRecipes.add(new AnvilSmithingMold(12, new OreDictStack(IRON.block()), new OreDictStack("block"))); smithingRecipes.add(new AnvilSmithingMold(13, new ComparableStack(ModItems.pipes_steel), new ItemStack[] {new ItemStack(ModItems.pipes_steel)})); + smithingRecipes.add(new AnvilSmithingMold(14, new ComparableStack(ModItems.casing_357), new ItemStack[] {new ItemStack(ModItems.casing_357)})); + smithingRecipes.add(new AnvilSmithingMold(15, new ComparableStack(ModItems.casing_44), new ItemStack[] {new ItemStack(ModItems.casing_44)})); + smithingRecipes.add(new AnvilSmithingMold(16, new ComparableStack(ModItems.casing_9), new ItemStack[] {new ItemStack(ModItems.casing_9)})); + smithingRecipes.add(new AnvilSmithingMold(17, new ComparableStack(ModItems.casing_50), new ItemStack[] {new ItemStack(ModItems.casing_50)})); + smithingRecipes.add(new AnvilSmithingMold(18, new ComparableStack(ModItems.casing_buckshot), new ItemStack[] {new ItemStack(ModItems.casing_buckshot)})); smithingRecipes.add(new AnvilSmithingCyanideRecipe()); smithingRecipes.add(new AnvilSmithingRenameRecipe()); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index dfc52f442..918c72eeb 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -3356,7 +3356,7 @@ public class ModItems { mold_base = new Item().setUnlocalizedName("mold_base").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":mold_base"); mold = new ItemMold().setUnlocalizedName("mold").setCreativeTab(MainRegistry.controlTab); - scraps = new ItemScraps().setUnlocalizedName("scraps").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":scraps"); + scraps = new ItemScraps().setUnlocalizedName("scraps").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":scraps"); part_lithium = new Item().setUnlocalizedName("part_lithium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_lithium"); part_beryllium = new Item().setUnlocalizedName("part_beryllium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_beryllium"); diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java index fb42c0c7f..1743aca29 100644 --- a/src/main/java/com/hbm/items/machine/ItemMold.java +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -26,8 +26,8 @@ import net.minecraftforge.oredict.OreDictionary; public class ItemMold extends Item { - public List molds = new ArrayList(); //molds in "pretty" order, variable between versions - public HashMap moldById = new HashMap(); //molds by their static ID -> stack item damage + public static List molds = new ArrayList(); //molds in "pretty" order, variable between versions + public static HashMap moldById = new HashMap(); //molds by their static ID -> stack item damage public HashMap blockOverrides = new HashMap(); @@ -47,7 +47,7 @@ public class ItemMold extends Item { registerMold(new MoldShape( 3, S, "plate", MaterialShapes.PLATE)); registerMold(new MoldWire( 4, S, "wire")); - registerMold(new MoldMulti( 5, S, "blade", MaterialShapes.INGOT.q(2), + registerMold(new MoldMulti( 5, S, "blade", MaterialShapes.INGOT.q(3), Mats.MAT_TITANIUM, new ItemStack(ModItems.blade_titanium), Mats.MAT_TUNGSTEN, new ItemStack(ModItems.blade_tungsten))); @@ -82,6 +82,12 @@ public class ItemMold extends Item { registerMold(new MoldShape( 11, L, "plates", MaterialShapes.PLATE, 9)); registerMold(new MoldBlock( 12, L, "block", MaterialShapes.BLOCK)); registerMold(new MoldSingle( 13, L, "pipes", new ItemStack(ModItems.pipes_steel), Mats.MAT_STEEL, MaterialShapes.BLOCK.q(3))); + + registerMold(new MoldSingle( 14, S, "c357", new ItemStack(ModItems.casing_357), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 15, S, "c44", new ItemStack(ModItems.casing_44), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 16, S, "c9", new ItemStack(ModItems.casing_9), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 17, S, "c50", new ItemStack(ModItems.casing_50), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 18, S, "cbuckshot", new ItemStack(ModItems.casing_buckshot), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); } public void registerMold(Mold mold) { diff --git a/src/main/java/com/hbm/lib/HbmChestContents.java b/src/main/java/com/hbm/lib/HbmChestContents.java index e8b53cd74..17cbe32fe 100644 --- a/src/main/java/com/hbm/lib/HbmChestContents.java +++ b/src/main/java/com/hbm/lib/HbmChestContents.java @@ -1,12 +1,11 @@ package com.hbm.lib; -import java.util.Random; +import java.util.HashMap; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBreedingRod.*; -import com.hbm.util.I18nUtil; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -15,7 +14,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.World; public class HbmChestContents { @@ -360,8 +358,8 @@ public class HbmChestContents { /** Nowhere else to put this and this seems like the most fitting place **/ public static ItemStack genetateBook(String key) { - String author = I18nUtil.resolveKey("book.lore." + key + ".author"); - String title = I18nUtil.resolveKey("book.lore." + key + ".title"); + String author = resolve("book.lore." + key + ".author"); + String title = resolve("book.lore." + key + ".title"); ItemStack book = new ItemStack(Items.written_book); book.stackTagCompound = new NBTTagCompound(); @@ -371,7 +369,7 @@ public class HbmChestContents { for(byte i = 1; i <= 50; i++) { String unloc = "book.lore." + key + ".page" + i; - String page = I18nUtil.resolveKey(unloc); + String page = resolve(unloc); if(page.equals(unloc)) break; @@ -383,4 +381,23 @@ public class HbmChestContents { return book; } + + private static String resolve(String key) { + String result = books.get(key); + return result != null ? result : key; + } + + private static HashMap books = new HashMap(); + + static { + books.put("book.lore.office0.title", "Letter of Resignation"); + books.put("book.lore.office0.author", "Kosma"); + books.put("book.lore.office0.page1", "Management downsized our department again yesterday. Those idiots only have themselves to blame, I don't know what they were expecting after the Panay fiasco. Who the hell leaks that sort of information? We're losing millions and"); + books.put("book.lore.office0.page2", "it's ME who's the one out of a job now. I'M the one being asked to resign. I hope you asshats finally learn from your overabundance of mistakes and take that stick out of your ass."); + books.put("book.lore.office0.page3", "I'm not coming back on Friday. Just send the paycheck."); + books.put("book.lore.office1.title", "Note"); + books.put("book.lore.office1.author", "Jonas"); + books.put("book.lore.office1.page1", null); + books.put("book.lore.office2.page2", null); + } } diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index f131c6199..7039d641b 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4347)"; + public static final String VERSION = "1.0.27 BETA (4375)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 54a1d2560..a927da6c9 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -562,6 +562,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityZirnoxDebris.class, new RenderZirnoxDebris()); RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryShell.class, new RenderArtilleryShell()); RenderingRegistry.registerEntityRenderingHandler(EntityCog.class, new RenderCog()); + RenderingRegistry.registerEntityRenderingHandler(EntitySawblade.class, new RenderSawblade()); RenderingRegistry.registerEntityRenderingHandler(EntityChemical.class, new RenderChemical()); //grenades RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeGeneric.class, new RenderSnowball(ModItems.grenade_generic)); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 28008617b..8f6de38a2 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -298,8 +298,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.muffler, 1), new Object[] { "III", "IWI", "III", 'I', ModItems.plate_polymer, 'W', Blocks.wool }); - addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_titanium_hull), 1), new Object[] { "PIP", "I I", "PIP", 'P', TI.plate(), 'I', TI.ingot() }); - addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_advanced_hull), 1), new Object[] { "PIP", "I I", "PIP", 'P', ALLOY.plate(), 'I', ALLOY.ingot() }); + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_titanium_hull), 8), new Object[] { "PIP", "I I", "PIP", 'P', TI.plate(), 'I', TI.ingot() }); + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_advanced_hull), 8), new Object[] { "PIP", "I I", "PIP", 'P', ALLOY.plate(), 'I', ALLOY.ingot() }); addRecipeAuto(new ItemStack(ModItems.arc_electrode, 1), new Object[] { "C", "T", "C", 'C', GRAPHITE.ingot(), 'T', ModItems.bolt_tungsten }); addRecipeAuto(new ItemStack(ModItems.arc_electrode_desh, 1), new Object[] { "C", "T", "C", 'C', DESH.dust(), 'T', ModItems.arc_electrode }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 615c78c47..96b928b48 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -939,6 +939,10 @@ public class MainRegistry { ignoreMappings.add("hbm:item.factory_core_advanced"); ignoreMappings.add("hbm:tile.factory_titanium_core"); ignoreMappings.add("hbm:tile.factory_advanced_core"); + ignoreMappings.add("hbm:tile.factory_titanium_conductor"); + ignoreMappings.add("hbm:tile.factory_advanced_conductor"); + ignoreMappings.add("hbm:tile.factory_titanium_furnace"); + ignoreMappings.add("hbm:tile.factory_advanced_furnace"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 44e9aed37..ba4c7f9bf 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -68,6 +68,12 @@ public class NEIConfig implements IConfigureNEI { API.registerUsageHandler(new FuelPoolHandler()); API.registerRecipeHandler(new RadiolysisRecipeHandler()); API.registerUsageHandler(new RadiolysisRecipeHandler()); + API.registerRecipeHandler(new CrucibleSmeltingHandler()); + API.registerUsageHandler(new CrucibleSmeltingHandler()); + API.registerRecipeHandler(new CrucibleAlloyingHandler()); + API.registerUsageHandler(new CrucibleAlloyingHandler()); + API.registerRecipeHandler(new CrucibleCastingHandler()); + API.registerUsageHandler(new CrucibleCastingHandler()); //universal boyes API.registerRecipeHandler(new ZirnoxRecipeHandler()); diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java b/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java new file mode 100644 index 000000000..b12cb4594 --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java @@ -0,0 +1,47 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderSawblade extends Render { + + @Override + public void doRender(Entity cog, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + int orientation = cog.getDataWatcher().getWatchableObjectInt(10); + switch(orientation % 6) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + GL11.glTranslated(0, 0, -1); + + + if(orientation < 6) { + GL11.glRotated(System.currentTimeMillis() % (360 * 5) / 3D, 0.0D, 0.0D, -1.0D); + } + + GL11.glTranslated(0, -1.375, 0); + + this.bindEntityTexture(cog); + ResourceManager.sawmill.renderPart("Blade"); + + GL11.glPopMatrix(); + + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return ResourceManager.sawmill_tex; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssembler.java b/src/main/java/com/hbm/render/tileentity/RenderAssembler.java index 940bf6431..b03698a8b 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssembler.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssembler.java @@ -3,26 +3,18 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.inventory.recipes.AssemblerRecipes; -import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.util.RenderDecoItem; -import com.hbm.render.util.RenderItemStack; import com.hbm.tileentity.machine.TileEntityMachineAssembler; -import com.hbm.tileentity.machine.TileEntityMachinePress; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.AdvancedModelLoader; -import net.minecraftforge.client.model.IModelCustom; public class RenderAssembler extends TileEntitySpecialRenderer { @@ -93,6 +85,7 @@ public class RenderAssembler extends TileEntitySpecialRenderer { } GL11.glPopMatrix(); + RenderHelper.enableStandardItemLighting(); renderSlider(tileEntity, x, y, z, f); } diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java index 7f3de13af..0976d9c12 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -43,6 +43,7 @@ public class RenderFoundry extends TileEntitySpecialRenderer { } GL11.glPopMatrix(); RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL11.GL_ALPHA_TEST); } private void drawBlock(ItemStack stack, IRenderFoundry foundry) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 76412caa9..1b78d8e21 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -190,6 +190,38 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro this.heat = nbt.getInteger("heat"); } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + int[] rec = nbt.getIntArray("rec"); + for(int i = 0; i < rec.length / 2; i++) { + recipeStack.add(new MaterialStack(Mats.matById.get(rec[i * 2]), rec[i * 2 + 1])); + } + + int[] was = nbt.getIntArray("was"); + for(int i = 0; i < was.length / 2; i++) { + wasteStack.add(new MaterialStack(Mats.matById.get(was[i * 2]), was[i * 2 + 1])); + } + + this.progress = nbt.getInteger("progress"); + this.heat = nbt.getInteger("heat"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + int[] rec = new int[recipeStack.size() * 2]; + int[] was = new int[wasteStack.size() * 2]; + for(int i = 0; i < recipeStack.size(); i++) { MaterialStack sta = recipeStack.get(i); rec[i * 2] = sta.material.id; rec[i * 2 + 1] = sta.amount; } + for(int i = 0; i < wasteStack.size(); i++) { MaterialStack sta = wasteStack.get(i); was[i * 2] = sta.material.id; was[i * 2 + 1] = sta.amount; } + nbt.setIntArray("rec", rec); + nbt.setIntArray("was", was); + nbt.setInteger("progress", progress); + nbt.setInteger("heat", heat); + } + protected void tryPullHeat() { TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index 51c2c47e3..fc6dd4727 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import java.util.List; import com.hbm.blocks.BlockDummyable; +import com.hbm.entity.projectile.EntitySawblade; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.INBTPacketReceiver; @@ -104,6 +105,17 @@ public class TileEntitySawmill extends TileEntityMachineBase { if(overspeed > 300) { this.hasBlade = false; this.worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 5F, false, false); + + int orientation = this.getBlockMetadata() - BlockDummyable.offset; + ForgeDirection dir = ForgeDirection.getOrientation(orientation); + EntitySawblade cog = new EntitySawblade(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + cog.motionX = rot.offsetX; + cog.motionY = 1; + cog.motionZ = rot.offsetZ; + worldObj.spawnEntityInWorld(cog); + this.markDirty(); } diff --git a/src/main/java/com/hbm/util/I18nUtil.java b/src/main/java/com/hbm/util/I18nUtil.java index 6476684a2..a4460f6d9 100644 --- a/src/main/java/com/hbm/util/I18nUtil.java +++ b/src/main/java/com/hbm/util/I18nUtil.java @@ -3,9 +3,12 @@ package com.hbm.util; import java.util.ArrayList; import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; +@SideOnly(Side.CLIENT) public class I18nUtil { /** @@ -14,6 +17,7 @@ public class I18nUtil { * @param args * @return */ + @SideOnly(Side.CLIENT) public static String resolveKey(String s, Object... args) { return I18n.format(s, args); } @@ -24,6 +28,7 @@ public class I18nUtil { * @param args * @return */ + @SideOnly(Side.CLIENT) public static String[] resolveKeyArray(String s, Object... args) { return resolveKey(s, args).split("\\$"); } @@ -35,6 +40,7 @@ public class I18nUtil { * @param width * @return */ + @SideOnly(Side.CLIENT) public static List autoBreakWithParagraphs(FontRenderer fontRenderer, String text, int width) { String[] paragraphs = text.split("\\$"); @@ -54,6 +60,7 @@ public class I18nUtil { * @param width * @return */ + @SideOnly(Side.CLIENT) public static List autoBreak(FontRenderer fontRenderer, String text, int width) { List lines = new ArrayList(); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 6c2967c35..255ebd870 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -314,6 +314,7 @@ container.launchTable=Große Startrampe container.machineBoiler=Dampfkessel container.machineCMB=CMB-Stahl Hochofen container.machineCoal=Verbrennungsgenerator +container.machineCrucible=Schmelztiegel container.machineDiesel=Dieselgenerator container.machineElectricBoiler=Elektrischer Boiler container.machineFEL=FEL @@ -1302,6 +1303,7 @@ item.cotton_candy.name=Radioaktive Zuckerwatte item.crate_caller.name=Nachschub-Requester item.crowbar.name=Mk.V Kistenöffnungsapparat "Brechstange" item.crucible.name=Schmelztiegel +item.crucible_template.name=Schmelztiegelvorlage item.crystal_aluminium.name=Aluminiumkristalle item.crystal_beryllium.name=Berylliumkristalle item.crystal_charred.name=Verkohlter Kristall @@ -3332,11 +3334,11 @@ tile.emp_bomb.name=EMP-Ladung tile.factory_advanced_conductor.name=Fortgeschrittener Fabriksstromanschluss tile.factory_advanced_core.name=Fortgeschrittene Fabrikkernkomponente tile.factory_advanced_furnace.name=Fortgeschrittene Fabrikzugriffsluke -tile.factory_advanced_hull.name=Fortgeschrittene Fabrikshülle +tile.factory_advanced_hull.name=Fabrikblock tile.factory_titanium_conductor.name=Einfacher Fabriksstromanschluss tile.factory_titanium_core.name=Einfache Fabrikkernkomponente tile.factory_titanium_furnace.name=Einfache Fabrikzugriffsluke -tile.factory_titanium_hull.name=Einfache Fabrikshülle +tile.factory_titanium_hull.name=Fabrikblock tile.fallout.name=Fallout tile.fence_metal.name=Maschendrahtzaun tile.fire_digamma.name=Verweilendes Digamma diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 07b6a32ec..57ab1c9c6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -314,17 +314,6 @@ book.starter.page18=vær is just a guy who has been trapped in the grey void fea #book.rbmk.title16=Meltdown #book.rbmk.page16=§4§lAvoid. -book.lore.office0.title=Letter of Resignation -book.lore.office0.author=Kosma -book.lore.office0.page1=Management downsized our department again yesterday. Those idiots only have themselves to blame, I don't know what they were expecting after the Panay fiasco. Who the hell leaks that sort of information? We're losing millions and -book.lore.office0.page2=it's ME who's the one out of a job now. I'M the one being asked to resign. I hope you asshats finally learn from your overabundance of mistakes and take that stick out of your ass. -book.lore.office0.page3=I'm not coming back on Friday. Just send the paycheck. - -book.lore.office1.title=Note -book.lore.office1.author=Jonas -book.lore.office1.page1= -book.lore.office2.page2= - cannery.f1=[ Press F1 for help ] cannery.centrifuge=Gas Centrifuge @@ -515,6 +504,7 @@ container.launchTable=Large Launch Pad container.machineBoiler=Boiler container.machineCMB=CMB Steel Furnace container.machineCoal=Combustion Generator +container.machineCrucible=Crucible container.machineDiesel=Diesel Generator container.machineElectricBoiler=Electric Boiler container.machineFEL=FEL @@ -1560,6 +1550,7 @@ item.cotton_candy.name=Radioactive Cotton Candy item.crate_caller.name=Supply Drop Requester item.crowbar.name=Mk.V Crate Opening Device "Crowbar" item.crucible.name=Crucible +item.crucible_template.name=Crucible Template item.crystal_aluminium.name=Aluminium Crystals item.crystal_beryllium.name=Beryllium Crystals item.crystal_charred.name=Charred Crystal @@ -3781,11 +3772,11 @@ tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port tile.factory_advanced_core.name=Advanced Factory Core Component tile.factory_advanced_furnace.name=Advanced Factory Access Hatch -tile.factory_advanced_hull.name=Advanced Factory Casing +tile.factory_advanced_hull.name=Factory Block tile.factory_titanium_conductor.name=Basic Factory Electricity Port tile.factory_titanium_core.name=Basic Factory Core Component tile.factory_titanium_furnace.name=Basic Factory Access Hatch -tile.factory_titanium_hull.name=Basic Factory Casing +tile.factory_titanium_hull.name=Factory Block tile.fallout.name=Fallout tile.fence_metal.name=Chainlink Fence tile.fire_digamma.name=Lingering Digamma diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png new file mode 100644 index 0000000000000000000000000000000000000000..a229235655dd496e11b1cf723292f5957f640d4e GIT binary patch literal 965 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIE+9%r%}a zjv*Cu-rfn!TWlc08W6m3Rf_aYkEMT(-}T=%F)i{-a#ZP*LsJC#%=Q#7;m~w?_Vnr< zhLv}CHF;k;P7nJ2L+(o2x@p&+pJF`_v$Kq`+GL4I&0f9vw{MvqlqmknDJQ*Z<(5-1 zy6boMn0!22E6QsWe)_ddM56YYtDk|~gseO)i1Juc{1Ue3HbytgLEZ_{}!)^OGU zsH*rWQ^LBK-3_v{b}=

-qcaIak8Wx+RT=fB&wYn)D!k*I`9f^_oEat=tT+1Q`To zFf<%sVPLtYFZ2wX)f(YoA%(VRA@dVqg-6o2JH~V8F=G$jQLr!+>2%H;(^7iPh52 zKlkjIaP8R5*Bhgx+jkwC7V&R=>cO=koB3+}UM56-c(jJY#L%x>`|6e}^KHLd3Y|wX z*W_8*?yGu@4lEAMEezR$481~3YZjh3-%uU)*=5h&yt9ApnSMXwVqhv}{m{L2f8+ms zk3PITzj-H9#+1qPO*tCaEPqCJGi3AtIS6NNR=VJ}<=Xtc-z=rHnS6VUpC`twJiqVR z#%(vA>xZ#uo$qoGetaf&Wm@*}TUqlf`H-E1-J1xbp@Fl8L*z}w+Fs|_?r@f-tr3DN zY__9^TB)mjoyA2)7LZJW}z{`%A6=-p}($?NP6 zCOex>4V$_8Y3cNdYWsGwE^vI7RT<3BXgc-TjMY!S?kr+72wxX_fN$@TFL!U)?3CW3 xXrB{#OqXGHB2wbBe!>MxI-oQ^1VDrDZ-zA|l5bskX!Ql;Tu)a&mvv4FO#lNqO)CHZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png new file mode 100644 index 0000000000000000000000000000000000000000..cd06a8101569e193ddd3e45342a6e085d93b2235 GIT binary patch literal 947 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIE+9%vqi; zjv*Cu-rfn!dTb!Tmay|j$VtZiRsix@wwh}qpBcUJRk{QA$&HL)h-up8WaqwdYn7H8-`wUztD1#hqW+_T@;@!Xn_-?!$mSi{{5 zNJjGAz0K%QJgx5YX6A_Wn1};E|NhJ5Y;*Y*o<-Yqb_@Y~ufhCRoL-*SKjsNcz{`mI%<{Jj7r;pOPnHD(e)ooK^kb3+m z-5cmxsG+-lOK!OCX}Z?;)63Gii(lp`U6{6Qj$MkHh z-MGOND7pUn&(9IN)gl&!&wo(nsH?U1((0$Y&s$wzopr0NbHI^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d7bf72d8e5a040e4919cbfdfa1a63a4f6d0a35 GIT binary patch literal 5796 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 o>99N*;~3 zVG7tY@9+)%?WuRM8Ntw#Ll*gwtX=d~?h?O+*qQWk!0Y;s7lOB+MP#%_o|LmztNHuz zqenmsvNPHD>6rETXC<;S`lPOk0T>fI#29>zsgN;J$8DHidZ2k&O!^EP`lnhMSd;HK?j|9`Wm~-38uX zHyho`Ps_MxK~o^>X2Bk_k361Gx8S)_B+o~+1eTCY`}#$$^@WvoAZKFkxHfcJ8XeA? z;sG+EOL2mseDYeEBuN?kcG=$%PCI2`0~Mffz7ibD=|b%+1}=$7iU#Y=DS#>#rOjn%5P7Ux7DQq^0pz@mb<#@L#+4qJu0RR1B|LItW%!wl#i57gl{y zr+CQHW5ulj!s#8PuonFM)NS_mNo2dC-ZbDVi|@^O%jfogCLBovEb(!dzM^=aSD+;kjC}mU$qwH zWF-DWyN;qhsy6v{h;`7`Nio8P$}}5l6vX=dlT0i9nK=jM=^az!r^wbKTSX5&aVZt` z3+-t&hy}zueW=%q2fBi602V?e)h*)gJ|7vFo{Ge)@Ur0sJ+$ibzB03kU`#Ul_|#4; z)oVaG5|w&^!s|hI3f-OwCmho)08h)Z8Id9GyP7RK9KRPNrzFg*qmB{wA|0&Mle9PY zPc5=M@BzY@TVGd7Vyr9U0er2!*6Pc=TNW4#LQuJNMMBCk7mF^9bo4k~8gn$$3i!vlQJ4Q-_iN6ANMZWSOJF;*6=I3L|=eB}uWDK{AUJ!Gw?e;77!Uh$9?`|6D z2NLwKI3H;`N+`YX%@U@I5wvU!P*P&Byc|;TV1mmc-PJV3rMV?(&_eLf&x{XRug?eA zE}-pQ>lKfFiXjI+J-HtHvWvz0qQL37P>h)PYO7LdpsKtMn!`a%Bv!XHn7nj4bCrQf z#Bq1SMu&+GZs&rrBy38xL{WwtYlJwunU-@g3g1x|gG!~zT40d-Q-c^nLdz1L>*u_C zBT3IoC%*@kTvJhHbcF;8_NAVsV~Q-aysUK&UUSSUkaOa&;4yQQ(QJA;OvS=L=QkG( zN6&2u{>l+)zE^32a$zx&8jp+67_($aeu)&i`W|oW_>->J)%rQ_3d$Wq^xW9v=)Jz# z_sR%ppEJ8g|64z$^jjNDCor$TQYOoRPph4gu$ApQLk!T2D34mU?? z044}V+*-qbqfj>hxD-t%pHRwQkH+&AM?DQq|0)xa!4E1#Hg_`r3QjU%w)&H<2wB{C zM4@iA^bl*_2Ya){dgLmyxBIT4r%63Klo^A~#Vu22+$P6DXG9U?Pd4c81zoM78Dcw- z%)I`Yqy3kiGFjmsSYrE*i14DL*!JdmEJ1G~&_MY`%4ZJjFS|C~;fBkvYIow?W^*sa zO@K1_U1z`a9^#evbVk^-1%<8%N9Pdky=})=M^wYKSp0Mtgf_(N^vk1Tbiej^ zaaB0 z{39ixANPlXok-Hg?4oxRbLi=$m?%{s?XPxgqhp;9wKP|9=xOdQI}wm}^*>u0(_*=Q zUjLor`ODsxm^OHFFN}8gX?|a18b!cq3eHi}#s5Ck0%|$ieBQKEN&GpOx$iP&mG5B_ z=ZCdtqYcjsXgROX#d~)IZ+Hw1)*T8FEkm5okhX6}sw;2FUI_Gx!{A4cxPZ@#HwPlq zaLL>`PxmF^JIBwY4yweX9R+SegKuKk?tD0{48eA`BL+-&)8E-JOh$U40)_30u4gED zx=LvH^v=+%>7B-!XlhVR8ba*yi$Mu58_lZH5{?hIt8W%~uw3EfO#uz#<5_35fs#B_ zzc;=Bh{tPF0=Zetq{%ofa!y{qiRW_AIAHG76V!{4(dZI^39Y_EI^w-5lmwl|5?y9} z{NRaWFBU9a$0&Dx3$!K5$6;GLXBP>z`TGiix{ugbsz+Od1Y4ByMP5RoKKimkQ5yG8 zjMc@~TkqdFJ8+o)CTTYFkoaxXF6LmitcSyNU>3GMB*i^u(Ww3p+2Mlp6Y}EuJi4oh zwNvawzvG_`)*6sMSH8ghHTM^q$3dqC1b;|tEnIe;OgX+MCqy8j_&oDaNIYUbc<-tG zdJxPG4mV;3D&H-c&ZEw|>FOw*2WL2e5wYqJ;2EfouFqLy)#9SYc^;9$soHzl<7D$> z9rE2}qzyM#y&TanQ(qM>4iScn7xyrVBFm5BXNgpzlr=jOvSx`y_C&TUS;jh+C_*T*he}BHgsh`1(_{}# zwi(&RlAT$YG4IXqdEV!_p6mVpbSjT&R&pOav%!bu=lkW$ zWVHC9Pl{o$$2BU{iQAjrsGH7tH5~9|E*oh9Gy*=T`4^Gv9U1r-gWT__VxAok2E*4`=l9ZNFlc(=^n!4cf;EcPQf zsAoQ;T(69aS3V^1m7A{JW_@o20YSYLz{1bmY56lrhg-CEPeKT1d0MftSMiski|*YA&#tTs|x)z*v#&-52NXz z*V5<>p(g~idhWbwdyuHTndz3@QB7a?G)}DXN@cB8N(QBfY}Gwe5}ULhUBf-AKXv(T zw?Lb+^Kpnc(kF(kCvj*KYBN4v7>{CfR!%0H81SGZ#fml?`1o?F&P$LD zxB5d3AKHdTuA5iQvEF?%cGp|1zfeEXx2D%jO~>rPqtyWxjVrg^(K(Gj2|WFZ5ZA_b zGwg5E!mclI!WkCJK#t2>mlEZAg??=cu9NfmzYK82R5WsW9KW@;Up7dE$%kV?^NJ)B z`~19|cJp;U+SW8p?$dJk@@k|WEPWW)#w+>|iTW0=FAb<;PP)1;LpMC{b{k4uwK7vp zb{}`SnD1CU);4g}z_vJ3rlc-RWK)qMYJf#R3YFR$N=KCD%&j+5ke+JK&TgjHj=*l5 zId3iCSRxU&Do>{nvCEbHV?g$VmcbXen?K6GWy1zWP1bY?&;gI!-ly!GgoHmN(0lw| z+mgoyUY}&PfXJ`m67f7r3p9@oZ>XBuErz>N88ZTor;6UB));j8v0h5Farwj8Y_<`E zal&)n^)6|P>t=2aq|G*>fHJM;aAjtSHj?*Qr!L=ntq6gf)O^Ram1ebh2P-Y*pE#0k zY=E!p*RSa;T=m1=vAmI2dhbB``>pa$>{#BTmQ0Ty@cl}EG}ICpdcU@d%6Wdi^aLT@ zhQ(IXBKJ~OBX>%@LAJUsy83-EofgXJ^2_E~?_7*r(wWt^eB?tlGHtFq1C8GjEp(OT z{bY4HN@%KeZ}sd_g~@yK(#HBC1JB3CM*Y%} zw>L#^mYe(7a<@y0rs;DfXhjJLB{}-r;&*qJdwP0aFXslYeevYhNYcd*OrRGP|rEqJ`ox5n)PnC1!QgP*4J8tD?cl~ zUdKyU&M`JyB?j$1?)-w5I`tseLF10JJASdrR~AB5*tS4)XpxG*T2I5Kj3X-A1T87S!I=O=#ovV*0$ zGg&p1AgQdJ^9S=rGu9QZ+$718nreZ8U$JX`>cG>}+iOyZ5zFY#nq|BXT$Ey!t1EVD zx65nJneWwKNp9=Yoey|+6Z>@5TAzn|{8gICJjZKN_EQyr6qjl5_UUg13|x%scv(4o z{_kl8JEEJajEp8bgDmff^z`)1yu6~Dq64n7PiGWrD8GL3%*@P?TKoU}5$ELOgfwq{ zzr?SGAayOjU4Eq&#v3Wb#1s{2UYceZezR_ZuBy}E6NwLIP;VO^=7OZ(|E<89T{P$+ zmzAGiY*#t6r)I)+KP6%<6qobo7C#E8sJg1^TFt1Fr)S~=Oa%vnx^J2T&(Ro%bL0Ke zFedAKDCv*)Uza)yYg{5TjRbKG$>ScuqSHA);n2@@n%%@}Zr3k%4V(ZbN+)k&ECvQh z`=eXdyL&33gtG7WEe7?-8HJbn=fBTM*IJ!G`6&3#GPSPF1fSm8+PZG?*ntP_S2}Xh zayFq;xX@HAOK{-?TZjc)ESq4L4}XPilQx%@S?TSf;$ln7#j?<#?Li$GG+!5_fwNt?{5FQhtb#uj&x7c_}8Iw$p$ zpgcLNw0z2f*%AS#Cf{y+>U#+h7rG9?sf8-;YzSuY&QymD{Sj*nL&10eW{TQH!Zo&69W|O?CdPba<--!AN<(i8$fHJ=`oa#Xht``a=^3E zQOlR604^It`TJZLxQ}fHaI2|cJKrZSv<~6Q<(W`gD-zD*+k)*FknQr7i>cW7hDFZ? zpD^g!=0VB2?$TA<|8ZQyw@9yH?u~dXwE}I`t@(!OD^K^Z44M|5jCgL**ZQT_DjG+f zXQLxU+XrXscRLEZ_`NYb>kE%km>z7ol~oTj*iRKiWX~~II`WCw@z5Q`xSs&Kjydn; zF56iB?)HJJtOhSlYiW-z;7~XEsaL&`-XbIWwC_5wZ}t8AirzUnMsNypwg*5qDZ#vnM;#p<(eEa|e?RWSe@m200YQ?Caj5$InW?R`vh{m3n_8w` z_|2mPI@jzjV#Va0(UYR@8IGSg@kH3=fp{oK(4@Rfyor9a(DgTtQ0@;@;-jnIM3GaM z4BDq`T4YiYyT7Eu@e_*s8xj=Nicewpdf&cx8>T$xkyhihUiJ-l0ZC7I|EI2T{v z6pc5}5$>URI@NcsW8fflXew)JX)DCUl5mObqD*-(JEBWpThLOcNU711!j! z_Ej?85t+@)zbMmR+@=US+x_E8I$aZHD@ea0UF@)e^nB464doKg)zi2CPH`Xn5^roU zQ;Wo2{@l>e;1uN*9Q-#1ZfR-xX3!NxVID!j3oM%A-CyCh7t@YcEQ=6#hvp^hn!iEW zR3L3VJuEUZG6xay)2EI{P{#L|Wpvv0WUL>sIM|}I<`~bkutoOq)sMMf$cQc%`dX{x zXerBysk`G@oAphxtWGsMTo)@BcN>zOWw}q;yx5&KR+RCay0c&id$-C6plf!z&dhi% zR!TJOLs%hKIFBE^JkOohZ&S(M^}$aN*16GNIpVFfuO0>|__{HJa+Bqqz~x5A&t%rO ztavu>?=Ig-e{$b4C=Zn!zI_(#$G@r_4Gat(68=~g6%{FjY`cn()kl39tA<^Fk99SM zthP8Fk!_QLkEvh(Qoa6ly(zKUNF*;R4tMbsK3_ ze#>78jxVb4zOmOno7fscQq{`H#(P>Bujz2~3K@)qk8C}iR@m83#(PAGYG8EXl$bg! zV^#6OUtM#L5Rjyq0ry&v;GlVeaIIl?($k(ThGyVf#$89;PugM>gVu#^+_;f7i=UrQ z=~N!D%&1&e>b&ZZl+rumN?_(dk znwhTBqKcnhJ-f3ZLCQU&N!zH@+HIud^6>E$47#3MCKZU@yLXR%NH!}wTYq(u=)7Ja z`t@VktP}bou7774Q-WF6b1<%q)WyIJhB_o!K8##URweLMEN|B2Q^kiULhlH4l=V;O z>J0=)S$pa=2u-=Y>HInJ7NrKBL5RM=LAXHo06I&=5ccgHtxr{}!v6b4gg-jGjq#=zQxOd|^JBFSI(!UDN4`ovbE2xX?Nj&SnotUAYDR^oUnE&7?2&zWs-e=| zZ2Ink*V@_M*M<3?uyT03ghhGn(v_C?c~JCgaP$w}3I($$=`Vuc<`M)Xl<-H-C+R@ZNWbqh-}5(1`_!A*)Axdd6>BI$Ebq=v^e{rI=E;xs-#mB?xA5LI zd0ZHnhxf;bkH^bV8Ulm%bS%oax5|oL>EvsSns2`tidIko5Zjvr(I%h`CO?!+E za~)d6-slsF=(PZbCsvpb`sc!^KiNn-35?{i-`zG|s1Czq(=V^*b#iUGR@hSQ*H2#U zeQVCvw6iTwfO(N~`#!Av?u>t8-blc`KPp-X%;YT)sUJ-F?xVb=8-}WU!0TcmPdwtG z?L8{q2C^$MBG0ts<+EMlax6-y z0bXyZ8o`e`$dQ*35Vy_flrhHj6NdP^gAQMNO|}q_dpepJxW8;go#twHmMibC7^6$i zUMp*}6g+(r(DUknQ%VHh;Kkh4ges@?aeEpoGJGRuWlnSNLTbpi_b+W<36*X_EPA}C zGnB}+cE^}Ty(N-t$bGApw*5$~bB1<^tf4{jU}4>=;=a;#2#vkAip;c4tE)K6=THpa-qWU!WK|&fg6Hm<*BKvIvKLdgOMX)Yp)7_ z8eYk-WDJs$|GCcAKx1yzuS=aLaZ_@VBhKG+g^DxqpFE>`CF8~tIU^$@b*`hx&3C>h zD`$yZAZlgNkF2Xp2bq-V9>lK7pEY^zp<(n$9m*H7XUjQ0uu*`GI(5l1bl+KK>Kax< zr$FEdmnSn!S_Tc1oqwpBVQrC&Eu{-0KFb*{$nc0}?3(Bq7Zjl-q4|gW3YC8j(Rxdj zbWoFKD=;Z*4UCc>#En4P$P#v}`?4REyF^M(#s|3?tEI6)lxAl7GM;xWKR(^MR>>K% z&}amrAu)^}W5p!^(mUm5pWt9+K|n#hv@SmsDV2OaJ8euL4B}Ac8l?V#V3FhLZ+oMKcB>+q zTl*#7iWw>bUjAhnUs<$yU^^#^JqV;{^)s8ldtUN`K=Y?_awUwFdvv_KirqpB@n=7N zBev#;*M#gQszt82Mr0zevaVmj>}wOqST+^1+Pw???T&Jo2Zr|w*Q3~ry*-feozFPn zt3jVs^pgyGw^E5~-~PxVHwW2RbCYvb=F(9Gp~a*T7d2V4)(Bcczy;+pw!3DJg&0}+ z*#+Bl$q>2WA>6WBq@bPUbS#Y;A;Re)KSVCO%5s+c7xU{-SnC!|Q--tI(r(5tg5;t( zr|z(z#8}kT@X6-)g^2x~H=8X~n5+!CV2@aMxW04UA>kWzP7BaqfA$vFZVR?GvHmd( zj~FNHEqK$01S4W_H%Jq`V(s1|9$5%mX$v`0V+7N85X@Q@9g$&GW8Q@ETI;eJ99AWQ!wy7-@H)VQP&_|J&t|P1|s)Msh$?Zcl~F3o!4~|5*umq5}b`-#c6e z|DnJgj1Re&(B63HukXYm+)7B$2HiX20dB4%AZNjnD~ojy5al0-;iYVe+{yU7n(cM_ z?%JW)8;1Z354S@=rlG*P)+^A+LH4MpY}XKw@g=CFf8y1COj|z9e`vNq@rMl7@Da`Rq-d?{72R#LD-c8Lwi)R zO$iWtZ+h;{il0T-%O^`q4UC-&p<#9gdkbE&P4~wkeCF%~Wpq`3-5#5xHzW zc;*{NQ2uV+cA-VrCEC8dUyL&vytV&1p%_j?cBk;;N zjsul~H-6i2`Tc*bE2I`lmkeY6FQ9b-@eh3J5F(m$08V`e&|=@9JG>J3DqcVo@0-- z0H%ve>yuSETq79}g)Hs5&J#7?1Qi}eI--)K6cy2(3EaWtxr|hD)KIap-|9reyFA*$ zU;#fEVP2{Ql9An|gJYo9firwA2B$P(hLREYL&qSHA$j#Xv-{Ml!?S5?6RS|~K1}V_ zySqzzo?oj_AQ_jcJw&JF&#i<5_mN*g3U<9V`#`uIc!D-k8}fk)^J~%IDeY5w&V_;@ z&5?@-COwGnYuJ{5zhjk8VjZ2V((5}}a5v{ApJ&l=Mfb*bMr-Siz9NS&x zFbH)IN85!iFD<#l=N~E#e2ZyQP(NyFc*ZsS4)e_6@oP@EOjP2-@TW{_HG+@Bnc>38qG6{z}|a zdQ{!Iw@i1A2rVu-Jag^_cZs}pZpf~JmApuzqgKgtd;_<=U46f0?IFQLmE<%7w-j!r};L#>PZ=|OPo;v zCw0?!@y*H>f|Y57GN8!)V~&itr(MVkqW{&L7Xf&Q{;i*6$d6eZ;Ktd8qvP48PH)g{ zuSL+7Y3^68EQ}*6@&A~Ab{3s_XnywKx_RgVjs~wp-WoF@AFu?%3}831eSZOGs215v zhyc}?C%GAdz)An*aChHR%>Sim?up#Ae{9WO`0_AhgsDYF?5zmCS>{c=W>O_9EBp42 z!{59wOf$2SxV1hxie~c06qWDgwJMl5#`#;JU6a(MrO8i_94m!NV$WxA2*O!zr3 zRk7sWf#Y>vcF8y4=IS|YhnNOP75Cru3BD5FT)?^+Nu=K*L$tM+d@FY$fD=C?8RtQG zu%?BRKH(&gQpiEZsvoXWt4d~8r#TgKnA3P)lvZxhIgJ8ttl4eg9r85xmp?63EmC%c zh+tLc-&nwkaa|OfS{!V1GD!9@h%OSG^7=@l3iMQwUDVdOEc#x(oeQiW{wpsA3>Vk& zBcN78A#VYAc6D{7=ryIKrGdz>{=1zg=F9Z7Fr>0|_u@gU1@sHBhu0R}vu_*rJNK^C zJHFJ%LnCvZoSyT|vMP^R+v8XCJx6~0=a?!2hw|YEwL{pKR+yU);hcM_uI}w-^8`teB;wJLRL3oujhWAO1P{Waw+(%A7xIP zPt$nqAh7HH+@VZEd4!RvVG#YHrr`G;uC&q%N|)NPVV|}ZeWodCvv^K?rGL2h9rRwk zw|febHpo_R^K+7B_m)D}{0^lBCAhplQGzeF?uQ}N24sOAj#udalYhYup`5;Dy+ems zd-VZ z{o)UuLMT8;u}wDqS4RI%HDtk-T+H^Grc9Nqqt)iWqMJI)Ch#uqOM;8UdYn%3RG@c4 zI9Rf|wdbi1i8)x<=lU=R5f?$byVL$v2|%lDB@A*NwKUvby0f#c&i|X|s2vx4>Gury zkFz4xGF(RRnhcYe;;E|=uNN}Qo-Bt!EbCwfrgRZ2Xiq`}&+UCD&slc70d^@szpP7(V}EH_09&+gIVW%KZ7{@s~gGtP9jK zFYzd+QW(+O<)&9H6)PvdM-JGl9z|07`2t{jz*$tMp`?AWR8*1jmLwl)SJi7LG}3V< zI8RNovvX`DCn=)mswkX@tnH-2QZ`B8L@uqGYrFzos2YVSDEuQ9IgIeK~x_mThZ>6IL`v*!cS1I$6-vmw#R}I!iBB-eOrE8J>=g`WWm{ z@v@obw&fNE(NF@X|2(DUWO7aA`F`sz5lQ6;mP?7JQp0vgmFDi(z2Y|XVxO!E>UOia z5^l#A_C|;42)5nQnGf3985;kwFBy!fTU~&X3TI*!Hh$d5`ULjhNtRr#*+mJkB{h}Z2DQ~%|%lcHJ%27~Z}j)M8hil1)5 z*mNW}aMX0=NaU_XKI2_-V&BIh>;+6$$SO8_^>oh2%ni_q@*Re=9p1hGQ#$g4&O>=I z48ph6;C;IvYo82i@!sh$pZgr+l1Ddz06gzvZ|6rW;e*25PGF={y%zG%eJ3LYQg1Q>dP9 zufYNjVNhrP_ve?uwz18(LL@;Z;2YL%49JnZ^g-Dfr|{%*K~}+f1jRt!fgj> zxYx^&ctW5pL83K?NYG}lYqMzGJPFAQT~&O3>5*C4o*hJye8eHJdQRdf2ZICtj6kH& zpL_41?2m1q`9q?r5?-)gV-Juz5crDrft;PXj6zIJJO^vzKKs9e8_G{nnC(d#OGop< z2$rq;JC)r5PRg3z_>$s0{T2ZSzg1ETq+e~%?;#Mc6q4v%>&F2*&ySk*RRj$Y zXkmNtQ@6&SAIMJURzJRM^c`d&p5vd!JwXvn*6^h%8245b{E{^+u&Yc3HPCLCM=W#< z4%bxrHN~Eo9!L39i8C7xReAE+V$gHGvs=NSm_ZB!MS;c&896!a(vk1t`2f#MUn4=r z>p70@Z{chRl;%EuT+#Q#5;Q3371JJ@~ zwBEFWGf0XJht|XL^$Vl$!PiZ$^P{q6Ypwwe^F%2m4Z>B)+g@@x=wt4dr%bpwV$Nh2 zo#zZKa+_}SlHNDY>8C%?|20s_C~}jQl6vI818Uf_v**gq6SND|Ypptc_yLoiB6ir& z0`vukUrj}v`otN8bg$mCNa!O;Kgh1SR0kdmOe0-6QA=0X#9F>0-GOX;d)S2A?$8v=p*{L`e#@ z9BamwE05R3&16clfL@iXtiQiX8g#9LvR6q-iPKk!QXs}jAcpQ*I28!2&VHBYXreZ> z`y-G7@c+QT8QmNxDbSLUPihI>w*)$=_&3y8p1NfNO#uQDZtF2#WOfnsZZuY0$p6v0 z#;L^t4je$2rtxSrx@R+szkB60f-verp5{hoHgb$6dAMA7(LDzg4i2~M3}C^_jeyL2 zbMr3H4cXSa1?j+}M|ablEIt4kv9@S7X%^BJ8toJHa4FzexMWX04(V4V^84?{;7siz zsPK`9<%;@9ogrCJ$urR(1XVy_tT=a`qeX7_c#i6eef$PnZ-b88pHR?u<{9lua`sE-(It1OVw#50Q)|6Rz^T>#XgPC5!zB z{V3O3?21R+&l3qX-&`J*9XJNZnWw9Q`e@!~X z=5yP#3>*x*=!k}{NOfO9j@ffdCKI3f`I<8^L8A=mA^Ul^B; zXo#ihsWEpjog4p~yz(rYV*!-aKG-h+zW{huNCI6adXG=H;Bb0O(jMXN?)nE4=OS}W zWaxJu^REQtfD=d#7+|@ZsF93)76EMZT<@AX5Bq=Q|1UxRwJe>3W!?CX{Qte$!_iF2 z|M<}1nlt}j%Mw3@Ii?ySLjwM%Wg@&S$pW29(s=H$W%~o=K!hz#V{?uLgRT-I7 zCe_!s1PAtHF|wfTCuNjs_rln_3wcL8MavGeGmN^D8VP&@oL@muWl{%$vnKViP<;zM z`=u%m7p}UR!Q+Vf#bb&g`CnT&72}0pnsOa~;?&>;jCWJ?T>bH$nE2&PuJNQNUh0k*}yq?VnF9!cCYh6MNW5?01Dm{ijr$$j*uU9(_l9olHK{rEb*)(;Sy6ppAlCSC`XW;MEJNK*GDy7 zrDIaIV0x=cobVf+u;F^Vg0FZ*sj2}c7h?MV_Nl5N(>lxV&pFLq(*)hf5IrrU>lGSz Gqy7&KiNS6F literal 11227 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 XdpU%(Q53kX3%RYKr(UjR6ZO9UrOz0f diff --git a/src/main/resources/assets/hbm/textures/models/machines/crucible_heat.png b/src/main/resources/assets/hbm/textures/models/machines/crucible_heat.png index 19eec23648ca40ee6c168eb94a1b6a374464cba2..b467ac3bf88fe266258ae4c872c9fa1b3ce8a85f 100644 GIT binary patch delta 4820 zcmV;_5-aW0CEO*DG=GyxL_t(|oaLQcj3e1u$A9NiRlcFpr9y91{AcJ5p1-}Eth3y zGc!He>2|l>ZM$yg@NlZim$s+fF1x)G{!(i^cKvPFSKs;0_kaECoX>(0Jag@;eR3_J z9mYJqwZ@BkJ=#Ydq!h(5)`FA@YYZ#3D(!9uG5SUs>ecF8`M-R511X^HdmQw_;<#=U z^KvWY-RmA#HdeXUJ^~;~4O&U0ki2vd@zk1Mim%6g$#xjKgN;E;$vZa!4#R{-;L#3a zYM!POCp@~b%74whkVh*LUrX+_yKGbgUf*x?mh}dYZZ!B_E14_bSi`G(ZBk=V0~cYh z(}SQvpcUWw-@8MvNkB?TWOQl195t3PmX)Ay$0$xY43i;4cH*Qs##l>gEP+xyvRVh= zE$a;c!X#Y?f3MS{5qLx2d$U$SDR+{CC+lm889B!?{C{H})~MIGok$`hx!(*C5+2=f zC!nR|)!hTGUb$GftdxScZLAirZ`G?D^g?=ZLXw)f^S^n!2_oQ?gAgSZU~oQQs8J5Br4+vB z;rs3?rGKfxVzI_zt>wDFy9zdl7b+8e(w zfC{s#owzHnq(mv@26rmxg(1H07hE9)Qb_9c8bV04Qf^3_6ksa8K#-)V8BBI)8qPD0VYir4kTD@u~PqO02b{Y09g+2S9&@%-<(TQ=||sRCpe7 z98;}UNRyN#amF^r4RxNpNQ@zlT>y^anA8|Ntx-z3=c1S( z@JZ9uc?1F}`raX>EX}`q!L~GrTf7yF@T4S<{WQ-}z zKV~osM2TU)8x=%rE!9fJd4hB&VzQHuq8PF_j^Y?0g!2|_-KZq!CYlY2bx->P! zag6VI^uiEh3`)5nq?IBy#szOFu~3>1uvM$_=tcvZg@(ZQG1g{Y2^L#ih%`;zObztH z5Un+FoD{|?%Rd&w4m(}0U0yBz|9?-(a%0BLW{5E^@UGOV9A!hvSnDPaK;YtE94B~M z6DNuDV9z6rB0Q~!gLn!4F%J_`@>;XaZl?<@KW03=5wJzXIT6wBc8aT?8&_qsu)rm{ z`H%{HzZhCk91}(nLWQ#QYd%#9Dpxrb4&2xW0NjfX=*-w4K zCb(hl5@QcvD8BOC^Cxmo!hhI2Y)}tdcFf2{zSsAsFNs>M7RDGil%ym{Qd+I~)SxHo zVatvgy=-{q<=WIIHZrNq3n%JfNxkaEuW(~N{{oZ7d?g6n>#CoQl;ayNHfjV~aqI5E zR43JLw@Vl4mj0|GKv=K>#4&>%b-Oq{Ok{ePUlh;2?-hEM5CYH3lz)ZPptLG7_(45O zd%6_=rB^w%D^f$tZeog~Q+_mAHF4w5uw zy%H49W$JYCZ;r7MaYzr#63R5`=PSPFp|nCNMK25yqW_+GewCL*W%)yTScZI37{qBO zl_BoPqy)~xM*meUNe@#>6<5qyOBBUaDgkjO(P*WH^eiDnY5vtK7kTm4j?=@s5r6U5&rOxMhG{~l z+btB-KxzK!YkzmD#C0^_!JJX+Zp14|Lk4+%cVCp>V&8~+{gLx#bFg_1^ z==88Z|OJk1dSu*ny&-aRx&h@Za`QY@h zFijB{KJZKLwX-I!({S^|by6O7%wWg#u$Ap0JxeP!q&L-v~97cbDNm7(l)M^zs6HdX;PtYG&^!ECG8!Gjo#5MVyr;5kE zce=#Y{@%}@n7HORA%;0UEMJoq_9V@w4&8&v6sc3kAL`s_J6srf1|Xj3a5x+^U}kPIvrPmxr5Mp zdv1Ez$3Of*3ocmaK|X(OUU+s)mjC&2G3>pY6%u0r&CO=Whtv^TNh%f1S|wojsGGg+ za-^p>+zD=P*12(Om&fXBB-<6(ev+Hbkf&BX$M-aA6>mDeF`(dPE94~@(!=%#zU%7h zDu1i1t8#$c};xLL_`LK^jKO(;O6&VQ|*0pZa;bO~sqD!G2Ag^&`{jSvFp&6hvA zKJ2XUEZEP381%BSG3?rTu3f4^(Ec6qh% zjvVvkC&uvD<{GUq;v-j9_{%rOPyLI;py7@gERQ9%$lW5luu|i@uivB9i}448bJWKA@e_P?2}rXtwm;`d>R)PXqsW1@5uzW10BaSZXAnp% zhSj>_2Zud4Ot2Pi$1%n%mVZ{rYk$Yl$Hxrzj#bTOZQv%sx?jYUo6V4G7u;@*C^ar$ zT3ss+y}1|iSj8@sKi#d|`Czalnpk{q)+)T#Y;$FOg~(r<)+(g!F35mRobXz+ zU7W;0FJvvN@`Vi8tOX0@pCv}iBA9TS?M~~Ey>5?IFJiM+;a=+qCEXJ6m4Aw+)r(lK zRfy80I9cectBd5H6~-AWdwv+tT)R5xh6tP8l)zB0RypcAB{tuSGl;?07sbDwRR@D5 z(O{EzaxQ9LL@aH%G zdtvGSR59$$R!ffZzw_fgUVpj01He0f=Hg6-m=;sTu>6+%N}%z*;aU*jcI${RO3Rxuo3tzuJmDT?2H$G?wWumKFl?TX7mZvv@A(`p7zB)di z(_i}Zuh>)dacJlh`ao0`%KySAKVS#>fBKK#8hc`8WvWTgZ}ymV68}LcBQs4j*tg6o ztgRk@B@+?8Wq^$_uYWV}`V#q*P*$dz1ih$RRLe$LnQ9Uq?9&f1%F0xepqJg&V3D}f zI%Fl#Lo(6!YJEs%I=@n-9fo6Nrg6|0E?*)^Q<5ac_uK}ld?!Y}fH#Wc;&y(%K_QOa ziW}eamdc-m>vs>pukjxT5f;sU*CKp(tFK`LIt2{@FqPWP3iWSb;dU`1Y%jQo)+17m%4OVt9(6afH z@a5|_7NR!lW%uJM%Rg(#W$z^_%Rg(#W%t&ZM{l09gj{xSowEG1hRjP6U}!H9Q0xT) zhV}wUA&&LdSr-4SA(!1-r!4=hp=a4klV{;<(HOCohYne+oi zH;HHZ{Lvk4XMvgZu&Vavwq>Q=ZgcM9Y;ksIO;z*M!xjZSORwog z%ucg>{w&=B%3@|cY~E0+T(9c0!pwTuyfJS*Y*Cn551Y5mMu%BhJ#0~!Sr3~x7NLhN z0&>>gIDhlTti5^88Z+x*^TxdOuti~JJ#60if1!uX6+i8I*aE)DPrn{EPdqGon4Yy) z^dc}zuj(A{d*A!)V5(s=&xB#aT5F5f250z9YSW+!`}b?_kY{9wKZON;RSL1b04+P?X)`v0c zFa>Vt-@Dfw>~h1ef8}4r$3FHk+itf{^fWnZfBAW1*8cY3yz{HS`HOaEr%7tukK zLVwUb>|`x9r!?5CdRQlp=JvB+=PquS(!=t}A~(W+{`-&E-rjIGOWd@Jl+J9o@9w!& z1;JCl@C0F}i{KOnE3-apbNfQ^GhA9LY}Tz8+>pwP=|MFlM`}zFm&&XU%TH9x{=Z5H zRvL9Sw(8E%S(nbk{VtC^?mBfwoi4sscz;SFg){mzY05*tK1@oP@kFt-$*n4c@7?%5 z7cXvRJrM;vJ52!I`Sj!5@AUwju}+cC{ZyL`p%}3TZUzT)J|Oz57QPT$=I5y(VjGEBxeMGh=N{qI2KR39Pf;6?+tS2~Zc6s~T--42Y#zu|Qx-oe1$~n3R zy<>)$I;|+%D|*@d+?&k6aN4=MhmuXC5L~*nN%ydW&5m&^e~u%cXihZPsDB=I*1e|7 z@{2zqu)=b*-{Y-MJW@0^+BjDqd*a(y&e7T%?w&rC!OH%2+Oqk@$pUZO+sEG9CpB&c zy>xk#s58FN$S88dpLpD|*LRiW=fV2PKmJ>h8%}2deVV&lmo9Dcp)a{k1=Dz#`1B`# z%|6WgCBOFk3j*LXpZQE7(M=fB{}DbIP;#^UZFGjM*Xw-oi(i~hab5O)$9e6S+~4mv uUCw9Dd^R2R9GRC|*>QV&d(+qofd2ylq6vG3c*nH>00000VCDbL5G=GapL_t(|oaLQsk0V)m$A9NiRlc*iTo_4$J_73?=t?{_(Z`XP1InQ~{zkkkoEI5JZZ(O(UT?=T3 zF;8x-@q_&y?c)woisBq=K}v-+hLu{CcDI8#`9T@#)#_aNzkPKBDWL9q9QMNEylxcp zYAfZ}*FCOntg_oa1|UfdT1ljkymA=v{x!c8Uyr-Ub{M;pjX_Jv`!)iO!h}ZP(GFv3 zo~9EgJif8Y?SK7{$14(FOLp5`HmU({9<+JKdV|L|8vLl0%$0Af;r0DCsj;Ymo3P*M zLC_%3itqpL{h?zLkWvyEU79aX8p{~VO3=4s6sH`8$&evCaZ;RPtR*#;Kq($utpo6m z^#%Z8k}ib5-|5i^yrJvftW{9THFB`AzLuC1Z7jnd@qe&Jy~f={5*f*ZW{8mR_=anM zmXg=^4!M5qa^bR43f{G`S{&c1S2^s3^x}jhHFM{G=WY{3z-xygN-DtMe85nz3jXze z8;ikO5CQ~XF@T}!D{kIDEX5xQ9nasmZf{&!BTQ115Zu%o7-LA26d?uOZV#mtzUSfl z?k=UN!GB`0#$v7I-p&p``}rFPA&^pFEj;zEce1^GaVmbCBnTnUO0n7A#~ScGMPdx? z)e9#t`CKtJhP}~j1Mbe6)R3kr##%h7s8y>ZiR&W9T1;xN)?%@w*|`Y8O1%!k^?j_x zSc{Z$D!!C1Ql!T4^hUrN%{D7q^J+7sMe985GLx|a6Mt(gKorM#T9X=sk`gHdQfriu ztgO@!2oM5m-SKJp;EXkhqcA~ALA%{vgdL{FScBz3cdZhj!t8D*?#?SIQA)YaoeFwk zi0}IaS4e>rl6t*{5E8AF>(V9#n2IkDBx&lpW#(;-z=K}M=Jq9&lEpayWZv5gL)YDX z4}riK<9|F`h~fqaAxiPb8m!q3d2F@L-f3&-}%%SeBVQBjgk@}MA5A-Ufd#z z-H2AH1VmAMCccsqYb|M-^7`H(&>tc5&q>l0DTE6Zo<|(VRI3%zBqd3lv5j%v-3x-E zn_Fv3@ki1MfbB*VB?XBw#IXy&Q5=&RgQqo0DS!7~6cYqKX_`8ZKp;imJEWAQ`PZ*q z2B79?taaTuNz%eAJWtaLL!^{wt^4sW`wUNOOm>ruF{Sw<2D3nv7!JBoLA2IVtyG*R zNY@aPH9m@B$UZoVV}uaSTdZ}xt|WiAeauSW5?v{kOCX~NDJ4mgIHPA>I!O|YwOO}Q zsDJExq>@;iXO-rkG+3irI>^=YjYHXG^E)DXupzUR>kLyR#f<+_koiqsev zyrslKX+FSKt;*vY4Qv(~0^i42n|UQzY;hyfG<732&D68sSl z6H@XISLcD8}+5f41o2jkFO;Hitc1giq1SFN&ESor*#nrrEn9OYPEt=ia1V6^M6M@ zOt{H0z^yww%a0jSk{ZiyyIV9)DT(j-#7R=*QhB8C`kRtsZ{>wij8k|Zgu)_mrmr|MzLjv2kId*;)%sT+1;P?;A_ z)x(l{)%9QD`h0!?llpum2;6biPe;n}4VN1=0tQgUN~GoZIdVO0^Wr6v%me@G8{aIB zf9jdv2jJpL9h;5J;6j2ihJV2Ki|0v%cVZwX1 z>&P%AiXy6&3Q3Y+$>x{FjObZ1^AgYZibm&p*sOeTdRUmI2n-+otq<5)6W3|DdEz=L z4;wMqh#t1GJ)~!8rH1sZD9RpxWjR%?S|yH?LO%jZ@rU#<;eWBY-A`N(zTQthy-%Jk zaUJAVKQ)@TP94LbydKtU9w3Fp*#3i1V=WgiY)!>~m>vc$@r>hy!K}%c6yNg;BZ+Jj z9vpr1>!?;M91U`_#5L!iG}PdGr>+l6(-b)nS9JDTO7~Pd&zbT&sFWf}5{^0@v{ocZ zijs<2t>Q+)DS!BR1O0(TZ*Ly7p;8}8T!Ux(iL3R_mbliQJ3VpDaY_txdRV?DEAaiy zt*5_(e&Ex2uvY|nV=dK6Ff?^J%>&{%aeA2Q>tT0#hEA)^OW*po`22IvTC}3oYO$Zi zo@YMx5&Pn|zFk^Xg)_vkdFf%tosOGcA zxES_<%?gPzfaZ2Hjbyt5+wbLe zGvxiNp5uF(wTd?#-xyGEyA|>Z4C!G91J}B`y2|S6>fGe#aR$m?zc6Vo`Ln&gs%ec+ zYAtu0{ePjl=4q4^9CRZLu8Zz%0;A$8j4{}2hi+6dosdR7TN4UU zsdJ}iKzOu|TmsstN^ah3A*94~BZL5Y^W~phAAfdUcmeDeKn!}>*cf)>${O7$rs{j# z+Us%S${JEgT4BVcdWBA$uvT$P!++8>+_<`0ct?(T@)KitVsnjF81cK;R`}bu#t;3A z#Gv6u43@`|TI3#)U0SK}!#8(n^&BM1Q3W&Y=_15#_Vwa6@#Pvg=8 zO@A|t+(<7xEDr-%ulT&)Y?D?czdY)ogkZJe)6J$azS4wA3MlTkk6Eu(*gNjBRt;!& z!-ezD15?MaH$%ajy$B;bR)pxsAi!FM=othOi($2{_~}s(juNbeyK#&$i{+me^10*5 z*CPgd&#Gp#Ht>*O-7jLw?Pkc0OK!JDlz$qRFRiW>r{3NVd7@$$%Af90?tCyfC7L+- z-mF!4quJ)#`U-arj@a+?*sN7Z+g*?WojBo*X1i#_VJ~DYo8=1`uvrTh%0Ew>oEE`^ z$87gnN9=cdw0aSnwFUXjekNG$^YWF zZcb&jzx>Qc?4V3^eXH^inaT3>Mld8Z{mIwH=X3hYpZy(sraBG{eM%jO%0l^H{Pc(I zApbA^`MYBqR#v8(1pRi8S*P(IhB7kKM1y_Ttisyr=#flB_^tsq#vEth_!9Y(P*$dz z1ih$7RLe$LnQ9Uq?$eJj%74mKlc1Mf)?ksi*E(V)&_goO_G*1dX1cgir5%Q2Wu|e^ zm#$tRNmG&}#`oL?seC6!zJNE1C2TK?(vJwVfJ#|R-I?tfOjIyrOE<@W+Dmp=(*WvYn=3xehDC4VZ*pMkQV$SvG$X%F0v|4TfN;dx^^OCt*=jF1hU5I%W9}Ls^+=9CW^+vs$UR%>`LGt2{@F zqPWP3iWSb;dU`1Y%YWuiLfO)N6Ae~&FVM32lkkSfpCD$74_$Yt*(D$74_ z$Ys~onMZA&^MqV>ZJo0G^M=f)B*4&KBB0m{1Ptv3l0uBs)>#(+ydjreTc<4lyrE~= zOO)>g@`b_=oL2;De0J>Vez(y&OCohYne+oiH;HHZ{y0AW6@S$;>tR*x&27s{yWQr( z<=OTkoi}FI!?f=%yzBzD!A({3)Wa49Jxi_WMT}0feE%%f0?J}$J#5}ks$8w=^TNz} z*t{`sJ#0~!Sr41H%}#c+vU=E}FtZ*uZ!AI&TLk2+wQ=T+S!?s0H)htu=8bvlVT;1d zdf2@2|3VL&D}R2~^{@q8$gjR0Hcvb%dYGQIR`en;ORef0AN=44?O>{5GtY!!!&+;L zV}m39_rCYNsYWtAOKqJfjwi}Fv*N7ZpV#Kev9`80lJZRQ!2H2We(qV)q?z@wd54f$ z^{@|p=tFjGZH<>-ep%f7(~n!|SCi5*tHYR8m;%@JcYk-AgH>+$)K~vqeBu+IuTJcABKd{WzYrqq8>wE{8j@SM%Tg?Dy=nURGKUn`e=r zGJ2Sj&Z}xGH5%(xq!7iDfI+dK)$H)jC$Bo?LkPM@ovfthlm?qs59`Fy+(uRik^LL0`SM2LJ=R)Y`QcCK9d}vZs-vVEA(aHJoVQwQi;4ZI23vNm>9YJmuW(tsd)?Tm zvVXn3!Rls>t5-MK+1aQ0;Fx>&_Bq_|kPgh-%^Ak|M}B=+F~!Mdq2R)wk`gHeVJoE3 zsB`7o1@<2tV{mE4Tf0rx)>ioCZZl(TP32*a{Q9umU|I^?4}i+T>vndU?EUh9%U3q( z9d}8sMF~+147qdWo;uYi8O1SDx}WiqN`IlGpw|oWv>vJ!p65ULFOudB$e&g(i=P`@ zNKldgx(4BVf@1tZB zDFj!pY|=gIV6$`F%AZl>1I?)hJE@1AcdhBN{Nhgttgsv(^myk}j}?WDHZIi1Hh+Bk z+67ws!`0KLGFaK)PFps=Xe{v7?g4i9fYi7V^vcyuqR#k2BPWp?{?zl9y}qj~KM&UL z{qw&Ux#4sc(5HF2b>+$?AN{hcR4|Q)iO+uellD>GFZs=vUKRkK``qUWiN=`zkMO~O zlAGmkCr8+Nz0Q}u^rh((*JbZ_oHEyb$%BJ_(dB&P%tzCco+I Date: Sun, 2 Oct 2022 21:13:58 +0300 Subject: [PATCH 091/111] Updated ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 56868a7c1..ca6fe711f 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -413,6 +413,8 @@ shape.plate=Пластина shape.quart=Четверть блока shape.block=Блок foundry.noCast=Литейная форма не установлена! +foundry.filter=Фильтр: %s +foundry.inverted=Инвертирован редстоуном hbm.key=NTM Hotkeys hbm.key.calculator=Калькулятор @@ -1432,7 +1434,11 @@ tile.machine_difurnace_on.name=Доменная печь container.diFurnace=Доменная печь tile.foundry_basin.name=Литейный резервуар tile.foundry_channel.name=Литейный канал +tile.foundry_outlet.name=Литейный спуск tile.foundry_mold.name=Малый литейный резервуар +tile.foundry_tank.name=Литейный бассейн +tile.machine_crucible.name=Плавильня +container.machineCrucible=Плавильня tile.machine_centrifuge.name=Центрифуга container.centrifuge=Центрифуга tile.machine_gascent.name=Газовая центрифуга @@ -1905,6 +1911,7 @@ item.fluid_identifier_multi.info=Жидкостный идентификатор item.fluid_identifier_multi.info2=Второй тип: item.assembly_template.name=Шаблон сборочной машины: item.chemistry_template.name=Шаблон химической машины: +item.crucible_template.name=Шаблон плавильни: item.siren_track.name=Трек сирены item.mold_base.name=Пустая литейная форма item.mold.name=Литейная форма @@ -3245,6 +3252,7 @@ item.nuclear_waste.name=Ядерные отходы item.scrap_nuclear.name=Радиоактивный мусор item.scrap_oil.name=Нефтяные отходы item.scrap_plastic.name=Куски пластмассы +item.scraps.name=Литейный шлак item.nuclear_waste_tiny.name=Маленькая кучка ядерных отходов item.nuclear_waste_vitrified.name=Остеклованные ядерные отходы item.nuclear_waste_vitrified_tiny.name=Кучка остеклованных ядерных отходов From dd7695e00b4af50f7a93563656dcb7ff609e0ac1 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 3 Oct 2022 16:21:24 +0200 Subject: [PATCH 092/111] some NEI handler stuff --- .../com/hbm/handler/nei/ChunkyHandler.java | 62 +++++++++++ .../hbm/handler/nei/SILEXRecipeHandler.java | 2 +- src/main/java/com/hbm/main/NEIConfig.java | 101 +++++++----------- 3 files changed, 102 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/hbm/handler/nei/ChunkyHandler.java diff --git a/src/main/java/com/hbm/handler/nei/ChunkyHandler.java b/src/main/java/com/hbm/handler/nei/ChunkyHandler.java new file mode 100644 index 000000000..8b087549d --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/ChunkyHandler.java @@ -0,0 +1,62 @@ +package com.hbm.handler.nei; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; + +import codechicken.nei.PositionedStack; +import codechicken.nei.guihook.GuiContainerManager; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.ItemStack; + +public class ChunkyHandler extends TemplateRecipeHandler { + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + ItemStack stack; + + public RecipeSet(ItemStack stack) { + this.stack = stack.copy(); + this.stack.stackSize = 1; + } + + @Override + public PositionedStack getResult() { + return null; + } + } + + @Override + public String getRecipeName() { + return "The same thing but in big"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei.png"; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + this.arecipes.add(new RecipeSet(result)); + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + this.arecipes.add(new RecipeSet(ingredient)); + } + + @Override + public void drawExtras(int recipe) { + RecipeSet rec = (RecipeSet) this.arecipes.get(recipe); + GL11.glPushMatrix(); + double scale = 10D; + GL11.glScaled(scale, scale, scale); + GuiContainerManager.drawItem(50, 50, rec.stack); //TODO: center properly + GL11.glPopMatrix(); + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + fontRenderer.drawString("so you can really stare at it", 52, 100, 0x404040); + } +} diff --git a/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java b/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java index 00e0ed6a2..444489abc 100644 --- a/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java @@ -198,7 +198,7 @@ public class SILEXRecipeHandler extends TemplateRecipeHandler { String am = ((int)(rec.produced * 10D) / 10D) + "x"; fontRenderer.drawString(am, 52 - fontRenderer.getStringWidth(am) / 2, 43, 0x404040); - String wavelength = (rec.crystalStrength == EnumWavelengths.NULL) ? EnumChatFormatting.WHITE+"N/A" : rec.crystalStrength.textColor + I18nUtil.resolveKey(rec.crystalStrength.name); + String wavelength = (rec.crystalStrength == EnumWavelengths.NULL) ? EnumChatFormatting.WHITE + "N/A" : rec.crystalStrength.textColor + I18nUtil.resolveKey(rec.crystalStrength.name); fontRenderer.drawString(wavelength, (33 - fontRenderer.getStringWidth(wavelength) / 2), 8, 0x404040); diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index ba4c7f9bf..c717ee070 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -14,6 +14,8 @@ import codechicken.nei.api.API; import codechicken.nei.api.IConfigureNEI; import codechicken.nei.api.IHighlightHandler; import codechicken.nei.api.ItemInfo.Layout; +import codechicken.nei.recipe.ICraftingHandler; +import codechicken.nei.recipe.IUsageHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -24,72 +26,42 @@ public class NEIConfig implements IConfigureNEI { @Override public void loadConfig() { - API.registerRecipeHandler(new AlloyFurnaceRecipeHandler()); - API.registerUsageHandler(new AlloyFurnaceRecipeHandler()); - API.registerRecipeHandler(new CentrifugeRecipeHandler()); - API.registerUsageHandler(new CentrifugeRecipeHandler()); - API.registerRecipeHandler(new GasCentrifugeRecipeHandler()); - API.registerUsageHandler(new GasCentrifugeRecipeHandler()); - API.registerRecipeHandler(new BreederRecipeHandler()); - API.registerUsageHandler(new BreederRecipeHandler()); - API.registerRecipeHandler(new ShredderRecipeHandler()); - API.registerUsageHandler(new ShredderRecipeHandler()); - API.registerRecipeHandler(new CMBFurnaceRecipeHandler()); - API.registerUsageHandler(new CMBFurnaceRecipeHandler()); - API.registerRecipeHandler(new CyclotronRecipeHandler()); - API.registerUsageHandler(new CyclotronRecipeHandler()); - API.registerRecipeHandler(new AssemblerRecipeHandler()); - API.registerUsageHandler(new AssemblerRecipeHandler()); - API.registerRecipeHandler(new RefineryRecipeHandler()); - API.registerUsageHandler(new RefineryRecipeHandler()); - API.registerRecipeHandler(new BoilerRecipeHandler()); - API.registerUsageHandler(new BoilerRecipeHandler()); - API.registerRecipeHandler(new ChemplantRecipeHandler()); - API.registerUsageHandler(new ChemplantRecipeHandler()); - API.registerRecipeHandler(new FluidRecipeHandler()); - API.registerUsageHandler(new FluidRecipeHandler()); - API.registerRecipeHandler(new PressRecipeHandler()); - API.registerUsageHandler(new PressRecipeHandler()); - API.registerRecipeHandler(new CrystallizerRecipeHandler()); - API.registerUsageHandler(new CrystallizerRecipeHandler()); - API.registerRecipeHandler(new BookRecipeHandler()); - API.registerUsageHandler(new BookRecipeHandler()); - API.registerRecipeHandler(new FusionRecipeHandler()); - API.registerUsageHandler(new FusionRecipeHandler()); - API.registerRecipeHandler(new HadronRecipeHandler()); - API.registerUsageHandler(new HadronRecipeHandler()); - API.registerRecipeHandler(new SILEXRecipeHandler()); - API.registerUsageHandler(new SILEXRecipeHandler()); - API.registerRecipeHandler(new SmithingRecipeHandler()); - API.registerUsageHandler(new SmithingRecipeHandler()); - API.registerRecipeHandler(new AnvilRecipeHandler()); - API.registerUsageHandler(new AnvilRecipeHandler()); - API.registerRecipeHandler(new FuelPoolHandler()); - API.registerUsageHandler(new FuelPoolHandler()); - API.registerRecipeHandler(new RadiolysisRecipeHandler()); - API.registerUsageHandler(new RadiolysisRecipeHandler()); - API.registerRecipeHandler(new CrucibleSmeltingHandler()); - API.registerUsageHandler(new CrucibleSmeltingHandler()); - API.registerRecipeHandler(new CrucibleAlloyingHandler()); - API.registerUsageHandler(new CrucibleAlloyingHandler()); - API.registerRecipeHandler(new CrucibleCastingHandler()); - API.registerUsageHandler(new CrucibleCastingHandler()); + registerHandler(new AlloyFurnaceRecipeHandler()); + registerHandler(new CentrifugeRecipeHandler()); + registerHandler(new GasCentrifugeRecipeHandler()); + registerHandler(new BreederRecipeHandler()); + registerHandler(new ShredderRecipeHandler()); + registerHandler(new CMBFurnaceRecipeHandler()); + registerHandler(new CyclotronRecipeHandler()); + registerHandler(new AssemblerRecipeHandler()); + registerHandler(new RefineryRecipeHandler()); + registerHandler(new BoilerRecipeHandler()); + registerHandler(new ChemplantRecipeHandler()); + registerHandler(new FluidRecipeHandler()); + registerHandler(new PressRecipeHandler()); + registerHandler(new CrystallizerRecipeHandler()); + registerHandler(new BookRecipeHandler()); + registerHandler(new FusionRecipeHandler()); + registerHandler(new HadronRecipeHandler()); + registerHandler(new SILEXRecipeHandler()); + registerHandler(new SmithingRecipeHandler()); + registerHandler(new AnvilRecipeHandler()); + registerHandler(new FuelPoolHandler()); + registerHandler(new RadiolysisRecipeHandler()); + registerHandler(new CrucibleSmeltingHandler()); + registerHandler(new CrucibleAlloyingHandler()); + registerHandler(new CrucibleCastingHandler()); + registerHandler(new ChunkyHandler()); //universal boyes - API.registerRecipeHandler(new ZirnoxRecipeHandler()); - API.registerUsageHandler(new ZirnoxRecipeHandler()); + registerHandler(new ZirnoxRecipeHandler()); if(VersatileConfig.rtgDecay()) { - API.registerRecipeHandler(new RTGRecipeHandler()); - API.registerUsageHandler(new RTGRecipeHandler()); + registerHandler(new RTGRecipeHandler()); } - API.registerRecipeHandler(new LiquefactionHandler()); - API.registerUsageHandler(new LiquefactionHandler()); - API.registerRecipeHandler(new SolidificationHandler()); - API.registerUsageHandler(new SolidificationHandler()); - API.registerRecipeHandler(new CrackingHandler()); - API.registerUsageHandler(new CrackingHandler()); - API.registerRecipeHandler(new FractioningHandler()); - API.registerUsageHandler(new FractioningHandler()); + registerHandler(new LiquefactionHandler()); + registerHandler(new SolidificationHandler()); + registerHandler(new CrackingHandler()); + registerHandler(new FractioningHandler()); //Some things are even beyond my control...or are they? API.hideItem(ItemBattery.getEmptyBattery(ModItems.memory)); @@ -183,6 +155,11 @@ public class NEIConfig implements IConfigureNEI { }); } + + public static void registerHandler(Object o) { + API.registerRecipeHandler((ICraftingHandler) o); + API.registerUsageHandler((IUsageHandler) o); + } @Override public String getName() { From f833fd512dcc7c72b11bd0f5279c2ffd7c7c2195 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 3 Oct 2022 19:09:35 +0200 Subject: [PATCH 093/111] the commit i missed + safer DFCs --- .../blocks/machine/FoundryCastingBase.java | 10 ++++---- .../com/hbm/items/machine/ItemScraps.java | 2 ++ .../hbm/render/block/RenderFoundryBasin.java | 3 +++ .../hbm/render/block/RenderFoundryMold.java | 3 +++ .../tileentity/machine/TileEntityCore.java | 22 ++++++++++++++++-- .../machine/TileEntityCoreStabilizer.java | 2 +- .../assets/hbm/textures/blocks/conveyor.png | Bin 263 -> 364 bytes .../textures/blocks/conveyor_curve_left.png | Bin 642 -> 1427 bytes .../textures/blocks/conveyor_curve_right.png | Bin 681 -> 1403 bytes .../hbm/textures/blocks/conveyor_double.png | Bin 258 -> 360 bytes .../blocks/conveyor_double_curve_left.png | Bin 805 -> 1340 bytes .../blocks/conveyor_double_curve_right.png | Bin 758 -> 1278 bytes .../hbm/textures/blocks/conveyor_triple.png | Bin 237 -> 365 bytes .../blocks/conveyor_triple_curve_left.png | Bin 810 -> 1363 bytes .../blocks/conveyor_triple_curve_right.png | Bin 763 -> 1335 bytes .../assets/hbm/textures/items/bandaid.png | Bin 307 -> 265 bytes 16 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index 8295df32b..1ced99e75 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -133,10 +133,12 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc public void breakBlock(World world, int x, int y, int z, Block b, int i) { TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); - ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); - EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); - world.spawnEntityInWorld(item); - cast.amount = 0; //just for safety + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + cast.amount = 0; //just for safety + } for(ItemStack stack : cast.slots) { if(stack != null) { diff --git a/src/main/java/com/hbm/items/machine/ItemScraps.java b/src/main/java/com/hbm/items/machine/ItemScraps.java index 3e2a0f45e..dad82669d 100644 --- a/src/main/java/com/hbm/items/machine/ItemScraps.java +++ b/src/main/java/com/hbm/items/machine/ItemScraps.java @@ -68,6 +68,8 @@ public class ItemScraps extends Item { } public static ItemStack create(MaterialStack stack) { + if(stack.material == null) + return new ItemStack(ModItems.nothing); //why do i bother adding checks for fucking everything when they don't work ItemStack scrap = new ItemStack(ModItems.scraps, 1, stack.material.id); scrap.stackTagCompound = new NBTTagCompound(); scrap.stackTagCompound.setInteger("amount", stack.amount); diff --git a/src/main/java/com/hbm/render/block/RenderFoundryBasin.java b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java index 3cc464284..17917603a 100644 --- a/src/main/java/com/hbm/render/block/RenderFoundryBasin.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java @@ -59,6 +59,9 @@ public class RenderFoundryBasin implements ISimpleBlockRenderingHandler { float mulZ = 0.8F; float mulX = 0.6F; + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + tessellator.setBrightness(brightness); + if(EntityRenderer.anaglyphEnable) { float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; float aG = (r * 30.0F + g * 70.0F) / 100.0F; diff --git a/src/main/java/com/hbm/render/block/RenderFoundryMold.java b/src/main/java/com/hbm/render/block/RenderFoundryMold.java index fb29141a4..248b98c58 100644 --- a/src/main/java/com/hbm/render/block/RenderFoundryMold.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryMold.java @@ -59,6 +59,9 @@ public class RenderFoundryMold implements ISimpleBlockRenderingHandler { float mulZ = 0.8F; float mulX = 0.6F; + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + tessellator.setBrightness(brightness); + if(EntityRenderer.anaglyphEnable) { float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; float aG = (r * 30.0F + g * 70.0F) / 100.0F; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java index 02ae5ab5c..9df3a1fb7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java @@ -27,6 +27,7 @@ public class TileEntityCore extends TileEntityMachineBase { public int heat; public int color; public FluidTank[] tanks; + private boolean lastTickValid = false; public TileEntityCore() { super(3); @@ -45,7 +46,15 @@ public class TileEntityCore extends TileEntityMachineBase { if(!worldObj.isRemote) { - if(heat > 0 && heat >= field) { + int chunkX = xCoord << 4; + int chunkZ = zCoord << 4; + + lastTickValid = worldObj.getChunkProvider().chunkExists(chunkX + 1, chunkZ + 1) && + worldObj.getChunkProvider().chunkExists(chunkX + 1, chunkZ - 1) && + worldObj.getChunkProvider().chunkExists(chunkX - 1, chunkZ + 1) && + worldObj.getChunkProvider().chunkExists(chunkX - 1, chunkZ - 1); + + if(lastTickValid && heat > 0 && heat >= field) { int fill = tanks[0].getFill() + tanks[1].getFill(); int max = tanks[0].getMaxFill() + tanks[1].getMaxFill(); @@ -87,7 +96,11 @@ public class TileEntityCore extends TileEntityMachineBase { networkPack(data, 250); heat = 0; - field = 0; + + if(lastTickValid && field > 0) { + field -= 1; + } + this.markDirty(); } else { @@ -139,6 +152,9 @@ public class TileEntityCore extends TileEntityMachineBase { public boolean isReady() { + if(!lastTickValid) + return false; + if(getCore() == 0) return false; @@ -241,6 +257,7 @@ public class TileEntityCore extends TileEntityMachineBase { tanks[0].readFromNBT(nbt, "fuel1"); tanks[1].readFromNBT(nbt, "fuel2"); + this.field = nbt.getInteger("field"); } @Override @@ -249,6 +266,7 @@ public class TileEntityCore extends TileEntityMachineBase { tanks[0].writeToNBT(nbt, "fuel1"); tanks[1].writeToNBT(nbt, "fuel2"); + nbt.setInteger("field", this.field); } AxisAlignedBB bb = null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java index 1ec967d45..d66736845 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java @@ -65,7 +65,7 @@ public class TileEntityCoreStabilizer extends TileEntityMachineBase implements I if(te instanceof TileEntityCore) { TileEntityCore core = (TileEntityCore)te; - core.field = watts; + core.field = Math.max(core.field, watts); this.power -= demand; beam = i; diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor.png b/src/main/resources/assets/hbm/textures/blocks/conveyor.png index 07cda57ee2f05675799bdb4593733e1f623bbc1e..c9bd51ea5d40c124913e6aa7488270c3d25c6819 100644 GIT binary patch delta 351 zcmZo?dc!n9te%m9g_(hY!K3DNEs$a?4sv&5Sa(k5C6L3C?&#~tz_78O`%fY(kgpQp z6XKeYk#Vv^R#H+@O-;?z)b!3eO&=eh$jHdFv@{0?hoZ{7&j+NyKMB8wRq z_zrZuE9|u~y>^>B9|ICdP(U!a4PW{?A!D#OamVL?H zb1!bZFA|ZqD_xaEYVGDW-sVjPi2-72J<8m|$LeI&cupN^DNIQ`bYuPD7RSgL1{&PL rY^jNd7U=j$OljqWDXyQk<`3hnRqy9Nk1N8kFmMbCWoVE?7g1LwQ4P{wo4FC`k3h#YQ2bbG|5OM-BMy$184MW|vj@{nB zHUNHZ@ve&q24$cOl!1sa1E|;8+b7TT5wu2SpbSQ0PyjU@T<;Yz#`Kc4_Tvt9*E$YI z{vd+Zs0@_BNDQ9;gH5(Kd8Ut`H7WyTFcO0YS2YPsZd>{E00000NkvXXu0mjfp`l>U diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png index b643de4276a4cecba4fc102f8d8d73a16aebd413..05cf8986e1819fdc0e5533b61263cd2a141a570a 100644 GIT binary patch delta 1423 zcmV;A1#tR;1(OSq7JmT%1Oos707!i6eEOPRT@pV(flRb5@MUAZER6f+tQJ2^B}eDlX@@z-*ugnvFRA2AK(6R4zaSj zvMSbA|A?KV!=uxGI~SrAzJw#!JP-q?Z`pReChWu>*~8a;;XDqa*a)|UQ`ph4XB~*R zusx#)Ya%HI?SIerYrKfwn&WX%6OLzwZm)G9?6|qackm0%=jZFst8LNOqw!JFBTY zYuFFxq5V*vn>PM-%F}Js1lCjD`}Cn8Pt*W|UVlu8k(YVaAVwa{QfADud7T;a%$JOx zsU{iIR55Nf#W=1Q>(}qESI>B4cs(n4zIZ)5N7xVLX<^T_9&4c21mzi-v<>7L8wI~e zQeq&F)g*?C$B7x9^Qbc;vQo)NtfpkxPl|DCD8^aE*m(HG`0>cdJlK!Sb8;>?k4t?h zPk&ZF5LnNBkkXTaJXr$_yjV_n8+jHQ#0X|t%8YEjXfPv-CXzAj)g|N0SB#s6Vw_cs z&70A!OFzTwS;c;MJx6%HI8XS5ZBQOZrvu~z=MOz8$m7((K%Q@t7_nzPG>PGOcAFVE zqngaHzD>!nupeghO~q(672~*KYp8)GXg%&-`#^A>g@zi)Q%=C3 zJo5$^MY)_#h=Dvm8Zl;B?lS{tl);Q>no34*p-DzCQ4Cj8jJ=An@!!=IAE&$?+7GYi z@CbXRJTE>zZpzcwQ3H7r6Aa4psM9u*Zzm-N^5FCZ!?WEXGjK-f%=ot3l9BYAl7Hbm zDMrUojN^*2?sk6pIOX-w`ONFtJ-raLo;$aV0Z^Wxj&lQfrYRU$&wQbQfjmo}7+Lr; zHs~#~yfV5X zyj*xabRP10PVs!vdfa<|OK_e*+Y*$g^ufS-7V`d@E`yX9$P;M9$a_nl8AUm-Gb7I? zlF`dF$q0PKa5cp^s~DTF>Z(;2JkDo%!Ji9SPdLKoW$^`%`)foOyot9M(|-luq;24W z_lbc#w!srkiYI17Nu)EwbJ~&-+qz^}Pm0lLD#mfe*mTuZt1fu_zacO9b8*8LJoen> z3tp%52RB#>Mn)IBM%%yzpAzE-7rai4-m;rAqnv+f%*bY`WMriw8QoMdx|fQvS1~sD dACK1l{|LKB{5MFX#sB~S00>D%PDHLkV1i6*u15d> delta 631 zcmV--0*L*S3xWlZ7JmRh2nGNE026)pmH+?%1am@3R0s$N2z&@+hyVZrIY~r8R9JayiGi;b3p)97Kf9Px$W0 zdd?bZ3gPpYM}NEY!qclT4(S|Yq&R>(v_M2We!`E#GW@iRnmH_^GsgHZ#~N+0)-n!o zzFZ5bRtw;(yl>jM2Jum^rCibi4O_(o8roUIP8FGmP$V%|-onNz3J& zlr&?E*W6oLI>|w6OK<8RKIart9BlNU1uu`5^W`dOzki<{=S!WGDU<{5_6OJAuJ#2w zfB%e1xmF8csS`gfCgaee1-kfdf1s&2=Xj{m0{8)cphc#mTGIAz>0$)&;wFcZ$~oK4 z`t}-UqFCEGE|?l;5=OA$ptN(6gS~T(k>p?;@Y)zHSUEUf1V1@`{mJ`+9Dc?hwE6;_ z6Z(S|EpUJ@J$QPJjriTMX%X4JKzGh94$XFwgVN5s9JG9FK)`|e{#JjW5gZmhSpEplIfYam{0B$SmC`3s R!|nh8002ovPDHLkV1fp}9G>|F zw`TMw^r13Y2Y=?q_M!UUeBOxd6iTDsDu`_lidJTh>MtHt`>S;l_%T#&Zf~Eznj82w zvXj1PJmTNHo0D{Q3dg-9T!rR8@K>Q+C?6Kk^W*&T$NBX+lp0-gHlFpMG`(}~7nzHU z*4yGU%aE}P-M;%ojF$U!-zUb@nRK_z&?ip9jG^spg@2*n^@XupWQx&p6=Q1V4D{U0 zzdq)-=sA=?aBwAoprrlcKu{b$a3EyVeF}t(<(dK!L-Q~YF_s<%Vn#cPZDs@^esB$K z^CAo*_7$VfsvX0{^?-M$k>kS!ELyHkwLzd7RsD%QK544ez}NFX@4lt45;90)xY z2SP^sfdV1Jh$#>;a5ADl#8^fch#8GEikV@gVJwVxxDiG$h!vyxpcuigoKb_)Bnf+~ z*E85FOCUHpmq1X_x*Q0q(=G=>hW+lflpw}H%xFew#EfN_hQiSBgJ)wI4-}(mDaLY?GitapIQ$9j*Iq#a!O^t@!u{%T zAb%(tE(bz}?ouFRbX*EV44jNUZ;CO&K+MqGNydy_W~&-He(-DdV=MjJo) zpR&Z~tHg|EtQf{1XPnRj5+Em^wM5CdXwk1ri0viJ{ zLr-5VW(3~a7e+G~2qPH$Rt(xNW`6`$&N!9hl7uwR5(wv60>N=(#)06tbI*a0(fXu7 z$k_EM5HVW!eVL6;7XvXvOFl=;7;YC^VYJ*(7(3@(G4TE2Q%m#1r#1;s)v2BH{o+7y zBKJKFamsk zgi*H?BN*q5nmV;Te1GJ;ya(9qCuON)d{N{^Kr+%Gu!g#-D9eum1-Ds*GmvdkP2G^z@m)yax1 zOYZGV#@WcR*Kgl@S_6OuV2S9^u_7X?wT7Jl060D0j!$`c1%JQ}J#fANLXce$&;uL3}{l2}v#tet?*j}$#YYYizSfSoSz-NTQRG6`%H z1OGVzpl#btOn){p2xE&UyBNeUVa6I`@Nua?Z{9gpiBie|>$LFmMY__qF6OT*rC=w# zRgn54hrd4bK-DeZ4|@R-*$RuHVCeHbz|SipvfsXFoG%MNIUeBWPR^l}b3I{2x^97(sm&A)^C*?~1ms7O%06xVXJ3Jsl7Dj!CcAQGDYtFA!r-m~zltzY zm=wu5l(G<_OwOT{flN!|i1Fl*oVgM^9k4WxUqAGlAK*RagP~upR_Y1v5vmT!9cU|G z%?BY_ay(%%lv_FfH6H-?rjnWqINxmJ-mZLyLFul{k)(2JS58`*AA6>fP30|2vgI6; zvN5Ji&VND(jN|AqDVk7tJ>IQB5f zmNVO1$de*D$0|7_XCIS8a^~&~{ecOE*S~-LjTrL<_y@MYmhExeaL51v002ovPDHLk FV1hFeF-`yg diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_double.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_double.png index 4b8ccb0395611ccffc449c5efc0fbe1d1b75d07a..aa49e18c86beb2a36b5ea9be47796a5083419b3d 100644 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0t^g{3@pq*mPgI&S|G((9OUlAuNyKMB8wRq_zrx&uIRjt$I@|+BeUzK z)PjQ34|rL$%cj3;je7NHg0zU2zk=L)!PC}<%`G_YbJy3Ythszhbk?fVXWz)L{3d<1 zpig9(VQZzg${*{lLvE{{ndbl6v-7|C*DcF_T~wd+Z;Qusaju{F`&Dk%EvlLN^VKfX zt0rbk)?7Vh?fdi4mGkFhW-I19l^ZWSt>2tt!0o}dxq$>qMkn!uJEdE%!5= z6{OFL*>`cYI7CkS)9%yHGjDa4Gw=G#t?OQUXa~$BJrOYZe?qJpR5e@1%s!npUXO@geCwIuVtnH diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png index 7a3063b9e348be675e6c06a79a5bd654342b3354..f5f4c4a8c824c2aef4e1529ea0c461e8248802ce 100644 GIT binary patch delta 1335 zcmV-71<3lP2D}Q87JmT%1Oos707!i6eEsO1$59X0Gq2ZcmQ-)qTlD7lj`E^e)NMy;mHn8l z6epe|x1ae@iGN?-?Oa|RbDjF`?YENZVvU_q*HOKv=HdI>Z-?rkbDw&9b(vB#H%fmP z#%Yxc7tYQE*X+e#)4MTN{zHHMRM~R2QqE^<%D?ePQ5cledK-r8^|_;xO%f(6TpZuT zgJBDdLZ(p8k->XU$-tMtgn@Nx!Wf2uW+chEW~^6+5q~!fqi7j>_m`G$|~$w$YNsVRvk>Zg^&6S|IKJV_r6#xrQhrj)ZqG9(`|n2#{9PE8nL6lg~B z)76aR*?%ww=Z2B9jDzsed20(G`AB>6=nvcD4bdOA$Me`9#Pc`@1ML}h+uW2&{-{a@ z?>!}h`3M8+)P>>scbc(8KEhab45QmNjGSfc;g8$>^u6?|KN1i7!*~Y$l45(paqC#2 zJ;^8l1MM03EpAFVTd0!3d(X&VKEl8{HN7e0zJF%?+%z;}voeff!!Ve!F!rwgb>4ir zf0d84CsROw7*97iR&0;=;Fc8QS#5nk5 zPJc}pW52H%n@LkMlE5$qEyJi<#=+qK{gL)yb|{G_y2IRHJlF0a2FN4k4;YNcYl4wK zs^oJM)1MPEn2#_x!-O%#8uAEl>1xKJV;J2F!zfzD!R?RI2RlIY`z7(9KWvYG(?3)a z&$f}m02zhJGZ<)37_&dwLOD~ke55^j^oQ+yk|FOGAHf+W46LCUOROP` z>pR1U+lEoJj6M9eYX^wrqvNU6FgFkn_Fl0)+YtR>JR8nuv?so4fPr`lIXk}2_F=y*{LWcB*49+lNOrwrw%${7$m~{+e>KaDXGWP%Zt`C=&^Go8v`z7&=g0y0L z!VvvIdp1b`2HJBI^ZY7j3YnrEUwG7i&Dj26h6!V`KG%#eFbuz87*)$SxHm`b z%Y4=cd>tj>3D!?3iKmBr7ChiP+;<-E7qTfIvsF93PCrMl`okF}jHuh!j3@k$APn!$ zFyaftC|bsWZ;sku`RI7^H8qd}9{G&rfOk26aDuJC2zkIaxG6Z`t9E?->M)NmIKzZ7 t7zUcLPF&3xuMA^+ZWuYskp4`%&VL%35_-$(Jf{Ev002ovPDHLkV1kGzgX;hQ delta 796 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 iO7qcbx>-^zE(XEp^1r8~BFY$cSo zrOe&UoRBs{k|BCiToCJq=W|PAC${8?M{S<3ufTgrA%eG{+=}7c)c3#tNN;|u{iG*z z0-Lqu7YA02(;N*dGuCZMJ05;Q^0ET&HzSRuA)a&M_!*v6F4Iw7ds99HB5qj0d??5_ Ut2wtJ9_U~OPgg&ebxsLQ0Bt2xKL7v# diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png index 81857523b7183047aa74137897a30db524548e5c..f6411e3c5fc53f6c78cc8b87e642b2fd673cae11 100644 GIT binary patch delta 1358 zcmV-U1+n_72Ga_V7JmT%1Oos707!i6eE%H8ns$KxSrU zzH@dR00009a7bBm000ic000ic0Tn1pfB*mlvPnciR7l5F)ql@V<3sY-;#7(Z%N;y^n zMTq~U@4cBJDd&m(;p^|4$2Qd8M@$?EPgcB;b>k$7<5!0)p5=L*H;ath()OHbK^?A* z%S`Z!=Wk9A*?;L(H*V~Vt1Ou(lk<=NEHU9#+Sfb%A{>7H&AZKM34R`adHw18GD{|f z7w69|;8)G!4{x_0tIWDAsWZEO6hHrMdt78&>hBX~bK4cR8?Y!!)9CE3$Oeln9i*)S z6Rz-F2N-m;4h$&(h>Y|;iW%td5 zKf5Tb@=@`~kWoBuh6P6PT(!##I642UPGBV(T24(SzMMYM^rvGH6n zY#Ay>KGBS%tr@;y?2U^ruebZn4*6g_%Tbw8JP)lyhVe)X7<9COAI0{hgA9l# zt>G({S${MlhAZt3F(4nsa7CaP*_~!&EzPhDWB;=B{ku)`FH?Ug9uYEZ&zl7LgYCJ> z+f@ebsc;7vDj#4}JXiSm3M^Zlx^WBrK}JP*KM@1+Q4DE^iZP#P#=NZ=&>zLv9an$+ zcjv=;e<&V1U=+_yugb7J4`~Z4>Plhti>5y%27mF`4l=N84eCaejff#__o+XMA-q5_ z9_}<_+0hKgFn0egef`Vkbge%so+HQycocYld$adymDJZ@0&5{Za8if3Q6_QLo6bJ?Q}Q!Fag! zUVk610mGBFw2*;iqy9u$_75@ODJ^0^K8oSFfnqFsnvr!h!#51*&x`Z_^@rMX1pT3S zV#o*E6VICPK!}Gs7y59GD(Z5JCI!;0AtT9W6JmJspiK-&pK;UFVAOYiH*SVY+!G2l6! zbKM`s5Ij(f!ALWpKZ@ZS#{RE*)vo4CEqJ(pXu-q&%4xyFd|^Dc|FpmGqrigqkpb~^ z>&UoG=0jpg;Wdc?`6!0upY~+PXGV_ delta 801 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 diff --git a/src/main/resources/assets/hbm/textures/items/bandaid.png b/src/main/resources/assets/hbm/textures/items/bandaid.png index fbf2effb9348eaf8d85093bd2b85bca4192ed7ab..7f687357ca47175dbee976318717d20a45732bc7 100644 GIT binary patch delta 248 zcmdnY)X6kKvYwfNfk8u;KNv_c76-XIF|0c$^AgBmNq6*hWMJ6X&;2Kn708ze@Ck9P zcT<_4XmxFF)!R*d+be^fuWHUPlLSiM{H>S`q&P}~{DS{O0K>iJy^%mM&H|6fVg?4j z!ywFfJby(BP%zEY#W6%9IQD#Wp-_VYkMqTS3x40<=-J$(eE7U=NXYB^N;d+_*~(Z> z+6pJV&=N2TQ{YrMFUo$aE7oI+f=!mog^GD^-!$HiKJfdBv{FP?-whsziadcsdkU%^ m{4L=Xcz6EexyJLa>KN=zSi*O<-unZzlEKr}&t;ucLK6V0V_?Jp delta 291 zcmV+;0o?wH0oi=8pMH6Ie#oynn}cbWp$cx?ZNf!j;P34gF<)7=4RV}(?U;NFNi%6ouH8V#oBfe)ug`2Ljp?9;mlP4b#YRQGryL^RQ|&LGSbxo2f=FY-FU9}>002ovPDHLkV1gI`e>?yH From f19e42cf93cc107e1f5c764987b876805b81b407 Mon Sep 17 00:00:00 2001 From: Voxelstice Date: Tue, 4 Oct 2022 18:35:05 +0300 Subject: [PATCH 094/111] h --- .../machine/rbmk/TileEntityRBMKControlManual.java | 12 ++++++++++++ .../machine/rbmk/TileEntityRBMKRodReaSim.java | 9 --------- .../machine/storage/TileEntityMachineFENSU.java | 6 ------ 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java index 13c13830a..f261885ba 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java @@ -8,6 +8,12 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; +import cpw.mods.fml.common.Optional; +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.SimpleComponent; + public class TileEntityRBMKControlManual extends TileEntityRBMKControl implements IControlReceiver { public RBMKColor color; @@ -121,4 +127,10 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement return data; } + + @Callback + @Optional.Method(modid = "OpenComputers") + public Object[] getColor(Context context, Arguments args) { + return new Object[] {this.color}; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index 9ba5e8b0a..e8e284a07 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -57,13 +57,4 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { public ColumnType getConsoleType() { return ColumnType.FUEL_SIM; } - - // do some opencomputer stuff - @Override - public String getComponentName() { - if (isModerated() == true) { - return "rbmk_moderated_fuel_rod_reasim"; - } - return "rbmk_fuel_rod_reasim"; - } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java index b65e9ed39..541e4c9ad 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java @@ -131,10 +131,4 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { { return 65536.0D; } - - // override the name because when connecting the machine to opencomputers it's gonna say "ntm_energy_storage" - @Override - public String getComponentName() { - return "ntm_fensu"; - } } From af1799db38e4a8325ddc0055db3ba4d53bb2025d Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Tue, 4 Oct 2022 18:55:44 +0300 Subject: [PATCH 095/111] Updated ru_RU.lang updated russian localization thanks to Sob for help --- src/main/resources/assets/hbm/lang/ru_RU.lang | 190 +++++++++--------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index ca6fe711f..6fa1a320f 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -12,7 +12,7 @@ soundCategory.ntmMachines=Механизмы NTM achievement.acidizer.desc=уфф ай моя кожа achievement.acidizer=Кислюка -achievement.assembly.desc=Подождика, уже час утра? +achievement.assembly.desc=Подожди-ка, уже час утра? achievement.assembly=Завод расширяется achievement.sacrifice=Жертва achievement.sacrifice.desc=Встреться лицом к лицу с огнём и выживи. @@ -27,7 +27,7 @@ achievement.selenium.desc=О,да! achievement.potato=Восстание машин achievement.potato.desc=Можешь убить для меня эту птицу? achievement.c44=Глава 44 -achievement.c44.desc=Гальванизирован! Я имею в виду цинк! +achievement.c44.desc=Гальванизирован! Типа, цинк! achievement.c20_5=Глава [ДВАДЦАТЬ_С_ПОЛОВИНОЙ] achievement.c20_5.desc=??? achievement.space=Последний Рубеж... Хотя ладно, забей. @@ -263,7 +263,7 @@ armor.rocketBoots=Ракетные ботинки armor.sprintBoost=Ускоренный бег armor.projectileProtection=Модификатор урона %s от снарядов armor.dash=Даёт %s рывков -armor.yield=Protection applies to damage <%s +armor.yield=Защита применима к урону <%s armorMod.all=Всему armorMod.applicableTo=Применяется к: @@ -352,13 +352,13 @@ trait.rbmx.xenon=Свинцовое отравление: %s trait.rbmx.xenonBurn=Функция разрушения свинца: %s trait.rbmx.xenonGen=Функция создания свинца: %s -turret.animals=Target Passive: %s -turret.machines=Target Machines: %s -turret.mobs=Target Mobs: %s -turret.none=None -turret.off=OFF -turret.on=ON -turret.players=Target Players: %s +turret.animals=Целиться по пассивным: %s +turret.machines=Целиться по машинам: %s +turret.mobs=Целиться по мобам: %s +turret.none=Ничего +turret.off=ВЫКЛ +turret.on=ВКЛ +turret.players=Целиться по игрокам: %s battery.mode.buffer=Буферный режим battery.mode.input=Зарядка @@ -692,18 +692,18 @@ gun.make.UNKNOWN=??? gun.make.WINCHESTER=Winchester Repeating Arms Company gun.make.WINCHESTER_BIGMT=Winchester Repeating Arms Company / Большая Гора -gun.name.ar15_50=AR-15 .50 BMG Mod -gun.name.baeAR=Britannian Standard Issue Assault Rifle -gun.name.bel=Balefire Egg Launcher +gun.name.ar15_50=Модификация AR-15 под .50 BMG +gun.name.baeAR=Стандартная винтовка британнской армии +gun.name.bel=Катапульта для жар-яиц gun.name.benelli=Benelli M4 Super 90 -gun.name.benelliDrum=Benelli M4 Super 90 (Drum Magazine Modification) -gun.name.bolter=Manticora Pattern Boltgun -gun.name.cz53=CZ53 Personal Minigun -gun.name.cz57=CZ57 Avenger Minigun -gun.name.dart=Needle Gun +gun.name.benelliDrum=Benelli M4 Super 90 (Барабанный магазин) +gun.name.bolter=Болтер модели "Мантикора" +gun.name.cz53=Персональный миниган CZ53 +gun.name.cz57=Миниган "Мститель" CZ57 +gun.name.dart=Игломёт gun.name.deagle=IMI Desert Eagle -gun.name.emp=EMP Orb Projector -gun.name.extinguisher=PROTEX Fire Exinguisher 6kg +gun.name.emp=Проектор ЭМИ-сфер +gun.name.extinguisher=6кг огнетушитель PROTEX gun.name.ffiV=FFI Viper gun.name.ffiVInox=FFI Viper Inox gun.name.ffiVLead=FFI Viper Lead @@ -713,45 +713,45 @@ gun.name.ffiVUltra=FFI Viper Ultra gun.name.ffivBling=FFI Viper Bling gun.name.ffivSatur=FFI Viper D-25A gun.name.gPistol=Granatpistole HK69 -gun.name.gustav=Carl Gustav Recoilless Rifle M1 -gun.name.ifHorseshoe=IF-18 Horseshoe -gun.name.ifPit=IF-18 Horseshoe Bottomless Pit -gun.name.ifScope=IF-18 Horseshoe Scoped -gun.name.ifStorm=IF-18 Horseshoe Silver Storm -gun.name.ifVanity=IF-18 Horseshoe Vanity +gun.name.gustav=Безоткатная винтовка "Карл-Густав" M1 +gun.name.ifHorseshoe=IF-18 "Подкова" +gun.name.ifPit=IF-18 "Подкова" - Бездонная яма +gun.name.ifScope=IF-18 "Подкова" с прицелом +gun.name.ifStorm=IF-18 "Подкова" - Сильвер Шторм +gun.name.ifVanity=IF-18 "Подкова" - Ванити gun.name.karl=M1 Karl-Gerät gun.name.ks23=KS-23 -gun.name.lacunae=Auntie Lacunae +gun.name.lacunae=Тётушка Лакунэ gun.name.lunaAR=1936 Bishamonten type Assault Rifle gun.name.lunaGun=1958 Lunatic Gun (Revised) gun.name.lunaHLR=1944 Chang'e type LMG gun.name.lunaSMG=1936 Ānanda type SMG gun.name.lunaSniper=1909 Rāhula type Anti-Material Rifle gun.name.lunaTWR=Time Warp Rifle -gun.name.m42=M-42 Tactical Nuclear Catapult -gun.name.m42MIRV=M-42 Experimental MIRV -gun.name.m60=Machine Gun, Caliber 7.62 mm, M60 -gun.name.maxim=Maxim gun -gun.name.maximDouble=Double Maxim gun +gun.name.m42=Тактическая ядерная катапульта M-42 +gun.name.m42MIRV=Экспериментальная РГН M-42 +gun.name.m60=Пулемёт калибра 7.62мм M60 +gun.name.maxim=Пулемёт "Максим" +gun.name.maximDouble=Сдвоенный пулемёт "Максим" gun.name.mp40=Maschinenpistole 40 -gun.name.nerf=NERF blaster of unknown design -gun.name.osipr=Overwatch Standard Issue Pulse Rifle +gun.name.nerf=Неизвестный бластер NERF +gun.name.osipr=Стандартная пульсовая винтовка Патруля gun.name.panz=Raketenpanzerbüchse 54 -gun.name.quadro=OpenQuadro Guided Man-Portable Missile Launcher -gun.name.revolverCursed=Britannia Standard Issue Motorized Handgun -gun.name.sauer=Sauer Shotgun +gun.name.quadro=Счетверённый переносной ракетный гранатомёт +gun.name.revolverCursed=Стандартный пистолет британнской армии +gun.name.sauer=Дробовик Sauer gun.name.spiw=H&R SPIW -gun.name.supershotty=Double-Barreled Combat Shotgun -gun.name.tau=XVL1456 Tau Cannon -gun.name.tommy9=M1A1 Submachine Gun 9mm Mod -gun.name.tommy=M1A1 Submachine Gun -gun.name.topaz=Heavy Duty Flamer +gun.name.supershotty=Двуствольный дробовик +gun.name.tau=Тау-пушка XVL1456 +gun.name.tommy9=Модификация пистолета-пулемёта M1A1 под 9мм +gun.name.tommy=Пистолет-пулемёт M1A1 +gun.name.topaz=Тяжёлый огнемёт gun.name.uacCarbine=UAC-41 Carbine gun.name.uacDMR=UAC-30 Designated Marksman Rifle gun.name.uacLMG=UAC-49 Light Machine Gun gun.name.uacPistol=UAC .45 Standard Issue Handgun gun.name.uacSMG=UAC Compact Sub-Machine Gun -gun.name.uboinik=Uboinik Revolving Shotgun +gun.name.uboinik=Револьверный дробовик "Убойник" gun.name.uzi=IMI Uzi gun.name.uziSatur=IMI Uzi D-25A gun.name.win1887=Winchester Model 1887 @@ -759,7 +759,7 @@ gun.name.win1887Inox=Winchester Model 1887 Inox gun.name.win20Inox=Winchester Model 20 Inox gun.name.win20Poly=Winchester Model 20 Polymer gun.name.win20Satur=Winchester Model 20 D-25A -gun.name.zomg=EMC101 Prismatic Negative Energy Cannon +gun.name.zomg=Пушка отрицательной энергии EMC101 book.error.cover=Адронный Коллайдер:$Диагностирование проблем book.error.title1=Ошибка 0x01 [NC] @@ -896,7 +896,7 @@ book.starter.page15=Наконец, вы можете создать свой п book.starter.title16=Заключение book.starter.page16=Если вы зашли так далеко, значит, вы на пути к тому, чтобы помочь восстановить цивилизацию. Вы успешно воссоздали передовую технику доапокалипсиса - с помощью ядерной энергетики, нефтехимии и многого другого. Я не могу знать, §oкак§r вы будете использовать эти новообретенные преимущества, но я лично надеюсь, что вы используете их на благо себе и другим - или, по крайней мере, в целях самообороны. До свидания! book.starter.title18=Об авторе -book.starter.page18=vær - просто парень, который слишком долго был пойман в ловушку серой пустоты, показанной в фильме "Говорящая голова" §o"Раз в жизни"§r. Однажды он нашел дверь студии, но, к своему ужасу, обнаружил, что она была вырезана из картона. +book.starter.page18=vær - просто парень, который слишком долго был пойман в ловушку серой пустоты, показанной в клипе Talking Heads §o"Once In A Lifetime"§r. Однажды он нашел дверь студии, но, к своему ужасу, обнаружил, что она была вырезана из картона. book.lore.office0.title=Заявление об увольнении book.lore.office0.author=Kosma @@ -1251,7 +1251,7 @@ death.attack.digamma=%1$s шагнул в пустоту. death.attack.asbestos=%1$s теперь имеет право на финансовую компенсацию. death.attack.mku=%1$s умер по неизвестным причинам. death.attack.BERYLLIUM=лёгкие %1$s выдохлись от воздействия бериллия. -death.attack.CHEMICAL=органы %1$s отключились. +death.attack.CHEMICAL=Органы %1$s отключились. death.attack.HEAVY_METAL=%1$s умер от отравления тяжёлыми металлами. death.attack.bleed=органы %1$s вытекли из-за наличия в них отверстий. death.attack.burn=%1$s был полностью сожжён горячей плазмой @@ -1697,8 +1697,8 @@ tile.conveyor_chute.name=Конвейерный желоб tile.conveyor_double.name=Двухполосная конвейер tile.conveyor_lift.name=Конвейерный цепной лифт tile.conveyor_triple.name=Трёхполосный конвейер -container.turretArty=Грэг -tile.turret_arty.name=Артиллерийская турель "Грэг" +container.turretArty=Грег +tile.turret_arty.name=Артиллерийская турель "Грег" container.heaterFirebox=Топка tile.heater_firebox.name=Топка tile.heater_firebox.desc=Производит тепло, сжигая твёрдое топливо. @@ -1878,12 +1878,12 @@ tile.machine_storage_drum.name=Бочка для захоронения ядер tile.machine_spp_bottom.name=Генератор потенциала ZPE (низ) tile.machine_spp_top.name=Генератор потенциала ZPE (верх) -tile.ams_limiter.name=Стабилизатор АМС [Деко] -container.amsLimiter=Стабилизатор АМС [Деко] -tile.ams_emitter.name=Излучатель АМС [Деко] -container.amsEmitter=Излучатель АМС [Деко] -tile.ams_base.name=Основание АМС [Деко] -container.amsBase=Основание АМС [Деко] +tile.ams_limiter.name=Стабилизатор АМС [Декор] +container.amsLimiter=Стабилизатор АМС [Декор] +tile.ams_emitter.name=Излучатель АМС [Декор] +container.amsEmitter=Излучатель АМС [Декор] +tile.ams_base.name=Основание АМС [Декор] +container.amsBase=Основание АМС [Декор] tile.dfc_emitter.name=Излучатель РТС container.dfcEmitter=Излучатель РТС @@ -1926,7 +1926,7 @@ item.fuse.name=Предохранитель item.arc_electrode.name=Графитовый электрод item.arc_electrode_burnt.name=Расплавленный электрод item.arc_electrode_desh.name=Электрод из деш -item.crt_display.name=Электронно-Лучевая трубка +item.crt_display.name=Электронно-лучевая трубка tile.test_nuke.name=Тестовая бомба @@ -1955,7 +1955,7 @@ item.ingot_titanium.name=Титановый слиток item.ingot_cobalt.name=Кобальтовый слиток item.ingot_tantalium.name=Танталовый слиток item.ingot_tantalium.desc='Танталум' -item.ingot_tantalium.desc.P11=АКА Танталум. +item.ingot_tantalium.desc.P11=АКА Танталий. item.ingot_meteorite.name=Метеоритовый слиток item.ingot_osmiridium.name=Осмиридиевый слиток item.ingot_meteorite_forged.name=Выкованный метеоритовый слиток @@ -2032,7 +2032,7 @@ item.servo_set_desh.name=Набор деш-сервоприводов item.bandaid.name=Пластырь Вельвет item.bathwater.name=Токсичная мыльная вода item.bathwater_mk2.name=Токсичная мыльная вода (Лошадиный аромат) -item.horseshoe_magnet.name=Подковообразный магнит +item.horseshoe_magnet.name=Магнит-подкова item.industrial_magnet.name=Промышленный магнит item.lodestone.name=Магнетит item.morning_glory.name=Монин Глори @@ -2174,7 +2174,7 @@ item.nugget_beryllium.name=Бериллиевый самородок item.nugget_bismuth.name=Самородок висмута item.nugget_tantalium.name=Самородок тантала item.nugget_tantalium.desc='Танталум' -item.nugget_tantalium.desc.P11=АКА Танталум. +item.nugget_tantalium.desc.P11=АКА Танталий. item.nugget_osmiridium.name=Самородок осмиридия item.crystal_iron.name=Кристаллизованное железо @@ -2205,7 +2205,7 @@ item.crystal_cinnebar.name=Кристаллизованная киноварь item.crystal_lapis.name=Кристализованный лазурит item.gem_tantalium.name=Поликристалл тантала item.gem_tantalium.desc='Танталум' -item.gem_tantalium.desc.P11=АКА Танталум. +item.gem_tantalium.desc.P11=АКА Танталий. item.gem_alexandrite.name=Александрит item.gem_volcanic.name=Вулканический самоцвет item.black_diamond.name=Чёрный алмаз @@ -2470,7 +2470,7 @@ tile.ore_bedrock_coltan.name=Бедроковая колтановая руда tile.ore_bedrock_oil.name=Бедроковый нефтяной пласт tile.ore_cobalt.name=Кобальтовая руда tile.stone_porous.name=Пористый камень -tile.ore_random.name=%s руды +tile.ore_random.name=Руда %s tile.bobblehead.name=Болванчик tile.deco_titanium.name=Титановый декоративный блок @@ -2624,7 +2624,7 @@ tile.gas_meltdown.name=Газ из активной зоны tile.gas_coal.name=Воздушная угольная пыль tile.gas_explosive.name=Взрывоопасный газ tile.cmb_brick.name=Плита из стали Альянса -tile.cmb_brick_reinforced.name=Усиленные стальные кирпичи Альянса +tile.cmb_brick_reinforced.name=Усиленные кирпичи из стали Альянса tile.ladder_aluminium.name=Алюминиевая лестница tile.ladder_cobalt.name=Кобальтовая лестница tile.ladder_copper.name=Медная лестница @@ -2771,7 +2771,7 @@ item.powder_coltan.name=Очищенный танталит item.powder_coltan_ore.name=Измельченный Колтан item.powder_tantalium.name=Порошок тантала item.powder_tantalium.desc='Танталум' -item.powder_tantalium.desc.P11=АКА Танталум. +item.powder_tantalium.desc.P11=АКА Танталий. item.powder_impure_osmiridium.name=Порошок загрязнённого осмиридия item.powder_paleogenite.name=Порошок палеогенита item.powder_paleogenite_tiny.name=Кучка палеогенитового порошка @@ -3948,7 +3948,7 @@ item.plate_euphemium.name=Составная пластина из эвфеми item.plate_dineutronium.name=Составная пластина из динейтрония item.plate_desh.name=Составная пластина из деш item.plate_bismuth.name=Составная пластина из висмута -item.plate_bismuth.desc=Ребята, клянусь, это алхимический символ Висмута. +item.plate_bismuth.desc=Ребята, клянусь, это алхимический символ висмута. item.plate_fuel_mox.name=МОКС-топливная пластина item.plate_fuel_pu238be.name=Плутоний-238-Бериллевая топливная пластина @@ -4194,7 +4194,7 @@ item.missile_custom.name=Пользовательская Ракета item.missile_carrier.name=Ракета-носитель HTR-01 item.missile_soyuz.name=Союз-ФГ item.missile_soyuz_lander.name=Орбитальный Модуль -item.missile_soyuz_lander.desc=Также и паршивый посадочный модуль! +item.missile_soyuz_lander.desc=А также паршивый посадочный модуль! item.sat_mapper.name=Спутник для Картографирования Поверхности item.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования item.sat_radar.name=Спутник с Радиолокационным Зондированием @@ -4208,12 +4208,12 @@ item.sat_chip.name=Спутниковый ID-чип item.sat_interface.name=Интерфейс спутникового управления item.sat_coord.name=Спутниковый целеуказатель item.sat_designator.name=Спутниковый лазерный целеуказатель -tile.sat_mapper.name=Спутник для картографирования поверхности (Декорация) -tile.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования (Декорация) -tile.sat_radar.name=Спутник с радиолокационным зондированием (Декорация) -tile.sat_laser.name=Орбитальный Луч Смерти (Декорация) -tile.sat_foeq.name=ВСАП-МК.I зонд “FOEQ Duna” с экспериментальным ядерным двигателем (Декорация) -tile.sat_resonator.name=Спутник с Зен-Резонатором (Декорация) +tile.sat_mapper.name=Спутник для картографирования поверхности (Декор) +tile.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования (Декор) +tile.sat_radar.name=Спутник с радиолокационным зондированием (Декор) +tile.sat_laser.name=Орбитальный Луч Смерти (Декор) +tile.sat_foeq.name=ВСАП-МК.I зонд “FOEQ Duna” с экспериментальным ядерным двигателем (Декор) +tile.sat_resonator.name=Спутник с Зен-Резонатором (Декор) item.hazmat_helmet.name=Защитный шлем item.hazmat_plate.name=Защитный нагрудник @@ -4823,10 +4823,10 @@ item.australium_v.name=Увеличитель жизни Марк V item.flask_infusion.shield.name=Эликсир защиты item.weapon_saw.name=Убийство при содействии врача -item.weapon_bat.name=По умолчанию Ричарда +item.weapon_bat.name=Любимица Ричарда item.weapon_bat_nail.name=Клише -item.weapon_golf_club.name=Русский бандитская клюшка -item.weapon_pipe_rusty.name=Дубина +item.weapon_golf_club.name=Клюшка русского бандита +item.weapon_pipe_rusty.name=Поправитель поведения item.weapon_pipe_lead.name=Ручное управление item.reer_graar.name=Рер Граар item.stopsign.name=Боевой топор из знака СТОП @@ -4885,12 +4885,12 @@ item.acrylic.desc=Aka: Polymethyl methacrylate item.acrylic.name=Acrylic Prism item.ammo_308.name=7.62x51mm NATO Round item.ammo_45.name=.45 ACP Round -item.ammo_50bmg.desc=§e12.7mm anti-material round$§eYou shoot down planes with these, using$§ethem against people would be nasty. +item.ammo_50bmg.desc=§eКрупнокалиберный патрон 12.7мм$§eТакими сбивают самолёты, стрелять$§eими по людям – мерзко. item.ammo_556_chlorophyte.desc=§o.223 Remington -item.ammo_75bolt.desc=§eGyro-stabilized armor-piercing$§eDU round with tandem charge -item.ammo_75bolt_he.desc=§eArmor-piercing penetrator filled$§ewith a powerful explosive charge -item.ammo_75bolt_incendiary.desc=§eArmor-piercing explosive round$§efilled with oxy-phosphorous gel -item.ammo_folly.desc=§9+ Focused starmetal reaction blast +item.ammo_75bolt.desc=§eГироскопический бронебойный$§eпатрон с тандемным зарядом +item.ammo_75bolt_he.desc=§eБронебойный патрон с$§eмощным зарядом взрывчатки +item.ammo_75bolt_incendiary.desc=§eБронебойный разрывной патрон,$§eнаполненный фосфоровым гелем +item.ammo_folly.desc=§9+ Заряд направленной реакции звёздного металла item.ammo_folly_du.desc=§9+ Howitzer mini nuke shell item.ammo_folly_nuclear.desc=§9+ Howitzer 17kg Uranium-238 shell item.ammo_grenade_lunatic.name=40mm Lunatic Grenade @@ -4923,19 +4923,19 @@ item.billet_euphemium.name=Euphemium Billet item.billet_sa327be.name=Sa327Be Billet item.billet_tha.name=Activated Thorium Billet item.billet_u234.name=Uranium-234 Billet -item.black_hole.desc=Contains a regular singularity$in the center. Large enough to$stay stable. It's not the end$of the world as we know it,$and I don't feel fine. +item.black_hole.desc=В центре этой штуки – сингулярность.$Достаточно большая, чтобы оставаться стабильной.$Это – не конец вселенной, но мне от этого лучше не становится. item.bolt_staballoy.name=Staballoy Bolt -item.bottle_sr90.name=Bottle of Bone Hurting Juice -item.can_breen.name=Dr. Breens Private Reserve -item.canteen_13.desc.11=Cooldown: 1 minute$Restores 2.5 hearts$ $You sip a sip from your trusty Vault 13 SIPPP -item.canteen_13.desc=Cooldown: 1 minute$Restores 2.5 hearts$ $You take a sip from your trusty Vault 13 canteen. -item.canteen_fab.desc=Cooldown: 2 minutes$Engages the fab drive -item.canteen_vodka.desc.11=Cooldown: 3 minutes$Nausea I for 10 seconds$Strength III for 30 seconds$ $Time to get hammered & sickled! -item.canteen_vodka.desc=Cooldown: 3 minutes$Nausea I for 10 seconds$Strength III for 30 seconds$ $Smells like disinfectant, tastes like disinfectant. -item.catalyst_rare.name=Rare Earth Catalyst -item.catalyst_ten.name=Tennessine Catalyst -item.cell_anti_schrabidium.desc=Warning: Exposure to matter will$create a fólkvangr field! -item.cell_antimatter.desc=Warning: Exposure to matter will$lead to violent annihilation! +item.bottle_sr90.name=Бутылка с костебольным соком +item.can_breen.name=Личный резерв др.Брина +item.canteen_13.desc.11=Откат: 1 минута$Восстанавливает 2.5 сердца$ $Вы глотаете глоток из вашего верного глотка Убежища ГЛОТОК +item.canteen_13.desc=Откат: 1 минута$Восстанавливает 2.5 сердца$ $Вы делаете глоток из вашей верной фляжки Убежища 13… +item.canteen_fab.desc=Откат: 2 минуты$Включает фаб-двигатели +item.canteen_vodka.desc.11=Откат: 3 минуты$Тошнота I на 10 секунд$Сила III на 30 секунд$ $Сейчас тебя разсерпуют и перемолотят! +item.canteen_vodka.desc=Откат: 3 минуты$Тошнота I на 10 секунд$Сила III на 30 секунд$ $На запах – как антисептик, и на вкус – как антисептик. +item.catalyst_rare.name=Редкоземельный катализатор +item.catalyst_ten.name=Tеннесиновый катализатор +item.cell_anti_schrabidium.desc=Внимание: взаимодействие с материей$создаст поле Фолькванга! +item.cell_antimatter.desc=Внимание: взаимодействие с материей$приведёт к аннигиляции! item.chronometer_player.name=Biological Chronometer item.coil_warp.name=Antimass Gravity Manipulation Coil item.coil_warp_coated.name=FTL Drive Coil with WCo Alloy and Desh Coating @@ -4943,8 +4943,8 @@ item.core_plut_boosted.name=Plutonium Core with Schrabidium Booster item.core_uran_boosted.name=Uranium Core with Schrabidium Booster item.crystal_energy.desc=Densely packed energy powder.$Not edible. item.custom_core.name=Nuclear Fission Core -item.detonator_de.desc=Explodes when dropped! -item.detonator_deadman.desc=Shift right-click to set position,$drop to detonate! +item.detonator_de.desc=Взрывается при падении! +item.detonator_deadman.desc=Shift+ПКМ, чтобы задать позицию,$выбросите для детонации! item.euphemium_capacitor.name=Redcoil Capacitor with Euphemium Positive Energy Negator item.eye.desc.11=§c"All humans, are afraid of monsters, the monsters they keep inside of them.$§cThey drove the species who are able to expose the monsters in them down the$§cpurgatory underground. There, in the purgatory deep inside the earth where$§cpeople are made, he was born. He hated, and loved, the monster that is$§cforming inside of him more than anyone else. Together with his second$§cmother, he climbed up to the world where the people who have driven him into$§cthe underground live. However, at that time, it was too late. This world$§cabove ground is waiting for its slow death, same as the people who are$§ccontinue to stay there. This world, this surface, is the realm of the dead.$§cAnd this species called humans, they have built for themselves a world of$§ctwilight. There, he met a ghost called 'father'. His second mother, who has$§ccome to this netherworld with him, remained there, while he returned to the$§cpurgatory where he was born. That place, the place where he lives, that$§cpurgatory. That should be the last world of humans."§r item.eye.desc=It's looking at me despite being closed,$or rather, through me...$into my soul.$It makes me uncomfortable @@ -4959,11 +4959,11 @@ item.ferrouranium_plate.name=Ferrouranium Chestplate item.ferrouranium_shovel.name=Ferrouranium Shovel item.ferrouranium_sword.name=Ferrouranium Sword item.filter_fiberglass.name=Bound Fiberglass Filter -item.five_htp.desc=Removes all DRX, Stability for 10 minutes -item.fmn.desc=Removes all DRX above 2,000mDRX +item.five_htp.desc=Убирает все DRX, Стабильность на 10 минут +item.fmn.desc=Убирает все DRX более 2,000mDRX item.fragment_orichalcum.desc=Gem shard, retains its hardness and$resistance to pressure and heat, but$requires further refinement item.fragment_orichalcum.name=§6Orichalcum Shard§r -item.fuse.desc=This item is needed for every large$nuclear reactor, as it allows the$reactor to generate electricity and$use up it's fuel. Removing the fuse$from a reactor will instantly shut$it down.$$§mjk, it's §oalmost§r§7§m useless now +item.fuse.desc=эта штука теперь практически бесполезна item.gas_sarin.name=Sarin Gas Tank item.gas_xenon.name=Xenon Gas Tank item.gem_orichalcum.desc=High hardness and luster, provides shielding$against pressure and heat fronts From ab083eec59176dcb0b01a8835aaba491111f1d7b Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 5 Oct 2022 16:29:25 +0200 Subject: [PATCH 096/111] heatable fluid trait, steam compression headaches --- .../java/com/hbm/inventory/fluid/Fluids.java | 6 ++ .../inventory/fluid/trait/FT_Heatable.java | 73 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 99c90d18c..5542dc18b 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -8,6 +8,7 @@ import com.hbm.inventory.fluid.FluidType.ExtContainer; import com.hbm.inventory.fluid.trait.*; import com.hbm.inventory.fluid.trait.FluidTraitSimple.*; import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.render.util.EnumSymbol; public class Fluids { @@ -300,6 +301,11 @@ public class Fluids { metaOrder.add(PLASMA_XM); metaOrder.add(PLASMA_BF); + WATER.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 0.25D) + .addStep(20, 1, Fluids.STEAM, 100) + .addStep(220, 1, Fluids.HOTSTEAM, 10) + .addStep(220, 1, Fluids.SUPERHOTSTEAM, 1)); + if(idMapping.size() != metaOrder.size()) { throw new IllegalStateException("A severe error has occoured during NTM's fluid registering process! The MetaOrder and Mappings are inconsistent! Mapping size: " + idMapping.size()+ " / MetaOrder size: " + metaOrder.size()); } diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java new file mode 100644 index 000000000..5802834ad --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java @@ -0,0 +1,73 @@ +package com.hbm.inventory.fluid.trait; + +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.util.EnumChatFormatting; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class FT_Heatable extends FluidTrait { + + protected List steps = new ArrayList(); + protected HashMap efficiency = new HashMap(); + + /** Add in ascending order, lowest heat required goes first! */ + public FT_Heatable addStep(int heat, int req, FluidType type, int prod) { + steps.add(new HeatingStep(req, heat, type, prod)); + return this; + } + + /** sets efficiency for different types of heating, main difference is with water */ + public FT_Heatable setEff(HeatingType type, double eff) { + efficiency.put(type, eff); + return this; + } + + public double getEfficiency(HeatingType type) { + Double eff = this.efficiency.get(type); + return eff != null ? eff : 0.0D; + } + + public HeatingStep getFirstStep() { + return this.steps.get(0); + } + + public void addInfoHidden(List info) { + for(HeatingType type : HeatingType.values()) { + + double eff = getEfficiency(type); + + if(eff > 0) { + info.add(EnumChatFormatting.AQUA + "[" + type.name + "]"); + info.add(EnumChatFormatting.AQUA + "Efficiency: " + ((int) (eff * 100D)) + "%"); + } + } + } + + public static class HeatingStep { + public final int amountReq; + public final int heatReq; + public final FluidType typeProduced; + public final int amountProduced; + + public HeatingStep(int req, int heat, FluidType type, int prod) { + this.amountReq = req; + this.heatReq = heat; + this.typeProduced = type; + this.amountProduced = prod; + } + } + + public static enum HeatingType { + BOILER("Boilable"), + HEATEXCHANGER("Heatable"); + + public String name; + + private HeatingType(String name) { + this.name = name; + } + } +} From 8ca1513bf86c13d9546c470d59ede5e8f1f6ba36 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 6 Oct 2022 13:08:27 +0200 Subject: [PATCH 097/111] the thicc NEI handler that does nothing except render things thicc --- .../com/hbm/handler/nei/ChunkyHandler.java | 24 ++++++-- .../java/com/hbm/inventory/fluid/Fluids.java | 19 +++++-- .../inventory/fluid/trait/FT_Coolable.java | 55 +++++++++++++++++++ .../inventory/fluid/trait/FT_Heatable.java | 3 +- 4 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java diff --git a/src/main/java/com/hbm/handler/nei/ChunkyHandler.java b/src/main/java/com/hbm/handler/nei/ChunkyHandler.java index 8b087549d..c0cf58b60 100644 --- a/src/main/java/com/hbm/handler/nei/ChunkyHandler.java +++ b/src/main/java/com/hbm/handler/nei/ChunkyHandler.java @@ -1,5 +1,7 @@ package com.hbm.handler.nei; +import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; + import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; @@ -9,6 +11,7 @@ import codechicken.nei.guihook.GuiContainerManager; import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.item.ItemStack; public class ChunkyHandler extends TemplateRecipeHandler { @@ -30,7 +33,7 @@ public class ChunkyHandler extends TemplateRecipeHandler { @Override public String getRecipeName() { - return "The same thing but in big"; + return ""; } @Override @@ -51,12 +54,23 @@ public class ChunkyHandler extends TemplateRecipeHandler { @Override public void drawExtras(int recipe) { RecipeSet rec = (RecipeSet) this.arecipes.get(recipe); + drawTexturedModalRect(145, 0, 20, 20, 20, 20); GL11.glPushMatrix(); - double scale = 10D; + GL11.glTranslated(83, 50, 0); + double scale = 5D; GL11.glScaled(scale, scale, scale); - GuiContainerManager.drawItem(50, 50, rec.stack); //TODO: center properly + RenderHelper.enableGUIStandardItemLighting(); + GL11.glTranslated(-8, -8, 0); + GuiContainerManager.drawItem(0, 0, rec.stack); GL11.glPopMatrix(); - FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; - fontRenderer.drawString("so you can really stare at it", 52, 100, 0x404040); + RenderHelper.enableGUIStandardItemLighting(); + + FontRenderer font = Minecraft.getMinecraft().fontRenderer; + + int w = 83; + String top = "The same thing but in big"; + String bottom = "so you can really stare at it"; + font.drawString(top, w - font.getStringWidth(top) / 2, 100, 0x404040); + font.drawString(bottom, w - font.getStringWidth(bottom) / 2, 110, 0x404040); } } diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 5542dc18b..1f2ae0fd5 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -301,10 +301,21 @@ public class Fluids { metaOrder.add(PLASMA_XM); metaOrder.add(PLASMA_BF); - WATER.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 0.25D) - .addStep(20, 1, Fluids.STEAM, 100) - .addStep(220, 1, Fluids.HOTSTEAM, 10) - .addStep(220, 1, Fluids.SUPERHOTSTEAM, 1)); + double eff_steam_boil = 1.0D; + double eff_steam_heatex = 0.25D; + + WATER.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex) + .addStep(200, 1, STEAM, 100) + .addStep(220, 1, HOTSTEAM, 10) + .addStep(238, 1, SUPERHOTSTEAM, 1) + .addStep(2500, 10, ULTRAHOTSTEAM, 1)); + + STEAM.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex).addStep(2, 10, HOTSTEAM, 1)); + HOTSTEAM.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex).addStep(18, 10, SUPERHOTSTEAM, 1)); + SUPERHOTSTEAM.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex).addStep(120, 10, ULTRAHOTSTEAM, 1)); + + OIL.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(10, 1, HOTOIL, 1)); + CRACKOIL.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(10, 1, HOTCRACKOIL, 1)); if(idMapping.size() != metaOrder.size()) { throw new IllegalStateException("A severe error has occoured during NTM's fluid registering process! The MetaOrder and Mappings are inconsistent! Mapping size: " + idMapping.size()+ " / MetaOrder size: " + metaOrder.size()); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java new file mode 100644 index 000000000..a936a44d5 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java @@ -0,0 +1,55 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.HashMap; +import java.util.List; + +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.util.EnumChatFormatting; + +public class FT_Coolable extends FluidTrait { + + protected HashMap efficiency = new HashMap(); + + public final FluidType coolsTo; + public final int heatEnergy; + + public FT_Coolable(FluidType type, int heat) { + this.coolsTo = type; + this.heatEnergy = heat; + } + + public FT_Coolable setEff(CoolingType type, double eff) { + efficiency.put(type, eff); + return this; + } + + public double getEfficiency(CoolingType type) { + Double eff = this.efficiency.get(type); + return eff != null ? eff : 0.0D; + } + + @Override + public void addInfoHidden(List info) { + for(CoolingType type : CoolingType.values()) { + + double eff = getEfficiency(type); + + if(eff > 0) { + info.add(EnumChatFormatting.AQUA + "[" + type.name + "]"); + info.add(EnumChatFormatting.AQUA + "Efficiency: " + ((int) (eff * 100D)) + "%"); + } + } + } + + public static enum CoolingType { + TURBINE("Turbine Steam"), + HEATEXCHANGER("Coolable"); + + public String name; + + private CoolingType(String name) { + this.name = name; + } + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java index 5802834ad..e01169076 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java @@ -33,7 +33,8 @@ public class FT_Heatable extends FluidTrait { public HeatingStep getFirstStep() { return this.steps.get(0); } - + + @Override public void addInfoHidden(List info) { for(HeatingType type : HeatingType.values()) { From 870bec5d7d4628b645f063af6d1ef05f87f0b554 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 6 Oct 2022 16:50:23 +0200 Subject: [PATCH 098/111] more crucible materials, better template search, crucible template icons --- .../gui/GUIScreenTemplateFolder.java | 18 +++++++++++++++--- .../java/com/hbm/inventory/material/Mats.java | 18 ++++++++++++++++++ .../hbm/render/item/ItemRenderTemplate.java | 4 ++++ .../hbm/textures/items/tape_cluster.png | Bin 0 -> 336 bytes 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/tape_cluster.png diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index 91f9f42e1..b83b18a14 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -20,6 +20,7 @@ import com.hbm.items.machine.ItemCassette; import com.hbm.items.machine.ItemStamp; import com.hbm.items.machine.ItemStamp.StampType; import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; import com.hbm.packet.ItemFolderPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.util.I18nUtil; @@ -123,11 +124,22 @@ public class GUIScreenTemplateFolder extends GuiScreen { sub = sub.toLowerCase(); + outer: for(ItemStack stack : allStacks) { - if(stack.getDisplayName().toLowerCase().contains(sub)) { - stacks.add(stack); - } else if(stack.getItem() == ModItems.fluid_identifier) { + for(Object o : stack.getTooltip(MainRegistry.proxy.me(), true)) { + + if(o instanceof String) { + String text = (String) o; + + if(text.toLowerCase().contains(sub)) { + stacks.add(stack); + continue outer; + } + } + } + + if(stack.getItem() == ModItems.fluid_identifier) { FluidType fluid = Fluids.fromID(stack.getItemDamage()); if(I18nUtil.resolveKey(fluid.getUnlocalizedName()).toLowerCase().contains(sub)) { diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index e229cadb4..b3cfaf8be 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -65,9 +65,27 @@ public class Mats { public static final NTMMaterial MAT_U238 = makeSmeltable(9238, U238, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_THORIUM = makeSmeltable(9032, TH232, 0xBF825F).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(9400, PU, 0x78817E).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_RGP = makeSmeltable(9401, PURG, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_PU238 = makeSmeltable(9438, PU238, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_PU239 = makeSmeltable(9439, PU239, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_PU240 = makeSmeltable(9440, PU240, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_PU241 = makeSmeltable(9441, PU241, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_RGA = makeSmeltable(9501, AMRG, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_AM241 = makeSmeltable(9541, AM241, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_AM242 = makeSmeltable(9542, AM242, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_NEPTUNIUM = makeSmeltable(9337, NP237, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_POLONIUM = makeSmeltable(8410, PO210, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_TECHNIETIUM = makeSmeltable(4399, TC99, 0xCADFDF).setShapes(NUGGET, BILLET, INGOT, BLOCK); public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0xE9FAF6).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ACTINIUM = makeSmeltable(8927, AC227, 0).setShapes(NUGGET, BILLET, INGOT); + public static final NTMMaterial MAT_CO60 = makeSmeltable(2760, CO60, 0).setShapes(NUGGET, BILLET, INGOT, DUST); + public static final NTMMaterial MAT_AU198 = makeSmeltable(7998, AU198, 0).setShapes(NUGGET, BILLET, INGOT, DUST); + public static final NTMMaterial MAT_PB209 = makeSmeltable(8209, PB209, 0).setShapes(NUGGET, BILLET, INGOT, DUST); public static final NTMMaterial MAT_SCHRABIDIUM = makeSmeltable(12626, SA326, 0x32FFFF).setShapes(NUGGET, WIRE, BILLET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_SOLINIUM = makeSmeltable(12627, SA327, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_SCHRABIDATE = makeSmeltable(12600, SBD, 0).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SCHRARANIUM = makeSmeltable(12601, SRN, 0).setShapes(INGOT, BLOCK); + public static final NTMMaterial MAT_GHIORSIUM = makeSmeltable(11936, GH336, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); //Base metals public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xA99E79).setShapes(INGOT, DUST, PLATE, BLOCK); diff --git a/src/main/java/com/hbm/render/item/ItemRenderTemplate.java b/src/main/java/com/hbm/render/item/ItemRenderTemplate.java index c52c324a0..fcfe550a6 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderTemplate.java +++ b/src/main/java/com/hbm/render/item/ItemRenderTemplate.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.AssemblerRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.render.util.RenderItemStack; @@ -28,6 +29,9 @@ public class ItemRenderTemplate implements IItemRenderer { if(stack.getItem() == ModItems.chemistry_template) this.currentItem = new ItemStack(ModItems.chemistry_icon, 1, stack.getItemDamage()); + if(stack.getItem() == ModItems.crucible_template) + this.currentItem = CrucibleRecipes.indexMapping.get(stack.getItemDamage()).icon; + if(this.currentItem != null) { return true; } diff --git a/src/main/resources/assets/hbm/textures/items/tape_cluster.png b/src/main/resources/assets/hbm/textures/items/tape_cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..cb76828893ae61b511612b58656b95839b6328b3 GIT binary patch literal 336 zcmV-W0k8gvP)bhQ~l4c1zK6+kKV6!sl9 z_VB)}we)>YC^`uCaMyKizinGjv`L~f_;#)NxV&<^*5rBa`qDIYYwr!REb~r$d(Zj$ z{scg4jkT6x7`#4DAcR0E1wdJrXsumrz`^r8-xnBT5JCVjj-wNW@M!{Lj9YJ_4cdSI zOc07f$-@bZF$Z{>CdWMQ1#ukz6h%RjBp72@mIWaMQ51Rb=^$;hUscs1K?onN0N$8- iqI>W|C8a$5BYy!$=%A0vYEGU20000 Date: Fri, 7 Oct 2022 13:53:29 +0200 Subject: [PATCH 099/111] concrete stairs and a crapton of slabs --- src/main/java/com/hbm/blocks/ModBlocks.java | 66 ++++++++------ .../blocks/generic/BlockGenericStairs.java | 12 +++ .../hbm/blocks/generic/BlockMultiSlab.java | 89 +++++++++++++++++++ .../com/hbm/blocks/generic/BlockPinkSlab.java | 18 ++-- .../hbm/blocks/generic/BlockPinkStairs.java | 12 --- .../inventory/recipes/ShredderRecipes.java | 6 -- src/main/java/com/hbm/items/ModItems.java | 6 -- .../com/hbm/items/block/ItemBlockLore.java | 7 -- .../java/com/hbm/items/block/ItemModSlab.java | 28 ++++++ src/main/java/com/hbm/main/MainRegistry.java | 6 ++ .../render/entity/item/RenderMovingItem.java | 4 +- 11 files changed, 187 insertions(+), 67 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java create mode 100644 src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java delete mode 100644 src/main/java/com/hbm/blocks/generic/BlockPinkStairs.java create mode 100644 src/main/java/com/hbm/items/block/ItemModSlab.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 3dbb7cdc2..ea0a02ca5 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -344,6 +344,19 @@ public class ModBlocks { public static Block brick_asbestos; public static Block brick_fire; + public static Block concrete_slab; + public static Block concrete_double_slab; + public static Block concrete_brick_slab; + public static Block concrete_brick_double_slab; + public static Block brick_slab; + public static Block brick_double_slab; + + public static Block concrete_smooth_stairs; + public static Block concrete_stairs; + public static Block concrete_asbestos_stairs; + public static Block ducrete_smooth_stairs; + public static Block ducrete_stairs; + public static Block cmb_brick; public static Block cmb_brick_reinforced; @@ -1090,13 +1103,7 @@ public class ModBlocks { public static Block anvil_murky; public static final int guiID_anvil = 121; - public static Block turret_light; - public static Block turret_heavy; - public static Block turret_rocket; - public static Block turret_flamer; - public static Block turret_tau; public static Block turret_spitfire; - public static Block turret_cwis; public static Block turret_cheapo; public static Block turret_chekhov; @@ -1608,11 +1615,23 @@ public class ModBlocks { brick_asbestos = new BlockOutgas(Material.rock, true, 5, true).setBlockName("brick_asbestos").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(1000.0F).setBlockTextureName(RefStrings.MODID + ":brick_asbestos"); brick_fire = new BlockGeneric(Material.rock).setBlockName("brick_fire").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(160.0F).setBlockTextureName(RefStrings.MODID + ":brick_fire"); - ducrete_smooth = new BlockGeneric(Material.rock).setBlockName("ducrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(8000.0F).setBlockTextureName(RefStrings.MODID + ":ducrete"); ducrete = new BlockGeneric(Material.rock).setBlockName("ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(8000.0F).setBlockTextureName(RefStrings.MODID + ":ducrete_tile"); brick_ducrete = new BlockGeneric(Material.rock).setBlockName("brick_ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(12000.0F).setBlockTextureName(RefStrings.MODID + ":brick_ducrete"); reinforced_ducrete = new BlockGeneric(Material.rock).setBlockName("reinforced_ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(24000.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_ducrete"); + + concrete_slab = new BlockMultiSlab(null, Material.rock, concrete_smooth, concrete, concrete_asbestos, ducrete_smooth, ducrete).setBlockName("concrete_slab").setCreativeTab(MainRegistry.blockTab); + concrete_double_slab = new BlockMultiSlab(concrete_slab, Material.rock, concrete_smooth, concrete, concrete_asbestos, ducrete_smooth, ducrete).setBlockName("concrete_double_slab").setCreativeTab(MainRegistry.blockTab); + concrete_brick_slab = new BlockMultiSlab(null, Material.rock, brick_concrete, brick_concrete_mossy, brick_concrete_cracked, brick_concrete_broken, brick_ducrete).setBlockName("concrete_brick_slab").setCreativeTab(MainRegistry.blockTab); + concrete_brick_double_slab = new BlockMultiSlab(concrete_slab, Material.rock, brick_concrete, brick_concrete_mossy, brick_concrete_cracked, brick_concrete_broken, brick_ducrete).setBlockName("concrete_brick_double_slab").setCreativeTab(MainRegistry.blockTab); + brick_slab = new BlockMultiSlab(null, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_slab").setCreativeTab(MainRegistry.blockTab); + brick_double_slab = new BlockMultiSlab(concrete_slab, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_double_slab").setCreativeTab(MainRegistry.blockTab); + + concrete_smooth_stairs = new BlockGenericStairs(concrete_smooth, 0).setBlockName("concrete_smooth_stairs").setCreativeTab(MainRegistry.blockTab); + concrete_stairs = new BlockGenericStairs(concrete, 0).setBlockName("concrete_stairs").setCreativeTab(MainRegistry.blockTab); + concrete_asbestos_stairs = new BlockGenericStairs(concrete_asbestos, 0).setBlockName("concrete_asbestos_stairs").setCreativeTab(MainRegistry.blockTab); + ducrete_smooth_stairs = new BlockGenericStairs(ducrete_smooth, 0).setBlockName("ducrete_smooth_stairs").setCreativeTab(MainRegistry.blockTab); + ducrete_stairs = new BlockGenericStairs(ducrete, 0).setBlockName("ducrete_stairs").setCreativeTab(MainRegistry.blockTab); tile_lab = new BlockOutgas(Material.rock, false, 5, true).setBlockName("tile_lab").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(1.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":tile_lab"); tile_lab_cracked = new BlockOutgas(Material.rock, false, 5, true).setBlockName("tile_lab_cracked").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(1.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":tile_lab_cracked"); @@ -2111,13 +2130,7 @@ public class ModBlocks { sat_dock = new MachineSatDock(Material.iron).setBlockName("sat_dock").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":sat_dock"); soyuz_capsule = new SoyuzCapsule(Material.iron).setBlockName("soyuz_capsule").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":soyuz_capsule"); - turret_light = new TurretLight(Material.iron).setBlockName("turret_light").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_light"); - turret_heavy = new TurretHeavy(Material.iron).setBlockName("turret_heavy").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_heavy"); - turret_rocket = new TurretRocket(Material.iron).setBlockName("turret_rocket").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_rocket"); - turret_flamer = new TurretFlamer(Material.iron).setBlockName("turret_flamer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_flamer"); - turret_tau = new TurretTau(Material.iron).setBlockName("turret_tau").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_tau"); turret_spitfire = new TurretSpitfire(Material.iron).setBlockName("turret_spitfire").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":code"); - turret_cwis = new TurretCIWS(Material.iron).setBlockName("turret_cwis").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_cwis"); turret_cheapo = new TurretCheapo(Material.iron).setBlockName("turret_cheapo").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":turret_cheapo"); turret_chekhov = new TurretChekhov(Material.iron).setBlockName("turret_chekhov").setHardness(5.0F).setResistance(600.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -2379,7 +2392,7 @@ public class ModBlocks { pink_planks = new BlockGeneric(Material.wood).setBlockName("pink_planks").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); pink_slab = new BlockPinkSlab(false, Material.wood).setBlockName("pink_slab").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); pink_double_slab = new BlockPinkSlab(true, Material.wood).setBlockName("pink_double_slab").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); - pink_stairs = new BlockPinkStairs(pink_planks, 0).setBlockName("pink_stairs").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); + pink_stairs = new BlockGenericStairs(pink_planks, 0).setBlockName("pink_stairs").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); ff = new BlockFF(Material.iron).setBlockName("ff").setHardness(0.5F).setStepSound(Block.soundTypeGravel).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":code"); } @@ -2712,6 +2725,19 @@ public class ModBlocks { GameRegistry.registerBlock(brick_light, ItemBlockBlastInfo.class, brick_light.getUnlocalizedName()); GameRegistry.registerBlock(brick_asbestos, brick_asbestos.getUnlocalizedName()); GameRegistry.registerBlock(brick_fire, ItemBlockBlastInfo.class, brick_fire.getUnlocalizedName()); + + GameRegistry.registerBlock(concrete_slab, ItemModSlab.class, concrete_slab.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_double_slab, ItemModSlab.class, concrete_double_slab.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_brick_slab, ItemModSlab.class, concrete_brick_slab.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_brick_double_slab, ItemModSlab.class, concrete_brick_double_slab.getUnlocalizedName()); + GameRegistry.registerBlock(brick_slab, ItemModSlab.class, brick_slab.getUnlocalizedName()); + GameRegistry.registerBlock(brick_double_slab, ItemModSlab.class, brick_double_slab.getUnlocalizedName()); + + GameRegistry.registerBlock(concrete_smooth_stairs, concrete_smooth_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_stairs, concrete_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_asbestos_stairs, concrete_asbestos_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(ducrete_smooth_stairs, ducrete_smooth_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(ducrete_stairs, ducrete_stairs.getUnlocalizedName()); //CMB Building Elements GameRegistry.registerBlock(cmb_brick, ItemBlockBlastInfo.class, cmb_brick.getUnlocalizedName()); @@ -2841,12 +2867,6 @@ public class ModBlocks { //RAD GameRegistry.registerBlock(sellafield_slaked, sellafield_slaked.getUnlocalizedName()); GameRegistry.registerBlock(sellafield, ItemBlockNamedMeta.class, sellafield.getUnlocalizedName()); - /*GameRegistry.registerBlock(sellafield_0, sellafield_0.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_1, sellafield_1.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_2, sellafield_2.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_3, sellafield_3.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_4, sellafield_4.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_core, sellafield_core.getUnlocalizedName());*/ //Geysirs GameRegistry.registerBlock(geysir_water, geysir_water.getUnlocalizedName()); @@ -2878,13 +2898,7 @@ public class ModBlocks { GameRegistry.registerBlock(c4, c4.getUnlocalizedName()); //Turrets - GameRegistry.registerBlock(turret_light, turret_light.getUnlocalizedName()); - GameRegistry.registerBlock(turret_heavy, turret_heavy.getUnlocalizedName()); - GameRegistry.registerBlock(turret_rocket, turret_rocket.getUnlocalizedName()); - GameRegistry.registerBlock(turret_flamer, turret_flamer.getUnlocalizedName()); - GameRegistry.registerBlock(turret_tau, turret_tau.getUnlocalizedName()); GameRegistry.registerBlock(turret_spitfire, turret_spitfire.getUnlocalizedName()); - GameRegistry.registerBlock(turret_cwis, ItemBlockLore.class, turret_cwis.getUnlocalizedName()); GameRegistry.registerBlock(turret_cheapo, turret_cheapo.getUnlocalizedName()); GameRegistry.registerBlock(turret_chekhov, turret_chekhov.getUnlocalizedName()); GameRegistry.registerBlock(turret_friendly, turret_friendly.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java b/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java new file mode 100644 index 000000000..b94834e2f --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java @@ -0,0 +1,12 @@ +package com.hbm.blocks.generic; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockStairs; + +public class BlockGenericStairs extends BlockStairs { + + public BlockGenericStairs(Block block, int meta) { + super(block, meta); + } + +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java b/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java new file mode 100644 index 000000000..97c8f000d --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java @@ -0,0 +1,89 @@ +package com.hbm.blocks.generic; + +import java.util.List; +import java.util.Random; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockSlab; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class BlockMultiSlab extends BlockSlab { + + public Block[] slabMaterials; + public Block single; + + public BlockMultiSlab(Block single, Material mat, Block... slabMaterials) { + super(single != null, mat); + this.single = single; + this.slabMaterials = slabMaterials; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + meta = (meta & 7) % slabMaterials.length; + Block block = slabMaterials[meta]; + return block.getIcon(side, meta); + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + return Item.getItemFromBlock(single != null ? single : this); + } + + @Override + protected ItemStack createStackedBlock(int meta) { + return new ItemStack(Item.getItemFromBlock(single != null ? single : this), 2, meta & 7); + } + + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z) { + return Item.getItemFromBlock(single != null ? single : this); + } + + @Override + public String func_150002_b(int meta) { + meta = (meta & 7) % slabMaterials.length; + Block block = slabMaterials[meta]; + return super.getUnlocalizedName() + "." + block.getUnlocalizedName().substring(5); + } + + @Override + public int getDamageValue(World world, int x, int y, int z) { + return super.getDamageValue(world, x, y, z) & 7; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + + if(single == null) { + for(int i = 0; i < slabMaterials.length; ++i) { + list.add(new ItemStack(item, 1, i)); + } + } + } + + @Override + public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX, double explosionY, double explosionZ) { + int meta = world.getBlockMetadata(x, y, z); + meta = (meta & 7) % slabMaterials.length; + Block block = slabMaterials[meta]; + return block.getExplosionResistance(entity); + } + + @Override + public float getBlockHardness(World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + meta = (meta & 7) % slabMaterials.length; + Block block = slabMaterials[meta]; + return block.getBlockHardness(world, x, y, z); //relies on block not assuming that they are at that position + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockPinkSlab.java b/src/main/java/com/hbm/blocks/generic/BlockPinkSlab.java index 972a71df7..ad03375e9 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPinkSlab.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPinkSlab.java @@ -15,15 +15,15 @@ public class BlockPinkSlab extends BlockSlab { super(bool, mat); } - public Item getItemDropped(int i, Random rand, int j) - { - return Item.getItemFromBlock(ModBlocks.pink_slab); - } - - protected ItemStack createStackedBlock(int i) - { - return new ItemStack(Item.getItemFromBlock(ModBlocks.pink_slab), 2, i & 7); - } + @Override + public Item getItemDropped(int i, Random rand, int j) { + return Item.getItemFromBlock(ModBlocks.pink_slab); + } + + @Override + protected ItemStack createStackedBlock(int i) { + return new ItemStack(Item.getItemFromBlock(ModBlocks.pink_slab), 2, i & 7); + } @Override public String func_150002_b(int p_150002_1_) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockPinkStairs.java b/src/main/java/com/hbm/blocks/generic/BlockPinkStairs.java deleted file mode 100644 index 501caa6ac..000000000 --- a/src/main/java/com/hbm/blocks/generic/BlockPinkStairs.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.blocks.generic; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockStairs; - -public class BlockPinkStairs extends BlockStairs { - - public BlockPinkStairs(Block p_i45428_1_, int p_i45428_2_) { - super(p_i45428_1_, p_i45428_2_); - } - -} diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index d88dc2b5c..08df4a45b 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -297,12 +297,6 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(ModBlocks.deco_pipe_framed_marked, new ItemStack(ModItems.powder_steel, 1)); /* Turret and ammo recycling */ - ShredderRecipes.setRecipe(ModBlocks.turret_light, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_heavy, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_flamer, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_rocket, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_cwis, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_tau, new ItemStack(ModItems.powder_steel, 16)); ShredderRecipes.setRecipe(ModItems.turret_light_ammo, new ItemStack(Items.gunpowder, 4)); ShredderRecipes.setRecipe(ModItems.turret_heavy_ammo, new ItemStack(Items.gunpowder, 4)); ShredderRecipes.setRecipe(ModItems.turret_flamer_ammo, new ItemStack(Items.gunpowder, 4)); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 918c72eeb..77cf12ce4 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -4866,13 +4866,7 @@ public class ModItems { mech_key = new ItemCustomLore().setUnlocalizedName("mech_key").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":mech_key"); - turret_light_ammo = new ItemTurretAmmo(ModBlocks.turret_light, 100).setUnlocalizedName("turret_light_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_light_ammo"); - turret_heavy_ammo = new ItemTurretAmmo(ModBlocks.turret_heavy, 25).setUnlocalizedName("turret_heavy_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_heavy_ammo"); - turret_rocket_ammo = new ItemTurretAmmo(ModBlocks.turret_rocket, 8).setUnlocalizedName("turret_rocket_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_rocket_ammo"); - turret_flamer_ammo = new ItemTurretAmmo(ModBlocks.turret_flamer, 200).setUnlocalizedName("turret_flamer_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_flamer_ammo"); - turret_tau_ammo = new ItemTurretAmmo(ModBlocks.turret_tau, 100).setUnlocalizedName("turret_tau_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_tau_ammo"); turret_spitfire_ammo = new ItemTurretAmmo(ModBlocks.turret_spitfire, 2).setUnlocalizedName("turret_spitfire_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":turret_spitfire_ammo"); - turret_cwis_ammo = new ItemTurretAmmo(ModBlocks.turret_cwis, 250).setUnlocalizedName("turret_cwis_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_cwis_ammo"); turret_cheapo_ammo = new ItemTurretAmmo(ModBlocks.turret_cheapo, 100).setUnlocalizedName("turret_cheapo_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":turret_cheapo_ammo"); template_folder = new ItemTemplateFolder().setUnlocalizedName("template_folder").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":template_folder"); diff --git a/src/main/java/com/hbm/items/block/ItemBlockLore.java b/src/main/java/com/hbm/items/block/ItemBlockLore.java index 5be85c400..1d7fb0c1e 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockLore.java +++ b/src/main/java/com/hbm/items/block/ItemBlockLore.java @@ -97,13 +97,6 @@ public class ItemBlockLore extends ItemBlockBase { list.add(""); list.add("i added an item for a joke that isn't even here, what am i, stupid? can't even tell the difference between gravel and a gavel, how did i not forget how to breathe yet?"); } - - if(this.field_150939_a == ModBlocks.turret_cwis) { - list.add("Hmmm today I will use an anti-missile turret agains mobs"); - list.add(""); - list.add("Why does it not work???"); - list.add("bob pls fix"); - } } @Override diff --git a/src/main/java/com/hbm/items/block/ItemModSlab.java b/src/main/java/com/hbm/items/block/ItemModSlab.java new file mode 100644 index 000000000..a562c28f2 --- /dev/null +++ b/src/main/java/com/hbm/items/block/ItemModSlab.java @@ -0,0 +1,28 @@ +package com.hbm.items.block; + +import com.hbm.blocks.ModBlocks; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockSlab; +import net.minecraft.item.ItemSlab; + +public class ItemModSlab extends ItemSlab { + + public ItemModSlab(Block block) { + super(block, shittyFuckingHackSingle(block), shittyFuckingHackDouble(block), shittyFuckingHackDouble(block) == block); + } + + public static BlockSlab shittyFuckingHackSingle(Block b) { + if(b == ModBlocks.concrete_slab || b == ModBlocks.concrete_double_slab) return (BlockSlab) ModBlocks.concrete_slab; + if(b == ModBlocks.concrete_brick_slab || b == ModBlocks.concrete_brick_double_slab) return (BlockSlab) ModBlocks.concrete_brick_slab; + if(b == ModBlocks.brick_slab || b == ModBlocks.brick_double_slab) return (BlockSlab) ModBlocks.brick_slab; + return null; + } + + public static BlockSlab shittyFuckingHackDouble(Block b) { + if(b == ModBlocks.concrete_slab || b == ModBlocks.concrete_double_slab) return (BlockSlab) ModBlocks.concrete_double_slab; + if(b == ModBlocks.concrete_brick_slab || b == ModBlocks.concrete_brick_double_slab) return (BlockSlab) ModBlocks.concrete_brick_double_slab; + if(b == ModBlocks.brick_slab || b == ModBlocks.brick_double_slab) return (BlockSlab) ModBlocks.brick_double_slab; + return null; + } +} diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 96b928b48..42b2e7757 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -943,6 +943,12 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.factory_advanced_conductor"); ignoreMappings.add("hbm:tile.factory_titanium_furnace"); ignoreMappings.add("hbm:tile.factory_advanced_furnace"); + ignoreMappings.add("hbm:tile.turret_light"); + ignoreMappings.add("hbm:tile.turret_heavy"); + ignoreMappings.add("hbm:tile.turret_rocket"); + ignoreMappings.add("hbm:tile.turret_flamer"); + ignoreMappings.add("hbm:tile.turret_tau"); + ignoreMappings.add("hbm:tile.turret_cwis"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java index 49702b541..28c2aec96 100644 --- a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java +++ b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java @@ -32,10 +32,12 @@ public class RenderMovingItem extends Render { if(!(stack.getItem() instanceof ItemBlock)) { GL11.glRotatef(90F, 1.0F, 0.0F, 0.0F); GL11.glTranslated(0.0, -0.1875, 0.0); + + if(!this.renderManager.options.fancyGraphics) + GL11.glTranslated(0.0, 0.0625, 0.0); } EntityItem dummy = new EntityItem(entity.worldObj, 0, 0, 0, stack); - //dummy.getEntityItem().stackSize = 1; dummy.hoverStart = 0.0F; RenderItem.renderInFrame = true; From 2ea17f1e132a47f463769f82771f556680639789 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 9 Oct 2022 01:26:18 +0200 Subject: [PATCH 100/111] boil yourself --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../com/hbm/blocks/machine/MachineBoiler.java | 2 - .../hbm/blocks/machine/MachineHeatBoiler.java | 177 ++ .../inventory/recipes/ShredderRecipes.java | 8 - src/main/java/com/hbm/items/ModItems.java | 12 - src/main/java/com/hbm/main/ClientProxy.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 6 + .../java/com/hbm/main/ResourceManager.java | 3 + .../hbm/render/block/RenderFoundryBasin.java | 2 + .../hbm/render/block/RenderFoundryMold.java | 2 + .../hbm/render/tileentity/RenderBoiler.java | 70 + .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityHeatBoiler.java | 281 +++ .../assets/hbm/models/machines/boiler.obj | 2080 +++++++++++++++++ .../hbm/models/machines/boiler_burst.obj | 1299 ++++++++++ src/main/resources/assets/hbm/sounds.json | 1 + .../assets/hbm/sounds/block/boilerGroan0.ogg | Bin 0 -> 11029 bytes .../assets/hbm/sounds/block/boilerGroan1.ogg | Bin 0 -> 23878 bytes .../assets/hbm/sounds/block/boilerGroan2.ogg | Bin 0 -> 15264 bytes .../hbm/textures/blocks/test_bb_bork.png | Bin 191 -> 427 bytes .../assets/hbm/textures/items/empblast.png | Bin 235 -> 454 bytes .../hbm/textures/items/recycled_crystal.png | Bin 292 -> 811 bytes .../assets/hbm/textures/items/void_anim.png | Bin 2582 -> 255 bytes .../hbm/textures/items/void_anim.png.mcmeta | 3 - .../hbm/textures/models/machines/boiler.png | Bin 0 -> 7154 bytes 25 files changed, 3926 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderBoiler.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java create mode 100644 src/main/resources/assets/hbm/models/machines/boiler.obj create mode 100644 src/main/resources/assets/hbm/models/machines/boiler_burst.obj create mode 100644 src/main/resources/assets/hbm/sounds/block/boilerGroan0.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/boilerGroan1.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/boilerGroan2.ogg delete mode 100644 src/main/resources/assets/hbm/textures/items/void_anim.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/models/machines/boiler.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index ea0a02ca5..96a928f25 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -652,6 +652,7 @@ public class ModBlocks { public static Block machine_stirling_steel; public static Block machine_sawmill; public static Block machine_crucible; + public static Block machine_boiler; public static Block foundry_mold; public static Block foundry_basin; @@ -1846,6 +1847,7 @@ public class ModBlocks { machine_stirling_steel = new MachineStirling().setBlockName("machine_stirling_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_sawmill = new MachineSawmill().setBlockName("machine_sawmill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + machine_boiler = new MachineHeatBoiler().setBlockName("machine_boiler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_copper"); foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); @@ -3040,6 +3042,7 @@ public class ModBlocks { register(machine_stirling_steel); register(machine_sawmill); register(machine_crucible); + register(machine_boiler); register(foundry_mold); register(foundry_basin); register(foundry_channel); diff --git a/src/main/java/com/hbm/blocks/machine/MachineBoiler.java b/src/main/java/com/hbm/blocks/machine/MachineBoiler.java index f89f9c003..4006d092d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBoiler.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBoiler.java @@ -30,7 +30,6 @@ import net.minecraft.world.World; public class MachineBoiler extends BlockContainer { private final Random field_149933_a = new Random(); - private Random rand; private final boolean isActive; private static boolean keepInventory; @@ -41,7 +40,6 @@ public class MachineBoiler extends BlockContainer { public MachineBoiler(boolean blockState) { super(Material.iron); - rand = new Random(); isActive = blockState; } diff --git a/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java b/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java new file mode 100644 index 000000000..91963722a --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java @@ -0,0 +1,177 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.trait.FT_Heatable; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityHeatBoiler; +import com.hbm.util.I18nUtil; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay { + + public MachineHeatBoiler() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) return new TileEntityHeatBoiler(); + if(meta >= extra) return new TileEntityProxyCombo().fluid(); + return null; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(!world.isRemote && !player.isSneaking()) { + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return false; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntityHeatBoiler)) + return false; + + TileEntityHeatBoiler boiler = (TileEntityHeatBoiler) te; + + FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, pos[0], pos[1], pos[2], player.getHeldItem()); + + if(type.hasTrait(FT_Heatable.class) && type.getTrait(FT_Heatable.class).getEfficiency(HeatingType.BOILER) > 0) { + boiler.tanks[0].setTankType(type); + boiler.markDirty(); + player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation("hbmfluid." + type.getName().toLowerCase())).appendSibling(new ChatComponentText("!"))); + } + return true; + } + return false; + + } else { + return true; + } + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + super.onBlockPlacedBy(world, x, y, z, player, itemStack); + + if(itemStack.getItemDamage() == 1) { + + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + int o = -getOffset(); + + ForgeDirection dir = ForgeDirection.NORTH; + if(i == 0) dir = ForgeDirection.getOrientation(2); + if(i == 1) dir = ForgeDirection.getOrientation(5); + if(i == 2) dir = ForgeDirection.getOrientation(3); + if(i == 3) dir = ForgeDirection.getOrientation(4); + + dir = getDirModified(dir); + + TileEntity te = world.getTileEntity(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o); + + if(te instanceof TileEntityHeatBoiler) { + ((TileEntityHeatBoiler) te).hasExploded = true; + } + } + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + + int count = quantityDropped(metadata, fortune, world.rand); + int dmg = 0; + + int[] pos = this.findCore(world, x, y, z); + + if(pos != null) { + TileEntityHeatBoiler stirling = (TileEntityHeatBoiler)world.getTileEntity(pos[0], pos[1], pos[2]); + if(stirling.hasExploded) { + dmg = 1; + } + } + + for(int i = 0; i < count; i++) { + Item item = getItemDropped(metadata, world.rand, fortune); + if(item != null) { + ret.add(new ItemStack(item, 1, dmg)); + } + } + return ret; + } + + @Override + public int[] getDimensions() { + return new int[] {3, 0, 1, 1, 1, 1}; + } + + @Override + public int getOffset() { + return 1; + } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + x = x + dir.offsetX * o; + z = z + dir.offsetZ * o; + + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + this.makeExtra(world, x + rot.offsetX, y, z + rot.offsetZ); + this.makeExtra(world, x - rot.offsetX, y, z - rot.offsetZ); + this.makeExtra(world, x, y + 3, z); + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntityHeatBoiler)) + return; + + TileEntityHeatBoiler boiler = (TileEntityHeatBoiler) te; + + if(boiler.hasExploded) return; + + List text = new ArrayList(); + text.add(boiler.heat + "TU"); + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + I18nUtil.resolveKey(boiler.tanks[0].getTankType().getUnlocalizedName()) + ": " + boiler.tanks[0].getFill() + " / " + boiler.tanks[0].getMaxFill() + "mB"); + text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + I18nUtil.resolveKey(boiler.tanks[1].getTankType().getUnlocalizedName()) + ": " + boiler.tanks[1].getFill() + " / " + boiler.tanks[1].getMaxFill() + "mB"); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index 08df4a45b..4006b2b51 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -296,14 +296,6 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(ModBlocks.deco_pipe_framed_red, new ItemStack(ModItems.powder_steel, 1)); ShredderRecipes.setRecipe(ModBlocks.deco_pipe_framed_marked, new ItemStack(ModItems.powder_steel, 1)); - /* Turret and ammo recycling */ - ShredderRecipes.setRecipe(ModItems.turret_light_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_heavy_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_flamer_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_rocket_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_cwis_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_tau_ammo, new ItemStack(ModItems.powder_uranium, 4)); - /* Wool and clay scrapping */ for(int i = 0; i < 16; i++) { ShredderRecipes.setRecipe(new ItemStack(Blocks.stained_hardened_clay, 1, i), new ItemStack(Items.clay_ball, 4)); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 77cf12ce4..d2fe5b08c 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2430,13 +2430,7 @@ public class ModItems { public static Item mech_key; - public static Item turret_light_ammo; - public static Item turret_heavy_ammo; - public static Item turret_rocket_ammo; - public static Item turret_flamer_ammo; - public static Item turret_tau_ammo; public static Item turret_spitfire_ammo; - public static Item turret_cwis_ammo; public static Item turret_cheapo_ammo; public static Item bucket_mud; @@ -7464,13 +7458,7 @@ public class ModItems { GameRegistry.registerItem(ammo_folly_du, ammo_folly_du.getUnlocalizedName()); //Turret Ammo - GameRegistry.registerItem(turret_light_ammo, turret_light_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_heavy_ammo, turret_heavy_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_rocket_ammo, turret_rocket_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_flamer_ammo, turret_flamer_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_tau_ammo, turret_tau_ammo.getUnlocalizedName()); GameRegistry.registerItem(turret_spitfire_ammo, turret_spitfire_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_cwis_ammo, turret_cwis_ammo.getUnlocalizedName()); GameRegistry.registerItem(turret_cheapo_ammo, turret_cheapo_ammo.getUnlocalizedName()); //-C-l-i-p-s- Magazines diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index a927da6c9..5b28543ec 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -265,6 +265,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityStirling.class, new RenderStirling()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySawmill.class, new RenderSawmill()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrucible.class, new RenderCrucible()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeatBoiler.class, new RenderBoiler()); //Foundry ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryBasin.class, new RenderFoundry()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryMold.class, new RenderFoundry()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 42b2e7757..2233bbaec 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -949,6 +949,12 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.turret_flamer"); ignoreMappings.add("hbm:tile.turret_tau"); ignoreMappings.add("hbm:tile.turret_cwis"); + ignoreMappings.add("hbm:item.turret_light_ammo"); + ignoreMappings.add("hbm:item.turret_heavy_ammo"); + ignoreMappings.add("hbm:item.turret_rocket_ammo"); + ignoreMappings.add("hbm:item.turret_flamer_ammo"); + ignoreMappings.add("hbm:item.turret_tau_ammo"); + ignoreMappings.add("hbm:item.turret_cwis_ammo"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 38eb82021..c2b066ff3 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -65,6 +65,8 @@ public class ResourceManager { public static final IModelCustom stirling = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/stirling.obj")); public static final IModelCustom sawmill = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/sawmill.obj")); public static final IModelCustom crucible_heat = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/crucible.obj")); + public static final IModelCustom boiler = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/boiler.obj")); + public static final IModelCustom boiler_burst = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/boiler_burst.obj")); //Furnaces public static final IModelCustom furnace_iron = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_iron.obj")); @@ -387,6 +389,7 @@ public class ResourceManager { public static final ResourceLocation stirling_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling_steel.png"); public static final ResourceLocation sawmill_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/sawmill.png"); public static final ResourceLocation crucible_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/crucible_heat.png"); + public static final ResourceLocation boiler_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/boiler.png"); //Furnaces public static final ResourceLocation furnace_iron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_iron.png"); diff --git a/src/main/java/com/hbm/render/block/RenderFoundryBasin.java b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java index 17917603a..342ec7838 100644 --- a/src/main/java/com/hbm/render/block/RenderFoundryBasin.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java @@ -23,6 +23,8 @@ public class RenderFoundryBasin implements ISimpleBlockRenderingHandler { double z = 0; GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + basin.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); tessellator.startDrawingQuads(); tessellator.setNormal(0F, 1F, 0F); diff --git a/src/main/java/com/hbm/render/block/RenderFoundryMold.java b/src/main/java/com/hbm/render/block/RenderFoundryMold.java index 248b98c58..5958ba8e5 100644 --- a/src/main/java/com/hbm/render/block/RenderFoundryMold.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryMold.java @@ -23,6 +23,8 @@ public class RenderFoundryMold implements ISimpleBlockRenderingHandler { double z = 0; GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + basin.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); tessellator.startDrawingQuads(); tessellator.setNormal(0F, 1F, 0F); diff --git a/src/main/java/com/hbm/render/tileentity/RenderBoiler.java b/src/main/java/com/hbm/render/tileentity/RenderBoiler.java new file mode 100644 index 000000000..65bbbed75 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderBoiler.java @@ -0,0 +1,70 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityHeatBoiler; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderBoiler extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.boiler_tex); + TileEntityHeatBoiler boiler = (TileEntityHeatBoiler) tile; + if(!boiler.hasExploded) { + GL11.glEnable(GL11.GL_CULL_FACE); + ResourceManager.boiler.renderAll(); + } else { + GL11.glDisable(GL11.GL_CULL_FACE); + ResourceManager.boiler_burst.renderAll(); + GL11.glEnable(GL11.GL_CULL_FACE); + } + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_boiler); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -3, 0); + GL11.glScaled(3, 3, 3); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.boiler_tex); + if(item.getItemDamage() == 1) + ResourceManager.boiler_burst.renderAll(); + else + ResourceManager.boiler.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 90cf23c00..3f5dc6b93 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -251,6 +251,7 @@ public class TileMappings { put(TileEntityStirling.class, "tileentity_stirling"); put(TileEntitySawmill.class, "tileentity_sawmill"); put(TileEntityCrucible.class, "tileentity_crucible"); + put(TileEntityHeatBoiler.class, "tileentity_heat_boiler"); put(TileEntityFoundryMold.class, "tileentity_foundry_mold"); put(TileEntityFoundryBasin.class, "tileentity_foundry_basin"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java new file mode 100644 index 000000000..7d2ca6e8b --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -0,0 +1,281 @@ +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.interfaces.IFluidAcceptor; +import com.hbm.interfaces.IFluidSource; +import com.hbm.inventory.fluid.FluidType; +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_Heatable.HeatingStep; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; +import com.hbm.lib.Library; +import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IHeatSource; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IFluidSource, IFluidAcceptor, INBTPacketReceiver, IFluidStandardTransceiver { + + public int heat; + public static final int maxHeat = 12_800_000; //the heat required to turn 64k of water into steam + public static final double diffusion = 0.1D; + public FluidTank[] tanks; + public List list = new ArrayList(); + public boolean hasExploded = false; + + public TileEntityHeatBoiler() { + this.tanks = new FluidTank[2]; + + this.tanks[0] = new FluidTank(Fluids.WATER, 64_000, 0); + this.tanks[1] = new FluidTank(Fluids.STEAM, 64_000 * 100, 1); + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + NBTTagCompound data = new NBTTagCompound(); + + if(!this.hasExploded) { + this.setupTanks(); + this.updateConnections(); + this.tryPullHeat(); + int lastHeat = this.heat; + + data.setInteger("heat", lastHeat); + + tanks[0].writeToNBT(data, "0"); + this.tryConvert(); + tanks[1].writeToNBT(data, "1"); + + if(this.tanks[1].getFill() > 0) { + this.sendFluid(); + + fillFluidInit(tanks[1].getTankType()); + } + } + + data.setBoolean("exploded", this.hasExploded); + INBTPacketReceiver.networkPack(this, data, 25); + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.hasExploded = nbt.getBoolean("exploded"); + this.heat = nbt.getInteger("heat"); + this.tanks[0].readFromNBT(nbt, "0"); + this.tanks[1].readFromNBT(nbt, "1"); + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + int diff = source.getHeatStored() - this.heat; + + if(diff == 0) { + return; + } + + if(diff > 0) { + diff = (int) Math.ceil(diff * diffusion); + source.useUpHeat(diff); + this.heat += diff; + if(this.heat > this.maxHeat) + this.heat = this.maxHeat; + return; + } + } + + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); + } + + protected void setupTanks() { + + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { + FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); + if(trait.getEfficiency(HeatingType.BOILER) > 0) { + HeatingStep entry = trait.getFirstStep(); + tanks[1].setTankType(entry.typeProduced); + tanks[1].changeTankSize(tanks[0].getMaxFill() * entry.amountProduced / entry.amountReq); + return; + } + } + + tanks[0].setTankType(Fluids.NONE); + tanks[1].setTankType(Fluids.NONE); + } + + protected void tryConvert() { + + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { + FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); + if(trait.getEfficiency(HeatingType.BOILER) > 0) { + + HeatingStep entry = trait.getFirstStep(); + int inputOps = this.tanks[0].getFill() / entry.amountReq; + int outputOps = (this.tanks[1].getMaxFill() - this.tanks[1].getFill()) / entry.amountProduced; + int heatOps = this.heat / entry.heatReq; + + int ops = Math.min(inputOps, Math.min(outputOps, heatOps)); + + this.tanks[0].setFill(this.tanks[0].getFill() - entry.amountReq * ops); + this.tanks[1].setFill(this.tanks[1].getFill() + entry.amountProduced * ops); + this.heat -= entry.heatReq * ops; + + if(ops > 0 && worldObj.rand.nextInt(400) == 0) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 2, zCoord + 0.5, "hbm:block.boilerGroan", 0.5F, 1.0F); + } + + if(outputOps == 0) { + this.hasExploded = true; + worldObj.newExplosion(null, xCoord + 0.5, yCoord + 2, zCoord + 0.5, 5F, false, false); + BlockDummyable.safeRem = true; + for(int x = xCoord - 1; x <= xCoord + 1; x++) { + for(int y = yCoord + 2; y <= yCoord + 3; y++) { + for(int z = zCoord - 1; z <= zCoord + 1; z++) { + worldObj.setBlockToAir(x, y, z); + } + } + } + worldObj.setBlockToAir(xCoord, yCoord + 1, zCoord); + BlockDummyable.safeRem = false; + } + } + } + } + + private void updateConnections() { + + for(DirPos pos : getConPos()) { + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + + private void sendFluid() { + + for(DirPos pos : getConPos()) { + this.sendFluid(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir().getOpposite()); + } + } + + private DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getRotation(ForgeDirection.UP); + return new DirPos[] { + new DirPos(xCoord + dir.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2, dir), + new DirPos(xCoord - dir.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2, dir.getOpposite()), + new DirPos(xCoord, yCoord + 4, zCoord, Library.POS_Y), + }; + } + + @Override + public void setFluidFill(int fill, FluidType type) { + for(FluidTank tank : tanks) { + if(tank.getTankType() == type) { + tank.setFill(fill); + return; + } + } + } + + @Override public void setFillForSync(int fill, int index) { } + @Override public void setTypeForSync(FluidType type, int index) { } + + @Override + public int getFluidFill(FluidType type) { + for(FluidTank tank : tanks) { + if(tank.getTankType() == type) { + return tank.getFill(); + } + } + return 0; + } + + @Override + public int getMaxFluidFill(FluidType type) { + return type == tanks[0].getTankType() ? tanks[0].getMaxFill() : 0; + } + + @Override + public void fillFluidInit(FluidType type) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getRotation(ForgeDirection.UP); + this.fillFluid(xCoord + dir.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2, this.getTact(), type); + this.fillFluid(xCoord - dir.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2, this.getTact(), type); + this.fillFluid(xCoord, yCoord + 4, zCoord, this.getTact(), type); + } + + @Override + public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { + Library.transmitFluid(x, y, z, newTact, this, worldObj, type); + } + + @Override + public boolean getTact() { + return worldObj.getTotalWorldTime() % 2 == 0; + } + + @Override + public List getFluidList(FluidType type) { + return this.list; + } + + @Override + public void clearFluidList(FluidType type) { + this.list.clear(); + } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] {tanks[1]}; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] {tanks[0]}; + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 4, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/resources/assets/hbm/models/machines/boiler.obj b/src/main/resources/assets/hbm/models/machines/boiler.obj new file mode 100644 index 000000000..352e0ce4d --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/boiler.obj @@ -0,0 +1,2080 @@ +# Blender v2.79 (sub 0) OBJ File: 'boiler.blend' +# www.blender.org +o Plane +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.500000 0.250000 1.500000 +v 1.500000 0.250000 1.500000 +v -1.500000 0.250000 -1.500000 +v 1.500000 0.250000 -1.500000 +v 0.000000 0.250000 -1.375000 +v -0.526190 0.250000 -1.270334 +v -0.972272 0.250000 -0.972272 +v -1.270334 0.250000 -0.526190 +v -1.375000 0.250000 0.000000 +v -1.270334 0.250000 0.526190 +v -0.972272 0.250000 0.972272 +v -0.526190 0.250000 1.270334 +v -0.000000 0.250000 1.375000 +v 0.526189 0.250000 1.270334 +v 0.972272 0.250000 0.972272 +v 1.270334 0.250000 0.526190 +v 1.375000 0.250000 -0.000000 +v 1.270334 0.250000 -0.526190 +v 0.972272 0.250000 -0.972272 +v 0.526189 0.250000 -1.270335 +v 0.000000 0.500000 -1.375000 +v -0.526190 0.500000 -1.270334 +v -0.972272 0.500000 -0.972272 +v -1.270334 0.500000 -0.526190 +v -1.375000 0.500000 0.000000 +v -1.270334 0.500000 0.526190 +v -0.972272 0.500000 0.972272 +v -0.526190 0.500000 1.270334 +v -0.000000 0.500000 1.375000 +v 0.526189 0.500000 1.270334 +v 0.972272 0.500000 0.972272 +v 1.270334 0.500000 0.526190 +v 1.375000 0.500000 -0.000000 +v 1.270334 0.500000 -0.526190 +v 0.972272 0.500000 -0.972272 +v 0.526189 0.500000 -1.270335 +v 0.000000 3.000000 -1.375000 +v -0.526190 3.000000 -1.270334 +v -0.972272 3.000000 -0.972272 +v -1.270334 3.000000 -0.526190 +v -1.375000 3.000000 0.000000 +v -1.270334 3.000000 0.526190 +v -0.972272 3.000000 0.972272 +v -0.526190 3.000000 1.270334 +v -0.000000 3.000000 1.375000 +v 0.526189 3.000000 1.270334 +v 0.972272 3.000000 0.972272 +v 1.270334 3.000000 0.526190 +v 1.375000 3.000000 -0.000000 +v 1.270334 3.000000 -0.526190 +v 0.972272 3.000000 -0.972272 +v 0.526189 3.000000 -1.270335 +v 0.000000 3.250000 -1.375000 +v -0.526190 3.250000 -1.270334 +v -0.972272 3.250000 -0.972272 +v -1.270334 3.250000 -0.526190 +v -1.375000 3.250000 0.000000 +v -1.270334 3.250000 0.526190 +v -0.972272 3.250000 0.972272 +v -0.526190 3.250000 1.270334 +v -0.000000 3.250000 1.375000 +v 0.526189 3.250000 1.270334 +v 0.972272 3.250000 0.972272 +v 1.270334 3.250000 0.526190 +v 1.375000 3.250000 -0.000000 +v 1.270334 3.250000 -0.526190 +v 0.972272 3.250000 -0.972272 +v 0.526189 3.250000 -1.270335 +v 0.000000 0.500000 -1.250000 +v -0.478354 0.500000 -1.154849 +v -0.883883 0.500000 -0.883883 +v -1.154849 0.500000 -0.478354 +v -1.250000 0.500000 0.000000 +v -1.154849 0.500000 0.478354 +v -0.883883 0.500000 0.883883 +v -0.478354 0.500000 1.154849 +v -0.000000 0.500000 1.250000 +v 0.478354 0.500000 1.154850 +v 0.883883 0.500000 0.883884 +v 1.154849 0.500000 0.478354 +v 1.250000 0.500000 -0.000000 +v 1.154849 0.500000 -0.478355 +v 0.883883 0.500000 -0.883884 +v 0.478354 0.500000 -1.154850 +v 0.000000 3.000000 -1.250000 +v -0.478354 3.000000 -1.154849 +v -0.883883 3.000000 -0.883883 +v -1.154849 3.000000 -0.478354 +v -1.250000 3.000000 0.000000 +v -1.154849 3.000000 0.478354 +v -0.883883 3.000000 0.883883 +v -0.478354 3.000000 1.154849 +v -0.000000 3.000000 1.250000 +v 0.478354 3.000000 1.154850 +v 0.883883 3.000000 0.883884 +v 1.154849 3.000000 0.478354 +v 1.250000 3.000000 -0.000000 +v 1.154849 3.000000 -0.478355 +v 0.883883 3.000000 -0.883884 +v 0.478354 3.000000 -1.154850 +v -0.000000 3.500000 -1.082532 +v -0.000000 3.250000 -1.250000 +v 0.239177 3.683013 -0.577425 +v 0.414267 3.500000 -1.000129 +v 0.478354 3.250000 -1.154849 +v 0.441941 3.683013 -0.441942 +v 0.765465 3.500000 -0.765465 +v 0.883883 3.250000 -0.883883 +v 0.577424 3.683013 -0.239177 +v 1.000129 3.500000 -0.414267 +v 1.154849 3.250000 -0.478354 +v 0.625000 3.683013 -0.000000 +v 1.082531 3.500000 0.000000 +v 1.250000 3.250000 0.000000 +v 0.577424 3.683013 0.239177 +v 1.000129 3.500000 0.414267 +v 1.154849 3.250000 0.478354 +v 0.441941 3.683013 0.441941 +v 0.765465 3.500000 0.765465 +v 0.883883 3.250000 0.883883 +v 0.239177 3.683013 0.577424 +v 0.414266 3.500000 1.000129 +v 0.478354 3.250000 1.154849 +v -0.000000 3.683013 0.625000 +v -0.000000 3.500000 1.082531 +v -0.000001 3.250000 1.250000 +v -0.239177 3.683013 0.577424 +v -0.414267 3.500000 1.000128 +v -0.478355 3.250000 1.154849 +v -0.441942 3.683013 0.441941 +v -0.765466 3.500000 0.765465 +v -0.883884 3.250000 0.883883 +v -0.577425 3.683013 0.239177 +v -1.000129 3.500000 0.414266 +v -1.154849 3.250000 0.478354 +v -0.625000 3.683013 -0.000000 +v -1.082531 3.500000 -0.000001 +v -1.250000 3.250000 -0.000001 +v -0.577424 3.683013 -0.239177 +v -1.000129 3.500000 -0.414267 +v -1.154849 3.250000 -0.478355 +v -0.441941 3.683013 -0.441942 +v -0.765465 3.500000 -0.765466 +v -0.883883 3.250000 -0.883884 +v -0.239177 3.683013 -0.577425 +v -0.414266 3.500000 -1.000129 +v -0.478354 3.250000 -1.154849 +v -0.000000 3.750000 0.000000 +v 0.000000 3.683013 -0.625000 +v 0.265165 1.390165 -1.125000 +v 0.375000 1.125000 -1.125000 +v 0.265165 0.859835 -1.125000 +v -0.000000 0.750000 -1.125000 +v -0.265165 0.859835 -1.125000 +v -0.375000 1.125000 -1.125000 +v -0.000000 1.500000 -1.125000 +v -0.265165 1.390165 -1.125000 +v 0.265165 1.390165 -1.375000 +v 0.375000 1.125000 -1.375000 +v 0.265165 0.859835 -1.375000 +v -0.000000 0.750000 -1.375000 +v -0.265165 0.859835 -1.375000 +v -0.375000 1.125000 -1.375000 +v -0.265165 1.390165 -1.375000 +v -0.000000 1.500000 -1.375000 +v -1.500000 0.750000 0.250000 +v -1.500000 0.250000 0.250000 +v -1.500000 0.750000 -0.250000 +v -1.500000 0.250000 -0.250000 +v -1.187500 0.750000 -0.250000 +v -1.187500 0.750000 0.250000 +v -1.187500 0.250000 0.250000 +v -1.187500 0.250000 -0.250000 +v 1.500000 0.750000 -0.250000 +v 1.500000 0.250000 -0.250000 +v 1.500000 0.750000 0.250000 +v 1.500000 0.250000 0.250000 +v 1.187500 0.750000 0.250000 +v 1.187500 0.750000 -0.250000 +v 1.187500 0.250000 -0.250000 +v 1.187500 0.250000 0.250000 +v -0.250000 4.000000 0.250000 +v 0.250000 4.000000 0.250000 +v -0.250000 4.000000 -0.250000 +v 0.250000 4.000000 -0.250000 +v -0.250000 3.687500 0.250000 +v 0.250000 3.687500 0.250000 +v -0.250000 3.687500 -0.250000 +v 0.250000 3.687500 -0.250000 +v 0.000000 1.500000 1.375000 +v 0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.375000 +v 0.265165 0.859835 1.375000 +v 0.000000 0.750000 1.375000 +v -0.265165 0.859835 1.375000 +v -0.375000 1.125000 1.375000 +v -0.265165 1.390165 1.375000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v -0.126841 3.749999 0.126839 +v -0.064340 3.786610 0.189339 +v -0.126841 3.999999 0.126839 +v -0.064340 3.963387 0.189339 +v -0.038452 3.874999 0.215228 +v -0.215229 3.874999 0.038451 +v -0.189341 3.786610 0.064339 +v -0.189341 3.963387 0.064339 +v -1.275888 0.375000 1.275889 +v -1.187500 0.375000 1.312500 +v -1.099111 0.375000 1.275889 +v -1.062500 0.375000 1.187500 +v -1.099111 0.375000 1.099112 +v -1.187500 0.375000 1.062500 +v -1.275888 0.375000 1.099112 +v -1.312500 0.375000 1.187500 +v 1.073224 3.963388 0.948223 +v 1.099112 3.875000 0.922335 +v 1.073224 3.786611 0.948223 +v 1.010723 3.750000 1.010723 +v 0.948223 3.786611 1.073223 +v 0.922335 3.875000 1.099112 +v 0.948223 3.963388 1.073223 +v 1.010723 4.000000 1.010723 +v 1.242418 3.864276 1.117417 +v 1.224112 3.801776 1.047335 +v 1.154029 3.739276 1.029029 +v 1.073223 3.713388 1.073223 +v 1.029029 3.739276 1.154029 +v 1.047335 3.801776 1.224112 +v 1.117418 3.864276 1.242417 +v 1.198223 3.890164 1.198223 +v 1.187500 3.625000 1.312500 +v 1.099112 3.625000 1.275888 +v 1.062500 3.625000 1.187500 +v 1.099112 3.625000 1.099111 +v 1.187500 3.625000 1.062500 +v 1.275889 3.625000 1.099111 +v 1.312500 3.625000 1.187500 +v 1.275889 3.625000 1.275888 +v -1.275888 3.624999 1.275889 +v -1.187500 3.624999 1.312500 +v -1.099111 3.624999 1.275889 +v -1.062500 3.624999 1.187500 +v -1.099111 3.624999 1.099112 +v -1.187500 3.624999 1.062500 +v -1.275888 3.624999 1.099112 +v -1.312500 3.624999 1.187500 +v -1.198223 3.890164 1.198223 +v -1.242417 3.864275 1.117418 +v -1.224112 3.801775 1.047335 +v -1.154029 3.739275 1.029029 +v -1.073223 3.713387 1.073223 +v -1.029029 3.739275 1.154029 +v -1.047335 3.801775 1.224112 +v -1.117417 3.864275 1.242418 +v 1.187500 0.375000 1.312500 +v 1.099112 0.375000 1.275888 +v 1.062500 0.375000 1.187500 +v 1.099112 0.375000 1.099111 +v 1.187500 0.375000 1.062500 +v 1.275889 0.375000 1.099111 +v 1.312500 0.375000 1.187500 +v 1.275889 0.375000 1.275888 +v 1.000000 0.375000 1.375000 +v 1.375000 0.375000 1.375000 +v 1.000000 0.375000 1.000000 +v 1.375000 0.375000 1.000000 +v 1.000000 0.250000 1.000000 +v 1.375000 0.250000 1.000000 +v 1.000000 0.250000 1.375000 +v 1.375000 0.250000 1.375000 +v -1.010723 3.999999 1.010723 +v -1.073223 3.963387 0.948224 +v -1.099112 3.874999 0.922335 +v -1.073223 3.786610 0.948224 +v -1.010723 3.749999 1.010723 +v -0.948223 3.786610 1.073224 +v -0.922335 3.874999 1.099112 +v -0.948223 3.963387 1.073224 +v 0.064339 3.963388 0.189341 +v 0.064339 3.786611 0.189341 +v 0.038451 3.875000 0.215229 +v 0.215228 3.875000 0.038452 +v 0.189339 3.963388 0.064340 +v 0.126839 4.000000 0.126841 +v 0.189339 3.786611 0.064340 +v 0.126839 3.750000 0.126841 +v -1.073224 3.963387 -0.948223 +v -1.099112 3.874999 -0.922335 +v -1.073224 3.786611 -0.948223 +v -1.010723 3.749999 -1.010723 +v -0.948224 3.786611 -1.073223 +v -0.922335 3.874999 -1.099112 +v -0.948224 3.963387 -1.073223 +v -1.010723 3.999999 -1.010723 +v -1.242418 3.864276 -1.117417 +v -1.224112 3.801776 -1.047335 +v -1.154029 3.739276 -1.029029 +v -1.073223 3.713387 -1.073223 +v -1.029029 3.739276 -1.154029 +v -1.047335 3.801776 -1.224112 +v -1.117418 3.864276 -1.242417 +v -1.198223 3.890164 -1.198223 +v -1.187500 3.625000 -1.312500 +v -1.099112 3.625000 -1.275888 +v -1.062500 3.625000 -1.187500 +v -1.099112 3.625000 -1.099111 +v -1.187500 3.625000 -1.062500 +v -1.275889 3.625000 -1.099111 +v -1.312500 3.625000 -1.187500 +v -1.275889 3.625000 -1.275888 +v -1.187500 0.375000 -1.312500 +v -1.099112 0.375000 -1.275888 +v -1.062500 0.375000 -1.187500 +v -1.099112 0.375000 -1.099111 +v -1.187500 0.375000 -1.062500 +v -1.275889 0.375000 -1.099111 +v -1.312500 0.375000 -1.187500 +v -1.275889 0.375000 -1.275888 +v -0.064339 3.963387 -0.189341 +v -0.064339 3.786611 -0.189341 +v -0.038451 3.874999 -0.215229 +v -0.215228 3.874999 -0.038452 +v -0.189339 3.963387 -0.064340 +v -0.126839 3.999999 -0.126841 +v -0.189339 3.786611 -0.064340 +v -0.126839 3.749999 -0.126841 +v 0.126841 3.749999 -0.126839 +v 0.064340 3.786611 -0.189339 +v 0.126841 3.999999 -0.126839 +v 0.064340 3.963387 -0.189339 +v 0.038452 3.874999 -0.215228 +v 0.215229 3.874999 -0.038451 +v 0.189341 3.786611 -0.064339 +v 0.189341 3.963387 -0.064339 +v 1.375000 0.250000 -1.000000 +v 1.000000 0.250000 -1.000000 +v 1.375000 0.250000 -1.375000 +v 1.000000 0.250000 -1.375000 +v 1.375000 0.375000 -1.375000 +v 1.000000 0.375000 -1.375000 +v 1.375000 0.375000 -1.000000 +v 1.000000 0.375000 -1.000000 +v 1.275888 0.375000 -1.275889 +v 1.187500 0.375000 -1.312500 +v 1.099111 0.375000 -1.275889 +v 1.062500 0.375000 -1.187500 +v 1.099111 0.375000 -1.099112 +v 1.187500 0.375000 -1.062500 +v 1.275888 0.375000 -1.099112 +v 1.312500 0.375000 -1.187500 +v 1.275888 3.625000 -1.275889 +v 1.187500 3.625000 -1.312500 +v 1.099111 3.625000 -1.275889 +v 1.062500 3.625000 -1.187500 +v 1.099111 3.625000 -1.099112 +v 1.187500 3.625000 -1.062500 +v 1.275888 3.625000 -1.099112 +v 1.312500 3.625000 -1.187500 +v 1.198223 3.890164 -1.198223 +v 1.242417 3.864276 -1.117418 +v 1.224112 3.801776 -1.047335 +v 1.154029 3.739276 -1.029029 +v 1.073223 3.713387 -1.073223 +v 1.029029 3.739276 -1.154029 +v 1.047335 3.801776 -1.224112 +v 1.117417 3.864276 -1.242418 +v 1.010723 3.999999 -1.010723 +v 1.073223 3.963387 -0.948224 +v 1.099112 3.874999 -0.922335 +v 1.073223 3.786611 -0.948224 +v 1.010723 3.749999 -1.010723 +v 0.948223 3.786611 -1.073224 +v 0.922335 3.874999 -1.099112 +v 0.948223 3.963387 -1.073224 +v -1.375000 0.375000 1.375000 +v -1.000000 0.375000 1.375000 +v -1.375000 0.375000 1.000000 +v -1.000000 0.375000 1.000000 +v -1.375000 0.250000 1.000000 +v -1.000000 0.250000 1.000000 +v -1.375000 0.250000 1.375000 +v -1.000000 0.250000 1.375000 +v -1.000000 0.250000 -1.000000 +v -1.375000 0.250000 -1.000000 +v -1.000000 0.250000 -1.375000 +v -1.375000 0.250000 -1.375000 +v -1.000000 0.375000 -1.375000 +v -1.375000 0.375000 -1.375000 +v -1.000000 0.375000 -1.000000 +v -1.375000 0.375000 -1.000000 +v 0.000000 0.500000 -1.375000 +v -0.526190 0.500000 -1.270334 +v -0.972272 0.500000 -0.972272 +v -1.270334 0.500000 -0.526190 +v -1.375000 0.500000 0.000000 +v -1.270334 0.500000 0.526190 +v -0.972272 0.500000 0.972272 +v -0.526190 0.500000 1.270334 +v -0.000000 0.500000 1.375000 +v 0.526189 0.500000 1.270334 +v 0.972272 0.500000 0.972272 +v 1.270334 0.500000 0.526190 +v 1.375000 0.500000 -0.000000 +v 1.270334 0.500000 -0.526190 +v 0.972272 0.500000 -0.972272 +v 0.526189 0.500000 -1.270335 +v 0.000000 3.000000 -1.375000 +v -0.526190 3.000000 -1.270334 +v -0.972272 3.000000 -0.972272 +v -1.270334 3.000000 -0.526190 +v -1.375000 3.000000 0.000000 +v -1.270334 3.000000 0.526190 +v -0.972272 3.000000 0.972272 +v -0.526190 3.000000 1.270334 +v -0.000000 3.000000 1.375000 +v 0.526189 3.000000 1.270334 +v 0.972272 3.000000 0.972272 +v 1.270334 3.000000 0.526190 +v 1.375000 3.000000 -0.000000 +v 1.270334 3.000000 -0.526190 +v 0.972272 3.000000 -0.972272 +v 0.526189 3.000000 -1.270335 +v 0.000000 3.250000 -1.375000 +v -0.526190 3.250000 -1.270334 +v -0.972272 3.250000 -0.972272 +v -1.270334 3.250000 -0.526190 +v -1.375000 3.250000 0.000000 +v -1.270334 3.250000 0.526190 +v -0.972272 3.250000 0.972272 +v -0.526190 3.250000 1.270334 +v -0.000000 3.250000 1.375000 +v 0.526189 3.250000 1.270334 +v 0.972272 3.250000 0.972272 +v 1.270334 3.250000 0.526190 +v 1.375000 3.250000 -0.000000 +v 1.270334 3.250000 -0.526190 +v 0.972272 3.250000 -0.972272 +v 0.526189 3.250000 -1.270335 +v 0.000000 0.500000 -1.250000 +v -0.478354 0.500000 -1.154849 +v -0.883883 0.500000 -0.883883 +v -1.154849 0.500000 -0.478354 +v -1.250000 0.500000 0.000000 +v -1.154849 0.500000 0.478354 +v -0.883883 0.500000 0.883883 +v -0.478354 0.500000 1.154849 +v -0.000000 0.500000 1.250000 +v 0.478354 0.500000 1.154850 +v 0.883883 0.500000 0.883884 +v 1.154849 0.500000 0.478354 +v 1.250000 0.500000 -0.000000 +v 1.154849 0.500000 -0.478355 +v 0.883883 0.500000 -0.883884 +v 0.478354 0.500000 -1.154850 +v 0.000000 3.000000 -1.250000 +v -0.478354 3.000000 -1.154849 +v -0.883883 3.000000 -0.883883 +v -1.154849 3.000000 -0.478354 +v -1.250000 3.000000 0.000000 +v -1.154849 3.000000 0.478354 +v -0.883883 3.000000 0.883883 +v -0.478354 3.000000 1.154849 +v -0.000000 3.000000 1.250000 +v 0.478354 3.000000 1.154850 +v 0.883883 3.000000 0.883884 +v 1.154849 3.000000 0.478354 +v 1.250000 3.000000 -0.000000 +v 1.154849 3.000000 -0.478355 +v 0.883883 3.000000 -0.883884 +v 0.478354 3.000000 -1.154850 +v -0.000000 3.250000 -1.250000 +v 0.478354 3.250000 -1.154849 +v 0.883883 3.250000 -0.883883 +v 1.154849 3.250000 -0.478354 +v 1.250000 3.250000 0.000000 +v 1.154849 3.250000 0.478354 +v 0.883883 3.250000 0.883883 +v 0.478354 3.250000 1.154849 +v -0.000001 3.250000 1.250000 +v -0.478355 3.250000 1.154849 +v -0.883884 3.250000 0.883883 +v -1.154849 3.250000 0.478354 +v -1.250000 3.250000 -0.000001 +v -1.154849 3.250000 -0.478355 +v -0.883883 3.250000 -0.883884 +v -0.478354 3.250000 -1.154849 +v 0.265165 1.390165 -1.375000 +v 0.375000 1.125000 -1.375000 +v 0.265165 0.859835 -1.375000 +v -0.000000 0.750000 -1.375000 +v -0.265165 0.859835 -1.375000 +v -0.375000 1.125000 -1.375000 +v -0.265165 1.390165 -1.375000 +v -0.000000 1.500000 -1.375000 +v 0.000000 1.500000 1.375000 +v 0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.375000 +v 0.265165 0.859835 1.375000 +v 0.000000 0.750000 1.375000 +v -0.265165 0.859835 1.375000 +v -0.375000 1.125000 1.375000 +v -0.265165 1.390165 1.375000 +v 0.265165 1.390165 1.125000 +v 0.000000 1.500000 1.125000 +v 0.375000 1.125000 1.125000 +v 0.265165 0.859835 1.125000 +v 0.000000 0.750000 1.125000 +v -0.265165 0.859835 1.125000 +v -0.375000 1.125000 1.125000 +v -0.265165 1.390165 1.125000 +vt 0.000000 0.000000 +vt 0.081633 0.320000 +vt 0.000000 0.480000 +vt 0.244898 0.520000 +vt 0.000000 1.000000 +vt 0.000000 0.520000 +vt 0.244898 0.480000 +vt 0.000000 0.520000 +vt 0.000000 0.480000 +vt 0.244898 0.480000 +vt 0.244898 0.480000 +vt -0.000000 0.520000 +vt -0.000000 0.480000 +vt 0.244898 0.480000 +vt 0.000000 0.520000 +vt 0.000000 0.480000 +vt 0.275510 0.929965 +vt 0.244916 0.870000 +vt 0.275510 0.810035 +vt 0.331633 0.890000 +vt 0.372449 0.810000 +vt 0.372449 0.890000 +vt 0.331633 0.890000 +vt 0.372449 0.810000 +vt 0.372449 0.890000 +vt 0.306122 0.810000 +vt 0.331633 0.810000 +vt 0.397959 0.890000 +vt 0.331633 0.940000 +vt 0.306122 0.810000 +vt 0.331633 0.810000 +vt 0.397959 0.890000 +vt 0.331633 0.940000 +vt 0.964286 0.250000 +vt 0.923469 0.330000 +vt 0.923469 0.250000 +vt 0.275510 0.929965 +vt 0.244916 0.870000 +vt 0.275510 0.810035 +vt 0.964286 0.330000 +vt 0.923469 0.380000 +vt 0.964286 0.200000 +vt 0.989796 0.330000 +vt 0.897959 0.250000 +vt 1.000000 0.180000 +vt 0.994898 0.020000 +vt 1.000000 0.020000 +vt 0.244898 0.000000 +vt 0.081633 0.160000 +vt 0.163265 0.160000 +vt 0.163265 0.320000 +vt 0.989796 0.010000 +vt 0.913265 0.020000 +vt 0.908163 0.010000 +vt 0.897959 0.020000 +vt 0.903061 0.180000 +vt 0.897959 0.180000 +vt 0.989796 0.000000 +vt 0.908163 0.000000 +vt 0.908163 0.200000 +vt 0.989796 0.190000 +vt 0.989796 0.200000 +vt 0.989796 0.170000 +vt 0.984694 0.030000 +vt 0.989796 0.030000 +vt 0.908163 0.190000 +vt 0.984694 0.180000 +vt 0.994898 0.180000 +vt 0.903061 0.020000 +vt 0.908163 0.170000 +vt 0.913265 0.030000 +vt 0.984694 0.170000 +vt 0.913265 0.170000 +vt 0.908163 0.030000 +vt 0.984694 0.020000 +vt 0.913265 0.180000 +vt 0.408163 0.790000 +vt 0.418367 0.850000 +vt 0.408163 0.850000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.459184 0.850000 +vt 0.448980 0.790000 +vt 0.459184 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.790000 +vt 0.418367 0.770000 +vt 0.448980 0.790000 +vt 0.418367 0.850000 +vt 0.418367 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.770000 +vt 0.459184 0.850000 +vt 0.459184 0.790000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.408163 0.790000 +vt 0.408163 0.850000 +vt 0.408163 0.790000 +vt 0.418367 0.850000 +vt 0.408163 0.850000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.459184 0.850000 +vt 0.448980 0.790000 +vt 0.459184 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.790000 +vt 0.418367 0.770000 +vt 0.448980 0.790000 +vt 0.418367 0.850000 +vt 0.418367 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.770000 +vt 0.459184 0.850000 +vt 0.459184 0.790000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.408163 0.790000 +vt 0.408163 0.850000 +vt 0.693878 0.040000 +vt 0.653061 0.060000 +vt 0.653061 0.040000 +vt 0.734694 0.040000 +vt 0.693878 0.060000 +vt 0.775510 0.060000 +vt 0.734694 0.060000 +vt 0.816327 0.040000 +vt 0.775510 0.040000 +vt 0.857143 0.040000 +vt 0.816327 0.060000 +vt 0.897959 0.040000 +vt 0.857143 0.060000 +vt 0.285714 0.040000 +vt 0.244898 0.060000 +vt 0.244898 0.040000 +vt 0.326531 0.040000 +vt 0.285714 0.060000 +vt 0.367347 0.040000 +vt 0.326531 0.060000 +vt 0.408163 0.060000 +vt 0.367347 0.060000 +vt 0.448980 0.040000 +vt 0.408163 0.040000 +vt 0.489796 0.040000 +vt 0.448980 0.060000 +vt 0.530612 0.060000 +vt 0.489796 0.060000 +vt 0.530612 0.040000 +vt 0.571429 0.060000 +vt 0.612245 0.040000 +vt 0.571429 0.040000 +vt 0.612245 0.060000 +vt 0.693878 0.460000 +vt 0.734694 0.480000 +vt 0.693878 0.480000 +vt 0.775510 0.460000 +vt 0.775510 0.480000 +vt 0.816327 0.480000 +vt 0.816327 0.460000 +vt 0.857143 0.480000 +vt 0.857143 0.460000 +vt 0.897959 0.480000 +vt 0.244898 0.460000 +vt 0.285714 0.480000 +vt 0.244898 0.480000 +vt 0.326531 0.460000 +vt 0.326531 0.480000 +vt 0.367347 0.460000 +vt 0.367347 0.480000 +vt 0.408163 0.460000 +vt 0.408163 0.480000 +vt 0.448980 0.480000 +vt 0.448980 0.460000 +vt 0.489796 0.480000 +vt 0.530612 0.460000 +vt 0.530612 0.480000 +vt 0.571429 0.460000 +vt 0.571429 0.480000 +vt 0.612245 0.480000 +vt 0.653061 0.460000 +vt 0.653061 0.480000 +vt 0.408163 0.540000 +vt 0.367347 0.520000 +vt 0.408163 0.520000 +vt 0.448980 0.540000 +vt 0.448980 0.520000 +vt 0.897959 0.540000 +vt 0.857143 0.520000 +vt 0.897959 0.520000 +vt 0.285714 0.520000 +vt 0.326531 0.540000 +vt 0.285714 0.540000 +vt 0.775510 0.520000 +vt 0.816327 0.540000 +vt 0.775510 0.540000 +vt 0.326531 0.520000 +vt 0.367347 0.540000 +vt 0.244898 0.520000 +vt 0.244898 0.540000 +vt 0.612245 0.520000 +vt 0.653061 0.540000 +vt 0.612245 0.540000 +vt 0.734694 0.520000 +vt 0.693878 0.540000 +vt 0.693878 0.520000 +vt 0.857143 0.540000 +vt 0.816327 0.520000 +vt 0.571429 0.540000 +vt 0.530612 0.520000 +vt 0.571429 0.520000 +vt 0.734694 0.540000 +vt 0.653061 0.520000 +vt 0.489796 0.540000 +vt 0.489796 0.520000 +vt 0.530612 0.540000 +vt 0.244898 1.000000 +vt 0.244898 0.520000 +vt 0.244898 0.520000 +vt 0.244898 0.520000 +vt 0.306104 0.870000 +vt 0.297144 0.912401 +vt 0.253877 0.912401 +vt 0.253877 0.827599 +vt 0.297144 0.827599 +vt 0.306122 0.890000 +vt 0.397959 0.810000 +vt 0.372449 0.940000 +vt 0.306122 0.890000 +vt 0.397959 0.810000 +vt 0.372449 0.940000 +vt 0.306104 0.870000 +vt 0.297144 0.912401 +vt 0.253877 0.912401 +vt 0.253877 0.827599 +vt 0.297144 0.827599 +vt 0.964286 0.380000 +vt 0.923469 0.200000 +vt 0.989796 0.250000 +vt 0.897959 0.330000 +vt 0.897959 0.060000 +vt 0.734694 0.460000 +vt 0.897959 0.460000 +vt 0.285714 0.460000 +vt 0.489796 0.460000 +vt 0.612245 0.460000 +vt 0.326531 -0.000000 +vt 0.285714 0.040000 +vt 0.285714 0.000000 +vt 0.653061 0.000000 +vt 0.612245 0.040000 +vt 0.612245 -0.000000 +vt 0.367347 0.000000 +vt 0.326531 0.040000 +vt 0.693878 0.000000 +vt 0.653061 0.040000 +vt 0.408163 0.000000 +vt 0.367347 0.040000 +vt 0.734694 0.000000 +vt 0.693878 0.040000 +vt 0.448980 0.000000 +vt 0.408163 0.040000 +vt 0.775510 0.000000 +vt 0.734694 0.040000 +vt 0.489796 0.000000 +vt 0.448980 0.040000 +vt 0.816327 0.000000 +vt 0.775510 0.040000 +vt 0.530612 -0.000000 +vt 0.489796 0.040000 +vt 0.857143 -0.000000 +vt 0.816327 0.040000 +vt 0.571429 -0.000000 +vt 0.530612 0.040000 +vt 0.244898 0.040000 +vt 0.244898 0.000000 +vt 0.897959 0.000000 +vt 0.857143 0.040000 +vt 0.571429 0.040000 +vt 0.326531 0.480000 +vt 0.285714 0.520000 +vt 0.285714 0.480000 +vt 0.653061 0.480000 +vt 0.612245 0.520000 +vt 0.612245 0.480000 +vt 0.367347 0.480000 +vt 0.326531 0.520000 +vt 0.693878 0.480000 +vt 0.653061 0.520000 +vt 0.408163 0.480000 +vt 0.367347 0.520000 +vt 0.734694 0.480000 +vt 0.693878 0.520000 +vt 0.448980 0.480000 +vt 0.408163 0.520000 +vt 0.775510 0.480000 +vt 0.734694 0.520000 +vt 0.489796 0.480000 +vt 0.448980 0.520000 +vt 0.816327 0.480000 +vt 0.775510 0.520000 +vt 0.530612 0.480000 +vt 0.489796 0.520000 +vt 0.857143 0.480000 +vt 0.816327 0.520000 +vt 0.571429 0.480000 +vt 0.530612 0.520000 +vt 0.244898 0.520000 +vt 0.244898 0.480000 +vt 0.897959 0.480000 +vt 0.857143 0.520000 +vt 0.571429 0.520000 +vt 0.653061 0.060000 +vt 0.612245 0.460000 +vt 0.612245 0.060000 +vt 0.367347 0.060000 +vt 0.326531 0.460000 +vt 0.326531 0.060000 +vt 0.693878 0.060000 +vt 0.653061 0.460000 +vt 0.408163 0.060000 +vt 0.367347 0.460000 +vt 0.734694 0.060000 +vt 0.693878 0.460000 +vt 0.448980 0.060000 +vt 0.408163 0.460000 +vt 0.775510 0.060000 +vt 0.734694 0.460000 +vt 0.489796 0.060000 +vt 0.448980 0.460000 +vt 0.816327 0.060000 +vt 0.775510 0.460000 +vt 0.530612 0.060000 +vt 0.489796 0.460000 +vt 0.857143 0.060000 +vt 0.816327 0.460000 +vt 0.571429 0.060000 +vt 0.530612 0.460000 +vt 0.285714 0.060000 +vt 0.244898 0.460000 +vt 0.244898 0.060000 +vt 0.897959 0.060000 +vt 0.857143 0.460000 +vt 0.571429 0.460000 +vt 0.285714 0.460000 +vt 0.897959 0.590000 +vt 0.857143 0.540000 +vt 0.897959 0.540000 +vt 0.887755 0.670000 +vt 0.877551 0.770000 +vt 0.867347 0.670000 +vt 0.857143 0.590000 +vt 0.816327 0.540000 +vt 0.846939 0.670000 +vt 0.836735 0.770000 +vt 0.826531 0.670000 +vt 0.816327 0.590000 +vt 0.806122 0.670000 +vt 0.795918 0.770000 +vt 0.785714 0.670000 +vt 0.775510 0.590000 +vt 0.775510 0.540000 +vt 0.765306 0.670000 +vt 0.734694 0.590000 +vt 0.734694 0.540000 +vt 0.755102 0.770000 +vt 0.744898 0.670000 +vt 0.704082 0.670000 +vt 0.693878 0.590000 +vt 0.693878 0.540000 +vt 0.724490 0.670000 +vt 0.714286 0.770000 +vt 0.683673 0.670000 +vt 0.653061 0.590000 +vt 0.653061 0.540000 +vt 0.673469 0.770000 +vt 0.663265 0.670000 +vt 0.642857 0.670000 +vt 0.612245 0.590000 +vt 0.612245 0.540000 +vt 0.632653 0.770000 +vt 0.622449 0.670000 +vt 0.602041 0.670000 +vt 0.571429 0.590000 +vt 0.571429 0.540000 +vt 0.591837 0.770000 +vt 0.581633 0.670000 +vt 0.530612 0.590000 +vt 0.530612 0.540000 +vt 0.561224 0.670000 +vt 0.551020 0.770000 +vt 0.540816 0.670000 +vt 0.489796 0.590000 +vt 0.489796 0.540000 +vt 0.520408 0.670000 +vt 0.510204 0.770000 +vt 0.500000 0.670000 +vt 0.448980 0.590000 +vt 0.448980 0.540000 +vt 0.479592 0.670000 +vt 0.469388 0.770000 +vt 0.459184 0.670000 +vt 0.408163 0.590000 +vt 0.408163 0.540000 +vt 0.438776 0.670000 +vt 0.428571 0.770000 +vt 0.418367 0.670000 +vt 0.367347 0.590000 +vt 0.367347 0.540000 +vt 0.397959 0.670000 +vt 0.387755 0.770000 +vt 0.377551 0.670000 +vt 0.357143 0.670000 +vt 0.346939 0.770000 +vt 0.336735 0.670000 +vt 0.326531 0.810000 +vt 0.346939 0.770000 +vt 0.346939 0.810000 +vt 0.306122 0.810000 +vt 0.326531 0.770000 +vt 0.326531 0.590000 +vt 0.265306 0.810000 +vt 0.285714 0.770000 +vt 0.285714 0.810000 +vt 0.326531 0.540000 +vt 0.387755 0.810000 +vt 0.408163 0.770000 +vt 0.408163 0.810000 +vt 0.367347 0.770000 +vt 0.367347 0.810000 +vt 0.295918 0.670000 +vt 0.285714 0.590000 +vt 0.306122 0.770000 +vt 0.285714 0.540000 +vt 0.316327 0.670000 +vt 0.306122 0.770000 +vt 0.244898 0.810000 +vt 0.265306 0.770000 +vt 0.387755 0.770000 +vt 0.275510 0.670000 +vt 0.244898 0.590000 +vt 0.244898 0.540000 +vt 0.265306 0.770000 +vt 0.255102 0.670000 +vt 0.326531 0.810000 +vt 0.346939 0.770000 +vt 0.346939 0.810000 +vt 0.306122 0.810000 +vt 0.326531 0.770000 +vt 0.265306 0.810000 +vt 0.285714 0.770000 +vt 0.285714 0.810000 +vt 0.387755 0.810000 +vt 0.408163 0.770000 +vt 0.408163 0.810000 +vt 0.367347 0.770000 +vt 0.367347 0.810000 +vt 0.306122 0.770000 +vt 0.244898 0.810000 +vt 0.265306 0.770000 +vt 0.387755 0.770000 +vt 0.765306 0.930000 +vt 0.867347 0.910000 +vt 0.867347 0.930000 +vt 0.459184 0.910000 +vt 0.724490 0.930000 +vt 0.459184 0.930000 +vt 0.459184 0.790000 +vt 0.724490 0.810000 +vt 0.459184 0.810000 +vt 0.459184 0.830000 +vt 0.724490 0.850000 +vt 0.459184 0.850000 +vt 0.724490 0.870000 +vt 0.459184 0.870000 +vt 0.459184 0.890000 +vt 0.724490 0.910000 +vt 0.459184 0.770000 +vt 0.724490 0.790000 +vt 0.724490 0.830000 +vt 0.724490 0.890000 +vt 0.744898 0.850000 +vt 0.765306 0.870000 +vt 0.744898 0.870000 +vt 0.760204 0.890000 +vt 0.744898 0.890000 +vt 0.755102 0.910000 +vt 0.744898 0.910000 +vt 0.744898 0.930000 +vt 0.734694 0.910000 +vt 0.744898 0.930000 +vt 0.734694 0.930000 +vt 0.734694 0.790000 +vt 0.744898 0.770000 +vt 0.744898 0.790000 +vt 0.744898 0.810000 +vt 0.729592 0.810000 +vt 0.724490 0.830000 +vt 0.744898 0.830000 +vt 0.744898 0.850000 +vt 0.724490 0.850000 +vt 0.744898 0.870000 +vt 0.724490 0.870000 +vt 0.729592 0.890000 +vt 0.744898 0.890000 +vt 0.744898 0.910000 +vt 0.765306 0.890000 +vt 0.867347 0.910000 +vt 0.765306 0.910000 +vt 0.765306 0.870000 +vt 0.867347 0.890000 +vt 0.765306 0.790000 +vt 0.867347 0.810000 +vt 0.765306 0.810000 +vt 0.765306 0.850000 +vt 0.867347 0.830000 +vt 0.867347 0.850000 +vt 0.867347 0.870000 +vt 0.765306 0.770000 +vt 0.867347 0.790000 +vt 0.765306 0.830000 +vt 0.760204 0.810000 +vt 0.755102 0.790000 +vt 0.755102 0.910000 +vt 0.744898 0.770000 +vt 0.755102 0.790000 +vt 0.744898 0.790000 +vt 0.744898 0.810000 +vt 0.760204 0.810000 +vt 0.744898 0.830000 +vt 0.765306 0.830000 +vt 0.867347 0.810000 +vt 0.867347 0.830000 +vt 0.765306 0.770000 +vt 0.867347 0.790000 +vt 0.765306 0.790000 +vt 0.765306 0.850000 +vt 0.867347 0.870000 +vt 0.867347 0.850000 +vt 0.760204 0.890000 +vt 0.459184 0.870000 +vt 0.724490 0.890000 +vt 0.459184 0.890000 +vt 0.459184 0.810000 +vt 0.459184 0.830000 +vt 0.459184 0.770000 +vt 0.724490 0.790000 +vt 0.459184 0.790000 +vt 0.724490 0.910000 +vt 0.459184 0.910000 +vt 0.459184 0.850000 +vt 0.724490 0.810000 +vt 0.724490 0.930000 +vt 0.459184 0.930000 +vt 0.867347 0.930000 +vt 0.765306 0.930000 +vt 0.765306 0.810000 +vt 0.765306 0.890000 +vt 0.867347 0.890000 +vt 0.765306 0.910000 +vt 0.734694 0.910000 +vt 0.729592 0.890000 +vt 0.734694 0.790000 +vt 0.729592 0.810000 +vt 0.734694 0.770000 +vt 0.734694 0.930000 +vt 0.734694 0.930000 +vt 0.744898 0.910000 +vt 0.744898 0.930000 +vt 0.734694 0.770000 +vt 0.744898 0.790000 +vt 0.734694 0.790000 +vt 0.729592 0.810000 +vt 0.744898 0.810000 +vt 0.724490 0.830000 +vt 0.744898 0.830000 +vt 0.744898 0.850000 +vt 0.724490 0.850000 +vt 0.744898 0.870000 +vt 0.724490 0.870000 +vt 0.744898 0.890000 +vt 0.729592 0.890000 +vt 0.734694 0.910000 +vt 0.765306 0.890000 +vt 0.867347 0.910000 +vt 0.765306 0.910000 +vt 0.765306 0.870000 +vt 0.867347 0.890000 +vt 0.765306 0.790000 +vt 0.867347 0.810000 +vt 0.765306 0.810000 +vt 0.765306 0.850000 +vt 0.867347 0.830000 +vt 0.867347 0.850000 +vt 0.867347 0.870000 +vt 0.765306 0.770000 +vt 0.867347 0.790000 +vt 0.765306 0.830000 +vt 0.760204 0.810000 +vt 0.744898 0.770000 +vt 0.755102 0.790000 +vt 0.755102 0.910000 +vt 0.459184 0.870000 +vt 0.724490 0.890000 +vt 0.459184 0.890000 +vt 0.459184 0.810000 +vt 0.459184 0.830000 +vt 0.459184 0.770000 +vt 0.724490 0.790000 +vt 0.459184 0.790000 +vt 0.724490 0.910000 +vt 0.459184 0.910000 +vt 0.459184 0.850000 +vt 0.724490 0.810000 +vt 0.724490 0.930000 +vt 0.459184 0.930000 +vt 0.765306 0.930000 +vt 0.867347 0.930000 +vt 0.765306 0.930000 +vt 0.867347 0.910000 +vt 0.867347 0.930000 +vt 0.459184 0.910000 +vt 0.724490 0.930000 +vt 0.459184 0.930000 +vt 0.459184 0.790000 +vt 0.724490 0.810000 +vt 0.459184 0.810000 +vt 0.459184 0.830000 +vt 0.724490 0.850000 +vt 0.459184 0.850000 +vt 0.724490 0.870000 +vt 0.459184 0.870000 +vt 0.459184 0.890000 +vt 0.724490 0.910000 +vt 0.459184 0.770000 +vt 0.724490 0.790000 +vt 0.724490 0.830000 +vt 0.724490 0.890000 +vt 0.744898 0.850000 +vt 0.765306 0.870000 +vt 0.744898 0.870000 +vt 0.744898 0.890000 +vt 0.755102 0.910000 +vt 0.744898 0.910000 +vt 0.744898 0.930000 +vt 0.744898 0.770000 +vt 0.755102 0.790000 +vt 0.744898 0.790000 +vt 0.760204 0.810000 +vt 0.744898 0.810000 +vt 0.765306 0.830000 +vt 0.744898 0.830000 +vt 0.867347 0.810000 +vt 0.867347 0.830000 +vt 0.765306 0.770000 +vt 0.867347 0.790000 +vt 0.765306 0.790000 +vt 0.765306 0.850000 +vt 0.867347 0.870000 +vt 0.867347 0.850000 +vt 0.765306 0.810000 +vt 0.867347 0.890000 +vt 0.765306 0.890000 +vt 0.765306 0.910000 +vt 0.734694 0.910000 +vt 0.729592 0.890000 +vt 0.734694 0.790000 +vt 0.729592 0.810000 +vt 0.734694 0.770000 +vt 0.734694 0.930000 +vt 0.897959 0.040000 +vt 0.897959 0.520000 +vt 0.897959 0.460000 +vt 0.244898 0.770000 +vt 0.244898 0.770000 +vt 0.724490 0.770000 +vt 0.755102 0.930000 +vt 0.734694 0.770000 +vt 0.867347 0.770000 +vt 0.755102 0.770000 +vt 0.755102 0.930000 +vt 0.755102 0.770000 +vt 0.867347 0.770000 +vt 0.724490 0.770000 +vt 0.867347 0.770000 +vt 0.755102 0.770000 +vt 0.755102 0.930000 +vt 0.760204 0.890000 +vt 0.724490 0.770000 +vt 0.724490 0.770000 +vt 0.760204 0.890000 +vt 0.755102 0.930000 +vt 0.755102 0.770000 +vt 0.867347 0.770000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 -0.9239 +vn 0.7071 0.0000 0.7071 +vn 0.3827 0.0000 0.9239 +vn -0.9239 0.0000 -0.3827 +vn 0.9239 0.0000 0.3827 +vn -0.9239 0.0000 0.3827 +vn 0.9239 0.0000 -0.3827 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +vn 0.0000 0.7595 -0.6505 +vn 0.3179 0.5565 -0.7676 +vn 0.0000 0.5565 -0.8308 +vn 0.0000 0.9664 -0.2571 +vn 0.0984 0.9664 -0.2376 +vn 0.2489 0.7595 -0.6009 +vn 0.5875 0.5565 -0.5875 +vn 0.1818 0.9664 -0.1818 +vn 0.4599 0.7595 -0.4599 +vn 0.2376 0.9664 -0.0984 +vn 0.6009 0.7595 -0.2489 +vn 0.7676 0.5565 -0.3179 +vn 0.6505 0.7595 0.0000 +vn 0.8308 0.5565 0.0000 +vn 0.2571 0.9664 0.0000 +vn 0.2376 0.9664 0.0984 +vn 0.6009 0.7595 0.2489 +vn 0.7676 0.5565 0.3179 +vn 0.4599 0.7595 0.4599 +vn 0.5875 0.5565 0.5875 +vn 0.1818 0.9664 0.1818 +vn 0.2489 0.7595 0.6009 +vn 0.3179 0.5565 0.7676 +vn 0.0984 0.9664 0.2376 +vn 0.0000 0.7595 0.6505 +vn 0.0000 0.5565 0.8308 +vn 0.0000 0.9664 0.2571 +vn -0.2489 0.7595 0.6009 +vn -0.3179 0.5565 0.7676 +vn -0.0984 0.9664 0.2376 +vn -0.4599 0.7595 0.4599 +vn -0.5875 0.5565 0.5875 +vn -0.1818 0.9664 0.1818 +vn -0.6009 0.7595 0.2489 +vn -0.7676 0.5565 0.3179 +vn -0.2376 0.9664 0.0984 +vn -0.6505 0.7595 0.0000 +vn -0.8308 0.5565 0.0000 +vn -0.2571 0.9664 0.0000 +vn -0.6009 0.7595 -0.2489 +vn -0.7676 0.5565 -0.3179 +vn -0.2376 0.9664 -0.0984 +vn -0.1818 0.9664 -0.1818 +vn -0.7071 0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.4599 0.7595 -0.4599 +vn 0.7071 -0.7071 0.0000 +vn -0.5875 0.5565 -0.5875 +vn -0.7071 -0.7071 0.0000 +vn -0.0984 0.9664 -0.2376 +vn -0.2489 0.7595 -0.6009 +vn -0.3179 0.5565 -0.7676 +vn 0.1448 -0.9788 -0.1448 +vn -0.5000 -0.7071 -0.5000 +vn 0.6921 -0.2048 -0.6921 +vn 0.6727 0.0196 0.7396 +vn -0.6947 0.1866 0.6947 +vn -0.9890 0.1447 0.0283 +vn -0.0372 -0.1363 -0.9900 +vn 0.9900 -0.1363 0.0372 +vn -0.0283 0.1447 0.9890 +vn -0.7396 0.0196 -0.6727 +vn -0.5000 0.7071 0.5000 +vn -0.5828 0.7194 -0.3780 +vn -0.8431 0.5293 -0.0945 +vn -0.7200 0.0473 -0.6923 +vn -0.7513 0.0670 -0.6565 +vn -0.4172 -0.6737 -0.6099 +vn -0.2090 -0.4617 -0.8620 +vn 0.5000 -0.7071 -0.5000 +vn -0.9900 -0.1363 0.0372 +vn -0.6921 -0.2048 -0.6921 +vn 0.0372 -0.1363 -0.9900 +vn 0.2090 -0.4617 -0.8620 +vn 0.7513 0.0670 -0.6565 +vn 0.7396 0.0196 -0.6727 +vn 0.9890 0.1447 0.0283 +vn 0.8431 0.5293 -0.0945 +vn 0.5000 0.7071 0.5000 +vn 0.6947 0.1866 0.6947 +vn -0.0945 0.5293 0.8431 +vn 0.0282 0.1447 0.9890 +vn -0.6727 0.0196 0.7396 +vn -0.6565 0.0670 0.7513 +vn -0.8620 -0.4617 0.2090 +vn -0.6923 0.0473 0.7200 +vn -0.5000 -0.7071 0.5000 +vn -0.6099 -0.6737 0.4172 +vn -0.3780 0.7194 0.5828 +vn 0.4172 -0.6737 -0.6099 +vn 0.7200 0.0473 -0.6923 +vn 0.1319 0.9824 0.1319 +vn 0.5000 0.7071 -0.5000 +vn -0.1448 -0.9788 -0.1448 +vn 0.5828 0.7194 -0.3780 +vn 0.6099 -0.6737 0.4172 +vn 0.8620 -0.4617 0.2090 +vn 0.6565 0.0670 0.7513 +vn 0.6923 0.0473 0.7200 +vn 0.0945 0.5293 0.8431 +vn 0.3780 0.7194 0.5828 +vn 0.5000 -0.7071 0.5000 +vn -0.1319 0.9824 0.1319 +vn -0.5000 0.7071 -0.5000 +vn 0.6921 -0.2048 0.6921 +vn 0.8620 -0.4617 -0.2090 +vn -0.2090 -0.4617 0.8620 +vn -0.0372 -0.1363 0.9900 +vn -0.7396 0.0196 0.6727 +vn -0.7513 0.0670 0.6565 +vn -0.9890 0.1447 -0.0283 +vn -0.8431 0.5293 0.0945 +vn -0.6947 0.1866 -0.6947 +vn 0.0945 0.5293 -0.8431 +vn -0.0283 0.1447 -0.9890 +vn 0.6565 0.0670 -0.7513 +vn 0.6727 0.0196 -0.7396 +vn 0.9900 -0.1363 -0.0372 +vn 0.6923 0.0473 -0.7200 +vn 0.6099 -0.6737 -0.4172 +vn 0.3780 0.7194 -0.5828 +vn -0.4172 -0.6737 0.6099 +vn -0.7200 0.0473 0.6923 +vn -0.1319 0.9824 -0.1319 +vn 0.1448 -0.9788 0.1448 +vn -0.5828 0.7194 0.3780 +vn -0.1448 -0.9788 0.1448 +vn -0.6921 -0.2048 0.6921 +vn -0.6727 0.0196 -0.7396 +vn 0.6947 0.1866 -0.6947 +vn 0.9890 0.1447 -0.0283 +vn 0.0372 -0.1363 0.9900 +vn -0.9900 -0.1363 -0.0372 +vn 0.0283 0.1447 -0.9890 +vn 0.7396 0.0196 0.6727 +vn 0.5828 0.7194 0.3780 +vn 0.8431 0.5293 0.0945 +vn 0.7513 0.0670 0.6565 +vn 0.4172 -0.6737 0.6099 +vn 0.2090 -0.4617 0.8620 +vn -0.6099 -0.6737 -0.4172 +vn -0.8620 -0.4617 -0.2090 +vn -0.6923 0.0473 -0.7200 +vn -0.6565 0.0670 -0.7513 +vn -0.3780 0.7194 -0.5828 +vn -0.0945 0.5293 -0.8431 +vn 0.1319 0.9824 -0.1319 +vn 0.7200 0.0473 0.6923 +s off +f 3/1/1 202/2/1 1/3/1 +f 6/4/2 7/5/2 5/6/2 +f 3/7/3 8/8/3 4/9/3 +f 2/10/4 5/6/4 1/3/4 +f 4/11/5 6/12/5 2/13/5 +f 1/14/6 7/15/6 3/16/6 +f 513/17/3 507/18/3 509/19/3 +f 172/20/6 171/21/6 170/22/6 +f 180/23/5 179/24/5 178/25/5 +f 172/20/3 177/26/3 173/27/3 +f 171/21/4 175/28/4 170/22/4 +f 170/22/2 174/29/2 172/20/2 +f 180/23/4 185/30/4 181/31/4 +f 179/24/3 183/32/3 178/25/3 +f 178/25/2 182/33/2 180/23/2 +f 187/34/2 188/35/2 186/36/2 +f 194/37/4 200/38/4 198/39/4 +f 189/40/3 192/41/3 188/35/3 +f 186/36/4 191/42/4 187/34/4 +f 187/34/5 193/43/5 189/40/5 +f 188/35/6 190/44/6 186/36/6 +f 203/45/6 209/46/6 205/47/6 +f 4/48/1 204/49/1 3/1/1 +f 2/10/1 205/50/1 4/48/1 +f 1/3/1 203/51/1 2/10/1 +f 209/52/1 210/53/1 206/54/1 +f 204/55/5 207/56/5 202/57/5 +f 205/58/4 206/54/4 204/59/4 +f 202/60/3 208/61/3 203/62/3 +f 212/63/5 217/64/5 213/65/5 +f 207/66/1 212/67/1 208/61/1 +f 208/68/1 213/65/1 209/46/1 +f 206/69/1 211/70/1 207/56/1 +f 214/71/1 216/72/1 215/73/1 +f 210/74/6 215/73/6 211/70/6 +f 213/75/3 214/71/3 210/53/3 +f 211/76/4 216/72/4 212/67/4 +f 288/77/6 284/78/6 286/79/6 +f 286/80/3 285/81/3 287/82/3 +f 287/83/5 283/84/5 289/85/5 +f 289/86/4 282/87/4 288/88/4 +f 283/84/2 284/78/2 282/87/2 +f 360/89/2 359/90/2 361/91/2 +f 354/92/4 361/91/4 355/93/4 +f 356/94/5 360/89/5 354/95/5 +f 357/96/3 358/97/3 356/98/3 +f 355/99/6 359/90/6 357/100/6 +f 400/101/6 396/102/6 398/103/6 +f 398/104/3 397/105/3 399/106/3 +f 399/107/5 395/108/5 401/109/5 +f 401/110/4 394/111/4 400/112/4 +f 395/108/2 396/102/2 394/111/2 +f 408/113/2 407/114/2 409/115/2 +f 402/116/4 409/115/4 403/117/4 +f 404/118/5 408/113/5 402/119/5 +f 405/120/3 406/121/3 404/122/3 +f 403/123/6 407/114/6 405/124/6 +f 421/125/2 468/126/2 420/127/2 +f 422/128/2 469/129/2 421/125/2 +f 422/128/2 471/130/2 470/131/2 +f 424/132/2 471/130/2 423/133/2 +f 425/134/2 472/135/2 424/132/2 +f 410/136/2 473/137/2 425/134/2 +f 411/138/2 458/139/2 410/140/2 +f 412/141/2 459/142/2 411/138/2 +f 413/143/2 460/144/2 412/141/2 +f 413/143/2 462/145/2 461/146/2 +f 415/147/2 462/145/2 414/148/2 +f 416/149/2 463/150/2 415/147/2 +f 416/149/2 465/151/2 464/152/2 +f 417/153/2 466/154/2 465/151/2 +f 419/155/2 466/154/2 418/156/2 +f 419/155/2 468/126/2 467/157/2 +f 485/158/1 438/159/1 437/160/1 +f 438/159/1 487/161/1 439/162/1 +f 487/161/1 440/163/1 439/162/1 +f 488/164/1 441/165/1 440/163/1 +f 489/166/1 426/167/1 441/165/1 +f 474/168/1 427/169/1 426/170/1 +f 427/169/1 476/171/1 428/172/1 +f 428/172/1 477/173/1 429/174/1 +f 429/174/1 478/175/1 430/176/1 +f 478/175/1 431/177/1 430/176/1 +f 479/178/1 432/179/1 431/177/1 +f 432/179/1 481/180/1 433/181/1 +f 433/181/1 482/182/1 434/183/1 +f 482/182/1 435/184/1 434/183/1 +f 435/184/1 484/185/1 436/186/1 +f 484/185/1 437/160/1 436/186/1 +f 502/187/2 445/188/2 446/189/2 +f 501/190/2 446/189/2 447/191/2 +f 490/192/2 457/193/2 442/194/2 +f 443/195/2 504/196/2 505/197/2 +f 455/198/2 492/199/2 493/200/2 +f 444/201/2 503/202/2 504/196/2 +f 442/203/2 505/197/2 490/204/2 +f 451/205/2 496/206/2 497/207/2 +f 454/208/2 495/209/2 453/210/2 +f 491/211/2 456/212/2 457/193/2 +f 498/213/2 449/214/2 450/215/2 +f 454/208/2 493/200/2 494/216/2 +f 453/210/2 496/206/2 452/217/2 +f 500/218/2 447/191/2 448/219/2 +f 499/220/2 448/219/2 449/214/2 +f 497/207/2 450/215/2 451/205/2 +f 3/1/1 204/49/1 202/2/1 +f 6/4/2 8/221/2 7/5/2 +f 3/7/3 7/222/3 8/8/3 +f 2/10/4 6/4/4 5/6/4 +f 4/11/5 8/223/5 6/12/5 +f 1/14/6 5/224/6 7/15/6 +f 511/225/3 512/226/3 513/17/3 +f 513/17/3 506/227/3 507/18/3 +f 507/18/3 508/228/3 509/19/3 +f 509/19/3 510/229/3 511/225/3 +f 511/225/3 513/17/3 509/19/3 +f 172/20/6 173/27/6 171/21/6 +f 180/23/5 181/31/5 179/24/5 +f 172/20/3 174/230/3 177/26/3 +f 171/21/4 176/231/4 175/28/4 +f 170/22/2 175/232/2 174/29/2 +f 180/23/4 182/233/4 185/30/4 +f 179/24/3 184/234/3 183/32/3 +f 178/25/2 183/235/2 182/33/2 +f 187/34/2 189/40/2 188/35/2 +f 196/236/4 195/237/4 194/37/4 +f 194/37/4 201/238/4 200/38/4 +f 200/38/4 199/239/4 198/39/4 +f 198/39/4 197/240/4 196/236/4 +f 196/236/4 194/37/4 198/39/4 +f 189/40/3 193/241/3 192/41/3 +f 186/36/4 190/242/4 191/42/4 +f 187/34/5 191/243/5 193/43/5 +f 188/35/6 192/244/6 190/44/6 +f 203/45/6 208/68/6 209/46/6 +f 4/48/1 205/50/1 204/49/1 +f 2/10/1 203/51/1 205/50/1 +f 1/3/1 202/2/1 203/51/1 +f 209/52/1 213/75/1 210/53/1 +f 204/55/5 206/69/5 207/56/5 +f 205/58/4 209/52/4 206/54/4 +f 202/60/3 207/66/3 208/61/3 +f 212/63/5 216/72/5 217/64/5 +f 207/66/1 211/76/1 212/67/1 +f 208/68/1 212/63/1 213/65/1 +f 206/69/1 210/74/1 211/70/1 +f 214/71/1 217/64/1 216/72/1 +f 210/74/6 214/71/6 215/73/6 +f 213/75/3 217/64/3 214/71/3 +f 211/76/4 215/73/4 216/72/4 +f 288/77/6 282/87/6 284/78/6 +f 286/80/3 284/78/3 285/81/3 +f 287/83/5 285/81/5 283/84/5 +f 289/86/4 283/84/4 282/87/4 +f 283/84/2 285/81/2 284/78/2 +f 360/89/2 358/97/2 359/90/2 +f 354/92/4 360/89/4 361/91/4 +f 356/94/5 358/97/5 360/89/5 +f 357/96/3 359/90/3 358/97/3 +f 355/99/6 361/91/6 359/90/6 +f 400/101/6 394/111/6 396/102/6 +f 398/104/3 396/102/3 397/105/3 +f 399/107/5 397/105/5 395/108/5 +f 401/110/4 395/108/4 394/111/4 +f 395/108/2 397/105/2 396/102/2 +f 408/113/2 406/121/2 407/114/2 +f 402/116/4 408/113/4 409/115/4 +f 404/118/5 406/121/5 408/113/5 +f 405/120/3 407/114/3 406/121/3 +f 403/123/6 409/115/6 407/114/6 +f 421/125/2 469/129/2 468/126/2 +f 422/128/2 470/131/2 469/129/2 +f 422/128/2 423/133/2 471/130/2 +f 424/132/2 472/135/2 471/130/2 +f 425/134/2 473/137/2 472/135/2 +f 410/136/2 458/245/2 473/137/2 +f 411/138/2 459/142/2 458/139/2 +f 412/141/2 460/144/2 459/142/2 +f 413/143/2 461/146/2 460/144/2 +f 413/143/2 414/148/2 462/145/2 +f 415/147/2 463/150/2 462/145/2 +f 416/149/2 464/152/2 463/150/2 +f 416/149/2 417/153/2 465/151/2 +f 417/153/2 418/156/2 466/154/2 +f 419/155/2 467/157/2 466/154/2 +f 419/155/2 420/127/2 468/126/2 +f 485/158/1 486/246/1 438/159/1 +f 438/159/1 486/246/1 487/161/1 +f 487/161/1 488/164/1 440/163/1 +f 488/164/1 489/166/1 441/165/1 +f 489/166/1 474/247/1 426/167/1 +f 474/168/1 475/248/1 427/169/1 +f 427/169/1 475/248/1 476/171/1 +f 428/172/1 476/171/1 477/173/1 +f 429/174/1 477/173/1 478/175/1 +f 478/175/1 479/178/1 431/177/1 +f 479/178/1 480/249/1 432/179/1 +f 432/179/1 480/249/1 481/180/1 +f 433/181/1 481/180/1 482/182/1 +f 482/182/1 483/250/1 435/184/1 +f 435/184/1 483/250/1 484/185/1 +f 484/185/1 485/158/1 437/160/1 +f 502/187/2 503/202/2 445/188/2 +f 501/190/2 502/187/2 446/189/2 +f 490/192/2 491/211/2 457/193/2 +f 443/195/2 444/201/2 504/196/2 +f 455/198/2 456/212/2 492/199/2 +f 444/201/2 445/188/2 503/202/2 +f 442/203/2 443/195/2 505/197/2 +f 451/205/2 452/217/2 496/206/2 +f 454/208/2 494/216/2 495/209/2 +f 491/211/2 492/199/2 456/212/2 +f 498/213/2 499/220/2 449/214/2 +f 454/208/2 455/198/2 493/200/2 +f 453/210/2 495/209/2 496/206/2 +f 500/218/2 501/190/2 447/191/2 +f 499/220/2 500/218/2 448/219/2 +f 497/207/2 498/213/2 450/215/2 +s 1 +f 11/251/7 26/252/8 10/253/8 +f 19/254/9 34/255/10 18/256/10 +f 12/257/11 27/258/7 11/251/7 +f 20/259/12 35/260/9 19/254/9 +f 13/261/6 28/262/11 12/257/11 +f 21/263/5 36/264/12 20/259/12 +f 14/265/13 29/266/6 13/261/6 +f 22/267/14 37/268/5 21/263/5 +f 15/269/15 30/270/13 14/265/13 +f 23/271/16 38/272/14 22/267/14 +f 16/273/17 31/274/15 15/269/15 +f 24/275/18 39/276/16 23/271/16 +f 17/277/4 32/278/17 16/273/17 +f 10/253/8 25/279/3 9/280/3 +f 9/281/3 40/282/18 24/275/18 +f 18/256/10 33/283/4 17/277/4 +f 43/284/7 58/285/8 42/286/8 +f 51/287/9 66/288/10 50/289/10 +f 44/290/11 59/291/7 43/284/7 +f 52/292/12 67/293/9 51/287/9 +f 45/294/6 60/295/11 44/290/11 +f 53/296/5 68/297/12 52/292/12 +f 46/298/13 61/299/6 45/294/6 +f 54/300/14 69/301/5 53/296/5 +f 47/302/15 62/303/13 46/298/13 +f 55/304/16 70/305/14 54/300/14 +f 48/306/17 63/307/15 47/302/15 +f 56/308/18 71/309/16 55/304/16 +f 49/310/4 64/311/17 48/306/17 +f 42/286/8 57/312/3 41/313/3 +f 41/314/3 72/315/18 56/308/18 +f 50/289/10 65/316/4 49/310/4 +f 83/317/9 98/318/10 82/319/10 +f 76/320/11 91/321/7 75/322/7 +f 84/323/12 99/324/9 83/317/9 +f 77/325/6 92/326/11 76/320/11 +f 85/327/5 100/328/12 84/323/12 +f 78/329/13 93/330/6 77/325/6 +f 86/331/14 101/332/5 85/327/5 +f 79/333/15 94/334/13 78/329/13 +f 87/335/16 102/336/14 86/331/14 +f 80/337/17 95/338/15 79/333/15 +f 88/339/18 103/340/16 87/335/16 +f 81/341/4 96/342/17 80/337/17 +f 74/343/8 89/344/3 73/345/3 +f 73/346/3 104/347/18 88/339/18 +f 82/319/10 97/348/4 81/341/4 +f 75/322/7 90/349/8 74/343/8 +f 105/350/19 109/351/20 106/352/21 +f 153/353/22 152/354/2 107/355/23 +f 153/353/22 108/356/24 105/350/19 +f 108/356/24 112/357/25 109/351/20 +f 107/358/23 152/359/2 110/360/26 +f 107/358/23 111/361/27 108/356/24 +f 110/362/26 152/363/2 113/364/28 +f 111/361/27 113/364/28 114/365/29 +f 111/361/27 115/366/30 112/357/25 +f 113/367/28 117/368/31 114/365/29 +f 114/365/29 118/369/32 115/366/30 +f 113/367/28 152/370/2 116/371/33 +f 117/368/31 119/372/34 120/373/35 +f 117/368/31 121/374/36 118/369/32 +f 116/375/33 152/376/2 119/372/34 +f 119/377/34 123/378/37 120/373/35 +f 120/373/35 124/379/38 121/374/36 +f 119/377/34 152/380/2 122/381/39 +f 122/382/39 126/383/40 123/378/37 +f 123/378/37 127/384/41 124/379/38 +f 122/382/39 152/385/2 125/386/42 +f 125/387/42 129/388/43 126/383/40 +f 126/383/40 130/389/44 127/384/41 +f 125/387/42 152/390/2 128/391/45 +f 130/389/44 132/392/46 133/393/47 +f 128/394/45 152/395/2 131/396/48 +f 128/394/45 132/392/46 129/388/43 +f 133/393/47 135/397/49 136/398/50 +f 131/399/48 152/400/2 134/401/51 +f 131/399/48 135/397/49 132/392/46 +f 136/398/50 138/402/52 139/403/53 +f 134/404/51 152/405/2 137/406/54 +f 134/404/51 138/402/52 135/397/49 +f 139/403/53 141/407/55 142/408/56 +f 137/409/54 152/410/2 140/411/57 +f 137/409/54 141/407/55 138/402/52 +f 142/408/56 144/412/58 145/413/59 +f 140/414/57 152/415/2 143/416/60 +f 140/414/57 144/412/58 141/407/55 +f 143/417/60 152/418/2 146/419/61 +f 514/420/2 529/421/62 521/422/62 +f 515/423/63 523/424/2 514/420/2 +f 143/417/60 147/425/64 144/412/58 +f 517/426/65 524/427/5 516/428/5 +f 145/413/59 147/425/64 148/429/66 +f 519/430/67 526/431/1 518/432/1 +f 521/422/62 528/433/6 520/434/6 +f 147/425/64 149/435/68 150/436/69 +f 516/428/5 522/437/63 515/423/63 +f 148/429/66 150/436/69 151/438/70 +f 146/439/61 152/440/2 149/435/68 +f 518/441/1 525/442/65 517/426/65 +f 520/434/6 527/443/67 519/430/67 +f 149/444/68 105/445/19 150/436/69 +f 151/438/70 105/445/19 106/446/21 +f 149/444/68 152/447/2 153/448/22 +f 169/449/2 154/450/63 162/451/63 +f 168/452/62 160/453/2 169/449/2 +f 166/454/67 159/455/6 167/456/6 +f 164/457/65 157/458/1 165/459/1 +f 162/451/63 155/460/5 163/461/5 +f 167/456/6 161/462/62 168/452/62 +f 165/463/1 158/464/67 166/454/67 +f 163/461/5 156/465/65 164/457/65 +f 294/466/71 224/467/72 218/468/1 +f 231/469/3 262/470/73 230/471/16 +f 229/472/5 260/473/74 228/474/9 +f 227/475/4 258/476/75 226/477/15 +f 226/477/15 265/478/76 233/479/6 +f 232/480/7 263/481/77 231/469/3 +f 230/482/16 261/483/78 229/472/5 +f 228/474/9 259/484/79 227/475/4 +f 233/479/6 264/485/80 232/480/7 +f 266/486/81 291/487/82 267/488/83 +f 267/488/83 292/489/84 268/490/85 +f 268/490/85 293/491/86 269/492/87 +f 293/491/86 270/493/88 269/492/87 +f 252/494/89 245/495/72 253/496/90 +f 254/497/91 245/498/72 244/499/92 +f 254/497/91 243/500/93 255/501/94 +f 256/502/95 243/500/93 242/503/96 +f 256/502/95 249/504/97 257/505/98 +f 257/505/98 248/506/99 250/507/100 +f 251/508/101 248/506/99 247/509/102 +f 252/494/89 247/509/102 246/510/103 +f 239/511/104 299/512/105 238/513/106 +f 240/514/107 300/515/15 239/511/104 +f 236/516/108 301/517/16 235/518/109 +f 241/519/110 302/520/111 303/521/2 +f 241/519/110 298/522/81 240/514/107 +f 237/523/112 304/524/88 236/516/108 +f 235/518/109 302/520/111 234/525/113 +f 234/525/113 249/504/97 242/503/96 +f 235/526/109 242/503/96 243/500/93 +f 236/527/108 243/500/93 244/499/92 +f 245/498/72 236/527/108 244/499/92 +f 238/528/106 245/495/72 246/510/103 +f 270/529/88 295/530/114 271/531/115 +f 295/530/114 272/532/116 271/531/115 +f 296/533/117 273/534/118 272/532/116 +f 297/535/119 266/486/81 273/534/118 +f 297/535/119 222/536/9 221/537/97 +f 294/538/71 219/539/120 295/540/114 +f 290/541/121 225/542/122 291/487/82 +f 290/541/121 221/537/97 220/543/2 +f 239/544/104 246/510/103 247/509/102 +f 240/514/107 247/509/102 248/506/99 +f 249/504/97 240/514/107 248/506/99 +f 274/545/4 251/546/101 275/547/15 +f 279/548/16 256/502/95 280/549/5 +f 277/550/7 254/551/91 278/552/3 +f 275/547/15 252/553/89 276/554/6 +f 281/555/9 250/507/100 274/545/4 +f 280/549/5 257/505/98 281/555/9 +f 278/552/3 255/556/94 279/548/16 +f 276/554/6 253/557/90 277/558/7 +f 238/513/106 305/559/1 237/560/112 +f 295/540/114 222/536/9 296/561/117 +f 292/562/84 225/542/122 223/563/7 +f 292/562/84 224/467/72 293/564/86 +f 263/565/77 268/490/85 269/492/87 +f 264/566/80 267/488/83 268/490/85 +f 265/478/76 266/486/81 267/488/83 +f 259/484/79 266/486/81 258/476/75 +f 259/484/79 272/532/116 273/534/118 +f 261/567/78 272/532/116 260/568/74 +f 262/569/73 271/531/115 261/567/78 +f 263/565/77 270/493/88 262/570/73 +f 325/571/123 318/572/124 317/573/120 +f 325/574/123 316/575/125 326/576/126 +f 327/577/127 316/575/125 315/578/128 +f 328/579/129 315/578/128 314/580/130 +f 328/579/129 321/581/122 329/582/131 +f 329/582/131 320/583/132 322/584/133 +f 322/584/133 319/585/134 323/586/135 +f 324/587/136 319/585/134 318/572/124 +f 311/588/137 339/589/88 310/590/138 +f 312/591/139 340/592/16 311/588/137 +f 308/593/140 341/594/15 307/595/141 +f 313/596/142 342/597/81 343/598/2 +f 313/596/142 338/599/111 312/591/139 +f 309/600/143 344/601/105 308/593/140 +f 306/602/144 341/594/15 342/597/81 +f 306/602/144 321/581/122 314/580/130 +f 315/578/128 306/602/144 314/580/130 +f 316/575/125 307/603/141 315/578/128 +f 317/604/120 308/605/140 316/575/125 +f 310/606/138 317/573/120 318/572/124 +f 319/585/134 310/606/138 318/572/124 +f 312/591/139 319/585/134 320/583/132 +f 321/581/122 312/591/139 320/583/132 +f 330/607/3 323/608/135 331/609/16 +f 335/610/15 328/579/129 336/611/6 +f 333/612/9 326/613/126 334/614/4 +f 331/609/16 324/615/136 332/616/5 +f 337/617/7 322/584/133 330/607/3 +f 336/611/6 329/582/131 337/617/7 +f 334/614/4 327/618/127 335/610/15 +f 332/616/5 325/619/123 333/620/9 +f 309/621/143 339/589/88 345/622/1 +f 390/623/145 352/624/120 346/625/1 +f 367/626/4 374/627/146 366/628/15 +f 365/629/6 372/630/147 364/631/7 +f 363/632/3 370/633/148 362/634/16 +f 362/634/16 377/635/149 369/636/5 +f 368/637/9 375/638/150 367/626/4 +f 366/639/15 373/640/151 365/629/6 +f 364/631/7 371/641/152 363/632/3 +f 369/636/5 376/642/153 368/637/9 +f 378/643/111 387/644/154 379/645/155 +f 387/644/154 380/646/156 379/645/155 +f 380/646/156 389/647/157 381/648/158 +f 389/647/157 382/649/105 381/648/158 +f 382/650/105 391/651/159 383/652/160 +f 383/652/160 392/653/161 384/654/162 +f 384/654/162 393/655/163 385/656/164 +f 393/655/163 378/643/111 385/656/164 +f 393/655/163 350/657/7 349/658/122 +f 390/659/145 347/660/72 391/661/159 +f 386/662/165 353/663/97 387/644/154 +f 386/662/165 349/658/122 348/664/2 +f 391/661/159 350/657/7 392/665/161 +f 387/644/154 351/666/9 388/667/166 +f 388/667/166 352/624/120 389/668/157 +f 375/669/150 380/646/156 381/648/158 +f 376/670/153 379/645/155 380/646/156 +f 377/635/149 378/643/111 379/645/155 +f 371/641/152 378/643/111 370/633/148 +f 371/641/152 384/654/162 385/656/164 +f 373/671/151 384/654/162 372/672/147 +f 374/673/146 383/652/160 373/671/151 +f 375/669/150 382/649/105 374/674/146 +f 11/251/7 27/258/7 26/252/8 +f 19/254/9 35/260/9 34/255/10 +f 12/257/11 28/262/11 27/258/7 +f 20/259/12 36/264/12 35/260/9 +f 13/261/6 29/266/6 28/262/11 +f 21/263/5 37/268/5 36/264/12 +f 14/265/13 30/270/13 29/266/6 +f 22/267/14 38/272/14 37/268/5 +f 15/269/15 31/274/15 30/270/13 +f 23/271/16 39/276/16 38/272/14 +f 16/273/17 32/278/17 31/274/15 +f 24/275/18 40/282/18 39/276/16 +f 17/277/4 33/283/4 32/278/17 +f 10/253/8 26/252/8 25/279/3 +f 9/281/3 25/675/3 40/282/18 +f 18/256/10 34/255/10 33/283/4 +f 43/284/7 59/291/7 58/285/8 +f 51/287/9 67/293/9 66/288/10 +f 44/290/11 60/295/11 59/291/7 +f 52/292/12 68/297/12 67/293/9 +f 45/294/6 61/299/6 60/295/11 +f 53/296/5 69/301/5 68/297/12 +f 46/298/13 62/303/13 61/299/6 +f 54/300/14 70/305/14 69/301/5 +f 47/302/15 63/307/15 62/303/13 +f 55/304/16 71/309/16 70/305/14 +f 48/306/17 64/311/17 63/307/15 +f 56/308/18 72/315/18 71/309/16 +f 49/310/4 65/316/4 64/311/17 +f 42/286/8 58/285/8 57/312/3 +f 41/314/3 57/676/3 72/315/18 +f 50/289/10 66/288/10 65/316/4 +f 83/317/9 99/324/9 98/318/10 +f 76/320/11 92/326/11 91/321/7 +f 84/323/12 100/328/12 99/324/9 +f 77/325/6 93/330/6 92/326/11 +f 85/327/5 101/332/5 100/328/12 +f 78/329/13 94/334/13 93/330/6 +f 86/331/14 102/336/14 101/332/5 +f 79/333/15 95/338/15 94/334/13 +f 87/335/16 103/340/16 102/336/14 +f 80/337/17 96/342/17 95/338/15 +f 88/339/18 104/347/18 103/340/16 +f 81/341/4 97/348/4 96/342/17 +f 74/343/8 90/349/8 89/344/3 +f 73/346/3 89/677/3 104/347/18 +f 82/319/10 98/318/10 97/348/4 +f 75/322/7 91/321/7 90/349/8 +f 105/350/19 108/356/24 109/351/20 +f 153/353/22 107/355/23 108/356/24 +f 108/356/24 111/361/27 112/357/25 +f 107/358/23 110/360/26 111/361/27 +f 111/361/27 110/362/26 113/364/28 +f 111/361/27 114/365/29 115/366/30 +f 113/367/28 116/371/33 117/368/31 +f 114/365/29 117/368/31 118/369/32 +f 117/368/31 116/375/33 119/372/34 +f 117/368/31 120/373/35 121/374/36 +f 119/377/34 122/381/39 123/378/37 +f 120/373/35 123/378/37 124/379/38 +f 122/382/39 125/386/42 126/383/40 +f 123/378/37 126/383/40 127/384/41 +f 125/387/42 128/391/45 129/388/43 +f 126/383/40 129/388/43 130/389/44 +f 130/389/44 129/388/43 132/392/46 +f 128/394/45 131/396/48 132/392/46 +f 133/393/47 132/392/46 135/397/49 +f 131/399/48 134/401/51 135/397/49 +f 136/398/50 135/397/49 138/402/52 +f 134/404/51 137/406/54 138/402/52 +f 139/403/53 138/402/52 141/407/55 +f 137/409/54 140/411/57 141/407/55 +f 142/408/56 141/407/55 144/412/58 +f 140/414/57 143/416/60 144/412/58 +f 514/420/2 523/424/2 529/421/62 +f 515/423/63 522/437/63 523/424/2 +f 143/417/60 146/419/61 147/425/64 +f 517/426/65 525/442/65 524/427/5 +f 145/413/59 144/412/58 147/425/64 +f 519/430/67 527/443/67 526/431/1 +f 521/422/62 529/421/62 528/433/6 +f 147/425/64 146/439/61 149/435/68 +f 516/428/5 524/427/5 522/437/63 +f 148/429/66 147/425/64 150/436/69 +f 518/441/1 526/678/1 525/442/65 +f 520/434/6 528/433/6 527/443/67 +f 149/444/68 153/448/22 105/445/19 +f 151/438/70 150/436/69 105/445/19 +f 169/449/2 160/453/2 154/450/63 +f 168/452/62 161/462/62 160/453/2 +f 166/454/67 158/464/67 159/455/6 +f 164/457/65 156/465/65 157/458/1 +f 162/451/63 154/450/63 155/460/5 +f 167/456/6 159/455/6 161/462/62 +f 165/463/1 157/679/1 158/464/67 +f 163/461/5 155/460/5 156/465/65 +f 294/466/71 293/564/86 224/467/72 +f 231/469/3 263/481/77 262/470/73 +f 229/472/5 261/483/78 260/473/74 +f 227/475/4 259/484/79 258/476/75 +f 226/477/15 258/476/75 265/478/76 +f 232/480/7 264/485/80 263/481/77 +f 230/482/16 262/680/73 261/483/78 +f 228/474/9 260/473/74 259/484/79 +f 233/479/6 265/478/76 264/485/80 +f 266/486/81 290/541/121 291/487/82 +f 267/488/83 291/487/82 292/489/84 +f 268/490/85 292/489/84 293/491/86 +f 293/491/86 294/681/71 270/493/88 +f 252/494/89 246/510/103 245/495/72 +f 254/497/91 253/682/90 245/498/72 +f 254/497/91 244/499/92 243/500/93 +f 256/502/95 255/501/94 243/500/93 +f 256/502/95 242/503/96 249/504/97 +f 257/505/98 249/504/97 248/506/99 +f 251/508/101 250/507/100 248/506/99 +f 252/494/89 251/508/101 247/509/102 +f 239/511/104 300/515/15 299/512/105 +f 240/514/107 298/522/81 300/515/15 +f 236/516/108 304/524/88 301/517/16 +f 241/519/110 234/525/113 302/520/111 +f 241/519/110 303/521/2 298/522/81 +f 237/523/112 305/683/1 304/524/88 +f 235/518/109 301/517/16 302/520/111 +f 234/525/113 241/519/110 249/504/97 +f 235/526/109 234/525/113 242/503/96 +f 236/527/108 235/526/109 243/500/93 +f 245/498/72 237/684/112 236/527/108 +f 238/528/106 237/685/112 245/495/72 +f 270/529/88 294/686/71 295/530/114 +f 295/530/114 296/533/117 272/532/116 +f 296/533/117 297/535/119 273/534/118 +f 297/535/119 290/541/121 266/486/81 +f 297/535/119 296/561/117 222/536/9 +f 294/538/71 218/687/1 219/539/120 +f 290/541/121 220/543/2 225/542/122 +f 290/541/121 297/535/119 221/537/97 +f 239/544/104 238/528/106 246/510/103 +f 240/514/107 239/544/104 247/509/102 +f 249/504/97 241/519/110 240/514/107 +f 274/545/4 250/507/100 251/546/101 +f 279/548/16 255/556/94 256/502/95 +f 277/550/7 253/688/90 254/551/91 +f 275/547/15 251/546/101 252/553/89 +f 281/555/9 257/505/98 250/507/100 +f 280/549/5 256/502/95 257/505/98 +f 278/552/3 254/551/91 255/556/94 +f 276/554/6 252/553/89 253/557/90 +f 238/513/106 299/512/105 305/559/1 +f 295/540/114 219/539/120 222/536/9 +f 292/562/84 291/487/82 225/542/122 +f 292/562/84 223/563/7 224/467/72 +f 263/565/77 264/566/80 268/490/85 +f 264/566/80 265/478/76 267/488/83 +f 265/478/76 258/476/75 266/486/81 +f 259/484/79 273/534/118 266/486/81 +f 259/484/79 260/568/74 272/532/116 +f 261/567/78 271/531/115 272/532/116 +f 262/569/73 270/529/88 271/531/115 +f 263/565/77 269/492/87 270/493/88 +f 325/571/123 324/587/136 318/572/124 +f 325/574/123 317/604/120 316/575/125 +f 327/577/127 326/576/126 316/575/125 +f 328/579/129 327/577/127 315/578/128 +f 328/579/129 314/580/130 321/581/122 +f 329/582/131 321/581/122 320/583/132 +f 322/584/133 320/583/132 319/585/134 +f 324/587/136 323/586/135 319/585/134 +f 311/588/137 340/592/16 339/589/88 +f 312/591/139 338/599/111 340/592/16 +f 308/593/140 344/601/105 341/594/15 +f 313/596/142 306/602/144 342/597/81 +f 313/596/142 343/598/2 338/599/111 +f 309/600/143 345/689/1 344/601/105 +f 306/602/144 307/595/141 341/594/15 +f 306/602/144 313/596/142 321/581/122 +f 315/578/128 307/603/141 306/602/144 +f 316/575/125 308/605/140 307/603/141 +f 317/604/120 309/690/143 308/605/140 +f 310/606/138 309/691/143 317/573/120 +f 319/585/134 311/692/137 310/606/138 +f 312/591/139 311/692/137 319/585/134 +f 321/581/122 313/596/142 312/591/139 +f 330/607/3 322/584/133 323/608/135 +f 335/610/15 327/618/127 328/579/129 +f 333/612/9 325/693/123 326/613/126 +f 331/609/16 323/608/135 324/615/136 +f 337/617/7 329/582/131 322/584/133 +f 336/611/6 328/579/129 329/582/131 +f 334/614/4 326/613/126 327/618/127 +f 332/616/5 324/615/136 325/619/123 +f 309/621/143 310/590/138 339/589/88 +f 390/623/145 389/668/157 352/624/120 +f 367/626/4 375/638/150 374/627/146 +f 365/629/6 373/640/151 372/630/147 +f 363/632/3 371/641/152 370/633/148 +f 362/634/16 370/633/148 377/635/149 +f 368/637/9 376/642/153 375/638/150 +f 366/639/15 374/694/146 373/640/151 +f 364/631/7 372/630/147 371/641/152 +f 369/636/5 377/635/149 376/642/153 +f 378/643/111 386/662/165 387/644/154 +f 387/644/154 388/695/166 380/646/156 +f 380/646/156 388/695/166 389/647/157 +f 389/647/157 390/696/145 382/649/105 +f 382/650/105 390/697/145 391/651/159 +f 383/652/160 391/651/159 392/653/161 +f 384/654/162 392/653/161 393/655/163 +f 393/655/163 386/662/165 378/643/111 +f 393/655/163 392/665/161 350/657/7 +f 390/659/145 346/698/1 347/660/72 +f 386/662/165 348/664/2 353/663/97 +f 386/662/165 393/655/163 349/658/122 +f 391/661/159 347/660/72 350/657/7 +f 387/644/154 353/663/97 351/666/9 +f 388/667/166 351/666/9 352/624/120 +f 375/669/150 376/670/153 380/646/156 +f 376/670/153 377/635/149 379/645/155 +f 377/635/149 370/633/148 378/643/111 +f 371/641/152 385/656/164 378/643/111 +f 371/641/152 372/672/147 384/654/162 +f 373/671/151 383/652/160 384/654/162 +f 374/673/146 382/650/105 383/652/160 +f 375/669/150 381/648/158 382/649/105 diff --git a/src/main/resources/assets/hbm/models/machines/boiler_burst.obj b/src/main/resources/assets/hbm/models/machines/boiler_burst.obj new file mode 100644 index 000000000..242ef8101 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/boiler_burst.obj @@ -0,0 +1,1299 @@ +# Blender v2.79 (sub 0) OBJ File: 'boiler_burst.blend' +# www.blender.org +o Plane +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.500000 0.250000 1.500000 +v 1.500000 0.250000 1.500000 +v -1.500000 0.250000 -1.500000 +v 1.500000 0.250000 -1.500000 +v 0.000000 0.250000 -1.375000 +v -0.526190 0.250000 -1.270334 +v -0.972272 0.250000 -0.972272 +v -1.270334 0.250000 -0.526190 +v -1.375000 0.250000 0.000000 +v -1.270334 0.250000 0.526190 +v -0.972272 0.250000 0.972272 +v -0.526190 0.250000 1.270334 +v -0.000000 0.250000 1.375000 +v 0.526189 0.250000 1.270334 +v 0.972272 0.250000 0.972272 +v 1.270334 0.250000 0.526190 +v 1.375000 0.250000 -0.000000 +v 1.270334 0.250000 -0.526190 +v 0.972272 0.250000 -0.972272 +v 0.526189 0.250000 -1.270335 +v 0.000000 0.500000 -1.375000 +v -0.526190 0.500000 -1.270334 +v -0.972272 0.500000 -0.972272 +v -1.270334 0.500000 -0.526190 +v -1.375000 0.500000 0.000000 +v -1.270334 0.500000 0.526190 +v -0.972272 0.500000 0.972272 +v -0.526190 0.500000 1.270334 +v -0.000000 0.500000 1.375000 +v 0.526189 0.500000 1.270334 +v 0.972272 0.500000 0.972272 +v 1.270334 0.500000 0.526190 +v 1.375000 0.500000 -0.000000 +v 1.270334 0.500000 -0.526190 +v 0.972272 0.500000 -0.972272 +v 0.526189 0.500000 -1.270335 +v 0.000000 0.500000 -1.250000 +v -0.478354 0.500000 -1.154849 +v -0.883883 0.500000 -0.883883 +v -1.154849 0.500000 -0.478354 +v -1.250000 0.500000 0.000000 +v -1.154849 0.500000 0.478354 +v -0.883883 0.500000 0.883883 +v -0.478354 0.500000 1.154849 +v -0.000000 0.500000 1.250000 +v 0.478354 0.500000 1.154850 +v 0.883883 0.500000 0.883884 +v 1.154849 0.500000 0.478354 +v 1.250000 0.500000 -0.000000 +v 1.154849 0.500000 -0.478355 +v 0.883883 0.500000 -0.883884 +v 0.478354 0.500000 -1.154850 +v -0.000000 0.716458 -1.082532 +v -0.000000 0.966458 -1.250000 +v 0.239177 0.533445 -0.577425 +v 0.414267 0.716458 -1.000129 +v 0.478354 0.966458 -1.154849 +v 0.441941 0.533445 -0.441942 +v 0.765465 0.716458 -0.765465 +v 0.883883 0.966458 -0.883883 +v 0.577424 0.533445 -0.239177 +v 1.000129 0.716458 -0.414267 +v 1.154849 0.966458 -0.478354 +v 0.625000 0.533445 -0.000000 +v 1.082531 0.716458 0.000000 +v 1.250000 0.966458 0.000000 +v 0.577424 0.533445 0.239177 +v 1.000129 0.716458 0.414267 +v 1.154849 0.966458 0.478354 +v 0.441941 0.533445 0.441941 +v 0.765465 0.716458 0.765465 +v 0.883883 0.966458 0.883883 +v 0.239177 0.533445 0.577424 +v 0.414266 0.716458 1.000129 +v 0.478354 0.966458 1.154849 +v -0.000000 0.533445 0.625000 +v -0.000000 0.716458 1.082531 +v -0.000001 0.966458 1.250000 +v -0.239177 0.533445 0.577424 +v -0.414267 0.716458 1.000128 +v -0.478355 0.966458 1.154849 +v -0.441942 0.533445 0.441941 +v -0.765466 0.716458 0.765465 +v -0.883884 0.966458 0.883883 +v -0.577425 0.533445 0.239177 +v -1.000129 0.716458 0.414266 +v -1.154849 0.966458 0.478354 +v -0.625000 0.533445 -0.000000 +v -1.082531 0.716458 -0.000001 +v -1.250000 0.966458 -0.000001 +v -0.577424 0.533445 -0.239177 +v -1.000129 0.716458 -0.414267 +v -1.154849 0.966458 -0.478355 +v -0.441941 0.533445 -0.441942 +v -0.765465 0.716458 -0.765466 +v -0.883883 0.966458 -0.883884 +v -0.239177 0.533445 -0.577425 +v -0.414266 0.716458 -1.000129 +v -0.478354 0.966458 -1.154849 +v -0.000000 0.466458 0.000000 +v 0.000000 0.533445 -0.625000 +v 0.265165 1.390165 1.182243 +v 0.375000 1.125000 -1.125000 +v 0.265165 0.859835 -1.125000 +v -0.000000 0.750000 -1.125000 +v -0.265165 0.859835 -1.125000 +v -0.265165 1.390165 1.176438 +v 0.000000 1.500000 1.232605 +v -0.319109 0.990066 -1.125000 +v 0.265165 1.390165 -1.375000 +v 0.375000 1.125000 -1.375000 +v 0.265165 0.859835 -1.375000 +v -0.000000 0.750000 -1.375000 +v -0.265165 0.859835 -1.375000 +v -0.375000 1.125000 -1.375000 +v -0.265165 1.390165 -1.375000 +v -0.000000 1.500000 -1.375000 +v -1.500000 0.750000 0.250000 +v -1.500000 0.250000 0.250000 +v -1.500000 0.750000 -0.250000 +v -1.500000 0.250000 -0.250000 +v -1.187500 0.750000 -0.250000 +v -1.187500 0.750000 0.250000 +v -1.187500 0.250000 0.250000 +v -1.187500 0.250000 -0.250000 +v 1.500000 0.750000 -0.250000 +v 1.500000 0.250000 -0.250000 +v 1.500000 0.750000 0.250000 +v 1.500000 0.250000 0.250000 +v 1.187500 0.750000 0.250000 +v 1.187500 0.750000 -0.250000 +v 1.187500 0.250000 -0.250000 +v 1.187500 0.250000 0.250000 +v 0.000000 1.500000 1.375000 +v 0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.375000 +v 0.265165 0.859835 1.375000 +v 0.000000 0.750000 1.375000 +v -0.265165 0.859835 1.375000 +v -0.375000 1.125000 1.375000 +v -0.265165 1.390165 1.375000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v -1.099112 1.741336 -1.099111 +v 1.187500 0.375000 1.312500 +v 1.099112 0.375000 1.275888 +v 1.062500 0.375000 1.187500 +v 1.099112 0.375000 1.099111 +v 1.187500 0.375000 1.062500 +v 1.275889 0.375000 1.099111 +v 1.312500 0.375000 1.187500 +v 1.275889 0.375000 1.275888 +v 1.000000 0.375000 1.375000 +v 1.375000 0.375000 1.375000 +v 1.000000 0.375000 1.000000 +v 1.375000 0.375000 1.000000 +v 1.000000 0.250000 1.000000 +v 1.375000 0.250000 1.000000 +v 1.000000 0.250000 1.375000 +v 1.375000 0.250000 1.375000 +v 0.478354 1.453251 -1.154850 +v -1.062500 1.565094 -1.187500 +v -1.099112 1.675266 -1.275888 +v -1.187500 1.753248 -1.062500 +v -1.275889 1.629296 -1.099111 +v -1.275889 1.746521 -1.275888 +v -1.187500 1.634389 -1.312500 +v -1.312500 1.584031 -1.187500 +v -0.478354 1.380250 -1.154849 +v -1.154849 1.715569 -0.478354 +v -0.883883 1.256777 -0.883883 +v -0.883883 1.354637 0.883883 +v -1.154849 1.408746 0.478354 +v -1.250000 1.688512 0.000000 +v -0.000000 1.841970 1.250000 +v -1.187500 0.375000 -1.312500 +v -1.099112 0.375000 -1.275888 +v -1.062500 0.375000 -1.187500 +v -1.099112 0.375000 -1.099111 +v -1.187500 0.375000 -1.062500 +v -1.275889 0.375000 -1.099111 +v -1.312500 0.375000 -1.187500 +v -1.275889 0.375000 -1.275888 +v 0.478354 1.503106 1.154850 +v -0.478354 1.603803 1.154849 +v 1.250000 1.431234 -0.000000 +v 1.154849 1.266202 0.478354 +v 0.883883 1.639337 0.883884 +v 0.883883 1.186719 -0.883884 +v 0.000000 1.664942 -1.250000 +v 1.154849 1.584849 -0.478355 +v 1.375000 0.250000 -1.000000 +v 1.000000 0.250000 -1.000000 +v 1.375000 0.250000 -1.375000 +v 1.000000 0.250000 -1.375000 +v 1.375000 0.375000 -1.375000 +v 1.000000 0.375000 -1.375000 +v 1.375000 0.375000 -1.000000 +v 1.000000 0.375000 -1.000000 +v 1.187500 1.566981 1.062500 +v 1.275889 1.631251 1.099111 +v 1.312500 1.580286 1.187500 +v 1.275889 1.568108 1.275888 +v 1.099112 1.493643 1.099111 +v 1.099112 1.588674 1.275888 +v 1.187500 1.538954 1.312500 +v 1.062500 1.537098 1.187500 +v -1.375000 0.375000 1.375000 +v -1.000000 0.375000 1.375000 +v -1.375000 0.375000 1.000000 +v -1.000000 0.375000 1.000000 +v -1.375000 0.250000 1.000000 +v -1.000000 0.250000 1.000000 +v -1.375000 0.250000 1.375000 +v -1.000000 0.250000 1.375000 +v -1.000000 0.250000 -1.000000 +v -1.375000 0.250000 -1.000000 +v -1.000000 0.250000 -1.375000 +v -1.375000 0.250000 -1.375000 +v -1.000000 0.375000 -1.375000 +v -1.375000 0.375000 -1.375000 +v -1.000000 0.375000 -1.000000 +v -1.375000 0.375000 -1.000000 +v 0.000000 0.500000 -1.375000 +v -0.526190 0.500000 -1.270334 +v -0.972272 0.500000 -0.972272 +v -1.270334 0.500000 -0.526190 +v -1.375000 0.500000 0.000000 +v -1.270334 0.500000 0.526190 +v -0.972272 0.500000 0.972272 +v -0.526190 0.500000 1.270334 +v -0.000000 0.500000 1.375000 +v 0.526189 0.500000 1.270334 +v 0.972272 0.500000 0.972272 +v 1.270334 0.500000 0.526190 +v 1.375000 0.500000 -0.000000 +v 1.270334 0.500000 -0.526190 +v 0.972272 0.500000 -0.972272 +v 0.526189 0.500000 -1.270335 +v 1.154849 1.584848 -0.478355 +v 0.000000 1.664942 -1.250000 +v 0.883883 1.186719 -0.883884 +v 0.883883 1.639337 0.883884 +v 1.154849 1.266202 0.478354 +v 1.250000 1.431234 -0.000000 +v -0.478354 1.603803 1.154849 +v 0.478354 1.503106 1.154850 +v -0.000000 1.841970 1.250000 +v -1.250000 1.688512 0.000000 +v -1.154849 1.408746 0.478354 +v -0.883883 1.354637 0.883883 +v -0.883883 1.256777 -0.883883 +v -1.154849 1.715569 -0.478354 +v -0.478354 1.380250 -1.154849 +v 0.478354 1.453251 -1.154850 +v 0.000000 0.500000 -1.250000 +v -0.478354 0.500000 -1.154849 +v -0.883883 0.500000 -0.883883 +v -1.154849 0.500000 -0.478354 +v -1.250000 0.500000 0.000000 +v -1.154849 0.500000 0.478354 +v -0.883883 0.500000 0.883883 +v -0.478354 0.500000 1.154849 +v -0.000000 0.500000 1.250000 +v 0.478354 0.500000 1.154850 +v 0.883883 0.500000 0.883884 +v 1.154849 0.500000 0.478354 +v 1.250000 0.500000 -0.000000 +v 1.154849 0.500000 -0.478355 +v 0.883883 0.500000 -0.883884 +v 0.478354 0.500000 -1.154850 +v 0.418559 0.500000 -1.010493 +v 0.773398 0.500000 -0.773398 +v 1.010493 0.500000 -0.418560 +v 1.093750 0.500000 -0.000000 +v 1.010493 0.500000 0.418560 +v 0.773398 0.500000 0.773398 +v 0.418560 0.500000 1.010493 +v -0.000000 0.500000 1.093750 +v -0.418560 0.500000 1.010493 +v -0.773398 0.500000 0.773398 +v -1.010493 0.500000 0.418560 +v -1.093750 0.500000 0.000000 +v -1.010493 0.500000 -0.418560 +v -0.773398 0.500000 -0.773398 +v -0.418560 0.500000 -1.010493 +v -0.000000 0.500000 -1.093750 +v 0.265165 1.390165 -1.375000 +v 0.375000 1.125000 -1.375000 +v 0.265165 0.859835 -1.375000 +v -0.000000 0.750000 -1.375000 +v -0.265165 0.859835 -1.375000 +v -0.375000 1.125000 -1.375000 +v -0.265165 1.390165 -1.375000 +v -0.000000 1.500000 -1.375000 +v 0.000000 1.500000 1.375000 +v 0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.375000 +v 0.265165 0.859835 1.375000 +v 0.000000 0.750000 1.375000 +v -0.265165 0.859835 1.375000 +v -0.375000 1.125000 1.375000 +v -0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.125000 +v 0.265165 0.859835 1.125000 +v 0.000000 0.750000 1.125000 +v -0.265165 0.859835 1.125000 +v -0.375000 1.125000 1.125000 +v 0.265165 1.390165 -1.184336 +v 0.375000 1.125000 -1.147111 +v -0.000000 1.500000 -1.242492 +v -0.265165 1.390165 -1.190043 +v -0.375000 1.125000 -1.153109 +v 0.375000 1.125000 1.150544 +vt 0.000000 0.000000 +vt 0.081633 0.320000 +vt 0.000000 0.480000 +vt 0.244898 0.520000 +vt 0.000000 1.000000 +vt 0.000000 0.520000 +vt 0.244898 0.480000 +vt 0.000000 0.520000 +vt 0.000000 0.480000 +vt 0.244898 0.480000 +vt 0.244898 0.480000 +vt -0.000000 0.520000 +vt -0.000000 0.480000 +vt 0.244898 0.480000 +vt 0.000000 0.520000 +vt 0.000000 0.480000 +vt 0.275510 0.929965 +vt 0.244916 0.870000 +vt 0.275510 0.810035 +vt 0.331633 0.890000 +vt 0.372449 0.810000 +vt 0.372449 0.890000 +vt 0.331633 0.890000 +vt 0.372449 0.810000 +vt 0.372449 0.890000 +vt 0.306122 0.810000 +vt 0.331633 0.810000 +vt 0.397959 0.890000 +vt 0.331633 0.940000 +vt 0.306122 0.810000 +vt 0.331633 0.810000 +vt 0.397959 0.890000 +vt 0.331633 0.940000 +vt 0.275510 0.929965 +vt 0.244916 0.870000 +vt 0.275510 0.810035 +vt 1.000000 0.180000 +vt 0.994898 0.020000 +vt 1.000000 0.020000 +vt 0.244898 0.000000 +vt 0.081633 0.160000 +vt 0.163265 0.160000 +vt 0.163265 0.320000 +vt 0.989796 0.010000 +vt 0.913265 0.020000 +vt 0.908163 0.010000 +vt 0.897959 0.020000 +vt 0.903061 0.180000 +vt 0.897959 0.180000 +vt 0.989796 0.000000 +vt 0.908163 0.000000 +vt 0.908163 0.200000 +vt 0.989796 0.190000 +vt 0.989796 0.200000 +vt 0.989796 0.170000 +vt 0.984694 0.030000 +vt 0.989796 0.030000 +vt 0.908163 0.190000 +vt 0.984694 0.180000 +vt 0.994898 0.180000 +vt 0.903061 0.020000 +vt 0.908163 0.170000 +vt 0.913265 0.030000 +vt 0.984694 0.170000 +vt 0.913265 0.170000 +vt 0.908163 0.030000 +vt 0.984694 0.020000 +vt 0.913265 0.180000 +vt 0.408163 0.790000 +vt 0.418367 0.850000 +vt 0.408163 0.850000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.459184 0.850000 +vt 0.448980 0.790000 +vt 0.459184 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.790000 +vt 0.418367 0.770000 +vt 0.448980 0.790000 +vt 0.418367 0.850000 +vt 0.418367 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.770000 +vt 0.459184 0.850000 +vt 0.459184 0.790000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.408163 0.790000 +vt 0.408163 0.850000 +vt 0.408163 0.790000 +vt 0.418367 0.850000 +vt 0.408163 0.850000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.459184 0.850000 +vt 0.448980 0.790000 +vt 0.459184 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.790000 +vt 0.418367 0.770000 +vt 0.448980 0.790000 +vt 0.418367 0.850000 +vt 0.418367 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.770000 +vt 0.459184 0.850000 +vt 0.459184 0.790000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.408163 0.790000 +vt 0.408163 0.850000 +vt 0.693878 0.040000 +vt 0.653061 0.060000 +vt 0.653061 0.040000 +vt 0.734694 0.040000 +vt 0.693878 0.060000 +vt 0.775510 0.060000 +vt 0.734694 0.060000 +vt 0.816327 0.040000 +vt 0.775510 0.040000 +vt 0.857143 0.040000 +vt 0.816327 0.060000 +vt 0.897959 0.040000 +vt 0.857143 0.060000 +vt 0.285714 0.040000 +vt 0.244898 0.060000 +vt 0.244898 0.040000 +vt 0.326531 0.040000 +vt 0.285714 0.060000 +vt 0.367347 0.040000 +vt 0.326531 0.060000 +vt 0.408163 0.060000 +vt 0.367347 0.060000 +vt 0.448980 0.040000 +vt 0.408163 0.040000 +vt 0.489796 0.040000 +vt 0.448980 0.060000 +vt 0.530612 0.060000 +vt 0.489796 0.060000 +vt 0.530612 0.040000 +vt 0.571429 0.060000 +vt 0.612245 0.040000 +vt 0.571429 0.040000 +vt 0.612245 0.060000 +vt 0.244898 1.000000 +vt 0.244898 0.520000 +vt 0.244898 0.520000 +vt 0.244898 0.520000 +vt 0.306104 0.870000 +vt 0.297144 0.912401 +vt 0.253877 0.912401 +vt 0.253877 0.827599 +vt 0.297144 0.827599 +vt 0.306122 0.890000 +vt 0.397959 0.810000 +vt 0.372449 0.940000 +vt 0.306122 0.890000 +vt 0.397959 0.810000 +vt 0.372449 0.940000 +vt 0.306104 0.870000 +vt 0.297144 0.912401 +vt 0.253877 0.912401 +vt 0.253877 0.827599 +vt 0.297144 0.827599 +vt 0.897959 0.060000 +vt 0.326531 -0.000000 +vt 0.285714 0.040000 +vt 0.285714 0.000000 +vt 0.653061 0.000000 +vt 0.612245 0.040000 +vt 0.612245 -0.000000 +vt 0.367347 0.000000 +vt 0.326531 0.040000 +vt 0.693878 0.000000 +vt 0.653061 0.040000 +vt 0.408163 0.000000 +vt 0.367347 0.040000 +vt 0.734694 0.000000 +vt 0.693878 0.040000 +vt 0.448980 0.000000 +vt 0.408163 0.040000 +vt 0.775510 0.000000 +vt 0.734694 0.040000 +vt 0.489796 0.000000 +vt 0.448980 0.040000 +vt 0.816327 0.000000 +vt 0.775510 0.040000 +vt 0.530612 -0.000000 +vt 0.489796 0.040000 +vt 0.857143 -0.000000 +vt 0.816327 0.040000 +vt 0.571429 -0.000000 +vt 0.530612 0.040000 +vt 0.244898 0.040000 +vt 0.244898 0.000000 +vt 0.897959 0.000000 +vt 0.857143 0.040000 +vt 0.571429 0.040000 +vt 0.653061 0.060000 +vt 0.612245 0.220497 +vt 0.612245 0.060000 +vt 0.367347 0.060000 +vt 0.326531 0.181084 +vt 0.326531 0.060000 +vt 0.693878 0.182592 +vt 0.653061 0.242294 +vt 0.408163 0.250162 +vt 0.367347 0.254491 +vt 0.734694 0.060000 +vt 0.693878 0.060000 +vt 0.408163 0.060000 +vt 0.448980 0.205399 +vt 0.775510 0.060000 +vt 0.734694 0.208998 +vt 0.448980 0.060000 +vt 0.489796 0.196742 +vt 0.816327 0.169875 +vt 0.775510 0.233576 +vt 0.530612 0.060000 +vt 0.489796 0.060000 +vt 0.857143 0.060000 +vt 0.816327 0.060000 +vt 0.571429 0.060000 +vt 0.530612 0.236608 +vt 0.244898 0.060000 +vt 0.285714 0.200840 +vt 0.244898 0.246391 +vt 0.897959 0.060000 +vt 0.857143 0.212520 +vt 0.571429 0.274715 +vt 0.285714 0.060000 +vt 0.897959 0.590000 +vt 0.857143 0.540000 +vt 0.897959 0.540000 +vt 0.887755 0.670000 +vt 0.877551 0.770000 +vt 0.867347 0.670000 +vt 0.857143 0.590000 +vt 0.816327 0.540000 +vt 0.846939 0.670000 +vt 0.836735 0.770000 +vt 0.826531 0.670000 +vt 0.816327 0.590000 +vt 0.806122 0.670000 +vt 0.795918 0.770000 +vt 0.785714 0.670000 +vt 0.775510 0.590000 +vt 0.775510 0.540000 +vt 0.765306 0.670000 +vt 0.734694 0.590000 +vt 0.734694 0.540000 +vt 0.755102 0.770000 +vt 0.744898 0.670000 +vt 0.724490 0.670000 +vt 0.693878 0.590000 +vt 0.693878 0.540000 +vt 0.714286 0.770000 +vt 0.704082 0.670000 +vt 0.683673 0.670000 +vt 0.653061 0.590000 +vt 0.653061 0.540000 +vt 0.673469 0.770000 +vt 0.663265 0.670000 +vt 0.642857 0.670000 +vt 0.612245 0.590000 +vt 0.612245 0.540000 +vt 0.632653 0.770000 +vt 0.622449 0.670000 +vt 0.602041 0.670000 +vt 0.571429 0.590000 +vt 0.571429 0.540000 +vt 0.591837 0.770000 +vt 0.581633 0.670000 +vt 0.530612 0.590000 +vt 0.530612 0.540000 +vt 0.561224 0.670000 +vt 0.551020 0.770000 +vt 0.540816 0.670000 +vt 0.489796 0.590000 +vt 0.489796 0.540000 +vt 0.520408 0.670000 +vt 0.510204 0.770000 +vt 0.500000 0.670000 +vt 0.448980 0.590000 +vt 0.448980 0.540000 +vt 0.479592 0.670000 +vt 0.469388 0.770000 +vt 0.459184 0.670000 +vt 0.408163 0.590000 +vt 0.408163 0.540000 +vt 0.438776 0.670000 +vt 0.428571 0.770000 +vt 0.418367 0.670000 +vt 0.367347 0.590000 +vt 0.367347 0.540000 +vt 0.397959 0.670000 +vt 0.387755 0.770000 +vt 0.377551 0.670000 +vt 0.357143 0.670000 +vt 0.346939 0.770000 +vt 0.336735 0.670000 +vt 0.346939 0.810000 +vt 0.326531 0.787217 +vt 0.346939 0.778230 +vt 0.306122 0.810000 +vt 0.326531 0.810000 +vt 0.326531 0.590000 +vt 0.265306 0.770000 +vt 0.285714 0.770000 +vt 0.285714 0.774087 +vt 0.326531 0.540000 +vt 0.387755 0.810000 +vt 0.408163 0.770000 +vt 0.408163 0.810000 +vt 0.367347 0.810000 +vt 0.367347 0.770000 +vt 0.316327 0.670000 +vt 0.285714 0.590000 +vt 0.285714 0.810000 +vt 0.306122 0.779159 +vt 0.285714 0.540000 +vt 0.306122 0.770000 +vt 0.295918 0.670000 +vt 0.244898 0.810000 +vt 0.265306 0.810000 +vt 0.387755 0.770000 +vt 0.275510 0.670000 +vt 0.244898 0.590000 +vt 0.244898 0.540000 +vt 0.265306 0.770000 +vt 0.255102 0.670000 +vt 0.346939 0.810000 +vt 0.326531 0.788799 +vt 0.346939 0.779494 +vt 0.306122 0.810000 +vt 0.326531 0.810000 +vt 0.265306 0.810000 +vt 0.265306 0.770000 +vt 0.275329 0.770000 +vt 0.387755 0.810000 +vt 0.408163 0.770000 +vt 0.408163 0.810000 +vt 0.367347 0.810000 +vt 0.367347 0.773538 +vt 0.285714 0.810000 +vt 0.306122 0.780407 +vt 0.244898 0.810000 +vt 0.367347 0.770000 +vt 0.387755 0.770000 +vt 0.459184 0.890000 +vt 0.554200 0.870000 +vt 0.558259 0.890000 +vt 0.459184 0.810000 +vt 0.557574 0.830000 +vt 0.459184 0.830000 +vt 0.459184 0.790000 +vt 0.550501 0.770000 +vt 0.556488 0.790000 +vt 0.554049 0.910000 +vt 0.459184 0.910000 +vt 0.459184 0.850000 +vt 0.459184 0.870000 +vt 0.556580 0.850000 +vt 0.561735 0.810000 +vt 0.550501 0.930000 +vt 0.459184 0.930000 +vt 0.459184 0.890000 +vt 0.561991 0.870000 +vt 0.565328 0.890000 +vt 0.459184 0.810000 +vt 0.557880 0.830000 +vt 0.459184 0.830000 +vt 0.459184 0.790000 +vt 0.570721 0.770000 +vt 0.571694 0.790000 +vt 0.459184 0.850000 +vt 0.459184 0.870000 +vt 0.571145 0.850000 +vt 0.561575 0.810000 +vt 0.459184 0.930000 +vt 0.556334 0.910000 +vt 0.570721 0.930000 +vt 0.285714 0.060000 +vt 0.326531 0.181084 +vt 0.326531 0.060000 +vt 0.571429 0.060000 +vt 0.612245 0.220497 +vt 0.612245 0.060000 +vt 0.857143 0.212520 +vt 0.897959 0.060000 +vt 0.857143 0.060000 +vt 0.244898 0.060000 +vt 0.285714 0.200840 +vt 0.530612 0.236608 +vt 0.530612 0.060000 +vt 0.816327 0.169875 +vt 0.816327 0.060000 +vt 0.489796 0.196742 +vt 0.489796 0.060000 +vt 0.775510 0.060000 +vt 0.448980 0.060000 +vt 0.734694 0.208998 +vt 0.734694 0.060000 +vt 0.408163 0.060000 +vt 0.448980 0.205399 +vt 0.693878 0.182592 +vt 0.693878 0.060000 +vt 0.367347 0.060000 +vt 0.408163 0.250162 +vt 0.653061 0.060000 +vt 0.897959 0.040000 +vt 0.897959 0.246391 +vt 0.244898 0.770000 +vt 0.285714 0.774498 +vt 0.244898 0.770000 +vt 0.459184 0.770000 +vt 0.459184 0.770000 +vt 0.459184 0.910000 +vt 0.571429 0.274715 +vt 0.897959 0.246391 +vt 0.244898 0.246391 +vt 0.775510 0.233576 +vt 0.367347 0.254491 +vt 0.653061 0.242294 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 -0.9239 +vn 0.7071 0.0000 0.7071 +vn 0.3827 0.0000 0.9239 +vn -0.9239 0.0000 -0.3827 +vn 0.9239 0.0000 0.3827 +vn -0.9239 0.0000 0.3827 +vn 0.9239 0.0000 -0.3827 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +vn 0.3673 0.0000 0.9301 +vn -0.7241 0.0000 -0.6897 +vn 0.9177 0.0000 0.3972 +vn 0.6825 0.0000 0.7308 +vn -0.9991 0.0000 -0.0428 +vn -0.9450 0.0000 -0.3269 +vn -0.9368 0.0000 0.3498 +vn 0.9992 0.0000 -0.0402 +vn -0.6933 0.0000 0.7206 +vn 0.7131 0.0000 -0.7011 +vn 0.9367 0.0000 -0.3500 +vn -0.3276 0.0000 0.9448 +vn -0.3406 0.0000 -0.9402 +vn 0.0107 0.0000 -0.9999 +vn 0.3273 0.0000 -0.9449 +vn -0.0146 0.0000 0.9999 +vn 0.0000 0.7595 0.6505 +vn -0.3179 0.5565 0.7676 +vn 0.0000 0.5565 0.8308 +vn 0.0000 0.9664 0.2571 +vn -0.0984 0.9664 0.2376 +vn -0.2489 0.7595 0.6009 +vn -0.5875 0.5565 0.5875 +vn -0.1818 0.9664 0.1818 +vn -0.4599 0.7595 0.4599 +vn -0.2376 0.9664 0.0984 +vn -0.6009 0.7595 0.2489 +vn -0.7676 0.5565 0.3179 +vn -0.6505 0.7595 0.0000 +vn -0.8308 0.5565 0.0000 +vn -0.2571 0.9664 0.0000 +vn -0.6009 0.7595 -0.2489 +vn -0.7676 0.5565 -0.3179 +vn -0.2376 0.9664 -0.0984 +vn -0.4599 0.7595 -0.4599 +vn -0.5875 0.5565 -0.5875 +vn -0.1818 0.9664 -0.1818 +vn -0.2489 0.7595 -0.6009 +vn -0.3179 0.5565 -0.7676 +vn -0.0984 0.9664 -0.2376 +vn 0.0000 0.7595 -0.6505 +vn 0.0000 0.5565 -0.8308 +vn 0.0000 0.9664 -0.2571 +vn 0.2489 0.7595 -0.6009 +vn 0.3179 0.5565 -0.7676 +vn 0.0984 0.9664 -0.2376 +vn 0.4599 0.7595 -0.4599 +vn 0.5875 0.5565 -0.5875 +vn 0.1818 0.9664 -0.1818 +vn 0.6009 0.7595 -0.2489 +vn 0.7676 0.5565 -0.3179 +vn 0.2376 0.9664 -0.0984 +vn 0.6505 0.7595 0.0000 +vn 0.8308 0.5565 0.0000 +vn 0.2571 0.9664 0.0000 +vn 0.6009 0.7595 0.2489 +vn 0.7676 0.5565 0.3179 +vn 0.2376 0.9664 0.0984 +vn 0.1818 0.9664 0.1818 +vn -0.7071 0.7071 0.0000 +vn -0.0023 1.0000 0.0000 +vn -0.7409 0.6716 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.4599 0.7595 0.4599 +vn 0.7071 -0.7071 0.0000 +vn 0.9239 -0.3827 0.0000 +vn 0.9887 -0.1495 0.0000 +vn 0.5875 0.5565 0.5875 +vn -0.7071 -0.7071 0.0000 +vn -0.9997 -0.0248 0.0000 +vn 0.2489 0.7595 0.6009 +vn 0.7335 0.6796 0.0000 +vn 0.3179 0.5565 0.7676 +vn 0.0984 0.9664 0.2376 +vn 0.0022 1.0000 0.0000 +vn 0.7377 0.6751 0.0000 +vn -0.9239 -0.3827 0.0000 +vn 0.9884 -0.1518 0.0000 +vn -0.7357 0.6772 0.0000 +vn -0.0194 0.0000 0.9998 +vn -0.7050 0.0000 0.7091 +vn 0.9973 0.0000 -0.0726 +vn -0.6911 0.0000 -0.7227 +vn 0.1652 0.0000 -0.9862 +vn -0.9930 0.0000 0.1180 +vn 0.7474 0.0000 0.6643 +vn 0.7215 0.0000 -0.6924 +vn -0.0432 0.0000 -0.9991 +vn 0.6336 0.0000 -0.7736 +vn -0.9986 0.0000 -0.0534 +vn 0.5336 0.0000 0.8457 +vn 0.1536 0.0000 0.9881 +vn -0.6648 0.0000 -0.7470 +vn -0.5901 0.0000 0.8073 +vn 0.9998 0.0000 0.0178 +vn 0.3687 0.1836 0.9112 +vn 0.7411 0.1645 0.6509 +vn 0.6925 0.2022 0.6925 +vn 0.0041 0.1384 -0.9904 +vn -0.3432 0.1329 -0.9298 +vn -0.3781 0.1539 -0.9129 +vn -0.2659 0.1476 0.9526 +vn -0.0038 0.1574 0.9875 +vn -0.3603 0.1804 0.9152 +vn 0.2843 0.1560 0.9460 +vn 0.2723 0.1278 -0.9537 +vn 0.3672 0.1536 -0.9174 +vn -0.7129 0.1744 0.6793 +vn -0.6895 0.2218 0.6895 +vn 0.6661 0.1616 -0.7281 +vn 0.6955 0.1798 -0.6955 +vn -0.9156 0.1751 0.3619 +vn 0.9111 0.1729 -0.3740 +vn -0.9843 0.1555 0.0828 +vn -0.9842 0.1766 0.0101 +vn 0.9895 0.1439 0.0117 +vn 0.9400 0.1527 -0.3050 +vn -0.8948 0.1652 -0.4148 +vn -0.9052 0.1998 -0.3750 +vn 0.9208 0.1528 0.3587 +vn 0.9888 0.1288 0.0749 +vn -0.6882 0.1631 -0.7069 +vn -0.9991 -0.0411 0.0000 +vn 0.0215 0.1156 -0.9930 +vn -0.0169 0.1329 0.9910 +vn -0.9345 0.1423 0.3262 +vn 0.9489 0.1269 0.2889 +vn -0.6608 0.1357 -0.7382 +s off +f 3/1/1 146/2/1 1/3/1 +f 6/4/2 7/5/2 5/6/2 +f 3/7/3 8/8/3 4/9/3 +f 2/10/4 5/6/4 1/3/4 +f 4/11/5 6/12/5 2/13/5 +f 1/14/6 7/15/6 3/16/6 +f 313/17/3 307/18/3 309/19/3 +f 124/20/6 123/21/6 122/22/6 +f 132/23/5 131/24/5 130/25/5 +f 124/20/3 129/26/3 125/27/3 +f 123/21/4 127/28/4 122/22/4 +f 122/22/2 126/29/2 124/20/2 +f 132/23/4 137/30/4 133/31/4 +f 131/24/3 135/32/3 130/25/3 +f 130/25/2 134/33/2 132/23/2 +f 138/34/4 144/35/4 142/36/4 +f 147/37/6 153/38/6 149/39/6 +f 4/40/1 148/41/1 3/1/1 +f 2/10/1 149/42/1 4/40/1 +f 1/3/1 147/43/1 2/10/1 +f 153/44/1 154/45/1 150/46/1 +f 148/47/5 151/48/5 146/49/5 +f 149/50/4 150/46/4 148/51/4 +f 146/52/3 152/53/3 147/54/3 +f 156/55/5 161/56/5 157/57/5 +f 151/58/1 156/59/1 152/53/1 +f 152/60/1 157/57/1 153/38/1 +f 150/61/1 155/62/1 151/48/1 +f 158/63/1 160/64/1 159/65/1 +f 154/66/6 159/65/6 155/62/6 +f 157/67/3 158/63/3 154/45/3 +f 155/68/4 160/64/4 156/59/4 +f 177/69/6 173/70/6 175/71/6 +f 175/72/3 174/73/3 176/74/3 +f 176/75/5 172/76/5 178/77/5 +f 178/78/4 171/79/4 177/80/4 +f 172/76/2 173/70/2 171/79/2 +f 216/81/2 215/82/2 217/83/2 +f 210/84/4 217/83/4 211/85/4 +f 212/86/5 216/81/5 210/87/5 +f 213/88/3 214/89/3 212/90/3 +f 211/91/6 215/82/6 213/92/6 +f 232/93/6 228/94/6 230/95/6 +f 230/96/3 229/97/3 231/98/3 +f 231/99/5 227/100/5 233/101/5 +f 233/102/4 226/103/4 232/104/4 +f 227/100/2 228/94/2 226/103/2 +f 240/105/2 239/106/2 241/107/2 +f 234/108/4 241/107/4 235/109/4 +f 236/110/5 240/105/5 234/111/5 +f 237/112/3 238/113/3 236/114/3 +f 235/115/6 239/106/6 237/116/6 +f 253/117/2 284/118/2 252/119/2 +f 254/120/2 285/121/2 253/117/2 +f 254/120/2 287/122/2 286/123/2 +f 256/124/2 287/122/2 255/125/2 +f 257/126/2 288/127/2 256/124/2 +f 242/128/2 289/129/2 257/126/2 +f 243/130/2 274/131/2 242/132/2 +f 244/133/2 275/134/2 243/130/2 +f 245/135/2 276/136/2 244/133/2 +f 245/135/2 278/137/2 277/138/2 +f 247/139/2 278/137/2 246/140/2 +f 248/141/2 279/142/2 247/139/2 +f 248/141/2 281/143/2 280/144/2 +f 249/145/2 282/146/2 281/143/2 +f 251/147/2 282/146/2 250/148/2 +f 251/147/2 284/118/2 283/149/2 +f 3/1/1 148/41/1 146/2/1 +f 6/4/2 8/150/2 7/5/2 +f 3/7/3 7/151/3 8/8/3 +f 2/10/4 6/4/4 5/6/4 +f 4/11/5 8/152/5 6/12/5 +f 1/14/6 5/153/6 7/15/6 +f 311/154/3 312/155/3 313/17/3 +f 313/17/3 306/156/3 307/18/3 +f 307/18/3 308/157/3 309/19/3 +f 309/19/3 310/158/3 311/154/3 +f 311/154/3 313/17/3 309/19/3 +f 124/20/6 125/27/6 123/21/6 +f 132/23/5 133/31/5 131/24/5 +f 124/20/3 126/159/3 129/26/3 +f 123/21/4 128/160/4 127/28/4 +f 122/22/2 127/161/2 126/29/2 +f 132/23/4 134/162/4 137/30/4 +f 131/24/3 136/163/3 135/32/3 +f 130/25/2 135/164/2 134/33/2 +f 140/165/4 139/166/4 138/34/4 +f 138/34/4 145/167/4 144/35/4 +f 144/35/4 143/168/4 142/36/4 +f 142/36/4 141/169/4 140/165/4 +f 140/165/4 138/34/4 142/36/4 +f 147/37/6 152/60/6 153/38/6 +f 4/40/1 149/42/1 148/41/1 +f 2/10/1 147/43/1 149/42/1 +f 1/3/1 146/2/1 147/43/1 +f 153/44/1 157/67/1 154/45/1 +f 148/47/5 150/61/5 151/48/5 +f 149/50/4 153/44/4 150/46/4 +f 146/52/3 151/58/3 152/53/3 +f 156/55/5 160/64/5 161/56/5 +f 151/58/1 155/68/1 156/59/1 +f 152/60/1 156/55/1 157/57/1 +f 150/61/1 154/66/1 155/62/1 +f 158/63/1 161/56/1 160/64/1 +f 154/66/6 158/63/6 159/65/6 +f 157/67/3 161/56/3 158/63/3 +f 155/68/4 159/65/4 160/64/4 +f 177/69/6 171/79/6 173/70/6 +f 175/72/3 173/70/3 174/73/3 +f 176/75/5 174/73/5 172/76/5 +f 178/78/4 172/76/4 171/79/4 +f 172/76/2 174/73/2 173/70/2 +f 216/81/2 214/89/2 215/82/2 +f 210/84/4 216/81/4 217/83/4 +f 212/86/5 214/89/5 216/81/5 +f 213/88/3 215/82/3 214/89/3 +f 211/91/6 217/83/6 215/82/6 +f 232/93/6 226/103/6 228/94/6 +f 230/96/3 228/94/3 229/97/3 +f 231/99/5 229/97/5 227/100/5 +f 233/102/4 227/100/4 226/103/4 +f 227/100/2 229/97/2 228/94/2 +f 240/105/2 238/113/2 239/106/2 +f 234/108/4 240/105/4 241/107/4 +f 236/110/5 238/113/5 240/105/5 +f 237/112/3 239/106/3 238/113/3 +f 235/115/6 241/107/6 239/106/6 +f 253/117/2 285/121/2 284/118/2 +f 254/120/2 286/123/2 285/121/2 +f 254/120/2 255/125/2 287/122/2 +f 256/124/2 288/127/2 287/122/2 +f 257/126/2 289/129/2 288/127/2 +f 242/128/2 274/170/2 289/129/2 +f 243/130/2 275/134/2 274/131/2 +f 244/133/2 276/136/2 275/134/2 +f 245/135/2 277/138/2 276/136/2 +f 245/135/2 246/140/2 278/137/2 +f 247/139/2 279/142/2 278/137/2 +f 248/141/2 280/144/2 279/142/2 +f 248/141/2 249/145/2 281/143/2 +f 249/145/2 250/148/2 282/146/2 +f 251/147/2 283/149/2 282/146/2 +f 251/147/2 252/119/2 284/118/2 +s 1 +f 11/171/7 26/172/8 10/173/8 +f 19/174/9 34/175/10 18/176/10 +f 12/177/11 27/178/7 11/171/7 +f 20/179/12 35/180/9 19/174/9 +f 13/181/6 28/182/11 12/177/11 +f 21/183/5 36/184/12 20/179/12 +f 14/185/13 29/186/6 13/181/6 +f 22/187/14 37/188/5 21/183/5 +f 15/189/15 30/190/13 14/185/13 +f 23/191/16 38/192/14 22/187/14 +f 16/193/17 31/194/15 15/189/15 +f 24/195/18 39/196/16 23/191/16 +f 17/197/4 32/198/17 16/193/17 +f 10/173/8 25/199/3 9/200/3 +f 9/201/3 40/202/18 24/195/18 +f 18/176/10 33/203/4 17/197/4 +f 51/204/9 202/205/19 50/206/10 +f 44/207/11 189/208/20 43/209/7 +f 51/204/9 205/210/21 206/211/22 +f 44/207/11 192/212/23 188/213/24 +f 53/214/5 205/210/21 52/215/12 +f 45/216/6 191/217/25 192/212/23 +f 54/218/14 204/219/26 53/214/5 +f 46/220/13 190/221/27 191/217/25 +f 54/218/14 207/222/28 209/223/29 +f 48/224/17 190/221/27 47/225/15 +f 56/226/18 207/222/28 55/227/16 +f 49/228/4 203/229/30 48/224/17 +f 41/230/3 187/231/31 208/232/32 +f 41/233/3 179/234/33 56/226/18 +f 49/228/4 202/205/19 193/235/34 +f 42/236/8 189/208/20 187/231/31 +f 57/237/35 61/238/36 58/239/37 +f 105/240/38 104/241/2 59/242/39 +f 105/240/38 60/243/40 57/237/35 +f 60/243/40 64/244/41 61/238/36 +f 59/245/39 104/246/2 62/247/42 +f 59/245/39 63/248/43 60/243/40 +f 62/249/42 104/250/2 65/251/44 +f 63/248/43 65/251/44 66/252/45 +f 63/248/43 67/253/46 64/244/41 +f 65/254/44 69/255/47 66/252/45 +f 67/253/46 69/255/47 70/256/48 +f 65/254/44 104/257/2 68/258/49 +f 68/259/49 72/260/50 69/255/47 +f 69/255/47 73/261/51 70/256/48 +f 68/259/49 104/262/2 71/263/52 +f 71/264/52 75/265/53 72/260/50 +f 72/260/50 76/266/54 73/261/51 +f 71/264/52 104/267/2 74/268/55 +f 74/269/55 78/270/56 75/265/53 +f 75/265/53 79/271/57 76/266/54 +f 74/269/55 104/272/2 77/273/58 +f 77/274/58 81/275/59 78/270/56 +f 79/271/57 81/275/59 82/276/60 +f 77/274/58 104/277/2 80/278/61 +f 82/276/60 84/279/62 85/280/63 +f 80/281/61 104/282/2 83/283/64 +f 80/281/61 84/279/62 81/275/59 +f 85/280/63 87/284/65 88/285/66 +f 83/286/64 104/287/2 86/288/67 +f 83/286/64 87/284/65 84/279/62 +f 88/285/66 90/289/68 91/290/69 +f 86/291/67 104/292/2 89/293/70 +f 86/291/67 90/289/68 87/284/65 +f 91/290/69 93/294/71 94/295/72 +f 89/296/70 104/297/2 92/298/73 +f 89/296/70 93/294/71 90/289/68 +f 94/295/72 96/299/74 97/300/75 +f 92/301/73 104/302/2 95/303/76 +f 93/294/71 95/303/76 96/299/74 +f 95/304/76 104/305/2 98/306/77 +f 321/307/78 112/308/79 111/309/80 +f 315/310/81 112/308/79 314/311/2 +f 95/304/76 99/312/82 96/299/74 +f 323/313/83 322/314/84 332/315/85 +f 97/300/75 99/312/82 100/316/86 +f 319/317/87 324/318/1 318/319/1 +f 320/320/6 111/309/80 326/321/88 +f 98/322/77 102/323/89 99/312/82 +f 316/324/5 106/325/90 315/310/81 +f 100/316/86 102/323/89 103/326/91 +f 98/322/77 104/327/2 101/328/92 +f 318/329/1 323/313/83 317/330/83 +f 320/320/6 325/331/87 319/317/87 +f 101/332/92 57/333/35 102/323/89 +f 103/326/91 57/333/35 58/334/37 +f 101/332/92 104/335/2 105/336/38 +f 114/337/81 329/338/93 327/339/94 +f 120/340/78 329/338/93 121/341/2 +f 118/342/87 110/343/87 113/344/95 +f 116/345/83 109/346/1 117/347/1 +f 115/348/5 327/339/94 328/349/96 +f 119/350/6 330/351/97 120/340/78 +f 117/352/1 110/343/87 118/342/87 +f 328/349/96 107/353/84 108/354/83 +f 164/355/15 224/356/98 223/357/99 +f 168/358/16 220/359/100 169/360/5 +f 167/361/3 222/362/101 218/363/102 +f 164/355/15 225/364/103 165/365/6 +f 170/366/9 224/356/98 163/367/4 +f 169/360/5 221/368/104 170/366/9 +f 168/358/16 218/363/102 219/369/105 +f 165/365/6 222/370/101 166/371/7 +f 195/372/16 185/373/106 181/374/107 +f 199/375/15 186/376/108 200/377/6 +f 198/378/4 162/379/109 182/380/110 +f 201/381/7 185/373/106 194/382/3 +f 201/381/7 186/376/108 184/383/111 +f 198/378/4 183/384/112 199/375/15 +f 197/385/9 180/386/113 162/387/109 +f 180/386/113 195/372/16 181/374/107 +f 304/388/114 270/389/115 303/390/116 +f 297/391/117 265/392/118 296/393/119 +f 273/394/120 305/395/121 290/396/122 +f 305/397/121 272/398/123 304/388/114 +f 264/399/124 297/391/117 298/400/125 +f 260/401/126 290/396/122 291/402/127 +f 269/403/128 298/400/125 299/404/129 +f 292/405/130 260/401/126 291/402/127 +f 300/406/131 269/403/128 299/404/129 +f 263/407/132 292/405/130 293/408/133 +f 301/409/134 268/410/135 300/406/131 +f 262/411/136 293/408/133 294/412/137 +f 302/413/138 267/414/139 301/409/134 +f 295/415/140 262/411/136 294/412/137 +f 270/389/115 302/413/138 303/390/116 +f 265/392/118 295/415/140 296/393/119 +f 11/171/7 27/178/7 26/172/8 +f 19/174/9 35/180/9 34/175/10 +f 12/177/11 28/182/11 27/178/7 +f 20/179/12 36/184/12 35/180/9 +f 13/181/6 29/186/6 28/182/11 +f 21/183/5 37/188/5 36/184/12 +f 14/185/13 30/190/13 29/186/6 +f 22/187/14 38/192/14 37/188/5 +f 15/189/15 31/194/15 30/190/13 +f 23/191/16 39/196/16 38/192/14 +f 16/193/17 32/198/17 31/194/15 +f 24/195/18 40/202/18 39/196/16 +f 17/197/4 33/203/4 32/198/17 +f 10/173/8 26/172/8 25/199/3 +f 9/201/3 25/416/3 40/202/18 +f 18/176/10 34/175/10 33/203/4 +f 51/204/9 206/211/22 202/205/19 +f 44/207/11 188/213/24 189/208/20 +f 51/204/9 52/215/12 205/210/21 +f 44/207/11 45/216/6 192/212/23 +f 53/214/5 204/219/26 205/210/21 +f 45/216/6 46/220/13 191/217/25 +f 54/218/14 209/223/29 204/219/26 +f 46/220/13 47/225/15 190/221/27 +f 54/218/14 55/227/16 207/222/28 +f 48/224/17 203/229/30 190/221/27 +f 56/226/18 179/234/33 207/222/28 +f 49/228/4 193/235/34 203/229/30 +f 41/230/3 42/236/8 187/231/31 +f 41/233/3 208/417/32 179/234/33 +f 49/228/4 50/206/10 202/205/19 +f 42/236/8 43/209/7 189/208/20 +f 57/237/35 60/243/40 61/238/36 +f 105/240/38 59/242/39 60/243/40 +f 60/243/40 63/248/43 64/244/41 +f 59/245/39 62/247/42 63/248/43 +f 63/248/43 62/249/42 65/251/44 +f 63/248/43 66/252/45 67/253/46 +f 65/254/44 68/258/49 69/255/47 +f 67/253/46 66/252/45 69/255/47 +f 68/259/49 71/263/52 72/260/50 +f 69/255/47 72/260/50 73/261/51 +f 71/264/52 74/268/55 75/265/53 +f 72/260/50 75/265/53 76/266/54 +f 74/269/55 77/273/58 78/270/56 +f 75/265/53 78/270/56 79/271/57 +f 77/274/58 80/278/61 81/275/59 +f 79/271/57 78/270/56 81/275/59 +f 82/276/60 81/275/59 84/279/62 +f 80/281/61 83/283/64 84/279/62 +f 85/280/63 84/279/62 87/284/65 +f 83/286/64 86/288/67 87/284/65 +f 88/285/66 87/284/65 90/289/68 +f 86/291/67 89/293/70 90/289/68 +f 91/290/69 90/289/68 93/294/71 +f 89/296/70 92/298/73 93/294/71 +f 94/295/72 93/294/71 96/299/74 +f 93/294/71 92/301/73 95/303/76 +f 321/307/78 314/311/2 112/308/79 +f 315/310/81 106/325/90 112/308/79 +f 95/304/76 98/306/77 99/312/82 +f 332/315/85 316/324/5 317/330/83 +f 317/330/83 323/313/83 332/315/85 +f 97/300/75 96/299/74 99/312/82 +f 319/317/87 325/331/87 324/318/1 +f 320/320/6 321/307/78 111/309/80 +f 98/322/77 101/328/92 102/323/89 +f 316/324/5 332/315/85 106/325/90 +f 100/316/86 99/312/82 102/323/89 +f 318/329/1 324/418/1 323/313/83 +f 320/320/6 326/321/88 325/331/87 +f 101/332/92 105/336/38 57/333/35 +f 103/326/91 102/323/89 57/333/35 +f 114/337/81 121/341/2 329/338/93 +f 120/340/78 330/351/97 329/338/93 +f 331/419/141 119/350/6 113/344/95 +f 119/350/6 118/342/87 113/344/95 +f 116/345/83 108/354/83 109/346/1 +f 115/348/5 114/337/81 327/339/94 +f 119/350/6 331/419/141 330/351/97 +f 117/352/1 109/420/1 110/343/87 +f 108/354/83 116/345/83 328/349/96 +f 116/345/83 115/348/5 328/349/96 +f 164/355/15 163/367/4 224/356/98 +f 168/358/16 219/369/105 220/359/100 +f 167/361/3 166/421/7 222/362/101 +f 164/355/15 223/357/99 225/364/103 +f 170/366/9 221/368/104 224/356/98 +f 169/360/5 220/359/100 221/368/104 +f 168/358/16 167/361/3 218/363/102 +f 165/365/6 225/364/103 222/370/101 +f 195/372/16 194/382/3 185/373/106 +f 199/375/15 183/384/112 186/376/108 +f 198/378/4 197/422/9 162/379/109 +f 201/381/7 184/383/111 185/373/106 +f 201/381/7 200/377/6 186/376/108 +f 198/378/4 182/380/110 183/384/112 +f 197/385/9 196/423/5 180/386/113 +f 180/386/113 196/423/5 195/372/16 +f 304/388/114 272/398/123 270/389/115 +f 297/391/117 266/424/142 265/392/118 +f 273/394/120 259/425/143 305/395/121 +f 305/397/121 259/426/143 272/398/123 +f 264/399/124 266/424/142 297/391/117 +f 260/401/126 273/394/120 290/396/122 +f 269/403/128 264/399/124 298/400/125 +f 292/405/130 258/427/144 260/401/126 +f 300/406/131 268/410/135 269/403/128 +f 263/407/132 258/427/144 292/405/130 +f 301/409/134 267/414/139 268/410/135 +f 262/411/136 263/407/132 293/408/133 +f 302/413/138 271/428/145 267/414/139 +f 295/415/140 261/429/146 262/411/136 +f 270/389/115 271/428/145 302/413/138 +f 265/392/118 261/429/146 295/415/140 diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 2bcda4f58..9f9711070 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -45,6 +45,7 @@ "block.openC": {"category": "block", "sounds": ["block/openC1", "block/openC2", "block/openCSqueaky"]}, "block.closeC": {"category": "block", "sounds": ["block/closeC1", "block/closeC2", "block/closeC3"]}, "block.warnOverspeed": {"category": "block", "sounds": [{"name": "block/warnOverspeed", "stream": false}]}, + "block.boilerGroan": {"category": "block", "sounds": ["block/boilerGroan0", "block/boilerGroan1", "block/boilerGroan2"]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, "door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/boilerGroan0.ogg b/src/main/resources/assets/hbm/sounds/block/boilerGroan0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8a4dca960bd720111b5d81ee916ebef447011030 GIT binary patch literal 11029 zcmcI~by!qg*Y_b5kd*F_9GU?nB&1>Jq06AVQv^i;6+vp~jv-}`hCz@Vqz35@L2?KI z0Rh2xxbNqEzU#ZL@89oSGyANyerK<}_Fi$$*)#f1PDTJO@SnrHS(ojGWS)Atgu{vx z=;dqc;&&s!xhrsU0)PaEf6o~>`ZqoQd))NI!E&;ZPdAC>{{HXLfcLKsK`dnM;_WP~ z@9V_w?qX~Dk7jl)cCe_Jq^OvvBs z#2gCzsI{ZDh`8N#5&pE=TN!q#V(Kh*XiG?r-IN&iIw(}Dz>i+mk=veHR=s!2_PMBR zN})1ed*2dtTPP~VDyD6k(Fh|HNw4kFN%+)nuVHcl;@V4Z7b}M9T{Yr+^)12V#!lcN zKF&Wj-vNLw0}?gEmp8z}+rUeJTFr;L&xctfiE9w|pGzJBH>=P0;X7Xvr&f}^MXG~E zYDq|HSxbe;B|;d3*xNypMMi(b2fhLTeKg0LC9Rj-IS(ati1=k#f}!M6w851@FRiT z=J5TX^_5)}Ed$Dd=|K3Z>Ql9dgi@yNZDzytAUyDTTIgUgY)V<+769N&W54EvQPCd> zfkFVFc%1;%1ogmd^~B!5pdUbe3D6;#-gMtsu`PDvA+fK_k(!`hdOtmx4R(7H{tf0x z67Y==$*^Bqk?m(?)YwgGR+=_w5a%8P%1;V4X)*XWo zoJal$so2RV!8|M3Mpj_vYIl&edssH6LSViGGf;~eXsjBjMYv(n!pb=Ww(s7+P2Z1~ zC77MYodG0bpmu-05ph{tMclfDY(xwo5S6tbF||UNM)!H;{$t}waoyMi$*3^QZ{DOy3> zLwZ1tC=zQ><1VH`5YvvpphPi9(T_-vKZq*g?n(@*1}j`>k9VDK|GCpB_8IBP-1>>> z%iblbro6%<3sH$F5x^kbG3{O$q)#lCtq{CK?hM?pKQZkhBt@7VB>y1t(_C%!AX1p5 z6~WZ)I^VTFhx8t*6((sq5a_EWR+(&!`aT&@R5_3GBJLiO3Ty{}mpBC2D5n~D_`fc` z%|S?GN5PL`kEDR!;V3p1yUk%o20<~yC?HxKurVxPj}1ZQWD1CLIqVyR4-PkgXcxey zpsqqC6P6?e_0$lTD%hB%E2wb->W)(8IuKNTF_|(yym$d!A4lhG_M9)oI?HyA+Nu&N-C8u%E*qpFt?;v!T$W{CwRpdM8XmYmqZW0m@|lc5l; za_krz*)TF${*2d25Kwta67*ww@|Y4I_v=`Q7Q7(|BJi)OD5#}d)nqzUTN0LpRn?0f zqpE??NI){m07{I_7_7Msrf#l6jRwkY1;w=5{9+BXcG$t`u|P4U6{x(I)+(;5!Q4n& zGBwH8y=rm>A|x|q=>`#+8iU4GHKbeVwDg+0k#hf|3TqXls&~q=>Sl2Mnv^8Vn;w?2 zlCUvb5U3#m;*M2iR^AhSOtJ!Kv-g zN?+;y&`KZ%EXB(mNudmaV;ep=3|oWlFk=g!`!|?5Gu9v)oPQ0nB@v5e_lL@Y?ndfB zc;ShZmc$^3R7earYRK|kRnLqjQB~9w*o_-CW~*M+V{Xe20J~U&b~}{$B<#6?1OnjU zjRj~KCkk6^dE}5F6vI{?Z1iQ{%#8*M5O74IWj3+FsJxl&N1;qu@EY5|VPn`yM?xXn zHvkCke*?gv*y_#i4FH6n4DJ11CFWzxH7*c>4RJ9DcCp~}YJ72C{Kfrz2f{m>v3b}eN#Zvd?6HvpEs0d81qlm9y5hWe(ob;A;J z_+w?*x&OZ=@%?5JFen5B$2Mg}|DkX>ZrFch|G%4*|9c#OefbUn@Rxwe$y`fTfSFYI zW*sQ7w+i}h`pDRu#f}yug!}73w74Z>mH6O(l-T~SzgfCsvmOdzh=kb^bELp5?_g_! z8>qYi2IT|wGHOH0;ZxvEuHqz1?W)Ff83K6ml%;D`FNHFsreO-|Ruh1|+gCMAS$YT+ z!z|r|P*b+<-0)OOw{mQ{>6ACnT4~?Nw5xh&Y_VCzNDQoadIK*tKlwzb6xVf)uKW`Z z95?_z7=m5+n>gZt#)x74a6_p=#5VqwMPglb6IR%WO86%lv1lYz7ArG=5Z$c!jhAj> z5DFpUz*5-sz|Ia!{l^tIdGoLAKgsjY+Wl7sqx>gU|GD^IE&n)=?s5~b zQgCbp;N4Ve&MmH@fqU)}-@EWAu#a500Im)Yf%EE>At7$$UBa8EFn|#F4FH;VUcPEp(bV~`uaM?P(1^EV^gS+E>>o$2Q@b^Fwi$QFpM5vp|k`5>f7sf!5z)wcK*dr zmcRA52G{0v8c?&t?xcHqw~ntIi{LNnV~(R@HmXdnK88Lbxo*C=|JtWl&!1O4twW~{ zZG1}_NR9Iy9lpJyWC-*8(tQ4u-$89&{+ArjlwF6}1Nq0xxecsTz;>n|6OL0w5Xpz! z*ymwhONF=J#k{G`eV2i|;2zpT!SL)By+>j-9VSP`7q2lD$Z71r?Y_EUuB@wJg zH}W@;>Ak;Oda%w5B&G$~B6-V)*&>*hWsK6iy0-f?w3DFod9RxLm9ex}t&4j2-7?bO z3+93%pEp)km8Ts?v>Iv5ckuho1l)C=%e;^aAsxN4FzbR#2Nk|BA7ZmZx3r}v{4n3t z{T!iZJjR0iIstWZDMV`K>wudYXkIyyPyB-wcjFRPm~SqIEDpH++xr(aEg_Ny%<>Sh zCrMpsyKlMpNZ&?nzPnPQ=ryJ`TNt&k#u~(U_t&eJm!ceQ#({m_>+6kcP-e0mW430yu^LzadOQ!N)(GZ`R`?rc0R>6YGH4@_?0i>`aK zq&iHB0MX#IGbP57@jNty1%?cUKVTi>8G=>*jZJ;G?O(d-xzReFWBm&4b*^2yWJCoA zOsHTYiN)2)t6G7%hKsS1@e^^{WYQ%UZ-G8iRG(FGV9D~YN(Yu%uIIX>d46OAqPUVxGaR0T%yq76W!AL-nh?#aXS&O(*_5v;ujm!J5&b#k&-q zthEIe4a+fTMyIip`fTi!s8)2T-kICMQehf-OMvJP-XqrXc3u(tc1iBn)Nhi|h7~?( zq?0dz0Y;cRe?CC{m|@?aQqf_vlPXVhQ04nia)u4};)C5v;nq8$AYfM+lLFd}3U#%(_WR3@2k@Q3)*#zFS-1^~qb37gw zGhaLZbZZTip4+4A#+I8cyUJ*UnjWm~IMztT!!Z|XZ80Z4yQk^|GSe1v5A=5A2V6}f zLqf7w=<=r4XX!ML=$ptldly(a8*l~~U}QiCrOEXW5BJmgEYqfi{ol*ZStx}JImH>m zD%*RlV-|{m#^E2RTt2dsWR|-{p?EoM)zofz`2hqq6B5OzGs5DpeM&o9?VT0DO^0(D zIUeZPoFD*2M>)lW#`{g%8^2$&C{tXSTrgr3V&J8Fim5l_$<#}~qgkGqet)5A9fvP< zeVVU|wJ@0zIklKvx0O>lm*H{#jjuC>mkm0C|9Px`KbY~+`xu-7R!US1K}Y4C zSw+ggpftTSqAJ9HD0ugHMoWs%L!7~5fC*eqX<$6y{M`NUL_{PoI-^bFlG*=P^5Sz+ zQfjWW;fl<=$??mRpdM)xu`zh8o2>gdiK0(aox1SMILiUg?7MLHhf!0%FN2va%uY}7 z2IyohdPyqy)r`7hz8008Jt*aTrV^xhXD4kxc5yhguOWmC#o)i=_RtViX{FIk5cW67vxXT= zzV{`Mpu3~_vuk;3410vfAKD$R%7En3$nd(D(z|>#Zpzc(Ugpt|gSNElxc&34<46T1 z1xaf7mpC{~V&nlTeM_fJTJG_l;?;@hc`tn7j8gwp;j8QU4;w;AzWb}UuU;nUGh6Rw z`xcA^Wqsy%dpyH#@9tU9QtXf{{i@>$=U%%ssklgC9S=Alwqla^JRkt2C5|&d<6G>S zK>gmgkWHBTK2<*?cFoLmUa^T7W+aKpBkyGg}Ojk<4xHl-m|2_>57u z6u4*>*(w&E+!&|fcDEJ_n@qusc3Q=)tt}zZP+kQEN4$p+$d)+bZ^?l*Z|vs7jGc5u zY`NiHukLeH9OiRSsCn-U-5c|7x1?44$oOrwgl$x(J%;hS=&3{D7}gFm0hJlkw7BI` zr&;thy0L*=e>Vu}qmZ=o1hSruq>B>_cG)D1b)2|s7jBvk^V^){7!Wr3XnNf6 zlSisAm z6dPqgd*Pq3FewX#k*SI9Hv!LJzlv>M0pq$7zo}}OHO?vKN&P4j=BQzrC6bDGFs55H zeLKe-8uRjpPj`_XmEAj^p6W?RSh0$R!f+e!u8r-o;E+b#OJ?vwJ6R@@E^8;Nty@-A%SmE zv(XbTO%*Txvb+U-WKJGR>1ne?zU3?!sGtNvc?Vyu%9S(`ZHx~qntdrWk*m!E7d5Gz zS>cOAOa=Zv`PDl5;!m&bTSG!y_jgk}-ppl~i@CTN&df_6U(toX2hsy&3@}4{7N@CM zyZWmC%c88p7 zmFJNygB$fTzh6HeI&;n@xpPV=-fi4qS8^7|FfP;Mm#_0lOmxAbHaJBLQA*c0@+ypr zjzYzdvEsFnyhJ0p><-TJsPBs-3i{~KePs3O{pa1tW@qET2o*0;F29h$Utw}$!;2DU z@7d6%l`3%t{89DNX7BAspT?Qq`JB)ASeBnPl%sxXB>0Ws=TEG)Ns0re003@qua>E$ zmTGg%8O$(v!LtRtw#h?4cV1qo%b3>vw}Boe-#hT9_i z%+iR7IoMX!J27Y!>0QaA34LDILo;LW-d6``q#?3=K;EwQ{bZyxNb5N`u!ynxBSJ7F zV3|Pfb_&?sMs`L|N}=QH(N^q8+{QGaSQ5vP>kqdcR`ELCswZ)^@x;v=u74KZez17( zf_ z*&Zw6Yv98wD1Y9`gmvuM=6S5%4rhiywf#5kg*J&Sr{cOyE*#`t6!Z*GON`t9(U$6~ zMZ&tjzc3rhs`w1Ir=|tY1ms>n^xyScY+Xp^Uq>NZ1vT+VKK>}-+TbYDw~027`}KsY zaYs~_+?sc=EE~U;O4du40LZYkxDubwJX5}i;|}qiebm*yem>drQRR*0-_$ya6D0)o z5YsBfZz!S1_r730q-ci$A3T$LC{}c7X^E0@r^aiN$T}}nnwi*Y73-S*vLCG3bBYDL zpHsmn4_$sQW_T2T82L$jFiz`V#LwWDC%2#6JM-+pT(-tg7@Jl0u$8CAMp`%hdX#tB zw&M3RWWtp?LBC1dT_tgeKpE9?kgHxk}PAYMl=HtY*Bc-p)W zMdjoSwoASmn_BcZeD*k)xxLQrEe&LV#wO9!$-u$P`@;ya-=}9jYffvcPd~LHz#eSf z4o7#|DN&FdoW4Rn#j`z!J?k{IW!~ca@*)z|zIXYIExnVN{_Aj-UtVBXzx07z@u|Vn zBjIP!eW1pB9Tz=|ZRQE6*2h_TbXTfgc~27qL>Keh2-@%3jm;H&7pTqMOp8XK zKXfin245UKk{%^}u#YdHVk6nD^ETzgTDDK-7wx^4<{n#Xqx6FQy2R&Of1B<$qQIbG z%Z0ZNw~Zl{sag>7uB@J7;tsP*#k{THzh5V!qLJ?5Vl?;md@_QWvzQ5DClzZ zCg6^dijq^T-oN|w$p;OQ-f`Jqox^hem>^&Eqpger8FChL%vXBfJ0<{TdIy z`ZSZ@$eHpS`N%@!cq0|Y2-5lIJ~d6JS5BAmoJbIE-G=Na>GWxx6)eYVatp1%d=eW-EV^M+pDf#Dggddr zd#c<>DO({(L95ns@@EFE9V*V#nwreC*dAk+go}A9^$M?RuVp2EvNBfEiL-aoYs_r9 zpG+uUmOHcO8L5LSiu5A)wH3xHV z#wPn^qTb-Q3jnt(n?jN`%2T8MzG|UR?rEDKdBRGZt{YIB{mrlyNZlHol9-y+_n@*; zIa?aH3Xx1GKRa;Y;sahD)tDcY{R%b}q0e@b74oiCA>bM$w=`-A_!(%{ZTB@WOGIM) zJ4TyHg}!{+u0(TR8BlrOuLCuJ1?zC*-Gvv7+l7i&(u*o@?CZE>WSv>SycLu8BVn-Y)jy)Y1h& zad^x5Myej~GF+Xx6((!8e3?HMSM^yz{}57r_Kv=Pu>VQ{?Kb^JFYt1>=UEWaqg3Hu zk7eq!R3TEAXV>k%MJn3NYX-b7Yuo(D#5@0NJm7zQ`hPYa@UY}n^;mC|ad-x~Px$fX$4d&;JPkSZa7FGL!Y8YjJQM0(aBoe$qSV8XgN~EG>OV zAxr!D?Tymg+R1BF!e_QR2FV~8@1@|L-IM`A7c(WlUvZyV=&$3_)H;j6FFk4TO@Bk{ zm*y3_6_dsv+vS)LllbRParjzx;wDj1O_V~MqgT&N`z;*4ysrDin2ixw;8~C(VRmh% zT`(%Eh*+c}38X{P`pz$O6MQ?nVKfrEQ zhY0fs-7>ux{yw(P7%qq~&C-3fZ~-erG^SobBk14;j?C1(B;;ys!@C^R#P9E_Zm-ju(8%^sS@b#U4va$8;qA%P} zU;Lx>Yg*XssK1ZA2oW89TEFAKeU5t!IacJeY2y4U#mItOZ`v@ZOYMd!`j8K?LEwUc zL2&r-8W}(n=m<5q9P;?*+HGM;Q;vG6rT9jqp6ta9b-^A#V(O zuXnm@Ii65Rci8{2&Z&)4B>(Gqb9`42+w?uHYTMn_^XIbUVb$*wEw--PC-Omgfiy!z zU$^3l@nc1_F^i*0S$dWB$CZS)+ZkXJ{U7v78bv3QrS03qAK1y6SAWoteBwPSDrdAw zdm-R~B|C=Q=f<3E|<8d6e%#6i&-yFJuxf=pNR?tQLwH7VQ-Asl=u^ z$dZ?U#MQxdyWwPi>P2#u#p)#E@5MFkP%%aPEGuwOPEP5mWjUC=Ti~%Y`l+GHy$Ht^ zeq1`6`C*eRb%IsT%87#Sbm~c^zns3WlK|~>>Lfr%QQ>bzakJ0U?*oRG(DQ2MCSGHX zR<&7~peD*$f0LpPCF-Xnjb>$aKkgU#r&i8!eW>-!y`wT$iT(iL(-euxV;7V!^sCSM zo$ZL#XAH#0fIpvXyyK)}3y@13up=fW#%?F5-bs{YefP_R>6vuSesP2mc~_Gz<8lb| zN%YS$?r+;AY8Ihez;C(A?oGZl>bLd#Git94+wM1J1>5xYBnk{%3}%eVQJ;O7IQp}v zrb#lJ&==Ahxqpu*uB+GV+Ot|1Y_3V}<^o7ZD9N(C4`)#<_~VxIV$rwYNlsMxG3B_x zZqxf*0%X>2|EsO!{-Vhdwy}B7Y@s*ZAJ!vwnu1U1!;a6_mGE8oYZRO>yl562Gl%3J z_^RHO_>iAGni_B1+lf+tzMiX<7FL*jaoqpLQ+8+;oLb;K@sI{+q@ye+A-@IQ>=Rp_eknqyZk z&99o1f1t|xm8%>L-zRnYJdWBwc}v^Og{2IWfBU z68`(Acer{CRFZ9S9zGqCzt|V4R~450Me&#b9hmCg$W}Kejg}jCm#hzJ*Kr;+;6z&N z7j#5uR4V3$xbDq1u9tofsR|9Eza?HqX|rg8b8CQZJ8&b!mmSB^)#9|4EzbI$Et$%h zZh(8?Np=)LB7OK{V&T>)Nd1bwFqP2V_Eo~NrwB&Sgcd={oNr&K&I_Mwql5Hur-Bj6 zTbItkQi&Dkk)|3`+Q!?3vIC6@&#Iy~nS*R?RUK6wJp|~3jg!;GLDoobuhl|Y}4&Fi**6_Dr5{rJiF*@7=UDwMUDP^xv&}^>X^ryn>S~_WK%f4si}X^|7JL2Jerrb zJ|XdH3Dh~XsVeOgw)>s#bf$SC%c9Ibq%HsJw0rThh~Mi!z)`af2E}U);64)~XA&|1 z$pAJ(h;PSUd3!YkVXAeP9a3~W-78txrI#aXod;g=RQLHdE2y{bG@z$G-FiRN_2=k2 z={+5#aKtN&n@alW`)U&_$_F2DS9B5vpYR#Igks|o%#T#)pST{Dt{$o9@mL$Cxm@B5 zQK9}Rd?&o2#%Ydy@7;rp+|LVotnYn|7uCKv)CU#{R`%b%twfdmrpZwXMf@5xV3^o7 zK}liF0p7(8s$^pFV|=H?0T5xrQF}OyT2RuDbj`fWNM$75QvAx25 z$^KhC&9<2fVDZ4++Z2ZP1~`h0rV%O-0KqKFABI0tG^f}S;(1u*k~gyUYwfsu1bzE^ z@i!y1xWZm5Ao2d9X;IjEOZbz-ElSEqBIRa%g+ENd%mdLa z=|Av~%_iGBo41PBfJP?pP93hz-sS`OMd9u10}0RJT`n)9V0s}>?{5n>JbZzQ@$%&Y zlR^&ixu?>P*jHrjEUb_&G6^vZ(^l0@*4G6*GKbdJ_o*vq89TEc@+~!dOp<7103YBC z;VXF@R!gn!>|Q0x`Q-8p3)=1SGD(%sH^Qn5)!A(>zH`b?t}ghiO)Jb)jHir{lxAG4 zP+3n9<(W{R4&~ZrYIuG6vkzJcocfS(xem!+NG3;X94?ym%|2Sa(+gIJ@sZ%(EOh#f z@ay-JTCJvdoU&}b0#kI8EktPdc-01)M@t>Ec)(_m&tvu9$TwL(pu%p9Rxb7dPB!t3!;73;N?D60rj%@Tlv&%oK)e6so{9gDyvxWtf?q6hgsideXXT0w5 z^OaW^3H;tf#_19b_8b^QPKCcxPG6W6c~&*L;mIm0ui0Y)-PAeQE_*;_1|z6ozRO6*pB#OzJ-3=??(9jrjm$$jPoAH@^SGQ@@N*W|!iJ+Gy zPY3K>m;cB>_D~9Eq5ArpplV(8W_V4k)TPv*W-EdrUgTtrEg+%2fGftM2QTy6XC-RZ zSPkr|A1k2!W6ieJm!siclr@)G7 zDbLSM??)5nCL)=4#C4G9%*$rKcgf@z2Ztyi4c!d0!-m zJ^3Rp*|sLVwcX6@`iboz{ib8XC1GKjl>5iMZ3=cHfe|Pw#H(;~$sarqud$hb_f9X{ z`LE)G13QQbS!P6TTTK!3s!&(glzwpKSiRX_5jldwNYx*l%cUM7h8PFk=+f*a2^(R4 zb~q(&Auaee5s)z_H9o_`dtv=K8@@PkD6XrkyA+<>OJ&WdAq*CJ7;bq%ATSQtpQqE!AG&P(%T!z z)H1Z+I86ze`zX@n$h3yi+t~2+4QMJW3T31}`8kzSPovs^V9^k>N&T#Y?{aAU=mOCY zexwH*;LPz3YJT1pb5(vRw&tcU47}3QkGQj9*n5F#5G_AH9Xh%k*Cr4h?p5T475L>D y7Lzqtv(9F_S-gxXYOUQJ4IM~lM&9w49qwe75ByM>HLDZuDU`)Ks!Jg)3;Yjzo}Ezu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/boilerGroan1.ogg b/src/main/resources/assets/hbm/sounds/block/boilerGroan1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..694face2634d5f19d6b8e19c0adb916ec6255c80 GIT binary patch literal 23878 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/boilerGroan2.ogg b/src/main/resources/assets/hbm/sounds/block/boilerGroan2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2d09c62acbc0f3e756d3225ec296f20954611c78 GIT binary patch literal 15264 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 literal 292 zcmV+<0o(qGP)0{QqL)pyxJ zQk+7(w^nIwR7;FHKtF+%zFe-eJ2{nz{Oa=Sdw z{`x=1UNY@r+w=EB^TYG!?JZ1=4IX?v^!m8DWXjL|MiEvkj8>fbJUNd+W&`)c=S)eA zUwJYzG7ij6C}4D(k;cl(+Q!Z=XJBGtVqj!oV4$+w;1B<&OO4uJ^mZNUILlCBVps8j z!By#mcl$vP_cq5v7y2Ha?Um-?;R!!cs36P0P+?`I+!6c#2+#)%p00i_>zopr0Cmw~ Aa{vGU literal 2582 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 diff --git a/src/main/resources/assets/hbm/textures/items/void_anim.png.mcmeta b/src/main/resources/assets/hbm/textures/items/void_anim.png.mcmeta deleted file mode 100644 index dd1bedb12..000000000 --- a/src/main/resources/assets/hbm/textures/items/void_anim.png.mcmeta +++ /dev/null @@ -1,3 +0,0 @@ -{ - "animation": {} -} diff --git a/src/main/resources/assets/hbm/textures/models/machines/boiler.png b/src/main/resources/assets/hbm/textures/models/machines/boiler.png new file mode 100644 index 0000000000000000000000000000000000000000..47d190b9d2e6e86ef6585c0d3ea80e5b14f0c2be GIT binary patch literal 7154 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 literal 0 HcmV?d00001 From 3d765347dc6615ee3fb77c37c052a55108b092dd Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 9 Oct 2022 21:00:50 +0200 Subject: [PATCH 101/111] redid all the turbines with the new fluid traits, electric heater --- src/main/java/com/hbm/blocks/ModBlocks.java | 9 +- .../com/hbm/blocks/generic/BlockBobble.java | 4 +- .../hbm/blocks/machine/HeaterElectric.java | 55 + .../hbm/blocks/machine/MachineChungus.java | 11 +- .../hbm/blocks/machine/MachineHeatBoiler.java | 14 +- .../blocks/machine/MachineLargeTurbine.java | 11 +- .../hbm/blocks/machine/MachineTurbine.java | 8 +- .../hbm/blocks/network/BlockConveyorLift.java | 9 +- .../com/hbm/blocks/turret/TurretArty.java | 3 +- .../com/hbm/blocks/turret/TurretBrandon.java | 2 +- .../com/hbm/blocks/turret/TurretChekhov.java | 5 +- .../com/hbm/blocks/turret/TurretFriendly.java | 2 +- .../com/hbm/blocks/turret/TurretFritz.java | 2 +- .../com/hbm/blocks/turret/TurretHIMARS.java | 3 +- .../com/hbm/blocks/turret/TurretHoward.java | 2 +- .../com/hbm/blocks/turret/TurretJeremy.java | 2 +- .../com/hbm/blocks/turret/TurretMaxwell.java | 2 +- .../com/hbm/blocks/turret/TurretRichard.java | 2 +- .../java/com/hbm/inventory/fluid/Fluids.java | 10 +- .../inventory/fluid/trait/FT_Coolable.java | 6 +- .../hbm/inventory/recipes/MachineRecipes.java | 11 - .../inventory/recipes/anvil/AnvilRecipes.java | 7 + .../recipes/anvil/AnvilSmithingHotRecipe.java | 1 - .../recipes/anvil/AnvilSmithingRecipe.java | 1 - .../anvil/AnvilSmithingRenameRecipe.java | 1 - src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 2 + .../hbm/render/block/RenderConveyorLift.java | 3 +- .../hbm/render/tileentity/RenderBoiler.java | 1 + .../tileentity/RenderElectricHeater.java | 55 + .../java/com/hbm/tileentity/TileMappings.java | 1 + .../tileentity/machine/TileEntityChungus.java | 45 +- .../machine/TileEntityHeatBoiler.java | 18 + .../machine/TileEntityHeaterElectric.java | 34 + .../machine/TileEntityMachineBoiler.java | 3 +- .../TileEntityMachineLargeTurbine.java | 45 +- .../machine/TileEntityMachineTurbine.java | 40 +- src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 4 + .../hbm/models/machines/electric_heater.obj | 1140 +++++++++++++++++ .../models/machines/electric_heater.png | Bin 0 -> 2249 bytes 41 files changed, 1463 insertions(+), 116 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/HeaterElectric.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderElectricHeater.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java create mode 100644 src/main/resources/assets/hbm/models/machines/electric_heater.obj create mode 100644 src/main/resources/assets/hbm/textures/models/machines/electric_heater.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 96a928f25..af554d68b 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -645,6 +645,7 @@ public class ModBlocks { public static Block heater_firebox; public static Block heater_oilburner; + public static Block heater_electric; public static Block furnace_iron; public static Block furnace_steel; @@ -1840,6 +1841,7 @@ public class ModBlocks { heater_firebox = new HeaterFirebox().setBlockName("heater_firebox").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); heater_oilburner = new HeaterOilburner().setBlockName("heater_oilburner").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + heater_electric = new HeaterElectric().setBlockName("heater_electric").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); furnace_iron = new FurnaceIron().setBlockName("furnace_iron").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); furnace_steel = new FurnaceSteel().setBlockName("furnace_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3036,6 +3038,7 @@ public class ModBlocks { GameRegistry.registerBlock(machine_epress, machine_epress.getUnlocalizedName()); register(heater_firebox); register(heater_oilburner); + register(heater_electric); register(furnace_iron); register(furnace_steel); register(machine_stirling); @@ -3218,9 +3221,9 @@ public class ModBlocks { GameRegistry.registerBlock(machine_boiler_on, machine_boiler_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_boiler_electric_on, machine_boiler_electric_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_boiler_electric_off, machine_boiler_electric_off.getUnlocalizedName()); - GameRegistry.registerBlock(machine_turbine, machine_turbine.getUnlocalizedName()); - GameRegistry.registerBlock(machine_large_turbine, machine_large_turbine.getUnlocalizedName()); - GameRegistry.registerBlock(machine_chungus, machine_chungus.getUnlocalizedName()); + register(machine_turbine); + register(machine_large_turbine); + register(machine_chungus); GameRegistry.registerBlock(machine_condenser, machine_condenser.getUnlocalizedName()); GameRegistry.registerBlock(machine_tower_small, machine_tower_small.getUnlocalizedName()); GameRegistry.registerBlock(machine_tower_large, machine_tower_large.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockBobble.java b/src/main/java/com/hbm/blocks/generic/BlockBobble.java index c154fc950..72f9a7bf2 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockBobble.java +++ b/src/main/java/com/hbm/blocks/generic/BlockBobble.java @@ -181,14 +181,14 @@ public class BlockBobble extends BlockContainer { PU238( "Pu-238", "Pu-238", "Improved Tom impact mechanics", null, false, ScrapType.CPU_REGISTER), VT( "VT-6/24", "VT-6/24", "Balefire warhead model and general texturework", "You cannot unfuck a horse.", true, ScrapType.CPU_EXT), DOC( "The Doctor", "Doctor17PH", "Russian localization, lunar miner", "Perhaps the moon rocks were too expensive", true, ScrapType.CPU_CACHE), - BLUEHAT( "The Blue Hat", "The Blue Hat", "Textures", "there's a listening device in this bobblehead$don't touch it thanks", true, ScrapType.MEM_16K_A), + BLUEHAT( "The Blue Hat", "The Blue Hat", "Textures", "payday 2's deagle freeaim champ of the year 2022", true, ScrapType.MEM_16K_A), PHEO( "Pheo", "Pheonix", "Deuterium machines, tantalium textures, Reliant Rocket", "RUN TO THE BEDROOM, ON THE SUITCASE ON THE LEFT,$YOU'LL FIND MY FAVORITE AXE", true, ScrapType.MEM_16K_B), ADAM29( "Adam29", "Adam29", "Ethanol, liquid petroleum gas", "You know, nukes are really quite beatiful.$It's like watching a star be born for a split second.", true, ScrapType.MEM_16K_C), UFFR( "UFFR", "UFFR", "All sorts of things from his PR", "fried shrimp", false, ScrapType.MEM_SOCKET), VAER( "vaer", "vaer", "ZIRNOX", "taken de family out to the weekend cigarette festival", true, ScrapType.MEM_16K_D), NOS( "Dr Nostalgia", "Dr Nostalgia", "SSG and Vortex models", "Take a picture, I'ma pose, paparazzi$I've been drinking, moving like a zombie", true, ScrapType.BOARD_TRANSISTOR), DRILLGON( "Drillgon200", "Drillgon200", "1.12 Port", null, false, ScrapType.CPU_LOGIC), - CIRNO( "Cirno", "Cirno", "being a dumb ice fairy", "No brain. Head empty.", true, ScrapType.BOARD_BLANK); + CIRNO( "Cirno", "Cirno", "the only multi layered skin i had", "No brain. Head empty.", true, ScrapType.BOARD_BLANK); public String name; //the title of the tooltip public String label; //the name engraved in the socket diff --git a/src/main/java/com/hbm/blocks/machine/HeaterElectric.java b/src/main/java/com/hbm/blocks/machine/HeaterElectric.java new file mode 100644 index 000000000..40afaef4f --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/HeaterElectric.java @@ -0,0 +1,55 @@ +package com.hbm.blocks.machine; + +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityHeaterElectric; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class HeaterElectric extends BlockDummyable implements ITooltipProvider { + + public HeaterElectric() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) + return new TileEntityHeaterElectric(); + + if(hasExtra(meta)) + return new TileEntityProxyCombo().power(); + + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {0, 0, 1, 2, 1, 1}; + } + + @Override + public int getOffset() { + return 2; + } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + this.makeExtra(world, x, y, z); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineChungus.java b/src/main/java/com/hbm/blocks/machine/MachineChungus.java index 7277ca8a2..957169a40 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineChungus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineChungus.java @@ -1,6 +1,9 @@ package com.hbm.blocks.machine; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; @@ -9,11 +12,12 @@ import com.hbm.tileentity.machine.TileEntityChungus; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineChungus extends BlockDummyable { +public class MachineChungus extends BlockDummyable implements ITooltipProvider { public MachineChungus(Material mat) { super(mat); @@ -126,4 +130,9 @@ public class MachineChungus extends BlockDummyable { return true; } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java b/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java index 91963722a..c4d6bdc67 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java +++ b/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.trait.FT_Heatable; @@ -28,7 +29,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay { +public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay, IBlockMulti { public MachineHeatBoiler() { super(Material.iron); @@ -168,10 +169,15 @@ public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay { if(boiler.hasExploded) return; List text = new ArrayList(); - text.add(boiler.heat + "TU"); - text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + I18nUtil.resolveKey(boiler.tanks[0].getTankType().getUnlocalizedName()) + ": " + boiler.tanks[0].getFill() + " / " + boiler.tanks[0].getMaxFill() + "mB"); - text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + I18nUtil.resolveKey(boiler.tanks[1].getTankType().getUnlocalizedName()) + ": " + boiler.tanks[1].getFill() + " / " + boiler.tanks[1].getMaxFill() + "mB"); + text.add(String.format("%,d", boiler.heat) + "TU"); + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + I18nUtil.resolveKey(boiler.tanks[0].getTankType().getUnlocalizedName()) + ": " + String.format("%,d", boiler.tanks[0].getFill()) + " / " + String.format("%,d", boiler.tanks[0].getMaxFill()) + "mB"); + text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + I18nUtil.resolveKey(boiler.tanks[1].getTankType().getUnlocalizedName()) + ": " + String.format("%,d", boiler.tanks[1].getFill()) + " / " + String.format("%,d", boiler.tanks[1].getMaxFill()) + "mB"); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } + + @Override + public int getSubCount() { + return 0; + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java b/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java index 1e38531fb..dfa8d83d6 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java @@ -1,6 +1,9 @@ package com.hbm.blocks.machine; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; @@ -12,12 +15,11 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineLargeTurbine extends BlockDummyable { +public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvider { public MachineLargeTurbine(Material mat) { super(mat); @@ -98,4 +100,9 @@ public class MachineLargeTurbine extends BlockDummyable { this.makeExtra(world, xc + dir2.offsetX, y, zc + dir2.offsetZ); this.makeExtra(world, xc - dir2.offsetX, y, zc - dir2.offsetZ); } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineTurbine.java b/src/main/java/com/hbm/blocks/machine/MachineTurbine.java index 6a1c25eae..a28b911f9 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTurbine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTurbine.java @@ -1,7 +1,9 @@ package com.hbm.blocks.machine; +import java.util.List; import java.util.Random; +import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -23,7 +25,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class MachineTurbine extends BlockContainer { +public class MachineTurbine extends BlockContainer implements ITooltipProvider { private final Random field_149933_a = new Random(); @SideOnly(Side.CLIENT) @@ -123,4 +125,8 @@ public class MachineTurbine extends BlockContainer { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java b/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java index 574e28634..a2dfa5de1 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java @@ -1,6 +1,7 @@ package com.hbm.blocks.network; import api.hbm.conveyor.IConveyorBelt; +import api.hbm.conveyor.IEnterableBlock; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -16,7 +17,7 @@ public class BlockConveyorLift extends BlockConveyorBase { public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); - boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; + boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); if(!top) { return ForgeDirection.DOWN; @@ -29,7 +30,7 @@ public class BlockConveyorLift extends BlockConveyorBase { public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); - boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; + boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); if(!top) { return Vec3.createVectorHelper(x + 0.5, itemPos.yCoord, z + 0.5); @@ -42,7 +43,7 @@ public class BlockConveyorLift extends BlockConveyorBase { public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); - boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; + boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); if(top) this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); @@ -54,7 +55,7 @@ public class BlockConveyorLift extends BlockConveyorBase { public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); - boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; + boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); if(top) return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.5, z + 1); diff --git a/src/main/java/com/hbm/blocks/turret/TurretArty.java b/src/main/java/com/hbm/blocks/turret/TurretArty.java index b23775fa1..cf4fef31e 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretArty.java +++ b/src/main/java/com/hbm/blocks/turret/TurretArty.java @@ -20,8 +20,7 @@ public class TurretArty extends BlockDummyable { if(meta >= 12) return new TileEntityTurretArty(); - - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretBrandon.java b/src/main/java/com/hbm/blocks/turret/TurretBrandon.java index ace62a7bb..173bd2a83 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretBrandon.java +++ b/src/main/java/com/hbm/blocks/turret/TurretBrandon.java @@ -22,7 +22,7 @@ public class TurretBrandon extends TurretBaseNT { if(meta >= 12) return new TileEntityTurretBrandon(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretChekhov.java b/src/main/java/com/hbm/blocks/turret/TurretChekhov.java index 3ccb43269..5bc73f004 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretChekhov.java +++ b/src/main/java/com/hbm/blocks/turret/TurretChekhov.java @@ -26,10 +26,7 @@ public class TurretChekhov extends BlockDummyable { if(meta >= 12) return new TileEntityTurretChekhov(); - if(meta >= 6) - return new TileEntityProxyCombo(true, true, false); - - return null; + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretFriendly.java b/src/main/java/com/hbm/blocks/turret/TurretFriendly.java index 6a50de4fe..2918d4826 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretFriendly.java +++ b/src/main/java/com/hbm/blocks/turret/TurretFriendly.java @@ -25,7 +25,7 @@ public class TurretFriendly extends BlockDummyable { if(meta >= 12) return new TileEntityTurretFriendly(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretFritz.java b/src/main/java/com/hbm/blocks/turret/TurretFritz.java index 1a35c02eb..e3686656a 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretFritz.java +++ b/src/main/java/com/hbm/blocks/turret/TurretFritz.java @@ -22,7 +22,7 @@ public class TurretFritz extends TurretBaseNT { if(meta >= 12) return new TileEntityTurretFritz(); - return new TileEntityProxyCombo(true, true, true); + return new TileEntityProxyCombo().inventory().power().fluid(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretHIMARS.java b/src/main/java/com/hbm/blocks/turret/TurretHIMARS.java index f75837099..18ea44e7a 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretHIMARS.java +++ b/src/main/java/com/hbm/blocks/turret/TurretHIMARS.java @@ -20,8 +20,7 @@ public class TurretHIMARS extends BlockDummyable { if(meta >= 12) return new TileEntityTurretHIMARS(); - - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretHoward.java b/src/main/java/com/hbm/blocks/turret/TurretHoward.java index 685fcd339..fd26fb693 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretHoward.java +++ b/src/main/java/com/hbm/blocks/turret/TurretHoward.java @@ -25,7 +25,7 @@ public class TurretHoward extends BlockDummyable { if(meta >= 12) return new TileEntityTurretHoward(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretJeremy.java b/src/main/java/com/hbm/blocks/turret/TurretJeremy.java index 94a5f5a69..167164d16 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretJeremy.java +++ b/src/main/java/com/hbm/blocks/turret/TurretJeremy.java @@ -25,7 +25,7 @@ public class TurretJeremy extends BlockDummyable { if(meta >= 12) return new TileEntityTurretJeremy(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretMaxwell.java b/src/main/java/com/hbm/blocks/turret/TurretMaxwell.java index 33937ce33..26b36167d 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretMaxwell.java +++ b/src/main/java/com/hbm/blocks/turret/TurretMaxwell.java @@ -22,7 +22,7 @@ public class TurretMaxwell extends TurretBaseNT { if(meta >= 12) return new TileEntityTurretMaxwell(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretRichard.java b/src/main/java/com/hbm/blocks/turret/TurretRichard.java index b3cbd0715..5526d06b2 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretRichard.java +++ b/src/main/java/com/hbm/blocks/turret/TurretRichard.java @@ -25,7 +25,7 @@ public class TurretRichard extends BlockDummyable { if(meta >= 12) return new TileEntityTurretRichard(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 1f2ae0fd5..00991409b 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -8,6 +8,7 @@ import com.hbm.inventory.fluid.FluidType.ExtContainer; import com.hbm.inventory.fluid.trait.*; import com.hbm.inventory.fluid.trait.FluidTraitSimple.*; import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.render.util.EnumSymbol; @@ -300,7 +301,7 @@ public class Fluids { metaOrder.add(PLASMA_DH3); metaOrder.add(PLASMA_XM); metaOrder.add(PLASMA_BF); - + double eff_steam_boil = 1.0D; double eff_steam_heatex = 0.25D; @@ -314,6 +315,13 @@ public class Fluids { HOTSTEAM.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex).addStep(18, 10, SUPERHOTSTEAM, 1)); SUPERHOTSTEAM.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex).addStep(120, 10, ULTRAHOTSTEAM, 1)); + double eff_steam_turbine = 1.0D; + double eff_steam_cool = 0.5D; + STEAM.addTraits(new FT_Coolable(SPENTSTEAM, 100, 1, 200).setEff(CoolingType.TURBINE, eff_steam_turbine).setEff(CoolingType.HEATEXCHANGER, eff_steam_cool)); + HOTSTEAM.addTraits(new FT_Coolable(STEAM, 1, 10, 2).setEff(CoolingType.TURBINE, eff_steam_turbine).setEff(CoolingType.HEATEXCHANGER, eff_steam_cool)); + SUPERHOTSTEAM.addTraits(new FT_Coolable(HOTSTEAM, 1, 10, 18).setEff(CoolingType.TURBINE, eff_steam_turbine).setEff(CoolingType.HEATEXCHANGER, eff_steam_cool)); + ULTRAHOTSTEAM.addTraits(new FT_Coolable(SUPERHOTSTEAM, 1, 10, 120).setEff(CoolingType.TURBINE, eff_steam_turbine).setEff(CoolingType.HEATEXCHANGER, eff_steam_cool)); + OIL.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(10, 1, HOTOIL, 1)); CRACKOIL.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(10, 1, HOTCRACKOIL, 1)); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java index a936a44d5..25bd1488d 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java @@ -12,10 +12,14 @@ public class FT_Coolable extends FluidTrait { protected HashMap efficiency = new HashMap(); public final FluidType coolsTo; + public int amountReq; + public int amountProduced; public final int heatEnergy; - public FT_Coolable(FluidType type, int heat) { + public FT_Coolable(FluidType type, int req, int prod, int heat) { this.coolsTo = type; + this.amountReq = req; + this.amountProduced = prod; this.heatEnergy = heat; } diff --git a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java index 6cfbc51ae..e770043aa 100644 --- a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java @@ -36,17 +36,6 @@ public class MachineRecipes { return null; } - - //return: FluidType, amount produced, amount required, HE produced - public static Object[] getTurbineOutput(FluidType type) { - - if(type == Fluids.STEAM) return new Object[] { Fluids.SPENTSTEAM, 5, 500, 50 }; - if(type == Fluids.HOTSTEAM) return new Object[] { Fluids.STEAM, 50, 5, 100 }; - if(type == Fluids.SUPERHOTSTEAM) return new Object[] { Fluids.HOTSTEAM, 50, 5, 150 }; - if(type == Fluids.ULTRAHOTSTEAM) return new Object[] { Fluids.SUPERHOTSTEAM, 50, 5, 250 }; - - return null; - } public static ItemStack getCyclotronOutput(ItemStack part, ItemStack item) { diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 84c875858..abc5b698a 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -285,6 +285,13 @@ public class AnvilRecipes { new OreDictStack(STEEL.plate(), 8) }, new AnvilOutput(new ItemStack(ModBlocks.machine_crucible))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(STEEL.ingot(), 4), + new OreDictStack(CU.plate(), 16), + new ComparableStack(ModItems.plate_polymer, 8) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_boiler))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 6), diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingHotRecipe.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingHotRecipe.java index 31642ef4f..c3cb7f520 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingHotRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingHotRecipe.java @@ -3,7 +3,6 @@ package com.hbm.inventory.recipes.anvil; import java.util.Arrays; import java.util.List; -import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.items.special.ItemHot; diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRecipe.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRecipe.java index 9677efdc9..566434ce6 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRecipe.java @@ -3,7 +3,6 @@ package com.hbm.inventory.recipes.anvil; import java.util.List; import com.hbm.config.GeneralConfig; -import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.AStack; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRenameRecipe.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRenameRecipe.java index 3bb25ab6c..2817e8d0b 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRenameRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRenameRecipe.java @@ -1,6 +1,5 @@ package com.hbm.inventory.recipes.anvil; -import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.ComparableStack; import net.minecraft.init.Items; diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 5b28543ec..9c5228c6c 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -262,6 +262,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceSteel.class, new RenderFurnaceSteel()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterFirebox.class, new RenderFirebox()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterOilburner.class, new RenderOilburner()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterElectric.class, new RenderElectricHeater()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityStirling.class, new RenderStirling()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySawmill.class, new RenderSawmill()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrucible.class, new RenderCrucible()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index c2b066ff3..1e7e355f6 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -60,6 +60,7 @@ public class ResourceManager { //Heaters public static final IModelCustom heater_firebox = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/firebox.obj")); public static final IModelCustom heater_oilburner = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/oilburner.obj")); + public static final IModelCustom heater_electric = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/electric_heater.obj"), false); //Heat Engines public static final IModelCustom stirling = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/stirling.obj")); @@ -383,6 +384,7 @@ public class ResourceManager { //Heaters public static final ResourceLocation heater_firebox_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/firebox.png"); public static final ResourceLocation heater_oilburner_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/oilburner.png"); + public static final ResourceLocation heater_electric_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/electric_heater.png"); //Heat Engines public static final ResourceLocation stirling_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling.png"); diff --git a/src/main/java/com/hbm/render/block/RenderConveyorLift.java b/src/main/java/com/hbm/render/block/RenderConveyorLift.java index badb6ee35..bc604fad2 100644 --- a/src/main/java/com/hbm/render/block/RenderConveyorLift.java +++ b/src/main/java/com/hbm/render/block/RenderConveyorLift.java @@ -4,6 +4,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.network.BlockConveyorLift; import api.hbm.conveyor.IConveyorBelt; +import api.hbm.conveyor.IEnterableBlock; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; @@ -74,7 +75,7 @@ public class RenderConveyorLift implements ISimpleBlockRenderingHandler { if(y < 255) { Block above = world.getBlock(x, y + 1, z); - isTop = !(above instanceof IConveyorBelt) && !isBottom; + isTop = !(above instanceof IConveyorBelt) && !isBottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); } double minOuter = 0.0; diff --git a/src/main/java/com/hbm/render/tileentity/RenderBoiler.java b/src/main/java/com/hbm/render/tileentity/RenderBoiler.java index 65bbbed75..7c9c0899c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderBoiler.java +++ b/src/main/java/com/hbm/render/tileentity/RenderBoiler.java @@ -58,6 +58,7 @@ public class RenderBoiler extends TileEntitySpecialRenderer implements IItemRend GL11.glScaled(3, 3, 3); } public void renderCommonWithStack(ItemStack item) { + GL11.glRotatef(90, 0F, 1F, 0F); GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.boiler_tex); if(item.getItemDamage() == 1) diff --git a/src/main/java/com/hbm/render/tileentity/RenderElectricHeater.java b/src/main/java/com/hbm/render/tileentity/RenderElectricHeater.java new file mode 100644 index 000000000..9ae8998cf --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderElectricHeater.java @@ -0,0 +1,55 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderElectricHeater extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + } + + bindTexture(ResourceManager.heater_electric_tex); + ResourceManager.heater_electric.renderAll(); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.heater_electric); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glScaled(3, 3, 3); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glTranslated(-0.5, 0, 0); + bindTexture(ResourceManager.heater_electric_tex); + ResourceManager.heater_electric.renderAll(); + }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 3f5dc6b93..26d78aa94 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -246,6 +246,7 @@ public class TileMappings { private static void putMachines() { put(TileEntityHeaterFirebox.class, "tileentity_firebox"); put(TileEntityHeaterOilburner.class, "tileentity_oilburner"); + put(TileEntityHeaterElectric.class, "tileentity_electric_heater"); put(TileEntityFurnaceIron.class, "tileentity_furnace_iron"); put(TileEntityFurnaceSteel.class, "tileentity_furnace_steel"); put(TileEntityStirling.class, "tileentity_stirling"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index 44d3f3441..80a35fdeb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -10,7 +10,8 @@ import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.inventory.recipes.MachineRecipes; +import com.hbm.inventory.fluid.trait.FT_Coolable; +import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.lib.Library; import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; @@ -53,33 +54,35 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc if(!worldObj.isRemote) { - Object[] outs = MachineRecipes.getTurbineOutput(tanks[0].getTankType()); - - //some funky crashfixing for unlikely cases - if(outs == null) { - tanks[0].setTankType(Fluids.STEAM); - tanks[1].setTankType(Fluids.SPENTSTEAM); - outs = MachineRecipes.getTurbineOutput(tanks[0].getTankType()); + boolean operational = false; + FluidType in = tanks[0].getTankType(); + boolean valid = false; + if(in.hasTrait(FT_Coolable.class)) { + FT_Coolable trait = in.getTrait(FT_Coolable.class); + double eff = trait.getEfficiency(CoolingType.TURBINE); //100% efficiency + if(eff > 0) { + tanks[1].setTankType(trait.coolsTo); + int inputOps = tanks[0].getFill() / trait.amountReq; + int outputOps = (tanks[1].getMaxFill() - tanks[1].getFill()) / trait.amountProduced; + int ops = Math.min(inputOps, outputOps); + tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); + tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); + this.power += (ops * trait.heatEnergy * eff); + valid = true; + operational = ops > 0; + } } - tanks[1].setTankType((FluidType) outs[0]); + //if(this.tanks[1].getFill() > 0) System.out.println(this.tanks[1].getTankType().name()); - int processMax = (int) Math.ceil(tanks[0].getFill() / (Integer)outs[2]); //the maximum amount of cycles total - int processSteam = tanks[0].getFill() / (Integer)outs[2]; //the maximum amount of cycles depending on steam - int processWater = (tanks[1].getMaxFill() - tanks[1].getFill()) / (Integer)outs[1]; //the maximum amount of cycles depending on water - - int cycles = Math.min(processMax, Math.min(processSteam, processWater)); - - tanks[0].setFill(tanks[0].getFill() - (Integer)outs[2] * cycles); - tanks[1].setFill(tanks[1].getFill() + (Integer)outs[1] * cycles); - - power += (Integer)outs[3] * cycles; + if(!valid) tanks[1].setTankType(Fluids.NONE); + if(power > maxPower) power = maxPower; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); this.sendPower(worldObj, xCoord - dir.offsetX * 11, yCoord, zCoord - dir.offsetZ * 11, dir); for(BlockPos pos : this.getConPos()) { - this.sendFluid(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), dir); //TODO: there's no directions for this yet because idc + this.sendFluid(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), dir); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), dir); } @@ -88,7 +91,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc turnTimer--; - if(cycles > 0) + if(operational) turnTimer = 25; this.fillFluidInit(tanks[1].getTankType()); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java index 7d2ca6e8b..dacc1993f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -182,6 +182,24 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IFluid new DirPos(xCoord, yCoord + 4, zCoord, Library.POS_Y), }; } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + tanks[0].readFromNBT(nbt, "water"); + tanks[1].readFromNBT(nbt, "steam"); + heat = nbt.getInteger("heat"); + hasExploded = nbt.getBoolean("exploded"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + tanks[0].writeToNBT(nbt, "water"); + tanks[1].writeToNBT(nbt, "steam"); + nbt.setInteger("heat", heat); + nbt.setBoolean("exploded", hasExploded); + } @Override public void setFluidFill(int fill, FluidType type) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java new file mode 100644 index 000000000..6092d5a11 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java @@ -0,0 +1,34 @@ +package com.hbm.tileentity.machine; + +import com.hbm.tileentity.TileEntityLoadedBase; + +import api.hbm.energy.IEnergyUser; +import api.hbm.tile.IHeatSource; + +public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyUser { + + @Override + public long getPower() { + return 0; + } + + @Override + public long getMaxPower() { + return 0; + } + + @Override + public void setPower(long power) { + + } + + @Override + public int getHeatStored() { + return 0; + } + + @Override + public void useUpHeat(int heat) { + + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java index 9f47277bd..54f3691a0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java @@ -207,8 +207,7 @@ public class TileEntityMachineBoiler extends TileEntity implements ISidedInvento boolean mark = false; - if(!worldObj.isRemote) - { + if(!worldObj.isRemote) { this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1].getTankType(), this); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java index 8bf45b2f1..6e27ca1bf 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java @@ -10,7 +10,8 @@ import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.inventory.recipes.MachineRecipes; +import com.hbm.inventory.fluid.trait.FT_Coolable; +import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; @@ -70,30 +71,26 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme boolean operational = false; - Object[] outs = MachineRecipes.getTurbineOutput(tanks[0].getTankType()); - - if(outs == null) { - tanks[1].setTankType(Fluids.NONE); - } else { - tanks[1].setTankType((FluidType) outs[0]); - - int processMax = (int) Math.ceil(Math.ceil(tanks[0].getFill() / 5F) / (Integer)outs[2]); //the maximum amount of cycles based on the 20% cap - int processSteam = tanks[0].getFill() / (Integer)outs[2]; //the maximum amount of cycles depending on steam - int processWater = (tanks[1].getMaxFill() - tanks[1].getFill()) / (Integer)outs[1]; //the maximum amount of cycles depending on water - - int cycles = Math.min(processMax, Math.min(processSteam, processWater)); - - tanks[0].setFill(tanks[0].getFill() - (Integer)outs[2] * cycles); - tanks[1].setFill(tanks[1].getFill() + (Integer)outs[1] * cycles); - - power += ((Integer)outs[3] * cycles) * 1.25; //yields a 25% power conversion bonus - - if(power > maxPower) - power = maxPower; - - if(cycles > 0) - operational = true; + FluidType in = tanks[0].getTankType(); + boolean valid = false; + if(in.hasTrait(FT_Coolable.class)) { + FT_Coolable trait = in.getTrait(FT_Coolable.class); + double eff = trait.getEfficiency(CoolingType.TURBINE); //100% efficiency + if(eff > 0) { + tanks[1].setTankType(trait.coolsTo); + int inputOps = tanks[0].getFill() / trait.amountReq; + int outputOps = (tanks[1].getMaxFill() - tanks[1].getFill()) / trait.amountProduced; + int cap = 6_000 / trait.amountReq; + int ops = Math.min(inputOps, Math.min(outputOps, cap)); + tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); + tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); + this.power += (ops * trait.heatEnergy * eff); + valid = true; + operational = ops > 0; + } } + if(!valid) tanks[1].setTankType(Fluids.NONE); + if(power > maxPower) power = maxPower; tanks[1].unloadTank(5, 6, slots); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index 64a8fe472..b2a065e2a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -9,6 +9,8 @@ import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Coolable; +import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; @@ -232,27 +234,25 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS tanks[0].loadTank(2, 3, slots); power = Library.chargeItemsFromTE(slots, 4, power, maxPower); - Object[] outs = MachineRecipes.getTurbineOutput(tanks[0].getTankType()); - - if(outs == null) { - tanks[1].setTankType(Fluids.NONE); - } else { - tanks[1].setTankType((FluidType) outs[0]); - - int processMax = 1200; //the maximum amount of cycles based on the 1.2k cycle cap (subject to change) - int processSteam = tanks[0].getFill() / (Integer)outs[2]; //the maximum amount of cycles depending on steam - int processWater = (tanks[1].getMaxFill() - tanks[1].getFill()) / (Integer)outs[1]; //the maximum amount of cycles depending on water - - int cycles = Math.min(processMax, Math.min(processSteam, processWater)); - - tanks[0].setFill(tanks[0].getFill() - (Integer)outs[2] * cycles); - tanks[1].setFill(tanks[1].getFill() + (Integer)outs[1] * cycles); - - power += (Integer)outs[3] * cycles; - - if(power > maxPower) - power = maxPower; + FluidType in = tanks[0].getTankType(); + boolean valid = false; + if(in.hasTrait(FT_Coolable.class)) { + FT_Coolable trait = in.getTrait(FT_Coolable.class); + double eff = trait.getEfficiency(CoolingType.TURBINE) * 0.85D; //small turbine is only 85% efficient + if(eff > 0) { + tanks[1].setTankType(trait.coolsTo); + int inputOps = tanks[0].getFill() / trait.amountReq; + int outputOps = (tanks[1].getMaxFill() - tanks[1].getFill()) / trait.amountProduced; + int cap = 6_000 / trait.amountReq; + int ops = Math.min(inputOps, Math.min(outputOps, cap)); + tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); + tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); + this.power += (ops * trait.heatEnergy * eff); + valid = true; + } } + if(!valid) tanks[1].setTankType(Fluids.NONE); + if(power > maxPower) power = maxPower; this.sendFluidToAll(tanks[1].getTankType(), this); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 255ebd870..a8088b0ba 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3466,6 +3466,7 @@ tile.machine_autocrafter.name=Automatische Werkbank tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energiespeicherblock tile.machine_battery_potato.name=Kartoffelbatterieblock +tile.machine_boiler.name=Boiler tile.machine_boiler_electric_off.name=Elektrischer Boiler tile.machine_boiler_electric_on.name=Elektrischer Boiler tile.machine_boiler_off.name=Dampfkessel @@ -3475,6 +3476,7 @@ tile.machine_centrifuge.name=Zentrifuge tile.machine_chemfac.name=Chemiefabrik tile.machine_chemplant.name=Chemiewerk tile.machine_chungus.name=Leviathan-Dampfturbine +tile.machine_chungus.desc=Effizienz: 85%% tile.machine_coal_off.name=Verbrennungsgenerator tile.machine_coal_on.name=Verbrennungsgenerator tile.machine_combine_factory.name=CMB-Stahl Hochofen @@ -3511,6 +3513,7 @@ tile.machine_geo.name=Gepthermiegenerator tile.machine_industrial_generator.name=Industrieller Generator tile.machine_keyforge.name=Schlossertisch tile.machine_large_turbine.name=Industrielle Dampfturbine +tile.machine_large_turbine.desc=Effizienz: 100%% tile.machine_lithium_battery.name=Li-Ion-Energiespeicherblock tile.machine_microwave.name=Mikrowelle tile.machine_mining_laser.name=Bergbaulaser @@ -3566,6 +3569,7 @@ tile.machine_transformer_20.name=10k-1Hz-Transformator tile.machine_transformer_dnt.name=DNT-20Hz-Transformator tile.machine_transformer_dnt_20.name=DNT-1Hz-Transformator tile.machine_turbine.name=Dampfturbine +tile.machine_turbine.desc=Effizienz: 85%% tile.machine_turbofan.name=Turbofan tile.machine_uf6_tank.name=Uranhexafluorid-Tank tile.machine_waste_drum.name=Abklingbecken-Trommel diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 57ab1c9c6..9e11ff5f8 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3904,6 +3904,7 @@ tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energy Storage Block tile.machine_battery_potato.name=Potato Battery Block +tile.machine_boiler.name=Boiler tile.machine_boiler_electric_off.name=Electric Boiler tile.machine_boiler_electric_on.name=Electric Boiler tile.machine_boiler_off.name=Boiler @@ -3913,6 +3914,7 @@ tile.machine_centrifuge.name=Centrifuge tile.machine_chemfac.name=Chemical Factory tile.machine_chemplant.name=Chemical Plant tile.machine_chungus.name=Leviathan Steam Turbine +tile.machine_chungus.desc=Efficiency: 85%% tile.machine_coal_off.name=Combustion Generator tile.machine_coal_on.name=Combustion Generator tile.machine_combine_factory.name=CMB Steel Furnace @@ -3949,6 +3951,7 @@ tile.machine_geo.name=Geothermal Electric Generator tile.machine_industrial_generator.name=Industrial Generator tile.machine_keyforge.name=Locksmith Table tile.machine_large_turbine.name=Industrial Steam Turbine +tile.machine_large_turbine.desc=Efficiency: 100%% tile.machine_liquefactor.name=Industrial Liquefaction Machine tile.machine_liquefactor.desc=Powerful universal machine to turn items into fluids.$Comes with versatile catalytic components, heating elements$and a built-in hydrator for petrochemical liquefaction. tile.machine_lithium_battery.name=Li-Ion Energy Storage Block @@ -4007,6 +4010,7 @@ tile.machine_transformer_20.name=10k-1Hz Transformer tile.machine_transformer_dnt.name=DNT-20Hz Transformer tile.machine_transformer_dnt_20.name=DNT-1Hz Transformer tile.machine_turbine.name=Steam Turbine +tile.machine_turbine.desc=Efficiency: 85%% tile.machine_turbofan.name=Turbofan tile.machine_uf6_tank.name=Uranium Hexafluoride Tank tile.machine_waste_drum.name=Spent Fuel Pool Drum diff --git a/src/main/resources/assets/hbm/models/machines/electric_heater.obj b/src/main/resources/assets/hbm/models/machines/electric_heater.obj new file mode 100644 index 000000000..df504a052 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/electric_heater.obj @@ -0,0 +1,1140 @@ +# Blender v2.79 (sub 0) OBJ File: 'electric_heater.blend' +# www.blender.org +o Plane +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.500000 1.000000 -1.500000 +v -1.500000 1.000000 1.500000 +v 1.500000 1.000000 1.500000 +v 1.500000 1.000000 -1.500000 +v -0.500000 1.000000 0.500000 +v 0.500000 1.000000 0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v -0.500000 0.937500 -0.500000 +v -0.500000 0.937500 0.500000 +v 0.500000 0.937500 0.500000 +v 0.500000 0.937500 -0.500000 +v -0.437500 0.937500 -0.437500 +v -0.437500 0.937500 0.437500 +v 0.437500 0.937500 0.437500 +v 0.437500 0.937500 -0.437500 +v -0.437500 1.000000 -0.437500 +v -0.437500 1.000000 0.437500 +v 0.437500 1.000000 0.437500 +v 0.437500 1.000000 -0.437500 +v 1.250000 0.125000 -1.500000 +v -1.250000 0.125000 -1.500000 +v 1.250000 0.875000 -1.500000 +v -1.250000 0.875000 -1.500000 +v -1.500000 0.125000 -1.250000 +v -1.500000 0.125000 1.250000 +v -1.500000 0.875000 -1.250000 +v -1.500000 0.875000 1.250000 +v -1.250000 0.125000 1.500000 +v 1.250000 0.125000 1.500000 +v -1.250000 0.875000 1.500000 +v 1.250000 0.875000 1.500000 +v 1.250000 0.125000 -1.250000 +v -1.250000 0.125000 -1.250000 +v 1.250000 0.875000 -1.250000 +v -1.250000 0.875000 -1.250000 +v -1.250000 0.125000 -1.250000 +v -1.250000 0.125000 1.250000 +v -1.250000 0.875000 -1.250000 +v -1.250000 0.875000 1.250000 +v -1.250000 0.125000 1.250000 +v 1.250000 0.125000 1.250000 +v -1.250000 0.875000 1.250000 +v 1.250000 0.875000 1.250000 +v -1.000000 0.531250 -1.250000 +v 1.000000 0.531250 -1.250000 +v -1.000000 0.468750 -1.250000 +v 1.000000 0.468750 -1.250000 +v -1.000000 0.468750 -1.625000 +v -1.000000 0.531250 -1.625000 +v 1.000000 0.531250 -1.625000 +v 1.000000 0.468750 -1.625000 +v -1.000000 0.625000 -1.250000 +v 1.000000 0.625000 -1.250000 +v -1.000000 0.562500 -1.250000 +v 1.000000 0.562500 -1.250000 +v -1.000000 0.562500 -1.625000 +v -1.000000 0.625000 -1.625000 +v 1.000000 0.625000 -1.625000 +v 1.000000 0.562500 -1.625000 +v -1.000000 0.437500 -1.250000 +v 1.000000 0.437500 -1.250000 +v -1.000000 0.375000 -1.250000 +v 1.000000 0.375000 -1.250000 +v -1.000000 0.375000 -1.625000 +v -1.000000 0.437500 -1.625000 +v 1.000000 0.437500 -1.625000 +v 1.000000 0.375000 -1.625000 +v -1.000000 0.343750 -1.250000 +v 1.000000 0.343750 -1.250000 +v -1.000000 0.281250 -1.250000 +v 1.000000 0.281250 -1.250000 +v -1.000000 0.281250 -1.625000 +v -1.000000 0.343750 -1.625000 +v 1.000000 0.343750 -1.625000 +v 1.000000 0.281250 -1.625000 +v -1.000000 0.250000 -1.250000 +v 1.000000 0.250000 -1.250000 +v -1.000000 0.187500 -1.250000 +v 1.000000 0.187500 -1.250000 +v -1.000000 0.187500 -1.625000 +v -1.000000 0.250000 -1.625000 +v 1.000000 0.250000 -1.625000 +v 1.000000 0.187500 -1.625000 +v -1.000000 0.812500 -1.250000 +v 1.000000 0.812500 -1.250000 +v -1.000000 0.750000 -1.250000 +v 1.000000 0.750000 -1.250000 +v -1.000000 0.750000 -1.625000 +v -1.000000 0.812500 -1.625000 +v 1.000000 0.812500 -1.625000 +v 1.000000 0.750000 -1.625000 +v -1.000000 0.718750 -1.250000 +v 1.000000 0.718750 -1.250000 +v -1.000000 0.656250 -1.250000 +v 1.000000 0.656250 -1.250000 +v -1.000000 0.656250 -1.625000 +v -1.000000 0.718750 -1.625000 +v 1.000000 0.718750 -1.625000 +v 1.000000 0.656250 -1.625000 +v -1.250000 0.531250 1.000000 +v -1.250000 0.531250 -1.000000 +v -1.250000 0.468750 1.000000 +v -1.250000 0.468750 -1.000000 +v -1.625000 0.468750 1.000000 +v -1.625000 0.531250 1.000000 +v -1.625000 0.531250 -1.000000 +v -1.625000 0.468750 -1.000000 +v -1.250000 0.625000 1.000000 +v -1.250000 0.625000 -1.000000 +v -1.250000 0.562500 1.000000 +v -1.250000 0.562500 -1.000000 +v -1.625000 0.562500 1.000000 +v -1.625000 0.625000 1.000000 +v -1.625000 0.625000 -1.000000 +v -1.625000 0.562500 -1.000000 +v -1.250000 0.437500 1.000000 +v -1.250000 0.437500 -1.000000 +v -1.250000 0.375000 1.000000 +v -1.250000 0.375000 -1.000000 +v -1.625000 0.375000 1.000000 +v -1.625000 0.437500 1.000000 +v -1.625000 0.437500 -1.000000 +v -1.625000 0.375000 -1.000000 +v -1.250000 0.343750 1.000000 +v -1.250000 0.343750 -1.000000 +v -1.250000 0.281250 1.000000 +v -1.250000 0.281250 -1.000000 +v -1.625000 0.281250 1.000000 +v -1.625000 0.343750 1.000000 +v -1.625000 0.343750 -1.000000 +v -1.625000 0.281250 -1.000000 +v -1.250000 0.250000 1.000000 +v -1.250000 0.250000 -1.000000 +v -1.250000 0.187500 1.000000 +v -1.250000 0.187500 -1.000000 +v -1.625000 0.187500 1.000000 +v -1.625000 0.250000 1.000000 +v -1.625000 0.250000 -1.000000 +v -1.625000 0.187500 -1.000000 +v -1.250000 0.812500 1.000000 +v -1.250000 0.812500 -1.000000 +v -1.250000 0.750000 1.000000 +v -1.250000 0.750000 -1.000000 +v -1.625000 0.750000 1.000000 +v -1.625000 0.812500 1.000000 +v -1.625000 0.812500 -1.000000 +v -1.625000 0.750000 -1.000000 +v -1.250000 0.718750 1.000000 +v -1.250000 0.718750 -1.000000 +v -1.250000 0.656250 1.000000 +v -1.250000 0.656250 -1.000000 +v -1.625000 0.656250 1.000000 +v -1.625000 0.718750 1.000000 +v -1.625000 0.718750 -1.000000 +v -1.625000 0.656250 -1.000000 +v 1.000000 0.531250 1.250000 +v -1.000000 0.531250 1.250000 +v 1.000000 0.468750 1.250000 +v -1.000000 0.468750 1.250000 +v 1.000000 0.468750 1.625000 +v 1.000000 0.531250 1.625000 +v -1.000000 0.531250 1.625000 +v -1.000000 0.468750 1.625000 +v 1.000000 0.625000 1.250000 +v -1.000000 0.625000 1.250000 +v 1.000000 0.562500 1.250000 +v -1.000000 0.562500 1.250000 +v 1.000000 0.562500 1.625000 +v 1.000000 0.625000 1.625000 +v -1.000000 0.625000 1.625000 +v -1.000000 0.562500 1.625000 +v 1.000000 0.437500 1.250000 +v -1.000000 0.437500 1.250000 +v 1.000000 0.375000 1.250000 +v -1.000000 0.375000 1.250000 +v 1.000000 0.375000 1.625000 +v 1.000000 0.437500 1.625000 +v -1.000000 0.437500 1.625000 +v -1.000000 0.375000 1.625000 +v 1.000000 0.343750 1.250000 +v -1.000000 0.343750 1.250000 +v 1.000000 0.281250 1.250000 +v -1.000000 0.281250 1.250000 +v 1.000000 0.281250 1.625000 +v 1.000000 0.343750 1.625000 +v -1.000000 0.343750 1.625000 +v -1.000000 0.281250 1.625000 +v 1.000000 0.250000 1.250000 +v -1.000000 0.250000 1.250000 +v 1.000000 0.187500 1.250000 +v -1.000000 0.187500 1.250000 +v 1.000000 0.187500 1.625000 +v 1.000000 0.250000 1.625000 +v -1.000000 0.250000 1.625000 +v -1.000000 0.187500 1.625000 +v 1.000000 0.812500 1.250000 +v -1.000000 0.812500 1.250000 +v 1.000000 0.750000 1.250000 +v -1.000000 0.750000 1.250000 +v 1.000000 0.750000 1.625000 +v 1.000000 0.812500 1.625000 +v -1.000000 0.812500 1.625000 +v -1.000000 0.750000 1.625000 +v 1.000000 0.718750 1.250000 +v -1.000000 0.718750 1.250000 +v 1.000000 0.656250 1.250000 +v -1.000000 0.656250 1.250000 +v 1.000000 0.656250 1.625000 +v 1.000000 0.718750 1.625000 +v -1.000000 0.718750 1.625000 +v -1.000000 0.656250 1.625000 +v 1.750000 0.000000 1.500000 +v 1.750000 0.000000 -1.500000 +v 1.750000 1.000000 1.500000 +v 1.750000 1.000000 -1.500000 +v 2.250000 0.000000 1.500000 +v 2.250000 0.000000 -1.500000 +v 2.250000 1.000000 1.500000 +v 2.250000 1.000000 -1.500000 +v 2.312500 0.687500 0.187500 +v 2.312500 0.312500 0.187500 +v 2.312500 0.687500 -0.187500 +v 2.312500 0.312500 -0.187500 +v 2.500000 0.687500 -0.187500 +v 2.500000 0.687500 0.187500 +v 2.500000 0.312500 0.187500 +v 2.500000 0.312500 -0.187500 +v 2.250000 0.750000 0.250000 +v 2.250000 0.250000 0.250000 +v 2.250000 0.750000 -0.250000 +v 2.250000 0.250000 -0.250000 +v 2.312500 0.750000 -0.250000 +v 2.312500 0.750000 0.250000 +v 2.312500 0.250000 0.250000 +v 2.312500 0.250000 -0.250000 +v 1.750000 0.125000 1.250000 +v 1.750000 0.125000 -1.250000 +v 1.750000 0.875000 1.250000 +v 1.750000 0.875000 -1.250000 +v 1.500000 0.125000 1.250000 +v 1.500000 0.125000 -1.250000 +v 1.500000 0.875000 1.250000 +v 1.500000 0.875000 -1.250000 +v 2.250000 0.875000 1.375000 +v 2.250000 0.125000 1.375000 +v 2.250000 0.875000 0.625000 +v 2.250000 0.125000 0.625000 +v 2.375000 0.875000 0.625000 +v 2.375000 0.875000 1.375000 +v 2.375000 0.125000 1.375000 +v 2.375000 0.125000 0.625000 +v 2.250000 0.875000 -0.625000 +v 2.250000 0.125000 -0.625000 +v 2.250000 0.875000 -1.375000 +v 2.250000 0.125000 -1.375000 +v 2.375000 0.875000 -1.375000 +v 2.375000 0.875000 -0.625000 +v 2.375000 0.125000 -0.625000 +v 2.375000 0.125000 -1.375000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +vt 0.000000 0.375000 +vt 0.285714 0.250000 +vt 0.428571 0.375000 +vt 0.285714 0.625000 +vt 0.000000 0.500000 +vt 0.428571 0.500000 +vt 0.428571 0.875000 +vt 0.035714 0.890625 +vt 0.000000 0.875000 +vt 0.428571 1.000000 +vt 0.392857 0.890625 +vt 0.428571 0.875000 +vt 0.000000 0.875000 +vt 0.035714 0.984375 +vt 0.000000 1.000000 +vt 0.607143 0.804687 +vt 0.598214 0.679687 +vt 0.607143 0.679687 +vt 0.285714 0.750000 +vt 0.142857 0.750000 +vt 0.142857 0.625000 +vt 0.589286 0.671875 +vt 0.455357 0.679687 +vt 0.446429 0.671875 +vt 0.428571 0.679687 +vt 0.437500 0.804688 +vt 0.428571 0.804688 +vt 0.589286 0.664062 +vt 0.446429 0.664062 +vt 0.446429 0.820312 +vt 0.589286 0.812500 +vt 0.589286 0.820312 +vt 0.580357 0.679687 +vt 0.455357 0.687500 +vt 0.446429 0.812500 +vt 0.580357 0.804688 +vt 0.598214 0.804688 +vt 0.589286 0.687500 +vt 0.437500 0.679687 +vt 0.446429 0.796875 +vt 0.580357 0.796875 +vt 0.455357 0.796875 +vt 0.455357 0.804688 +vt 0.589286 0.796875 +vt 0.580357 0.687500 +vt 0.446429 0.687500 +vt 0.857143 0.601562 +vt 0.821429 0.507812 +vt 0.857143 0.507812 +vt 0.000000 0.875000 +vt 0.035714 0.984375 +vt 0.000000 1.000000 +vt 0.035714 0.890625 +vt 0.392857 0.984375 +vt 0.464286 0.632812 +vt 0.821429 0.601562 +vt 0.821429 0.632812 +vt 0.000000 1.000000 +vt 0.392857 0.984375 +vt 0.428571 1.000000 +vt 0.392857 0.890625 +vt 0.035714 0.984375 +vt 0.428571 0.507812 +vt 0.464286 0.601562 +vt 0.428571 0.601562 +vt 0.428571 0.875000 +vt 0.035714 0.890625 +vt 0.392857 0.984375 +vt 0.428571 1.000000 +vt 0.392857 0.890625 +vt 0.464286 0.601562 +vt 0.821429 0.601562 +vt 0.464286 0.632812 +vt 0.821429 0.632812 +vt 0.428571 0.507812 +vt 0.428571 0.601562 +vt 0.821429 0.476562 +vt 0.464286 0.507812 +vt 0.464286 0.476562 +vt 0.464286 0.601562 +vt 0.821429 0.507812 +vt 0.857143 0.601562 +vt 0.857143 0.507812 +vt 0.821429 0.476562 +vt 0.464286 0.507812 +vt 0.464286 0.476562 +vt 0.428571 0.507812 +vt 0.428571 0.601562 +vt 0.821429 0.507812 +vt 0.464286 0.507812 +vt 0.464286 0.632812 +vt 0.821429 0.601562 +vt 0.821429 0.632812 +vt 0.857143 0.601562 +vt 0.857143 0.507812 +vt 0.821429 0.476562 +vt 0.464286 0.476562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.500000 0.351562 +vt 0.928571 0.476562 +vt 0.500000 0.476562 +vt 0.928571 0.164062 +vt 0.500000 0.289062 +vt 0.500000 0.164062 +vt 0.428571 0.164062 +vt 0.428571 0.289062 +vt 0.928571 0.289062 +vt 0.928571 0.351562 +vt 1.000000 0.289062 +vt 1.000000 0.164062 +vt 0.928571 0.101562 +vt 0.500000 0.101562 +vt 0.892857 0.632812 +vt 0.785714 0.664062 +vt 0.785714 0.632812 +vt 0.776786 0.687500 +vt 0.830357 0.734375 +vt 0.776786 0.734375 +vt 0.830357 0.664062 +vt 0.776786 0.664062 +vt 0.776786 0.757812 +vt 0.830357 0.757812 +vt 0.857143 0.734375 +vt 0.830357 0.687500 +vt 0.857143 0.687500 +vt 0.750000 0.687500 +vt 0.750000 0.734375 +vt 0.758929 0.765625 +vt 0.830357 0.828125 +vt 0.758929 0.828125 +vt 0.839286 0.828125 +vt 0.830357 0.765625 +vt 0.839286 0.765625 +vt 0.750000 0.765625 +vt 0.750000 0.828125 +vt 0.830357 0.757812 +vt 0.758929 0.757812 +vt 0.758929 0.835938 +vt 0.830357 0.835938 +vt 0.785714 0.632812 +vt 0.428571 0.664062 +vt 0.428571 0.632812 +vt 0.892857 0.632812 +vt 0.785714 0.664062 +vt 0.428571 0.632812 +vt 0.625000 0.679688 +vt 0.732143 0.773438 +vt 0.625000 0.773438 +vt 0.750000 0.773438 +vt 0.732143 0.679688 +vt 0.750000 0.679688 +vt 0.607143 0.679688 +vt 0.607143 0.773438 +vt 0.732143 0.664062 +vt 0.625000 0.664062 +vt 0.625000 0.789062 +vt 0.732143 0.789062 +vt 0.625000 0.679688 +vt 0.732143 0.773438 +vt 0.625000 0.773438 +vt 0.750000 0.773438 +vt 0.732143 0.679688 +vt 0.750000 0.679688 +vt 0.607143 0.679688 +vt 0.607143 0.773438 +vt 0.732143 0.664062 +vt 0.625000 0.664062 +vt 0.625000 0.789062 +vt 0.732143 0.789062 +vt 0.428571 0.679687 +vt 0.437500 0.804688 +vt 0.428571 0.804688 +vt 0.285714 0.125000 +vt 0.428571 -0.000000 +vt 0.142857 0.125000 +vt 0.000000 -0.000000 +vt 0.142857 0.250000 +vt 0.589286 0.671875 +vt 0.455357 0.679687 +vt 0.446429 0.671875 +vt 0.607143 0.804687 +vt 0.598214 0.679687 +vt 0.607143 0.679687 +vt 0.589286 0.664062 +vt 0.446429 0.664062 +vt 0.446429 0.820312 +vt 0.589286 0.812500 +vt 0.589286 0.820312 +vt 0.446429 0.687500 +vt 0.455357 0.796875 +vt 0.446429 0.796875 +vt 0.446429 0.812500 +vt 0.580357 0.804688 +vt 0.437500 0.679687 +vt 0.598214 0.804688 +vt 0.589286 0.687500 +vt 0.580357 0.687500 +vt 0.580357 0.796875 +vt 0.589286 0.796875 +vt 0.580357 0.679687 +vt 0.455357 0.687500 +vt 0.455357 0.804688 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.892857 0.664062 +vt 0.892857 0.664062 +vt 0.428571 0.664062 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +s off +f 2/1/1 268/2/1 4/3/1 +f 12/4/2 7/5/2 8/6/2 +f 4/3/3 7/5/3 2/1/3 +f 5/7/4 32/8/4 6/9/4 +f 4/10/5 27/11/5 8/12/5 +f 7/13/6 34/14/6 2/15/6 +f 11/16/6 16/17/6 12/18/6 +f 11/19/2 8/6/2 5/7/2 +f 9/20/2 5/7/2 6/9/2 +f 10/21/2 6/9/2 7/5/2 +f 16/22/2 19/23/2 15/24/2 +f 10/25/5 14/26/5 9/27/5 +f 12/28/4 15/24/4 10/29/4 +f 9/30/3 13/31/3 11/32/3 +f 20/33/3 23/34/3 19/23/3 +f 14/35/2 17/36/2 13/31/2 +f 13/37/2 20/38/2 16/17/2 +f 15/39/2 18/40/2 14/26/2 +f 23/34/2 21/41/2 22/42/2 +f 18/43/4 21/41/4 17/36/4 +f 17/44/5 24/45/5 20/38/5 +f 19/46/6 22/42/6 18/40/6 +f 25/47/4 39/48/4 27/49/4 +f 5/50/5 26/51/5 3/52/5 +f 8/12/5 28/53/5 5/50/5 +f 3/52/5 25/54/5 4/10/5 +f 30/55/2 41/56/2 29/57/2 +f 1/58/4 29/59/4 3/60/4 +f 3/60/4 31/61/4 5/7/4 +f 6/9/4 30/62/4 1/58/4 +f 33/63/3 47/64/3 35/65/3 +f 6/66/6 36/67/6 7/13/6 +f 2/15/6 33/68/6 1/69/6 +f 1/69/6 35/70/6 6/66/6 +f 38/71/5 39/48/5 37/72/5 +f 26/73/2 37/72/2 25/74/2 +f 28/75/3 38/71/3 26/76/3 +f 27/77/1 40/78/1 28/79/1 +f 42/80/4 43/81/4 41/56/4 +f 29/82/6 43/81/6 31/83/6 +f 31/84/1 44/85/1 32/86/1 +f 32/87/5 42/80/5 30/88/5 +f 46/89/6 47/64/6 45/90/6 +f 35/91/1 48/92/1 36/93/1 +f 36/94/4 46/89/4 34/95/4 +f 34/96/2 45/90/2 33/97/2 +f 63/98/5 61/99/5 62/100/5 +f 55/101/5 53/102/5 54/103/5 +f 52/104/3 55/101/3 50/105/3 +f 49/106/4 53/102/4 51/107/4 +f 51/108/1 56/109/1 52/110/1 +f 50/111/2 54/103/2 49/112/2 +f 60/113/3 63/98/3 58/114/3 +f 57/115/4 61/99/4 59/116/4 +f 59/117/1 64/118/1 60/119/1 +f 58/120/2 62/100/2 57/121/2 +f 71/122/5 69/123/5 70/124/5 +f 68/125/3 71/122/3 66/126/3 +f 65/127/4 69/123/4 67/128/4 +f 67/129/1 72/130/1 68/131/1 +f 66/132/2 70/124/2 65/133/2 +f 79/134/5 77/135/5 78/136/5 +f 76/137/3 79/134/3 74/138/3 +f 73/139/4 77/135/4 75/140/4 +f 75/141/1 80/142/1 76/143/1 +f 74/144/2 78/136/2 73/145/2 +f 87/146/5 85/147/5 86/148/5 +f 84/149/3 87/146/3 82/150/3 +f 81/151/4 85/147/4 83/152/4 +f 83/153/1 88/154/1 84/155/1 +f 82/156/2 86/148/2 81/157/2 +f 95/158/5 93/159/5 94/160/5 +f 92/161/3 95/158/3 90/162/3 +f 89/163/4 93/159/4 91/164/4 +f 91/165/1 96/166/1 92/167/1 +f 90/168/2 94/160/2 89/169/2 +f 103/170/5 101/171/5 102/172/5 +f 100/173/3 103/170/3 98/174/3 +f 97/175/4 101/171/4 99/176/4 +f 99/177/1 104/178/1 100/179/1 +f 98/180/2 102/172/2 97/181/2 +f 119/182/4 117/183/4 118/184/4 +f 111/185/4 109/186/4 110/187/4 +f 108/188/5 111/185/5 106/189/5 +f 105/190/6 109/186/6 107/191/6 +f 107/192/1 112/193/1 108/194/1 +f 106/195/2 110/187/2 105/196/2 +f 116/197/5 119/182/5 114/198/5 +f 113/199/6 117/183/6 115/200/6 +f 115/201/1 120/202/1 116/203/1 +f 114/204/2 118/184/2 113/205/2 +f 127/206/4 125/207/4 126/208/4 +f 124/209/5 127/206/5 122/210/5 +f 121/211/6 125/207/6 123/212/6 +f 123/213/1 128/214/1 124/215/1 +f 122/216/2 126/208/2 121/217/2 +f 135/218/4 133/219/4 134/220/4 +f 132/221/5 135/218/5 130/222/5 +f 129/223/6 133/219/6 131/224/6 +f 131/225/1 136/226/1 132/227/1 +f 130/228/2 134/220/2 129/229/2 +f 143/230/4 141/231/4 142/232/4 +f 140/233/5 143/230/5 138/234/5 +f 137/235/6 141/231/6 139/236/6 +f 139/237/1 144/238/1 140/239/1 +f 138/240/2 142/232/2 137/241/2 +f 151/242/4 149/243/4 150/244/4 +f 148/245/5 151/242/5 146/246/5 +f 145/247/6 149/243/6 147/248/6 +f 147/249/1 152/250/1 148/251/1 +f 146/252/2 150/244/2 145/253/2 +f 159/254/4 157/255/4 158/256/4 +f 156/257/5 159/254/5 154/258/5 +f 153/259/6 157/255/6 155/260/6 +f 155/261/1 160/262/1 156/263/1 +f 154/264/2 158/256/2 153/265/2 +f 175/266/6 173/267/6 174/268/6 +f 167/269/6 165/270/6 166/271/6 +f 164/272/4 167/269/4 162/273/4 +f 161/274/3 165/270/3 163/275/3 +f 164/276/1 165/270/1 168/277/1 +f 162/278/2 166/271/2 161/279/2 +f 172/280/4 175/266/4 170/281/4 +f 169/282/3 173/267/3 171/283/3 +f 172/284/1 173/267/1 176/285/1 +f 170/286/2 174/268/2 169/287/2 +f 183/288/6 181/289/6 182/290/6 +f 180/291/4 183/288/4 178/292/4 +f 177/293/3 181/289/3 179/294/3 +f 180/295/1 181/289/1 184/296/1 +f 178/297/2 182/290/2 177/298/2 +f 191/299/6 189/300/6 190/301/6 +f 188/302/4 191/299/4 186/303/4 +f 185/304/3 189/300/3 187/305/3 +f 188/306/1 189/300/1 192/307/1 +f 186/308/2 190/301/2 185/309/2 +f 199/310/6 197/311/6 198/312/6 +f 196/313/4 199/310/4 194/314/4 +f 193/315/3 197/311/3 195/316/3 +f 196/317/1 197/311/1 200/318/1 +f 194/319/2 198/312/2 193/320/2 +f 207/321/6 205/322/6 206/323/6 +f 204/324/4 207/321/4 202/325/4 +f 201/326/3 205/322/3 203/327/3 +f 204/328/1 205/322/1 208/329/1 +f 202/330/2 206/323/2 201/331/2 +f 215/332/6 213/333/6 214/334/6 +f 212/335/4 215/332/4 210/336/4 +f 209/337/3 213/333/3 211/338/3 +f 212/339/1 213/333/1 216/340/1 +f 210/341/2 214/334/2 209/342/2 +f 219/343/4 218/344/4 217/345/4 +f 222/346/3 223/347/3 221/348/3 +f 217/349/6 223/347/6 219/350/6 +f 219/343/2 224/351/2 220/352/2 +f 220/353/5 222/346/5 218/354/5 +f 218/355/1 221/348/1 217/356/1 +f 242/357/5 248/358/5 244/359/5 +f 231/360/3 229/361/3 230/362/3 +f 228/363/1 231/360/1 226/364/1 +f 225/365/2 229/361/2 227/366/2 +f 227/367/5 232/368/5 228/369/5 +f 226/370/6 230/362/6 225/371/6 +f 239/372/3 237/373/3 238/374/3 +f 235/375/5 240/376/5 236/377/5 +f 234/378/6 238/374/6 233/379/6 +f 236/380/1 239/372/1 234/381/1 +f 233/382/2 237/373/2 235/383/2 +f 241/384/1 246/385/1 242/386/1 +f 243/387/6 245/388/6 241/384/6 +f 248/358/2 243/389/2 244/359/2 +f 255/390/3 253/391/3 254/392/3 +f 251/393/5 256/394/5 252/395/5 +f 250/396/6 254/392/6 249/397/6 +f 252/398/1 255/390/1 250/399/1 +f 249/400/2 253/391/2 251/401/2 +f 263/402/3 261/403/3 262/404/3 +f 259/405/5 264/406/5 260/407/5 +f 258/408/6 262/404/6 257/409/6 +f 260/410/1 263/402/1 258/411/1 +f 257/412/2 261/403/2 259/413/2 +f 268/414/6 269/415/6 267/416/6 +f 4/3/1 267/417/1 3/418/1 +f 3/418/1 265/419/1 1/420/1 +f 1/420/1 266/421/1 2/1/1 +f 271/422/1 276/423/1 272/424/1 +f 265/425/5 271/426/5 266/427/5 +f 266/428/4 272/424/4 268/429/4 +f 267/430/3 270/431/3 265/432/3 +f 276/433/5 277/434/5 273/435/5 +f 269/436/1 274/437/1 270/431/1 +f 272/438/1 273/435/1 269/415/1 +f 270/439/1 275/440/1 271/426/1 +f 277/434/1 279/441/1 278/442/1 +f 274/443/6 279/441/6 275/440/6 +f 275/444/3 280/445/3 276/423/3 +f 273/446/4 278/442/4 274/437/4 +f 2/1/1 266/421/1 268/2/1 +f 12/4/2 10/21/2 7/5/2 +f 4/3/3 8/6/3 7/5/3 +f 5/7/4 31/61/4 32/8/4 +f 4/10/5 25/54/5 27/11/5 +f 7/13/6 36/67/6 34/14/6 +f 11/16/6 13/37/6 16/17/6 +f 11/19/2 12/4/2 8/6/2 +f 9/20/2 11/19/2 5/7/2 +f 10/21/2 9/20/2 6/9/2 +f 16/22/2 20/33/2 19/23/2 +f 10/25/5 15/39/5 14/26/5 +f 12/28/4 16/22/4 15/24/4 +f 9/30/3 14/35/3 13/31/3 +f 20/33/3 24/45/3 23/34/3 +f 14/35/2 18/43/2 17/36/2 +f 13/37/2 17/44/2 20/38/2 +f 15/39/2 19/46/2 18/40/2 +f 23/34/2 24/45/2 21/41/2 +f 18/43/4 22/42/4 21/41/4 +f 17/44/5 21/41/5 24/45/5 +f 19/46/6 23/34/6 22/42/6 +f 25/47/4 37/72/4 39/48/4 +f 5/50/5 28/53/5 26/51/5 +f 8/12/5 27/11/5 28/53/5 +f 3/52/5 26/51/5 25/54/5 +f 30/55/2 42/80/2 41/56/2 +f 1/58/4 30/62/4 29/59/4 +f 3/60/4 29/59/4 31/61/4 +f 6/9/4 32/8/4 30/62/4 +f 33/63/3 45/90/3 47/64/3 +f 6/66/6 35/70/6 36/67/6 +f 2/15/6 34/14/6 33/68/6 +f 1/69/6 33/68/6 35/70/6 +f 38/71/5 40/78/5 39/48/5 +f 26/73/2 38/71/2 37/72/2 +f 28/75/3 40/78/3 38/71/3 +f 27/77/1 39/48/1 40/78/1 +f 42/80/4 44/85/4 43/81/4 +f 29/82/6 41/56/6 43/81/6 +f 31/84/1 43/81/1 44/85/1 +f 32/87/5 44/85/5 42/80/5 +f 46/89/6 48/92/6 47/64/6 +f 35/91/1 47/64/1 48/92/1 +f 36/94/4 48/92/4 46/89/4 +f 34/96/2 46/89/2 45/90/2 +f 63/98/5 64/118/5 61/99/5 +f 55/101/5 56/109/5 53/102/5 +f 52/104/3 56/109/3 55/101/3 +f 49/106/4 54/103/4 53/102/4 +f 51/108/1 53/102/1 56/109/1 +f 50/111/2 55/101/2 54/103/2 +f 60/113/3 64/118/3 63/98/3 +f 57/115/4 62/100/4 61/99/4 +f 59/117/1 61/99/1 64/118/1 +f 58/120/2 63/98/2 62/100/2 +f 71/122/5 72/130/5 69/123/5 +f 68/125/3 72/130/3 71/122/3 +f 65/127/4 70/124/4 69/123/4 +f 67/129/1 69/123/1 72/130/1 +f 66/132/2 71/122/2 70/124/2 +f 79/134/5 80/142/5 77/135/5 +f 76/137/3 80/142/3 79/134/3 +f 73/139/4 78/136/4 77/135/4 +f 75/141/1 77/135/1 80/142/1 +f 74/144/2 79/134/2 78/136/2 +f 87/146/5 88/154/5 85/147/5 +f 84/149/3 88/154/3 87/146/3 +f 81/151/4 86/148/4 85/147/4 +f 83/153/1 85/147/1 88/154/1 +f 82/156/2 87/146/2 86/148/2 +f 95/158/5 96/166/5 93/159/5 +f 92/161/3 96/166/3 95/158/3 +f 89/163/4 94/160/4 93/159/4 +f 91/165/1 93/159/1 96/166/1 +f 90/168/2 95/158/2 94/160/2 +f 103/170/5 104/178/5 101/171/5 +f 100/173/3 104/178/3 103/170/3 +f 97/175/4 102/172/4 101/171/4 +f 99/177/1 101/171/1 104/178/1 +f 98/180/2 103/170/2 102/172/2 +f 119/182/4 120/202/4 117/183/4 +f 111/185/4 112/193/4 109/186/4 +f 108/188/5 112/193/5 111/185/5 +f 105/190/6 110/187/6 109/186/6 +f 107/192/1 109/186/1 112/193/1 +f 106/195/2 111/185/2 110/187/2 +f 116/197/5 120/202/5 119/182/5 +f 113/199/6 118/184/6 117/183/6 +f 115/201/1 117/183/1 120/202/1 +f 114/204/2 119/182/2 118/184/2 +f 127/206/4 128/214/4 125/207/4 +f 124/209/5 128/214/5 127/206/5 +f 121/211/6 126/208/6 125/207/6 +f 123/213/1 125/207/1 128/214/1 +f 122/216/2 127/206/2 126/208/2 +f 135/218/4 136/226/4 133/219/4 +f 132/221/5 136/226/5 135/218/5 +f 129/223/6 134/220/6 133/219/6 +f 131/225/1 133/219/1 136/226/1 +f 130/228/2 135/218/2 134/220/2 +f 143/230/4 144/238/4 141/231/4 +f 140/233/5 144/238/5 143/230/5 +f 137/235/6 142/232/6 141/231/6 +f 139/237/1 141/231/1 144/238/1 +f 138/240/2 143/230/2 142/232/2 +f 151/242/4 152/250/4 149/243/4 +f 148/245/5 152/250/5 151/242/5 +f 145/247/6 150/244/6 149/243/6 +f 147/249/1 149/243/1 152/250/1 +f 146/252/2 151/242/2 150/244/2 +f 159/254/4 160/262/4 157/255/4 +f 156/257/5 160/262/5 159/254/5 +f 153/259/6 158/256/6 157/255/6 +f 155/261/1 157/255/1 160/262/1 +f 154/264/2 159/254/2 158/256/2 +f 175/266/6 176/285/6 173/267/6 +f 167/269/6 168/277/6 165/270/6 +f 164/272/4 168/277/4 167/269/4 +f 161/274/3 166/271/3 165/270/3 +f 164/276/1 163/447/1 165/270/1 +f 162/278/2 167/269/2 166/271/2 +f 172/280/4 176/285/4 175/266/4 +f 169/282/3 174/268/3 173/267/3 +f 172/284/1 171/448/1 173/267/1 +f 170/286/2 175/266/2 174/268/2 +f 183/288/6 184/296/6 181/289/6 +f 180/291/4 184/296/4 183/288/4 +f 177/293/3 182/290/3 181/289/3 +f 180/295/1 179/449/1 181/289/1 +f 178/297/2 183/288/2 182/290/2 +f 191/299/6 192/307/6 189/300/6 +f 188/302/4 192/307/4 191/299/4 +f 185/304/3 190/301/3 189/300/3 +f 188/306/1 187/450/1 189/300/1 +f 186/308/2 191/299/2 190/301/2 +f 199/310/6 200/318/6 197/311/6 +f 196/313/4 200/318/4 199/310/4 +f 193/315/3 198/312/3 197/311/3 +f 196/317/1 195/451/1 197/311/1 +f 194/319/2 199/310/2 198/312/2 +f 207/321/6 208/329/6 205/322/6 +f 204/324/4 208/329/4 207/321/4 +f 201/326/3 206/323/3 205/322/3 +f 204/328/1 203/452/1 205/322/1 +f 202/330/2 207/321/2 206/323/2 +f 215/332/6 216/340/6 213/333/6 +f 212/335/4 216/340/4 215/332/4 +f 209/337/3 214/334/3 213/333/3 +f 212/339/1 211/453/1 213/333/1 +f 210/341/2 215/332/2 214/334/2 +f 219/343/4 220/352/4 218/344/4 +f 222/346/3 224/351/3 223/347/3 +f 217/349/6 221/348/6 223/347/6 +f 219/343/2 223/347/2 224/351/2 +f 220/353/5 224/351/5 222/346/5 +f 218/355/1 222/346/1 221/348/1 +f 242/357/5 246/454/5 248/358/5 +f 231/360/3 232/368/3 229/361/3 +f 228/363/1 232/368/1 231/360/1 +f 225/365/2 230/362/2 229/361/2 +f 227/367/5 229/361/5 232/368/5 +f 226/370/6 231/360/6 230/362/6 +f 239/372/3 240/376/3 237/373/3 +f 235/375/5 237/373/5 240/376/5 +f 234/378/6 239/372/6 238/374/6 +f 236/380/1 240/376/1 239/372/1 +f 233/382/2 238/374/2 237/373/2 +f 241/384/1 245/388/1 246/385/1 +f 243/387/6 247/455/6 245/388/6 +f 248/358/2 247/456/2 243/389/2 +f 255/390/3 256/394/3 253/391/3 +f 251/393/5 253/391/5 256/394/5 +f 250/396/6 255/390/6 254/392/6 +f 252/398/1 256/394/1 255/390/1 +f 249/400/2 254/392/2 253/391/2 +f 263/402/3 264/406/3 261/403/3 +f 259/405/5 261/403/5 264/406/5 +f 258/408/6 263/402/6 262/404/6 +f 260/410/1 264/406/1 263/402/1 +f 257/412/2 262/404/2 261/403/2 +f 268/414/6 272/438/6 269/415/6 +f 4/3/1 268/2/1 267/417/1 +f 3/418/1 267/417/1 265/419/1 +f 1/420/1 265/419/1 266/421/1 +f 271/422/1 275/444/1 276/423/1 +f 265/425/5 270/439/5 271/426/5 +f 266/428/4 271/422/4 272/424/4 +f 267/430/3 269/436/3 270/431/3 +f 276/433/5 280/445/5 277/434/5 +f 269/436/1 273/446/1 274/437/1 +f 272/438/1 276/433/1 273/435/1 +f 270/439/1 274/443/1 275/440/1 +f 277/434/1 280/445/1 279/441/1 +f 274/443/6 278/442/6 279/441/6 +f 275/444/3 279/441/3 280/445/3 +f 273/446/4 277/434/4 278/442/4 diff --git a/src/main/resources/assets/hbm/textures/models/machines/electric_heater.png b/src/main/resources/assets/hbm/textures/models/machines/electric_heater.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd971aa114af01e34fc4f5bb05fecf4f1607b4d GIT binary patch literal 2249 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 literal 0 HcmV?d00001 From 23fc31e2b00a2b644688b3a7fe3793fab8f9ff5c Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 10 Oct 2022 16:38:49 +0200 Subject: [PATCH 102/111] electric heater functionality --- .../hbm/blocks/machine/HeaterElectric.java | 24 +++- .../java/com/hbm/inventory/material/Mats.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 1 + .../com/hbm/render/util/HorsePronter.java | 123 ++++++++++++++++++ .../machine/TileEntityHeaterElectric.java | 73 ++++++++++- .../hbm/textures/models/horse/horse_demo.png | Bin 0 -> 528 bytes 6 files changed, 215 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/hbm/render/util/HorsePronter.java create mode 100644 src/main/resources/assets/hbm/textures/models/horse/horse_demo.png diff --git a/src/main/java/com/hbm/blocks/machine/HeaterElectric.java b/src/main/java/com/hbm/blocks/machine/HeaterElectric.java index 40afaef4f..b1f3424c5 100644 --- a/src/main/java/com/hbm/blocks/machine/HeaterElectric.java +++ b/src/main/java/com/hbm/blocks/machine/HeaterElectric.java @@ -2,6 +2,7 @@ package com.hbm.blocks.machine; import java.util.List; +import api.hbm.block.IToolable; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityProxyCombo; @@ -14,7 +15,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class HeaterElectric extends BlockDummyable implements ITooltipProvider { +public class HeaterElectric extends BlockDummyable implements ITooltipProvider, IToolable { public HeaterElectric() { super(Material.iron); @@ -52,4 +53,25 @@ public class HeaterElectric extends BlockDummyable implements ITooltipProvider { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { this.addStandardInfo(stack, player, list, ext); } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) + return false; + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) return false; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntityHeaterElectric)) return false; + + TileEntityHeaterElectric tile = (TileEntityHeaterElectric) te; + tile.toggleSetting(); + tile.markDirty(); + + return true; + } } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index b3cfaf8be..4ede40047 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -85,7 +85,7 @@ public class Mats { public static final NTMMaterial MAT_SOLINIUM = makeSmeltable(12627, SA327, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); public static final NTMMaterial MAT_SCHRABIDATE = makeSmeltable(12600, SBD, 0).setShapes(INGOT, DUST, BLOCK); public static final NTMMaterial MAT_SCHRARANIUM = makeSmeltable(12601, SRN, 0).setShapes(INGOT, BLOCK); - public static final NTMMaterial MAT_GHIORSIUM = makeSmeltable(11936, GH336, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_GHIORSIUM = makeSmeltable(12836, GH336, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); //Base metals public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xA99E79).setShapes(INGOT, DUST, PLATE, BLOCK); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 8f6de38a2..9b0c595be 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -668,6 +668,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(Items.paper, 1), new Object[] { new ItemStack(ModItems.assembly_template, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(Items.paper, 1), new Object[] { new ItemStack(ModItems.chemistry_template, 1, OreDictionary.WILDCARD_VALUE) }); + addShapelessAuto(new ItemStack(Items.paper, 1), new Object[] { new ItemStack(ModItems.crucible_template, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(Items.slime_ball, 16), new Object[] { new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), Fluids.SULFURIC_ACID.getDict(1000) }); for(int i = 1; i < Fluids.getAll().length; ++i) { diff --git a/src/main/java/com/hbm/render/util/HorsePronter.java b/src/main/java/com/hbm/render/util/HorsePronter.java new file mode 100644 index 000000000..94aab581c --- /dev/null +++ b/src/main/java/com/hbm/render/util/HorsePronter.java @@ -0,0 +1,123 @@ +package com.hbm.render.util; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.render.loader.HFRWavefrontObject; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; +import net.minecraftforge.client.model.IModelCustom; + +public class HorsePronter { + + public static final IModelCustom horse = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/horse.obj"), false).asDisplayList(); + + public static final ResourceLocation tex_demohorse = new ResourceLocation(RefStrings.MODID, "textures/models/horse/horse_template.png"); + + private Vec3[] pose = new Vec3[] { + Vec3.createVectorHelper(0, 0, 0), //head + Vec3.createVectorHelper(0, 0, 0), //left front leg + Vec3.createVectorHelper(0, 0, 0), //right front leg + Vec3.createVectorHelper(0, 0, 0), //left back leg + Vec3.createVectorHelper(0, 0, 0), //left back leg + Vec3.createVectorHelper(0, 0, 0), //tail + Vec3.createVectorHelper(0, 0, 0), //body + Vec3.createVectorHelper(0, 0, 0) //body offset + }; + + private Vec3[] offsets = new Vec3[] { + Vec3.createVectorHelper(0, 0, 0), //head + Vec3.createVectorHelper(0, 0, 0), //left front leg + Vec3.createVectorHelper(0, 0, 0), //right front leg + Vec3.createVectorHelper(0, 0, 0), //left back leg + Vec3.createVectorHelper(0, 0, 0), //left back leg + Vec3.createVectorHelper(0, 0, 0), //tail + Vec3.createVectorHelper(0, 0, 0), //body + Vec3.createVectorHelper(0, 0, 0) //body offset + }; + + public static final int id_head = 0; + public static final int id_lfl = 1; + public static final int id_rfl = 2; + public static final int id_lbl = 3; + public static final int id_rbl = 4; + public static final int id_tail = 5; + public static final int id_body = 6; + public static final int id_position = 7; + + private boolean wings = false; + private boolean horn = false; + private boolean maleSnoot = false; + + public void reset() { + + wings = false; + horn = false; + + for(Vec3 angles : pose) { + angles.xCoord = 0; + angles.yCoord = 0; + angles.zCoord = 0; + } + } + + public void enableHorn() { horn = true; } + public void enableWings() { wings = true; } + public void setMaleSnoot() { maleSnoot = true; } + + public void setAlicorn() { + enableHorn(); + enableWings(); + } + + public void pose(int id, double yaw, double pitch, double roll) { + pose[id].xCoord = yaw; + pose[id].yCoord = pitch; + pose[id].zCoord = roll; + } + + public void pront() { + + GL11.glPushMatrix(); + doTransforms(id_body); + + horse.renderPart("Body"); + + if(horn) { + renderWithTransform(id_head, "Head", maleSnoot ? "NoseMale" : "NoseFemale", "HornPointy"); + } else { + renderWithTransform(id_head, "Head", maleSnoot ? "NoseMale" : "NoseFemale"); + } + + renderWithTransform(id_lfl, "LeftFrontLeg"); + renderWithTransform(id_rfl, "RightFrontLeg"); + renderWithTransform(id_lbl, "LeftBackLeg"); + renderWithTransform(id_rbl, "RightBackLeg"); + renderWithTransform(id_tail, "Tail"); + + if(wings) { + horse.renderPart("LeftWing"); + horse.renderPart("RightWing"); + } + + GL11.glPopMatrix(); + } + + private void doTransforms(int id) { + Vec3 rotation = pose[id]; + Vec3 offset = offsets[id]; + GL11.glTranslated(offset.xCoord, offset.yCoord, offset.zCoord); + GL11.glRotated(rotation.xCoord, 0, 1, 0); + GL11.glRotated(rotation.yCoord, 1, 0, 0); + GL11.glRotated(rotation.zCoord, 0, 0, 1); //TODO: check pitch and roll axis + GL11.glTranslated(-offset.xCoord, -offset.yCoord, -offset.zCoord); + } + + private void renderWithTransform(int id, String... parts) { + GL11.glPushMatrix(); + doTransforms(id); + for(String part : parts) horse.renderPart(part); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java index 6092d5a11..e60cea253 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java @@ -1,34 +1,95 @@ package com.hbm.tileentity.machine; +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energy.IEnergyUser; import api.hbm.tile.IHeatSource; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyUser { +public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyUser, INBTPacketReceiver { + + public long power; + public int heatEnergy; + protected int setting = 0; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 20 == 0) { //doesn't have to happen constantly + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + this.trySubscribe(worldObj, xCoord + dir.offsetX * 3, yCoord, zCoord + dir.offsetZ * 3, dir); + } + + this.heatEnergy = 0; + + this.tryPullHeat(); + + if(setting > 0 && this.power >= this.getConsumption()) { + this.power -= this.getConsumption(); + this.heatEnergy += setting * 100; + } + + NBTTagCompound data = new NBTTagCompound(); + data.setByte("s", (byte) this.setting); + data.setInteger("h", heatEnergy); + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.setting = nbt.getByte("s"); + this.heatEnergy = nbt.getInteger("h"); + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + this.heatEnergy += source.getHeatStored() * 0.75; + source.useUpHeat(source.getHeatStored()); + } + } + + public void toggleSetting() { + setting++; + + if(setting > 10) + setting = 0; + } @Override public long getPower() { - return 0; + return power; + } + + public long getConsumption() { + return (long) Math.pow(setting * 200, 1.4D); } @Override public long getMaxPower() { - return 0; + return getConsumption() * 20; } @Override public void setPower(long power) { - + this.power = power; } @Override public int getHeatStored() { - return 0; + return heatEnergy; } @Override public void useUpHeat(int heat) { - + this.heatEnergy = Math.max(0, this.heatEnergy - heat); } } diff --git a/src/main/resources/assets/hbm/textures/models/horse/horse_demo.png b/src/main/resources/assets/hbm/textures/models/horse/horse_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb0e8764124d3c65b2c027bc6ca74b0c33c688a GIT binary patch literal 528 zcmV+r0`L8aP)H$2&bCFKzgqft0PE+W7P)hQW$)DsU@69M2j4`rZ7GvBd)%IR1u=1PLH3$WY z!RCK~FhsFHcnFMe6|leY<+Y#r<+YD*@5Hkfc16d*E#6<+Hb?X9-!ULMf^SpHd z$vvR1@=)#%={=w^3LIkhVYety-u6xGa@#kdH2!5afd|Ce`}psfP@Mma%oCF50YG$| zkLjO04@gb70I3C}rdxp20#b7nQ6M(X$Mjd_OVFm`(TU5Msh00;NYPB~%M(-EkAVV^ z7k^&y@$IvMe)8L2?{?GYGS*htc-=fxHqY*kz<)cqJ8zf)AQbDJAM8upUTE6+rP%tD z_W(uaTp;e5S~_LNE*I4!7dqoNeWzkn_yuOq-tj~F#=lly=K&3L3y@ksYK|fiYLoKp z&rP+yEO#D|T0q;Bx4z3f?=nGP4<4XKao?^rv%m+<^O(m6Ie8E079h2N)cgTxV8J(C S7I@(R0000 Date: Mon, 10 Oct 2022 23:50:37 +0200 Subject: [PATCH 103/111] finished electric heater --- .../hbm/blocks/machine/HeaterElectric.java | 32 +++++++++- .../inventory/recipes/anvil/AnvilRecipes.java | 9 +++ .../hbm/render/tileentity/RenderBoiler.java | 7 +++ .../render/tileentity/RendererObjTester.java | 26 +++++++- .../com/hbm/render/util/HorsePronter.java | 48 +++++++-------- .../machine/TileEntityHeaterElectric.java | 61 +++++++++++++++++-- src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + 8 files changed, 156 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/HeaterElectric.java b/src/main/java/com/hbm/blocks/machine/HeaterElectric.java index b1f3424c5..7d458daf5 100644 --- a/src/main/java/com/hbm/blocks/machine/HeaterElectric.java +++ b/src/main/java/com/hbm/blocks/machine/HeaterElectric.java @@ -1,21 +1,26 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; import java.util.List; import api.hbm.block.IToolable; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityHeaterElectric; +import com.hbm.util.I18nUtil; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class HeaterElectric extends BlockDummyable implements ITooltipProvider, IToolable { +public class HeaterElectric extends BlockDummyable implements ILookOverlay, ITooltipProvider, IToolable { public HeaterElectric() { super(Material.iron); @@ -54,12 +59,37 @@ public class HeaterElectric extends BlockDummyable implements ITooltipProvider, this.addStandardInfo(stack, player, list, ext); } + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntityHeaterElectric)) + return; + + TileEntityHeaterElectric heater = (TileEntityHeaterElectric) te; + + List text = new ArrayList(); + text.add(String.format("%,d", heater.heatEnergy) + " TU"); + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + heater.getConsumption() + " HE/t"); + text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + heater.getHeatGen() + " TU/t"); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { if(tool != ToolType.SCREWDRIVER) return false; + if(world.isRemote) return true; + int[] pos = this.findCore(world, x, y, z); if(pos == null) return false; diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index abc5b698a..c0e9fd2f0 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -242,6 +242,15 @@ public class AnvilRecipes { new OreDictStack(CU.ingot(), 8) }, new AnvilOutput(new ItemStack(ModBlocks.heater_oilburner))).setTier(3)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(ANY_PLASTIC.ingot(), 4), + new OreDictStack(CU.ingot(), 8), + new OreDictStack(STEEL.plate(), 8), + new ComparableStack(ModItems.coil_tungsten, 8), + new ComparableStack(ModItems.circuit_copper, 1) + }, new AnvilOutput(new ItemStack(ModBlocks.heater_electric))).setTier(3)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new ComparableStack(Blocks.stonebrick, 16), diff --git a/src/main/java/com/hbm/render/tileentity/RenderBoiler.java b/src/main/java/com/hbm/render/tileentity/RenderBoiler.java index 7c9c0899c..ac8af5573 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderBoiler.java +++ b/src/main/java/com/hbm/render/tileentity/RenderBoiler.java @@ -33,6 +33,13 @@ public class RenderBoiler extends TileEntitySpecialRenderer implements IItemRend bindTexture(ResourceManager.boiler_tex); TileEntityHeatBoiler boiler = (TileEntityHeatBoiler) tile; if(!boiler.hasExploded) { + + if(boiler.tanks[1].getFill() > boiler.tanks[1].getMaxFill() * 0.9) { + double sine = Math.sin(System.currentTimeMillis() / 50D % (Math.PI * 2)); + sine *= 0.01D; + GL11.glScaled(1 - sine, 1 + sine, 1 - sine); + } + GL11.glEnable(GL11.GL_CULL_FACE); ResourceManager.boiler.renderAll(); } else { diff --git a/src/main/java/com/hbm/render/tileentity/RendererObjTester.java b/src/main/java/com/hbm/render/tileentity/RendererObjTester.java index 53dcfb817..4658a45ee 100644 --- a/src/main/java/com/hbm/render/tileentity/RendererObjTester.java +++ b/src/main/java/com/hbm/render/tileentity/RendererObjTester.java @@ -10,6 +10,7 @@ import org.lwjgl.opengl.GL12; import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.util.BeamPronter; +import com.hbm.render.util.HorsePronter; import com.hbm.render.util.RenderMiscEffects; import com.hbm.render.util.BeamPronter.EnumBeamType; import com.hbm.render.util.BeamPronter.EnumWaveType; @@ -39,7 +40,30 @@ public class RendererObjTester extends TileEntitySpecialRenderer { } @Override - public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + + this.bindTexture(HorsePronter.tex_demohorse); + HorsePronter.reset(); + //HorsePronter.pose(HorsePronter.id_lfl, 0, System.currentTimeMillis() % 360 / 10D, 0); + double r = 60; + HorsePronter.pose(HorsePronter.id_body, 0, -r, 0); + HorsePronter.pose(HorsePronter.id_tail, 0, 45, 90); + HorsePronter.pose(HorsePronter.id_lbl, 0, -90 + r, 35); + HorsePronter.pose(HorsePronter.id_rbl, 0, -90 + r, -35); + HorsePronter.pose(HorsePronter.id_lfl, 0, r - 10, 5); + HorsePronter.pose(HorsePronter.id_rfl, 0, r - 10, -5); + HorsePronter.pose(HorsePronter.id_head, 0, r, 0); + HorsePronter.enableHorn(); + HorsePronter.pront(); + + GL11.glPopMatrix(); + } + + + public void renderTileEntityAt2(TileEntity tileEntity, double x, double y, double z, float f) { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y, z + 0.5); diff --git a/src/main/java/com/hbm/render/util/HorsePronter.java b/src/main/java/com/hbm/render/util/HorsePronter.java index 94aab581c..e47629125 100644 --- a/src/main/java/com/hbm/render/util/HorsePronter.java +++ b/src/main/java/com/hbm/render/util/HorsePronter.java @@ -13,26 +13,26 @@ public class HorsePronter { public static final IModelCustom horse = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/horse.obj"), false).asDisplayList(); - public static final ResourceLocation tex_demohorse = new ResourceLocation(RefStrings.MODID, "textures/models/horse/horse_template.png"); + public static final ResourceLocation tex_demohorse = new ResourceLocation(RefStrings.MODID, "textures/models/horse/horse_demo.png"); - private Vec3[] pose = new Vec3[] { + private static Vec3[] pose = new Vec3[] { Vec3.createVectorHelper(0, 0, 0), //head Vec3.createVectorHelper(0, 0, 0), //left front leg Vec3.createVectorHelper(0, 0, 0), //right front leg Vec3.createVectorHelper(0, 0, 0), //left back leg - Vec3.createVectorHelper(0, 0, 0), //left back leg + Vec3.createVectorHelper(0, 0, 0), //right back leg Vec3.createVectorHelper(0, 0, 0), //tail Vec3.createVectorHelper(0, 0, 0), //body Vec3.createVectorHelper(0, 0, 0) //body offset }; - private Vec3[] offsets = new Vec3[] { - Vec3.createVectorHelper(0, 0, 0), //head - Vec3.createVectorHelper(0, 0, 0), //left front leg - Vec3.createVectorHelper(0, 0, 0), //right front leg - Vec3.createVectorHelper(0, 0, 0), //left back leg - Vec3.createVectorHelper(0, 0, 0), //left back leg - Vec3.createVectorHelper(0, 0, 0), //tail + private static Vec3[] offsets = new Vec3[] { + Vec3.createVectorHelper(0, 1.125, 0.375), //head + Vec3.createVectorHelper(0.125, 0.75, 0.3125), //left front leg + Vec3.createVectorHelper(-0.125, 0.75, 0.3125), //right front leg + Vec3.createVectorHelper(0.125, 0.75, -0.25), //left back leg + Vec3.createVectorHelper(-0.125, 0.75, -0.25), //right back leg + Vec3.createVectorHelper(0, 1.125, -0.4375), //tail Vec3.createVectorHelper(0, 0, 0), //body Vec3.createVectorHelper(0, 0, 0) //body offset }; @@ -46,11 +46,11 @@ public class HorsePronter { public static final int id_body = 6; public static final int id_position = 7; - private boolean wings = false; - private boolean horn = false; - private boolean maleSnoot = false; + private static boolean wings = false; + private static boolean horn = false; + private static boolean maleSnoot = false; - public void reset() { + public static void reset() { wings = false; horn = false; @@ -62,22 +62,22 @@ public class HorsePronter { } } - public void enableHorn() { horn = true; } - public void enableWings() { wings = true; } - public void setMaleSnoot() { maleSnoot = true; } + public static void enableHorn() { horn = true; } + public static void enableWings() { wings = true; } + public static void setMaleSnoot() { maleSnoot = true; } - public void setAlicorn() { + public static void setAlicorn() { enableHorn(); enableWings(); } - public void pose(int id, double yaw, double pitch, double roll) { + public static void pose(int id, double yaw, double pitch, double roll) { pose[id].xCoord = yaw; pose[id].yCoord = pitch; pose[id].zCoord = roll; } - public void pront() { + public static void pront() { GL11.glPushMatrix(); doTransforms(id_body); @@ -85,9 +85,9 @@ public class HorsePronter { horse.renderPart("Body"); if(horn) { - renderWithTransform(id_head, "Head", maleSnoot ? "NoseMale" : "NoseFemale", "HornPointy"); + renderWithTransform(id_head, "Head", "Mane", maleSnoot ? "NoseMale" : "NoseFemale", "HornPointy"); } else { - renderWithTransform(id_head, "Head", maleSnoot ? "NoseMale" : "NoseFemale"); + renderWithTransform(id_head, "Head", "Mane", maleSnoot ? "NoseMale" : "NoseFemale"); } renderWithTransform(id_lfl, "LeftFrontLeg"); @@ -104,7 +104,7 @@ public class HorsePronter { GL11.glPopMatrix(); } - private void doTransforms(int id) { + private static void doTransforms(int id) { Vec3 rotation = pose[id]; Vec3 offset = offsets[id]; GL11.glTranslated(offset.xCoord, offset.yCoord, offset.zCoord); @@ -114,7 +114,7 @@ public class HorsePronter { GL11.glTranslated(-offset.xCoord, -offset.yCoord, -offset.zCoord); } - private void renderWithTransform(int id, String... parts) { + private static void renderWithTransform(int id, String... parts) { GL11.glPushMatrix(); doTransforms(id); for(String part : parts) horse.renderPart(part); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java index e60cea253..7a3dacf54 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java @@ -6,8 +6,11 @@ import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energy.IEnergyUser; import api.hbm.tile.IHeatSource; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyUser, INBTPacketReceiver { @@ -26,18 +29,19 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH this.trySubscribe(worldObj, xCoord + dir.offsetX * 3, yCoord, zCoord + dir.offsetZ * 3, dir); } - this.heatEnergy = 0; + this.heatEnergy *= 0.999; this.tryPullHeat(); if(setting > 0 && this.power >= this.getConsumption()) { this.power -= this.getConsumption(); - this.heatEnergy += setting * 100; + this.heatEnergy += getHeatGen(); } NBTTagCompound data = new NBTTagCompound(); data.setByte("s", (byte) this.setting); - data.setInteger("h", heatEnergy); + data.setInteger("h", this.heatEnergy); + INBTPacketReceiver.networkPack(this, data, 25); } } @@ -47,12 +51,30 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH this.heatEnergy = nbt.getInteger("h"); } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + this.power = nbt.getLong("power"); + this.setting = nbt.getInteger("setting"); + this.heatEnergy = nbt.getInteger("heatEnergy"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setLong("power", power); + nbt.setInteger("setting", setting); + nbt.setInteger("heatEnergy", heatEnergy); + } + protected void tryPullHeat() { TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); if(con instanceof IHeatSource) { IHeatSource source = (IHeatSource) con; - this.heatEnergy += source.getHeatStored() * 0.75; + this.heatEnergy += source.getHeatStored() * 0.85; source.useUpHeat(source.getHeatStored()); } } @@ -70,13 +92,17 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH } public long getConsumption() { - return (long) Math.pow(setting * 200, 1.4D); + return (long) (Math.pow(setting, 1.4D) * 200D); } @Override public long getMaxPower() { return getConsumption() * 20; } + + public int getHeatGen() { + return this.setting * 100; + } @Override public void setPower(long power) { @@ -92,4 +118,29 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH public void useUpHeat(int heat) { this.heatEnergy = Math.max(0, this.heatEnergy - heat); } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 2, + yCoord, + zCoord - 2, + xCoord + 3, + yCoord + 1, + zCoord + 3 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index a8088b0ba..6ff8568b3 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3431,6 +3431,8 @@ tile.hadron_power_100m.name=Teilchenbeschleuniger-Stromanschluss (100MHE) tile.hadron_power_1g.name=Teilchenbeschleuniger-Stromanschluss (1GHE) tile.hadron_power_10g.name=Teilchenbeschleuniger-Stromanschluss (10GHE) tile.hazmat.name=Strahlenschutzstoff-Block +tile.heater_electric.name=Elektrische Heizung +tile.heater_electric.desc=Erzeugt Wärme aus Strom.$Nimmt von unten Wärme mit 85%% Effizienz auf.$Kann mit einem Schraubenzeiher konfiguriert werden. tile.heater_firebox.name=Feuerbüchse tile.heater_firebox.desc=Erzeugt Wärme aus Festbrennstoff. tile.heater_oilburner.name=Brenner diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 9e11ff5f8..e7dee54f0 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3869,6 +3869,8 @@ tile.hadron_power_100m.name=Particle Accelerator Power Plug (100MHE) tile.hadron_power_1g.name=Particle Accelerator Power Plug (1GHE) tile.hadron_power_10g.name=Particle Accelerator Power Plug (10GHE) tile.hazmat.name=Hazmat Cloth Block +tile.heater_electric.name=Electric Heater +tile.heater_electric.desc=Uses energy to produce heat.$Accepts heat from the bottom with 85%% efficiency.$Can be configured with a screwdriver. tile.heater_firebox.name=Firebox tile.heater_firebox.desc=Burns solid fuel to produce heat. tile.heater_oilburner.name=Fluid Burner From 8130b628214f9cec129e74d12b650d93673d3876 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 11 Oct 2022 22:45:34 +0200 Subject: [PATCH 104/111] spring cleaning, added missing stairs --- src/main/java/com/hbm/blocks/ModBlocks.java | 108 +++---- .../java/com/hbm/blocks/bomb/CelPrime.java | 83 ------ .../com/hbm/blocks/bomb/CelPrimePart.java | 73 ----- .../blocks/generic/BlockGenericStairs.java | 9 +- .../hbm/blocks/generic/BlockMultiSlab.java | 14 +- .../blocks/machine/DummyBlockCyclotron.java | 59 ---- .../hbm/blocks/machine/DummyBlockFlare.java | 59 ---- .../hbm/blocks/machine/DummyBlockRadGen.java | 105 ------- .../com/hbm/blocks/network/BlockCable.java | 6 +- src/main/java/com/hbm/blocks/test/TestBB.java | 11 - .../com/hbm/blocks/test/TestConductor.java | 44 --- .../com/hbm/blocks/test/TestContainer.java | 266 ------------------ .../hbm/blocks/test/TestRotationTester.java | 72 ----- .../java/com/hbm/blocks/test/TestTicker.java | 48 ---- .../java/com/hbm/entity/mob/EntityFBI.java | 2 +- src/main/java/com/hbm/handler/GUIHandler.java | 14 - src/main/java/com/hbm/lib/Library.java | 7 - src/main/java/com/hbm/main/ClientProxy.java | 2 - .../java/com/hbm/main/CraftingManager.java | 10 + src/main/java/com/hbm/main/MainRegistry.java | 21 ++ src/main/java/com/hbm/main/NEIConfig.java | 8 - .../com/hbm/render/block/RenderCable.java | 4 +- .../item/block/ItemRenderTestContainer.java | 30 -- .../java/com/hbm/tileentity/TileMappings.java | 2 - .../deco/TileEntityRotationTester.java | 18 -- .../deco/TileEntityTestContainer.java | 213 -------------- 26 files changed, 96 insertions(+), 1192 deletions(-) delete mode 100644 src/main/java/com/hbm/blocks/bomb/CelPrime.java delete mode 100644 src/main/java/com/hbm/blocks/bomb/CelPrimePart.java delete mode 100644 src/main/java/com/hbm/blocks/machine/DummyBlockCyclotron.java delete mode 100644 src/main/java/com/hbm/blocks/machine/DummyBlockFlare.java delete mode 100644 src/main/java/com/hbm/blocks/machine/DummyBlockRadGen.java delete mode 100644 src/main/java/com/hbm/blocks/test/TestBB.java delete mode 100644 src/main/java/com/hbm/blocks/test/TestConductor.java delete mode 100644 src/main/java/com/hbm/blocks/test/TestContainer.java delete mode 100644 src/main/java/com/hbm/blocks/test/TestRotationTester.java delete mode 100644 src/main/java/com/hbm/blocks/test/TestTicker.java delete mode 100644 src/main/java/com/hbm/render/item/block/ItemRenderTestContainer.java delete mode 100644 src/main/java/com/hbm/tileentity/deco/TileEntityRotationTester.java delete mode 100644 src/main/java/com/hbm/tileentity/deco/TileEntityTestContainer.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index af554d68b..d9cdcaed4 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -38,24 +38,17 @@ public class ModBlocks { } public static Block test_render; - public static Block test_container; public static Block test_bomb; public static Block test_bomb_advanced; public static Block test_nuke; public static final int guiID_test_nuke = 2; public static Block event_tester; - public static Block rotation_tester; public static Block obj_tester; - public static Block test_ticker; - public static Block test_missile; public static Block test_core; public static Block test_charge; - public static Block test_conductor; public static Block test_pipe; public static Block test_ct; public static Block test_rail; - public static Block test_bb_bork; - public static Block test_bb_inf; public static Block structure_anchor; public static Block ore_uranium; @@ -356,6 +349,18 @@ public class ModBlocks { public static Block concrete_asbestos_stairs; public static Block ducrete_smooth_stairs; public static Block ducrete_stairs; + public static Block brick_concrete_stairs; + public static Block brick_concrete_mossy_stairs; + public static Block brick_concrete_cracked_stairs; + public static Block brick_concrete_broken_stairs; + public static Block brick_ducrete_stairs; + public static Block reinforced_stone_stairs; + public static Block reinforced_brick_stairs; + public static Block brick_obsidian_stairs; + public static Block brick_light_stairs; + public static Block brick_compound_stairs; + public static Block brick_asbestos_stairs; + public static Block brick_fire_stairs; public static Block cmb_brick; public static Block cmb_brick_reinforced; @@ -635,13 +640,6 @@ public class ModBlocks { public static final int guiID_nuke_fstbmb = 96; public static Block bomb_multi; public static final int guiID_bomb_multi = 10; - - public static Block cel_prime; - public static final int guiID_cel_prime = 62; - public static Block cel_prime_terminal; - public static Block cel_prime_battery; - public static Block cel_prime_port; - public static Block cel_prime_tanks; public static Block heater_firebox; public static Block heater_oilburner; @@ -774,7 +772,6 @@ public class ModBlocks { public static Block cable_detector; public static Block cable_diode; public static Block machine_detector; - public static Block rf_cable; public static Block oil_duct_solid; public static Block oil_duct; public static Block gas_duct_solid; @@ -1251,20 +1248,14 @@ public class ModBlocks { public static Block volcano_core; - public static Block dummy_block_flare; - public static Block dummy_port_flare; public static Block dummy_block_drill; public static Block dummy_port_drill; public static Block dummy_block_assembler; public static Block dummy_port_assembler; - public static Block dummy_block_chemplant; - public static Block dummy_port_chemplant; public static Block dummy_block_fluidtank; public static Block dummy_port_fluidtank; public static Block dummy_block_refinery; public static Block dummy_port_refinery; - public static Block dummy_block_pumpjack; - public static Block dummy_port_pumpjack; public static Block dummy_block_turbofan; public static Block dummy_port_turbofan; public static Block dummy_block_ams_limiter; @@ -1273,8 +1264,6 @@ public class ModBlocks { public static Block dummy_port_ams_emitter; public static Block dummy_block_ams_base; public static Block dummy_port_ams_base; - public static Block dummy_block_radgen; - public static Block dummy_port_radgen; public static Block dummy_block_vault; public static Block dummy_block_blast; public static Block dummy_block_uf6; @@ -1313,23 +1302,16 @@ public class ModBlocks { private static void initializeBlock() { test_render = new TestRender(Material.rock).setBlockName("test_render").setCreativeTab(null); - test_container = new TestContainer(0).setBlockName("test_container").setCreativeTab(null); test_bomb = new TestBomb(Material.tnt).setBlockName("test_bomb").setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":test_bomb"); test_bomb_advanced = new TestBombAdvanced(Material.tnt).setBlockName("test_bomb_advanced").setCreativeTab(null); test_nuke = new TestNuke(Material.iron).setBlockName("test_nuke").setCreativeTab(null).setHardness(2.5F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":test_nuke"); event_tester = new TestEventTester(Material.iron).setBlockName("event_tester").setCreativeTab(null).setHardness(2.5F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":event_tester"); - rotation_tester = new TestRotationTester(Material.iron).setBlockName("rotation_tester").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F); obj_tester = new TestObjTester(Material.iron).setBlockName("obj_tester").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F); - test_ticker = new TestTicker(Material.iron).setBlockName("test_ticker").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_ticker"); - test_missile = new TestMissile(Material.iron).setBlockName("test_missile").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_missile"); test_core = new TestCore(Material.iron).setBlockName("test_core").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_core"); test_charge = new TestCharge(Material.iron).setBlockName("test_charge").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F); - test_conductor = new TestConductor(Material.iron).setBlockName("test_conductor").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cable_neo"); test_pipe = new TestPipe(Material.iron).setBlockName("test_pipe").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":pipe_neo"); test_ct = new TestCT(Material.iron).setBlockName("test_ct").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_ct"); test_rail = new TestRail(Material.iron).setBlockName("test_rail").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_rail"); - test_bb_bork = new TestBB(Material.iron).setBlockName("test_bb_bork").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_bb_bork"); - test_bb_inf = new TestBB(Material.iron).setBlockName("test_bb_inf").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_bb_inf"); structure_anchor = new BlockGeneric(Material.iron).setBlockName("structure_anchor").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":structure_anchor"); ore_uranium = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_uranium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_uranium"); @@ -1625,15 +1607,28 @@ public class ModBlocks { concrete_slab = new BlockMultiSlab(null, Material.rock, concrete_smooth, concrete, concrete_asbestos, ducrete_smooth, ducrete).setBlockName("concrete_slab").setCreativeTab(MainRegistry.blockTab); concrete_double_slab = new BlockMultiSlab(concrete_slab, Material.rock, concrete_smooth, concrete, concrete_asbestos, ducrete_smooth, ducrete).setBlockName("concrete_double_slab").setCreativeTab(MainRegistry.blockTab); concrete_brick_slab = new BlockMultiSlab(null, Material.rock, brick_concrete, brick_concrete_mossy, brick_concrete_cracked, brick_concrete_broken, brick_ducrete).setBlockName("concrete_brick_slab").setCreativeTab(MainRegistry.blockTab); - concrete_brick_double_slab = new BlockMultiSlab(concrete_slab, Material.rock, brick_concrete, brick_concrete_mossy, brick_concrete_cracked, brick_concrete_broken, brick_ducrete).setBlockName("concrete_brick_double_slab").setCreativeTab(MainRegistry.blockTab); + concrete_brick_double_slab = new BlockMultiSlab(concrete_brick_slab, Material.rock, brick_concrete, brick_concrete_mossy, brick_concrete_cracked, brick_concrete_broken, brick_ducrete).setBlockName("concrete_brick_double_slab").setCreativeTab(MainRegistry.blockTab); brick_slab = new BlockMultiSlab(null, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_slab").setCreativeTab(MainRegistry.blockTab); - brick_double_slab = new BlockMultiSlab(concrete_slab, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_double_slab").setCreativeTab(MainRegistry.blockTab); + brick_double_slab = new BlockMultiSlab(brick_slab, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_double_slab").setCreativeTab(MainRegistry.blockTab); concrete_smooth_stairs = new BlockGenericStairs(concrete_smooth, 0).setBlockName("concrete_smooth_stairs").setCreativeTab(MainRegistry.blockTab); concrete_stairs = new BlockGenericStairs(concrete, 0).setBlockName("concrete_stairs").setCreativeTab(MainRegistry.blockTab); concrete_asbestos_stairs = new BlockGenericStairs(concrete_asbestos, 0).setBlockName("concrete_asbestos_stairs").setCreativeTab(MainRegistry.blockTab); ducrete_smooth_stairs = new BlockGenericStairs(ducrete_smooth, 0).setBlockName("ducrete_smooth_stairs").setCreativeTab(MainRegistry.blockTab); ducrete_stairs = new BlockGenericStairs(ducrete, 0).setBlockName("ducrete_stairs").setCreativeTab(MainRegistry.blockTab); + brick_concrete_stairs = new BlockGenericStairs(brick_concrete, 0).setBlockName("brick_concrete_stairs").setCreativeTab(MainRegistry.blockTab); + brick_concrete_mossy_stairs = new BlockGenericStairs(brick_concrete_mossy, 0).setBlockName("brick_concrete_mossy_stairs").setCreativeTab(MainRegistry.blockTab); + brick_concrete_cracked_stairs = new BlockGenericStairs(brick_concrete_cracked, 0).setBlockName("brick_concrete_cracked_stairs").setCreativeTab(MainRegistry.blockTab); + brick_concrete_broken_stairs = new BlockGenericStairs(brick_concrete_broken, 0).setBlockName("brick_concrete_broken_stairs").setCreativeTab(MainRegistry.blockTab); + brick_ducrete_stairs = new BlockGenericStairs(brick_ducrete, 0).setBlockName("brick_ducrete_stairs").setCreativeTab(MainRegistry.blockTab); + reinforced_stone_stairs = new BlockGenericStairs(reinforced_stone, 0).setBlockName("reinforced_stone_stairs").setCreativeTab(MainRegistry.blockTab); + reinforced_brick_stairs = new BlockGenericStairs(reinforced_brick, 0).setBlockName("reinforced_brick_stairs").setCreativeTab(MainRegistry.blockTab); + brick_obsidian_stairs = new BlockGenericStairs(brick_obsidian, 0).setBlockName("brick_obsidian_stairs").setCreativeTab(MainRegistry.blockTab); + brick_light_stairs = new BlockGenericStairs(brick_light, 0).setBlockName("brick_light_stairs").setCreativeTab(MainRegistry.blockTab); + brick_compound_stairs = new BlockGenericStairs(brick_compound, 0).setBlockName("brick_compound_stairs").setCreativeTab(MainRegistry.blockTab); + brick_asbestos_stairs = new BlockGenericStairs(brick_asbestos, 0).setBlockName("brick_asbestos_stairs").setCreativeTab(MainRegistry.blockTab); + brick_fire_stairs = new BlockGenericStairs(brick_fire, 0).setBlockName("brick_fire_stairs").setCreativeTab(MainRegistry.blockTab); + tile_lab = new BlockOutgas(Material.rock, false, 5, true).setBlockName("tile_lab").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(1.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":tile_lab"); tile_lab_cracked = new BlockOutgas(Material.rock, false, 5, true).setBlockName("tile_lab_cracked").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(1.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":tile_lab_cracked"); @@ -1800,12 +1795,6 @@ public class ModBlocks { nuke_n45 = new NukeN45(Material.iron).setBlockName("nuke_n45").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); nuke_fstbmb = new NukeBalefire(Material.iron, guiID_nuke_fstbmb).setBlockName("nuke_fstbmb").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":nuke_fstbmb"); - cel_prime = new CelPrime(Material.iron).setBlockName("cel_prime").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - cel_prime_terminal = new CelPrimePart(Material.iron).setBlockName("cel_prime_terminal").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - cel_prime_battery = new CelPrimePart(Material.iron).setBlockName("cel_prime_battery").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - cel_prime_port = new CelPrimePart(Material.iron).setBlockName("cel_prime_port").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - cel_prime_tanks = new CelPrimePart(Material.iron).setBlockName("cel_prime_tanks").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - bomb_multi = new BombMulti(Material.iron).setBlockName("bomb_multi").setCreativeTab(MainRegistry.nukeTab).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":bomb_multi1"); //bomb_multi_large = new BombMultiLarge(Material.iron).setBlockName("bomb_multi_large").setCreativeTab(MainRegistry.tabNuke).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":bomb_multi_large"); @@ -1957,7 +1946,6 @@ public class ModBlocks { red_wire_coated = new WireCoated(Material.iron).setBlockName("red_wire_coated").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_wire_coated"); red_cable = new BlockCable(Material.iron).setBlockName("red_cable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":cable_neo"); red_cable_classic = new BlockCable(Material.iron).setBlockName("red_cable_classic").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_cable_classic"); - rf_cable = new BlockRFCable(Material.iron).setBlockName("rf_cable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":rf_cable_icon"); red_connector = new ConnectorRedWire(Material.iron).setBlockName("red_connector").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_connector"); red_pylon = new PylonRedWire(Material.iron).setBlockName("red_pylon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); red_pylon_large = new PylonLarge(Material.iron).setBlockName("red_pylon_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon_large"); @@ -2356,20 +2344,14 @@ public class ModBlocks { Fluid liquidConcrete = new GenericFluid("concrete_liquid").setViscosity(2000); concrete_liquid = new GenericFiniteFluid(liquidConcrete, Material.rock, "concrete_liquid", "concrete_liquid_flowing").setQuantaPerBlock(4).setBlockName("concrete_liquid").setResistance(500F); - dummy_block_flare = new DummyBlockFlare(Material.iron, false).setBlockName("dummy_block_flare").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); - dummy_port_flare = new DummyBlockFlare(Material.iron, true).setBlockName("dummy_port_flare").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); dummy_block_drill = new DummyBlockDrill(Material.iron, false).setBlockName("dummy_block_drill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_lead"); dummy_port_drill = new DummyBlockDrill(Material.iron, true).setBlockName("dummy_port_drill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_lead"); dummy_block_assembler = new DummyBlockAssembler(Material.iron, false).setBlockName("dummy_block_assembler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_port_assembler = new DummyBlockAssembler(Material.iron, true).setBlockName("dummy_port_assembler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); - dummy_block_chemplant = new BlockGeneric(Material.iron).setBlockName("dummy_block_chemplant").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); - dummy_port_chemplant = new BlockGeneric(Material.iron).setBlockName("dummy_port_chemplant").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_fluidtank = new DummyBlockFluidTank(Material.iron, false).setBlockName("dummy_block_fluidtank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_port_fluidtank = new DummyBlockFluidTank(Material.iron, true).setBlockName("dummy_port_fluidtank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_refinery = new DummyBlockRefinery(Material.iron, false).setBlockName("dummy_block_refinery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); dummy_port_refinery = new DummyBlockRefinery(Material.iron, true).setBlockName("dummy_port_refinery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); - dummy_block_pumpjack = new BlockGeneric(Material.iron).setBlockName("dummy_block_pumpjack").setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); - dummy_port_pumpjack = new BlockGeneric(Material.iron).setBlockName("dummy_port_pumpjack").setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); dummy_block_turbofan = new DummyBlockTurbofan(Material.iron, false).setBlockName("dummy_block_turbofan").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_port_turbofan = new DummyBlockTurbofan(Material.iron, true).setBlockName("dummy_port_turbofan").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_ams_limiter = new DummyBlockAMSLimiter(Material.iron).setBlockName("dummy_block_ams_limiter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_copper"); @@ -2378,8 +2360,6 @@ public class ModBlocks { dummy_port_ams_emitter = new DummyBlockAMSEmitter(Material.iron).setBlockName("dummy_port_ams_emitter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_copper"); dummy_block_ams_base = new DummyBlockAMSBase(Material.iron).setBlockName("dummy_block_ams_base").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_copper"); dummy_port_ams_base = new DummyBlockAMSBase(Material.iron).setBlockName("dummy_port_ams_base").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_copper"); - dummy_block_radgen = new DummyBlockRadGen(Material.iron).setBlockName("dummy_block_radgen").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); - dummy_port_radgen = new DummyBlockRadGen(Material.iron).setBlockName("dummy_port_radgen").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_vault = new DummyBlockVault(Material.iron).setBlockName("dummy_block_vault").setHardness(10.0F).setResistance(10000.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_blast = new DummyBlockBlast(Material.iron).setBlockName("dummy_block_blast").setHardness(10.0F).setResistance(10000.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_uf6 = new DummyBlockMachine(Material.iron, guiID_uf6_tank, machine_uf6_tank, false).setBlockName("dummy_block_uf6").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); @@ -2411,18 +2391,12 @@ public class ModBlocks { GameRegistry.registerBlock(test_nuke, test_nuke.getUnlocalizedName()); GameRegistry.registerBlock(event_tester, event_tester.getUnlocalizedName()); - GameRegistry.registerBlock(rotation_tester, rotation_tester.getUnlocalizedName()); GameRegistry.registerBlock(obj_tester, obj_tester.getUnlocalizedName()); - GameRegistry.registerBlock(test_ticker, test_ticker.getUnlocalizedName()); - GameRegistry.registerBlock(test_missile, test_missile.getUnlocalizedName()); GameRegistry.registerBlock(test_core, test_core.getUnlocalizedName()); GameRegistry.registerBlock(test_charge, test_charge.getUnlocalizedName()); - GameRegistry.registerBlock(test_conductor, test_conductor.getUnlocalizedName()); GameRegistry.registerBlock(test_pipe, test_pipe.getUnlocalizedName()); GameRegistry.registerBlock(test_ct, test_ct.getUnlocalizedName()); GameRegistry.registerBlock(test_rail, test_rail.getUnlocalizedName()); - GameRegistry.registerBlock(test_bb_bork, test_bb_bork.getUnlocalizedName()); - GameRegistry.registerBlock(test_bb_inf, test_bb_inf.getUnlocalizedName()); GameRegistry.registerBlock(structure_anchor, structure_anchor.getUnlocalizedName()); //Ores @@ -2741,6 +2715,18 @@ public class ModBlocks { GameRegistry.registerBlock(concrete_stairs, concrete_stairs.getUnlocalizedName()); GameRegistry.registerBlock(concrete_asbestos_stairs, concrete_asbestos_stairs.getUnlocalizedName()); GameRegistry.registerBlock(ducrete_smooth_stairs, ducrete_smooth_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_concrete_stairs, brick_concrete_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_concrete_mossy_stairs, brick_concrete_mossy_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_concrete_cracked_stairs, brick_concrete_cracked_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_concrete_broken_stairs, brick_concrete_broken_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_ducrete_stairs, brick_ducrete_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(reinforced_stone_stairs, reinforced_stone_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(reinforced_brick_stairs, reinforced_brick_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_obsidian_stairs, brick_obsidian_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_light_stairs, brick_light_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_compound_stairs, brick_compound_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_asbestos_stairs, brick_asbestos_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_fire_stairs, brick_fire_stairs.getUnlocalizedName()); GameRegistry.registerBlock(ducrete_stairs, ducrete_stairs.getUnlocalizedName()); //CMB Building Elements @@ -2929,13 +2915,6 @@ public class ModBlocks { GameRegistry.registerBlock(mine_shrap, mine_shrap.getUnlocalizedName()); GameRegistry.registerBlock(mine_fat, mine_fat.getUnlocalizedName()); - //Wot - GameRegistry.registerBlock(cel_prime, cel_prime.getUnlocalizedName()); - GameRegistry.registerBlock(cel_prime_terminal, cel_prime_terminal.getUnlocalizedName()); - GameRegistry.registerBlock(cel_prime_battery, cel_prime_battery.getUnlocalizedName()); - GameRegistry.registerBlock(cel_prime_port, cel_prime_port.getUnlocalizedName()); - GameRegistry.registerBlock(cel_prime_tanks, cel_prime_tanks.getUnlocalizedName()); - //Block Bombs GameRegistry.registerBlock(flame_war, flame_war.getUnlocalizedName()); GameRegistry.registerBlock(float_bomb, float_bomb.getUnlocalizedName()); @@ -3153,7 +3132,6 @@ public class ModBlocks { GameRegistry.registerBlock(cable_detector, cable_detector.getUnlocalizedName()); GameRegistry.registerBlock(cable_diode, ItemBlockBase.class, cable_diode.getUnlocalizedName()); GameRegistry.registerBlock(machine_detector, machine_detector.getUnlocalizedName()); - GameRegistry.registerBlock(rf_cable, rf_cable.getUnlocalizedName()); GameRegistry.registerBlock(oil_duct, oil_duct.getUnlocalizedName()); GameRegistry.registerBlock(oil_duct_solid, oil_duct_solid.getUnlocalizedName()); GameRegistry.registerBlock(gas_duct, gas_duct.getUnlocalizedName()); @@ -3411,20 +3389,14 @@ public class ModBlocks { //GameRegistry.registerBlock(concrete_liquid, concrete_liquid.getUnlocalizedName()); //Multiblock Dummy Blocks - GameRegistry.registerBlock(dummy_block_flare, dummy_block_flare.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_port_flare, dummy_port_flare.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_drill, dummy_block_drill.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_drill, dummy_port_drill.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_assembler, dummy_block_assembler.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_assembler, dummy_port_assembler.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_block_chemplant, dummy_block_chemplant.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_port_chemplant, dummy_port_chemplant.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_fluidtank, dummy_block_fluidtank.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_fluidtank, dummy_port_fluidtank.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_refinery, dummy_block_refinery.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_refinery, dummy_port_refinery.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_block_pumpjack, dummy_block_pumpjack.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_port_pumpjack, dummy_port_pumpjack.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_turbofan, dummy_block_turbofan.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_turbofan, dummy_port_turbofan.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_ams_limiter, dummy_block_ams_limiter.getUnlocalizedName()); @@ -3433,8 +3405,6 @@ public class ModBlocks { GameRegistry.registerBlock(dummy_port_ams_emitter, dummy_port_ams_emitter.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_ams_base, dummy_block_ams_base.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_ams_base, dummy_port_ams_base.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_block_radgen, dummy_block_radgen.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_port_radgen, dummy_port_radgen.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_vault, dummy_block_vault.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_blast, dummy_block_blast.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_uf6, dummy_block_uf6.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/bomb/CelPrime.java b/src/main/java/com/hbm/blocks/bomb/CelPrime.java deleted file mode 100644 index 5c076bd16..000000000 --- a/src/main/java/com/hbm/blocks/bomb/CelPrime.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.hbm.blocks.bomb; - -import com.hbm.blocks.ModBlocks; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.bomb.TileEntityCelPrime; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class CelPrime extends BlockContainer { - - public CelPrime(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityCelPrime(); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) - { - return true; - } else if(!player.isSneaking()) - { - TileEntityCelPrime entity = (TileEntityCelPrime) world.getTileEntity(x, y, z); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_cel_prime, world, x, y, z); - } - return true; - } else { - return false; - } - } - - @Override - public int getRenderType(){ - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @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, 5, 2); - } - if(i == 1) - { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 2) - { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - if(i == 3) - { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - } - -} diff --git a/src/main/java/com/hbm/blocks/bomb/CelPrimePart.java b/src/main/java/com/hbm/blocks/bomb/CelPrimePart.java deleted file mode 100644 index 7631719f1..000000000 --- a/src/main/java/com/hbm/blocks/bomb/CelPrimePart.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.hbm.blocks.bomb; - -import com.hbm.blocks.ModBlocks; -import com.hbm.tileentity.bomb.TileEntityCelPrimeBattery; -import com.hbm.tileentity.bomb.TileEntityCelPrimePort; -import com.hbm.tileentity.bomb.TileEntityCelPrimeTanks; -import com.hbm.tileentity.bomb.TileEntityCelPrimeTerminal; - -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class CelPrimePart extends BlockContainer { - - public CelPrimePart(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - if(this == ModBlocks.cel_prime_terminal) - return new TileEntityCelPrimeTerminal(); - if(this == ModBlocks.cel_prime_battery) - return new TileEntityCelPrimeBattery(); - if(this == ModBlocks.cel_prime_port) - return new TileEntityCelPrimePort(); - if(this == ModBlocks.cel_prime_tanks) - return new TileEntityCelPrimeTanks(); - - return null; - } - - @Override - public int getRenderType(){ - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @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, 5, 2); - } - if(i == 1) - { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 2) - { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - if(i == 3) - { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - } -} diff --git a/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java b/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java index b94834e2f..4910221d7 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java +++ b/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java @@ -1,12 +1,19 @@ package com.hbm.blocks.generic; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.block.BlockStairs; public class BlockGenericStairs extends BlockStairs { + public static List recipeGen = new ArrayList(); + public BlockGenericStairs(Block block, int meta) { super(block, meta); + this.useNeighborBrightness = true; + + recipeGen.add(new Object[] {block, meta, this}); } - } diff --git a/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java b/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java index 97c8f000d..231bb58cb 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java +++ b/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java @@ -1,5 +1,6 @@ package com.hbm.blocks.generic; +import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -17,6 +18,8 @@ import net.minecraft.world.World; public class BlockMultiSlab extends BlockSlab { + public static List recipeGen = new ArrayList(); + public Block[] slabMaterials; public Block single; @@ -24,6 +27,13 @@ public class BlockMultiSlab extends BlockSlab { super(single != null, mat); this.single = single; this.slabMaterials = slabMaterials; + this.useNeighborBrightness = true; + + if(single == null) { + for(int i = 0; i < slabMaterials.length; i++) { + recipeGen.add(new Object[] {slabMaterials[i], this, i}); + } + } } @Override @@ -41,7 +51,7 @@ public class BlockMultiSlab extends BlockSlab { @Override protected ItemStack createStackedBlock(int meta) { - return new ItemStack(Item.getItemFromBlock(single != null ? single : this), 2, meta & 7); + return new ItemStack(Item.getItemFromBlock(single != null ? single : this), 2, (meta & 7) % slabMaterials.length); } @SideOnly(Side.CLIENT) @@ -58,7 +68,7 @@ public class BlockMultiSlab extends BlockSlab { @Override public int getDamageValue(World world, int x, int y, int z) { - return super.getDamageValue(world, x, y, z) & 7; + return (super.getDamageValue(world, x, y, z) & 7) % slabMaterials.length; } @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockCyclotron.java b/src/main/java/com/hbm/blocks/machine/DummyBlockCyclotron.java deleted file mode 100644 index 93381f760..000000000 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockCyclotron.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IDummy; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityDummy; -import com.hbm.tileentity.machine.TileEntityMachineCyclotron; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class DummyBlockCyclotron extends DummyOldBase { - - public DummyBlockCyclotron(Material p_i45386_1_, boolean port) { - super(p_i45386_1_, port); - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(ModBlocks.machine_cyclotron); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) - { - return true; - } else if(!player.isSneaking()) - { - TileEntity te = world.getTileEntity(x, y, z); - if(te != null && te instanceof TileEntityDummy) { - int a = ((TileEntityDummy)te).targetX; - int b = ((TileEntityDummy)te).targetY; - int c = ((TileEntityDummy)te).targetZ; - - TileEntityMachineCyclotron entity = (TileEntityMachineCyclotron) world.getTileEntity(a, b, c); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_machine_cyclotron, world, a, b, c); - } - } - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockFlare.java b/src/main/java/com/hbm/blocks/machine/DummyBlockFlare.java deleted file mode 100644 index 760add7d0..000000000 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockFlare.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IDummy; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityDummy; -import com.hbm.tileentity.machine.oil.TileEntityMachineGasFlare; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class DummyBlockFlare extends DummyOldBase { - - public DummyBlockFlare(Material p_i45386_1_, boolean port) { - super(p_i45386_1_, port); - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(ModBlocks.machine_flare); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) - { - return true; - } else if(!player.isSneaking()) - { - TileEntity te = world.getTileEntity(x, y, z); - if(te != null && te instanceof TileEntityDummy) { - int a = ((TileEntityDummy)te).targetX; - int b = ((TileEntityDummy)te).targetY; - int c = ((TileEntityDummy)te).targetZ; - - TileEntityMachineGasFlare entity = (TileEntityMachineGasFlare) world.getTileEntity(a, b, c); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_machine_flare, world, a, b, c); - } - } - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockRadGen.java b/src/main/java/com/hbm/blocks/machine/DummyBlockRadGen.java deleted file mode 100644 index 44503bc9e..000000000 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockRadGen.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IDummy; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityDummy; -import com.hbm.tileentity.machine.TileEntityMachineRadGen; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class DummyBlockRadGen extends BlockContainer implements IDummy { - - public static boolean safeBreak = false; - - public DummyBlockRadGen(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityDummy(); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int i) - { - if(!safeBreak) { - TileEntity te = world.getTileEntity(x, y, z); - if(te != null && te instanceof TileEntityDummy) { - int a = ((TileEntityDummy)te).targetX; - int b = ((TileEntityDummy)te).targetY; - int c = ((TileEntityDummy)te).targetZ; - - //world.getBlock(a, b, c).breakBlock(world, a, b, c, block, i); - if(!world.isRemote) - world.func_147480_a(a, b, c, true); - } - } - world.removeTileEntity(x, y, z); - } - - @Override - public int getRenderType() { - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) - { - return null; - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(ModBlocks.machine_radgen); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) - { - return true; - } else if(!player.isSneaking()) - { - TileEntity te = world.getTileEntity(x, y, z); - if(te != null && te instanceof TileEntityDummy) { - int a = ((TileEntityDummy)te).targetX; - int b = ((TileEntityDummy)te).targetY; - int c = ((TileEntityDummy)te).targetZ; - - TileEntityMachineRadGen entity = (TileEntityMachineRadGen) world.getTileEntity(a, b, c); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_radgen, world, a, b, c); - } - } - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/com/hbm/blocks/network/BlockCable.java b/src/main/java/com/hbm/blocks/network/BlockCable.java index ffc7c7f36..92fc65684 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCable.java +++ b/src/main/java/com/hbm/blocks/network/BlockCable.java @@ -1,7 +1,6 @@ package com.hbm.blocks.network; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.test.TestConductor; import com.hbm.lib.Library; import com.hbm.tileentity.network.TileEntityCableBaseNT; @@ -23,7 +22,8 @@ public class BlockCable extends BlockContainer { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityCableBaseNT(); } - + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); public static int renderIDClassic = RenderingRegistry.getNextAvailableRenderId(); @Override @@ -32,7 +32,7 @@ public class BlockCable extends BlockContainer { if(this == ModBlocks.red_cable_classic) return renderIDClassic; - return TestConductor.renderID; + return renderID; } @Override diff --git a/src/main/java/com/hbm/blocks/test/TestBB.java b/src/main/java/com/hbm/blocks/test/TestBB.java deleted file mode 100644 index 573cc0804..000000000 --- a/src/main/java/com/hbm/blocks/test/TestBB.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.blocks.test; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; - -public class TestBB extends Block { - - public TestBB(Material mat) { - super(mat); - } -} diff --git a/src/main/java/com/hbm/blocks/test/TestConductor.java b/src/main/java/com/hbm/blocks/test/TestConductor.java deleted file mode 100644 index 45c2684b0..000000000 --- a/src/main/java/com/hbm/blocks/test/TestConductor.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.hbm.blocks.test; - -import com.hbm.interfaces.Untested; -import com.hbm.tileentity.network.TileEntityCableBaseNT; - -import cpw.mods.fml.client.registry.RenderingRegistry; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -/** - * Powered by satan energy! - * @author hbm - */ -@Untested -public class TestConductor extends BlockContainer { - - public TestConductor(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityCableBaseNT(); - } - - public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - - @Override - public int getRenderType() { - return renderID; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } -} diff --git a/src/main/java/com/hbm/blocks/test/TestContainer.java b/src/main/java/com/hbm/blocks/test/TestContainer.java deleted file mode 100644 index 304beec6d..000000000 --- a/src/main/java/com/hbm/blocks/test/TestContainer.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.hbm.blocks.test; - -import static net.minecraftforge.common.util.ForgeDirection.DOWN; - -import java.util.Iterator; -import java.util.Random; - -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.deco.TileEntityTestContainer; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockChest; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.passive.EntityOcelot; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryLargeChest; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class TestContainer extends BlockChest { - - public TestContainer(int p_i45397_1_) { - super(p_i45397_1_); - } - - private final Random field_149955_b = new Random(); - - //Aktiviert durch: Platzieren. Bewirkt: Rotation des Blockes in Blickrichtung - @Override - public void onBlockPlacedBy(World p_149689_1_, int p_149689_2_, int p_149689_3_, int p_149689_4_, EntityLivingBase p_149689_5_, ItemStack p_149689_6_) - { - Block block = p_149689_1_.getBlock(p_149689_2_, p_149689_3_, p_149689_4_ - 1); - Block block1 = p_149689_1_.getBlock(p_149689_2_, p_149689_3_, p_149689_4_ + 1); - Block block2 = p_149689_1_.getBlock(p_149689_2_ - 1, p_149689_3_, p_149689_4_); - Block block3 = p_149689_1_.getBlock(p_149689_2_ + 1, p_149689_3_, p_149689_4_); - byte b0 = 0; - int l = MathHelper.floor_double(p_149689_5_.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if (l == 0) - { - b0 = 2; - } - - if (l == 1) - { - b0 = 5; - } - - if (l == 2) - { - b0 = 3; - } - - if (l == 3) - { - b0 = 4; - } - - if (block != this && block1 != this && block2 != this && block3 != this) - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, b0, 3); - } - else - { - if ((block == this || block1 == this) && (b0 == 4 || b0 == 5)) - { - if (block == this) - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_ - 1, b0, 3); - } - else - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_ + 1, b0, 3); - } - - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, b0, 3); - } - - if ((block2 == this || block3 == this) && (b0 == 2 || b0 == 3)) - { - if (block2 == this) - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_ - 1, p_149689_3_, p_149689_4_, b0, 3); - } - else - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_ + 1, p_149689_3_, p_149689_4_, b0, 3); - } - - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, b0, 3); - } - } - - if (p_149689_6_.hasDisplayName()) - { - ((TileEntityTestContainer)p_149689_1_.getTileEntity(p_149689_2_, p_149689_3_, p_149689_4_)).func_145976_a(p_149689_6_.getDisplayName()); - } - } - - //Aktiviert durch: Blockupdate. Bewirkt: Verbinden zweier Kisten - @Override - public void onNeighborBlockChange(World p_149695_1_, int p_149695_2_, int p_149695_3_, int p_149695_4_, Block p_149695_5_) - { - super.onNeighborBlockChange(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_, p_149695_5_); - TileEntityTestContainer tileentitychest = (TileEntityTestContainer)p_149695_1_.getTileEntity(p_149695_2_, p_149695_3_, p_149695_4_); - - if (tileentitychest != null) - { - tileentitychest.updateContainingBlockInfo(); - } - } - - //Aktiviert durch: Zerst�rung. Bewirkt: Droppt alle in ihm befindlichen Items - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) - { - TileEntityTestContainer tileentitychest = (TileEntityTestContainer)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if (tileentitychest != null) - { - for (int i1 = 0; i1 < tileentitychest.getSizeInventory(); ++i1) - { - ItemStack itemstack = tileentitychest.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.field_149955_b.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149955_b.nextFloat() * 0.8F + 0.1F; - EntityItem entityitem; - - for (float f2 = this.field_149955_b.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; p_149749_1_.spawnEntityInWorld(entityitem)) - { - int j1 = this.field_149955_b.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - float f3 = 0.05F; - entityitem.motionX = (float)this.field_149955_b.nextGaussian() * f3; - entityitem.motionY = (float)this.field_149955_b.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.field_149955_b.nextGaussian() * f3; - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } - - //Allgemeine Inventarfunktion - @Override - public IInventory func_149951_m(World p_149951_1_, int p_149951_2_, int p_149951_3_, int p_149951_4_) - { - Object object = p_149951_1_.getTileEntity(p_149951_2_, p_149951_3_, p_149951_4_); - - if (object == null) - { - return null; - } - else if (p_149951_1_.isSideSolid(p_149951_2_, p_149951_3_ + 1, p_149951_4_, DOWN)) - { - return null; - } - else if (func_149953_o(p_149951_1_, p_149951_2_, p_149951_3_, p_149951_4_)) - { - return null; - } - else if (p_149951_1_.getBlock(p_149951_2_ - 1, p_149951_3_, p_149951_4_) == this && (p_149951_1_.isSideSolid(p_149951_2_ - 1, p_149951_3_ + 1, p_149951_4_, DOWN) || func_149953_o(p_149951_1_, p_149951_2_ - 1, p_149951_3_, p_149951_4_))) - { - return null; - } - else if (p_149951_1_.getBlock(p_149951_2_ + 1, p_149951_3_, p_149951_4_) == this && (p_149951_1_.isSideSolid(p_149951_2_ + 1, p_149951_3_ + 1, p_149951_4_, DOWN) || func_149953_o(p_149951_1_, p_149951_2_ + 1, p_149951_3_, p_149951_4_))) - { - return null; - } - else if (p_149951_1_.getBlock(p_149951_2_, p_149951_3_, p_149951_4_ - 1) == this && (p_149951_1_.isSideSolid(p_149951_2_, p_149951_3_ + 1, p_149951_4_ - 1, DOWN) || func_149953_o(p_149951_1_, p_149951_2_, p_149951_3_, p_149951_4_ - 1))) - { - return null; - } - else if (p_149951_1_.getBlock(p_149951_2_, p_149951_3_, p_149951_4_ + 1) == this && (p_149951_1_.isSideSolid(p_149951_2_, p_149951_3_ + 1, p_149951_4_ + 1, DOWN) || func_149953_o(p_149951_1_, p_149951_2_, p_149951_3_, p_149951_4_ + 1))) - { - return null; - } - else - { - if (p_149951_1_.getBlock(p_149951_2_ - 1, p_149951_3_, p_149951_4_) == this) - { - object = new InventoryLargeChest("container.testContainer", (TileEntityTestContainer)p_149951_1_.getTileEntity(p_149951_2_ - 1, p_149951_3_, p_149951_4_), (IInventory)object); - } - - if (p_149951_1_.getBlock(p_149951_2_ + 1, p_149951_3_, p_149951_4_) == this) - { - object = new InventoryLargeChest("container.testContainer", (IInventory)object, (TileEntityTestContainer)p_149951_1_.getTileEntity(p_149951_2_ + 1, p_149951_3_, p_149951_4_)); - } - - if (p_149951_1_.getBlock(p_149951_2_, p_149951_3_, p_149951_4_ - 1) == this) - { - object = new InventoryLargeChest("container.testContainer", (TileEntityTestContainer)p_149951_1_.getTileEntity(p_149951_2_, p_149951_3_, p_149951_4_ - 1), (IInventory)object); - } - - if (p_149951_1_.getBlock(p_149951_2_, p_149951_3_, p_149951_4_ + 1) == this) - { - object = new InventoryLargeChest("container.testContainer", (IInventory)object, (TileEntityTestContainer)p_149951_1_.getTileEntity(p_149951_2_, p_149951_3_, p_149951_4_ + 1)); - } - - return (IInventory)object; - } - } - - //Bewirkt, dass sich Katzen draufsetzen - private static boolean func_149953_o(World p_149953_0_, int p_149953_1_, int p_149953_2_, int p_149953_3_) - { - Iterator iterator = p_149953_0_.getEntitiesWithinAABB(EntityOcelot.class, AxisAlignedBB.getBoundingBox(p_149953_1_, p_149953_2_ + 1, p_149953_3_, p_149953_1_ + 1, p_149953_2_ + 2, p_149953_3_ + 1)).iterator(); - EntityOcelot entityocelot; - - do - { - if (!iterator.hasNext()) - { - return false; - } - - Entity entity = (Entity)iterator.next(); - entityocelot = (EntityOcelot)entity; - } - while (!entityocelot.isSitting()); - - return true; - } - - //Erzeugt ein neues Tileentity - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) - { - TileEntityTestContainer tileentitychest = new TileEntityTestContainer(); - return tileentitychest; - } - - //Registriert das Inventaricon - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister p_149651_1_) - { - this.blockIcon = p_149651_1_.registerIcon(RefStrings.MODID + ":test_container"); - } -} diff --git a/src/main/java/com/hbm/blocks/test/TestRotationTester.java b/src/main/java/com/hbm/blocks/test/TestRotationTester.java deleted file mode 100644 index 76e29c5b3..000000000 --- a/src/main/java/com/hbm/blocks/test/TestRotationTester.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.hbm.blocks.test; - -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.deco.TileEntityRotationTester; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class TestRotationTester extends BlockContainer { - - public TestRotationTester(Material p_i45394_1_) { - super(p_i45394_1_); - } - - @Override - public int getRenderType(){ - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - - @Override - public TileEntity createNewTileEntity(World var1, int var2) { - return new TileEntityRotationTester(); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconregister) { - this.blockIcon = iconregister.registerIcon(RefStrings.MODID + ":test_render"); - } - - @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); - } - if(i == 1) - { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - if(i == 2) - { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 3) - { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - } - -} diff --git a/src/main/java/com/hbm/blocks/test/TestTicker.java b/src/main/java/com/hbm/blocks/test/TestTicker.java deleted file mode 100644 index c2e434ae8..000000000 --- a/src/main/java/com/hbm/blocks/test/TestTicker.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.hbm.blocks.test; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.config.GeneralConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.world.World; - -public class TestTicker extends Block { - - public TestTicker(Material p_i45394_1_) { - super(p_i45394_1_); - this.setTickRandomly(true); - } - - @Override - public void updateTick(World world, int x, int y, int z, Random rand) { - - if(GeneralConfig.enableVirus) { - if(world.getBlock(x + 1, y, z) != ModBlocks.test_ticker) { - world.setBlock(x + 1, y, z, ModBlocks.test_ticker); - } - - if(world.getBlock(x, y + 1, z) != ModBlocks.test_ticker) { - world.setBlock(x, y + 1, z, ModBlocks.test_ticker); - } - - if(world.getBlock(x, y, z + 1) != ModBlocks.test_ticker) { - world.setBlock(x, y, z + 1, ModBlocks.test_ticker); - } - - if(world.getBlock(x - 1, y, z) != ModBlocks.test_ticker) { - world.setBlock(x - 1, y, z, ModBlocks.test_ticker); - } - - if(world.getBlock(x, y - 1, z) != ModBlocks.test_ticker) { - world.setBlock(x, y - 1, z, ModBlocks.test_ticker); - } - - if(world.getBlock(x, y, z - 1) != ModBlocks.test_ticker) { - world.setBlock(x, y, z - 1, ModBlocks.test_ticker); - } - } - } -} diff --git a/src/main/java/com/hbm/entity/mob/EntityFBI.java b/src/main/java/com/hbm/entity/mob/EntityFBI.java index fbbd5e6e6..f0ec89070 100644 --- a/src/main/java/com/hbm/entity/mob/EntityFBI.java +++ b/src/main/java/com/hbm/entity/mob/EntityFBI.java @@ -158,7 +158,7 @@ public class EntityFBI extends EntityMob implements IRangedAttackMob { canDestroy.add(ModBlocks.machine_press); canDestroy.add(ModBlocks.machine_epress); canDestroy.add(ModBlocks.dummy_block_assembler); - canDestroy.add(ModBlocks.dummy_block_chemplant); + canDestroy.add(ModBlocks.machine_chemplant); canDestroy.add(ModBlocks.machine_crystallizer); canDestroy.add(ModBlocks.machine_turbine); canDestroy.add(ModBlocks.machine_large_turbine); diff --git a/src/main/java/com/hbm/handler/GUIHandler.java b/src/main/java/com/hbm/handler/GUIHandler.java index 3aa597ed9..a2524ec75 100644 --- a/src/main/java/com/hbm/handler/GUIHandler.java +++ b/src/main/java/com/hbm/handler/GUIHandler.java @@ -422,13 +422,6 @@ public class GUIHandler implements IGuiHandler { return null; } - case ModBlocks.guiID_cel_prime: { - if(entity instanceof TileEntityCelPrime) { - return new ContainerCelPrime(player.inventory, (TileEntityCelPrime) entity); - } - return null; - } - case ModBlocks.guiID_machine_selenium: { if(entity instanceof TileEntityMachineSeleniumEngine) { return new ContainerMachineSelenium(player.inventory, (TileEntityMachineSeleniumEngine) entity); @@ -1234,13 +1227,6 @@ public class GUIHandler implements IGuiHandler { return null; } - case ModBlocks.guiID_cel_prime: { - if(entity instanceof TileEntityCelPrime) { - return new GUICelPrime(player.inventory, (TileEntityCelPrime) entity); - } - return null; - } - case ModBlocks.guiID_machine_selenium: { if(entity instanceof TileEntityMachineSeleniumEngine) { return new GUIMachineSelenium(player.inventory, (TileEntityMachineSeleniumEngine) entity); diff --git a/src/main/java/com/hbm/lib/Library.java b/src/main/java/com/hbm/lib/Library.java index 78c66c4ec..d9926e148 100644 --- a/src/main/java/com/hbm/lib/Library.java +++ b/src/main/java/com/hbm/lib/Library.java @@ -164,10 +164,8 @@ public class Library { return true; if((tileentity != null && (tileentity instanceof IFluidAcceptor || tileentity instanceof IFluidSource)) || - world.getBlock(x, y, z) == ModBlocks.dummy_port_flare || world.getBlock(x, y, z) == ModBlocks.dummy_port_fluidtank || world.getBlock(x, y, z) == ModBlocks.dummy_port_refinery || - world.getBlock(x, y, z) == ModBlocks.dummy_port_pumpjack || world.getBlock(x, y, z) == ModBlocks.dummy_port_turbofan || world.getBlock(x, y, z) == ModBlocks.reactor_hatch || world.getBlock(x, y, z) == ModBlocks.reactor_conductor || @@ -414,11 +412,6 @@ public class Library { { tileentity = worldObj.getTileEntity(((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetX, ((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetY, ((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetZ); } - //Gas Flare - if(block == ModBlocks.dummy_port_flare) - { - tileentity = worldObj.getTileEntity(((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetX, ((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetY, ((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetZ); - } //Turbofan if(block == ModBlocks.dummy_port_turbofan) { diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 9c5228c6c..598a47103 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -139,7 +139,6 @@ public class ClientProxy extends ServerProxy { //test crap ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTestRender.class, new RenderTestRender()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTestBombAdvanced.class, new RenderTestBombAdvanced()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRotationTester.class, new RenderRotationTester()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityObjTester.class, new RendererObjTester()); //deco ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDecoPoleSatelliteReceiver.class, new RenderPoleSatelliteReceiver()); @@ -381,7 +380,6 @@ public class ClientProxy extends ServerProxy { //test crap - MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.test_container), new ItemRenderTestContainer()); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.test_bomb_advanced), new ItemRenderTestBombAdvanced()); //templates MinecraftForgeClient.registerItemRenderer(ModItems.assembly_template, new ItemRenderTemplate()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 9b0c595be..98a15001b 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -2,8 +2,11 @@ package com.hbm.main; import java.util.ArrayList; import java.util.List; +import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockGenericStairs; +import com.hbm.blocks.generic.BlockMultiSlab; import com.hbm.blocks.generic.BlockNTMFlower.EnumFlowerType; import com.hbm.config.GeneralConfig; import com.hbm.crafting.*; @@ -64,6 +67,13 @@ public class CraftingManager { } public static void AddCraftingRec() { + + for(Object[] array : BlockMultiSlab.recipeGen) { + addRecipeAuto(new ItemStack((Block) array[1], 6, (int) array[2]), new Object[] { "###", '#', (Block) array[0] }); + } + for(Object[] array : BlockGenericStairs.recipeGen) { + addRecipeAuto(new ItemStack((Block) array[2], 4), new Object[] { "# ", "## ", "###", '#', new ItemStack((Block) array[0], 1, (int) array[1]) }); + } addRecipeAuto(new ItemStack(ModItems.redstone_sword, 1), new Object[] { "R", "R", "S", 'R', REDSTONE.block(), 'S', KEY_STICK }); addRecipeAuto(new ItemStack(ModItems.big_sword, 1), new Object[] { "QIQ", "QIQ", "GSG", 'G', Items.gold_ingot, 'S', KEY_STICK, 'I', Items.iron_ingot, 'Q', Items.quartz}); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 2233bbaec..2c083f13f 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -955,6 +955,27 @@ public class MainRegistry { ignoreMappings.add("hbm:item.turret_flamer_ammo"); ignoreMappings.add("hbm:item.turret_tau_ammo"); ignoreMappings.add("hbm:item.turret_cwis_ammo"); + ignoreMappings.add("hbm:tile.cel_prime"); + ignoreMappings.add("hbm:tile.cel_prime_terminal"); + ignoreMappings.add("hbm:tile.cel_prime_battery"); + ignoreMappings.add("hbm:tile.cel_prime_port"); + ignoreMappings.add("hbm:tile.cel_prime_tanks"); + ignoreMappings.add("hbm:tile.rf_cable"); + ignoreMappings.add("hbm:tile.test_container"); + ignoreMappings.add("hbm:tile.test_bb_bork"); + ignoreMappings.add("hbm:tile.test_bb_inf"); + ignoreMappings.add("hbm:tile.test_missile"); + ignoreMappings.add("hbm:tile.rotation_tester"); + ignoreMappings.add("hbm:tile.test_ticker"); + ignoreMappings.add("hbm:tile.dummy_block_flare"); + ignoreMappings.add("hbm:tile.dummy_port_flare"); + ignoreMappings.add("hbm:tile.dummy_block_chemplant"); + ignoreMappings.add("hbm:tile.dummy_port_chemplant"); + ignoreMappings.add("hbm:tile.dummy_block_pumpjack"); + ignoreMappings.add("hbm:tile.dummy_port_pumpjack"); + ignoreMappings.add("hbm:tile.dummy_block_radgen"); + ignoreMappings.add("hbm:tile.dummy_port_radgen"); + ignoreMappings.add("hbm:tile.test_conductor"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index c717ee070..b00972255 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -91,33 +91,25 @@ public class NEIConfig implements IConfigureNEI { API.hideItem(new ItemStack(ModItems.ams_core_thingy)); } API.hideItem(new ItemStack(ModBlocks.dummy_block_assembler)); - API.hideItem(new ItemStack(ModBlocks.dummy_block_chemplant)); API.hideItem(new ItemStack(ModBlocks.dummy_block_drill)); - API.hideItem(new ItemStack(ModBlocks.dummy_block_flare)); API.hideItem(new ItemStack(ModBlocks.dummy_block_fluidtank)); - API.hideItem(new ItemStack(ModBlocks.dummy_block_pumpjack)); API.hideItem(new ItemStack(ModBlocks.dummy_block_refinery)); API.hideItem(new ItemStack(ModBlocks.dummy_block_turbofan)); API.hideItem(new ItemStack(ModBlocks.dummy_block_ams_base)); API.hideItem(new ItemStack(ModBlocks.dummy_block_ams_emitter)); API.hideItem(new ItemStack(ModBlocks.dummy_block_ams_limiter)); - API.hideItem(new ItemStack(ModBlocks.dummy_block_radgen)); API.hideItem(new ItemStack(ModBlocks.dummy_block_vault)); API.hideItem(new ItemStack(ModBlocks.dummy_block_blast)); API.hideItem(new ItemStack(ModBlocks.dummy_block_uf6)); API.hideItem(new ItemStack(ModBlocks.dummy_block_puf6)); API.hideItem(new ItemStack(ModBlocks.dummy_port_assembler)); - API.hideItem(new ItemStack(ModBlocks.dummy_port_chemplant)); API.hideItem(new ItemStack(ModBlocks.dummy_port_drill)); - API.hideItem(new ItemStack(ModBlocks.dummy_port_flare)); API.hideItem(new ItemStack(ModBlocks.dummy_port_fluidtank)); - API.hideItem(new ItemStack(ModBlocks.dummy_port_pumpjack)); API.hideItem(new ItemStack(ModBlocks.dummy_port_refinery)); API.hideItem(new ItemStack(ModBlocks.dummy_port_turbofan)); API.hideItem(new ItemStack(ModBlocks.dummy_port_ams_base)); API.hideItem(new ItemStack(ModBlocks.dummy_port_ams_emitter)); API.hideItem(new ItemStack(ModBlocks.dummy_port_ams_limiter)); - API.hideItem(new ItemStack(ModBlocks.dummy_port_radgen)); API.hideItem(new ItemStack(ModBlocks.dummy_port_compact_launcher)); API.hideItem(new ItemStack(ModBlocks.dummy_port_launch_table)); API.hideItem(new ItemStack(ModBlocks.dummy_plate_compact_launcher)); diff --git a/src/main/java/com/hbm/render/block/RenderCable.java b/src/main/java/com/hbm/render/block/RenderCable.java index 5b3b823c9..62683e60a 100644 --- a/src/main/java/com/hbm/render/block/RenderCable.java +++ b/src/main/java/com/hbm/render/block/RenderCable.java @@ -2,7 +2,7 @@ package com.hbm.render.block; import org.lwjgl.opengl.GL11; -import com.hbm.blocks.test.TestConductor; +import com.hbm.blocks.network.BlockCable; import com.hbm.lib.Library; import com.hbm.main.ResourceManager; import com.hbm.render.util.ObjUtil; @@ -94,6 +94,6 @@ public class RenderCable implements ISimpleBlockRenderingHandler { @Override public int getRenderId() { - return TestConductor.renderID; + return BlockCable.renderID; } } diff --git a/src/main/java/com/hbm/render/item/block/ItemRenderTestContainer.java b/src/main/java/com/hbm/render/item/block/ItemRenderTestContainer.java deleted file mode 100644 index 57e75111d..000000000 --- a/src/main/java/com/hbm/render/item/block/ItemRenderTestContainer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.hbm.render.item.block; - -import com.hbm.tileentity.deco.TileEntityTestContainer; - -import net.minecraft.client.model.ModelChest; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.item.ItemStack; -import net.minecraftforge.client.IItemRenderer; - -public class ItemRenderTestContainer implements IItemRenderer { - - private ModelChest chestModel; - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return true; - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, - ItemRendererHelper helper) { - return true; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - TileEntityRendererDispatcher.instance.renderTileEntityAt(new TileEntityTestContainer(), 0.0D, 0.0D, 0.0D, 0.0F); - } - -} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 26d78aa94..b98da7dd4 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -32,9 +32,7 @@ public class TileMappings { put(TileEntityTestBombAdvanced.class, "tilentity_testbombadvanced"); put(TileEntityDiFurnace.class, "tilentity_diFurnace"); put(TileEntityTestNuke.class, "tilentity_testnuke"); - put(TileEntityRotationTester.class, "tilentity_rotationtester"); put(TileEntityTestRender.class, "tilentity_testrenderer"); - put(TileEntityTestContainer.class, "tilentity_testcontainer"); put(TileEntityObjTester.class, "tilentity_objtester"); put(TileEntityMachineCentrifuge.class, "tileentity_centrifuge"); put(TileEntityNukeMan.class, "tileentity_nukeman"); diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityRotationTester.java b/src/main/java/com/hbm/tileentity/deco/TileEntityRotationTester.java deleted file mode 100644 index f4e23a0b2..000000000 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityRotationTester.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hbm.tileentity.deco; - -import net.minecraft.tileentity.TileEntity; - -public class TileEntityRotationTester extends TileEntity { - - @Override - public int getBlockMetadata() - { - if (this.blockMetadata == -1) - { - this.blockMetadata = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); - } - - return this.blockMetadata; - } - -} diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityTestContainer.java b/src/main/java/com/hbm/tileentity/deco/TileEntityTestContainer.java deleted file mode 100644 index 3fde6ab7a..000000000 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityTestContainer.java +++ /dev/null @@ -1,213 +0,0 @@ -package com.hbm.tileentity.deco; - -import com.hbm.blocks.test.TestContainer; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockChest; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntityChest; - -public class TileEntityTestContainer extends TileEntityChest { - - private String customName; - - private ItemStack[] chestContents = new ItemStack[9]; - - private int cachedChestType; - - public TileEntityTestContainer adjacentChestZNeg; - public TileEntityTestContainer adjacentChestXPos; - public TileEntityTestContainer adjacentChestXNeg; - public TileEntityTestContainer adjacentChestZPos; - - @Override - public String getInventoryName() - { - return this.hasCustomInventoryName() ? this.customName : "container.testContainer"; - } - - @Override - public boolean hasCustomInventoryName() - { - return this.customName != null && this.customName.length() > 0; - } - - @Override - public void func_145976_a(String p_145976_1_) - { - this.customName = p_145976_1_; - } - - @Override - public void readFromNBT(NBTTagCompound p_145839_1_) - { - super.readFromNBT(p_145839_1_); - NBTTagList nbttaglist = p_145839_1_.getTagList("Items", 10); - this.chestContents = new ItemStack[this.getSizeInventory()]; - - if (p_145839_1_.hasKey("TestContainer", 8)) - { - this.customName = p_145839_1_.getString("TestContainer"); - } - - for (int i = 0; i < nbttaglist.tagCount(); ++i) - { - NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 0 && j < this.chestContents.length) - { - this.chestContents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound p_145841_1_) - { - super.writeToNBT(p_145841_1_); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.chestContents.length; ++i) - { - if (this.chestContents[i] != null) - { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - nbttagcompound1.setByte("Slot", (byte)i); - this.chestContents[i].writeToNBT(nbttagcompound1); - nbttaglist.appendTag(nbttagcompound1); - } - } - - p_145841_1_.setTag("Items", nbttaglist); - - if (this.hasCustomInventoryName()) - { - p_145841_1_.setString("TestContainer", this.customName); - } - } - - private void func_145978_a(TileEntityTestContainer p_145978_1_, int p_145978_2_) - { - if (p_145978_1_.isInvalid()) - { - this.adjacentChestChecked = false; - } - else if (this.adjacentChestChecked) - { - switch (p_145978_2_) - { - case 0: - if (this.adjacentChestZPos != p_145978_1_) - { - this.adjacentChestChecked = false; - } - - break; - case 1: - if (this.adjacentChestXNeg != p_145978_1_) - { - this.adjacentChestChecked = false; - } - - break; - case 2: - if (this.adjacentChestZNeg != p_145978_1_) - { - this.adjacentChestChecked = false; - } - - break; - case 3: - if (this.adjacentChestXPos != p_145978_1_) - { - this.adjacentChestChecked = false; - } - } - } - } - - @Override - public void checkForAdjacentChests() - { - if (!this.adjacentChestChecked) - { - this.adjacentChestChecked = true; - this.adjacentChestZNeg = null; - this.adjacentChestXPos = null; - this.adjacentChestXNeg = null; - this.adjacentChestZPos = null; - - if (this.func_145977_a(this.xCoord - 1, this.yCoord, this.zCoord)) - { - this.adjacentChestXNeg = (TileEntityTestContainer)this.worldObj.getTileEntity(this.xCoord - 1, this.yCoord, this.zCoord); - } - - if (this.func_145977_a(this.xCoord + 1, this.yCoord, this.zCoord)) - { - this.adjacentChestXPos = (TileEntityTestContainer)this.worldObj.getTileEntity(this.xCoord + 1, this.yCoord, this.zCoord); - } - - if (this.func_145977_a(this.xCoord, this.yCoord, this.zCoord - 1)) - { - this.adjacentChestZNeg = (TileEntityTestContainer)this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord - 1); - } - - if (this.func_145977_a(this.xCoord, this.yCoord, this.zCoord + 1)) - { - this.adjacentChestZPos = (TileEntityTestContainer)this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord + 1); - } - - if (this.adjacentChestZNeg != null) - { - this.adjacentChestZNeg.func_145978_a(this, 0); - } - - if (this.adjacentChestZPos != null) - { - this.adjacentChestZPos.func_145978_a(this, 2); - } - - if (this.adjacentChestXPos != null) - { - this.adjacentChestXPos.func_145978_a(this, 1); - } - - if (this.adjacentChestXNeg != null) - { - this.adjacentChestXNeg.func_145978_a(this, 3); - } - } - } - - private boolean func_145977_a(int p_145977_1_, int p_145977_2_, int p_145977_3_) - { - if (this.worldObj == null) - { - return false; - } - else - { - Block block = this.worldObj.getBlock(p_145977_1_, p_145977_2_, p_145977_3_); - return block instanceof TestContainer && ((TestContainer)block).field_149956_a == this.func_145980_j(); - } - } - - @Override - public int func_145980_j() - { - if (this.cachedChestType == -1) - { - if (this.worldObj == null || !(this.getBlockType() instanceof TestContainer)) - { - return 0; - } - - this.cachedChestType = ((BlockChest)this.getBlockType()).field_149956_a; - } - - return this.cachedChestType; - } -} From 37ff82ee166eb0662b16ded7cecd43f4ef5e4656 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 12 Oct 2022 16:44:43 +0200 Subject: [PATCH 105/111] small fluid tweaks, HIMARS rocket item class, cargo arty shell --- .../entity/projectile/EntityThrowableNT.java | 198 ++++++++++-------- .../java/com/hbm/inventory/fluid/Fluids.java | 3 + src/main/java/com/hbm/items/ModItems.java | 3 + .../com/hbm/items/weapon/ItemAmmoArty.java | 35 ++-- .../com/hbm/items/weapon/ItemAmmoHIMARS.java | 56 +++++ .../machine/TileEntityCrucible.java | 7 +- .../hbm/textures/blocks/brick_light_alt.png | Bin 434 -> 430 bytes .../hbm/textures/items/ammo_arty_cargo.png | Bin 0 -> 311 bytes .../textures/items/ammo_arty_cargo_open.png | Bin 0 -> 365 bytes 9 files changed, 197 insertions(+), 105 deletions(-) create mode 100644 src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_arty_cargo.png create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_arty_cargo_open.png diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java index b1a27a009..f14d2be21 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -140,109 +140,125 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { } return; - } + + } else { - this.inGround = false; - this.motionX *= (double) (this.rand.nextFloat() * 0.2F); - this.motionY *= (double) (this.rand.nextFloat() * 0.2F); - this.motionZ *= (double) (this.rand.nextFloat() * 0.2F); - this.ticksInGround = 0; - this.ticksInAir = 0; + this.inGround = false; + this.motionX *= (double) (this.rand.nextFloat() * 0.2F); + this.motionY *= (double) (this.rand.nextFloat() * 0.2F); + this.motionZ *= (double) (this.rand.nextFloat() * 0.2F); + this.ticksInGround = 0; + this.ticksInAir = 0; + } + } else { ++this.ticksInAir; - } - - Vec3 pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - Vec3 nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - MovingObjectPosition mop = this.worldObj.rayTraceBlocks(pos, nextPos); - pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - - if(mop != null) { - nextPos = Vec3.createVectorHelper(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); - } - - if(!this.worldObj.isRemote) { - - Entity hitEntity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - double nearest = 0.0D; - EntityLivingBase thrower = this.getThrower(); - - for(int j = 0; j < list.size(); ++j) { - Entity entity = (Entity) list.get(j); - - if(entity.canBeCollidedWith() && (entity != thrower || this.ticksInAir >= 5)) { - 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(dist < nearest || nearest == 0.0D) { - hitEntity = entity; - nearest = dist; + + Vec3 pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition mop = this.worldObj.rayTraceBlocks(pos, nextPos); + pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + + if(mop != null) { + nextPos = Vec3.createVectorHelper(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + } + + if(!this.worldObj.isRemote) { + + Entity hitEntity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double nearest = 0.0D; + EntityLivingBase thrower = this.getThrower(); + + for(int j = 0; j < list.size(); ++j) { + Entity entity = (Entity) list.get(j); + + if(entity.canBeCollidedWith() && (entity != thrower || this.ticksInAir >= 5)) { + 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(dist < nearest || nearest == 0.0D) { + hitEntity = entity; + nearest = dist; + } } } } + + if(hitEntity != null) { + mop = new MovingObjectPosition(hitEntity); + } } - - if(hitEntity != null) { - mop = new MovingObjectPosition(hitEntity); + + if(mop != null) { + if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && this.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ) == Blocks.portal) { + this.setInPortal(); + } else { + this.onImpact(mop); + } } - } - - if(mop != null) { - if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && this.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ) == Blocks.portal) { - this.setInPortal(); - } else { - this.onImpact(mop); + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + + float hyp = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + + for(this.rotationPitch = (float) (Math.atan2(this.motionY, (double) hyp) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; } - } - - this.posX += this.motionX; - this.posY += this.motionY; - this.posZ += this.motionZ; - - float hyp = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); - - for(this.rotationPitch = (float) (Math.atan2(this.motionY, (double) hyp) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { - ; - } - - while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { - this.prevRotationPitch += 360.0F; - } - - while(this.rotationYaw - this.prevRotationYaw < -180.0F) { - this.prevRotationYaw -= 360.0F; - } - - while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { - this.prevRotationYaw += 360.0F; - } - - this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; - float drag = this.getAirDrag(); - double gravity = this.getGravityVelocity(); - - if(this.isInWater()) { - for(int i = 0; i < 4; ++i) { - float f = 0.25F; - this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double) f, this.posY - this.motionY * (double) f, this.posZ - this.motionZ * (double) f, this.motionX, this.motionY, this.motionZ); + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float drag = this.getAirDrag(); + double gravity = this.getGravityVelocity(); + + if(this.isInWater()) { + for(int i = 0; i < 4; ++i) { + float f = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double) f, this.posY - this.motionY * (double) f, this.posZ - this.motionZ * (double) f, this.motionX, this.motionY, this.motionZ); + } + + drag = this.getWaterDrag(); + } + + this.motionX *= (double) drag; + this.motionY *= (double) drag; + this.motionZ *= (double) drag; + this.motionY -= gravity; + this.setPosition(this.posX, this.posY, this.posZ); - drag = this.getWaterDrag(); } - - this.motionX *= (double) drag; - this.motionY *= (double) drag; - this.motionZ *= (double) drag; - this.motionY -= gravity; - this.setPosition(this.posX, this.posY, this.posZ); + } + + public boolean alowMultiImpact() { + return false; //TODO + } + + public void getStuck(int x, int y, int z) { + this.stuckBlockX = x; + this.stuckBlockY = y; + this.stuckBlockZ = z; + this.stuckBlock = worldObj.getBlock(x, y, z); + this.inGround = true; } public double getGravityVelocity() { diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 00991409b..a19fceb49 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -324,6 +324,9 @@ public class Fluids { OIL.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(10, 1, HOTOIL, 1)); CRACKOIL.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(10, 1, HOTCRACKOIL, 1)); + + HOTOIL.addTraits(new FT_Coolable(OIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); + HOTCRACKOIL.addTraits(new FT_Coolable(CRACKOIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); if(idMapping.size() != metaOrder.size()) { throw new IllegalStateException("A severe error has occoured during NTM's fluid registering process! The MetaOrder and Mappings are inconsistent! Mapping size: " + idMapping.size()+ " / MetaOrder size: " + metaOrder.size()); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index d2fe5b08c..857530a39 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1587,6 +1587,7 @@ public class ModItems { public static Item ammo_shell_w9; public static Item ammo_dgk; public static Item ammo_arty; + public static Item ammo_himars; public static Item ammo_nuke; public static Item ammo_nuke_low; public static Item ammo_nuke_high; @@ -4340,6 +4341,7 @@ public class ModItems { ammo_shell_w9 = new ItemAmmo().setUnlocalizedName("ammo_shell_w9"); ammo_dgk = new ItemAmmo().setUnlocalizedName("ammo_dgk"); ammo_arty = new ItemAmmoArty().setUnlocalizedName("ammo_arty"); + ammo_himars = new ItemAmmoHIMARS().setUnlocalizedName("ammo_himars"); ammo_nuke = new ItemAmmo().setUnlocalizedName("ammo_nuke"); ammo_nuke_low = new ItemAmmo().setUnlocalizedName("ammo_nuke_low"); ammo_nuke_high = new ItemAmmo().setUnlocalizedName("ammo_nuke_high"); @@ -7441,6 +7443,7 @@ public class ModItems { GameRegistry.registerItem(ammo_shell_w9, ammo_shell_w9.getUnlocalizedName()); GameRegistry.registerItem(ammo_dgk, ammo_dgk.getUnlocalizedName()); GameRegistry.registerItem(ammo_arty, ammo_arty.getUnlocalizedName()); + GameRegistry.registerItem(ammo_himars, ammo_himars.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke, ammo_nuke.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke_low, ammo_nuke_low.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke_high, ammo_nuke_high.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java index 803b44ed5..00e7b2641 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -38,11 +38,12 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; public class ItemAmmoArty extends Item { - public static ArtilleryShell[] itemTypes = new ArtilleryShell[ /* >>> */ 8 /* <<< */ ]; - public static ArtilleryShell[] shellTypes = new ArtilleryShell[ /* >>> */ 8 /* <<< */ ]; + public static ArtilleryShell[] itemTypes = new ArtilleryShell[ /* >>> */ 9 /* <<< */ ]; + //public static ArtilleryShell[] shellTypes = new ArtilleryShell[ /* >>> */ 8 /* <<< */ ]; /* item types */ public final int NORMAL = 0; public final int CLASSIC = 1; @@ -52,6 +53,7 @@ public class ItemAmmoArty extends Item { public final int PHOSPHORUS = 5; public final int MINI_NUKE_MULTI = 6; public final int PHOSPHORUS_MULTI = 7; + public final int CARGO = 8; /* non-item shell types */ public ItemAmmoArty() { @@ -71,6 +73,7 @@ public class ItemAmmoArty extends Item { list.add(new ItemStack(item, 1, MINI_NUKE)); list.add(new ItemStack(item, 1, MINI_NUKE_MULTI)); list.add(new ItemStack(item, 1, NUKE)); + list.add(new ItemStack(item, 1, CARGO)); } @Override @@ -204,12 +207,12 @@ public class ItemAmmoArty extends Item { private void init() { /* STANDARD SHELLS */ - this.shellTypes[NORMAL] = this.itemTypes[NORMAL] = new ArtilleryShell("ammo_arty") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 10F, 3F, false); }}; - this.shellTypes[CLASSIC] = this.itemTypes[CLASSIC] = new ArtilleryShell("ammo_arty_classic") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 15F, 5F, false); }}; - this.shellTypes[EXPLOSIVE] = this.itemTypes[EXPLOSIVE] = new ArtilleryShell("ammo_arty_he") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 15F, 3F, true); }}; + this.itemTypes[NORMAL] = new ArtilleryShell("ammo_arty") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 10F, 3F, false); }}; + this.itemTypes[CLASSIC] = new ArtilleryShell("ammo_arty_classic") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 15F, 5F, false); }}; + this.itemTypes[EXPLOSIVE] = new ArtilleryShell("ammo_arty_he") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 15F, 3F, true); }}; /* MINI NUKE */ - this.shellTypes[MINI_NUKE] = this.itemTypes[MINI_NUKE] = new ArtilleryShell("ammo_arty_mini_nuke") { + this.itemTypes[MINI_NUKE] = new ArtilleryShell("ammo_arty_mini_nuke") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { shell.killAndClear(); Vec3 vec = Vec3.createVectorHelper(shell.motionX, shell.motionY, shell.motionZ).normalize(); @@ -218,7 +221,7 @@ public class ItemAmmoArty extends Item { }; /* FULL NUKE */ - this.shellTypes[NUKE] = this.itemTypes[NUKE] = new ArtilleryShell("ammo_arty_nuke") { + this.itemTypes[NUKE] = new ArtilleryShell("ammo_arty_nuke") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { shell.worldObj.spawnEntityInWorld(EntityNukeExplosionMK4.statFac(shell.worldObj, BombConfig.missileRadius, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord)); EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(shell.worldObj, 1000, BombConfig.missileRadius * 0.005F); @@ -231,7 +234,7 @@ public class ItemAmmoArty extends Item { }; /* PHOSPHORUS */ - this.shellTypes[PHOSPHORUS] = this.itemTypes[PHOSPHORUS] = new ArtilleryShell("ammo_arty_phosphorus") { + this.itemTypes[PHOSPHORUS] = new ArtilleryShell("ammo_arty_phosphorus") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 10F, 3F, false); shell.worldObj.playSoundEffect(shell.posX, shell.posY, shell.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + shell.worldObj.rand.nextFloat() * 0.2F); @@ -259,13 +262,21 @@ public class ItemAmmoArty extends Item { } }; + /* THIS DOOFUS */ + this.itemTypes[NORMAL] = new ArtilleryShell("ammo_arty_cargo") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { + if(mop.typeOfHit == MovingObjectType.BLOCK) { + shell.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + shell.getStuck(mop.blockX, mop.blockY, mop.blockZ); + } + }}; + /* CLUSTER SHELLS */ - this.shellTypes[PHOSPHORUS_MULTI] = this.itemTypes[PHOSPHORUS_MULTI] = new ArtilleryShell("ammo_arty_phosphorus_multi") { - public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.shellTypes[PHOSPHORUS].onImpact(shell, mop); } + this.itemTypes[PHOSPHORUS_MULTI] = new ArtilleryShell("ammo_arty_phosphorus_multi") { + public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.itemTypes[PHOSPHORUS].onImpact(shell, mop); } public void onUpdate(EntityArtilleryShell shell) { standardCluster(shell, PHOSPHORUS, 10, 300, 5); } }; - this.shellTypes[MINI_NUKE_MULTI] = this.itemTypes[MINI_NUKE_MULTI] = new ArtilleryShell("ammo_arty_mini_nuke_multi") { - public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.shellTypes[MINI_NUKE].onImpact(shell, mop); } + this.itemTypes[MINI_NUKE_MULTI] = new ArtilleryShell("ammo_arty_mini_nuke_multi") { + public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.itemTypes[MINI_NUKE].onImpact(shell, mop); } public void onUpdate(EntityArtilleryShell shell) { standardCluster(shell, MINI_NUKE, 5, 300, 5); } }; } diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java new file mode 100644 index 000000000..5ee9b7e0c --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -0,0 +1,56 @@ +package com.hbm.items.weapon; + +import java.util.List; + +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; + +public class ItemAmmoHIMARS extends Item { + + public static HIMARSRocket[] itemTypes = new HIMARSRocket[ /* >>> */ 2 /* <<< */ ]; + + public final int SMALL = 0; + public final int LARGE = 1; + + public ItemAmmoHIMARS() { + this.setHasSubtypes(true); + this.setCreativeTab(MainRegistry.weaponTab); + this.setTextureName(RefStrings.MODID + ":ammo_rocket"); + init(); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(new ItemStack(item, 1, SMALL)); + list.add(new ItemStack(item, 1, LARGE)); + } + + public abstract class HIMARSRocket { + + String name; + + public HIMARSRocket() { } + + public HIMARSRocket(String name) { + this.name = name; + } + + public abstract void onImpact(Entity rocket, MovingObjectPosition mop); + public void onUpdate(Entity rocket) { } + } + + private void init() { + /* STANDARD SHELLS */ + this.itemTypes[SMALL] = new HIMARSRocket("ammo_himars") { public void onImpact(Entity rocket, MovingObjectPosition mop) { }}; + this.itemTypes[LARGE] = new HIMARSRocket("ammo_himars_large") { public void onImpact(Entity rocket, MovingObjectPosition mop) { }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 1b78d8e21..071b5bc5b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -349,6 +349,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro //the amount of material in the entire recipe input int recipeContent = recipe != null ? recipe.getInputAmount() : 0; //the total amount of the current waste stack, used for simulation + int recipeAmount = getQuantaFromType(this.recipeStack, null); int wasteAmount = getQuantaFromType(this.wasteStack, null); for(MaterialStack mat : materials) { @@ -366,14 +367,16 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro matchesRecipe = true; + recipeAmount += mat.amount; + //if the amount of that input would exceed the amount dictated by the recipe, return false if(recipe != null && amountStored + mat.amount > matMaximum) return false; } } - //if the waste amount doesn't exceed the capacity and the recipe matches (or isn't null), return true - return wasteAmount <= this.wasteZCapacity && matchesRecipe; + //if the amount doesn't exceed the capacity and the recipe matches (or isn't null), return true + return recipeAmount <= this.recipeZCapacity && wasteAmount <= this.wasteZCapacity && matchesRecipe; } public void addToStack(List stack, MaterialStack matStack) { diff --git a/src/main/resources/assets/hbm/textures/blocks/brick_light_alt.png b/src/main/resources/assets/hbm/textures/blocks/brick_light_alt.png index 5d06218535d3221a05724e39a3697dfe6f107fa2..40d39d2aa146e795684fe5091378d9aba0a58f7e 100644 GIT binary patch delta 387 zcmV-}0et?l1Fi#*G=F7DL_t(IjjfZ-PQpMGg+BKciv~0LYuwCarc4A=W6h+J8NwxX5}r$8L0prNC}< z0Px%iX0=Hy1+f(50m7}sDjVqw!mXrsd;)+~HZpamJ0{%9v@dscdA8#K6PJcW zR!nql{24m4-2L=oC&W5Es*D1RQVkgetk!Rs#us*@li4>)H2|KU9ufvJ3jRE-nw;)9 zy|>Cny03IN1ALV$z~ds!c-HdW&RbH>7rSVgpmh#x7tcVA**$54exV+bv&rVjKx#2|(aA-WxO4^s*X=tm_Z0`M;YoA*Q+x*a84%h$u zl?NtQfRD23X@BnKZH5`%aE>Bo60{v<4q$h}4_rhWSrcP(3Pp@M?@)UfcQfrmE7_}E zbob=;J-F6nAde^O$q)yPXO7YI>*zMyR>D~V6#$c9VZCTR+j>&w%^t}8uJ-0;I3z#m=`(`SUNNBsZ*002ovPDHLkU;%=(bGlOi diff --git a/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo.png b/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo.png new file mode 100644 index 0000000000000000000000000000000000000000..471ce714d9996b35882e5f6460c8352ac4fd1102 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf~WqLMWej1khGs<7PwQQ4n%BzT4-^Cux8EaiRJSTJC)ac`JYL}at?taSiY{iR3 zC+;@gGM>IU{@CH{b1TK(oNxM6efUFC+nfsXnFPcw$ z*}q!j0}s$3ftv?&@4QQ?_4pB)jsiGa#oSI5cmw{oeQg?>9`SqA2Xxo9H)at*NR?^c$2?R!T_} zMQk=3F$By2cDo%~YoaJZDP{9K?-c907RDH~)?O!~uVRd$ZCe1cECc8qDWz;(*M0|1 zMM~K{G))7*-R;V{9$yBt{=pd2DZ8@_EzkGYqak(xr{ExQ9FrsoVQ?Z{j6-I=OSjG{ z{iM7)vYgvd$e+F3&H&}j7t8s1W`7iH4}$XHy_@p}(^pCt_Fss1g}%b}AlM(zI&K~3 z)C-sbk>QW4QNSfg7@UBS42Ct# Date: Wed, 12 Oct 2022 23:51:18 +0200 Subject: [PATCH 106/111] prettier centrifuge ay --- .../hbm/blocks/machine/MachineCentrifuge.java | 2 +- .../com/hbm/inventory/gui/GUIFirebox.java | 2 +- .../com/hbm/items/weapon/ItemAmmoArty.java | 2 +- .../java/com/hbm/main/ResourceManager.java | 4 +- .../hbm/render/item/ItemRenderLibrary.java | 20 - .../render/tileentity/RenderCentrifuge.java | 55 +- .../machine/TileEntityMachineCentrifuge.java | 116 ++- .../assets/hbm/models/centrifuge.obj | 492 --------- .../assets/hbm/models/centrifuge_new.obj | 874 ---------------- .../assets/hbm/models/machines/centrifuge.obj | 953 ++++++++++++++++++ .../hbm/sounds/block/centrifugeOperate.ogg | Bin 82690 -> 79058 bytes .../textures/models/machines/centrifuge.png | Bin 0 -> 10250 bytes 12 files changed, 1094 insertions(+), 1426 deletions(-) delete mode 100644 src/main/resources/assets/hbm/models/centrifuge.obj delete mode 100644 src/main/resources/assets/hbm/models/centrifuge_new.obj create mode 100644 src/main/resources/assets/hbm/models/machines/centrifuge.obj create mode 100644 src/main/resources/assets/hbm/textures/models/machines/centrifuge.png diff --git a/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java b/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java index 740ee50fa..026c67bfc 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java @@ -50,7 +50,7 @@ public class MachineCentrifuge extends BlockDummyable implements IMultiblock { @Override public int[] getDimensions() { - return new int[] {2, 0, 0, 0, 0, 0,}; + return new int[] {3, 0, 0, 0, 0, 0,}; } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIFirebox.java b/src/main/java/com/hbm/inventory/gui/GUIFirebox.java index f930ad471..66ee4be51 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFirebox.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFirebox.java @@ -48,7 +48,7 @@ public class GUIFirebox extends GuiInfoContainer { } this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 27, 71, 7, x, y, new String[] { String.format("%,d", firebox.heatEnergy) + " / " + String.format("%,d", firebox.maxHeatEnergy) + "TU" }); - this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 36, 71, 7, x, y, new String[] { firebox.burnHeat + "TU/s", (firebox.burnTime / 20) + "s" }); + this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 36, 71, 7, x, y, new String[] { firebox.burnHeat + "TU/t", (firebox.burnTime / 20) + "s" }); } @Override diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java index 00e7b2641..24aefdb0e 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -263,7 +263,7 @@ public class ItemAmmoArty extends Item { }; /* THIS DOOFUS */ - this.itemTypes[NORMAL] = new ArtilleryShell("ammo_arty_cargo") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { + this.itemTypes[CARGO] = new ArtilleryShell("ammo_arty_cargo") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { if(mop.typeOfHit == MovingObjectType.BLOCK) { shell.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); shell.getStuck(mop.blockX, mop.blockY, mop.blockZ); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 1e7e355f6..b2ff87ce0 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -146,7 +146,7 @@ public class ResourceManager { public static final IModelCustom tank = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/tank.obj")); //Centrifuge - public static final IModelCustom centrifuge_new = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/centrifuge_new.obj")); + public static final IModelCustom centrifuge = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/centrifuge.obj")); public static final IModelCustom gascent = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/gascent.obj")); public static final IModelCustom silex = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/silex.obj")); public static final IModelCustom fel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/fel.obj")); @@ -472,7 +472,7 @@ public class ResourceManager { public static final ResourceLocation puf6_tex = new ResourceLocation(RefStrings.MODID, "textures/models/PUF6Tank.png"); //Centrifuge - public static final ResourceLocation centrifuge_new_tex = new ResourceLocation(RefStrings.MODID, "textures/models/centrifuge_new.png"); + public static final ResourceLocation centrifuge_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/centrifuge.png"); public static final ResourceLocation gascent_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/gascent.png"); public static final ResourceLocation fel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fel.png"); public static final ResourceLocation silex_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/silex.png"); diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 835852f59..2d6325b0c 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -52,26 +52,6 @@ public class ItemRenderLibrary { GL11.glShadeModel(GL11.GL_FLAT); }}); - renderers.put(Item.getItemFromBlock(ModBlocks.machine_centrifuge), new ItemRenderBase() { - public void renderInventory() { - GL11.glTranslated(0, -4, 0); - GL11.glScaled(4.5, 4.5, 4.5); - } - public void renderCommon() { - bindTexture(ResourceManager.centrifuge_new_tex); ResourceManager.centrifuge_new.renderAll(); - }}); - - renderers.put(Item.getItemFromBlock(ModBlocks.machine_gascent), new ItemRenderBase() { - public void renderInventory() { - GL11.glTranslated(0, -4, 0); - GL11.glScaled(3.5, 3.5, 3.5); - } - public void renderCommon() { - GL11.glShadeModel(GL11.GL_SMOOTH); - bindTexture(ResourceManager.gascent_tex); ResourceManager.gascent.renderPart("Centrifuge"); - GL11.glShadeModel(GL11.GL_FLAT); - }}); - renderers.put(Item.getItemFromBlock(ModBlocks.iter), new ItemRenderBase() { public void renderInventory() { GL11.glTranslated(0, -1, 0); diff --git a/src/main/java/com/hbm/render/tileentity/RenderCentrifuge.java b/src/main/java/com/hbm/render/tileentity/RenderCentrifuge.java index 107d64cb6..d0dfaa210 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCentrifuge.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCentrifuge.java @@ -2,45 +2,84 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.machine.TileEntityMachineCentrifuge; import com.hbm.tileentity.machine.TileEntityMachineGasCent; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; -public class RenderCentrifuge extends TileEntitySpecialRenderer { +public class RenderCentrifuge extends TileEntitySpecialRenderer implements IItemRendererProvider { @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5D, y, z + 0.5D); GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); - switch(tileEntity.getBlockMetadata() - 10) { // (: + switch(tileEntity.getBlockMetadata() - 10) { case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; } + GL11.glShadeModel(GL11.GL_SMOOTH); + if(tileEntity instanceof TileEntityMachineCentrifuge) { - bindTexture(ResourceManager.centrifuge_new_tex); - ResourceManager.centrifuge_new.renderAll(); + bindTexture(ResourceManager.centrifuge_tex); + ResourceManager.centrifuge.renderAll(); } if(tileEntity instanceof TileEntityMachineGasCent) { GL11.glRotatef(180, 0F, 1F, 0F); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.gascent_tex); ResourceManager.gascent.renderPart("Centrifuge"); ResourceManager.gascent.renderPart("Flag"); - GL11.glShadeModel(GL11.GL_FLAT); } - + + GL11.glShadeModel(GL11.GL_FLAT); GL11.glEnable(GL11.GL_CULL_FACE); GL11.glPopMatrix(); } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_centrifuge); + } + + @Override + public Item[] getItemsForRenderer() { + return new Item[] { + Item.getItemFromBlock(ModBlocks.machine_centrifuge), + Item.getItemFromBlock(ModBlocks.machine_gascent) + }; + } + + @Override + public IItemRenderer getRenderer() { + + return new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -4, 0); + GL11.glScaled(3.5, 3.5, 3.5); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glShadeModel(GL11.GL_SMOOTH); + if(item.getItem() == Item.getItemFromBlock(ModBlocks.machine_gascent)) { + bindTexture(ResourceManager.gascent_tex); ResourceManager.gascent.renderPart("Centrifuge"); + } else { + bindTexture(ResourceManager.centrifuge_tex); ResourceManager.centrifuge.renderAll(); + } + GL11.glShadeModel(GL11.GL_FLAT); + } + }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index 2fa74ea4f..fb2b83933 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -2,19 +2,17 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.recipes.CentrifugeRecipes; import com.hbm.lib.Library; -import com.hbm.packet.AuxElectricityPacket; -import com.hbm.packet.LoopedSoundPacket; -import com.hbm.packet.PacketDispatcher; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energy.IEnergyUser; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; public class TileEntityMachineCentrifuge extends TileEntityMachineBase implements IEnergyUser { @@ -23,6 +21,9 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement public boolean isProgressing; public static final int maxPower = 100000; public static final int processingSpeed = 200; + private int audioDuration = 0; + + private AudioWrapper audio; /* * So why do we do this now? You have a funny mekanism/thermal/whatever pipe and you want to output stuff from a side @@ -132,12 +133,6 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement return this.progress > 0; } - public void networkUnpack(NBTTagCompound data) { - this.power = data.getLong("power"); - this.progress = data.getInteger("progress"); - this.isProgressing = data.getBoolean("isProgressing"); - } - @Override public void updateEntity() { @@ -160,34 +155,101 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement } else { isProgressing = false; } + + if(isProgressing) { + progress++; + + if(this.progress >= TileEntityMachineCentrifuge.processingSpeed) { + this.progress = 0; + this.processItem(); + } + } else { + progress = 0; + } NBTTagCompound data = new NBTTagCompound(); data.setLong("power", power); data.setInteger("progress", progress); data.setBoolean("isProgressing", isProgressing); this.networkPack(data, 50); - - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(xCoord, yCoord, zCoord, power), - new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - PacketDispatcher.wrapper.sendToAllAround(new LoopedSoundPacket(xCoord, yCoord, zCoord), - new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - } - - if(hasPower() && canProcess()) { - progress++; - - if(this.progress >= TileEntityMachineCentrifuge.processingSpeed) { - this.progress = 0; - this.processItem(); - } } else { - progress = 0; + + if(isProgressing) { + audioDuration += 2; + } else { + audioDuration -= 3; + } + + audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); + + if(audioDuration > 10) { + + if(audio == null) { + audio = createAudioLoop(); + audio.startSound(); + } else if(!audio.isPlaying()) { + audio = rebootAudio(audio); + } + + audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + + } else { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + } + } + + public void networkUnpack(NBTTagCompound data) { + this.power = data.getLong("power"); + this.progress = data.getInteger("progress"); + this.isProgressing = data.getBoolean("isProgressing"); + } + + public AudioWrapper createAudioLoop() { + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 2.0F, 1.0F); + } + + @Override + public void onChunkUnload() { + + if(audio != null) { + audio.stopSound(); + audio = null; } } + @Override + public void invalidate() { + + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + AxisAlignedBB bb = null; + @Override public AxisAlignedBB getRenderBoundingBox() { - return TileEntity.INFINITE_EXTENT_AABB; + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord, + yCoord, + zCoord, + xCoord + 1, + yCoord + 4, + zCoord + 1 + ); + } + + return bb; } @Override diff --git a/src/main/resources/assets/hbm/models/centrifuge.obj b/src/main/resources/assets/hbm/models/centrifuge.obj deleted file mode 100644 index ad8ddc807..000000000 --- a/src/main/resources/assets/hbm/models/centrifuge.obj +++ /dev/null @@ -1,492 +0,0 @@ -# Blender v2.70 (sub 0) OBJ File: 'centrifuge.blend' -# www.blender.org -o Cube_Cube.001 -v -0.500000 0.000000 0.500000 -v -0.500000 0.000000 -0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 0.000000 0.500000 -v -0.500000 1.000000 0.500000 -v -0.500000 1.000000 -0.500000 -v 0.500000 1.000000 -0.500000 -v 0.500000 1.000000 0.500000 -v 0.250000 2.500000 0.375000 -v 0.375000 2.500000 0.250000 -v -0.250000 2.500000 0.375000 -v -0.375000 2.500000 0.250000 -v 0.375000 2.500000 -0.125000 -v -0.250000 2.500000 -0.375000 -v 0.375000 2.500000 0.125000 -v -0.375000 2.500000 -0.250000 -v -0.250000 1.000000 0.000000 -v 0.250000 1.000000 0.000000 -v 0.000000 1.000000 0.250000 -v 0.000000 1.000000 -0.250000 -v 0.125000 2.500000 0.375000 -v 0.000000 2.500000 0.125000 -v -0.125000 2.500000 0.375000 -v 0.125000 2.500000 0.000000 -v -0.125000 2.500000 -0.375000 -v -0.125000 2.500000 0.000000 -v -0.375000 2.500000 -0.125000 -v 0.000000 2.500000 -0.125000 -v 0.000000 1.000000 -0.125000 -v 0.125000 2.500000 -0.375000 -v 0.000000 2.500000 -0.250000 -v -0.375000 2.500000 0.125000 -v 0.000000 2.500000 0.250000 -v 0.250000 2.500000 -0.375000 -v 0.250000 2.500000 0.000000 -v 0.375000 2.500000 -0.250000 -v -0.250000 2.500000 0.000000 -v -0.125000 1.000000 0.000000 -v 0.125000 1.000000 0.000000 -v 0.000000 1.000000 0.125000 -v -0.375000 1.000000 -0.250000 -v -0.250000 1.000000 -0.375000 -v -0.375000 1.000000 0.250000 -v -0.250000 1.000000 0.375000 -v 0.375000 1.000000 0.250000 -v 0.250000 1.000000 0.375000 -v 0.375000 1.000000 -0.250000 -v 0.250000 1.000000 -0.375000 -v -0.375000 1.000000 0.125000 -v 0.125000 1.000000 -0.375000 -v -0.375000 1.000000 -0.125000 -v -0.125000 1.000000 -0.375000 -v -0.125000 1.000000 0.375000 -v 0.125000 1.000000 0.375000 -v 0.375000 1.000000 0.125000 -v 0.375000 1.000000 -0.125000 -v -0.125000 2.500000 -0.016543 -v -0.250000 2.625000 0.125000 -v -0.125000 2.625000 0.125000 -v -0.250000 2.625000 0.250000 -v -0.125000 2.625000 0.250000 -v 0.250000 2.625000 0.250000 -v 0.250000 2.625000 -0.250000 -v -0.125000 2.625000 -0.250000 -v -0.125000 2.625000 -0.125000 -v 0.250000 2.625000 -0.125000 -v -0.250000 2.625000 -0.250000 -v -0.250000 2.625000 -0.125000 -v 0.125000 2.625000 -0.250000 -v 0.125000 2.625000 -0.125000 -v 0.125000 2.625000 0.250000 -v 0.125000 2.625000 0.125000 -v 0.250000 2.625000 0.125000 -vt 0.407021 0.190559 -vt 0.227717 0.190559 -vt 0.227717 0.015734 -vt 0.404781 0.219788 -vt 0.404782 0.399093 -vt 0.229956 0.399093 -vt 0.193202 0.192799 -vt 0.018377 0.192799 -vt 0.018377 0.013495 -vt 0.193202 0.399093 -vt 0.018377 0.399093 -vt 0.018377 0.219789 -vt 0.439296 0.396853 -vt 0.439296 0.222028 -vt 0.618600 0.222028 -vt 0.323385 0.428322 -vt 0.323385 0.690560 -vt 0.291688 0.690560 -vt 0.102522 0.722028 -vt 0.102522 0.984266 -vt 0.080109 0.984266 -vt 0.983863 0.515734 -vt 0.983863 0.777972 -vt 0.961450 0.777972 -vt 0.618600 0.428322 -vt 0.618600 0.690559 -vt 0.586903 0.690559 -vt 0.682572 0.515734 -vt 0.682572 0.777972 -vt 0.650875 0.777972 -vt 0.865203 0.222028 -vt 0.865203 0.484266 -vt 0.842790 0.484266 -vt 0.810515 0.222028 -vt 0.810515 0.484266 -vt 0.778819 0.484266 -vt 0.750389 0.027972 -vt 0.750389 0.093531 -vt 0.727976 0.071678 -vt 0.016137 0.765734 -vt 0.016137 0.743881 -vt 0.038550 0.722028 -vt 0.461709 0.146853 -vt 0.484122 0.168706 -vt 0.439296 0.190559 -vt 0.461709 0.059441 -vt 0.439296 0.015734 -vt 0.484122 0.037587 -vt 0.596187 0.059441 -vt 0.573774 0.037587 -vt 0.618600 0.015734 -vt 0.596187 0.146853 -vt 0.618600 0.190559 -vt 0.573774 0.168706 -vt 0.534964 0.428322 -vt 0.534964 0.690559 -vt 0.503268 0.690559 -vt 0.596187 0.081294 -vt 0.461709 0.125000 -vt 0.551361 0.168706 -vt 0.470993 0.428322 -vt 0.470993 0.690559 -vt 0.439296 0.690559 -vt 0.551361 0.037587 -vt 0.637776 0.969712 -vt 0.637723 0.816438 -vt 0.958331 0.816438 -vt 0.596187 0.125000 -vt 0.573774 0.103147 -vt 0.506535 0.037587 -vt 0.528948 0.059441 -vt 0.461709 0.081294 -vt 0.484122 0.103147 -vt 0.506535 0.168706 -vt 0.528948 0.146853 -vt 0.397737 0.722028 -vt 0.397737 0.984266 -vt 0.375324 0.984266 -vt 0.874487 0.515734 -vt 0.874487 0.777972 -vt 0.842790 0.777972 -vt 0.407021 0.428322 -vt 0.407021 0.690560 -vt 0.375324 0.690560 -vt 0.929175 0.515734 -vt 0.929175 0.777972 -vt 0.906762 0.777972 -vt 0.974579 0.222028 -vt 0.974579 0.484266 -vt 0.952166 0.484266 -vt 0.682572 0.222028 -vt 0.682572 0.484266 -vt 0.650875 0.484266 -vt 0.746543 0.515734 -vt 0.746544 0.777972 -vt 0.714847 0.777972 -vt 0.919891 0.222028 -vt 0.919891 0.484266 -vt 0.897478 0.484266 -vt 0.746544 0.222028 -vt 0.746544 0.484266 -vt 0.714847 0.484266 -vt 0.343049 0.722028 -vt 0.343049 0.984266 -vt 0.320636 0.984266 -vt 0.810515 0.515734 -vt 0.810515 0.777972 -vt 0.778819 0.777972 -vt 0.111806 0.428322 -vt 0.111806 0.690560 -vt 0.080109 0.690560 -vt 0.195442 0.428322 -vt 0.195442 0.690560 -vt 0.163745 0.690560 -vt 0.047834 0.428322 -vt 0.047834 0.690559 -vt 0.016138 0.690559 -vt 0.259413 0.428322 -vt 0.259413 0.690560 -vt 0.227717 0.690560 -vt 0.673288 0.037587 -vt 0.695701 0.015734 -vt 0.695701 0.081294 -vt 0.750389 0.190559 -vt 0.727976 0.168706 -vt 0.727976 0.146853 -vt 0.650875 0.081294 -vt 0.650875 0.015734 -vt 0.448580 0.722028 -vt 0.470993 0.743881 -vt 0.470993 0.765734 -vt 0.265949 0.743881 -vt 0.288362 0.722028 -vt 0.288362 0.787587 -vt 0.650875 0.190559 -vt 0.650875 0.125000 -vt 0.673288 0.146853 -vt 0.503268 0.743881 -vt 0.525681 0.722028 -vt 0.525681 0.787587 -vt 0.016137 0.840909 -vt 0.016137 0.819056 -vt 0.038550 0.819056 -vt 0.522306 0.965642 -vt 0.499893 0.965643 -vt 0.499893 0.943789 -vt 0.610887 0.870908 -vt 0.610896 0.901792 -vt 0.579193 0.901785 -vt 0.178986 0.819056 -vt 0.178986 0.840909 -vt 0.156573 0.840909 -vt 0.695701 0.125000 -vt 0.695701 0.190559 -vt 0.673288 0.168706 -vt 0.186158 0.787587 -vt 0.163745 0.765734 -vt 0.163745 0.743881 -vt 0.782664 0.071678 -vt 0.805077 0.093531 -vt 0.805077 0.027972 -vt 0.837352 0.049825 -vt 0.859765 0.027972 -vt 0.859765 0.093531 -vt 0.609316 0.765734 -vt 0.586903 0.787587 -vt 0.586903 0.722028 -vt 0.805077 0.125000 -vt 0.805077 0.190559 -vt 0.782664 0.168706 -vt 0.837352 0.146853 -vt 0.859765 0.125000 -vt 0.859765 0.190559 -vt 0.265949 0.819056 -vt 0.288362 0.819056 -vt 0.288362 0.849961 -vt 0.442818 0.940641 -vt 0.465231 0.940641 -vt 0.465231 0.971546 -vt 0.233674 0.849961 -vt 0.211261 0.849961 -vt 0.211261 0.819056 -vt 0.522505 0.912435 -vt 0.500092 0.912435 -vt 0.500092 0.881530 -vt 0.470993 0.819056 -vt 0.470993 0.849961 -vt 0.448580 0.849961 -vt 0.586903 0.849961 -vt 0.586903 0.819056 -vt 0.609316 0.819056 -vt 0.469202 0.910790 -vt 0.469202 0.879885 -vt 0.446789 0.879885 -vt 0.503268 0.849961 -vt 0.503268 0.819056 -vt 0.525681 0.819056 -vt 0.407021 0.015734 -vt 0.229956 0.219789 -vt 0.193202 0.013495 -vt 0.193202 0.219788 -vt 0.618600 0.396853 -vt 0.291688 0.428322 -vt 0.080109 0.722028 -vt 0.961450 0.515734 -vt 0.586903 0.428322 -vt 0.650875 0.515734 -vt 0.842790 0.222028 -vt 0.778818 0.222028 -vt 0.727976 0.049825 -vt 0.038550 0.787587 -vt 0.503268 0.428322 -vt 0.439296 0.428322 -vt 0.375324 0.722028 -vt 0.958385 0.969712 -vt 0.842790 0.515734 -vt 0.375324 0.428322 -vt 0.906762 0.515734 -vt 0.952166 0.222028 -vt 0.650875 0.222028 -vt 0.714846 0.515734 -vt 0.897478 0.222028 -vt 0.714847 0.222028 -vt 0.320636 0.722028 -vt 0.778818 0.515734 -vt 0.080109 0.428322 -vt 0.163745 0.428322 -vt 0.016137 0.428322 -vt 0.227717 0.428322 -vt 0.673288 0.059441 -vt 0.750389 0.125000 -vt 0.448580 0.787587 -vt 0.265949 0.765734 -vt 0.503268 0.765734 -vt 0.038550 0.840909 -vt 0.522306 0.943789 -vt 0.579193 0.870880 -vt 0.156573 0.819056 -vt 0.186158 0.722028 -vt 0.782664 0.049825 -vt 0.837352 0.071678 -vt 0.609316 0.743881 -vt 0.782664 0.146853 -vt 0.837352 0.168706 -vt 0.265949 0.849961 -vt 0.442818 0.971546 -vt 0.233674 0.819056 -vt 0.522505 0.881530 -vt 0.448580 0.819056 -vt 0.609316 0.849961 -vt 0.446789 0.910790 -vt 0.525681 0.849961 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 1.000000 -vn 1.000000 0.000000 0.000000 -vn 0.000000 0.000000 -1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.707107 0.000000 0.707107 -vn -0.707107 0.000000 0.707107 -vn 0.707107 0.000000 -0.707107 -vn -0.707107 0.000000 -0.707107 -vn 0.000000 1.000000 0.000000 -vn 1.000000 -0.000001 0.000000 -vn 0.000000 1.000000 -0.000001 -vn 0.000000 1.000000 0.000002 -vn 0.000000 0.707107 -0.707107 -vn 0.000000 0.707107 0.707107 -vn 0.000000 0.707105 -0.707108 -vn 0.000000 1.000000 -0.000004 -vn -1.000000 -0.000001 -0.000000 -vn 1.000000 -0.000002 -0.000000 -vn -0.000000 0.707108 -0.707106 -vn 0.000000 0.707107 -0.707106 -vn 0.000000 0.707108 -0.707105 -s off -f 5/1/1 6/2/1 2/3/1 -f 4/4/2 8/5/2 5/6/2 -f 7/7/3 8/8/3 4/9/3 -f 6/10/4 7/11/4 3/12/4 -f 2/13/5 3/14/5 4/15/5 -f 19/16/6 33/17/6 23/18/6 -f 46/19/2 9/20/2 21/21/2 -f 42/22/4 14/23/4 25/24/4 -f 17/25/7 37/26/7 27/27/7 -f 38/28/8 26/29/8 22/30/8 -f 47/31/3 36/32/3 13/33/3 -f 40/34/9 22/35/9 24/36/9 -f 26/37/3 25/38/3 64/39/3 -f 70/40/1 69/41/1 30/42/1 -f 44/43/10 43/44/10 5/45/10 -f 46/46/10 8/47/10 45/48/10 -f 48/49/10 47/50/10 7/51/10 -f 42/52/10 6/53/10 41/54/10 -f 54/55/7 21/56/7 33/57/7 -f 48/49/10 7/51/10 50/58/10 -f 53/59/10 44/43/10 5/45/10 -f 41/54/10 6/53/10 51/60/10 -f 39/61/7 24/62/7 28/63/7 -f 7/51/10 47/50/10 56/64/10 -f 40/65/10 39/66/10 29/67/10 -f 52/68/10 20/69/10 50/58/10 -f 55/70/10 56/64/10 18/71/10 -f 53/59/10 54/72/10 19/73/10 -f 51/60/10 49/74/10 17/75/10 -f 50/76/4 30/77/4 34/78/4 -f 20/79/9 31/80/9 30/81/9 -f 52/82/8 25/83/8 31/84/8 -f 51/85/1 27/86/1 16/87/1 -f 43/88/1 12/89/1 32/90/1 -f 44/91/7 11/92/7 12/93/7 -f 41/94/9 16/95/9 14/96/9 -f 55/97/3 15/98/3 10/99/3 -f 48/100/8 34/101/8 36/102/8 -f 53/103/2 23/104/2 11/105/2 -f 56/106/6 13/107/6 35/108/6 -f 45/109/6 10/110/6 9/111/6 -f 49/112/9 32/113/9 37/114/9 -f 29/115/6 28/116/6 26/117/6 -f 18/118/8 35/119/8 15/120/8 -f 28/121/10 24/122/10 30/123/10 -f 34/124/3 63/125/3 66/126/3 -f 25/127/10 26/128/10 28/121/10 -f 26/129/11 59/130/11 61/131/11 -f 58/132/1 37/133/1 11/134/1 -f 26/135/10 23/136/10 33/137/10 -f 36/138/10 34/139/10 35/140/10 -f 60/141/12 61/142/12 59/143/12 -f 67/144/10 68/145/10 65/146/10 -f 69/147/10 70/148/10 66/149/10 -f 71/150/13 62/151/13 73/152/13 -f 21/153/10 24/154/10 22/155/10 -f 21/156/1 71/157/1 72/158/1 -f 67/159/1 14/160/1 37/161/1 -f 12/162/10 11/163/10 37/164/10 -f 27/165/10 37/166/10 14/167/10 -f 9/168/3 35/169/3 73/170/3 -f 15/171/10 35/172/10 9/173/10 -f 34/174/14 30/175/14 69/176/14 -f 62/177/15 71/178/15 21/179/15 -f 35/180/16 24/181/16 72/182/16 -f 24/183/15 35/184/15 66/185/15 -f 23/186/15 61/187/15 60/188/15 -f 59/189/14 26/190/14 37/191/14 -f 26/192/15 65/193/15 68/194/15 -f 14/195/14 67/196/14 64/197/14 -f 1/198/1 5/1/1 2/3/1 -f 1/199/2 4/4/2 5/6/2 -f 3/200/3 7/7/3 4/9/3 -f 2/201/4 6/10/4 3/12/4 -f 1/202/5 2/13/5 4/15/5 -f 53/203/6 19/16/6 23/18/6 -f 54/204/2 46/19/2 21/21/2 -f 52/205/4 42/22/4 25/24/4 -f 51/206/7 17/25/7 27/27/7 -f 40/207/8 38/28/8 22/30/8 -f 56/208/3 47/31/3 13/33/3 -f 39/209/9 40/34/9 24/36/9 -f 65/210/3 26/37/3 64/39/3 -f 24/211/1 70/40/1 30/42/1 -f 19/212/7 54/55/7 33/57/7 -f 6/53/10 52/68/10 7/51/10 -f 6/53/10 42/52/10 52/68/10 -f 5/45/10 43/44/10 49/74/10 -f 7/51/10 52/68/10 50/58/10 -f 53/59/10 8/47/10 54/72/10 -f 5/45/10 49/74/10 6/53/10 -f 8/47/10 46/46/10 54/72/10 -f 53/59/10 5/45/10 8/47/10 -f 29/213/7 39/61/7 28/63/7 -f 6/53/10 49/74/10 51/60/10 -f 55/70/10 45/48/10 8/47/10 -f 48/214/4 50/76/4 34/78/4 -f 55/70/10 7/51/10 56/64/10 -f 38/215/10 40/65/10 29/67/10 -f 55/70/10 8/47/10 7/51/10 -f 50/216/9 20/79/9 30/81/9 -f 20/217/8 52/82/8 31/84/8 -f 41/218/1 51/85/1 16/87/1 -f 49/219/1 43/88/1 32/90/1 -f 43/220/7 44/91/7 12/93/7 -f 42/221/9 41/94/9 14/96/9 -f 45/222/3 55/97/3 10/99/3 -f 47/223/8 48/100/8 36/102/8 -f 44/224/2 53/103/2 11/105/2 -f 18/225/6 56/106/6 35/108/6 -f 46/226/6 45/109/6 9/111/6 -f 17/227/9 49/112/9 37/114/9 -f 38/228/6 29/115/6 26/117/6 -f 55/229/8 18/118/8 15/120/8 -f 31/230/10 28/121/10 30/123/10 -f 35/231/3 34/124/3 66/126/3 -f 31/230/10 25/127/10 28/121/10 -f 23/232/3 26/129/3 61/131/3 -f 60/233/1 58/132/1 11/134/1 -f 22/155/10 26/135/10 33/137/10 -f 13/234/10 36/138/10 35/140/10 -f 58/235/10 60/141/10 59/143/10 -f 64/236/17 67/144/17 65/146/17 -f 63/237/10 69/147/10 66/149/10 -f 72/238/10 71/150/10 73/152/10 -f 33/137/10 21/153/10 22/155/10 -f 24/239/1 21/156/1 72/158/1 -f 68/240/18 67/159/18 37/161/18 -f 32/241/10 12/162/10 37/164/10 -f 16/242/10 27/165/10 14/167/10 -f 62/243/19 9/168/19 73/170/19 -f 10/244/10 15/171/10 9/173/10 -f 63/245/14 34/174/14 69/176/14 -f 9/246/15 62/177/15 21/179/15 -f 73/247/20 35/180/20 72/182/20 -f 70/248/15 24/183/15 66/185/15 -f 11/249/15 23/186/15 60/188/15 -f 58/250/21 59/189/21 37/191/21 -f 37/251/15 26/192/15 68/194/15 -f 25/252/22 14/195/22 64/197/22 -l 57 26 diff --git a/src/main/resources/assets/hbm/models/centrifuge_new.obj b/src/main/resources/assets/hbm/models/centrifuge_new.obj deleted file mode 100644 index 357ce15eb..000000000 --- a/src/main/resources/assets/hbm/models/centrifuge_new.obj +++ /dev/null @@ -1,874 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'centrifuge_new.blend' -# www.blender.org -o Cube_Cube.001 -v -0.500000 0.000000 0.500000 -v -0.500000 1.000000 0.500000 -v -0.500000 0.000000 -0.500000 -v -0.500000 1.000000 -0.500000 -v 0.500000 0.000000 0.500000 -v 0.500000 1.000000 0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 1.000000 -0.500000 -v -0.500000 0.343750 0.156250 -v -0.500000 0.656250 0.156250 -v -0.500000 0.343750 -0.156250 -v -0.500000 0.656250 -0.156250 -v 0.500000 0.343750 0.156250 -v 0.500000 0.656250 0.156250 -v 0.500000 0.343750 -0.156250 -v 0.500000 0.656250 -0.156250 -v 0.156250 0.343750 0.500000 -v 0.156250 0.656250 0.500000 -v -0.156250 0.343750 0.500000 -v -0.156250 0.656250 0.500000 -v 0.156250 0.343750 -0.500000 -v 0.156250 0.656250 -0.500000 -v -0.156250 0.343750 -0.500000 -v -0.156250 0.656250 -0.500000 -v -0.250000 0.250000 0.500000 -v -0.250000 0.750000 0.500000 -v -0.250000 0.250000 -0.500000 -v -0.250000 0.750000 -0.500000 -v 0.250000 0.250000 0.500000 -v 0.250000 0.750000 0.500000 -v 0.250000 0.250000 -0.500000 -v 0.250000 0.750000 -0.500000 -v 0.500000 0.250000 0.250000 -v 0.500000 0.750000 0.250000 -v -0.500000 0.250000 0.250000 -v -0.500000 0.750000 0.250000 -v 0.500000 0.250000 -0.250000 -v 0.500000 0.750000 -0.250000 -v -0.500000 0.250000 -0.250000 -v -0.500000 0.750000 -0.250000 -v -0.250000 0.750000 -0.437500 -v 0.250000 0.750000 -0.437500 -v 0.250000 0.250000 -0.437500 -v -0.250000 0.250000 -0.437500 -v 0.250000 0.750000 0.437500 -v -0.250000 0.750000 0.437500 -v -0.250000 0.250000 0.437500 -v 0.250000 0.250000 0.437500 -v -0.437500 0.750000 0.250000 -v -0.437500 0.750000 -0.250000 -v -0.437500 0.250000 -0.250000 -v -0.437500 0.250000 0.250000 -v 0.437500 0.750000 -0.250000 -v 0.437500 0.750000 0.250000 -v 0.437500 0.250000 0.250000 -v 0.437500 0.250000 -0.250000 -v -0.437500 0.656250 0.156250 -v -0.437500 0.343750 0.156250 -v -0.437500 0.343750 -0.156250 -v -0.437500 0.656250 -0.156250 -v 0.437500 0.656250 -0.156250 -v 0.437500 0.343750 -0.156250 -v 0.437500 0.343750 0.156250 -v 0.437500 0.656250 0.156250 -v 0.156250 0.656250 0.437500 -v 0.156250 0.343750 0.437500 -v -0.156250 0.343750 0.437500 -v -0.156250 0.656250 0.437500 -v -0.156250 0.656250 -0.437500 -v -0.156250 0.343750 -0.437500 -v 0.156250 0.343750 -0.437500 -v 0.156250 0.656250 -0.437500 -v 0.250000 2.900000 -0.450000 -v 0.250000 1.000000 -0.450000 -v 0.250000 1.000000 0.050000 -v 0.250000 2.900000 0.050000 -v 0.391421 1.000000 0.108579 -v 0.391421 2.900000 0.108579 -v 0.450000 1.000000 0.250000 -v 0.450000 2.900000 0.250000 -v 0.391421 1.000000 0.391421 -v 0.391421 2.900000 0.391421 -v 0.250000 1.000000 0.450000 -v 0.250000 2.900000 0.450000 -v 0.108579 1.000000 0.391421 -v 0.108579 2.900000 0.391421 -v 0.050000 1.000000 0.250000 -v 0.050000 2.900000 0.250000 -v 0.108579 1.000000 0.108579 -v 0.108579 2.900000 0.108579 -v 0.391421 1.000000 -0.391421 -v 0.391421 2.900000 -0.391421 -v 0.450000 1.000000 -0.250000 -v 0.450000 2.900000 -0.250000 -v 0.391421 1.000000 -0.108579 -v 0.391421 2.900000 -0.108579 -v 0.250000 1.000000 -0.050000 -v 0.250000 2.900000 -0.050000 -v 0.108579 1.000000 -0.108579 -v 0.108579 2.900000 -0.108579 -v 0.050000 1.000000 -0.250000 -v 0.050000 2.900000 -0.250000 -v 0.108579 1.000000 -0.391421 -v 0.108579 2.900000 -0.391421 -v -0.250000 2.900000 -0.450000 -v -0.250000 1.000000 -0.450000 -v -0.250000 1.000000 0.050000 -v -0.250000 2.900000 0.050000 -v -0.108579 1.000000 0.108579 -v -0.108579 2.900000 0.108579 -v -0.050000 1.000000 0.250000 -v -0.050000 2.900000 0.250000 -v -0.108579 1.000000 0.391421 -v -0.108579 2.900000 0.391421 -v -0.250000 1.000000 0.450000 -v -0.250000 2.900000 0.450000 -v -0.391421 1.000000 0.391421 -v -0.391421 2.900000 0.391421 -v -0.450000 1.000000 0.250000 -v -0.450000 2.900000 0.250000 -v -0.391421 1.000000 0.108579 -v -0.391421 2.900000 0.108579 -v -0.108579 1.000000 -0.391421 -v -0.108579 2.900000 -0.391421 -v -0.050000 1.000000 -0.250000 -v -0.050000 2.900000 -0.250000 -v -0.108579 1.000000 -0.108579 -v -0.108579 2.900000 -0.108579 -v -0.250000 1.000000 -0.050000 -v -0.250000 2.900000 -0.050000 -v -0.391421 1.000000 -0.108579 -v -0.391421 2.900000 -0.108579 -v -0.450000 1.000000 -0.250000 -v -0.450000 2.900000 -0.250000 -v -0.391421 1.000000 -0.391421 -v -0.391421 2.900000 -0.391421 -v 0.320711 2.950000 0.179289 -v 0.250000 2.950000 0.150000 -v 0.179289 2.950000 0.179289 -v 0.150000 2.950000 0.250000 -v 0.179289 2.950000 0.320711 -v 0.250000 2.950000 0.350000 -v 0.320711 2.950000 0.320711 -v 0.350000 2.950000 0.250000 -v 0.320711 2.950000 -0.320711 -v 0.250000 2.950000 -0.350000 -v 0.179289 2.950000 -0.320711 -v 0.150000 2.950000 -0.250000 -v 0.179289 2.950000 -0.179289 -v 0.250000 2.950000 -0.150000 -v 0.320711 2.950000 -0.179289 -v 0.350000 2.950000 -0.250000 -v -0.179289 2.950000 0.179289 -v -0.250000 2.950000 0.150000 -v -0.320711 2.950000 0.179289 -v -0.350000 2.950000 0.250000 -v -0.320711 2.950000 0.320711 -v -0.250000 2.950000 0.350000 -v -0.179289 2.950000 0.320711 -v -0.150000 2.950000 0.250000 -v -0.179289 2.950000 -0.320711 -v -0.250000 2.950000 -0.350000 -v -0.320711 2.950000 -0.320711 -v -0.350000 2.950000 -0.250000 -v -0.320711 2.950000 -0.179289 -v -0.250000 2.950000 -0.150000 -v -0.179289 2.950000 -0.179289 -v -0.150000 2.950000 -0.250000 -v 0.100000 1.000000 -0.064645 -v 0.100000 3.000000 -0.064645 -v 0.064645 1.000000 -0.100000 -v 0.064645 3.000000 -0.100000 -v 0.135355 1.000000 -0.100000 -v 0.135355 3.000000 -0.100000 -v 0.100000 1.000000 -0.135355 -v 0.100000 3.000000 -0.135355 -v 0.100000 3.050000 -0.064645 -v 0.064645 3.050000 -0.100000 -v 0.100000 3.050000 -0.135355 -v 0.135355 3.050000 -0.100000 -v 0.250000 3.050000 -0.214645 -v 0.214645 3.050000 -0.250000 -v 0.250000 3.050000 -0.285355 -v 0.285355 3.050000 -0.250000 -v 0.250000 3.000000 -0.214645 -v 0.214645 3.000000 -0.250000 -v 0.250000 3.000000 -0.285355 -v 0.285355 3.000000 -0.250000 -v 0.250000 2.950000 -0.214645 -v 0.214645 2.950000 -0.250000 -v 0.250000 2.950000 -0.285355 -v 0.285355 2.950000 -0.250000 -v 0.100000 1.000000 0.435355 -v 0.100000 3.000000 0.435355 -v 0.064645 1.000000 0.400000 -v 0.064645 3.000000 0.400000 -v 0.135355 1.000000 0.400000 -v 0.135355 3.000000 0.400000 -v 0.100000 1.000000 0.364645 -v 0.100000 3.000000 0.364645 -v 0.100000 3.050000 0.435355 -v 0.064645 3.050000 0.400000 -v 0.100000 3.050000 0.364645 -v 0.135355 3.050000 0.400000 -v 0.250000 3.050000 0.285355 -v 0.214645 3.050000 0.250000 -v 0.250000 3.050000 0.214645 -v 0.285355 3.050000 0.250000 -v 0.250000 3.000000 0.285355 -v 0.214645 3.000000 0.250000 -v 0.250000 3.000000 0.214645 -v 0.285355 3.000000 0.250000 -v 0.250000 2.950000 0.285355 -v 0.214645 2.950000 0.250000 -v 0.250000 2.950000 0.214645 -v 0.285355 2.950000 0.250000 -v -0.400000 1.000000 0.435355 -v -0.400000 3.000000 0.435355 -v -0.435355 1.000000 0.400000 -v -0.435355 3.000000 0.400000 -v -0.364645 1.000000 0.400000 -v -0.364645 3.000000 0.400000 -v -0.400000 1.000000 0.364645 -v -0.400000 3.000000 0.364645 -v -0.400000 3.050000 0.435355 -v -0.435355 3.050000 0.400000 -v -0.400000 3.050000 0.364645 -v -0.364645 3.050000 0.400000 -v -0.250000 3.050000 0.285355 -v -0.285355 3.050000 0.250000 -v -0.250000 3.050000 0.214645 -v -0.214645 3.050000 0.250000 -v -0.250000 3.000000 0.285355 -v -0.285355 3.000000 0.250000 -v -0.250000 3.000000 0.214645 -v -0.214645 3.000000 0.250000 -v -0.250000 2.950000 0.285355 -v -0.285355 2.950000 0.250000 -v -0.250000 2.950000 0.214645 -v -0.214645 2.950000 0.250000 -v -0.400000 1.000000 -0.064645 -v -0.400000 3.000000 -0.064645 -v -0.435355 1.000000 -0.100000 -v -0.435355 3.000000 -0.100000 -v -0.364645 1.000000 -0.100000 -v -0.364645 3.000000 -0.100000 -v -0.400000 1.000000 -0.135355 -v -0.400000 3.000000 -0.135355 -v -0.400000 3.050000 -0.064645 -v -0.435355 3.050000 -0.100000 -v -0.400000 3.050000 -0.135355 -v -0.364645 3.050000 -0.100000 -v -0.250000 3.050000 -0.214645 -v -0.285355 3.050000 -0.250000 -v -0.250000 3.050000 -0.285355 -v -0.214645 3.050000 -0.250000 -v -0.250000 3.000000 -0.214645 -v -0.285355 3.000000 -0.250000 -v -0.250000 3.000000 -0.285355 -v -0.214645 3.000000 -0.250000 -v -0.250000 2.950000 -0.214645 -v -0.285355 2.950000 -0.250000 -v -0.250000 2.950000 -0.285355 -v -0.214645 2.950000 -0.250000 -vt 0.695312 0.371094 -vt 0.949219 0.371094 -vt 0.949219 0.625000 -vt 0.144531 -0.000000 -vt 0.207031 0.000000 -vt 0.207031 0.062500 -vt 0.136719 0.039062 -vt 0.128906 0.031250 -vt 0.128906 0.015625 -vt 0.136719 0.007812 -vt 0.113281 0.015625 -vt 0.113281 0.031250 -vt 0.105469 0.039062 -vt 0.089844 0.027344 -vt 0.070312 0.027344 -vt 0.070312 0.007812 -vt 0.046875 0.015625 -vt 0.015625 0.015625 -vt -0.000000 0.000000 -vt 0.015625 0.046875 -vt 0.046875 0.046875 -vt 0.062500 0.062500 -vt 0.000000 0.062500 -vt 0.062500 0.000000 -vt 0.136719 0.042969 -vt 0.105469 0.007812 -vt 0.101562 0.039062 -vt 0.105469 0.003906 -vt 0.140625 0.007812 -vt 0.093750 0.007812 -vt 0.093750 0.027344 -vt 0.070312 0.003906 -vt 0.089844 0.003906 -vt 0.089844 0.007812 -vt 0.066406 0.027344 -vt 0.066406 0.007812 -vt 0.089844 0.031250 -vt 0.070312 0.031250 -vt 0.050903 0.836838 -vt 0.013435 0.836838 -vt 0.013433 0.371769 -vt 0.238245 0.836838 -vt 0.200776 0.836838 -vt 0.200776 0.371768 -vt 0.088372 0.836838 -vt 0.050902 0.371769 -vt 0.163308 0.836838 -vt 0.163307 0.371768 -vt 0.125840 0.836838 -vt 0.088370 0.371769 -vt 0.125839 0.371769 -vt 0.377931 0.861153 -vt 0.377931 0.371601 -vt 0.390169 0.371601 -vt 0.313181 0.836838 -vt 0.275713 0.836838 -vt 0.275713 0.371768 -vt 0.238244 0.371768 -vt 0.353454 0.861153 -vt 0.353454 0.371601 -vt 0.365692 0.371601 -vt 0.365692 0.861153 -vt 0.341215 0.861153 -vt 0.341216 0.371601 -vt 0.875778 0.677068 -vt 0.889025 0.645087 -vt 0.921006 0.658334 -vt 0.228878 0.862551 -vt 0.210143 0.862551 -vt 0.266346 0.862551 -vt 0.247612 0.862551 -vt 0.303814 0.862551 -vt 0.285080 0.862551 -vt 0.041536 0.862552 -vt 0.022802 0.862552 -vt 0.079004 0.862551 -vt 0.060270 0.862552 -vt 0.116473 0.862551 -vt 0.097739 0.862551 -vt 0.153941 0.862551 -vt 0.135207 0.862551 -vt 0.191409 0.862551 -vt 0.172675 0.862551 -vt 0.875778 0.658334 -vt 0.907759 0.645087 -vt 0.921006 0.677068 -vt 0.443375 0.716201 -vt 0.431136 0.716201 -vt 0.431136 0.676515 -vt 0.455614 0.676515 -vt 0.455614 0.664276 -vt 0.467852 0.664276 -vt 0.467852 0.652038 -vt 0.480091 0.676515 -vt 0.467852 0.676515 -vt 0.443375 0.664276 -vt 0.455614 0.728439 -vt 0.455614 0.716201 -vt 0.467852 0.716201 -vt 0.888254 0.732063 -vt 0.888254 0.719824 -vt 0.900493 0.719824 -vt 0.480091 0.716201 -vt 0.480091 0.728439 -vt 0.443375 0.728439 -vt 0.467852 0.728439 -vt 0.467852 0.740678 -vt 0.455614 0.740678 -vt 0.912731 0.732063 -vt 0.912731 0.719824 -vt 0.924970 0.719824 -vt 0.900493 0.732063 -vt 0.876015 0.732063 -vt 0.876015 0.719824 -vt 0.924970 0.732063 -vt 0.695312 0.625000 -vt 0.144531 0.062500 -vt 0.105469 0.042969 -vt 0.101562 0.007812 -vt 0.136719 0.003906 -vt 0.140625 0.039062 -vt 0.390170 0.861153 -vt 0.313181 0.371768 -vt 0.907759 0.690316 -vt 0.889025 0.690315 -vt 0.443375 0.676515 -vt 0.455614 0.652038 -vt 0.480091 0.664276 -vn 0.000000 -1.000000 0.000000 -vn 0.000000 1.000000 0.000000 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 1.000000 -vn 0.000000 0.000000 -1.000000 -vn 1.000000 0.000000 0.000000 -vn -0.923900 0.000000 0.382700 -vn 0.382700 0.000000 -0.923900 -vn -0.382700 0.000000 0.923900 -vn 0.923900 0.000000 -0.382700 -vn 0.382700 0.000000 0.923900 -vn 0.923900 0.000000 0.382700 -vn -0.707100 0.000000 -0.707100 -vn -0.923900 0.000000 -0.382700 -vn -0.382700 0.000000 -0.923900 -vn 0.707100 0.000000 0.707100 -vn 0.707100 0.000000 -0.707100 -vn -0.707100 0.000000 0.707100 -vn 0.182100 0.879500 -0.439700 -vn -0.182100 0.879500 -0.439700 -vn -0.439700 0.879500 -0.182100 -vn -0.439700 0.879500 0.182100 -vn -0.182100 0.879500 0.439700 -vn 0.182100 0.879500 0.439700 -vn 0.439700 0.879500 0.182100 -vn 0.439700 0.879500 -0.182100 -s off -f 3/1/1 7/2/1 5/3/1 -f 8/4/2 4/5/2 2/6/2 -f 49/7/3 57/8/3 58/9/3 -f 52/10/3 58/9/3 59/11/3 -f 59/11/3 60/12/3 50/13/3 -f 18/14/4 20/15/4 19/16/4 -f 27/17/5 31/18/5 7/19/5 -f 32/20/5 28/21/5 4/22/5 -f 35/17/3 39/18/3 3/19/3 -f 40/20/3 36/21/3 2/22/3 -f 29/17/4 25/18/4 1/19/4 -f 26/20/4 30/21/4 6/22/4 -f 37/17/6 33/18/6 5/19/6 -f 34/20/6 38/21/6 8/22/6 -f 6/23/6 5/19/6 33/18/6 -f 29/17/4 5/24/4 6/22/4 -f 2/23/4 1/19/4 25/18/4 -f 35/17/3 1/24/3 2/22/3 -f 4/23/3 3/19/3 39/18/3 -f 27/17/5 3/24/5 4/22/5 -f 8/23/5 7/19/5 31/18/5 -f 37/17/6 7/24/6 8/22/6 -f 42/13/1 41/7/1 28/25/1 -f 43/26/3 42/13/3 32/27/3 -f 44/10/2 43/26/2 31/28/2 -f 41/7/6 44/10/6 27/29/6 -f 46/13/1 45/7/1 30/25/1 -f 47/26/6 46/13/6 26/27/6 -f 48/10/2 47/26/2 25/28/2 -f 45/7/3 48/10/3 29/29/3 -f 50/13/1 49/7/1 36/25/1 -f 51/26/4 50/13/4 40/27/4 -f 52/10/2 51/26/2 39/28/2 -f 49/7/5 52/10/5 35/29/5 -f 54/13/1 53/7/1 38/25/1 -f 55/26/5 54/13/5 34/27/5 -f 56/10/2 55/26/2 33/28/2 -f 53/7/4 56/10/4 37/29/4 -f 47/26/4 67/11/4 68/12/4 -f 58/30/4 57/31/4 10/14/4 -f 59/32/1 58/33/1 9/34/1 -f 60/35/5 59/36/5 11/16/5 -f 57/37/2 60/38/2 12/15/2 -f 46/13/4 68/12/4 65/8/4 -f 62/30/5 61/31/5 16/14/5 -f 63/32/1 62/33/1 15/34/1 -f 64/35/4 63/36/4 13/16/4 -f 61/37/2 64/38/2 14/15/2 -f 65/8/4 66/9/4 48/10/4 -f 66/30/6 65/31/6 18/14/6 -f 67/32/1 66/33/1 17/34/1 -f 68/35/3 67/36/3 19/16/3 -f 65/37/2 68/38/2 20/15/2 -f 66/9/4 67/11/4 47/26/4 -f 70/30/3 69/31/3 24/14/3 -f 71/32/1 70/33/1 23/34/1 -f 72/35/6 71/36/6 21/16/6 -f 69/37/2 72/38/2 22/15/2 -f 60/12/3 57/8/3 49/7/3 -f 43/26/5 71/11/5 72/12/5 -f 70/9/5 71/11/5 43/26/5 -f 69/8/5 70/9/5 44/10/5 -f 42/13/5 72/12/5 69/8/5 -f 63/11/6 64/12/6 54/13/6 -f 56/10/6 62/9/6 63/11/6 -f 53/7/6 61/8/6 62/9/6 -f 64/12/6 61/8/6 53/7/6 -f 10/14/3 12/15/3 11/16/3 -f 24/14/5 22/15/5 21/16/5 -f 16/14/6 14/15/6 13/16/6 -f 100/39/7 102/40/7 101/41/7 -f 76/42/8 78/43/8 77/44/8 -f 98/45/9 100/39/9 99/46/9 -f 78/43/10 80/47/10 79/48/10 -f 96/49/11 98/45/11 97/50/11 -f 80/47/12 82/49/12 81/51/12 -f 200/52/13 199/53/13 195/54/13 -f 94/47/12 96/49/12 95/51/12 -f 82/49/11 84/45/11 83/50/11 -f 102/55/14 104/56/14 103/57/14 -f 92/43/10 94/47/10 93/48/10 -f 84/45/9 86/39/9 85/46/9 -f 104/56/15 73/42/15 74/58/15 -f 73/42/8 92/43/8 91/44/8 -f 86/39/7 88/40/7 87/41/7 -f 170/59/16 169/60/16 173/61/16 -f 90/56/15 76/42/15 75/58/15 -f 88/55/14 90/56/14 89/57/14 -f 174/62/17 173/61/17 175/53/17 -f 198/62/17 197/61/17 199/53/17 -f 132/39/7 134/40/7 133/41/7 -f 108/42/8 110/43/8 109/44/8 -f 130/45/9 132/39/9 131/46/9 -f 110/43/10 112/47/10 111/48/10 -f 128/49/11 130/45/11 129/50/11 -f 112/47/12 114/49/12 113/51/12 -f 194/59/16 193/60/16 197/61/16 -f 126/47/12 128/49/12 127/51/12 -f 114/49/11 116/45/11 115/50/11 -f 134/55/14 136/56/14 135/57/14 -f 124/43/10 126/47/10 125/48/10 -f 116/45/9 118/39/9 117/46/9 -f 136/56/15 105/42/15 106/58/15 -f 105/42/8 124/43/8 123/44/8 -f 118/39/7 120/40/7 119/41/7 -f 176/52/13 175/53/13 171/54/13 -f 122/56/15 108/42/15 107/58/15 -f 120/55/14 122/56/14 121/57/14 -f 172/63/18 171/64/18 169/60/18 -f 140/65/2 142/66/2 144/67/2 -f 76/42/19 138/68/19 137/69/19 -f 139/70/20 138/71/20 76/42/20 -f 140/72/21 139/73/21 90/56/21 -f 141/74/22 140/75/22 88/40/22 -f 142/76/23 141/77/23 86/39/23 -f 143/78/24 142/79/24 84/45/24 -f 144/80/25 143/81/25 82/49/25 -f 137/82/26 144/83/26 80/47/26 -f 148/65/2 150/66/2 152/67/2 -f 73/42/19 146/68/19 145/69/19 -f 104/56/20 147/70/20 146/71/20 -f 148/72/21 147/73/21 104/56/21 -f 100/39/22 149/74/22 148/75/22 -f 98/45/23 150/76/23 149/77/23 -f 151/78/24 150/79/24 98/45/24 -f 152/80/25 151/81/25 96/49/25 -f 92/43/26 145/82/26 152/83/26 -f 156/84/2 158/85/2 160/86/2 -f 108/42/19 154/68/19 153/69/19 -f 155/70/20 154/71/20 108/42/20 -f 156/72/21 155/73/21 122/56/21 -f 118/39/22 157/74/22 156/75/22 -f 158/76/23 157/77/23 118/39/23 -f 114/49/24 159/78/24 158/79/24 -f 160/80/25 159/81/25 114/49/25 -f 153/82/26 160/83/26 112/47/26 -f 164/84/2 166/85/2 168/86/2 -f 162/68/19 161/69/19 124/43/19 -f 136/56/20 163/70/20 162/71/20 -f 164/72/21 163/73/21 136/56/21 -f 132/39/22 165/74/22 164/75/22 -f 166/76/23 165/77/23 132/39/23 -f 128/49/24 167/78/24 166/79/24 -f 168/80/25 167/81/25 128/49/25 -f 124/43/26 161/82/26 168/83/26 -f 186/87/1 185/88/1 174/89/1 -f 179/90/2 178/91/2 177/92/2 -f 170/93/18 177/92/18 178/91/18 -f 174/94/16 180/95/16 177/92/16 -f 172/96/13 178/91/13 179/90/13 -f 183/97/2 182/98/2 181/99/2 -f 185/100/16 189/101/16 192/102/16 -f 179/90/13 182/98/13 186/87/13 -f 181/99/16 185/103/16 188/104/16 -f 183/97/13 187/105/13 186/87/13 -f 184/106/17 188/107/17 187/108/17 -f 180/95/2 181/99/2 182/98/2 -f 187/109/13 191/110/13 190/111/13 -f 188/112/17 192/102/17 191/110/17 -f 186/113/18 190/114/18 189/101/18 -f 174/94/16 185/103/16 181/99/16 -f 196/63/18 195/64/18 193/60/18 -f 210/87/1 209/88/1 198/89/1 -f 203/90/2 202/91/2 201/92/2 -f 194/93/18 201/92/18 202/91/18 -f 198/94/16 204/95/16 201/92/16 -f 196/96/13 202/91/13 203/90/13 -f 207/97/2 206/98/2 205/99/2 -f 209/100/16 213/101/16 216/102/16 -f 203/90/13 206/98/13 210/87/13 -f 205/99/16 209/103/16 212/104/16 -f 207/97/13 211/105/13 210/87/13 -f 208/106/17 212/107/17 211/108/17 -f 204/95/2 205/99/2 206/98/2 -f 211/109/13 215/110/13 214/111/13 -f 212/112/17 216/102/17 215/110/17 -f 210/113/18 214/114/18 213/101/18 -f 198/94/16 209/103/16 205/99/16 -f 224/52/13 223/53/13 219/54/13 -f 222/62/17 221/61/17 223/53/17 -f 218/59/16 217/60/16 221/61/16 -f 220/63/18 219/64/18 217/60/18 -f 234/87/1 233/88/1 222/89/1 -f 227/90/2 226/91/2 225/92/2 -f 218/93/18 225/92/18 226/91/18 -f 222/94/16 228/95/16 225/92/16 -f 220/96/13 226/91/13 227/90/13 -f 231/97/2 230/98/2 229/99/2 -f 233/100/16 237/101/16 240/102/16 -f 227/90/13 230/98/13 234/87/13 -f 229/99/16 233/103/16 236/104/16 -f 231/97/13 235/105/13 234/87/13 -f 232/106/17 236/107/17 235/108/17 -f 228/95/2 229/99/2 230/98/2 -f 235/109/13 239/110/13 238/111/13 -f 236/112/17 240/102/17 239/110/17 -f 234/113/18 238/114/18 237/101/18 -f 222/94/16 233/103/16 229/99/16 -f 248/52/13 247/53/13 243/54/13 -f 246/62/17 245/61/17 247/53/17 -f 242/59/16 241/60/16 245/61/16 -f 244/63/18 243/64/18 241/60/18 -f 258/87/1 257/88/1 246/89/1 -f 251/90/2 250/91/2 249/92/2 -f 242/93/18 249/92/18 250/91/18 -f 246/94/16 252/95/16 249/92/16 -f 244/96/13 250/91/13 251/90/13 -f 255/97/2 254/98/2 253/99/2 -f 257/110/16 261/109/16 264/112/16 -f 251/90/13 254/98/13 258/87/13 -f 253/99/16 257/103/16 260/104/16 -f 255/97/13 259/105/13 258/87/13 -f 256/106/17 260/107/17 259/108/17 -f 252/95/2 253/99/2 254/98/2 -f 259/101/13 263/100/13 262/113/13 -f 260/102/17 264/112/17 263/100/17 -f 258/111/18 262/115/18 261/109/18 -f 246/94/16 257/103/16 253/99/16 -f 1/116/1 3/1/1 5/3/1 -f 6/117/2 8/4/2 2/6/2 -f 52/10/3 49/7/3 58/9/3 -f 51/26/3 52/10/3 59/11/3 -f 51/26/3 59/11/3 50/13/3 -f 17/34/4 18/14/4 19/16/4 -f 3/24/5 27/17/5 7/19/5 -f 8/23/5 32/20/5 4/22/5 -f 1/24/3 35/17/3 3/19/3 -f 4/23/3 40/20/3 2/22/3 -f 5/24/4 29/17/4 1/19/4 -f 2/23/4 26/20/4 6/22/4 -f 7/24/6 37/17/6 5/19/6 -f 6/23/6 34/20/6 8/22/6 -f 34/20/6 6/23/6 33/18/6 -f 30/21/4 29/17/4 6/22/4 -f 26/20/4 2/23/4 25/18/4 -f 36/21/3 35/17/3 2/22/3 -f 40/20/3 4/23/3 39/18/3 -f 28/21/5 27/17/5 4/22/5 -f 32/20/5 8/23/5 31/18/5 -f 38/21/6 37/17/6 8/22/6 -f 32/118/1 42/13/1 28/25/1 -f 31/119/3 43/26/3 32/27/3 -f 27/120/2 44/10/2 31/28/2 -f 28/121/6 41/7/6 27/29/6 -f 26/118/1 46/13/1 30/25/1 -f 25/119/6 47/26/6 26/27/6 -f 29/120/2 48/10/2 25/28/2 -f 30/121/3 45/7/3 29/29/3 -f 40/118/1 50/13/1 36/25/1 -f 39/119/4 51/26/4 40/27/4 -f 35/120/2 52/10/2 39/28/2 -f 36/121/5 49/7/5 35/29/5 -f 34/118/1 54/13/1 38/25/1 -f 33/119/5 55/26/5 34/27/5 -f 37/120/2 56/10/2 33/28/2 -f 38/121/4 53/7/4 37/29/4 -f 46/13/4 47/26/4 68/12/4 -f 9/34/4 58/30/4 10/14/4 -f 11/16/1 59/32/1 9/34/1 -f 12/15/5 60/35/5 11/16/5 -f 10/14/2 57/37/2 12/15/2 -f 45/7/4 46/13/4 65/8/4 -f 15/34/5 62/30/5 16/14/5 -f 13/16/1 63/32/1 15/34/1 -f 14/15/4 64/35/4 13/16/4 -f 16/14/2 61/37/2 14/15/2 -f 45/7/4 65/8/4 48/10/4 -f 17/34/6 66/30/6 18/14/6 -f 19/16/1 67/32/1 17/34/1 -f 20/15/3 68/35/3 19/16/3 -f 18/14/2 65/37/2 20/15/2 -f 48/10/4 66/9/4 47/26/4 -f 23/34/3 70/30/3 24/14/3 -f 21/16/1 71/32/1 23/34/1 -f 22/15/6 72/35/6 21/16/6 -f 24/14/2 69/37/2 22/15/2 -f 50/13/3 60/12/3 49/7/3 -f 42/13/5 43/26/5 72/12/5 -f 44/10/5 70/9/5 43/26/5 -f 41/7/5 69/8/5 44/10/5 -f 41/7/5 42/13/5 69/8/5 -f 55/26/6 63/11/6 54/13/6 -f 55/26/6 56/10/6 63/11/6 -f 56/10/6 53/7/6 62/9/6 -f 54/13/6 64/12/6 53/7/6 -f 9/34/3 10/14/3 11/16/3 -f 23/34/5 24/14/5 21/16/5 -f 15/34/6 16/14/6 13/16/6 -f 99/46/7 100/39/7 101/41/7 -f 75/58/8 76/42/8 77/44/8 -f 97/50/9 98/45/9 99/46/9 -f 77/44/10 78/43/10 79/48/10 -f 95/51/11 96/49/11 97/50/11 -f 79/48/12 80/47/12 81/51/12 -f 196/122/13 200/52/13 195/54/13 -f 93/48/12 94/47/12 95/51/12 -f 81/51/11 82/49/11 83/50/11 -f 101/123/14 102/55/14 103/57/14 -f 91/44/10 92/43/10 93/48/10 -f 83/50/9 84/45/9 85/46/9 -f 103/57/15 104/56/15 74/58/15 -f 74/58/8 73/42/8 91/44/8 -f 85/46/7 86/39/7 87/41/7 -f 174/62/16 170/59/16 173/61/16 -f 89/57/15 90/56/15 75/58/15 -f 87/123/14 88/55/14 89/57/14 -f 176/52/17 174/62/17 175/53/17 -f 200/52/17 198/62/17 199/53/17 -f 131/46/7 132/39/7 133/41/7 -f 107/58/8 108/42/8 109/44/8 -f 129/50/9 130/45/9 131/46/9 -f 109/44/10 110/43/10 111/48/10 -f 127/51/11 128/49/11 129/50/11 -f 111/48/12 112/47/12 113/51/12 -f 198/62/16 194/59/16 197/61/16 -f 125/48/12 126/47/12 127/51/12 -f 113/51/11 114/49/11 115/50/11 -f 133/123/14 134/55/14 135/57/14 -f 123/44/10 124/43/10 125/48/10 -f 115/50/9 116/45/9 117/46/9 -f 135/57/15 136/56/15 106/58/15 -f 106/58/8 105/42/8 123/44/8 -f 117/46/7 118/39/7 119/41/7 -f 172/122/13 176/52/13 171/54/13 -f 121/57/15 122/56/15 107/58/15 -f 119/123/14 120/55/14 121/57/14 -f 170/59/18 172/63/18 169/60/18 -f 144/67/2 137/86/2 138/124/2 -f 138/124/2 139/125/2 140/65/2 -f 140/65/2 141/84/2 142/66/2 -f 142/66/2 143/85/2 144/67/2 -f 144/67/2 138/124/2 140/65/2 -f 78/43/19 76/42/19 137/69/19 -f 90/56/20 139/70/20 76/42/20 -f 88/55/21 140/72/21 90/56/21 -f 86/39/22 141/74/22 88/40/22 -f 84/45/23 142/76/23 86/39/23 -f 82/49/24 143/78/24 84/45/24 -f 80/47/25 144/80/25 82/49/25 -f 78/43/26 137/82/26 80/47/26 -f 152/67/2 145/86/2 146/124/2 -f 146/124/2 147/125/2 148/65/2 -f 148/65/2 149/84/2 150/66/2 -f 150/66/2 151/85/2 152/67/2 -f 152/67/2 146/124/2 148/65/2 -f 92/43/19 73/42/19 145/69/19 -f 73/42/20 104/56/20 146/71/20 -f 102/55/21 148/72/21 104/56/21 -f 102/40/22 100/39/22 148/75/22 -f 100/39/23 98/45/23 149/77/23 -f 96/49/24 151/78/24 98/45/24 -f 94/47/25 152/80/25 96/49/25 -f 94/47/26 92/43/26 152/83/26 -f 160/86/2 153/124/2 154/125/2 -f 154/125/2 155/65/2 156/84/2 -f 156/84/2 157/66/2 158/85/2 -f 158/85/2 159/67/2 160/86/2 -f 160/86/2 154/125/2 156/84/2 -f 110/43/19 108/42/19 153/69/19 -f 122/56/20 155/70/20 108/42/20 -f 120/55/21 156/72/21 122/56/21 -f 120/40/22 118/39/22 156/75/22 -f 116/45/23 158/76/23 118/39/23 -f 116/45/24 114/49/24 158/79/24 -f 112/47/25 160/80/25 114/49/25 -f 110/43/26 153/82/26 112/47/26 -f 168/86/2 161/124/2 162/125/2 -f 162/125/2 163/65/2 164/84/2 -f 164/84/2 165/66/2 166/85/2 -f 166/85/2 167/67/2 168/86/2 -f 168/86/2 162/125/2 164/84/2 -f 105/42/19 162/68/19 124/43/19 -f 105/42/20 136/56/20 162/71/20 -f 134/55/21 164/72/21 136/56/21 -f 134/40/22 132/39/22 164/75/22 -f 130/45/23 166/76/23 132/39/23 -f 130/45/24 128/49/24 166/79/24 -f 126/47/25 168/80/25 128/49/25 -f 126/47/26 124/43/26 168/83/26 -f 176/126/1 186/87/1 174/89/1 -f 180/95/2 179/90/2 177/92/2 -f 172/127/18 170/93/18 178/91/18 -f 170/128/16 174/94/16 177/92/16 -f 176/126/13 172/96/13 179/90/13 -f 184/106/2 183/97/2 181/99/2 -f 188/112/16 185/100/16 192/102/16 -f 176/126/13 179/90/13 186/87/13 -f 184/106/16 181/99/16 188/104/16 -f 182/98/13 183/97/13 186/87/13 -f 183/97/17 184/106/17 187/108/17 -f 179/90/2 180/95/2 182/98/2 -f 186/115/13 187/109/13 190/111/13 -f 187/109/17 188/112/17 191/110/17 -f 185/100/18 186/113/18 189/101/18 -f 180/95/16 174/94/16 181/99/16 -f 194/59/18 196/63/18 193/60/18 -f 200/126/1 210/87/1 198/89/1 -f 204/95/2 203/90/2 201/92/2 -f 196/127/18 194/93/18 202/91/18 -f 194/128/16 198/94/16 201/92/16 -f 200/126/13 196/96/13 203/90/13 -f 208/106/2 207/97/2 205/99/2 -f 212/112/16 209/100/16 216/102/16 -f 200/126/13 203/90/13 210/87/13 -f 208/106/16 205/99/16 212/104/16 -f 206/98/13 207/97/13 210/87/13 -f 207/97/17 208/106/17 211/108/17 -f 203/90/2 204/95/2 206/98/2 -f 210/115/13 211/109/13 214/111/13 -f 211/109/17 212/112/17 215/110/17 -f 209/100/18 210/113/18 213/101/18 -f 204/95/16 198/94/16 205/99/16 -f 220/122/13 224/52/13 219/54/13 -f 224/52/17 222/62/17 223/53/17 -f 222/62/16 218/59/16 221/61/16 -f 218/59/18 220/63/18 217/60/18 -f 224/126/1 234/87/1 222/89/1 -f 228/95/2 227/90/2 225/92/2 -f 220/127/18 218/93/18 226/91/18 -f 218/128/16 222/94/16 225/92/16 -f 224/126/13 220/96/13 227/90/13 -f 232/106/2 231/97/2 229/99/2 -f 236/112/16 233/100/16 240/102/16 -f 224/126/13 227/90/13 234/87/13 -f 232/106/16 229/99/16 236/104/16 -f 230/98/13 231/97/13 234/87/13 -f 231/97/17 232/106/17 235/108/17 -f 227/90/2 228/95/2 230/98/2 -f 234/115/13 235/109/13 238/111/13 -f 235/109/17 236/112/17 239/110/17 -f 233/100/18 234/113/18 237/101/18 -f 228/95/16 222/94/16 229/99/16 -f 244/122/13 248/52/13 243/54/13 -f 248/52/17 246/62/17 247/53/17 -f 246/62/16 242/59/16 245/61/16 -f 242/59/18 244/63/18 241/60/18 -f 248/126/1 258/87/1 246/89/1 -f 252/95/2 251/90/2 249/92/2 -f 244/127/18 242/93/18 250/91/18 -f 242/128/16 246/94/16 249/92/16 -f 248/126/13 244/96/13 251/90/13 -f 256/106/2 255/97/2 253/99/2 -f 260/102/16 257/110/16 264/112/16 -f 248/126/13 251/90/13 258/87/13 -f 256/106/16 253/99/16 260/104/16 -f 254/98/13 255/97/13 258/87/13 -f 255/97/17 256/106/17 259/108/17 -f 251/90/2 252/95/2 254/98/2 -f 258/114/13 259/101/13 262/113/13 -f 259/101/17 260/102/17 263/100/17 -f 257/110/18 258/111/18 261/109/18 -f 252/95/16 246/94/16 253/99/16 diff --git a/src/main/resources/assets/hbm/models/machines/centrifuge.obj b/src/main/resources/assets/hbm/models/machines/centrifuge.obj new file mode 100644 index 000000000..97732f95e --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/centrifuge.obj @@ -0,0 +1,953 @@ +# Blender v2.79 (sub 0) OBJ File: 'centrifuge.blend' +# www.blender.org +o Cube_Cube.001 +v -0.500000 0.000000 0.500000 +v -0.500000 1.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 0.000000 0.500000 +v 0.500000 1.000000 0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v 0.500000 0.125000 0.375000 +v 0.500000 0.875000 0.375000 +v 0.500000 0.125000 -0.375000 +v 0.500000 0.875000 -0.375000 +v -0.375000 0.000000 0.375000 +v -0.375000 0.000000 -0.375000 +v 0.375000 0.000000 0.375000 +v 0.375000 0.000000 -0.375000 +v -0.500000 0.125000 0.375000 +v -0.500000 0.875000 0.375000 +v -0.500000 0.125000 -0.375000 +v -0.500000 0.875000 -0.375000 +v -0.375000 0.125000 0.500000 +v -0.375000 0.875000 0.500000 +v 0.375000 0.125000 0.500000 +v 0.375000 0.875000 0.500000 +v -0.375000 0.125000 -0.500000 +v -0.375000 0.875000 -0.500000 +v 0.375000 0.125000 -0.500000 +v 0.375000 0.875000 -0.500000 +v -0.375000 1.000000 0.375000 +v -0.375000 1.000000 -0.375000 +v 0.375000 1.000000 0.375000 +v 0.375000 1.000000 -0.375000 +v -0.375000 0.125000 0.375000 +v -0.375000 0.875000 0.375000 +v -0.375000 0.125000 -0.375000 +v -0.375000 0.875000 -0.375000 +v 0.375000 0.125000 0.375000 +v 0.375000 0.875000 0.375000 +v 0.375000 0.125000 -0.375000 +v 0.375000 0.875000 -0.375000 +v -0.312500 0.187500 -0.437500 +v -0.312500 0.812500 -0.437500 +v 0.312500 0.187500 -0.437500 +v 0.312500 0.812500 -0.437500 +v -0.375000 0.125000 -0.375000 +v -0.375000 0.875000 -0.375000 +v 0.375000 0.125000 -0.375000 +v 0.375000 0.875000 -0.375000 +v -0.187500 0.312500 -0.437500 +v -0.187500 0.687500 -0.437500 +v 0.187500 0.312500 -0.437500 +v 0.187500 0.687500 -0.437500 +v -0.187500 0.687500 -0.500000 +v -0.187500 0.312500 -0.500000 +v 0.187500 0.312500 -0.500000 +v 0.187500 0.687500 -0.500000 +v -0.437500 0.187500 0.312500 +v -0.437500 0.812500 0.312500 +v -0.437500 0.187500 -0.312500 +v -0.437500 0.812500 -0.312500 +v -0.375000 0.125000 0.375000 +v -0.375000 0.875000 0.375000 +v -0.375000 0.125000 -0.375000 +v -0.375000 0.875000 -0.375000 +v -0.437500 0.312500 0.187500 +v -0.437500 0.687500 0.187500 +v -0.437500 0.312500 -0.187500 +v -0.437500 0.687500 -0.187500 +v -0.500000 0.687500 0.187500 +v -0.500000 0.312500 0.187500 +v -0.500000 0.312500 -0.187500 +v -0.500000 0.687500 -0.187500 +v 0.312500 0.187500 0.437500 +v 0.312500 0.812500 0.437500 +v -0.312500 0.187500 0.437500 +v -0.312500 0.812500 0.437500 +v 0.375000 0.125000 0.375000 +v 0.375000 0.875000 0.375000 +v -0.375000 0.125000 0.375000 +v -0.375000 0.875000 0.375000 +v 0.187500 0.312500 0.437500 +v 0.187500 0.687500 0.437500 +v -0.187500 0.312500 0.437500 +v -0.187500 0.687500 0.437500 +v 0.187500 0.687500 0.500000 +v 0.187500 0.312500 0.500000 +v -0.187500 0.312500 0.500000 +v -0.187500 0.687500 0.500000 +v 0.437500 0.187500 -0.312500 +v 0.437500 0.812500 -0.312500 +v 0.437500 0.187500 0.312500 +v 0.437500 0.812500 0.312500 +v 0.375000 0.125000 -0.375000 +v 0.375000 0.875000 -0.375000 +v 0.375000 0.125000 0.375000 +v 0.375000 0.875000 0.375000 +v 0.437500 0.312500 -0.187500 +v 0.437500 0.687500 -0.187500 +v 0.437500 0.312500 0.187500 +v 0.437500 0.687500 0.187500 +v 0.500000 0.687500 -0.187500 +v 0.500000 0.312500 -0.187500 +v 0.500000 0.312500 0.187500 +v 0.500000 0.687500 0.187500 +v 0.375000 0.937500 0.375000 +v 0.375000 0.937500 -0.375000 +v -0.375000 0.937500 -0.375000 +v -0.375000 0.937500 0.375000 +v 0.375000 0.062500 0.375000 +v 0.375000 0.062500 -0.375000 +v -0.375000 0.062500 0.375000 +v -0.375000 0.062500 -0.375000 +v 0.000000 3.687500 -0.375000 +v -0.143506 3.687500 -0.346455 +v -0.265165 3.687500 -0.265165 +v -0.346455 3.687500 -0.143506 +v -0.375000 3.687500 0.000000 +v -0.346455 3.687500 0.143506 +v -0.265165 3.687500 0.265165 +v -0.143506 3.687500 0.346455 +v -0.000000 3.687500 0.375000 +v 0.143506 3.687500 0.346455 +v 0.265165 3.687500 0.265165 +v 0.346455 3.687500 0.143506 +v 0.375000 3.687500 -0.000000 +v 0.346455 3.687500 -0.143506 +v 0.265165 3.687500 -0.265165 +v 0.143506 3.687500 -0.346455 +v -0.000000 3.687500 -0.312500 +v -0.119589 3.687500 -0.288712 +v -0.220971 3.687500 -0.220971 +v -0.288712 3.687500 -0.119589 +v -0.312500 3.687500 0.000000 +v -0.288712 3.687500 0.119589 +v -0.220971 3.687500 0.220971 +v -0.119589 3.687500 0.288712 +v -0.000000 3.687500 0.312500 +v 0.119588 3.687500 0.288712 +v 0.220971 3.687500 0.220971 +v 0.288712 3.687500 0.119589 +v 0.312500 3.687500 -0.000000 +v 0.288712 3.687500 -0.119589 +v 0.220971 3.687500 -0.220971 +v 0.119588 3.687500 -0.288712 +v -0.000000 3.937500 -0.312500 +v -0.119589 3.937500 -0.288712 +v -0.220971 3.937500 -0.220971 +v -0.288712 3.937500 -0.119589 +v -0.312500 3.937500 0.000000 +v -0.288712 3.937500 0.119589 +v -0.220971 3.937500 0.220971 +v -0.119589 3.937500 0.288712 +v -0.000000 3.937500 0.312500 +v 0.119588 3.937500 0.288712 +v 0.220971 3.937500 0.220971 +v 0.288712 3.937500 0.119589 +v 0.312500 3.937500 -0.000000 +v 0.288712 3.937500 -0.119589 +v 0.220971 3.937500 -0.220971 +v 0.119588 3.937500 -0.288712 +v -0.125000 3.937500 0.125000 +v 0.125000 3.937500 0.125000 +v -0.125000 3.937500 -0.125000 +v 0.125000 3.937500 -0.125000 +v -0.125000 4.000000 -0.125000 +v -0.125000 4.000000 0.125000 +v 0.125000 4.000000 0.125000 +v 0.125000 4.000000 -0.125000 +v 0.031250 4.000000 -0.125000 +v -0.031250 4.000000 -0.125000 +v 0.031250 4.000000 -0.375000 +v -0.031250 4.000000 -0.375000 +v -0.062500 4.000000 -0.125000 +v -0.125000 4.000000 -0.125000 +v -0.062500 4.000000 -0.375000 +v -0.125000 4.000000 -0.375000 +v 0.125000 4.000000 -0.125000 +v 0.062500 4.000000 -0.125000 +v 0.125000 4.000000 -0.375000 +v 0.062500 4.000000 -0.375000 +v 0.031250 3.937500 -0.437500 +v -0.031250 3.937500 -0.437500 +v -0.062500 3.937500 -0.437500 +v -0.125000 3.937500 -0.437500 +v 0.125000 3.937500 -0.437500 +v 0.062500 3.937500 -0.437500 +v 0.031250 1.000000 -0.437500 +v -0.031250 1.000000 -0.437500 +v -0.062500 1.000000 -0.437500 +v -0.125000 1.000000 -0.437500 +v 0.125000 1.000000 -0.437500 +v 0.062500 1.000000 -0.437500 +v 0.000000 0.937500 -0.375000 +v -0.143506 0.937500 -0.346455 +v -0.265165 0.937500 -0.265165 +v -0.346455 0.937500 -0.143506 +v -0.375000 0.937500 0.000000 +v -0.346455 0.937500 0.143506 +v -0.265165 0.937500 0.265165 +v -0.143506 0.937500 0.346455 +v -0.000000 0.937500 0.375000 +v 0.143506 0.937500 0.346455 +v 0.265165 0.937500 0.265165 +v 0.346455 0.937500 0.143506 +v 0.375000 0.937500 -0.000000 +v 0.346455 0.937500 -0.143506 +v 0.265165 0.937500 -0.265165 +v 0.143506 0.937500 -0.346455 +v 0.000000 3.687500 -0.375000 +v -0.143506 3.687500 -0.346455 +v -0.265165 3.687500 -0.265165 +v -0.346455 3.687500 -0.143506 +v -0.375000 3.687500 0.000000 +v -0.346455 3.687500 0.143506 +v -0.265165 3.687500 0.265165 +v -0.143506 3.687500 0.346455 +v -0.000000 3.687500 0.375000 +v 0.143506 3.687500 0.346455 +v 0.265165 3.687500 0.265165 +v 0.346455 3.687500 0.143506 +v 0.375000 3.687500 -0.000000 +v 0.346455 3.687500 -0.143506 +v 0.265165 3.687500 -0.265165 +v 0.143506 3.687500 -0.346455 +v -0.000000 3.687500 -0.312500 +v -0.119589 3.687500 -0.288712 +v -0.220971 3.687500 -0.220971 +v -0.288712 3.687500 -0.119589 +v -0.312500 3.687500 0.000000 +v -0.288712 3.687500 0.119589 +v -0.220971 3.687500 0.220971 +v -0.119589 3.687500 0.288712 +v -0.000000 3.687500 0.312500 +v 0.119588 3.687500 0.288712 +v 0.220971 3.687500 0.220971 +v 0.288712 3.687500 0.119589 +v 0.312500 3.687500 -0.000000 +v 0.288712 3.687500 -0.119589 +v 0.220971 3.687500 -0.220971 +v 0.119588 3.687500 -0.288712 +v -0.000000 3.937500 -0.312500 +v -0.119589 3.937500 -0.288712 +v -0.220971 3.937500 -0.220971 +v -0.288712 3.937500 -0.119589 +v -0.312500 3.937500 0.000000 +v -0.288712 3.937500 0.119589 +v -0.220971 3.937500 0.220971 +v -0.119589 3.937500 0.288712 +v -0.000000 3.937500 0.312500 +v 0.119588 3.937500 0.288712 +v 0.220971 3.937500 0.220971 +v 0.288712 3.937500 0.119589 +v 0.312500 3.937500 -0.000000 +v 0.288712 3.937500 -0.119589 +v 0.220971 3.937500 -0.220971 +v 0.119588 3.937500 -0.288712 +vt 0.036364 0.066667 +vt 0.054545 0.253333 +vt 0.036364 0.280000 +vt 0.063636 0.266667 +vt 0.190909 0.293333 +vt 0.045455 0.293333 +vt 0.272727 0.280000 +vt 0.254545 0.093333 +vt 0.272727 0.066667 +vt 0.063636 0.026667 +vt 0.190909 0.053333 +vt 0.045455 0.053333 +vt 0.172727 0.320000 +vt 0.290909 0.093333 +vt 0.272727 0.280000 +vt 0.272727 0.066667 +vt 0.200000 0.280000 +vt 0.181818 0.093333 +vt 0.200000 0.066667 +vt 0.190909 0.053333 +vt 0.063636 0.080000 +vt 0.045455 0.053333 +vt 0.290909 0.093333 +vt 0.272727 0.280000 +vt 0.272727 0.066667 +vt 0.254545 0.253333 +vt 0.272727 0.066667 +vt 0.272727 0.280000 +vt 0.172727 0.320000 +vt 0.045455 0.293333 +vt 0.190909 0.293333 +vt 0.172727 0.026667 +vt 0.254545 0.253333 +vt 0.290909 0.093333 +vt 0.018182 0.093333 +vt 0.018182 0.253333 +vt 0.036364 0.066667 +vt 0.036364 0.280000 +vt 0.218182 0.093333 +vt 0.200000 0.280000 +vt 0.200000 0.066667 +vt 0.254545 0.253333 +vt 0.290909 0.253333 +vt 0.218182 0.253333 +vt 0.181818 0.253333 +vt 0.172727 0.080000 +vt 0.063636 0.266667 +vt 0.054545 0.093333 +vt 0.309091 0.093333 +vt 0.290909 0.093333 +vt 0.236364 0.093333 +vt 0.218182 0.093333 +vt 0.254545 0.093333 +vt 0.236364 0.093333 +vt 0.218182 0.253333 +vt 0.172727 0.093333 +vt 0.181818 0.093333 +vt 0.063636 0.093333 +vt 0.172727 0.253333 +vt 0.063636 0.253333 +vt 0.054545 0.253333 +vt 0.181818 0.253333 +vt 0.172727 0.093333 +vt 0.054545 0.093333 +vt 0.063636 0.253333 +vt 0.172727 0.080000 +vt 0.063636 0.093333 +vt 0.309091 0.093333 +vt 0.290909 0.253333 +vt 0.172727 0.346667 +vt 0.063636 0.320000 +vt 0.063636 -0.000000 +vt 0.063636 0.026667 +vt 0.236364 0.253333 +vt 0.254545 0.093333 +vt 0.000000 0.253333 +vt 0.018182 0.253333 +vt 0.309091 0.253333 +vt 0.290909 0.253333 +vt 1.000000 0.853333 +vt 0.418182 0.000000 +vt 1.000000 0.000000 +vt -0.000000 0.253333 +vt 0.018182 0.093333 +vt 0.172727 0.253333 +vt 0.172727 0.266667 +vt 0.236364 0.093333 +vt 0.254545 0.093333 +vt 0.172727 0.346667 +vt 0.063636 0.320000 +vt 0.254545 0.253333 +vt 0.236364 0.093333 +vt 0.063636 -0.000000 +vt 0.172727 0.026667 +vt 0.309091 0.093333 +vt 0.290909 0.253333 +vt 0.409091 0.146667 +vt 0.318182 0.013333 +vt 0.409091 0.013333 +vt 0.418182 0.000000 +vt 0.309091 0.160000 +vt 0.318182 0.146667 +vt 0.309091 0.000000 +vt 0.372727 0.253333 +vt 0.318182 0.173333 +vt 0.372727 0.173333 +vt 0.381818 0.253333 +vt 0.381818 0.173333 +vt 0.309091 0.173333 +vt 0.318182 0.253333 +vt 0.309091 0.253333 +vt 0.372727 0.160000 +vt 0.318182 0.160000 +vt 0.318182 0.266667 +vt 0.372727 0.266667 +vt 0.409091 0.146667 +vt 0.318182 0.013333 +vt 0.409091 0.013333 +vt 0.418182 0.000000 +vt 0.309091 0.160000 +vt 0.318182 0.146667 +vt 0.309091 0.000000 +vt 0.372727 0.253333 +vt 0.318182 0.173333 +vt 0.372727 0.173333 +vt 0.381818 0.253333 +vt 0.381818 0.173333 +vt 0.309091 0.173333 +vt 0.318182 0.253333 +vt 0.309091 0.253333 +vt 0.372727 0.160000 +vt 0.318182 0.160000 +vt 0.318182 0.266667 +vt 0.372727 0.266667 +vt 0.409091 0.146667 +vt 0.318182 0.013333 +vt 0.409091 0.013333 +vt 0.418182 0.000000 +vt 0.309091 0.160000 +vt 0.318182 0.146667 +vt 0.309091 0.000000 +vt 0.372727 0.253333 +vt 0.318182 0.173333 +vt 0.372727 0.173333 +vt 0.381818 0.253333 +vt 0.381818 0.173333 +vt 0.309091 0.173333 +vt 0.318182 0.253333 +vt 0.309091 0.253333 +vt 0.372727 0.160000 +vt 0.318182 0.160000 +vt 0.318182 0.266667 +vt 0.372727 0.266667 +vt 0.409091 0.146667 +vt 0.318182 0.013333 +vt 0.409091 0.013333 +vt 0.418182 0.000000 +vt 0.309091 0.160000 +vt 0.318182 0.146667 +vt 0.309091 0.000000 +vt 0.372727 0.253333 +vt 0.318182 0.173333 +vt 0.372727 0.173333 +vt 0.381818 0.253333 +vt 0.381818 0.173333 +vt 0.309091 0.173333 +vt 0.318182 0.253333 +vt 0.309091 0.253333 +vt 0.372727 0.160000 +vt 0.318182 0.160000 +vt 0.318182 0.266667 +vt 0.372727 0.266667 +vt 0.172727 0.266667 +vt 0.063636 0.080000 +vt 0.272727 0.933333 +vt 0.290909 0.946667 +vt 0.272727 0.946667 +vt 0.018182 0.933333 +vt 0.000000 0.946667 +vt 0.000000 0.933333 +vt 0.036364 0.933333 +vt 0.018182 0.946667 +vt 0.054545 0.933333 +vt 0.036364 0.946667 +vt 0.072727 0.933333 +vt 0.054545 0.946667 +vt 0.090909 0.946667 +vt 0.072727 0.946667 +vt 0.090909 0.933333 +vt 0.109091 0.946667 +vt 0.109091 0.933333 +vt 0.127273 0.946667 +vt 0.127273 0.933333 +vt 0.145455 0.946667 +vt 0.145455 0.933333 +vt 0.163636 0.946667 +vt 0.163636 0.933333 +vt 0.181818 0.946667 +vt 0.181818 0.933333 +vt 0.200000 0.946667 +vt 0.200000 0.933333 +vt 0.218182 0.946667 +vt 0.236364 0.933333 +vt 0.218182 0.933333 +vt 0.254545 0.933333 +vt 0.236364 0.946667 +vt 0.254545 0.946667 +vt 0.336364 0.267132 +vt 0.368281 0.286522 +vt 0.381501 0.333333 +vt 0.300000 0.413333 +vt 0.336364 0.466667 +vt 0.300000 0.466667 +vt 0.345455 0.466667 +vt 0.336364 0.413333 +vt 0.345455 0.413333 +vt 0.290909 0.413333 +vt 0.290909 0.466667 +vt 0.336364 0.400000 +vt 0.300000 0.400000 +vt 0.300000 0.480000 +vt 0.336364 0.480000 +vt 0.390909 0.853333 +vt 0.400000 0.800000 +vt 0.400000 0.853333 +vt 0.400000 0.853333 +vt 0.409091 0.800000 +vt 0.409091 0.853333 +vt 0.381818 0.853333 +vt 0.390909 0.800000 +vt 0.390909 0.853333 +vt 0.381818 0.800000 +vt 0.390909 0.786667 +vt 0.400000 0.800000 +vt 0.409091 0.786667 +vt 0.390909 0.800000 +vt 0.400000 0.786667 +vt 0.381818 0.786667 +vt 0.390909 0.160000 +vt 0.400000 0.786667 +vt 0.409091 0.160000 +vt 0.390909 0.786667 +vt 0.400000 0.160000 +vt 0.309091 0.253333 +vt 0.236364 0.253333 +vt 0.236364 0.253333 +vt 0.309091 0.253333 +vt 0.063636 0.346667 +vt 0.172727 -0.000000 +vt 0.236364 0.093333 +vt 0.000000 0.093333 +vt 0.309091 0.093333 +vt 0.418182 0.853333 +vt -0.000000 0.093333 +vt 0.236364 0.253333 +vt 0.063636 0.346667 +vt 0.236364 0.253333 +vt 0.172727 -0.000000 +vt 0.309091 0.253333 +vt 0.418182 0.160000 +vt 0.418182 0.160000 +vt 0.418182 0.160000 +vt 0.418182 0.160000 +vt 0.290909 0.933333 +vt 0.378065 0.358668 +vt 0.336364 0.399535 +vt 0.368281 0.380145 +vt 0.353637 0.394496 +vt 0.319090 0.394496 +vt 0.304447 0.380145 +vt 0.294662 0.358668 +vt 0.291226 0.333333 +vt 0.294662 0.307999 +vt 0.304447 0.286522 +vt 0.319090 0.272171 +vt 0.353637 0.272171 +vt 0.378065 0.307999 +vt 0.381818 0.160000 +vt 0.400000 0.160000 +vt 0.390909 0.160000 +vt 0.163636 0.346667 +vt 0.145455 0.933333 +vt 0.145455 0.346667 +vt 0.036364 0.346667 +vt 0.018182 0.933333 +vt 0.018182 0.346667 +vt 0.181818 0.346667 +vt 0.163636 0.933333 +vt 0.054545 0.346667 +vt 0.036364 0.933333 +vt 0.200000 0.346667 +vt 0.181818 0.933333 +vt 0.072727 0.346667 +vt 0.054545 0.933333 +vt 0.218182 0.346667 +vt 0.200000 0.933333 +vt 0.090909 0.346667 +vt 0.072727 0.933333 +vt 0.236364 0.346667 +vt 0.218182 0.933333 +vt 0.109091 0.346667 +vt 0.090909 0.933333 +vt 0.254545 0.346667 +vt 0.236364 0.933333 +vt 0.127273 0.346667 +vt 0.109091 0.933333 +vt 0.272727 0.346667 +vt 0.254545 0.933333 +vt 0.127273 0.933333 +vt 0.000000 0.933333 +vt 0.000000 0.346667 +vt 0.290909 0.346667 +vt 0.272727 0.933333 +vt 0.236364 0.946667 +vt 0.218182 1.000000 +vt 0.218182 0.946667 +vt 0.109091 0.946667 +vt 0.090909 1.000000 +vt 0.090909 0.946667 +vt 0.254545 0.946667 +vt 0.236364 1.000000 +vt 0.127273 0.946667 +vt 0.109091 1.000000 +vt 0.272727 0.946667 +vt 0.254545 1.000000 +vt 0.145455 0.946667 +vt 0.127273 1.000000 +vt 0.018182 0.946667 +vt 0.000000 1.000000 +vt 0.000000 0.946667 +vt 0.290909 0.946667 +vt 0.272727 1.000000 +vt 0.163636 0.946667 +vt 0.145455 1.000000 +vt 0.036364 0.946667 +vt 0.018182 1.000000 +vt 0.181818 0.946667 +vt 0.163636 1.000000 +vt 0.054545 0.946667 +vt 0.036364 1.000000 +vt 0.200000 0.946667 +vt 0.181818 1.000000 +vt 0.072727 0.946667 +vt 0.054545 1.000000 +vt 0.200000 1.000000 +vt 0.072727 1.000000 +vt 0.290909 0.933333 +vt 0.290909 1.000000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.0000 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.7071 -0.7071 0.0000 +vn 0.3827 0.0000 0.9239 +vn -0.3827 0.0000 -0.9239 +vn -0.9239 0.0000 -0.3827 +vn 0.9239 0.0000 0.3827 +vn -0.9239 0.0000 0.3827 +vn 0.9239 0.0000 -0.3827 +vn -0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +s off +f 1/1/1 15/2/1 5/3/1 +f 15/4/1 7/5/1 5/6/1 +f 8/7/2 11/8/2 7/9/2 +f 10/10/2 8/11/2 6/12/2 +f 11/13/2 5/6/2 7/5/2 +f 9/14/2 6/15/2 5/16/2 +f 7/17/1 14/18/1 3/19/1 +f 3/20/1 13/21/1 1/22/1 +f 19/23/3 4/24/3 3/25/3 +f 18/26/3 1/27/3 2/28/3 +f 20/29/3 2/30/3 4/31/3 +f 1/22/3 19/32/3 3/20/3 +f 24/33/4 5/16/4 6/15/4 +f 21/34/4 2/28/4 1/27/4 +f 5/3/4 21/35/4 1/1/4 +f 22/36/4 6/37/4 2/38/4 +f 28/39/5 4/40/5 8/41/5 +f 26/42/5 3/25/5 4/24/5 +f 7/9/5 28/43/5 8/7/5 +f 3/19/5 27/44/5 7/17/5 +f 30/45/6 8/41/6 4/40/6 +f 32/46/6 6/12/6 8/11/6 +f 29/47/6 4/31/6 2/30/6 +f 31/48/6 2/38/6 6/37/6 +f 39/49/3 28/43/3 27/50/3 +f 35/51/6 27/44/6 25/52/6 +f 26/42/2 35/51/2 25/53/2 +f 40/54/1 26/55/1 28/39/1 +f 30/45/4 106/56/4 32/57/4 +f 105/58/6 107/59/6 108/60/6 +f 31/48/5 108/60/5 29/61/5 +f 16/62/4 112/63/4 14/18/4 +f 13/64/5 109/65/5 15/2/5 +f 14/66/2 111/67/2 13/21/2 +f 35/68/4 20/69/4 19/23/4 +f 36/70/1 18/71/1 20/29/1 +f 33/72/6 19/32/6 17/73/6 +f 34/74/5 17/75/5 18/26/5 +f 37/76/6 21/35/6 23/77/6 +f 21/34/2 34/78/2 22/79/2 +f 110/80/1 111/81/1 112/82/1 +f 34/83/1 24/84/1 22/36/1 +f 15/4/3 110/85/3 16/86/3 +f 24/33/3 37/87/3 23/88/3 +f 39/89/6 9/90/6 11/13/6 +f 12/91/4 39/92/4 11/8/4 +f 38/93/1 12/94/1 10/10/1 +f 37/95/5 10/96/5 9/14/5 +f 42/97/5 43/98/5 41/99/5 +f 45/100/7 42/97/7 41/99/7 +f 42/97/8 48/101/8 44/102/8 +f 44/102/9 47/103/9 43/98/9 +f 43/98/10 45/100/10 41/99/10 +f 53/104/5 55/105/5 54/106/5 +f 50/107/3 54/106/3 49/108/3 +f 51/109/2 56/110/2 52/111/2 +f 49/112/1 55/105/1 51/113/1 +f 52/114/6 53/104/6 50/115/6 +f 58/116/3 59/117/3 57/118/3 +f 61/119/11 58/116/11 57/118/11 +f 58/116/12 64/120/12 60/121/12 +f 60/121/7 63/122/7 59/117/7 +f 59/117/13 61/119/13 57/118/13 +f 69/123/3 71/124/3 70/125/3 +f 66/126/4 70/125/4 65/127/4 +f 67/128/5 72/129/5 68/130/5 +f 65/131/1 71/124/1 67/132/1 +f 68/133/6 69/123/6 66/134/6 +f 74/135/4 75/136/4 73/137/4 +f 77/138/14 74/135/14 73/137/14 +f 74/135/15 80/139/15 76/140/15 +f 76/140/11 79/141/11 75/136/11 +f 75/136/16 77/138/16 73/137/16 +f 85/142/4 87/143/4 86/144/4 +f 82/145/2 86/144/2 81/146/2 +f 83/147/3 88/148/3 84/149/3 +f 81/150/1 87/143/1 83/151/1 +f 84/152/6 85/142/6 82/153/6 +f 90/154/2 91/155/2 89/156/2 +f 93/157/9 90/154/9 89/156/9 +f 90/154/17 96/158/17 92/159/17 +f 92/159/14 95/160/14 91/155/14 +f 91/155/18 93/157/18 89/156/18 +f 101/161/2 103/162/2 102/163/2 +f 98/164/5 102/163/5 97/165/5 +f 99/166/4 104/167/4 100/168/4 +f 97/169/1 103/162/1 99/170/1 +f 100/171/6 101/161/6 98/172/6 +f 29/47/2 107/59/2 30/173/2 +f 32/46/3 105/58/3 31/174/3 +f 128/175/6 129/176/6 144/177/6 +f 114/178/6 129/179/6 113/180/6 +f 115/181/6 130/182/6 114/178/6 +f 116/183/6 131/184/6 115/181/6 +f 117/185/6 132/186/6 116/183/6 +f 117/185/6 134/187/6 133/188/6 +f 118/189/6 135/190/6 134/187/6 +f 119/191/6 136/192/6 135/190/6 +f 120/193/6 137/194/6 136/192/6 +f 121/195/6 138/196/6 137/194/6 +f 122/197/6 139/198/6 138/196/6 +f 123/199/6 140/200/6 139/198/6 +f 124/201/6 141/202/6 140/200/6 +f 126/203/6 141/202/6 125/204/6 +f 127/205/6 142/206/6 126/203/6 +f 128/175/6 143/207/6 127/205/6 +f 157/208/6 159/209/6 145/210/6 +f 167/211/6 165/212/6 166/213/6 +f 163/214/5 168/215/5 164/216/5 +f 162/217/4 166/213/4 161/218/4 +f 164/219/2 167/211/2 162/220/2 +f 161/221/3 165/212/3 163/222/3 +f 169/223/6 172/224/6 170/225/6 +f 173/226/6 176/227/6 174/228/6 +f 177/229/6 180/230/6 178/231/6 +f 179/232/8 186/233/8 180/230/8 +f 175/234/8 184/235/8 176/227/8 +f 171/236/8 182/237/8 172/224/8 +f 185/238/5 192/239/5 186/233/5 +f 183/240/5 190/241/5 184/235/5 +f 181/242/5 188/243/5 182/237/5 +f 1/1/1 13/64/1 15/2/1 +f 15/4/1 16/86/1 7/5/1 +f 8/7/2 12/91/2 11/8/2 +f 10/10/2 12/94/2 8/11/2 +f 11/13/2 9/90/2 5/6/2 +f 9/14/2 10/96/2 6/15/2 +f 7/17/1 16/62/1 14/18/1 +f 3/20/1 14/66/1 13/21/1 +f 19/23/3 20/69/3 4/24/3 +f 18/26/3 17/75/3 1/27/3 +f 20/29/3 18/71/3 2/30/3 +f 1/22/3 17/73/3 19/32/3 +f 24/33/4 23/88/4 5/16/4 +f 21/34/4 22/79/4 2/28/4 +f 5/3/4 23/77/4 21/35/4 +f 22/36/4 24/84/4 6/37/4 +f 28/39/5 26/55/5 4/40/5 +f 26/42/5 25/53/5 3/25/5 +f 7/9/5 27/50/5 28/43/5 +f 3/19/5 25/52/5 27/44/5 +f 30/45/6 32/57/6 8/41/6 +f 32/46/6 31/174/6 6/12/6 +f 29/47/6 30/173/6 4/31/6 +f 31/48/6 29/61/6 2/38/6 +f 39/49/3 40/244/3 28/43/3 +f 35/51/6 39/245/6 27/44/6 +f 26/42/2 36/246/2 35/51/2 +f 40/54/1 36/246/1 26/55/1 +f 30/45/4 107/59/4 106/56/4 +f 105/58/6 106/56/6 107/59/6 +f 31/48/5 105/58/5 108/60/5 +f 16/62/4 110/85/4 112/63/4 +f 13/64/5 111/67/5 109/65/5 +f 14/66/2 112/63/2 111/67/2 +f 35/68/4 36/247/4 20/69/4 +f 36/70/1 34/248/1 18/71/1 +f 33/72/6 35/249/6 19/32/6 +f 34/74/5 33/250/5 17/75/5 +f 37/76/6 33/251/6 21/35/6 +f 21/34/2 33/252/2 34/78/2 +f 110/80/1 109/253/1 111/81/1 +f 34/83/1 38/254/1 24/84/1 +f 15/4/3 109/65/3 110/85/3 +f 24/33/3 38/255/3 37/87/3 +f 39/89/6 37/256/6 9/90/6 +f 12/91/4 40/257/4 39/92/4 +f 38/93/1 40/258/1 12/94/1 +f 37/95/5 38/259/5 10/96/5 +f 42/97/5 44/102/5 43/98/5 +f 45/100/7 46/260/7 42/97/7 +f 42/97/8 46/260/8 48/101/8 +f 44/102/9 48/101/9 47/103/9 +f 43/98/10 47/103/10 45/100/10 +f 53/104/5 56/110/5 55/105/5 +f 50/107/3 53/104/3 54/106/3 +f 51/109/2 55/105/2 56/110/2 +f 49/112/1 54/106/1 55/105/1 +f 52/114/6 56/110/6 53/104/6 +f 58/116/3 60/121/3 59/117/3 +f 61/119/11 62/261/11 58/116/11 +f 58/116/12 62/261/12 64/120/12 +f 60/121/7 64/120/7 63/122/7 +f 59/117/13 63/122/13 61/119/13 +f 69/123/3 72/129/3 71/124/3 +f 66/126/4 69/123/4 70/125/4 +f 67/128/5 71/124/5 72/129/5 +f 65/131/1 70/125/1 71/124/1 +f 68/133/6 72/129/6 69/123/6 +f 74/135/4 76/140/4 75/136/4 +f 77/138/14 78/262/14 74/135/14 +f 74/135/15 78/262/15 80/139/15 +f 76/140/11 80/139/11 79/141/11 +f 75/136/16 79/141/16 77/138/16 +f 85/142/4 88/148/4 87/143/4 +f 82/145/2 85/142/2 86/144/2 +f 83/147/3 87/143/3 88/148/3 +f 81/150/1 86/144/1 87/143/1 +f 84/152/6 88/148/6 85/142/6 +f 90/154/2 92/159/2 91/155/2 +f 93/157/9 94/263/9 90/154/9 +f 90/154/17 94/263/17 96/158/17 +f 92/159/14 96/158/14 95/160/14 +f 91/155/18 95/160/18 93/157/18 +f 101/161/2 104/167/2 103/162/2 +f 98/164/5 101/161/5 102/163/5 +f 99/166/4 103/162/4 104/167/4 +f 97/169/1 102/163/1 103/162/1 +f 100/171/6 104/167/6 101/161/6 +f 29/47/2 108/60/2 107/59/2 +f 32/46/3 106/56/3 105/58/3 +f 128/175/6 113/264/6 129/176/6 +f 114/178/6 130/182/6 129/179/6 +f 115/181/6 131/184/6 130/182/6 +f 116/183/6 132/186/6 131/184/6 +f 117/185/6 133/188/6 132/186/6 +f 117/185/6 118/189/6 134/187/6 +f 118/189/6 119/191/6 135/190/6 +f 119/191/6 120/193/6 136/192/6 +f 120/193/6 121/195/6 137/194/6 +f 121/195/6 122/197/6 138/196/6 +f 122/197/6 123/199/6 139/198/6 +f 123/199/6 124/201/6 140/200/6 +f 124/201/6 125/204/6 141/202/6 +f 126/203/6 142/206/6 141/202/6 +f 127/205/6 143/207/6 142/206/6 +f 128/175/6 144/177/6 143/207/6 +f 145/210/6 146/265/6 149/266/6 +f 146/265/6 147/267/6 149/266/6 +f 147/267/6 148/268/6 149/266/6 +f 149/266/6 150/269/6 151/270/6 +f 151/270/6 152/271/6 153/272/6 +f 153/272/6 154/273/6 155/274/6 +f 155/274/6 156/275/6 157/208/6 +f 157/208/6 158/276/6 159/209/6 +f 159/209/6 160/277/6 145/210/6 +f 149/266/6 151/270/6 145/210/6 +f 151/270/6 153/272/6 145/210/6 +f 153/272/6 155/274/6 145/210/6 +f 155/274/6 157/208/6 145/210/6 +f 167/211/6 168/215/6 165/212/6 +f 163/214/5 165/212/5 168/215/5 +f 162/217/4 167/211/4 166/213/4 +f 164/219/2 168/215/2 167/211/2 +f 161/221/3 166/213/3 165/212/3 +f 169/223/6 171/236/6 172/224/6 +f 173/226/6 175/234/6 176/227/6 +f 177/229/6 179/232/6 180/230/6 +f 179/232/8 185/238/8 186/233/8 +f 175/234/8 183/240/8 184/235/8 +f 171/236/8 181/242/8 182/237/8 +f 185/238/5 191/278/5 192/239/5 +f 183/240/5 189/279/5 190/241/5 +f 181/242/5 187/280/5 188/243/5 +s 1 +f 202/281/19 217/282/4 201/283/4 +f 195/284/7 210/285/20 194/286/20 +f 203/287/14 218/288/19 202/281/19 +f 196/289/21 211/290/7 195/284/7 +f 204/291/22 219/292/14 203/287/14 +f 197/293/3 212/294/21 196/289/21 +f 205/295/2 220/296/22 204/291/22 +f 198/297/23 213/298/3 197/293/3 +f 206/299/24 221/300/2 205/295/2 +f 199/301/11 214/302/23 198/297/23 +f 207/303/9 222/304/24 206/299/24 +f 200/305/25 215/306/11 199/301/11 +f 208/307/26 223/308/9 207/303/9 +f 201/283/4 216/309/25 200/305/25 +f 194/286/20 209/310/5 193/311/5 +f 193/312/5 224/313/26 208/307/26 +f 238/314/24 253/315/2 237/316/2 +f 231/317/11 246/318/23 230/319/23 +f 239/320/9 254/321/24 238/314/24 +f 232/322/25 247/323/11 231/317/11 +f 240/324/26 255/325/9 239/320/9 +f 233/326/4 248/327/25 232/322/25 +f 226/328/20 241/329/5 225/330/5 +f 225/331/5 256/332/26 240/324/26 +f 234/333/19 249/334/4 233/326/4 +f 227/335/7 242/336/20 226/328/20 +f 235/337/14 250/338/19 234/333/19 +f 228/339/21 243/340/7 227/335/7 +f 236/341/22 251/342/14 235/337/14 +f 229/343/3 244/344/21 228/339/21 +f 237/316/2 252/345/22 236/341/22 +f 230/319/23 245/346/3 229/343/3 +f 202/281/19 218/288/19 217/282/4 +f 195/284/7 211/290/7 210/285/20 +f 203/287/14 219/292/14 218/288/19 +f 196/289/21 212/294/21 211/290/7 +f 204/291/22 220/296/22 219/292/14 +f 197/293/3 213/298/3 212/294/21 +f 205/295/2 221/300/2 220/296/22 +f 198/297/23 214/302/23 213/298/3 +f 206/299/24 222/304/24 221/300/2 +f 199/301/11 215/306/11 214/302/23 +f 207/303/9 223/308/9 222/304/24 +f 200/305/25 216/309/25 215/306/11 +f 208/307/26 224/313/26 223/308/9 +f 201/283/4 217/282/4 216/309/25 +f 194/286/20 210/285/20 209/310/5 +f 193/312/5 209/347/5 224/313/26 +f 238/314/24 254/321/24 253/315/2 +f 231/317/11 247/323/11 246/318/23 +f 239/320/9 255/325/9 254/321/24 +f 232/322/25 248/327/25 247/323/11 +f 240/324/26 256/332/26 255/325/9 +f 233/326/4 249/334/4 248/327/25 +f 226/328/20 242/336/20 241/329/5 +f 225/331/5 241/348/5 256/332/26 +f 234/333/19 250/338/19 249/334/4 +f 227/335/7 243/340/7 242/336/20 +f 235/337/14 251/342/14 250/338/19 +f 228/339/21 244/344/21 243/340/7 +f 236/341/22 252/345/22 251/342/14 +f 229/343/3 245/346/3 244/344/21 +f 237/316/2 253/315/2 252/345/22 +f 230/319/23 246/318/23 245/346/3 diff --git a/src/main/resources/assets/hbm/sounds/block/centrifugeOperate.ogg b/src/main/resources/assets/hbm/sounds/block/centrifugeOperate.ogg index d225f7e5476b57bec9137a284ff4b28de06b1540..633d242adee7b033ff145da2e3c19861c8353741 100644 GIT binary patch delta 74616 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

Ku%LAyr zkTrvRxfB=5|MUe?!0i_g?;lUMIEFEnHo+EAb1MGHK-eDTxQtDGc$2l2CIFGjXY-fN$??nE1Ngc}kSn03Ahl7if`x<9cZJJKWXXZ&+#In~1GkX4Gl4^1m$k_zfyv)37Ry`W@P4 zFG~{^Kn|NA6W!2$`Nu%hoaOQXIw{a>q6T8ihY%6+Vlo}<{jWEARyt79T{V&7#OgrK zWa0f|{_-)DHR0oS+u;|$ZLrZCbG<Rh{ixmpwppBHYp(BJ{8_xv+d~D zJWHnW$_h8xU|P)3W}N&hVqMeMf6tdSU3G$n5VFEIe_I4-ir|9Rarg4!`E!BV&L=bs zLkgARXV8ROvc@v)AYnJo-(7I%stKou*XZFA1!9<3ti_Dgsmp2Tp*#v#(%yzi<@t4K}kg;Fz^PY0<~BL znDQ2^>M<53sdSMB!=ho-DZOF+Y@(sX|9&~u{o~wPF3W9`_V>Ktc`BT@31JJVX0Lbm zU#x`wTw%JJ{2Icv?1)|!?=sVydruxUSsFu(H=G`Q2o7j zgz!0yxZt;7wyc)52(VxYjkL+T!bBZGN+uN&Bg9MNvM7BsZzEaa<1L2Oy5jqk3|E<1dgGZcQ2R}yXz}h`PJj`@uaBoe=ucZBhz8swSO3kEj>m@ zOd^7ar{>fa@QX1*F0F|ep>Eq;g@FJC7~}lvmHWXPiYqMZAD6`!2;Uv(K*4(niN%() zUuD-PI-~ahT)Bj}1|&KFsi?+I`7kkH*MvK5x!;m@f4$$Clfm#grn*R+MUeRKdo>?P zhFfZQPNwh0p|1uiS0ETcLBOzt4wj{}#1PIZW%AN@HaKa`F#k;Lx1XJX!OH-X=HH0E z*lUa>HYPpcXpfKp*J)|OhSTrA;^UdNjYCzuGTGQs!Z{{Q(P|c1TNpxGq$&oOIhIzK zRG8sH&;{zBY5+hbT%YH}6ACw4ZsZR+#XvApVq2T==plF?1HpikrHgmH4wt$UE5jVk&D$CNn(^g4A*Ap;Si_rxV`Lj^bvl~DWNDa$i zwO!EiQx_%X*w~?o?f+-v+X#VA36%0EZqpwQG90%|Q}eT)>+mOiKAx(+{(HP3`pmM( z$GX${V=Q53m$U(7Yl#qC>lC8(({!rmjAt1hh-#uZhyP0RRNZ3 zAW|&@gsVM?*)Sx>L1@^6L>NVqPN27|c8|X`m2}11Q*4(MK9ejqJD5Hyf`wS^va5=whse{q@o8A(gtqU@MLx;tU2(3O{2HQ5uju*K}HgUo~2gaButCFi=*^* zUm3s=6<&*u(eUO;)AA=>tU$+xq)c5c8I}_^7wXG%_{zAJy5-UN8oWbu3c{50$;MDL zG4twtzO~~4PW}1`3-fFrG8d;xCsZhmfX_c{D5*cwQ;S_b`-{p-pU5g^{~d`HCt&a@ zTa5Fd>$CbiC&8A067?C1wjg`u%gN@h7CKg!B9~HN)*WYG_9RlXu3iMb+AfW!`%onW zQF|2|>)@#&E*0yHvd0|e4fIa;VrWMXnFO=s@_v)iHA?TcqdO95ioMa5od*NuA z+f~sMho}Jn)~+f6w$&ToNm!3bjcC?Wju{47e}`QwA|ahSZ+1yzKnq8;K>~ zcjB>fzUWqKisduIndFXHu{<_gKZ7w(i;R$F3)S(*&yQDC{3W(Kq~wx`1Ysz9KHx(hw&t^qB)4`BoMJKeNyt+uAcX?pF;A`3&T*a|jKG&xMEQ z3y)rDn&aXV$xe-8czj6s$%$x>boI8q5aV31Kv!eM+abGBMQJ}FQ4XC6_!osyy|_k+ zJf!24uGwiL>ITYzZell88>Uy1H;iuO(`cbGQam)YDtJxYz}RX)jADVqYJwjP^eEXf z3%eA03LTlNexi?+%Ve za3^Muu;D&8atVa5^*T+pIQ6kl>#ThyevuF|cbY9?jhk&fUABf@9iId+=YqbW#<}Ci z-BR5`PRR~q{sHtFNcw-{91#|1DD@k5w}yMmNHZIgglCj(H8jSnCL1b2z_Er-H4!F% z9#aV?{W)s?AtaAIIQz0l8^jv=f?C(;t|;bZ-1j%K6dLWkSoI18j&ytz+|TCWD&#@h#=3QKdT;*jC*H>7jY9W^jmp+D=b;8m9&txd&IC z6L6rcx5;5McotF!FoE6|wEf3*qpho=T1DId3tsaXi$)_lbbOt2w zbyRz`-RcUjr}YTirtle}VSEdx0eBXRGU(nOzcPQU*NyW`BvQA#xt-hUAt62P{z&CU zQ~THn$9$7pe64AimpAZvNa{QILSXA2TY1-1r<%H8bmo+@!1>0kH?%8SEB`&fXQbpW zK^^~!HPif*(XjFR!eV)|n|!Q+PGz+oB@3pQT41!rWiTas4Z6yEmSJKg;FZ8&c_G+sZ@HUvNi%&kq-Io2EgX8^I!;|sGlT-TtX z*$Jta89~L?S%+yzD{-?-2)S2GkazW%+GC{(!dh7Mmc*nW9RwflA+t zm0X$5{tLH9oKG7-4WF<%ApQfq{Jj8m*5~y@&XJ;HFmQSEN!XFQxyqVKJq1|jttCnD zqu$K)G4HwmV(3UMx<19dqd!I9EIAy(o>ITMkKZ~0Xedj0$N<+~tC7UgfFk`@zD~kp z_&I1*v!kyo)zqCc-y5_CNoqWnZXSJAZaYi)ORMdW1#`yaE6HjH_;RD5{Dll{QP`k? zvIWR_atX;27;^yUqDOp(?Dw7=iuyaRlMuIb$NEmz#u~#;mfqbuKjZ_Y)^~%PZpJ^r zq1X{pD!!K8M~C((7pW`l&4d-})R-b$?XkBRf&{~iVbkAoCK}}9t*M#7GS`#(1Pwj~ z=?nOYm#j>H5HUR=;mQLQme&NaRaP`76=VF~s_l2D-uK-W88sV_yMOJ24tqam z;s^|^5WQlQ|J39Z6GqwlV|GVgFgkP=cwRY0U8<{lGjpHdZTA|>#ETap8hUr%TN1x- zO!>un`RA)Fd&;U6>BB=UQQozM!Si**Eh3_89zdP#La+tkAHRY$kJa&pcI|sVwyMAR z=9To(oIYm8l7IPaz~i5`7#Rxn*$WhI-R6bth3q}~w?fd=m~OCrO_YX?apajo_zWa8 zRx_?dm3iX8qP9#^U!^Kqz3omSCFWOn8a5Dx*waWcx7(Nc;`bR0BObf|SFbaTmcVO} zN+5d#5}XEvUOG6XyFntc&tDp37{X>$@K=mV(`nP+rl(z{^l6W%F`QPDsQ$y>l5{Q9 zNUvu(=l6Xk3-_phvQ{TcbiaPtD`7M4Afl^{Z&~_27rpr6w-mj$Ow$`Ob5RlO-tg>D`&zc9H8p>iCqqCnn`ZclMKhm5eBZ%u4T?6D zE^X9LUeQXX3QbXuz4y`G1B)J#AW54{z% zB-RH++Oew{OS>8cT_NWFB)hIQx@5WTjFYA9jUYjD z84dr{<$Ue!`jWLT&Pa|9Y|WNG!CaYXwG}Wn8UD;KdvMs<38z9T=Ki$mT_nHm42Bna zv-y7OT*-8BK7t=ySp{~d>iBS&(5D)3J@yOGxNuhj&uveAa4!BNPgpO|&2rnEb7Zcv zz??G0*IgFSbcZf!Y=4;)>Q#jbi)D2Hvl!1WwoIKGt zzGoqP&!ZY5XJh^yTfftpP2jQ zY@IXv+C#X>MU}$@1iVSMrwgzA)Ez`A8aB1&GhsBCme6SQSTRQY6O-f(093FoVoKU^ zSkf#He~&owLo`qE3tE{!+RMrBglCI6?DQ@6q9~*B3Hkumqqi@grP|q3ZTWm96;7oi zNkUK8$A8R3mq-mmK$ayXnOG@bIwcFm@=@noy-qw)6ICT{z2Gs3HYUG-YJZx5S1WB{ zGO>#2Km28@#Z7E%j^=6w9E=TemN6Q4n3X8nhVIHrm8Wx!Rk$}YRg0~M^Qn+oFW7ya z@e4)59o{<6R_xW2!Lqe2NV5nUx?WV#mliw&%V)U58NYq&O(rYi%!{3D+8a?%Ms}r_ zjR5LEeXS@|hz+orSS_>pC_a=)b>_N(1HX!m1I`we3hDLFh0Y5Af7kovgSllE(YdF* z5h*0lSDm+L6V-L0?fht3j*-R8ri4BL7c$_chnFg%`@wm2+d?2*Xo@X%!W#b%OqWqE z`TVsz2&6_!*LFzX58@d1w0*RlbEpvtJ*f-c%(#;JnSRKLQ> zzxrsZiP2y4Y0Uw@$B2IZqae3|`iLYXgg*TGx!zqudk)$AD}qf{iX;r&c7Fe88gRX7 z)j;p&{gAcLyskRk2dC%9XD<_Tg?gzC1ZE!c(+1J8l`yr52uLd=GAtcMUdCJn(iPEt*0gptb%gQG@G-` zOA?lqq#A(H`E#u1YYT9P*67O8Foh%-DgSy?=`WJ)b`nz@E@p4`ww9rnj2)+i>p4E3 zP^iwR7&_#{$6G?Ve`QfyH?l%<&nE`E+8!R`_f|sw6B?Zzy2n7BQ$>||CD~1wzz0x; zI>}!g-7l;0%k`)Um5tSS-Ib(h6|%E(-Gmp>8U#46L;?+j)KUevZuN(4wt^C+o;63T|0Paa6gYJ-+u9-#jGXzKYW1xupLb z;{nW25Wq3%d!7;Y7>L1|^`ENrhG8=r$Ui`niEXqy%o?Z6><-HPH|{7`)F5FbX8Cjwl|Y5tR+g>YxeRLD4+C|&tIT9XK{2Tubf z*poZOlEU*lFK=OopP&3C@F&q1p-Uq!odls(g9$2?u?{lEA0iuk4XoJnWZtltaOV{S z8`~Sqy5ct&o0L?FG9FWBrXhx|#EHc);kwKmzirVY3XE&38YyO=P-G8O!y} zlUvcPBTRmuFn{9eEDjps7a{e|vt^9BeD^5OiAMUK_nBXR$!OGiwvVq927-0hc6W*h zR#*{t_E^OcyOHo(FXA;4sk;6UEFu{|)oKXeVV%M?g)6w!c!KX1UQx{sdIQwvUAt@2L0i{9WjfFrG{P(%QPZ`m)OM((=mcma?y%TmTjSouin%3_nl8L$WE6gHBc%FbyeM ztirSP@dU-gZAT9NQljf}rM$rK|3}nWMa9(x>lO(RLV~*ncXxMb++BhPcMohdxVyW% zI|O%khv4oW;P!vc8RI_nYd`F<)~c#+&eGG7%L&cw`R7My8r8%r-RA_`<+Y3!CI7( zp)~Rm{B1f=l`S|ggHlAl&k-UWOu>7QmqRv_PX9E8#|{sxP!k`F{&VI6(uY?LR>T<2 z*T+j|X*wGbljnd9T5f{>b<3vv0GvSLcu#h4`PoN(+|WAC;m*(dLCfL{%jlniwy{tOhZ%$_QX)Nh#o-qx%>;2XqUEr>k)&S37|y>w>zQa`Sb zNe>$E=iPW!x+KW>#r3YCT~RvGLbQ^CHme7k-kQ2iYY_CG!-&zCX6r zF=>QmK);e)Lq|Xr-n^xj3fdSN27VhBMCr^bkEO$>hmm~yIVriKf$n-fmZ!P=u?KxXF;5XijpQJUMGX_<=8L{eB&@&FG{nn! z+2iMj@hBk;?LxA=#V(vP)7Bw=*>OvRp!C1@;(co ziB}pzMHlWKyg(iFRUbnYKV{!)6qY)9R3^!?LmB#*bKe3=h`rvc__MK>fq6`Q_1Bi# zAL`p;ogd(CpB(t>HHK=ud!|Y~o?t&UeTDexsX@`1Jj`dHr!}?3#@Zetw#w(`%$Qot zRyjJR&|+V1;-c*qXNZx?LHeMywe%H;!gzhkjF^T~P`+U`tg1i;$G~A zg)$mkJ$6O?e3lm+?>)<2ds4OjyzBhz<^nY;aAQ(sYX6zZ(~!pT6x+_doZaPH7=mJ# zEa;2KmgFaRm>lxPm&Kj~T9UJM2bouDX(Tv(D;Hdm+vwN<>Be@V&7-6dt`Td%nDrZk zT%kst=E!jld0B#JKmr$Kow z$WH)H-s!PgQ;wJv;GUyK2sw8w#sj1 zxz!X-tkC78G9XI0!m7BO&S(X=);>R#1MmZj(AR7=Ah9`JX?U`|rC_8}R$x zffXEo3`a~eABHu9klT8d1yRA5ZMM^y-MzxCc@HMbS~%b=hLwF1CMNXydYx-R$BgN5 zCMBt*rjELg-0HR5j*WP3x!7oJc8ygYl7mzsfEQaMr>5FKx;P6gmtrN>pm zX&xD_Px_xuvrAU?FgIaP_VP;9iH`T13OMyqSMuQ09S1@Wa(ujp1rIQwB7Oo?EP6$5glrsf6d%Yf%a?}i~1Wb zpc2~?dmaEGqOiqBwL}-#2bBDY4uuxH7isZESWo^JZ8PNDqI!P1;83H0H6|Pt7S}YS zJ!-1BQ@Gd7)St2w`KONhEQm)MOYiZO=u(v(@{0%RhOph2MObjXgDW}`EcZuNuxrzU zK!Sb*HuO`y@-YGYwW^&H{$E10_(M6LPL4p^&tv(F1KC4=q?s>iMFG3J+K@yx)7#?$ zK~P5DlY)v}KMFi{3j2oR^|uf=pzs3TEp;D;GqR88OUPX$UzZe;s7;b;=?fgM>ox6y zW9-=)wUWI3h6l}^b!CT9l)=Zbd-u8%CSM}{2|3S6qNlif9tPQ{X%dy`_~)pXTC^<3 zLO#L>0{%}=Eoeep`T+L!`Jcsy8VKBUYLF4;t9-+N^V@AgO@Bu;$~OkJB~kQk()hmp zH4_&#r<#FQ5Z`7JWl47YG3U#I9)szMDBqAkxok?d!l8g|P9b>&MFP}o2Y>&HK1Xt*vf3Q#9r#nzQC1` z|Lg3ZCR+M&ynLdw@i%h3-SnvV+*qnv-(0orNm)E$SZ_O%ow>+&;$xrq%y9wW^QJPaxlwA zBU0lpaVC9I#Lp6EKy54QAZQlp&Xv_)HDbd82LS(rN+FJhmPm2E7#(${p}(b#CYXpl zNgpvv=*`*Po1CSTjofFByq{UHab=?@NB4+o9f?o_t^ASBz+Tx$mrTUd&l<$wXq4-k zz%{gjnGBeadBCDj6c?M+U8PX7V1ABmsLX$lgr8(KwsG{DPTKwWt@IXQ25ICfcCOF_u68)wK6M9WL6$WZW@WnjziT!t!joNI=8JPt^G9q@R3 z7seOxX_@@>les&vfK??wRtOZEiijlJYMw)OB>yY4254k|S~aR`qP zRwm8ZGrBNNY>HHjG|`fs2RYaZpU8^Il+-PbW2ln8=|^Kb+!rz$qWeF&(vXN`u_FMd ze*G!WfRU;sMj|x6&^ZHJol-~t;Mm_+!YwbNSZXLJ4dm~`GocLsc;bgv4H_Q``=7nkB7Ea zA(~A%#g}n}=K9G&bXj)nT{Xs*gFyS~wZvsz=BAo)IZwM@JPsNwuL3_$)W-N6Vf5pD zR@f{<-n0tF!;9wI4RUKxsJ8yTa0u1S&()JSt}RZ)m_k9pXewUT27$ z*soZN6WgigWC6aY(nPLF{4HO0&IyEU_P?}#6N%+H4Ib}>8>C#I&if;$bwJd;)DDFFe@V}t(L%88URJZg)NDi8poQG6Mno0aa)W3 z^iMT~8Gowe*#Y&=oxXPaz<}v`%5&b0YM2knlO^6jQr)nJP17x6vI_UhCYFif`a0HF zDP)U{b`&XRW2ZRzy%B|s-LWCrjm-as=|a*sOe&6tl5xWMZI}y^Akt3A8A15Fy|EQ; z@0<*sYxZO#=Xw!CP20qc)zXyk7}(~Ik3|>ctK@QWEQCMWkpaSbt3Guc@XXlr;+Z*K z_&B73k$Ro-lkoXPzf?}cD;wD+1l zir6L&%M*dBv!h(Ih@dsMW75mLTmsU=^X0$0@55=mF?B9P?9!3@EpliIjq!3FCO1uL zZKcd&6l$+l4anp#R-eW#Z)HzjU~YbJOxXsCOuU6!*Y?YI zPs(cd)?atE7bb=JGeq=QFcwVRw=T*tmPwoX>k}ONwrt1hd?v;OMX{eZi?JV~m5L`u z9t(lK?u0*N+N(&TUA=i%0gitw7`_Ccc~L~7pQR<4)d!XE?!#Bb@sWM+X<9}=H-HfR zWAi1nC{gWi3j+lB!TO(dfWz14S3YrPcp6)_Cc@7m<~VR4(88G$EsXK#QMs!nS<=g|T`@N?s!7$o`FXAy2?u?{skuw0Gd^MOe5n0#ty>e3 zKkIgcE_Hf5xXw0^cMb}LzLl#dDOuF?hS1Oc_%VVotdUh#F%!T$TZxwiAKw!kXq{DG z)UphzUxfe0EjY(D)YT>)`OT<3fe;`kyWeMc$8&)ZO^qZvVu*>4$b!`W?>4h%WdRGs zwybgPMr=Ks>1#?-6XV3D=jL1ipTUyDxg?E?IJ(`BBvXlgd7G}@Zxi)^hR|>3 zZcZ-NGpI#3EBqWv=&BY@D0?csAkzYcWf^9AoQph3%(5yxdH6aqKSIA<^R~#M_MtF} zUbVVJWG_^K_E*;fpCkTh{G=fn(B)p&xvgJkAa}LZh*RkpD9Y#|=mQ;Ovr|-@ULT@h zN0E5b%(sXCZg+8}|ED5;Xo9eURU_~WNdi>=H$oj{>+CN zZq8$sk8PgV_VNVv?&!(ukxDBxNT}4!xFttDe_aP5RJOMD8_}|op9IO>QHC_+ACPW& z^9R2$`4!M?iEF9)60U^a3|JJxPEoCVLQM=5)cuo%bfj4$TW%ipPY*vKrIIjWwz*n5 zhoM)oR9QoqjR#82AhK2vz=r<61_ICjIt~A09^k+Ygxo_jM(mo3vYL#RlCrwyj;`v` zikiC0>Z;bt^0F=+8z_rd0o$=`H2iziKU8NQxuh_foY zFbBQD*N-C%NQv3z)}CY^W%gLxe&*u9GSeXJmt;-2HQe zyrR5olmzv4$tlDNhO8HJslwPVS1{-_l{~&gr^Etmo1;e+20wXx++Coj*q47N`WF37 zFh>y?1zui_lu3`w$>E|+#p{`IV;3FyHGB!RgjJYpYg@fHr~k8A+WuxzYMxfL5sCk0;NG@~qhhlQsVx*czsN9WX16 zEAl^4@ux{MN|7I4E>;M_iI1qUA$$w>tcI+J@l8(WvyXuk`WyR@py!rbgT&i#Gy3fy(%|g6xK9y3&|!t-4~;*J834q=Ep{ zAB(nIUNS9DRtRC;jTK7PZtG`U!$pFM?q9qo<=5#-&n0CYcLK~`mz!kO{_G$kBvYz8`Fno_p>1)z>-*Q*Vda^RIKO;n4dA1!FB2Q zwGR`m-^`(|)=-B#!KHCtj$6i4B&wc228(5wW?2BG4;Cc)ZJWY5mmLRdz;yz9D>jyj z2totYhP4G1p9lpdx>HYnLTyBp8xkA#t2Dmf`h&<< zu?JhN-?1W4Ewcv^GCNs0EFY9NbOsJ_2oenijf(rC-ZH9eIz ziEMGb?u@OI@FlgV3((m=KY1y$KVEa|;5QO1k3lFvArTNT>7&BY>4a5!sy9ftj51LqQmG%kz~#mG#TNemvo0_ zRMp(}g$Bu+2vQiorah@Fd$Sh#x5%<`8GVg4$}E_krsxlD;?8bUJG2Q?<*Lt&3>7m~ z*XjEAD^*Xr!1<;GF{+$7En!;sGGpt>x(&_q?y5ATi9(qbxQ3ud?@2()hYmUlPGL~ynKGTWJ- zh0g)J=<>k(FXmUX{Wme`EqJxT(pzSm6y5Y+9z%$FZ78DB1U+%z3p??khStKN4Ej|5 z{PK^BcA*|WakW@*5&TTA(>m)ViNh_q6(DFTzT`u%T_YKI>BCwY!J5co*zr|TC_#m8 z9kaw{q<4c+_Th#cv3(SyidL0=QMtS?slo{O@`SMEjA{X~X_bi&KQIM3eHb1a<5pQ; ze|&EHgWanE_WMP?5=cZ!duogDG2!)XBH2CuwyR+Lh;HO^=1NeURuYH=qSD!Wm{*rWqW z@(i|yp)PG*Fmy6K<~V0kGr3I=E8V2qeTWw2YN0 z6cbU8Fy4XvGJd@jMl&(g;WL2NH&qeQY z-5JMU}d36uCMrKt_R_fHM(|FWBF&7Y|+6Nh|`#DIR>cg)RiD4!yH z1+BY7%V=JO`G94y6>?gpO$wO}S>))~yxHcGVRAQT2N zu68mogE#nCQdOmoe2iUGXKVDdRdr&|cviCbYYmG9YK8#lO%olFE4Ta?YQ7r)DWPK zl`$B~L?A#+Stqeg%E!y*tI$;)*gtZPzg<>@m*^CX1^=o~24C^v?=f~P}Z=<&&34+%Kq z_SQZtV1Xmv^2}-kwbV`@BsQj^>Aa7^*N~`|2H_ecrCO5}ql|Dp1g<>%qzutWqk<`o z*f!Hr(AaFPQ{gJx=J>9c7-zY-r!?HmquPu8sBj*O%Fv0cFT;)~Iv)vHcHErIm~x0q zCPM-V=r#4DqKQvX#F|z}j%(`q5Ako%$2q@FyqZfo>tRma=YG*fW?$Jd;PY@thjyCS zuzTcRjZ6_sJ`}L4E~3LT_{O6u{aO4S?&4CkpF*E^F9F-Tl+6D?g4npF;tXEJxt;$+ z!L*-QxnfZQzQ230Mki4(;U~?>fbIRig0 ztUk0pxZUl$y~756O)KSd!*9%3LzS5R?uaX70aj&s%Lf=Ecjw(Ai}LXTrZ#1U?}id6 z+a5V019*x6CQV24WfRt^`<>HrVqt$SPXW%wubX^AtD8=le<-+Y-qs@W(g8d zdr=$RkegK=$@xd82Fo(4A+uv*@)5ka469eE#ABxB| zq|nyp=7=L{Xibu}ZQmCg@@sJt8%|@Ao9){DPV-Pa>{_neKrLiylhxfCDD$yL2Qh zBt9;9j!A089*f5;(Le#~n`T@@#+<7#Vm|fKRenxz_!5eXqSrfS9`S{tQ-&md)PWJm zAZQ=j8Agvr-Az>MPhq61T|-)f^&)wbR53PyzpgnZ{3L@+jnX$p;;<)g|Ak#v?&p)q zJWA$XQkeT+(%H|fCFRvF{xYcSe&6>h22kp)swn>Ehq*(8VMJ1h!~d=eEWB;+c2{>>u zI8u#!I!z1r>E_op8K;QpHylZlHyHVh99smT&Fi$dcyd9L445(Q`5z3>ba{Vpqc6@@ zEYhY{2}}=e$I+J>4##8AWmweBE2zw*O-G)E$=h91f_EbW%QKB7-jN|12X%ntpXg)9 zU%| z8e%T=)O5T`3PY@GVcUE17Km+~b>=Q)Z1Gq*SXWsn`i7{uA7^^32i#xpLc%pYcKYlc zjgph;6iTiKwj!UP8^t|_aU^^pUuamJBwc#;RQ!$phfLPQrBBn;n-uqL{Uv#-yd^Q- zG7AX*)2U3v&zs6o8Hp~y)kyZEHDCE#nz%B1NjB{N)%|JzzwZAGuKRDX+6l0$3ahKD zYKnL&itB1>%FD{ZzJuzj{POa8uwew-zupN8{3RFnbY)hS;vwXKCw^x^WE5x9Q$Xrt zCwG^}s|%@le73V3aKo?Oj?gF<=OLppHz$UW%yhaKC8EIZ%)Kd4)77%$``WoUiX5m! zkvlJ$-o5S*;PvUs3=z+PJ7#iOez#D=!Y{7-zkQ2DRc>mRnH=9{$Xu7Tqs5h~E}R|P z-Z)uTGhp<%^35r>g#*hjD?pjrl5*7-?}~3iF{-7B>8=ZaECx^Vl35cvWCXL{$S3ZR zHTaM_;0Jw%YR1>9KwYnU;UeNnGA|13%X4zzOGQJ=Hb* z7fX|;+YWtL{ICg^8zWu`KNEZAN@hoeN((SLk1OPW{NK!6L1-)T%*->}h&1V+UYgts zeKoM@1pvjX$qU&A2HcJpk*$%VoT_0|g|$Q&Jd5i`bgj{42P?Zy`c+LDjmBATCL`Tk zvd#y);5QDGb0S!Ope98%W^lDy8ApxAEy7{V^Pp|+>gK4VY=^wTl@13((kgCO)iJ1$X$Y5cei$mezWbkw>{3gZ{7 z-M_(ewwaBxIxLn-y)a091lMP+my!z4AP{ejmcDm{?BP9;!Q7)t`a*^4U^P0%nBx0@ zOHR(d-rbEwQVI+ON4O2Vm2{o7M0}s%E??$_eTaqze-EglE1AMDdflDczFtjC02`}G zJ~i05LQZ%4yP=S7OIH1IaHTlw%D$sCMHXRUElycVr~J4ALGz8L1o*dJorWO?^lmq=yt}yV!9d2?0`;ypqKw{0L8Gh2 z%jjZx%zOtC`>rz?2Mk!gc~7@k;3J6(#_+}`EAk{#%$ejZjFed$*LgFM$I28=+dS+8 z6+G|xEpkR=he2xtp+$v|{A`j+ z8wc|7OC6_Vc zq;8Q-YT246JFfwk!S_%?SiJSkIqK(bc63+h7Vs$P-*QG1%;n7-Ej!pI%pR4LK3vah zvHc?#`@C4MN$rS8-X(3oe$f?-)Vt46f;V>@(W6_F_3Pm{@pD1MCC zsHF4>pIYb)j}LOrDDsmWH_JElnW8IDj2ELca?~`)n#a9l$uM59^DC1vflNo|AZB?n zpRVN(BN{?+XXE53rO=gUHT)(cNIA?57vZ!2UiXBeM{vID%~-V3+8aVkLY&iV)SwY5 zvIzS#g;`UgLYC@Er$vnq139DY9auKe*WvHBUH9?Qo&>-dO@BN_0LAQO;xAn^Xyqa- zC180lqA=q*h{);NgBjbYRw2_i)WzwtrJsnhUMM-r`Q33N%PMYdmLf>^T#z&Ou`LDm z2cu*Je$7C3)*LH#05XyQuM2Fzwgl9|-R_wDnzI}%96yBWv!(^vV%J#Nsa_o0@$$sieM76VcReKOt?SYFPr~Z4NZwrUH!fXm=9pjpB59$wi4gMyH1bi{wo$ zL3I##mc+|N1`ZZgJW|J&^OnBLS}!=gM$yW}HE(9L!Rx)K&j0f39p=*CGCAdLFYmG( z>|{=1Y_GAJ*)_fHkWZxqpbNUb$>=gXoat*<%^CVyS(%(PxFz76nx|tEFD7}Tit2m0 zd;#bvZe68?reHiaaS&rn2TIt=SV9H^_phEQ_Pf*|@LJa!=FSKk$7Wk&GFWVKOTIU@ z$nmJQ*UKShf%WVE1Dx-M^T#ZJT+IgIA;}gV$!p0_X~Orgx;uVbNc;>ZRI4iGIHo{s z^vz?LdocM-Y7@V)(D2bQi}ZtE>R9D1LqIzxV=9>~kfWPeAxTZ~-Z;GH*R&SZV=UbN`798&n5}3I0y&za zU;4-8E&sxi0OMu2TatD{Gy%DoANF;!THvdo62*V}Kf!&X4o5^t6d$`|5gA|>RoSHy zzgWHL_3PzS<5|aI;?m8|wl=z=syJYVBM4(rF8v^dI%)G`$3i`sb$2yRbnF>Vy~|}I zP*_Jiq8|d_TJpd5ASj8U1|21)s>uH?o@Uwar^k(9&&8Zz|2Y{JOlEW`R_4jmIQ&OF zZ2E7Sj)%?Gq@F%1Kb9VuBnViOOR2vY7fJmTmi9+67A7x{juL*e2O8XCh7I^1)rS?l zYrr&#Cd9;WL_QsHtD!_>W_33k9q*i*t!<6UMrV?x^z_^Qu&p%b-Y)h_L7QjTv-d4m zs>7MBK>8q$E0X-oiFtsJk8=;`!TH;Asb941?{PN7nbp@w9c52KV71P`hur9nq!ZdN zYf$$P3N|FAwm{%Zh&;&5-N&(MxVG87~$&OE>dj>c}@*8|3p=P zO9TTR`w#{=lKRsX5pA`?+USP_!76GA*TpFrcBfLvZF*jKEuEZtqf+43S?oJ#d3h^j zvNRwV+Cf0_Q$HR6<{h7BnG9N1DZ2V&m<*~<^)oE0FOlZICG;KKpTFAHw(W#A#Ro25 zp29EjS^7DCAB@+nw`Q5{NK3~@PL|Ek!EJ9T&}ww1^RnLCi$zscUpkw*I-p7|B_a0mPijD4LZ7M-UAhV>wH@|C3}{*n~kSB*?c z#$~b*DWU24lm1oFe`3rxaeE8D-Rb9woq`8t0YBU?15}#x!uVto-)XSlgneDX!pNuTTSd6xlTj zTVJp3pLN_6&}};x2ARig$B1h88H#rjgBw{W`X~H||DR-V%_#>)N(#ZQAFNxtYy2D+ zI)uO?DMjV55xsF;fpnX=_YRX{{&|uSM~+n+3yhQm%*YN!^es2uVy5=6Z1CIZS903z0HaynAF3DQs&y{R;@p{=$35Wz&sxw2!3^g7 za4}yN;PvKFanNFL+BA3iFzV~fTNduh*rgKV#q6EZ3F%s zO!U;ax=%Y|*G6MZLoVT76}#vj43f-&K98l$T_VK%WAOIuDr(G9n^ra`{x@}SV1Dxm zmv71N7(dk#Vq$zVWI&4MVWwe~dyc36{DU^Wfa8b6mcshw)%SRqKK}KtmDn$i(ME1v zzg(%O=DO|}v`{GdSPcCk6~j66rhu#O{6s7BO#SBPegaVEgM@3{)Yt1>j7g8xtHx*} z1*w7nvpY+{7ydlDkU*tbHFwI&xI6rY3?FioYLzmDdjgU>mNzwjBdI%%6$JE256ZpY zAU(-4>LzrsTmccH17aGT(NWbH=7Z0F@ds@6P%*@$LPRz_K+0Zm$KE_yc!wgWG!h~=NU9VQPWHryb9N8 z7Sm~Td8{NU{E=G*9~D?1D?pAA>cu}S)ThId@{`h(q{vjpZ*pd0Py{H00#nZM20suhm5I*#Q7w?XO5jpLP! zdzSaV1tv)0OujfFsgulRec4zL3zEz;miw@#Pw1G3=o4~Squ*7IEaK5arh74bwcGSjun%E&lzcO zOd#ox&sd&$YXA_N$8Nf>M>3jCa@`O1yaM|W|Nfm@i4`^bJr~m2l4URW>Flks6G2P$=C%45op z2GQ!;c4fqgxNiD~%6{_uuB;YROZRN_y?XnC9jWFatgZSx1L#zhQ3@-(dIgM?(?fx4 zW>~P5v(?Xy9VJN?Vq$bzj6C$Ij_wZIW!)!fd3~VY4bcK1X19UI!jv3cN1e^S5Lke% z2Mdz1@|GDdp4?Av7LF~VMRH$IwQXa6is6u7Cpjf0#|baTwvw~$gnXWZk~uB19=@mX zDJly@)<}0>Y6-qq`C5E_#atj#d>}qD6;wOvtF-4osI120Que{)%vQt}6!U^6TuClK zcJ%snhjSP3Z^&cGz?h~zZ2$Uy&4HKy-yDDkHwS)5OmksZ*VMH&mDV-Z)YjD37FSnP z71UK#R#um1rGqnihtR$P)fZ6fbu%UpIJB6klbNu!xk$WIb{$jEms`L7sT95Zi&bFF z&aAVW?unv3cwcg;h;$%f=}(Ou09<+ea~qP|*H^{{M|pJHl>5jkz(^9F>FFr$z0x{Q%*RsqN%XZb?iX{%J&=YlWk4{ z^b&zy`WvxP_(~qnz@$tQLdPAW0w=S^zEzmd*|?b2#E*s@IJ2@KYNnZpkm9Irt^=tM zbH!3@lu9?Q15hg0W;!Ao72v^KVrfnprItH_Kb?V2&5t1kqtN2i1a%oSQmPhz_1~)v z9NgT6&zVY2|6w~Xc~Qp}R|EpZrKo!QErnsJeO#<1--CORQwdrP4CcTiWK3|+#0ycZ zcSKh7@))Z^-h!YgGeY#4QVF4Pd*xEv#9-6D{(`j>0$o|1#LO0IYH+{NlV3{G|wYr9K!t|V+Ll669J$6 z>g=qIT0Ta%_^n`511@pA1aTcdXP;{xhfUv;n&5~n9-3Q1Pi{q>m~sy|PTSfSj&R#wH)&&ZOg9)p`lZbDnjt2b> zwZF(%wwGpn8&=d)>s0vJHz?(3H015i06P;DQ<8m~JCZi24aJy+LDeBy<*Y;N zh0jDXaH20uKeD2G%D_m)tmCLcf+Xr|%3S+caw6>V+CQIy7BWL(xnmH><(pWtj1aMF zsFU4ZH!Z9ZAVw`qPmvH~(u5Mt26U<-s-Kit8^k8M5M{S_VRNC8V% z;LB8SEbiv6q~v<_sn+_OWrm5oTC1*ntt6v2omCWYi#Zi6=vR`( zl!;lSOp3#M47I5c-a8?KQ&v(*BXSWS*fZcU8^@J_7TZRobtBulyk7zW5Mc7_q%~3&S;xRo(rjkB;L71ML5`S)dNBUK0%6y(w zLEoCatz)%XbF#)(d;MvFjE77Z{@_PH;rJHY%TQWyeDh!St13Y8H^+}h7K?h&*9-~| z_O2>IWY80ZjKp{!c2GXV6Ip|pquEblIaiZkNoCH!%CvLv?iblgzs>4gwuAsgMoitnQe!lA`VO@L@ zc_UCU4RkR`Z~^)w82Cr}5BM7$B~Rr*=WS27Y&nJc#Rv5DF8upFcySb<=(B-F<1^o) z)lYogv7Bof+3JzI6@Bt@6sRK_=X9aakg09LM$TjCavEO=b?#$GFp>Uy&t;&!*w(=t zK?|||MKure*h(qj24$7ZD(4P*5OONqCrKW;Jee$#0BxR+rVot`Btw|Co7tWnNt*_N zzV5#{zxL7AP=2=iTS`SLB|b`B?aT?)Ofo}P%daNw=_mZJ@FI1wKD_lS z^9!MZgxS6>m8a-T&@Qp}x0;(F&3%(%psY>(2C%$#WUl%i!vl$T|Byc+ib?ajH6ga{ zwlVNN6eJYY_N=DkYA$b?c7|M{oP(n}vN%5Z-;DfgK;12PL&VdU@7bUHLa-$v(o)H( z2TVX)s5j<5e>$7{i~u4FDd!=HiPq_Iuo= zs@%q=4BXLHE&({ zgLh_?eYgj?H4nab3I4`&Cu7}(7TsB{Co!#UqM5o*^4y>RHIbXAd)d zkhkg3J)CYHB@xb3Z^ZG0YEuBzfs+f5`^0F2(UG19rFIxt39lfOAi*+8O^?Vo6n;U4 zO7vTBH!ZN5dkGFba3@f_mZ~#=g+#)qeM{*16F5KpzelmYxx~#cA+;n;BZ@IwZL7GD zcZ&q|+g(O2$KC99cJDWI_Ng$uXpvfbDO%;D$0r0I;UgJwL zH8tCWm`!>S&}$XlnDewytV&eqOBr&~)i zxCh$k&@3cM#}4*rK4tik`6ahO=7Pr}+{44NW8d`kQcWFzS_x?pHbKxfeSokKNoIDY z*fy)k(Qs1@7li_A)4*|@eKN&dqUtuRuOK(}D)XqY)b;C1R!lEO7xR0;$f|1K*35*D zFzWQQ%IHz@d)D&s@bEN_?wSWJp+=@6K|nu>g=_J10lD8n&#tmjW3{d6b@N|a z{SI;2PB=g{)Y-24i)}?Y$Ch+5RKrVMCLY3tqbM19Ga}-n*RP|gTDy(Qwv4s z|KuVqi>lZsk}R~m5C5uqItlC!-Cf@JOC2n(0Ge4l=whtZ(Wg6tpa%S)5z@d*Wvb)& z{ohL~IwuZH`a^}NwY{%dh?r)I%^hEzi4jgw*ob@i6r(Q>@}`?-?-;94^1AKuQyW-( zQBF0{=%o*$s3y3Me@>x%pq=@=LiX5)i+VR6SQj-n2te5-F(a#osHlV%nxjp1h$Gi6mRW3*wiqnPevs3-^9>nJO zmZJ1hgIjnZWW-2IdY<{GS-mUfKHIP!4ChzEg46uq8*L2@pJBRoejb9Yvq%#aO`)FR zwS>c;d1`XNRmEUQb)jFG_7Ui{^;hM)&|(pZK(>jB(-|1*OP3K^82Y%0w$NvuT1IPY zR&}F){CjLXFj-A)Zmt$|0LLk8-bC_3aEi46Pg)J}Iz^f1EfG@<1eG99-l3QiTm2p^Y=oR>*|oQDm6u8R6BS}j9D86sQda^VPV1hd1&x;qimYp-&nd8v-q%nDb5%( zlcFs^Yqb_`%QJ5JVpL_l{0I@cwfF_Pf0OW;abxu@=H9@IvAuu4T0^1}Iptq8-C2R^ z$a`;7l&p>B_p;~3ZA8FEk}~lZ)mmBk0a5-XB2&#x_D2ubJ%-yNkGM@;CFYSb2h!xjpfF5L4ON_LSMnH7MvLo{?z?YeW|)F+c=F3mvDQ`kj%p>yc|KmN)A=DrXKQcE#2I)Cib8T%@G0@EGbM%2`vik+zsNL zA|le0RrxlEjkM>fY^T47XA!04<%mIW+m*61<{Cj#+)D$+qO=@e&57*V>YUX0eu|F%~SX_V|?V!f5!^^g!9@jXd0T2&cne5E#sq+jV(iroELP-D7y<{SJ)r}Ju_+XOTS`~!#TPDL*dX$350EtZbVppt|eCGCjRxcQz=;?AS&ewYw#uuH#Mz#K0h!Og=y zEc2v5CcMr<0i$ycw%{WO?u9ec5nV8u#Iz{oWCOP3TDc>++A><>ls84r*+8yo?~fQ* zqN3PW;&~(;`?Vdun}{sdvYg9S2(o%p9H25vNJReUH%i}pvzGgJUJguAb8t{9-U;*- zr}9Jtx@?JA!sWB9v)3xmfrj7B^^0S3R~O${_3qrZ+B5dwD(98Mz%L?B9^ik99Y1Qv zjweVZhQjUK)G%elQ0{L_mkAm1NS8UspW6Q#@P0`l;64!>xj~*EOn2Ok8;4KMr~+Pt zDls8?;+`i?_>1F5&AM%_nY20DWF`^>d#HEUIQ68zC<_eruKes_7pSOX_7)TFv%q&cfgw9mt{`+&O6;eNVw485(mx(T^aIn zEy*VlU9ohOzCQE#W|lNzmV}WCIJq>*rVB}Teq;)T=_$1HQKmQO$8;B*@-M_7N-@fg zdATQKX!x6c=d-m7}9$e9hI^P%+IG?7GTAx5y)B*I8nLm zMT#FNK-`ncQ+KGcJjQqOq{DRSFn|)y|Gm8Y;DbG+r72*&8{T1+VpYILXWF}^)R0tO z`a);1u=$F9eWbDsoW^7o^;{AT6|oJS4US?qQTCrUQd8A#SChF7ZT^)5c(N{`zB(z? zv7ZgxSc;gy`!^@!LE8)=#&xYeq`k5c98wggS8!BlK5PoK844_xQMh2G%H@TUkG&cT z5?SWKw?RL-B1!!i#TCG2amy*pVx%N}8V`$~5~b!4sVf4MEOg@tsu<_d-Ei8FEx_bW zDeHg6gHTl$o}FcxjtlnjdeI1>yU6R$O$kgeZe z=9Knz8KFj_bwqSfH2X3ciE$$7hJH7vOvM;JpOnG(B~C4T5tuIZcII|Z7ISg=wV^uO zUOeezMfNjY`J~X8#a%=2vAaWeqfb1}V^hF{y)3T6W>>`l6&O-2VY={ z?3#kS(3^1_Ezs+q!P)&E;>j0Op9Y%o>)+E?Nn+@MOkaX!+CTGI?oU6s2WWRHmx$^w z>Bz>~r{|6r`zQDES(dS0co$BoMd;7-_eJ*^q49hH9~A(e2}as;K4l|eZ=4ZHUln%r z&*3mrz}!!5-p>kmf4p%%RfT`^#l36W*RRL<*>R9RK3pyN3_Ta&$~B11+;YmP{X)J* zK|7C_)=~5hf*Q}Ed*hiHw1q(E1;O{|L{=^{e4+YhR%BT@5qhJCcqSPNt4P<~q)F#e zrGPNt^#=)i)i?=p;RC@iQWG=V$S@+ukCHY zppUFLaanw*AGlNmOw&NxJ+T(-iZVkX>pL$nk1i6HDGb%R*>%V!IwYkaX;SV?5Kxq8 zBwYd6@d&OT@^xb$xVEqP`Hc;cGU@fwFqaGzmePdverdE?^nmA7ph4~1h?71=KcW0h zXyf+XW`C|oqb~z|-=o0J{11E?A+_t<^@2v`gSF8nVo81#*G8%Xk!%j#5Me9(uHglc z+AKa=S-IOmQ7yVCwgg?ZTIJ{#RR=r2$HtQ9hg*dPq5s25x!(3DWda)pGKm zKdLAnDX50@ne9ZgZ9T}iuD-QqBi(Phk*ds`xi2mlz4I&fG)(!?dymV)SHkKdaZ+7{ zkU4vh`pO(cC=!F6fq_B?p?iy(2s@)c!Op6Vvl>-~jU0~E9-3^8H0|mp+nNDqW9Y|? zxDOjY30KFe(I)n~oK!z4`Q#newTS$(AbPnFUfq#lASM;^6M9)~y?^hBF+>S099efI zUVZA5rF0aOz7i0iGrDpwu7&r_-f|tP|MjUexf7`aq*t?yp?Leu#Z$6WY44riMWF@5 znfIH5RNBE`;7^KHA3kP~yy! z^-868qe`h5y?ZlsUM%}0XIwIEF&T1mJ$+nva3S|}>(c2SjpM92a+h?~9Fj7V+smXc zWN8-(XwkMl4RS@KbQ5R<;8pXg-40?+B}rK!cQrMhY*U25;~{1MEaJ3h5>DgN3!{y{ z_s?&gxX1`Fk9S6G$i2|6;)Mg4*L9B1@9p`xTQg01Nx5}2Tmcu_j{k;SPU)? zGhnn)@mi54_zC4k($A+z^*XKf(VxNJHD4rXoJ3QF^quY6(0fC{tA{?M&D+a~M1red zQ~>HH;=SOApAonKp~+wxde32`W2V&Im^dYAjVNZqPZ%blx(REcgLIzs2;P8~&^g(4 z{Y0k15{B-KFqdISH9pq;gH3Bj?tc0}NCL>Xep0!`r<^dN~Ss8LMp zjN^W6z<}jQ)b&dx=f`k5BLrV4Aw5&99Wk&7l-Yhw+ci95|NV*NMI#bws6(2>U3~K6T=f^ zm_eBjn4^`K+UY~eA#+;k*G#ApK*Tk9rA*47h!?AhIySy!f<52S7Pi7?Fi@{_Q3TBv zIi|pYzW4zmj;y1!48%(ldH9+7x#_q+a8*Qf-U-)5d9L4KaEO z!zA+=U#o{IjsG6aP47zG;RdMw_KHaP=B`xFIID*rkJ`T#m8XNgtG*AW zt{Z&5il+MA*A*Z7B1m04zp|eWpWk8St_C18sd5|~D&E+)KBssh8ji+o_kYK21~WgL zUjB_BWU?3$&oHczvd|?#H@E6^kI=*Q1jxY*!hVU;#tlP&lX=F5>((xe_i!Ona{elN zhuCLiuJKL2yK}AJd=0lTCx7G996M{gm})CvPOuH~26wj;t|%%V&Y<|F{BWtjUXX_w4X;WVPDiMrWmaRxllo5kl^}yo_RtJZ#Y*PB{gk^*^;b86EBCV-Sx|ar>E`eeF^O?v$kj>!&NBXQ5fFFXsuXO{0bL) zxM-$m6(qw0*h1RcAin-s*~9<^kTXE{f=*NYJaT_lN?J$+bKsM6?8-=s%*3mYw!Ck2 z?rcYS8-Khz7E0OZT^P9GwFk!v0fu+f;(3pl17zLNvjWu>bM;9)(fAX0$vlflvTyFS z^*G&iljSV07e%keYP6kUf0NT{47NNV%pcq5cs)w44Thsoj|67Q!x{&XnT zC8*uDj7wl|Q}q?9JCt7Hz|O!Nxp9*ZOK1rWfl|twff9J+K6gv0THO46gC)!%2j$;0 zNr*IW`(N?@N>-7-j&;Q5^4U!7V3(}rhp=v7!bt?O@vx;F@~*awe13IBzG?RruBtq> z(ZM&|3Ul;KIPb-zapF(JALd(Sj66(a0r~yxJOV>;(s}bZU28jfB+g097&+x;}%vo*Vb2-ww30V zHB|%kHC46El_enWU@7P)BwfUq1?;xnofF$AZne=+Sj0K!6PR6LA9`Ljrye(dmtgo) zv~~BX&^Q}Ith9?0F&3X=B)1aHj5C;u%B79lkaba15*w_vaBlI2!gy`-avSwj`LR&e zwLhaxTAOtRKeMZ^PX(+jv8#Z=ac@o1gJ8q|Y07pp6a!Z1-A|>UeiX&17xn)Xn{n@X zxmu`sTyaIZHbZAn)`%PxH}Q#2z%Qi$AXA83iG#ab^>0K>BpldabCp{$+@iB6{1zR& zhEQ`Ti8*CK9`$Uy3H|0Yp@J+NH_5+Cj<$!TXif1ti69XUk&>Ao2`QChH?qnbq{zS& zvdS;YM}dHES)hnik^e@Bi%K%%bwS*rXxJrbY-Y)+YtEF01qHOS_5-V4e!#+>2_pxF z7VZY-dVBK4&H{cc%GNDT&06k;xT24mkz%5{2D9# z4WZhXsQ&g5SMa}e-iH$Ly)Ri>XyBwaKbZaef94#CK|W@-p4DM803=K@083ir&zyu_ zaU?X|LUt1L4wAD;@8bgcY6NO=-632>0eAoQm2E%7TUWAhysj<;rnJR!xlg(d%CqBp z`&Bv~|JrfUt0~a@Qx;||O6=4Q>^7243%$J9d%mYOznbmI>egZgenWEx;^}3+&3;8FxiFhgV#W8kYhl0_rXlsgu z(sDvTpD&6yzzGt>5P8K^+!21s+lX7j%SoG+H>(}4-@N+jWj%c=_0BW+)L%s$5GBtj zK%A>NPkYq580B2DY?ZG~LvBRqA;MV!_$c3A?%iag$Wl#VbRadOMp-G@(oUbB z;EXI#E#TN&h5`f!CylS7T9=kF zU*RPX&e096Fa`WPrkJK&A%KNRox5XriIoQJ_8Nuut2pCaJ@8cERNEEg zKs*J(HN-{9sMY8Jg_sp_7bbiafc#>$slWcopZnTlgI8;f|=X9*4IiL87S+ z^)`3@=vu>_ms<0As`uAb6~L>ta5xrT{~?zX{P=omH_8>;b-REp(Zuv5ckE^jx8g;< zOu?~~yBSSQv*h-;I2#yV_NP7KDO`&0JamES;>7~X>#5>{%-QVHpzp|VFf#(r@s1Dn z4VNxBq&e<1qH<&Lo{xG6Q=h3bHL(h~7)gX5Xv@xwGE7rbyo`y005s#)-JUU$!0o`P z#FI8~(kb1QcW#fKcQRsyX^g&*bZwC|vj*b%wWX**R*(?|{B74@u_0T<&k+j!)R*Eb zZ#(jbf;DV&ZIphoRkqvaawwl9S-#4gfIFp`(=oWQ2#_|EmN=YR786>0$IRe>QoH6|e_74yDaXbw=Hi=bjIY?Rssu?*;K?OUNQpJ~a!@!v5@?H6W{Lg*4TCrt*C;f?SC@j$^NI(O?LP9Fb;~ zRIezW`?i}Y!g2(?|A2GzrL6Bx zcI+`9wCp}A#~&JDP~-3stmv9n(c%R`#>gVIYypvFx2yZee-{dDX;si8MijDVwffTU zV_lw>Ha$4Itl!;3WdW>e#i(#uHXKCo=o`kEJ#L`4^vFpx@K5ATDn%_qr3tr6qAp_G zCbL!!VZ)yv@Q5VbWu45SMW#q@LJUvFbtUJFIF-bK<+WLH0n!Sp z;iI8%XU-aIsSc;J63v~@6JXPu&8d0Ozunae_bNUwq>ONyk!ZPW5ED8lBbh_-{95)t3nV(6V)f z%ZGjSg+Fh7sxww%TOuMp>A!9VARM{Q5{;q)k$Dzw9t1IOQGcEK)W#%Pbam1YTsTtK zwll3z%1Ch^?zuUaJj{}SvZ(Cwy;G39EpFRUZ#J!yM}5N%Jrdx7Jx)xI6YBK90!<(o;{FKKX;zh5b!FIslo9_f@AoN}kaX((p}uFh zuu-stotwto-V`(402{L&bd~D!`TY)=7#KFqz7{&LmE;1MzyC1VZvHA9X%!=={h40? zP8c} z@7-B#{KHVj%oe2IBR1lfGJ19zhAYg*+PT3tDsgQpTj6HLHt2b;GR{ zzB@p_4Agh^t)g4g;Yo=6R#D2y=eL;DKNEN`roE1@O5_Z0)y_y>ZYqW16@LP7S&gA1 zAh9TMeH;nOL-%q@FRR5Yi;kSb$W?poJn#;A_;0DhDcA?C%7lb!D$YK|jm_Q)Fi#8#{12@#yW1s@mj`UYUtXPKywkH!pY6LgvOZ2YlBshlY_1?Z3;ied6lE z2QOt%S0ZuPbJJGP;XRDajo(-Pmib$p=u*@Vghz?)ZbO0g1{-z}2W48Tal@aK2clE@ z&=U$By}XR=(N|WIH4V57Qg72};Vu$c1~&Uo>g`o<;?YTMr(;rJiM^Z>5Z2-7P-W@$ zY>IHJdwwg?15uwSDWQ--$%#t4rzNJw-XS<44$rSzt>c!BYhstg1dDlX4Og=cg){4` zeC^!rf{)iY5jrh6omco3&$E`pd8o)o8B!qs0i>BgODXe=G~|D@kpmlOH=N`?#cAy{ zFDLyqNbDvp+0Xb=6#u~QeTL)X;o0C=MV%1m>kKeJ0gk4=RvwrBeJ2Sid9#Bsh`zHl z>LiwZPV>Ij0Wm_^JC_#SAN*F~=L%XDN;1oQS$g2m==d~gZMI%syIgB;1KO_7vDM}N zI?qgHlqT~cDTGXq;*Zi=8~lPV{ZBXoAFeoiUhvg0p@)<=Ny&-hQNQN~t?zy0qGpNM zg^7?~7ax7UdD^aH4O|z96UW5Z(j;!+olgRr2XGTmWl%T2e3m1`$?dJJS!$Bz!&?1k4)cGQUx_=txUF%9|j42c(c24a%WUgmikiJ-U zzX2L`2a}ARUOeF(G$k87+F%E(j%y-Eqr~&LOEFlD;!_M%uYdW2$ET`p^clh3g6e@! zh2`}o>-9!HDWV80E6STHs>*rZ{k_Kk{l7zjA|INRU*=lYS@>=|~ZXR{Wvo@Bi1BNaY!soctf*BXU&( zTI6TgBl0oWLVqCwQ>#r$G#2bY13M)mA z5|zw}+Jh)$;`rldk$ciYq;m$NV+qc)m+(%2_Y)4Uj>^vLzJ@#}oo>&F=P+13403at zJNERhbkQ|VXxEX;D`(N%TUZ82Qm^ttOh`X(dE$VGm}G_$navGP|JGWlU?|uCnc9Bp z6yuAj@&c{RE0XON()qpS>abCqM0e_CS)VOk!t$Q&ahk)1c68$ki*g8g_QJ5T8#;1; zHh8fd){Qq9`qNdD-kont#3pHhJ70%_p7?M5VH!o-J$&kjEjU)$!iY?2B+~|JK0?&c z2EFj%j>383vsT-cN5SE44wemjI*Mb4VW65)7U?bZch~3KF_MEQec(uyOJ!r zhXIC|)91VvUQ}0SV{*RC<>!fsw7Yv-2>&%4rwfs`*MvzPg_V$gs-PAhtAL3XG>hZ#G0|5nLc$6`OY87X;-SU zE`Pxu^Y$qz*1hekAr9ASVSHOPA3!eU>X?}?3@9wOXxU25u`sdug45S%_WCs`Fe;+K zqD863vKf}UZN=oqp<%sM`W+Bzwc~rT3wa-bnf82n6eipD2PU(s7ylM|)kVp`?N;7k4WGCB{gUrVbu*UO-g!M{jh2E#Z3Sf`$+&7odgvQe zMqiAw(uRKfMA>DJfHzR#(XPynK`2rVOx{}Pr!8NSt_*9ajtj`7r=xbfKjm?GH*kCj zuHid09VYZBh_uXuLyP|5GrD@dq(U)TJ41jcL85W2jIN+#XAchgwx$O-gK_`_yAqKU z$0)sjf_=l%kfG_nnF8)^WW1UwCn?rLlGw-Wj9mr77B-bhn|yC4HXYhb5M-VzEy*exEqg{^Es7My0>hz5~wpo5C^H=NF zl!r1FhLk=g!^M1V+Wg0`-5yL#0oa60mV?|3ZjabBt7pvx zsa4Y;-6ftwYd~<^#qz)gCb8;1*0UG(BvhfCjvYc_MN?R6PR(`Mh}kO=?jri1{q zz7>`f68pKr;_+~l5uRA~4nky>XddEr^?~^FpD8En3TSDJL=Ghdv#!^barsr<=cf;| z##3ZF`(9E$%PNQOgJnJFd&`lvEa@Wq?A#TGUJy?WqyUHp)W}06q1sYWB-9A|Oti1I zA`+K61~pIN7F^Xx=@a*@W$=3LeOHR{MBB|5WdB@Eq?YA{=F58U%<*iKV z(v$&WA>7}m)K#dYz(bbTAG>Mw#4vE{jeicD$ugr67Mgp&nq56Z3xw{r@@I? zrHM&br2Wwv7q3O7C_hF8C3MhmNo~AGS&}tIuV_mOz%EV6k@V!HFJ^ru`UaAd+H@DN z)&fbR@RzbbUn{cD(H;PdH-#aYZeOs}@bD%@fQf@{95v_0W(Jx-*6*s)`&c$0y#7`;r)**2TR1aaUEWV~=q!$Q)C`jo*;D_)7S-~{N}fhQ0xh=po#ZA%vkaW7Rl!C<4ZH2p zHacgAVj(vR(}^gGENtMs%FeowCg!OHdz_Rz zYAxa@p9JC^+fyhz6T(6`)o(*>vPZ-34g8rdFT*DMtP!;decWYheI)BBy(NYc?9AwC zBa7eO&Ra;>EWRhs6MQ+LT#wkvwJ}xA31+@JpuQo``C6P6XVIk-6)n;~LHQlX-K^RG zvmavZ9Ze)hb5h($P*gS06-kcqeVboAAUd2N+wJ0;%?$Gz@$9~!tTKfs6iCR1pk^#8 ziVZLn8FAWtExPYZi0uzMkM|WfopKH|(zb12x@~5>%cxo`_~>{HJ6B67lPV6SwNuef zsFuQvTID-p%|X9S_mY-*r~`mh$t-)K^V&7u<0ipG{s8-#tk$yln5HO^WE?Dle5DF8 z3+CJxFk)F(OpzK;O3f+)94TZwvNsr1lD;x)LadLg8IQuTRsI?Ff$dndC`E(+b=8qL z9m=h1YXbHit<7zb`{An?cmNkCr2g@|fr=E5E_K05uVK9$Ls*KUr#!&-`+Dc<`OU>0 zL#&nJ`K|6iLpnTv&R?F4|KRG!p2oc3{selDd1gui6Ud8?FG;l_8W$32yNl!mR5Ks%Ta1(+Kekgqb;qli^A{m+2^=)?WIWAxG_pb2 zvx{aK!;Z*7J8?oBX0nC3YXlyhQw7;QroH2oohsPP_oi-=?$j?$Oc&+LY4keZOnUAJ zd5**4x^Hqn(y;=m$oCCwo4ZDf28Qn^+KF_)7(^vUU9)~b=>s}Z$f7mQpa*LoBg~dP zMaS6({lj69hK6DyC!5k-yScPjGL+A3^s9#V?03Cs=(jL!wI4{2NPK`c^I+yh7QQ%AUml4ys5&x5DONM>owEHp9HGknzw~X0%#Htd})RiG%k^ zYj?{J3=z5~k-j4=N-svp%42CLgqsAS=j%U)VrCO6^kbaTOp4GuV^sC6K3(fg?`Lcx z{XMzC2RdYAHIF}wtodg*6pZ+EEZm9IobAyZkzu`GZ;i)gT`;GcPyATA@YJ?U;i|AfJnr^lo6YW0m6Y!IOmO;rdx&s^pCo|&2z=|d$GcYD zyiCj8X)e|FHF^T&0By??Hd)fyEGC>cbr;8?IhXv3diH_i?hL+YMbO%neOz=?dRusv zt&cU!n*kKO{;!Q1tLRxDu63;eWA6hgq*E;{46MVRvazkYY(D%CtgdL*4z!d=!)p`F zM%VyWT%*Q~0 zQvX_N@W7o&`Joum@H+*V*MY?o!EgtM8B_l!QV#vvj`zuk@OHcX@cU@l}b%* zO1~3k=7pTjinqND>OV)+{k$mu%^^0|^z;@4tqT_{BR5mk1<=ui8m?o0s?)=!NS=~X zRC39QZ>M=i`pj2FO{`<56$C3KAnqL6?*oGeKHjB91NFavfY<+P_W^q(P`~e~&pm=$ zT?)z)D5)v0ZZE5@tSE1&s;((5uB@m59s7aKra**AhZ$TJS56U%QEflDk2~S9Bzlo; zQbYIJ<68mchQ!qXcK7w^RNhYla8Byma(C>Wr=?ylRs=y=R;DO7RciQT>5-#Oc!3JlM=9#6qy`9PKK-N8-t3v;6p9|{&j?C)KAP9DG`>6h%kx?L6CTryTCIK zW;)t11uP3>{6_b8#{Gm@yt#3VuM0B_i;pyy*e_1(uWN^qL5oxBy2 z=gS6Rj@_^Q)`&G}bAQSzE-o*AN$`QHQ+E0|O{pW@2!Yv*7=prR?m=56csYYSvcg$g z?N?53$1#u2G0U4o52x65QohK>?aJ8R)RRZ;6NCQ10tnz_AQ^_s^xh4y45QG>YwxSd z+YZ>G<&a+ZItOqHb3Ru4{?me1);lSUua8XUIPGFkd~d3)u_zjh?aBJUhwD zti`ScNjrQqAG2CL>T^#cT`0LC+1@THWS4p*A|eu<&=aoF7z&RGEU4y37cu`AQR(}c zl{YLgb~xySPK91V`PM#*C;RS{qg3isawff9LevBfU~eOI7M*b(32I&sNRE!vVvTei zhaC-Myv7tQ>>^P979OYvH62d;q}ker4E7O`lsHc(lc~_gemPK4LCUgfjx0`)$qz?C z`cm~qh?hz}bvht&=2e+C&hdUCVafq}E(TgI5@P_<^;_j$cZP8|)4lWTvPzS#&&PDc^x-_z{ zIk@wv-))^+XGh1TTtk7vgxPJnnniU}F5hdP!Ni2oaK(Ya3GIrb)c2nLVVGZj!DZs> zT%2$}B*m}f12P;34^AVqV}uD1E)(h|aR5-?0WI{`;h(D<$-%LZi-WF7pT1VA z@BHo#esS}fVjoES^{!v!vvGLnLo$^AyWqSI_jaoI&ep!r{cvRPp2cq=zlv>Put|HF zOM!ndC~Xe)>(d`&c=}zs6v<#-e2!D9CGoHMxu0U_=j;XtI#qsE3FpmVtv^BUcsNPP z0kpy`!+1>3#Kbr>W3}lp6ho3eNf^V@cG7g!Kb2Rd5_S$hIjWZ6{mM8&bNM|C#|lDU zLD2>^^#~80c9*W9Txr!dNi$R5wq$z-<_MGDciwLoT?%8 zdJg>xST`c8+wwS$Z_TZCWwA1^aLJtClFuOBXCD`aBRXk4?R-J6+QYyUAFL8FH3qB( zivy){TQ_XBhX{rBGB{`<5Z}A=kGhe}S%=^>#sjk&+$WFFVteSf@W>)}T)qT|H)4D{ z@ZlV_Si|+Fx56p6(*zuSrwpD>n}>F5|6EQWYJW9)w_=#<<-t}9TYHq`=B(Z8Q-48( zoaQMW^dkM4`e_D%sf>p($bHao0Nx#7C&n}<-TtynYt=`#;z3t}*sE5U^+T`+|@&!312oD6SwYjQhPl{zC%KbJA5WS$n4b z6HZmdAPY|JN_VO)(EN9_`$#cak^}ii);u0NsT|f&;r#TS6FOVj##d!l5BY)n*AXLrY_|sOKPmlP}K8Q=D&UDTYvg0>q-oHh6wg{4|Hl6Hm&kaUWCWVf{mw9 zNXrdJ*>~X;Kg|?z{yE-kUdZ##5}iH0%;<~TV~_B)*`O0k!(%z`P3=77$Yo=#ql&IO z;2@=%`)=Fk@3!K^H*dVPcm`f!yZe2nO#cL3%en`NY+VPTqIEpC7Yg7VN-oeKVC(lj z8W2kYTMV980v;;Y@6Qv1HQ1r%itBdHWX(1iv=!?c`Exa_(lMA-J3(IONLLiU2oNmz zUyVgT^c@QJ?1EAA)}sa=hp0>+`l9=^9OX>DHevdo^y_%DdVM>ZJ&8tk$b4*_E_vKY8ot4x z;k>i9{ek4O1|gKzhdn9 z`CR_YRW7j;^%;Cp8tFSYPEkOsML3+GyupVQ`S9)Akoafcn$LlXBj;#D1G9moNE(f5qXEaBZ~${BxzA&}+d(f|EW1qgymxiy@It^nMtjy`pbJf} zX%pY(4Rzb7JIRPLwlAkq&6R^%WhPz4TF>4EOZV9J(7oPSM8p88J37-zFy`XxJ;AGa zt3Gl%GkOJWY!FQ48>)>0(t#2~u7OR(F!93jnHTg#+Jece#a3X_)l|L$db^r2Gd*c* z2H3eG(w|C?w4YiAQlB{%3)AQnn!f8wIt~alFt2zXxYPG@-pS^VHc2Y(OyeQawAK47 z%-P%j@qGv#AmI3-eqS9$8al&|b^ap(<^{$6iJqGMxQOJN`kbXJc=GbF;V?$>`gU6- zZ?Ym!asW}N^5Ovm`HL0_P%6es;#KL?j5g^!-zo*0i`oGO@+%Pk^Tl*^j!$`{qm)bw z<Vq(~b{S8<%jxx`%sB)OF*a7xAR1lETyi2>%tWmVM?){NHTHS@y-u0D^Z&7oq zERjjV+Bd2M4KTl@;uB}NUw`Qn?TVN`Ew#jA#w+ z*`TswBQe{0a0^n)O$R3}Np+7Yl;Hh#-7t+^3-#uuWJsNv4Uifx;ys+_z8F9^$SWuA zoI!QzR3eLBfq{y{>J7ZL)u~%YaTS_vTh9+^?XI8Kk2?!5UQSN=K8f>u_Npj~OyKh? zQwp0pd~%fgH%ip;r%%dYLA& z#I^C~8mxFa*qxNz?^e1ZJQl(r&L!lmh<^!?pa-m13j~_z*T}>tjuXDq6-P1^Q2KU$ znCb(&I(L7VUJ|KNntf@H6Rg}H(l0J+(5rVqRx$=W?7q5Azh~#R5Pn0}8z>GltdB0#?3i#GAEw_^Y3>2IeRj0CP?XNbnwa zY*I_#?&WfIzav^C4fvjx> z1Yn!lN%DF`j6wbZ9~{@)D@P}*7n(oIX@x$$j@)6e{Hvc$S-&7sLsp)j)u2?pw_A3e zSS>2Rf!U)4mlM&0vvD3;Rd3VK99=`Tw;c4ZU@~aZW7}_K05S0<79&edoTe}Iqv~A4 zP8e^rE{WaMskL^}b_^6@a0hZLK!9@Lfee_ms)l(J`aRFG}`90D@9v zuX-DDF)b5~v2M(H1}5ZLSUmh3gXKz+8k(G%&iOhBFeD=SvGva%Wfu?yiH-)Ap5(76 zjed^UEcxC{22jJnCE-7xP3MmqYxQ54Z|G~}cSsJW!}1X~U*CRfy0u~FbSqoGJ}-~u z%Z={54vAPlE<@W=a_2EtIX(ma_;1ZllK%J_C7t|!o_#QN1NOo5C`OBi90(Dgw`Uw9 z;7F{6MTvRcH;qQ|DsE^La@1acG4E>5D#8-2GB8goLv|3}rB`<6s6uF+%@4+IE+z!= zzte`5|2J*0M+OZW5TV+xace6p@~dmBs_KiYYU)cWtATvbeL`JhUNNZhgb?}{+Z=*Z zES%|&6&6g+UQd&dH9+gUHrgW<`o-yRhjw$b@itAYazHyFLj6%Jskl0Ql%+3LZwZBn zz!U`2Qls>byP_0u<($*3dg4QjIvaB-ca&g*4xDtE%qVd6Tk1#RvP)ZXN+J(99cA_|P0ARZAk;3Od)W-BXI!bRGbp z;==BeVmdTjhZTSRx`96T%0r2Bk3^rPh*VYvhhHs^2m_ z{NS?D>eXVtvEeX1pbaQO)1~s;euyDi(*)PIarIR#$E_bCTrF@V(B8)@bn{p`myEK6 z)#BNY(+kclV%vhcEc={qUFJkrqd)!^7Vla}gk2~ye0CiIaDCbP&? z;T0kx8CK(q)_~>PY8Bewh8brgOKSc6yB@W^7L7jeN#ix?`Csp*8*&}yGd}8oRZ@B+ ztz9#m#jC8GjM&&IxU#0m3eyq@vdzz+Y8_m+pre2&o2_VJ`_1|_tZ#Q!OZSIV6np*>) zIU0e|cM7j*4;*AL?M4qo#y8KD$_fPldH{=<0e7H%(1A1hI_LcsqHIh2A3$Z=dM~NL zwUiIPH{Ca?tiT)FR)vH&U4ONp{%}dC+sb~LN760Rjc-bkMn^E9kxo_k z7=di*{vw-~!5hXhegh#daC4Y8JpFyH{Y=OAWRp)zzo`|6!pr8)+VZdTtGMhpfss

Kr>RD~mOEx5f{V++%Ds%6}qBTS=&XV!BnbTfa{XO{8BxrN3tbsMm!d0Rac+tLO197Buo zjJEO>rB@F{G_yNknJ3W*U`Od#+Rwj6L|CeC?0pwfMg5z7s1di~U&o-^aA(qFsE+SD z>b71UG_M9Gv#%y2WA}tV@{m$$mc1l6`ej`JmJ(%Dq_os+VG>pxR==?h0Yf26+F}n% z(iK!P*$A68fFFuYbhC766Utair%O$iaiJLfKL)>SMiTM^L$*QkghzLuGa&;)ILwp{ zrZhjsuP51AN+fIE3PvIA!XZZ$<{^>l)A_F{3@oA`dXjKxg@$%=&!5+Bylz}&f+zZY z&UuN%*JfJ#EsHQ5$yKH0U}S4q#qZvK(dHQT&k$DB3ji(sHZany&O-~{g5T0BFFRPN z&vp0kI_}?q68pa>VBZhNBvjBU@m3tan*?=4>M5c;dx4P!i0&E)lFC?W% za=~K0>S;%Z2&cl1UO#l65m=Zrg%!QZ6e~gT#}1}GATTUGeSGki@5TeJJb-UbzOg*b ze5<~<33m#pse#g>DQb5nA6=N280oj|BISzk&1QqVh|XN;a+AJP{#k>QWvE0gch~vX#$71QW%)bJ(hDU6!N5Vq71MvDG=34P^PB(iJdv?D9VD zzy+hrDeYFF%b?}7Hx`)B$YD!UcO%Kylb}5~-QKbjSUN9k`O>~_YQKjtWGO5oc2L<5 zUZdbKGP*ziQB{GO*Y`vV{crV5WDmp#4OQp-!46jul*FNTsg6Qf=mZV_Z2Dj&kwU&F#?|mBR!;p z)Op?1PKz(P;R?Fj5!NfiEMz1Ow!(rg&fjIwE?AcWHK%mZ`FjAx8o%ZUO(yU6o~A{p z=TV_CUlxR>Tq5Sm{`CFy5SHzHAb%onRfw^uW>uwjB*T`swCsgSfQ=$_AJR zII%tCKeI8}HjtpjWf0KipEHGzpwm2PL5~i`ABE{!z_7?0eNR}N%M+CJ)m`hZ6EF23 ziY_&!rZ}yl=gi1#rt1FDo5Ps1C+9Lyt$Q{C>)gJL=`{sjziZKu=Xn_Y>ikc9YFTa5 z8{^74Fm)?f3EMpN5n5Oh9B-E87wW3DmZ#$|d781Pl$!xWM{UR#K>MPpun{3q+t?W(kC=n?6K zn+n9}bAN;9ScA^2qXWGzBkE$ZW!AR~kEq5$cxSgt9qBnmR?j z(9c9Oc!B|%35Gi;iVL(G!-x#|uM=N=lGO1jFq^iXg7#Y=H6GB`$#>98V4{%Nd_*lZ zdynhOUeRB;7thT=+U6!7J|HoW;4b&q$$4E&45|U}*hl~a>Q^{xz>8yFlQnkxv&9In zZhe!6_t~vhHE9lwg+R;8lOSQRL4lA=&m}1{5kcH~rWd9S{ZM>I!rYKo`BIOZK!3NK z%5A{S*4A{!;_a{m{wX>7r<&)Gr<#ls{scG%FQv(uA&9YRi!SWw0R*vay`Ldw@RcxZ zF@CV^0YL4kkH^vo-RmS&n^{-OiG1UmWG=lL-ZCxH4~(&(4gN9YSVeYX{MyvgihT;Z zEU4->Sz}9QQY%V@j^IM-raYvdcNbL)yq1s*l05J3UOtitFiY@pSLG)Df4NcUo}Gn@ zhIlT6Qo9`j!ev<(fEH6&_|WNB22SW*1KO_WhAF{`#`1x#PW~9xo5lVrTrElWMp*htwB>FC5WW78sCK-G= ztP1fCV1_^?3CwEZDAVrw{?+@@@cGdklSvh|Qk}QIgeMa}6i7AQ8ds(Vb3njx^SIhO zih&;N+3{rL=Qb6Zitu^7cffOjT5W zHHD}Xj)V~m{A}gVI^;v=)e>Y_p(1Ce?+~fj_%bMM8*`<%Y5$$uZ1$sV^Z81-i)cA# zQs+x}?3X+TWeCbFqT%sF+g7-e3%e$^mE$&GhJFbBVkpu1K>dUm@Sd_`>ef^Ps@6F6 zloDd_N3=rUwO}*gW+SSc?0E1?Ped@$J7rCt65obL;@s&!533sO$MwH)KD|GI1<%^7 zI2I7p=9)0ByP8@u*5UWL62Wa(GB8|uN*je`z%*FXQ!;3Uddn0 zAor_Dyp^K7@nG>c6D}U?`8_rvl8$!U=&8FE@3<$eKoi&yU$T#yhB}N#H(E#p6mMIh zx+JBi5dn`Op}xitj)jO@#qP-}c>HFO=>8q^7Vl>Eu7Pa->!$>cfsqSM-0G-{Eq8wZ zqRuIoiq}3hXd(lh3jam2ZxTFCZJ_!g>bgN)_vs7M=plo+uilLx03pIpTjU z#&r>+KFWYov`yFap!ybjLD^YxaCuJ&7l-{RO#uRy zV#0{Is5`XxUQG{i_YT_C&SjEBljbi@ag94n9VRU$#WQ ze=eagi~r;#XPE|m*QL%Im%XAyQyP<;u&=Lill{#)m;MYoxHRitevt+_>tS@^zTrWLu zkk3$}A`VlQVj$>j3c5m*B$Ikfr&|>3r z_oI=k9aNW0DA2VSl;Z_uV?$eUQJ)Z{A1_hke$z`9Q^3ClZ&ONCqf@Tjto6>+ex6i4 zS#l=&+SSaKIArvS?nm9Kwb|6a^_0k@Sf^{z^N*vvmmLaB-CD4}dZZga`_p~Nw`GQL z&P~A(1OUJ_B*;5vN1Ki##QBgajFq-_K1c4HwGXfhM@j?ImEXY;- z$yFn86;mA}si12@-j+|^B^tBznen^o`Y(%OIi@ʿNAxAwj0Jw*1G8dyGdR&4&| ze;w6!;HpXB<9G_yTW8{0y}<{TJP?x8$0(FbEO_g~-%7SC@QDi0FW7Dj(YF)oKdNxS zaZ$Iv#>q`*hR^0_TEkLJ;iBm#<+oKG#O%u?PFxWKwPg_lo!HPpzbXu>Q}Qd`59M_9 z$n@jo-m?jTX$o8GdVpjN)okTVO|ksf8Ge5;g4BkcZ?ED{Cqqx&Z+GG`Tz{sAm0rai z1c-63{Pj zlm~d8{qj0|h5C3|#gAPRs;ck{#qQFP=iR26Pd-mYkC)Pdb+;>6yrE9atVcbe59Hgb ziA|$Rxo|-dBQBl?;!^5_Yj>8Wwd=dBhZkVk)c2sI74N3dcH(Jq+8+5P9F1_A)dfk$ z8texFRXrYFbXmJ(a`8Ae9;k7zrhay|jWT=#Z*+d?!$AacKZ->@+mpPy^tBG_I92#N ziH*UySpvHZFRX=G!W3`;X<77uJJ4-??W{)X&edF_!%PIMV!SbJ2voDbI6U6E>Iz)y z$*GkVOxrw}8t0yb_8`;DJYar4c~#kcOn4ffiOKq~DD3e1v7|mR@-%=V*iE;B@w$R8 zNG}Wau{0rvX7XX&&^9$x?k2>j*SK0j6=iJwNw}eHl8VL9#;TjDqu*kp`)wQ7n!UJ~ z-1;C-d7pAQVNJ7+wxgtj6@B0qISM!+Duhl)u3!Spti1ns56%$!_W|*!2jA2)A+i83 zQ!3FAc06@RZH&Rz@;OB4Jn?eFe{UW-2dJsPW-OklIcB6;PlU9bMiVE<;$kkN_V{4iKTHj$4)C6ATS#BO__tW}x=&a- zugo&a(PM0QNfuF*XR2D|R$1n*6Op_EUD33rx%v7Pmx(#_p=uHh@5q24Cn!hghRomU z#YZ?KA~)C=>5l#+jLIgIQT2wbu-ASHyfo^}Kh zNfxL><cN($*)B3JVq=__e&I<0nZS>q;T_?PV9y_ zE`3L8zbMXVR&}UAfU1%3e(i$NSfNKc{@ioZli$w3ex0aICd8fNtB2fgUa?wpSBL@K z`Fjh4<3tb8*osF-J#U1bG!lJ$5x6oR0Q4P@pCe8{fjyi6gYG|5$C2NBQtIx(or~Cf zwkL+cmQjifr7dv9vGcn-pj;A-6{312|6UvjsN@0I8|4svQi(H*cCEzbTD>pelJp=? z?Z09D6{$_K&AU;Tay>6~q*H%!yRAZmFKdAT%zOpi1kfNsMUb)fINMSYCFJa2{X|G$ zj<}9MX5pHu(ub@KJAN|GwVJ~_Hak~muVg%22|=tMDoTLSgF2z>8bwD^3>-Z#(p;0J zCWmrq%oo&tt4YXj6q_?0UwblYflGTNAh&cRqO-rN$AG_dc!O1{L-y`wl8pa;otur0 z8PdvK+cDGvUu%iRvTRQFHp;B}p!8z2au zwrv6!2MU{qe+{wTMze)0r?gESa=UERI58Y=`;n9?tr9KPSR5=nnDxz5{?Y?NVRrCr^szBTMr-7T8n zofjM>RXsMGQ$}rX=_2C8gOsKiAyAX`mYx}S2XZ}}A-KvIAOS9X;E%F&ijDH~v)Ox* zn)z+uZ~L?8Y;+o~()WIhXO9+Yi0KaC;T;qhp`W`d>u z?SJl5xbQ?Ag^rXnB;#G_`ZMpyN>o^VO?HWk5i2Hm_esjeQXMCkqB^fG2_C+Za*<6B zCKic)KpFS-5u6QxieU`~r{}!o@lozZ2|&D)DB+uie0Aw9zmcx*9^kH_$53U!o^lQJ z#>0$3;Ag*I4<1{rAEoa@W~ulKk*hd^g;RIN(-5@fD883LE!}Iq6L(+yB_!R2{U8j% z^G-PwDk^!Ax*`3b`_Y6Y1_^kBz%Rw>{Pn@7DJZrT$O+xA%1_;;oBJd+ENg*qBUP?= z`{jsbiv1eZ8w83SC3C;I{-|;bGEpMtqFVo;kj7?;-8E#Q(0(i+lMCeR@wP>V=$b_O z-HM%=$Ap5a1yQD%ti+05OWD}_mPlZ!dOVi+TH3an$n+u!lq!e&%5Wa}8e(#fUIHr9xtg^hfMw$a|qW}St2;}nj znSe^Ny^Enh1}`4epJX8hDKc*c=hfoUqttbWNhbbM;I_gO%~yNAUmXaMT^d3s%GGX~ z3zWNJI095eUhPwKSoG<>pq@v9 zwin?8T&_A+m@K3TBqbOfNhxEYK>jC;$o0R1t}`I=HPIhUJZDG?HJt<{vPBmpqKQ`7 zUi(YO-hJs!UM#Ch0^_MD?x-;A$X2J-^b@q9*F6U)ZI ziz@&ZkO-<6by){7_BEQXg`)kYTe3r4M!FoWZ(tsiIVfoLwu!sF$qoI4z7T`>Q6N?& z3t3r-J@ajqN^Uw*{S=dbiP2SIf`(sMRiY^!@Pw2f@2mm+Upm()pFs;i#dTx%vl7 zdUnNrRxVdqWOOT(D%EF}OY&*j9`O*g*l$o$!`YNaG)v-|U(ZPORw3y}?b-iQK@6 ztgBJy>c^oNcXXepGlA~~uA^Hy0;a>{!$iI^^?&TA%;WvuB7Z59u98@wKAZ^SZv1!raE;th-D&K9RYET?MFPdwmvXBc5_^2tt0!q;goP3Ve2g zIac`0@_4Tx)%3T2XfJxu=prK~@|Xb~^*5pGOk5y@X)KdV!34Zr69Vq$SZQWaYB!;r zyE_(VC4X3WNhzkJE$Djb@u`u|ohbn^YjC_!$583llu!|~Qg@>znVv{hYS(rpZY(Eh zoBwEYFHMLIVemgR1)%Ofe9ELN@{!9LRLL_`B3 zU)fpfbj=4bJ#MqVsZ)RQ+EJYoWqVONUOMHPAt42bB~2S%*V=o@=7qPU$%%rmh4VRTi5_z|;jTp+iXh%g8t`eXh6?Vw@7GbY z0=q<$GyHwsTSCAHGx~W}{XB}cZv1i|U;COtukn*J&EgqQXr~RfRXDvTCthrE@o|(e z^5@kOL8>5JExfNI;6^>OW4A@j)1O5*mvt)W95^d4Id8=+C2BR!{IWyozoSMc+#c8m zpO`g~UpAO@NCHL_l}!lquTTqQ|L5UbX;b++0if<$BSY_S%$gIf{$76k?2Yi$UC&6c zL{W4)oh186a-FONnxijH)Y>OyyA{iHxz}Hi!>=?-WMH&l8r_O3)+K(?+k5^x{le`hVhMA6@TTj{**}p7QDzq`5Sf3#d&3X7_fx^FpdCZwL z5pTt>)X-%WZ`w!TO6tni>pYZ4%Xc0Jm?-q_aW;7zV^@L})p-}%oGIQr>t#%Y>-~v9 z5px>TB!cwQMFl5{)@{5s!U92Yp&w`M4XZS=x44x^xr!O5)F^U&9NCgjB@y+pp^EQB z8+tzxuNfL%p?rFeMsp-jCP|Xc3)3)|b@-uv001#BnedSkq5$4wEgKKfwGNpF1ogcH za$067Ww`?CBN&gl0u=3G7^N>HEP1d^=Ciu>Q`(l6s=<%-k#B%hLP^BTA4XGR!<6wP*m zylUH=dOn5|z;P{(C#6Y!o{}UHSgZm+S>?yw+`&|)sjMl^S!cf=+{hQz&L(Nw_|qsg zhZFQt5eK3|g@#21d(a>kCL%P_z<;Yc0?-pWMpoR7d|wmA7UvXr?N>z#${W;rf%4d1 zZ`inSof0Er4>7G)P+}6u)tF}r+V+xv7EQ)KJ9cq1A^GGjFhw7LfnEAQ&RI2zCZ92a zqDTi*6EbxPstSRY^_9j@Yd^RG&81J}`dkucqI-1n+GfJswiu>Bs)(@b2u=BCg|C2A z*1AA9$_M-7(BkB9Yp&4}jF|_p%}CpL;s5S4F5ubJ`Hg5`ONb2=;bNXXq|BEcLc0_{IK+_9y{ANic|D!o*JoB&W=k&BTn>o}Xi61>=; zKszyF+bgk#93O73)at{UEt$za+$}wAJUZzN8E8Yudfe3-F4VEjpb)>_==3K$9<$7J z=i9F^BNj|a**u*N5_PQNsk2EKi}WwTxtb%zlqXs29%+JrFdz&_l?x1Pyn_PWZ!e+c ztB?`k^E90S5t>lXmN(bTRy>qasa5?~3zAVHnMWQxVM?R;#KusHx*^qi=d+0z=J@E; z0|ZxJ4iDdznW5EPV~D(qg{G<*5#DV*Lf-Ch)(+ZV8RT!icI;riIJ5gA@blB##8&!z-w^mT= zqAdI{+M=gP8$R)usf>`y@qtDrqTS8ig=K*MJWqNdFo~Flr%q$Jx6%+R@%;{t4_zMJ z(acStA>%^3-&0+%p-@SoPmQ??WOFb&wta219&h5G3f#*`Dm9UoDOotaMIHdDy zWoUn5euJW0_nc%_vHVQ!mD(8Rt?I3@W8K0Rv9=EaDz(hbWhnHDa8VIx7v4KydLTjR zzp~g7&gDT?&L!j`7>jXpab@9iShkPw*oEmQZM3^_3;~wvWtrAgIB0N2U^H#vXg3B; zAYj$=Cm z3+e4<;({sRh+fR6gYzD4YAZB2H4y(IV5M^g!mw=fv{a}+Ipic=Xj3$|V`%E@Z<2A( za4hNDs&0;M9EnDu(x=ZlH;zEHZxX`?&ttyj&^g}{N;pt6tv`qiDq>FxEkmIXeTl#1 zt&aUVbR3}n$AbCk)W!*_P5o(C!`Vk51X-p@3yR;jyFK@!{;IGN92;x71zx0RdotrT z_i%rVcJjYn%4hn^BD(YOhVN;XcRtap(p{3;GX60pB~4);2oa|V;ad+iCvG6Qx<0if zyC0n+){|yh1ioqRJzm_%-m`J<)Q~f8MbrMwy%L?GMe;y=<-=XCsk_)giwv*!1X#Dw zSe6wK)P!3}Qg)JVsW{|_0r{en^eD6>&-pFyK^8t}3g83TqRjf+x+L3R7HXSGRB5#%b9QNel_CnC!v<%E z8r-TA!X!g1s1@+aJZe7FDs)8@&9NdLulOtMPe5{cCL;jA!5tR?dPTosy&iOo9GI0b zS!)PY1IB3%cD!5QcoTfYfVJ9P=XBnYO6}C`r_PtgsKbKEW2~yQnTz3!7)}~ZcmKS6 zWdFN=W|%9*Bf=Vn-w=H=w?60NJ$7LMaJnTy3^@`9G^#E7u)B_4v37zqpb z(e$e(T_C$w9%JC3W>KcY`ecaN1fe93<1X3jLr8a^o${@s{&T-;!_;-5t6YLXlOhc7 zV=L<&j7q^}vCzM%RSv@Jh$%0{&*PHBawQBG28=fvsBQ*WeQIPREdATAou*G&B797j zufUeeAM2{jH}ML+B{D?!^UmnR*}4UCjr~u})&5#r-bBU;+HbLZw63Q#N%Xa<=2ynH z*sh&TiZS2on8y~KmYT-D4qlF77cPYvgEJNCdzfUH7z%EPoz%v=yNb$f=lAvK)R)FS zKPWVNfNIUgvR!gd620He0fxWUx)(#n8W{Ix$A_Gb2>9CO>tm(b7laeT{lMj z!tz2&_=F~5m2q?0Ve`MuGE$S~pIO+oSavp(${`H%T-aM}3tw&U!Qs%>%;CaW8y3<8 z{H$zPz0Fz6vCv9(O&)d>!FNSpWCvmU{M>+z*^Uvsu~jzD20m*>DCJHRRfq|*({|y8 z*e)!vO+#nW_Sj0%zG5&zzi#xIXQZ1QdrJ@yjFssdXS)=NR|%9`MZ+ooA=wc{92&_% zTlxB3ec!G1q?h4Q)y{`RjnLI*W(%uo8zhjj?xbh*r)dsoGpYdVzIx}B@4Zy20YC{p z9CqMaE#gmSQab3ibAd&tvQ8b$PBQ<=tV8jTR=D9jX_4>ag0_n95+9xun;%HetUOQN z_g6DzG~>59Pw!wjEc}WWP z3D%0j=!$Q5jb?{BnddRatwa&%BsOh%v0C>hRNqn}n_%MSI@vy7tX(7f813F(-BXSr zdQ;e2XU;@t(acZXPx`Ac+V5$qJR3!<;MY#=G7){ky&)i|lw`EX(^OEKE9Rq{i z_h{}Sw%4(X=+o!DLtpoJ;9eV`q@zAmKb9~r<2(^uJ^Yt;t1AtH&mkpYpGkP0U#eGj z$dzi_>NGD63wD9d&P6`i6iDmqEMGf!0ws;HU|4M?z@)BNUT>t2+<{H)mn>^Qe&7T> zJwli?z9zOJ)&SFlPZ@!uXYr@Ce*^2L*1%N(u-8_&8;uXD=mEhQLEEV{ZP<@kzwb4f z8V4!<0)JCn9avpC>Fd2~I(*z{U)+4pZPqgLFc!{X^IkvK(FvPc1riU1{_-4D)FG?X zNs?0uWB+pWbYD2tis+2Dw~a!59K9zobx%=;FvYN>rkC&r;Jo1;DH0xY45dbOd}>e% zT{r>g!zX3o518pZRSD^@azv%RS3UbzI$r)#GtjAMWB^E=PKeDY1Y;7_gB$yy;u3-2 zrvclBQ2f7RYZ<_ufn`I}HWdC}8sup;O=9C0)s-t(m$7pZ+@$1zc=po9PH%zf0f?R^ zvly{~%cg`z{W|)%n`u9C`9*XN@|S>;0j=_2e&b45(#%f7W$qN6m99;-!-r`;`Z_ux z)D#dovUFd>+@GFb^pFkF6CqfkRkTnYPSup6Z(c|TsfkWnfdfxlnbw{NjWYeGRDF89AH@42Vr2*Ee0y?cb;w1`f|f?1bse*e!d z?hU#`ZPgSOtmk0b`4-hwa!&LftTMW)_-9?i!R;j}ZHnUw{ZY0Tc zRkz(e3>PdJ^{vLZoNIaRsbrpbFr!(+Mna5wcq6dJ*=LjhY2tJMKcXugX>cNISDb+z zP3D!>Egc$VA zT9K|Wo~E$Dl}d;!)NOc+1x~)ZO>>M8?$%l}9Z-Ln>5-;;p7{LK>|z&OXbY}GZf+)v z@%4lPWBx*ByP86z>JHoEqsO>Hu)rmmp<&s*O&m`E{Os|0C9mE~7?(9DpCLp2@rR8E zCUNJnonP|XEi8*C(5TYN20x^;$WnOeJ4t>ZQ3gYR6IH$)sG3Rzn{7Hw4T)x;;*1*l ze_FxI|JMr8Kw1IjntdfsLrrZ-V|`I`eML!QYXzuKp{lZ>x~8rQ)Uk{%a{Ud|>ebbO z5had8TLvDUt~50fgy|#Edpe36`$+#oku*SaOT$I&`)EvRnbQ zzZyd#QM*!cB<4^=b+x*7=OD+4gWhk19G6k9mg1;Mee`}_^yi?A@}!>&I%pw!c@?wQ zw;pp`Z&>6)Ep?w)L<_7zObPPV>p|;1gX--EMqvBwxJkrOX9XA~kRKb@m=-aR02gh^ zRFwi7z9|O3f7t{706ZZ2H~#DKS;KW|wIi`H2V-ZeF_B|QXCD52#N{QBDAMDiX~tAf z^&pxMEF+wp(>C$^Fd`R;9K;pzh5BT8{@|JFzS)hk7tB-}*R4A!q>FnLsVI(^@nU}{ z_`cuq{urmr}pswswd$okw0%A`}7Do{Vz=S(Z>`10@g!p(Mkc69&}5i!2N}=W^A1IL>2|8_kB5$BZaE z__X!01$%$5X1rCmEq->|ES5H_YlnTZ2(Qo8eLr}0gCxI**S;8_d4Kl>GQ+l0PnhOZ z3Y3?YOcOEjAo(A-wDYWbji&QT*X=Qyh@O9_5THCe3IxQsrw&>@=I;@u;ACL)Qc}Yc zi9_NZC==%P2-2!gi9!20!pxqZ%irnds%2Iquig^aT$wGR`X2i5@GpPm>Rw8Uh9J`B zfDryC#DuDAIGD$=4#5EFg}5l{y;#csKI1jjk4D`9YOl83VpXRE!jk<26jfs#abep~ zCQ>GCKQCRG2KlJo80m`-ds5(`K3$uPd&hjim%ip?emy}%QJogxDCRCHe5`43ab>H$ zX>*eLDT15?xXa3=7vV1-O?BujT&;rXiNbBEdfndHrNn<}qHIiMLIQwSja$1=OJwdD zK;z`jA=RkB{2(D!9y$xKsV$X#;hwFPpd_$=e`h*RSg?lx$_iCh^o1Yb|V z_zQdVt-mxI5UV3v5R($qt?2ri`u8#Dz3}g!wAdsy(R0#bu$NZgmZV_BuU`UG=n07` zoa@l0>?xM<8W7Pfao>th9KsFA&Ng0()14)+EJX&BvW2$XMkHxll=-q1)o^j9Jcr{i zkWMQKbiE8?S28u#Js%FzOU}f>eC*+}aqoSMC)=WY_2rbfzTL1Dbq13;8p6&1 zyH;zrsNkwko07GpM4yx3E}=tVl`eY_pXvMk_j!&sK}lku90k9AyUl6&)CvfVYnvnN z0CJi)yGUonv=rUVYGLxsT~Xd zeRg(JqZc5ZybqMO=+zlb{2jgV(8i9zOkU2#WY!1fqNR(P5CG*P=F9#{X5^E1tCcsf z4pcg6N3f;zoTF=8G;wltg%8=aBo{cbd$e`E8c;7pmy69uebB?nmy#wqLRsT<(LGNMSpl1)EgSReUyGiH zqcN~tf~h`IFZ~BnVhAA%MsIHOk>kNUi)@CH)p^>4)q=N{D%-_tX2IpnU+-52xlcHR zE!FPe#9w#Z4RgAl?-U0YGDOxhR<*)uT+?nJ_aq&;c8wd51~b|e!%0gVRU0!_F@PpQ zfr7{vULgGk3Gw=$rP3BJ^10Ji1y|2*w@RSo>w_5H$n=_H5~`b>TV@};9)UQ064Vwh zXH&WCA~a}g6+$E|H5$=fuuF+KibrFO5X%1tB?~peYvYm0Mvv(dx^n92t178gjdO2j z^zZ<6QsqmX22UwrrCimR^U0+GVY}0#A81(L(ln-RQE?DF(d|>gkf@W!47g!2pYM7&$minUD<1t|?XuGaRO)xj)6Ud1 z3e6C=JQ-NYf9Bdb8B$PbJ6g!6yR^f=h6>XK>4s)&$>>OZ!5yz;O?OhmdN$jHxc|up zB35Fh4i{d18}8n+3WgOU1k6>&iM6PRXGH8K=TaFnkwNrr_=32z+O8o&z*<k2NE*$dL#%*2`l9#yWjoNJtP}CPT5P+-J-&(TnZW_XnD( z_nhx~oMBH-v6ZDu;#c);k-rHBCI)7h&*g&rQ!eer%FJlore|sCfvT5oZgSV93%WB` ztA?%VV2$+!yQB1c&mSA&Ss7_ny?nhK)qvJw90v$@-yKd!OEnCf>?RUs2-w4vscc+L z8|s8~O0^BkWP-V8eA1({1e5@Xq3R?rA=VOw8eSMbX-2$&vnj-{D#crRx<99q!_Y>- z%Canr2EB{U+#YS(5ulRTcKpLE+{(P7`)Z= z@-Y`Hm$jJ)_CUecoK?-#VjMtdc3aFf7LV#*?wz|5+TmNLtX8s#^p%8!m;?X3_wlGZ zWYcKxRs^?0j>RN!${3lLZiNz+_o!}T+$`qx=Sn;z#7!HB0uAe)@XfoFEcvIUXBME) zK^9t|@LoSCptIJwNPnJ4YQ2a*);PG&^s3KpDyKdFR&r=BsOG#^H7S+VwWQ3Y+~kI7 z7#%L!jsD@ZMbkE(9W~s1q^hGg$ULEyDv`gZzFp-Q@Q*Ue=r;_$2`?powKq=ci&=8I|x(v z@}?ltPcxVH3~8jNvOP=}**s%c5clArk1ignBC`NybB+6%Kk`%82eQhZ_dtt=K$p|3 z+skf~q`d!5tKu#=xsA_ZQy%Z)#_)oc$6ifC4&*_Hc&a?j_6cD80aGiMDy-j8ZKjq@ z)7u|g?jRNIlV}M`HcBk)Yb7W&)DJ6snyDJEXN_h0U(i8#ER~S4EctN&3y{%%SyCC^ z4IJ!_8zn$r+d8}l-luQ+oQ-@8GskvoEsGaJij|-u=(dfEd5Q;@v8#1+Q_!Y`M`dqv zhUDnh=b@BZ1!``i?h0|3I?GRQX26PgF?B z;z`e{M7W^Pb%Y8$dvpQmzebfQHvG^j^~qKZl@Xm=Ox*-A4i zLV)L=`_XL=zmyefv5EZsrs$??mEpu%O;(QxsoM;5mWU$T;usc`YDfeQVwHksM+cDLsMpTs!I@{42uO)L zPxv;VWv+Fk;k0`p7hJ|vEO>iEW_QWa_)+8{-aZl8=I%%aGby;vv^Bv;6og0~oK-i* z*mXJWNCZg}aZP&LiDM~hW)3aaV2<@0qK5CgRnu{S?vI6XW-HqXsBPeK8;Wy;n5A4R z+d_&JkWfOk-(&wN)>J)?fk{1avxNE<9b46D0g1A;*)5g*Ke#{zS6F8r4N5JljWXY%r&*=i?6*x$YwG9O6C z*tZH;#JXsCg_3oOw~pF1PGtTTlVUo+;J)M&XkxxzSXnK?hF$M0{pdC!1pwn{q3V(qoGJUgD33NuBWnK9Lh$_;!~yKOEk%EK<#ndGey>tMc0wv7)IxhV`e}4 zW`d`d9ljTcb1pA0Huk`>6>|8M*i{Yt!YO>(M=aDl?B-lN`w|v#m29s~sV(cT-vGqpB~k?=mBI2GSdC#SpX#)DTHHF=ZCy-4EYvBO{YxvBUbh;}f( ztfpOa24W04H)5bx_RZiZYW#hjHr9lHy8kvEM?h*MDqbj?4apX^_W(t%s^_lHBID{4 z%~i@n&tGJV_C=LRP+=rxkzvfL1T9o_x$$e+9Gz@3$UptZWBwOsI1kFUMy0idurNDE zY8)&&^Gq5ZDt#X>*&+;I5nna4v;PpJod#oT0mijVNEfso!R_@<; zl1)G`_QiRmJ@vzM$$I{vv~7VS=653%Lvw%P2`I`4n-grJ`vj}sk67517ewD1uK4bV zAQ){T{ZX^3cv`%(X?w?8N(Ei~^Hn~jlnfUi&xv2HaRIY)+T{d?kok~~kS<5J8vt4s z2jczshp5?$tmz*k2^$7CsHCVL+y`{hA3k(Ms_CGoiZRx2u}X*CKJ}y=&RO(0vqRZl z$9n632+G}y&z!h~yf&tN>~%zobgvB};b1?@28JVsPS@mq&36#N%O#1X%upJ@{wsfM zfUj5mo{847`1M=3WZ=_UnXX~muXP_^U<~@f68nKtpVIaUqIG(-ddB|?1|9k0xzAMz zh+xY#rA@f?+F=84yhv06o@}g5Q?)U zN}hiR0OW7uwT=Lo&6xZ+5^1Z_7v;DO!8#pNl6Nnv^Pnn{tVlR-MvVklH9@1i>v@e5 zzuIg2>UwohQ{|DKF9sousR*|r*sXGwa6A?H#m^+s>DH+Q-a6G9gL0TaHU0L+W{R{Y zYU)0+i3U^|Nt{Ab{cmeXjqEf0@vn0(Rr`P1hSns|SkCYV5jjg=gx)f8GKE@OEl%~0 z$|!~3n$MInSsx@8DZ6{K(ZPtJb$6J2zK#n@CK{o$Phz6Iqz7q1#R(I)iMm+W%=dz4 zb8y|V0PnwEni0Ltg9XE1lI${$v0R|rXCI-SyJWU7TxHEmG>4ge@+}p%m7^9AkF0-; zIKF!=8bjj;fWE!h1n(xhNfQ8S$V*Bg;jaBWe48a%7qL5dzV$*%E?Lr6WxZu-hLe-^ zkI~Ixw^}+?{d!1qT2sC4krEdZQ>Wa23M}ea7&zGvoK*;r90o4l<+CLb_bh3pYDb9s z6f?fv{hug2lL`pzPvDMFRRPH$gDiinvg#H)w3Hip*^-2dGO0X9K_o)2)LL5O!3BMu zFjJ?Y)1FlYK3nwyLy3pe$Z+?=n>9_n?4ZUD08M4ubdsg0EAVrE_8!S6LDv}Do4AYa zG=zOIw`_GY&9OwhUF#_ExdgB4^8p2QOj(H$1>|+eItky~`yoiv0S5deeoeqbep2Pz%Cy<4IK2LUiWYiPLE-7pCkRrpyq%I{R28km?ER{8KC< zE<%Oa>Dw0?geyqn(#=pRHiC19n^KIa?qn9;P8HsZ9UX+=V*=>&(g8-DVzU{hQj&x< z=kuoW^GjCDYk9leDt`Ry++%-BZ}bG8u`_wDD4mu$njRsuv)Grb(wYs8nh_t1g;3m% zK({BdD2U$`m{WkUOFMlE4$EUjE#pIG{L1}+$lny9M=>jE#ErbP)h5%c!)((<6EWeX zLs6FvxI*vFnKl<=mY%K>AzW=cOgIRH^07aN4Z_A`JCv1;9&#khnEY~BZR0!k^tyYm6BM5*8cu|_#gA@uce2KRJ(`f z$?5ev_C}%YQFpha3Vl@l@aK^`{wsd=BN~?-r<4Z7^$hyzIu(Bs4=9=q{p)CEtm23E z&vvR<&OUw1>N6ALnfv6>YcSqv_z&#zsENl4RH%++Sq9J4F+Xl!5sb4}!I{=e6*wmn zWBTM{D2k1mHD&I37*YV;#pGHA)!F9chwM4cO0)rcMmel;9?HT%w^PF=pgtaxf4=B^g?$?35c6D2bsg3TtEfGGhlfAP$VvrFQ3 zr9`=!uvy9zV4rgFKrps7SWRD8UyHD<_d>9GIIQw70t-P2N~%W6HP62VyU0>W(LP)6@bh~9Ws7fBv5G>T){zyJ{_yI% zTym&lw>%&I+mlV3fJ~h&e-sM67?WGt*Ay`DGG8I93<0J8s%>yC6bexTOqx-`#~?!*%}bs?}PX2s*^JccSri?TEwdWYMkSuF?mUH!|akgXHc5%jt7-N%bA< z9Pd|6kQC+oKqv91f0$KrIB~6V+st(F1Bq(L{AbitCFa{=;4(28IhK3@ zj-C_}n@q(5Ir!t$@9s*u=~_q^9CixU(e{}Xu^vDo9{e?l6uy&L7!;a7ZB(;2d{ zwY1HxD+*lwM_r$gSCa|M9u=f`yV@NHr6F&$lUj;84ImqkZRhI=-iz%HLh#Z6^zH2? zn9qz=zv#zU(we0GpDRM3+2-CAQ8fw^kB<0l(e~Ul9x=AM9_6>M zy^UB=9TwcRe{u3ze!zb1YV%!f-U-HT_&yBuxTMPuPm9}|N>sCJnoo=m6MAvg@gFHI zkzM{%jx6n}ZErvsD6q%>J91$61)vz-bS`m}C$a>xb(p0S7#Sn_fUH6ZHsqfvyCxJP zTn%yil=L@=BN~2d?Fj)q0ML)uh#Kt3%tZH9J|#w-f3-u1(e4*(d?9>B@z2Are zr|a=d9Mzc)bGlVpDRf_TUUZaRisP^69OV;L9vNP@7IvFS!n$F#q5?f}oHoT87j+yc z)6he8mT~5uNO6=7?OLmYI#=vqb&tzk_llFcnQef8ITW}V%*7`kfl59`d4WHN+&8c8 z>V~)xf1B`g0^8a)P+7k?9FZ;Ps72jz#ZVkYAS>RBZ3%{i<{~3=@%0A1FCn5WvEH-WHA9*OzQS$HkuAYx( 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%0DK)1XI_Sc0+_<+L=m!gUmub- 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

KO`XIMKue~GAbL0CBi@2 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 QP5=M^07*qoM6N<$g54>Re*gdg literal 0 HcmV?d00001 From 00b6ef249e8ee0d1a06056f2534a17f6a64fdb55 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 13 Oct 2022 16:26:24 +0200 Subject: [PATCH 107/111] artillery rocket behavior --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../projectile/EntityArtilleryRocket.java | 109 +++++++++++++++++- .../IRocketSteeringBehavior.java | 9 ++ .../IRocketTargetingBehavior.java | 11 ++ .../RocketSteeringBallisticArc.java | 11 ++ .../RocketTargetingPredictive.java | 51 ++++++++ .../rocketbehavior/RocketTargetingSimple.java | 17 +++ .../com/hbm/items/weapon/ItemAmmoHIMARS.java | 45 ++++++-- 8 files changed, 240 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java create mode 100644 src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketTargetingBehavior.java create mode 100644 src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java create mode 100644 src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java create mode 100644 src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingSimple.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index d9cdcaed4..00ebc6cc9 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -2901,7 +2901,7 @@ public class ModBlocks { GameRegistry.registerBlock(turret_fritz, turret_fritz.getUnlocalizedName()); GameRegistry.registerBlock(turret_brandon, turret_brandon.getUnlocalizedName()); GameRegistry.registerBlock(turret_arty, turret_arty.getUnlocalizedName()); - //GameRegistry.registerBlock(turret_himars, turret_himars.getUnlocalizedName()); + GameRegistry.registerBlock(turret_himars, turret_himars.getUnlocalizedName()); //Wall-mounted Explosives GameRegistry.registerBlock(charge_dynamite, ItemBlockBase.class, charge_dynamite.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java index afcb64f90..7b69f6562 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java @@ -1,10 +1,21 @@ package com.hbm.entity.projectile; +import java.util.ArrayList; +import java.util.List; + import com.hbm.entity.logic.IChunkLoader; +import com.hbm.entity.projectile.rocketbehavior.IRocketSteeringBehavior; +import com.hbm.entity.projectile.rocketbehavior.IRocketTargetingBehavior; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; import com.hbm.main.MainRegistry; import api.hbm.entity.IRadarDetectable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraftforge.common.ForgeChunkManager; @@ -15,6 +26,13 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu private Ticket loaderTicket; + //TODO: find satisfying solution for when an entity is unloaded and reloaded, possibly a custom entity lookup using persistent UUIDs + private Entity targetEntity = null; + private Vec3 lastTargetPos; + + private IRocketTargetingBehavior targeting; + private IRocketSteeringBehavior steering; + public EntityArtilleryRocket(World world) { super(world); this.ignoreFrustumCheck = true; @@ -25,15 +43,61 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu init(ForgeChunkManager.requestTicket(MainRegistry.instance, worldObj, Type.ENTITY)); this.dataWatcher.addObject(10, new Integer(0)); } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double distance) { + return true; + } + + public EntityArtilleryRocket setType(int type) { + this.dataWatcher.updateObject(10, type); + return this; + } + + public HIMARSRocket getType() { + try { + return ItemAmmoHIMARS.itemTypes[this.dataWatcher.getWatchableObjectInt(10)]; + } catch(Exception ex) { + return ItemAmmoHIMARS.itemTypes[0]; + } + } + + public EntityArtilleryRocket setTarget(Entity target) { + this.targetEntity = target; + setTarget(target.posX, target.posY - target.yOffset + target.height / 2D, target.posZ); + return this; + } + + public EntityArtilleryRocket setTarget(double x, double y, double z) { + this.lastTargetPos = Vec3.createVectorHelper(x, y, z); + return this; + } + + public Vec3 getLastTarget() { + return this.lastTargetPos; + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if(!worldObj.isRemote) { + + if(this.targetEntity != null) this.targeting.recalculateTargetPosition(this, this.targetEntity); + this.steering.adjustCourse(this); + + loadNeighboringChunks((int)Math.floor(posX / 16D), (int)Math.floor(posZ / 16D)); + this.getType().onUpdate(this); + } + } @Override protected void onImpact(MovingObjectPosition mop) { - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.ARTILLERY; + if(!worldObj.isRemote) { + this.getType().onImpact(this, mop); + } } @Override @@ -47,4 +111,39 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu ForgeChunkManager.forceChunk(loaderTicket, new ChunkCoordIntPair(chunkCoordX, chunkCoordZ)); } } + + List loadedChunks = new ArrayList(); + + public void loadNeighboringChunks(int newChunkX, int newChunkZ) { + if(!worldObj.isRemote && loaderTicket != null) { + + clearChunkLoader(); + + loadedChunks.clear(); + loadedChunks.add(new ChunkCoordIntPair(newChunkX, newChunkZ)); + loadedChunks.add(new ChunkCoordIntPair(newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D), newChunkZ + (int) Math.ceil((this.posZ + this.motionZ) / 16D))); + + for(ChunkCoordIntPair chunk : loadedChunks) { + ForgeChunkManager.forceChunk(loaderTicket, chunk); + } + } + } + + public void killAndClear() { + this.setDead(); + this.clearChunkLoader(); + } + + public void clearChunkLoader() { + if(!worldObj.isRemote && loaderTicket != null) { + for(ChunkCoordIntPair chunk : loadedChunks) { + ForgeChunkManager.unforceChunk(loaderTicket, chunk); + } + } + } + + @Override + public RadarTargetType getTargetType() { + return RadarTargetType.ARTILLERY; + } } diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java new file mode 100644 index 000000000..eb9ef1141 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java @@ -0,0 +1,9 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +public interface IRocketSteeringBehavior { + + /** Modifies the motion to steer towards the set target. */ + public void adjustCourse(EntityArtilleryRocket rocket); +} diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketTargetingBehavior.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketTargetingBehavior.java new file mode 100644 index 000000000..43a46df7a --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketTargetingBehavior.java @@ -0,0 +1,11 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +import net.minecraft.entity.Entity; + +public interface IRocketTargetingBehavior { + + /** Recalculates the position that should be steered towards. */ + public void recalculateTargetPosition(EntityArtilleryRocket rocket, Entity target); +} diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java new file mode 100644 index 000000000..c6b494fb2 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java @@ -0,0 +1,11 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +public class RocketSteeringBallisticArc implements IRocketSteeringBehavior { + + @Override + public void adjustCourse(EntityArtilleryRocket rocket) { + //TBI + } +} diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java new file mode 100644 index 000000000..76a6131b1 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java @@ -0,0 +1,51 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +import net.minecraft.entity.Entity; + +/** + * Basic implementation of predictive targeting. + * My current best guess for "smart" targeting + * Keeps a buffer of the last second's velocity values and generates a predicted target based on the average speed. + * @author hbm + */ +public class RocketTargetingPredictive implements IRocketTargetingBehavior { + + /* + * unlikely to work for things that move extremely erratically and quickly, + * but there's barely any cases where that would apply. + * a single second of prediction is good enough at long distances where there's + * still room for error, like player vehicles or ICBMs. + */ + private double[][] targetMotion = new double[20][3]; + + @Override + public void recalculateTargetPosition(EntityArtilleryRocket rocket, Entity target) { + + /* initialize with the values we already know */ + double motionX = target.motionX; + double motionY = target.motionY; + double motionZ = target.motionZ; + + /* shift the buffer and add the older values */ + for(int i = 1; i < 20; i++) { + targetMotion[i - 1] = targetMotion[i]; + motionX += targetMotion[i][0]; + motionY += targetMotion[i][1]; + motionZ += targetMotion[i][2]; + } + + /* push the new values to the buffer for future use */ + targetMotion[19][0] = target.motionX; + targetMotion[19][1] = target.motionY; + targetMotion[19][2] = target.motionZ; + + /* generate averages and predict a new position */ + double predX = target.posX + (motionX / 20D); + double predY = target.posY - target.yOffset + target.height * 0.5D + (motionY / 20D); + double predZ = target.posZ + (motionZ / 20D); + + rocket.setTarget(predX, predY, predZ); + } +} diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingSimple.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingSimple.java new file mode 100644 index 000000000..6d180fd6e --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingSimple.java @@ -0,0 +1,17 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +import net.minecraft.entity.Entity; + +/** + * "Stupid targeting for rockets, they move straight towards the target's current position" + * @author hbm + */ +public class RocketTargetingSimple implements IRocketTargetingBehavior { + + @Override + public void recalculateTargetPosition(EntityArtilleryRocket rocket, Entity target) { + rocket.setTarget(target.posX, target.posY - target.yOffset + target.height * 0.5D, target.posZ); + } +} diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java index 5ee9b7e0c..117bf15f6 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -2,16 +2,24 @@ package com.hbm.items.weapon; import java.util.List; +import com.hbm.entity.projectile.EntityArtilleryRocket; +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard; +import com.hbm.explosion.vanillant.standard.BlockProcessorStandard; +import com.hbm.explosion.vanillant.standard.EntityProcessorStandard; +import com.hbm.explosion.vanillant.standard.ExplosionEffectStandard; +import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; public class ItemAmmoHIMARS extends Item { @@ -36,21 +44,40 @@ public class ItemAmmoHIMARS extends Item { public abstract class HIMARSRocket { - String name; + ResourceLocation texture; + int amount; + int modelType; /* 0 = sixfold/standard ; 1 = single */ public HIMARSRocket() { } - public HIMARSRocket(String name) { - this.name = name; + public HIMARSRocket(String name, int type, int amount) { + this.texture = new ResourceLocation(RefStrings.MODID + ":textures/models/projectiles/" + name); + this.amount = amount; + this.modelType = type; } - public abstract void onImpact(Entity rocket, MovingObjectPosition mop); - public void onUpdate(Entity rocket) { } + public abstract void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop); + public void onUpdate(EntityArtilleryRocket rocket) { } + } + + public static void standardExplosion(EntityArtilleryRocket rocket, MovingObjectPosition mop, float size, float rangeMod, boolean breaksBlocks) { + rocket.worldObj.playSoundEffect(rocket.posX, rocket.posY, rocket.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + rocket.worldObj.rand.nextFloat() * 0.2F); + Vec3 vec = Vec3.createVectorHelper(rocket.motionX, rocket.motionY, rocket.motionZ).normalize(); + ExplosionVNT xnt = new ExplosionVNT(rocket.worldObj, mop.hitVec.xCoord - vec.xCoord, mop.hitVec.yCoord - vec.yCoord, mop.hitVec.zCoord - vec.zCoord, size); + if(breaksBlocks) { + xnt.setBlockAllocator(new BlockAllocatorStandard(48)); + xnt.setBlockProcessor(new BlockProcessorStandard().setNoDrop()); + } + xnt.setEntityProcessor(new EntityProcessorStandard().withRangeMod(rangeMod)); + xnt.setPlayerProcessor(new PlayerProcessorStandard()); + xnt.setSFX(new ExplosionEffectStandard()); + xnt.explode(); + rocket.killAndClear(); } private void init() { - /* STANDARD SHELLS */ - this.itemTypes[SMALL] = new HIMARSRocket("ammo_himars") { public void onImpact(Entity rocket, MovingObjectPosition mop) { }}; - this.itemTypes[LARGE] = new HIMARSRocket("ammo_himars_large") { public void onImpact(Entity rocket, MovingObjectPosition mop) { }}; + /* STANDARD ROCKETS */ + this.itemTypes[SMALL] = new HIMARSRocket("himars_standard", 0, 6) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 25F, 3F, true); }}; + this.itemTypes[LARGE] = new HIMARSRocket("himars_single", 1, 1) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 50F, 5F, true); }}; } } From 0c5b2bcf5758b7410d5e934c61f9d0f57c671192 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 13 Oct 2022 22:55:19 +0200 Subject: [PATCH 108/111] some HIMARS rendering stuff, cargo shell impact fix --- .../java/com/hbm/entity/EntityMappings.java | 1 + .../entity/projectile/EntityThrowableNT.java | 3 ++ .../com/hbm/items/weapon/ItemAmmoHIMARS.java | 10 ++--- src/main/java/com/hbm/main/ClientProxy.java | 1 + .../projectile/RenderArtilleryRocket.java | 39 ++++++++++++++++++ .../hbm/render/item/ItemRenderLibrary.java | 16 +++++++ .../render/tileentity/RenderTurretHIMARS.java | 7 ++-- .../hbm/textures/models/turrets/himars.png | Bin 3158 -> 4074 bytes 8 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index aa9e742e4..94e046a6c 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -203,6 +203,7 @@ public class EntityMappings { addEntity(EntityMinecartSemtex.class, "entity_ntm_cart_semtex", 250, false); addEntity(EntityNukeTorex.class, "entity_effect_torex", 250, false); addEntity(EntityArtilleryShell.class, "entity_artillery_shell", 1000); + addEntity(EntityArtilleryRocket.class, "entity_himars", 1000); addEntity(EntitySiegeTunneler.class, "entity_meme_tunneler", 1000); addEntity(EntitySPV.class, "entity_self_propelled_vehicle_mark_1", 1000); addEntity(EntityCog.class, "entity_stray_cog", 1000); diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java index f14d2be21..608f999d5 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -259,6 +259,9 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { this.stuckBlockZ = z; this.stuckBlock = worldObj.getBlock(x, y, z); this.inGround = true; + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; } public double getGravityVelocity() { diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java index 117bf15f6..4ef729c71 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -44,14 +44,12 @@ public class ItemAmmoHIMARS extends Item { public abstract class HIMARSRocket { - ResourceLocation texture; - int amount; - int modelType; /* 0 = sixfold/standard ; 1 = single */ - - public HIMARSRocket() { } + public final ResourceLocation texture; + public final int amount; + public final int modelType; /* 0 = sixfold/standard ; 1 = single */ public HIMARSRocket(String name, int type, int amount) { - this.texture = new ResourceLocation(RefStrings.MODID + ":textures/models/projectiles/" + name); + this.texture = new ResourceLocation(RefStrings.MODID + ":textures/models/projectiles/" + name + ".png"); this.amount = amount; this.modelType = type; } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 598a47103..3bd5870e2 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -561,6 +561,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityRBMKDebris.class, new RenderRBMKDebris()); RenderingRegistry.registerEntityRenderingHandler(EntityZirnoxDebris.class, new RenderZirnoxDebris()); RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryShell.class, new RenderArtilleryShell()); + RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryRocket.class, new RenderArtilleryRocket()); RenderingRegistry.registerEntityRenderingHandler(EntityCog.class, new RenderCog()); RenderingRegistry.registerEntityRenderingHandler(EntitySawblade.class, new RenderSawblade()); RenderingRegistry.registerEntityRenderingHandler(EntityChemical.class, new RenderChemical()); diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java b/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java new file mode 100644 index 000000000..229a71e46 --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java @@ -0,0 +1,39 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderArtilleryRocket extends Render { + + @Override + public void doRender(Entity shell, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + GL11.glRotatef(shell.prevRotationYaw + (shell.rotationYaw - shell.prevRotationYaw) * f1 - 90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(shell.prevRotationPitch + (shell.rotationPitch - shell.prevRotationPitch) * f1 - 90, 0.0F, 0.0F, 1.0F); + + this.bindEntityTexture(shell); + + boolean fog = GL11.glIsEnabled(GL11.GL_FOG); + + if(fog) GL11.glDisable(GL11.GL_FOG); + GL11.glShadeModel(GL11.GL_SMOOTH); + ResourceManager.turret_himars.renderPart("RocketStandard"); + GL11.glShadeModel(GL11.GL_FLAT); + if(fog) GL11.glEnable(GL11.GL_FOG); + + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return ItemAmmoHIMARS.itemTypes[0].texture; + } +} diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 2d6325b0c..15378e952 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -7,6 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; import com.hbm.items.ModItems; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; import com.hbm.main.ResourceManager; import com.hbm.render.tileentity.RenderBobble; import com.hbm.render.tileentity.RenderDemonLamp; @@ -1356,6 +1358,20 @@ public class ItemRenderLibrary { ResourceManager.sawmill.renderPart("Blade"); }}); + renderers.put(ModItems.ammo_himars, new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, 2.5, 0); + GL11.glScaled(4, 4, 4); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glRotated(-45, 0, 1, 0); + GL11.glRotated(90, 1, 0, 0); + HIMARSRocket type = ItemAmmoHIMARS.itemTypes[item.getItemDamage()]; + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(type.texture); ResourceManager.turret_himars.renderPart(type.modelType == 0 ? "RocketStandard" : "RocketSingle"); + GL11.glShadeModel(GL11.GL_FLAT); + }}); + //hi there! it seems you are trying to register a new item renderer, most likely for a tile entity. //please refer to the comment at the start of the file on how to do this without adding to this gigantic pile of feces. } diff --git a/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java b/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java index 0e4de4cd2..e5215764c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java +++ b/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java @@ -38,16 +38,15 @@ public class RenderTurretHIMARS extends TileEntitySpecialRenderer implements IIt ResourceManager.turret_himars.renderPart("Carriage"); GL11.glTranslated(0, 2.25, 2); - GL11.glRotated(pitch + 15, 1, 0, 0); + GL11.glRotated(pitch, 1, 0, 0); GL11.glTranslated(0, -2.25, -2); ResourceManager.turret_himars.renderPart("Launcher"); - //GL11.glTranslated(0, 0, -5 + (System.currentTimeMillis() / 1000D) % 5D); ResourceManager.turret_himars.renderPart("Crane"); bindTexture(ResourceManager.himars_standard_tex); ResourceManager.turret_himars.renderPart("TubeStandard"); - ResourceManager.turret_himars.renderPart("CapStandard1"); + /*ResourceManager.turret_himars.renderPart("CapStandard1"); ResourceManager.turret_himars.renderPart("CapStandard2"); - ResourceManager.turret_himars.renderPart("CapStandard4"); + ResourceManager.turret_himars.renderPart("CapStandard4");*/ GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); diff --git a/src/main/resources/assets/hbm/textures/models/turrets/himars.png b/src/main/resources/assets/hbm/textures/models/turrets/himars.png index 1d468f35540a38e9a393e5ff2ff55587f5993adc..55a0416c3d574d005ece7c23bee3d71f58eb1dfa 100644 GIT binary patch literal 4074 zcmXw+c|276|Hlv6vdhlcrb2eIZ&^lCwz-HfNXkxwu}e~jaHX_d9=_^Ld=}UO(scd4A4$ZfkAM!79QE004)@4ai>rK<7gn2e2^F z&gSQ2BWM?fP!kJ#7TOWZ;*|mbT%{HeWBbSgQejUTXhe8$DUV1j%7cB>H2@WqC$5|V zty!QVF%|{*^FW3RHxiU5n1-H-5`-!~GToAdr;)sLgr_~K-9Rh@tei?+?_D1_Jq@qA zRxP&GQ=d;LA~tT+ZfvhHCkL5N!8DNd-bGPI^&32NDjrztj7jOCB{Vg%!cPGh)~;d( z9{Vn0*!;yJ?kzd!UjQ_P--^?!eH{C(r0-h-FB3|w#UK%HVAy#LFI*nDLe#ZttVZ?i z2&QO5An?C-@)6R}4VM>IR!+ludcgsrHZ$MH@(M%oo40-+0v;_X_c~MM#5!_qUUNMV zL}hY?iB8Q3HaM0%NoPL_>6Am@7Cjd~d89VQ#g@$1U@#ARo>Y~jo&x}d%4`P^*N*;p z+zD}pqLIk}0EF^vdMn8OXY;q7$Gh!^WeZxEqYe4GI_|BtbRr#Kn{Ry`WYdf3l^T|a zr-HVH0i2%hW(lISi*xQk7X~~w)Rn^Z9?$WDql;BTnH16M$q|cP>+WaAnGnc+<{3z1 z!?D2|S-MT_+QHz}k}!Ma#kt~izz^b6BVO2jEEl7(_{n~RXnZl|RE>8#*bu#>o&9Fh z$!aF9+*;uA_X*(y>FD@-wtP$bzjN}OMzuKKen7md+QdL**xsx7D&VBA;%QF^RLFI9 z0Qc+yGb~~!0lYfqn4!3un|S7i%ziWR`w<<`Uv-ry+36Njc$*cHLT(S6K6ei0e4S|b4nOSSgwHe84yDFY-P3h;lram2U?Y#*< zPE5DcmJtAwj4m=S+!kis6$N@1rO zdNf2aL8)sz&}Drwf_9r`$Loay0FNu8oFekmntibVVEOXA`a$$81DOs`NjH7UAE1`Y z1w7_(wF8UASZxvPI!UKi2lc5^yAj&Yjg+ILLAV081&g$akl)ewG%=;6&NlbX8H z8h!V9YI5un|h`@N6C&qk9-K%fH+V8JlGW4U8nW4UeSC( zA*j;K+8D6_hgK<|dwqY^958$j2~Gg)R-~ zFp};gaGAwqk`S+tsH+Ez;!QwaK*XE|oXg;!P37mzztPARuzY%YFn)G{XQHo< z4(95L>+9=7YDP5*B6~VIYVIO2{@oO(>yQYuRmD)=-1@1#>c>MpeSJ&VOeL92 zE-bc1h=t!t1?_!)tA$r#CuZ9i`i2TU(~mi@B+48vE-ns^=j7z16aMMI(4d7Jx?Owp zs+Unz(1%wEr%9P%7;}$;3`uvP!CLM0Cz=r*>E7c->Eim4B`2oVNR_MePf2Klj&q;5s|+oY1W;M7ogvDNpR7wuEp*cn9FGkSUqSoaqB6jPF^sTP=hVq9X}ID5Is z67QETJtY=bmxzKZXP~fC;qk*IbimE#K;;Y!T>?{&u{ZMi+(8I`GEvvZPB@a^{y`_& zzqVPB8PJnOL#u0@%L8I`HX_MCt$t9{#WQ`?MJBw|N=Lj*GFEW3!9>m16O6jm6^je0 zE4eQ(m0q%twX$<=oOwO8*T*aoaQsep*%lU6N)^rwi8qr-G1Cf^!j(ki)=tk(W0Y2Q za|c&cbuvux#8;ppsTsrw0+w$nO-pmD(7VUY?&T%EB&lb2Z@@uzd}e$@s`WFQ&L*EF zmt~W7^nSI=9InBPN{p3Nq4lLV3(U)*(qj#qFV~`0qr^KK-kwLmn8nO^Xx_%$w%iPP z9*r~pH|;j@nSFn{Hj6+evBDqBY@wAtKe(DdzNY^6^DqJy0!kiSflFf@81l^sWPMso zA5<59{HL??fa zfe)uFclY)dKW|;pu4idYS+ANKNQ-;Jt%Yfe{~de6s7Ns;7|T19F4W(XHf^3xXaTIV}tAqgu^F`)}Svh&3V3&WIb2K?eM&R!mC%0AFnu9NNcBi zFq#sBkX*)b(ICpytaQf#d3`EQze(`lZW}lAr!J1G*+|g>A=2nzbkiR+>+WHn2`NznoI5%IL{aa*n1ab=UYY#9)=| z#@X?4EbYsWSY3Ruq4O8Y{EuxDpzVB>RyD0h$o}b-Zf0iYFgQGmYCGILlSbIX$J^N0 zkQ#ehQd+aiuV?H}FAV9eb&<&Dn%MqC4qlpyz-k?gF0A`cnlCjQpp8D#0YVD@mC^Kf zi_+{H!;i_$Rla^FekO->Ek?@RJ}N%>55^q6GdJ(`J9SComUHh1WGZpP0gu16|7mQ* zuHFRc+1aQ3x=D^EM)3cKmQ=xL6==2KS3#Rnf#`~T=aY8UMc1;~E4kede=voD>e z!2rs4-zAc;QKmykDNFgF^7Y6o7$;8Cxvx@A-KU`~#h-+umliKC@#>G0eRK<*yOi5x zvB%$>gy+lIARyrJWQFfd8jZLa=1lJe#MV-?lPwDf?sNbOWXpP}}%B zy6}A44t1`)F@W&CctD5UbT952?|OH2bYggdQKGe-#w}E7@$YD>yF!zG$WLI-MF<^a}lNpBUwgz|~G4eCCH`pTw0M zFom7KObKN9U7*e{a+a!NvUWjaL;R&xN?6Qa(;1i zPHk*BdwP?i#C0<8e&@w0m($38NV&_{k~m2mKdw2re{KYtYVb6facx2&S0SHN0-;e{#|H7EXwZsH-Bv1L6U!vdt-NHd*XJ^L(mLz2g^RKnQBc=sTpq^ zw|6}ScBMV>m=3OnP&cKVIgY+s?7!19^f>Bpc>)<<8t6U9O$-U6ZG*6f(x2%?hE&a< zuXKEsM(&xzZoi8f#a*&!xncG$^dRn9mz0ynbkl-xzcB^0Fb^e6MmVk$+(2dzry$%6 zqPOY|#xKqww4S0Hwhm`pO7WC zDcjNf7r9hrimanJe|$1V5M+g45( z9;>XQU8x+!g&rOEAA0~)-YafsCp%0t|GHNcu5X)UP$DOIXoskJTR|Ki1s@SSeRKu8caN%{146V B___c9 literal 3158 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 LT Date: Sat, 15 Oct 2022 20:00:25 +0200 Subject: [PATCH 109/111] actually working rocket artillery --- .../projectile/EntityArtilleryRocket.java | 65 +++++++-- .../entity/projectile/EntityThrowableNT.java | 4 +- .../IRocketSteeringBehavior.java | 2 +- .../RocketSteeringBallisticArc.java | 80 ++++++++++- .../RocketTargetingPredictive.java | 16 ++- .../hbm/inventory/gui/GUITurretHIMARS.java | 34 +++++ .../items/tool/ItemDesignatorArtyRange.java | 21 ++- .../com/hbm/items/weapon/ItemAmmoHIMARS.java | 15 +- .../projectile/RenderArtilleryRocket.java | 20 ++- .../hbm/render/item/ItemRenderLibrary.java | 4 +- .../render/tileentity/RenderTurretHIMARS.java | 35 ++++- .../machine/TileEntityCrucible.java | 6 + .../turret/TileEntityTurretHIMARS.java | 128 +++++++++++++++++- .../models/projectiles/himars_single.png | Bin 924 -> 1570 bytes .../models/projectiles/himars_standard.png | Bin 543 -> 909 bytes .../hbm/textures/models/turrets/himars.png | Bin 4074 -> 4115 bytes 16 files changed, 380 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java index 7b69f6562..41f75310e 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java @@ -6,6 +6,8 @@ import java.util.List; import com.hbm.entity.logic.IChunkLoader; import com.hbm.entity.projectile.rocketbehavior.IRocketSteeringBehavior; import com.hbm.entity.projectile.rocketbehavior.IRocketTargetingBehavior; +import com.hbm.entity.projectile.rocketbehavior.RocketSteeringBallisticArc; +import com.hbm.entity.projectile.rocketbehavior.RocketTargetingPredictive; import com.hbm.items.weapon.ItemAmmoHIMARS; import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; import com.hbm.main.MainRegistry; @@ -14,6 +16,7 @@ import api.hbm.entity.IRadarDetectable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.ChunkCoordIntPair; @@ -27,15 +30,18 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu private Ticket loaderTicket; //TODO: find satisfying solution for when an entity is unloaded and reloaded, possibly a custom entity lookup using persistent UUIDs - private Entity targetEntity = null; - private Vec3 lastTargetPos; + public Entity targetEntity = null; + public Vec3 lastTargetPos; - private IRocketTargetingBehavior targeting; - private IRocketSteeringBehavior steering; + public IRocketTargetingBehavior targeting; + public IRocketSteeringBehavior steering; public EntityArtilleryRocket(World world) { super(world); this.ignoreFrustumCheck = true; + + this.targeting = new RocketTargetingPredictive(); + this.steering = new RocketSteeringBallisticArc(); } @Override @@ -84,8 +90,16 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu if(!worldObj.isRemote) { - if(this.targetEntity != null) this.targeting.recalculateTargetPosition(this, this.targetEntity); - this.steering.adjustCourse(this); + if(this.targetEntity == null) { + Vec3 delta = Vec3.createVectorHelper(this.lastTargetPos.xCoord - this.posX, this.lastTargetPos.yCoord - this.posY, this.lastTargetPos.zCoord - this.posZ); + if(delta.lengthVector() <= 15D) { + this.targeting = null; + this.steering = null; + } + } + + if(this.targeting != null && this.targetEntity != null) this.targeting.recalculateTargetPosition(this, this.targetEntity); + if(this.steering != null) this.steering.adjustCourse(this, 25D, 15D); loadNeighboringChunks((int)Math.floor(posX / 16D), (int)Math.floor(posZ / 16D)); this.getType().onUpdate(this); @@ -120,8 +134,17 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu clearChunkLoader(); loadedChunks.clear(); - loadedChunks.add(new ChunkCoordIntPair(newChunkX, newChunkZ)); - loadedChunks.add(new ChunkCoordIntPair(newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D), newChunkZ + (int) Math.ceil((this.posZ + this.motionZ) / 16D))); + + int minX = Math.min(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); + int maxX = Math.max(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); + int minZ = Math.min(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); + int maxZ = Math.max(newChunkZ, newChunkZ + (int) Math.ceil((this.posZ + this.motionZ) / 16D)); + + for(int x = minX; x <= maxX; x++) { + for(int z = minZ; z <= maxZ; z++) { + loadedChunks.add(new ChunkCoordIntPair(x, z)); + } + } for(ChunkCoordIntPair chunk : loadedChunks) { ForgeChunkManager.forceChunk(loaderTicket, chunk); @@ -142,6 +165,32 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu } } + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + + nbt.setDouble("targetX", this.lastTargetPos.xCoord); + nbt.setDouble("targetY", this.lastTargetPos.yCoord); + nbt.setDouble("targetZ", this.lastTargetPos.zCoord); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + + this.lastTargetPos = Vec3.createVectorHelper(nbt.getDouble("targetX"), nbt.getDouble("targetY"), nbt.getDouble("targetZ")); + } + + @Override + protected float getAirDrag() { + return 1.0F; + } + + @Override + public double getGravityVelocity() { + return this.steering != null ? 0D : 0.01D; + } + @Override public RadarTargetType getTargetType() { return RadarTargetType.ARTILLERY; diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java index 608f999d5..86e57240b 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -226,8 +226,8 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { this.prevRotationYaw += 360.0F; } - this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + //this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + //this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; float drag = this.getAirDrag(); double gravity = this.getGravityVelocity(); diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java index eb9ef1141..659bc5fa0 100644 --- a/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java @@ -5,5 +5,5 @@ import com.hbm.entity.projectile.EntityArtilleryRocket; public interface IRocketSteeringBehavior { /** Modifies the motion to steer towards the set target. */ - public void adjustCourse(EntityArtilleryRocket rocket); + public void adjustCourse(EntityArtilleryRocket rocket, double speed, double turnSpeed); } diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java index c6b494fb2..6a045d021 100644 --- a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java @@ -2,10 +2,86 @@ package com.hbm.entity.projectile.rocketbehavior; import com.hbm.entity.projectile.EntityArtilleryRocket; +import net.minecraft.util.Vec3; + public class RocketSteeringBallisticArc implements IRocketSteeringBehavior { @Override - public void adjustCourse(EntityArtilleryRocket rocket) { - //TBI + public void adjustCourse(EntityArtilleryRocket rocket, double speed, double maxTurn) { + + double turnSpeed = 45; + + Vec3 direction = Vec3.createVectorHelper(rocket.motionX, rocket.motionY, rocket.motionZ).normalize(); + double horizontalMomentum = Math.sqrt(rocket.motionX * rocket.motionX + rocket.motionZ * rocket.motionZ); + Vec3 targetPos = rocket.getLastTarget(); + double deltaX = targetPos.xCoord - rocket.posX; + double deltaZ = targetPos.zCoord - rocket.posZ; + double horizontalDelta = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ); + double stepsRequired = horizontalDelta / horizontalMomentum; + Vec3 target = Vec3.createVectorHelper(targetPos.xCoord - rocket.posX, targetPos.yCoord - rocket.posY, targetPos.zCoord - rocket.posZ).normalize(); + + /* the entity's angles lack precision and i lack the nerve to figure out how they're oriented */ + double rocketYaw = yaw(direction); + double rocketPitch = pitch(direction); + double targetYaw = yaw(target); + double targetPitch = pitch(target); + + boolean debug = false; + + if(debug) { + System.out.println("=== INITIAL ==="); + System.out.println("Rocket Yaw: " + rocketYaw); + System.out.println("Rocket Pitch: " + rocketPitch); + System.out.println("Target Yaw: " + targetYaw); + System.out.println("Target Pitch: " + targetPitch); + } + + turnSpeed = Math.min(maxTurn, turnSpeed / stepsRequired); + + /* ...and then we just cheat */ + if(stepsRequired <= 1) { + turnSpeed = 180D; + } + + /*if(stepsRequired > 1) { + targetPitch = rocketPitch + ((targetPitch - rocketPitch) / stepsRequired); + }*/ + + if(debug) { + System.out.println("=== ADJUSTED ==="); + System.out.println("Target Pitch: " + targetPitch); + } + + /* shortest delta of α < 180° */ + double deltaYaw = ((targetYaw - rocketYaw) + 180D) % 360D - 180D; + double deltaPitch = ((targetPitch - rocketPitch) + 180D) % 360D - 180D; + + double turnYaw = Math.min(Math.abs(deltaYaw), turnSpeed) * Math.signum(deltaYaw); + double turnPitch = Math.min(Math.abs(deltaPitch), turnSpeed) * Math.signum(deltaPitch); + + if(debug) { + System.out.println("=== RESULTS ==="); + System.out.println("Delta Yaw: " + deltaYaw); + System.out.println("Delta Pitch: " + deltaPitch); + System.out.println("Turn Yaw: " + turnYaw); + System.out.println("Turn Pitch: " + turnPitch); + } + + Vec3 velocity = Vec3.createVectorHelper(speed, 0, 0); + velocity.rotateAroundZ((float) -Math.toRadians(rocketPitch + turnPitch)); + velocity.rotateAroundY((float) Math.toRadians(rocketYaw + turnYaw + 90)); + + rocket.motionX = velocity.xCoord; + rocket.motionY = velocity.yCoord; + rocket.motionZ = velocity.zCoord; + } + + private static double yaw(Vec3 vec) { + boolean pos = vec.zCoord >= 0; + return Math.toDegrees(Math.atan(vec.xCoord / vec.zCoord)) + (pos ? 180 : 0); + } + + private static double pitch(Vec3 vec) { + return Math.toDegrees(Math.atan(vec.yCoord / Math.sqrt(vec.xCoord * vec.xCoord + vec.zCoord * vec.zCoord))); } } diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java index 76a6131b1..a5ca5e90f 100644 --- a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java @@ -3,6 +3,7 @@ package com.hbm.entity.projectile.rocketbehavior; import com.hbm.entity.projectile.EntityArtilleryRocket; import net.minecraft.entity.Entity; +import net.minecraft.util.Vec3; /** * Basic implementation of predictive targeting. @@ -23,6 +24,10 @@ public class RocketTargetingPredictive implements IRocketTargetingBehavior { @Override public void recalculateTargetPosition(EntityArtilleryRocket rocket, Entity target) { + Vec3 speed = Vec3.createVectorHelper(rocket.motionX, rocket.motionY, rocket.motionZ); + Vec3 delta = Vec3.createVectorHelper(target.posX - rocket.posX, target.posY - rocket.posY, target.posZ - rocket.posZ); + double eta = delta.lengthVector() - speed.lengthVector(); + /* initialize with the values we already know */ double motionX = target.motionX; double motionY = target.motionY; @@ -40,11 +45,16 @@ public class RocketTargetingPredictive implements IRocketTargetingBehavior { targetMotion[19][0] = target.motionX; targetMotion[19][1] = target.motionY; targetMotion[19][2] = target.motionZ; + + if(eta <= 1) { + rocket.setTarget(target.posX, target.posY - target.yOffset + target.height * 0.5D, target.posZ); + return; + } /* generate averages and predict a new position */ - double predX = target.posX + (motionX / 20D); - double predY = target.posY - target.yOffset + target.height * 0.5D + (motionY / 20D); - double predZ = target.posZ + (motionZ / 20D); + double predX = target.posX + (motionX / 20D) * eta; + double predY = target.posY - target.yOffset + target.height * 0.5D + (motionY / 20D) * eta; + double predZ = target.posZ + (motionZ / 20D) * eta; rocket.setTarget(predX, predY, predZ); } diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java b/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java index eef8d19bb..1458112b9 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java @@ -1,8 +1,13 @@ package com.hbm.inventory.gui; import com.hbm.lib.RefStrings; +import com.hbm.packet.AuxButtonPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.turret.TileEntityTurretBaseNT; +import com.hbm.tileentity.turret.TileEntityTurretHIMARS; +import com.hbm.util.I18nUtil; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; @@ -14,6 +19,35 @@ public class GUITurretHIMARS extends GUITurretBase { super(invPlayer, tedf); } + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + TileEntityTurretHIMARS arty = (TileEntityTurretHIMARS) turret; + String mode = arty.mode == arty.MODE_AUTO ? "artillery" : "manual"; + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 151, guiTop + 16, 18, 18, mouseX, mouseY, I18nUtil.resolveKeyArray("turret.arty." + mode)); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 151 <= x && guiLeft + 151 + 18 > x && guiTop + 16 < y && guiTop + 16 + 18 >= y) { + + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(turret.xCoord, turret.yCoord, turret.zCoord, 0, 5)); + return; + } + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int mX, int mY) { + super.drawGuiContainerBackgroundLayer(p_146976_1_, mX, mY); + + short mode = ((TileEntityTurretHIMARS)turret).mode; + if(mode == TileEntityTurretHIMARS.MODE_MANUAL) drawTexturedModalRect(guiLeft + 151, guiTop + 16, 210, 0, 18, 18); + } + @Override protected ResourceLocation getTexture() { return texture; diff --git a/src/main/java/com/hbm/items/tool/ItemDesignatorArtyRange.java b/src/main/java/com/hbm/items/tool/ItemDesignatorArtyRange.java index b69f70150..fed462479 100644 --- a/src/main/java/com/hbm/items/tool/ItemDesignatorArtyRange.java +++ b/src/main/java/com/hbm/items/tool/ItemDesignatorArtyRange.java @@ -2,10 +2,9 @@ package com.hbm.items.tool; import java.util.List; -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.turret.TurretArty; +import com.hbm.blocks.BlockDummyable; import com.hbm.lib.Library; -import com.hbm.tileentity.turret.TileEntityTurretArty; +import com.hbm.tileentity.turret.TileEntityTurretBaseArtillery; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; @@ -38,15 +37,15 @@ public class ItemDesignatorArtyRange extends Item { Block b = world.getBlock(x, y, z); - if(b == ModBlocks.turret_arty) { - int pos[] = ((TurretArty) b).findCore(world, x, y, z); + if(b instanceof BlockDummyable) { + int pos[] = ((BlockDummyable) b).findCore(world, x, y, z); if(pos == null) return false; TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - if(te instanceof TileEntityTurretArty) { + if(te instanceof TileEntityTurretBaseArtillery) { if(world.isRemote) return true; @@ -79,12 +78,10 @@ public class ItemDesignatorArtyRange extends Item { if(!world.isRemote) { TileEntity te = world.getTileEntity(stack.stackTagCompound.getInteger("x"), stack.stackTagCompound.getInteger("y"), stack.stackTagCompound.getInteger("z")); - if(te instanceof TileEntityTurretArty) { - TileEntityTurretArty arty = (TileEntityTurretArty) te; - if(arty.mode == arty.MODE_MANUAL) { - arty.enqueueTarget(x + 0.5, y + 0.5, z + 0.5); - world.playSoundAtEntity(player, "hbm:item.techBoop", 1.0F, 1.0F); - } + if(te instanceof TileEntityTurretBaseArtillery) { + TileEntityTurretBaseArtillery arty = (TileEntityTurretBaseArtillery) te; + arty.enqueueTarget(x + 0.5, y + 0.5, z + 0.5); + world.playSoundAtEntity(player, "hbm:item.techBoop", 1.0F, 1.0F); } } diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java index 4ef729c71..4809a7c80 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -42,14 +42,21 @@ public class ItemAmmoHIMARS extends Item { list.add(new ItemStack(item, 1, LARGE)); } + @Override + public String getUnlocalizedName(ItemStack stack) { + return "item.ammo_himars_" + itemTypes[Math.abs(stack.getItemDamage()) % itemTypes.length].name; + } + public abstract class HIMARSRocket { + public final String name; public final ResourceLocation texture; public final int amount; public final int modelType; /* 0 = sixfold/standard ; 1 = single */ - public HIMARSRocket(String name, int type, int amount) { - this.texture = new ResourceLocation(RefStrings.MODID + ":textures/models/projectiles/" + name + ".png"); + public HIMARSRocket(String name, String texture, int type, int amount) { + this.name = name; + this.texture = new ResourceLocation(RefStrings.MODID + ":textures/models/projectiles/" + texture + ".png"); this.amount = amount; this.modelType = type; } @@ -75,7 +82,7 @@ public class ItemAmmoHIMARS extends Item { private void init() { /* STANDARD ROCKETS */ - this.itemTypes[SMALL] = new HIMARSRocket("himars_standard", 0, 6) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 25F, 3F, true); }}; - this.itemTypes[LARGE] = new HIMARSRocket("himars_single", 1, 1) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 50F, 5F, true); }}; + this.itemTypes[SMALL] = new HIMARSRocket("standard", "himars_standard", 0, 6) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 25F, 3F, true); }}; + this.itemTypes[LARGE] = new HIMARSRocket("single", "himars_single", 1, 1) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 50F, 5F, true); }}; } } diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java b/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java index 229a71e46..0b4b3d2d4 100644 --- a/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java +++ b/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java @@ -2,7 +2,9 @@ package com.hbm.render.entity.projectile; import org.lwjgl.opengl.GL11; +import com.hbm.entity.projectile.EntityArtilleryRocket; import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; import com.hbm.main.ResourceManager; import net.minecraft.client.renderer.entity.Render; @@ -12,20 +14,25 @@ import net.minecraft.util.ResourceLocation; public class RenderArtilleryRocket extends Render { @Override - public void doRender(Entity shell, double x, double y, double z, float f0, float f1) { + public void doRender(Entity entity, double x, double y, double z, float f0, float f1) { GL11.glPushMatrix(); GL11.glTranslated(x, y, z); - GL11.glRotatef(shell.prevRotationYaw + (shell.rotationYaw - shell.prevRotationYaw) * f1 - 90.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(shell.prevRotationPitch + (shell.rotationPitch - shell.prevRotationPitch) * f1 - 90, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * f1 - 90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1 - 90, 0.0F, 0.0F, 1.0F); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90, 1, 0, 0); - this.bindEntityTexture(shell); + this.bindEntityTexture(entity); boolean fog = GL11.glIsEnabled(GL11.GL_FOG); if(fog) GL11.glDisable(GL11.GL_FOG); GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.turret_himars.renderPart("RocketStandard"); + EntityArtilleryRocket rocket = (EntityArtilleryRocket) entity; + HIMARSRocket type = rocket.getType(); + if(type.modelType == 0) ResourceManager.turret_himars.renderPart("RocketStandard"); + if(type.modelType == 1) ResourceManager.turret_himars.renderPart("RocketSingle"); GL11.glShadeModel(GL11.GL_FLAT); if(fog) GL11.glEnable(GL11.GL_FOG); @@ -34,6 +41,7 @@ public class RenderArtilleryRocket extends Render { @Override protected ResourceLocation getEntityTexture(Entity entity) { - return ItemAmmoHIMARS.itemTypes[0].texture; + EntityArtilleryRocket rocket = (EntityArtilleryRocket) entity; + return ItemAmmoHIMARS.itemTypes[rocket.getDataWatcher().getWatchableObjectInt(10)].texture; } } diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 15378e952..56032d009 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -1360,10 +1360,12 @@ public class ItemRenderLibrary { renderers.put(ModItems.ammo_himars, new ItemRenderBase( ) { public void renderInventory() { - GL11.glTranslated(0, 2.5, 0); + GL11.glTranslated(0, -2.5, 0); GL11.glScaled(4, 4, 4); + GL11.glRotated(System.currentTimeMillis() % 3600 / 10D, 0, 1, 0); } public void renderCommonWithStack(ItemStack item) { + GL11.glTranslated(0, 1.5, 0); GL11.glRotated(-45, 0, 1, 0); GL11.glRotated(90, 1, 0, 0); HIMARSRocket type = ItemAmmoHIMARS.itemTypes[item.getItemDamage()]; diff --git a/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java b/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java index e5215764c..8acb27dac 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java +++ b/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java @@ -3,6 +3,8 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.turret.TileEntityTurretHIMARS; @@ -41,12 +43,33 @@ public class RenderTurretHIMARS extends TileEntitySpecialRenderer implements IIt GL11.glRotated(pitch, 1, 0, 0); GL11.glTranslated(0, -2.25, -2); ResourceManager.turret_himars.renderPart("Launcher"); + + double barrel = turret.lastCrane + (turret.crane - turret.lastCrane) * interp; + double length = -5D; + GL11.glTranslated(0, 0, barrel * length); ResourceManager.turret_himars.renderPart("Crane"); - bindTexture(ResourceManager.himars_standard_tex); - ResourceManager.turret_himars.renderPart("TubeStandard"); - /*ResourceManager.turret_himars.renderPart("CapStandard1"); - ResourceManager.turret_himars.renderPart("CapStandard2"); - ResourceManager.turret_himars.renderPart("CapStandard4");*/ + + if(turret.typeLoaded >= 0) { + HIMARSRocket type = ItemAmmoHIMARS.itemTypes[turret.typeLoaded]; + + if(type.modelType == 0) { + bindTexture(ResourceManager.himars_standard_tex); + ResourceManager.turret_himars.renderPart("TubeStandard"); + + for(int i = 0; i < turret.ammo; i++) { + ResourceManager.turret_himars.renderPart("CapStandard" + (5 - i + 1)); + } + } + + if(type.modelType == 1) { + bindTexture(ResourceManager.himars_single_tex); + ResourceManager.turret_himars.renderPart("TubeSingle"); + + if(turret.hasAmmo()) { + ResourceManager.turret_himars.renderPart("CapSingle"); + } + } + } GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); @@ -67,6 +90,7 @@ public class RenderTurretHIMARS extends TileEntitySpecialRenderer implements IIt public void renderCommonWithStack(ItemStack item) { GL11.glRotatef(-90, 0F, 1F, 0F); GL11.glScaled(0.5, 0.5, 0.5); + GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.turret_arty_tex); ResourceManager.turret_arty.renderPart("Base"); bindTexture(ResourceManager.turret_himars_tex); @@ -75,6 +99,7 @@ public class RenderTurretHIMARS extends TileEntitySpecialRenderer implements IIt ResourceManager.turret_himars.renderPart("Crane"); bindTexture(ResourceManager.himars_standard_tex); ResourceManager.turret_himars.renderPart("TubeStandard"); + GL11.glShadeModel(GL11.GL_FLAT); }}; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 071b5bc5b..2f6a15989 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -356,6 +356,12 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro //if no recipe is loaded, everything will land in the waste stack int recipeInputRequired = recipe != null ? getQuantaFromType(recipe.input, mat.material) : 0; + //this allows pouring the ouput material back into the crucible + if(recipe != null && getQuantaFromType(recipe.output, mat.material) > 0) { + recipeAmount += mat.amount; + continue; + } + if(recipeInputRequired == 0) { //if this type isn't required by the recipe, add it to the waste stack wasteAmount += mat.amount; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index 1bb2d49c9..58c0afe31 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -3,9 +3,12 @@ package com.hbm.tileentity.turret; import java.util.ArrayList; import java.util.List; +import com.hbm.entity.projectile.EntityArtilleryRocket; import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.inventory.gui.GUITurretHIMARS; import com.hbm.items.ModItems; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; @@ -17,15 +20,21 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implements IGUIProvider { public short mode = 0; - public static final short MODE_AUOT = 0; + public static final short MODE_AUTO = 0; public static final short MODE_MANUAL = 1; + public int typeLoaded = -1; + public int ammo = 0; + public float crane; + public float lastCrane; + @Override @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { @@ -36,7 +45,7 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem ammoStacks = new ArrayList(); List list = new ArrayList(); - ModItems.ammo_arty.getSubItems(ModItems.ammo_arty, MainRegistry.weaponTab, list); + ModItems.ammo_himars.getSubItems(ModItems.ammo_himars, MainRegistry.weaponTab, list); this.ammoStacks.addAll(list); return ammoStacks; @@ -109,9 +118,24 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem this.turnTowardsAngle(targetPitch, targetYaw); } + public int getSpareRocket() { + + for(int i = 1; i < 10; i++) { + if(slots[i] != null) { + if(slots[i].getItem() == ModItems.ammo_himars) { + return slots[i].getItemDamage(); + } + } + } + + return -1; + } + @Override public void updateEntity() { + this.lastCrane = this.crane; + if(this.mode == this.MODE_MANUAL) { if(!this.targetQueue.isEmpty()) { this.tPos = this.targetQueue.get(0); @@ -156,8 +180,39 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem if(isOn() && hasPower()) { - if(tPos != null) - this.alignTurret(); + if(!this.hasAmmo() || this.crane > 0) { + + this.turnTowardsAngle(0, this.rotationYaw); + + if(this.aligned) { + + if(this.hasAmmo()) { + this.crane -= 0.0125F; + } else { + this.crane += 0.0125F; + + if(this.crane >= 1F && !worldObj.isRemote) { + int available = this.getSpareRocket(); + + if(available != -1) { + HIMARSRocket type = ItemAmmoHIMARS.itemTypes[available]; + this.typeLoaded = available; + this.ammo = type.amount; + this.conusmeAmmo(ModItems.ammo_himars); + } + } + } + } + + this.crane = MathHelper.clamp_float(this.crane, 0F, 1F); + + } else { + + if(tPos != null) { + this.alignTurret(); + } + } + } else { this.target = null; @@ -187,7 +242,7 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem searchTimer = 0; } - if(this.aligned) { + if(this.aligned && crane <= 0) { this.updateFiringTick(); } @@ -213,9 +268,70 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem } } + @Override + protected NBTTagCompound writePacket() { + NBTTagCompound data = super.writePacket(); + data.setShort("mode", this.mode); + data.setInteger("type", this.typeLoaded); + data.setInteger("ammo", this.ammo); + return data; + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + super.networkUnpack(nbt); + this.mode = nbt.getShort("mode"); + this.typeLoaded = nbt.getShort("type"); + this.ammo = nbt.getInteger("ammo"); + } + + public boolean hasAmmo() { + return this.typeLoaded >= 0 && this.ammo > 0; + } + + int timer; + @Override public void updateFiringTick() { - // *chirp* *chirp* *chirp* + + timer++; + + int delay = 40; + + if(timer % delay == 0) { + + if(this.hasAmmo() && this.tPos != null) { + this.spawnShell(this.typeLoaded); + this.ammo--; + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.jeremy_fire", 25.0F, 1.0F); + } + + if(this.mode == this.MODE_MANUAL && !this.targetQueue.isEmpty()) { + this.targetQueue.remove(0); + this.tPos = null; + } + } + } + + public void spawnShell(int type) { + + Vec3 pos = this.getTurretPos(); + Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); + vec.rotateAroundZ((float) -this.rotationPitch); + vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); + + EntityArtilleryRocket proj = new EntityArtilleryRocket(worldObj); + proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, 0.0F, 0.0F); + proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, 25F, 0.0F); + + if(this.target != null) + proj.setTarget(this.target); + else + proj.setTarget(tPos.xCoord, tPos.yCoord, tPos.zCoord); + + proj.setType(type); + + worldObj.spawnEntityInWorld(proj); } @Override diff --git a/src/main/resources/assets/hbm/textures/models/projectiles/himars_single.png b/src/main/resources/assets/hbm/textures/models/projectiles/himars_single.png index 2f97a307d8c8c4d821f438e5f75ee7400f5e7ee9..0e5dee8d7354df6ecf42b81b283e2453e0e53e0c 100644 GIT binary patch literal 1570 zcmdUv|2q>19LI;X+uD}0yC&;F`S!RI)!BwvVahTrt<>`MBDyi*l!n#F*D^KNeA^Ne z#e9ikxnbg5X<1TZ51|~|&0_Vl!l!Lhu6|Y^$LJ`e;`KSENK7lsxa#}>c?!*nR2F@ZY`6NpRj2Si zYQ2(fu&dX^N1-V@aLJT1HuXti3?vGz6CDLgJc zObKlDc0pds$mm*bOW7T-?idThF?2afr7~?9Ai2_BI>?pTEWJXLAlzGZ2`FXISSQfD zwb0<#L*;tE3cd991@b_ydTniOkSGAMA2~9KaLIA-#G;W@DxEKK8gXMfJgM1G9jy`I zE>t}7AsZ1WCE{xIl0MSPKjO+OYmKjT*@)Fy>KJFyqJYs8{+H7K$NC~iJ7##d;la=a zhPijo)ReNHI&9`5Tu0T}K>(Jl&Dq9>^3g5z)*PNNT7MH*jv{NtsS$LNC(bzkCq?ME z%<_B>bR4YbyYP(TOdl^AUDuVw44XX*S_hu=fVRECF@5YQM&UgSf1CEdA%X*qes_P4 z=!+#9uJ8&^7@-cU5JGNks3HiiUk;2oM%G(Ollx|4dnqM{-imXEJAw5e%ng|h3EdK@ z&s@)h^HU&X{dA+>bQN`au$SZH;!shI+$-ZfhKQc<$Vn}K6uI3NecE>nZtc3db!csV zYBBrHhE|RMeEGp(j`TE%MzhmYiJJRECSR(ebX{8}*X4TvtMYiUDPV8g8L{M(=yI?Q zh?q}+tsdi#L7TDW4*Qc0iY!u=wDMw}3HG@LH{muvEy}%QZXW5ogBnrDe0}fX8X8y^Vf8hZckBCBLD*sl62za&Lk1Fco0Vz(8~9rP0ue z!irFB`C1oS|6=aGA@=$BZhW#6*HUcBQpNcMy_|O`5Qi=&Vf2n0Pp1?sLuyo1c!8F zM#zK1hUoc>?jd-eoE8d2W%V`Vw~sbOw>68nv$#YxkhyPLwTE=#GdfhwK(?=C{{IQuZ_*%~38!#=oc`$p2tEP$Ca;Lhe*r#(yk7tS literal 924 zcmeAS@N?(olHy`uVBq!ia0vp^0YJQmgAGW&pRO4Kq*#ibJVQ8upoSx*gMooL*we)^ zq+-t7yM{%#93;eM zQqo@iU9VoZFMCzBXc?c5PbqH+h@8HmI3aP>ZuVp6%Ko08zF2Hq{I$T_+t2TlyYb)B z;{W;8FBn#5C%kg1;BQ%#o$y9RVh;1?RqGmq&y*SNVRyP}YEaet{`SM>A4fMVpU=GV zm6Swu$Bpo}itif(N_m&`c3o|qQf;mL{U1oin*EZvELg(F_Lv1o^99Qd2I!e<1Cwepn`L_wSW^pHL080mGjcUamh}!T(0`<+qgw zA8&1(u-b6lu_vjBaJcZ5AzuE~^&Pfz3VCa$3FKRx|2Tbv;yhEk1KW@PV@wVbRP5va zF!NCMtQDX4$}M>KcY5-fh0>>z5C#DKzfb%5?xM<{>*l;a^%QKh-b?T%f9jzz R1(@9!JYD@<);T3K0RYu^ltBOh diff --git a/src/main/resources/assets/hbm/textures/models/projectiles/himars_standard.png b/src/main/resources/assets/hbm/textures/models/projectiles/himars_standard.png index 79604841b1ddc34f0073ade29ba6080ce6d110d1..54a00f7df2898216a50cc251985fba61fe97c54d 100644 GIT binary patch literal 909 zcmeAS@N?(olHy`uVBq!ia0vp^0YDtW!3HEn8#e3)QY^(zo*^7SP{WbZ!N9=m;_2cT zQZeW49K-C}4kE|@UphHW)jX49$py>q{SJ1nZR;e1xaKY}v&x(H> z%;($l=EO6w_r5H=Tl&CCG~&>K>FZGmAfe-=2FvchAq1JJ+X8{rQS@ z^0eiXE^j`4^54aW|4u!hsg;*@*}`_W%ks-Jb24XsU%2>P+UTY!g#{$eN^mFIDN@V$$mV@aGnl_wUnFr-r0Tw(=+5txDK^b;{eY z;C0pef*RR-S8n)Hcg-xssPEtI=N3+0U9dBXr3(rqJh&%;)EO#4I<@ia#al zSjDTba&x%rZ@Gw&3z6lDuGNjZ7VmYqoBc4ldF~|PwTCu~zxV81ou|X2w6|`>lcd}I ztGsUM3cqdN@J{DVBmc(bD-H$OKDRB=Nw9jZYO8EtFLT(>u!$-9?C=x4ao0)Y=;UNYGoJ;kZk5KxIVpX7zMk(*7V9*D?Ta?_ zNx15#-<`_*jP>h&y~vIG{@*xOVBsRbVtjj9QBBR7HO@D-*>1j?Wvcgd#Rdl@oe7Xo zA(?sNQ2Nt%)zia%{SEzme&5RRHdPRuB~PXkisfY;=hrgZY#FmdKI;Vst063ePKmY&$ delta 502 zcmeBWpU*PExSsKvr;B4q#hkadZT${A2(&#ky~Vs_@mWEozyi*9Pd@q9(&bOCO z2`c`-UEwd!pD&^*E0_I$9Ee9h36T6mB+JCRkE?ec|=(5R;hJ>EE?a zVRu@bx%p;Jp4HUy-Lh7NbET~Xj2uodEVTJ^CVFky)~rYsh=3w<3lC5x<5RWL+rvNg z3wB@s_!MaW*>}r=T;}jtD5Z(7%TGMP096Jw;G}=@qmQ>APgg#_|MEKFgjK4jk~@s@!}hx{ff&CfKFrMuxwQX z+poz3R^gX;f)D79A};4Lg_MR1`7hMI1jm2l|MvXZb3?E1{=L_%@8pBD_0~y$7JJiB z^8ZT4UXaQO!8bHxrZYPEJxuuh7Hs^6;2nC*EprYX{B|2;wO``$f>@As&2P6e1D$2Z YP|;Jf?W|=(3zq^<1twe>72m=5hYGZBwCjjta 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 b&Rsr@#JtStOkv!wA7>j2dvmhs^?&{cB{c{h literal 4074 zcmXw+c|276|Hlv6vdhlcrb2eIZ&^lCwz-HfNXkxwu}e~jaHX_d9=_^Ld=}UO(scd4A4$ZfkAM!79QE004)@4ai>rK<7gn2e2^F z&gSQ2BWM?fP!kJ#7TOWZ;*|mbT%{HeWBbSgQejUTXhe8$DUV1j%7cB>H2@WqC$5|V zty!QVF%|{*^FW3RHxiU5n1-H-5`-!~GToAdr;)sLgr_~K-9Rh@tei?+?_D1_Jq@qA zRxP&GQ=d;LA~tT+ZfvhHCkL5N!8DNd-bGPI^&32NDjrztj7jOCB{Vg%!cPGh)~;d( z9{Vn0*!;yJ?kzd!UjQ_P--^?!eH{C(r0-h-FB3|w#UK%HVAy#LFI*nDLe#ZttVZ?i z2&QO5An?C-@)6R}4VM>IR!+ludcgsrHZ$MH@(M%oo40-+0v;_X_c~MM#5!_qUUNMV zL}hY?iB8Q3HaM0%NoPL_>6Am@7Cjd~d89VQ#g@$1U@#ARo>Y~jo&x}d%4`P^*N*;p z+zD}pqLIk}0EF^vdMn8OXY;q7$Gh!^WeZxEqYe4GI_|BtbRr#Kn{Ry`WYdf3l^T|a zr-HVH0i2%hW(lISi*xQk7X~~w)Rn^Z9?$WDql;BTnH16M$q|cP>+WaAnGnc+<{3z1 z!?D2|S-MT_+QHz}k}!Ma#kt~izz^b6BVO2jEEl7(_{n~RXnZl|RE>8#*bu#>o&9Fh z$!aF9+*;uA_X*(y>FD@-wtP$bzjN}OMzuKKen7md+QdL**xsx7D&VBA;%QF^RLFI9 z0Qc+yGb~~!0lYfqn4!3un|S7i%ziWR`w<<`Uv-ry+36Njc$*cHLT(S6K6ei0e4S|b4nOSSgwHe84yDFY-P3h;lram2U?Y#*< zPE5DcmJtAwj4m=S+!kis6$N@1rO zdNf2aL8)sz&}Drwf_9r`$Loay0FNu8oFekmntibVVEOXA`a$$81DOs`NjH7UAE1`Y z1w7_(wF8UASZxvPI!UKi2lc5^yAj&Yjg+ILLAV081&g$akl)ewG%=;6&NlbX8H z8h!V9YI5un|h`@N6C&qk9-K%fH+V8JlGW4U8nW4UeSC( zA*j;K+8D6_hgK<|dwqY^958$j2~Gg)R-~ zFp};gaGAwqk`S+tsH+Ez;!QwaK*XE|oXg;!P37mzztPARuzY%YFn)G{XQHo< z4(95L>+9=7YDP5*B6~VIYVIO2{@oO(>yQYuRmD)=-1@1#>c>MpeSJ&VOeL92 zE-bc1h=t!t1?_!)tA$r#CuZ9i`i2TU(~mi@B+48vE-ns^=j7z16aMMI(4d7Jx?Owp zs+Unz(1%wEr%9P%7;}$;3`uvP!CLM0Cz=r*>E7c->Eim4B`2oVNR_MePf2Klj&q;5s|+oY1W;M7ogvDNpR7wuEp*cn9FGkSUqSoaqB6jPF^sTP=hVq9X}ID5Is z67QETJtY=bmxzKZXP~fC;qk*IbimE#K;;Y!T>?{&u{ZMi+(8I`GEvvZPB@a^{y`_& zzqVPB8PJnOL#u0@%L8I`HX_MCt$t9{#WQ`?MJBw|N=Lj*GFEW3!9>m16O6jm6^je0 zE4eQ(m0q%twX$<=oOwO8*T*aoaQsep*%lU6N)^rwi8qr-G1Cf^!j(ki)=tk(W0Y2Q za|c&cbuvux#8;ppsTsrw0+w$nO-pmD(7VUY?&T%EB&lb2Z@@uzd}e$@s`WFQ&L*EF zmt~W7^nSI=9InBPN{p3Nq4lLV3(U)*(qj#qFV~`0qr^KK-kwLmn8nO^Xx_%$w%iPP z9*r~pH|;j@nSFn{Hj6+evBDqBY@wAtKe(DdzNY^6^DqJy0!kiSflFf@81l^sWPMso zA5<59{HL??fa zfe)uFclY)dKW|;pu4idYS+ANKNQ-;Jt%Yfe{~de6s7Ns;7|T19F4W(XHf^3xXaTIV}tAqgu^F`)}Svh&3V3&WIb2K?eM&R!mC%0AFnu9NNcBi zFq#sBkX*)b(ICpytaQf#d3`EQze(`lZW}lAr!J1G*+|g>A=2nzbkiR+>+WHn2`NznoI5%IL{aa*n1ab=UYY#9)=| z#@X?4EbYsWSY3Ruq4O8Y{EuxDpzVB>RyD0h$o}b-Zf0iYFgQGmYCGILlSbIX$J^N0 zkQ#ehQd+aiuV?H}FAV9eb&<&Dn%MqC4qlpyz-k?gF0A`cnlCjQpp8D#0YVD@mC^Kf zi_+{H!;i_$Rla^FekO->Ek?@RJ}N%>55^q6GdJ(`J9SComUHh1WGZpP0gu16|7mQ* zuHFRc+1aQ3x=D^EM)3cKmQ=xL6==2KS3#Rnf#`~T=aY8UMc1;~E4kede=voD>e z!2rs4-zAc;QKmykDNFgF^7Y6o7$;8Cxvx@A-KU`~#h-+umliKC@#>G0eRK<*yOi5x zvB%$>gy+lIARyrJWQFfd8jZLa=1lJe#MV-?lPwDf?sNbOWXpP}}%B zy6}A44t1`)F@W&CctD5UbT952?|OH2bYggdQKGe-#w}E7@$YD>yF!zG$WLI-MF<^a}lNpBUwgz|~G4eCCH`pTw0M zFom7KObKN9U7*e{a+a!NvUWjaL;R&xN?6Qa(;1i zPHk*BdwP?i#C0<8e&@w0m($38NV&_{k~m2mKdw2re{KYtYVb6facx2&S0SHN0-;e{#|H7EXwZsH-Bv1L6U!vdt-NHd*XJ^L(mLz2g^RKnQBc=sTpq^ zw|6}ScBMV>m=3OnP&cKVIgY+s?7!19^f>Bpc>)<<8t6U9O$-U6ZG*6f(x2%?hE&a< zuXKEsM(&xzZoi8f#a*&!xncG$^dRn9mz0ynbkl-xzcB^0Fb^e6MmVk$+(2dzry$%6 zqPOY|#xKqww4S0Hwhm`pO7WC zDcjNf7r9hrimanJe|$1V5M+g45( z9;>XQU8x+!g&rOEAA0~)-YafsCp%0t|GHNcu5X)UP$DOIXoskJTR|Ki1s@SSeRKu8caN%{146V B___c9 From fff48c5ca12a7cbc83b85c980ac20eb0e6b2883e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 16 Oct 2022 18:13:56 +0200 Subject: [PATCH 110/111] and there we go --- src/main/java/com/hbm/blocks/ModBlocks.java | 12 +-- .../hbm/blocks/generic/BlockStorageCrate.java | 8 +- .../blocks/machine/DummyBlockAssembler.java | 5 -- .../hbm/blocks/machine/MachineHeatBoiler.java | 18 +++- .../java/com/hbm/crafting/WeaponRecipes.java | 1 + .../handlers/CargoShellCraftingHandler.java | 81 ++++++++++++++++++ .../projectile/EntityArtilleryRocket.java | 20 +++++ .../projectile/EntityArtilleryShell.java | 51 +++++++++++ .../projectile/EntityThrowableInterp.java | 4 - .../entity/projectile/EntityThrowableNT.java | 4 +- .../hbm/inventory/gui/GuiInfoContainer.java | 5 +- .../inventory/recipes/AssemblerRecipes.java | 33 ++++++- .../hbm/inventory/recipes/MachineRecipes.java | 3 - .../com/hbm/items/tool/ItemOilDetector.java | 17 ++-- .../com/hbm/items/weapon/ItemAmmoArty.java | 24 +++++- .../com/hbm/items/weapon/ItemAmmoHIMARS.java | 1 + src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/CraftingManager.java | 3 +- .../hbm/render/item/ItemRenderLibrary.java | 20 ++++- .../machine/TileEntityCrucible.java | 3 +- .../machine/TileEntityHeatBoiler.java | 1 - .../tileentity/machine/TileEntityITER.java | 13 ++- .../machine/rbmk/TileEntityRBMKRod.java | 6 +- .../network/TileEntityConverterRfHe.java | 2 +- .../turret/TileEntityTurretArty.java | 22 +++-- .../turret/TileEntityTurretHIMARS.java | 8 +- src/main/resources/assets/hbm/lang/de_DE.lang | 50 +++++++++-- src/main/resources/assets/hbm/lang/en_US.lang | 42 ++++++++- .../hbm/textures/items/ammo_arty_cargo.png | Bin 311 -> 365 bytes .../textures/items/ammo_arty_cargo_full.png | Bin 0 -> 311 bytes .../textures/items/ammo_arty_cargo_open.png | Bin 365 -> 0 bytes .../hbm/textures/models/turrets/himars.png | Bin 4115 -> 5466 bytes src/main/resources/mcmod.info | 2 +- 34 files changed, 395 insertions(+), 67 deletions(-) create mode 100644 src/main/java/com/hbm/crafting/handlers/CargoShellCraftingHandler.java create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_arty_cargo_full.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_arty_cargo_open.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 00ebc6cc9..bb9c059d0 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -2982,12 +2982,12 @@ public class ModBlocks { GameRegistry.registerBlock(door_bunker, door_bunker.getUnlocalizedName()); //Crates - GameRegistry.registerBlock(crate_iron, crate_iron.getUnlocalizedName()); - GameRegistry.registerBlock(crate_steel, crate_steel.getUnlocalizedName()); - GameRegistry.registerBlock(crate_desh, crate_desh.getUnlocalizedName()); - GameRegistry.registerBlock(crate_tungsten, crate_tungsten.getUnlocalizedName()); - GameRegistry.registerBlock(safe, safe.getUnlocalizedName()); - GameRegistry.registerBlock(mass_storage, ItemBlockBase.class, mass_storage.getUnlocalizedName()); + register(crate_iron); + register(crate_steel); + register(crate_desh); + register(crate_tungsten); + register(safe); + register(mass_storage); //Junk GameRegistry.registerBlock(boxcar, boxcar.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java b/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java index 5dddb69ed..8844789ea 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java +++ b/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java @@ -3,6 +3,7 @@ package com.hbm.blocks.generic; import java.io.IOException; import java.util.Random; +import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; import com.hbm.items.tool.ItemLock; @@ -38,7 +39,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockStorageCrate extends BlockContainer { +public class BlockStorageCrate extends BlockContainer implements IBlockMulti { @SideOnly(Side.CLIENT) private IIcon iconTop; @@ -264,4 +265,9 @@ public class BlockStorageCrate extends BlockContainer { public Item getItemDropped(int i, Random rand, int j) { return null; } + + @Override + public int getSubCount() { + return 0; + } } diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java b/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java index 18719d914..9eacde4da 100644 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java +++ b/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java @@ -1,9 +1,6 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IDummy; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.TileEntityMachineAssembler; @@ -11,8 +8,6 @@ import com.hbm.tileentity.machine.TileEntityMachineAssembler; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java b/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java index c4d6bdc67..4264b777d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java +++ b/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java @@ -6,9 +6,11 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.trait.FT_Heatable; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; +import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityHeatBoiler; @@ -29,7 +31,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay, IBlockMulti { +public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay, ITooltipProvider, IBlockMulti { public MachineHeatBoiler() { super(Material.iron); @@ -112,9 +114,12 @@ public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay, I int[] pos = this.findCore(world, x, y, z); if(pos != null) { - TileEntityHeatBoiler stirling = (TileEntityHeatBoiler)world.getTileEntity(pos[0], pos[1], pos[2]); - if(stirling.hasExploded) { - dmg = 1; + TileEntityHeatBoiler boiler = (TileEntityHeatBoiler)world.getTileEntity(pos[0], pos[1], pos[2]); + if(boiler.hasExploded) { + //dmg = 1; + ret.add(new ItemStack(ModItems.ingot_steel, 4)); + ret.add(new ItemStack(ModItems.plate_copper, 8)); + return ret; } } @@ -180,4 +185,9 @@ public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay, I public int getSubCount() { return 0; } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 2ca3c5638..d5e80cfa2 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -282,6 +282,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_arty, 1, 3), new Object[] { " P ", "NSN", " P ", 'P', PU239.nugget(), 'N', OreDictManager.getReflector(), 'S', new ItemStack(ModItems.ammo_arty, 1, 0) }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_arty, 1, 6), new Object[] { "DSD", "SCS", "DSD", 'D', OreDictManager.getReflector(), 'S', new ItemStack(ModItems.ammo_arty, 1, 3), 'C', ModBlocks.det_cord }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.ammo_arty, 1, 4), new Object[] { new ItemStack(ModItems.ammo_arty, 1, 2), ModItems.boy_bullet, ModItems.boy_target, ModItems.boy_shielding, ModItems.circuit_red_copper, ModItems.ducttape }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_arty, 1, 8), new Object[] { " I ", " S ", "CCC", 'C', ModItems.cordite, 'I', ModItems.sphere_steel, 'S', ModItems.hull_small_steel }); //DGK Belts CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_dgk, 1), new Object[] { "LLL", "GGG", "CCC", 'L', PB.plate(), 'G', ModItems.ballistite, 'C', CU.ingot() }); diff --git a/src/main/java/com/hbm/crafting/handlers/CargoShellCraftingHandler.java b/src/main/java/com/hbm/crafting/handlers/CargoShellCraftingHandler.java new file mode 100644 index 000000000..0dc724a49 --- /dev/null +++ b/src/main/java/com/hbm/crafting/handlers/CargoShellCraftingHandler.java @@ -0,0 +1,81 @@ +package com.hbm.crafting.handlers; + +import com.hbm.items.ModItems; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class CargoShellCraftingHandler implements IRecipe { + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + + int itemCount = 0; + int shellCount = 0; + + for(int i = 0; i < 9; i++) { + ItemStack stack = inventory.getStackInRowAndColumn(i % 3, i / 3); + + if(stack != null) { + + if(stack.getItem().hasContainerItem(stack) || !stack.getItem().doesContainerItemLeaveCraftingGrid(stack)) + return false; + + itemCount++; + + if(stack.getItem() == ModItems.ammo_arty && stack.getItemDamage() == 8 && !stack.hasTagCompound()) { + shellCount++; + } + } + } + + return itemCount == 2 && shellCount == 1; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + + ItemStack shell = null; + ItemStack cargo = null; + + for(int i = 0; i < 9; i++) { + ItemStack stack = inventory.getStackInRowAndColumn(i % 3, i / 3); + + if(stack == null) + continue; + + if(stack.getItem() == ModItems.ammo_arty && stack.getItemDamage() == 8 && !stack.hasTagCompound()) { + ItemStack copy = stack.copy(); + copy.stackSize = 1; + shell = copy; + } else { + ItemStack copy = stack.copy(); + copy.stackSize = 1; + cargo = copy; + } + } + + if(shell == null || cargo == null) + return null; + + if(!shell.hasTagCompound()) + shell.stackTagCompound = new NBTTagCompound(); + + shell.stackTagCompound.setTag("cargo", cargo.writeToNBT(new NBTTagCompound())); + + return shell; + } + + @Override + public int getRecipeSize() { + return 9; + } + + @Override + public ItemStack getRecipeOutput() { + return new ItemStack(ModItems.ammo_shell, 1, 8); + } +} diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java index 41f75310e..5f906b878 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java @@ -86,6 +86,13 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu @Override public void onUpdate() { + + if(worldObj.isRemote) { + this.lastTickPosX = this.posX; + this.lastTickPosY = this.posY; + this.lastTickPosZ = this.posZ; + } + super.onUpdate(); if(!worldObj.isRemote) { @@ -103,6 +110,14 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu loadNeighboringChunks((int)Math.floor(posX / 16D), (int)Math.floor(posZ / 16D)); this.getType().onUpdate(this); + } else { + + Vec3 v = Vec3.createVectorHelper(lastTickPosX - posX, lastTickPosY - posY, lastTickPosZ - posZ); + double velocity = v.lengthVector(); + v = v.normalize(); + + int offset = 6; + if(velocity > 1) for(int i = offset; i < velocity + offset; i++) MainRegistry.proxy.spawnParticle(posX + v.xCoord * i, posY + v.yCoord * i, posZ + v.zCoord * i, "exKerosene", null); } } @@ -195,4 +210,9 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu public RadarTargetType getTargetType() { return RadarTargetType.ARTILLERY; } + + @Override + public int approachNum() { + return 0; // + } } diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java index 8e66e0b47..b7a4c3e80 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java @@ -11,9 +11,12 @@ import com.hbm.main.MainRegistry; import api.hbm.entity.IRadarDetectable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraftforge.common.ForgeChunkManager; @@ -43,9 +46,12 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa private boolean shouldWhistle = false; private boolean didWhistle = false; + private ItemStack cargo = null; + public EntityArtilleryShell(World world) { super(world); this.ignoreFrustumCheck = true; + this.setSize(0.5F, 0.5F); } @Override @@ -133,6 +139,10 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa } else { this.setPosition(this.posX, this.posY, this.posZ); } + + if(Vec3.createVectorHelper(this.syncPosX - this.posX, this.syncPosY - this.posY, this.syncPosZ - this.posZ).lengthVector() < 0.2) { + worldObj.spawnParticle("smoke", posX, posY + 0.5, posZ, 0.0, 0.1, 0.0); + } } } @@ -210,22 +220,30 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); + nbt.setInteger("type", this.dataWatcher.getWatchableObjectInt(10)); nbt.setBoolean("shouldWhistle", this.shouldWhistle); nbt.setBoolean("didWhistle", this.didWhistle); nbt.setDouble("targetX", this.targetX); nbt.setDouble("targetY", this.targetY); nbt.setDouble("targetZ", this.targetZ); + + if(this.cargo != null) + nbt.setTag("cargo", this.cargo.writeToNBT(new NBTTagCompound())); } @Override public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); + this.dataWatcher.updateObject(10, nbt.getInteger("type")); this.shouldWhistle = nbt.getBoolean("shouldWhistle"); this.didWhistle = nbt.getBoolean("didWhistle"); this.targetX = nbt.getDouble("targetX"); this.targetY = nbt.getDouble("targetY"); this.targetZ = nbt.getDouble("targetZ"); + + NBTTagCompound compound = nbt.getCompoundTag("cargo"); + this.setCargo(ItemStack.loadItemStackFromNBT(compound)); } @Override @@ -238,6 +256,39 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa return 9.81 * 0.05; } + @Override + protected int groundDespawn() { + return cargo != null ? 0 : 1200; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean canAttackWithItem() { + return true; + } + + public void setCargo(ItemStack stack) { + this.cargo = stack; + } + + @Override + public boolean interactFirst(EntityPlayer player) { + + if(!worldObj.isRemote) { + if(this.cargo != null) { + player.inventory.addItemStackToInventory(this.cargo.copy()); + player.inventoryContainer.detectAndSendChanges(); + } + this.setDead(); + } + + return false; + } + @Override public RadarTargetType getTargetType() { return RadarTargetType.ARTILLERY; diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java index d211ce964..08c860a57 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java @@ -32,10 +32,6 @@ public abstract class EntityThrowableInterp extends EntityThrowableNT { public void onUpdate() { if(!worldObj.isRemote) { - int orientation = this.dataWatcher.getWatchableObjectInt(10); - if(orientation >= 6 && !this.inGround) { - this.dataWatcher.updateObject(10, orientation - 6); - } super.onUpdate(); } else { if(this.turnProgress > 0) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java index 86e57240b..608f999d5 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -226,8 +226,8 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { this.prevRotationYaw += 360.0F; } - //this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - //this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; float drag = this.getAirDrag(); double gravity = this.getGravityVelocity(); diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index bc473af93..46836a484 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -150,8 +150,8 @@ public abstract class GuiInfoContainer extends GuiContainer { minY = this.height - height - 6; } - this.zLevel = 300.0F; - itemRender.zLevel = 300.0F; + this.zLevel = 400.0F; + itemRender.zLevel = 400.0F; //int j1 = -267386864; int colorBg = 0xF0100010; this.drawGradientRect(minX - 3, minY - 4, minX + longestline + 3, minY - 3, colorBg, colorBg); @@ -193,6 +193,7 @@ public abstract class GuiInfoContainer extends GuiContainer { this.drawGradientRect(minX + indent - 1, minY - 1, minX + indent + 17, minY + 17, 0xffff0000, 0xffff0000); this.drawGradientRect(minX + indent, minY, minX + indent + 16, minY + 16, 0xffb0b0b0, 0xffb0b0b0); } + GL11.glEnable(GL11.GL_DEPTH_TEST); itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY); itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY, null); RenderHelper.disableStandardItemLighting(); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 078efd54c..32e0180c0 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -284,7 +284,7 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModBlocks.machine_well, 1), new AStack[] {new ComparableStack(ModBlocks.steel_scaffold, 20), new ComparableStack(ModBlocks.steel_beam, 8), new ComparableStack(ModItems.tank_steel, 2), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.pipes_steel, 3), new ComparableStack(ModItems.drill_titanium, 1), new ComparableStack(ModItems.wire_red_copper, 6), },250); makeRecipe(new ComparableStack(ModBlocks.machine_pumpjack, 1), new AStack[] {new ComparableStack(ModBlocks.steel_scaffold, 8), new OreDictStack(STEEL.block(), 8), new ComparableStack(ModItems.pipes_steel, 4), new ComparableStack(ModItems.tank_steel, 4), new OreDictStack(STEEL.ingot(), 24), new OreDictStack(STEEL.plate(), 16), new OreDictStack(AL.plate(), 6), new ComparableStack(ModItems.drill_titanium, 1), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.wire_red_copper, 8), },400); makeRecipe(new ComparableStack(ModBlocks.machine_flare, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 12), new OreDictStack(IRON.ingot(), 12), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.tank_steel, 1), new ComparableStack(ModBlocks.deco_pipe_quad, 8), new ComparableStack(ModItems.hull_small_steel, 4), new ComparableStack(ModItems.thermo_element, 3), },200); - makeRecipe(new ComparableStack(ModBlocks.machine_refinery, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate(), 20), new OreDictStack(CU.plate(), 16), new ComparableStack(ModItems.hull_big_steel, 6), new ComparableStack(ModItems.pipes_steel, 2), new ComparableStack(ModItems.coil_tungsten, 8), new ComparableStack(ModItems.wire_red_copper, 8), new ComparableStack(ModItems.circuit_copper, 2), new ComparableStack(ModItems.circuit_red_copper, 1), new ComparableStack(ModItems.plate_polymer, 8), },350); + makeRecipe(new ComparableStack(ModBlocks.machine_refinery, 1), new AStack[] {new OreDictStack(STEEL.plate(), 16), new OreDictStack(CU.plate(), 16), new ComparableStack(ModItems.hull_big_steel, 6), new ComparableStack(ModItems.pipes_steel, 2), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit_red_copper, 1) },350); makeRecipe(new ComparableStack(ModBlocks.machine_epress, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.pipes_steel, 1), new ComparableStack(ModItems.bolt_tungsten, 4), new ComparableStack(ModItems.coil_copper, 2), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit_copper, 1), new ComparableStack(ModItems.canister_full, 1, Fluids.LUBRICANT.getID()), },160); makeRecipe(new ComparableStack(ModBlocks.machine_chemplant, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.plate(), 6), new ComparableStack(ModItems.tank_steel, 4), new ComparableStack(ModItems.hull_big_steel, 1), new ComparableStack(ModItems.coil_tungsten, 3), new ComparableStack(ModItems.circuit_copper, 2), new ComparableStack(ModItems.circuit_red_copper, 1), new ComparableStack(ModItems.plate_polymer, 8), },200); makeRecipe(new ComparableStack(ModBlocks.machine_crystallizer, 1), new AStack[] {new ComparableStack(ModItems.hull_big_steel, 4), new ComparableStack(ModItems.pipes_steel, 1), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.blades_advanced_alloy, 2), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(TI.plate(), 16), new ComparableStack(Blocks.glass, 4), new ComparableStack(ModItems.circuit_gold, 1), },400); @@ -395,7 +395,7 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModBlocks.ams_limiter, 1), new AStack[] {new ComparableStack(ModItems.board_copper, 6), new OreDictStack(STEEL.plate(), 24), new ComparableStack(ModBlocks.steel_scaffold, 20), new ComparableStack(ModItems.crystal_diamond, 1)}, 600); makeRecipe(new ComparableStack(ModBlocks.ams_emitter, 1), new AStack[] {new ComparableStack(ModItems.board_copper, 24), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModBlocks.steel_scaffold, 40), new ComparableStack(ModItems.crystal_redstone, 5), new ComparableStack(ModBlocks.machine_lithium_battery)}, 600); makeRecipe(new ComparableStack(ModBlocks.ams_base, 1), new AStack[] {new ComparableStack(ModItems.board_copper, 12), new OreDictStack(STEEL.plate(), 28), new ComparableStack(ModBlocks.steel_scaffold, 30), new ComparableStack(ModBlocks.steel_grate, 8), new ComparableStack(ModBlocks.barrel_steel, 2)}, 600); - makeRecipe(new ComparableStack(ModBlocks.machine_radar, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.plate_polymer, 24), new ComparableStack(ModItems.magnetron, 10), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.coil_copper, 12), new ComparableStack(ModItems.crt_display, 4), },300); + makeRecipe(new ComparableStack(ModBlocks.machine_radar, 1), new AStack[] {new OreDictStack(STEEL.plate(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.plate_polymer, 24), new ComparableStack(ModItems.magnetron, 10), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.coil_copper, 12), new ComparableStack(ModItems.crt_display, 4), },300); makeRecipe(new ComparableStack(ModBlocks.machine_forcefield, 1), new AStack[] {new OreDictStack(ALLOY.plate(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit_targeting_tier5, 1), new ComparableStack(ModBlocks.machine_transformer, 1), },1000); makeRecipe(new ComparableStack(ModItems.mp_thruster_10_kerosene, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModBlocks.deco_pipe_quad, 1), new OreDictStack(W.ingot(), 4), new OreDictStack(STEEL.plate(), 4), },100); makeRecipe(new ComparableStack(ModItems.mp_thruster_10_solid, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.coil_tungsten, 1), new OreDictStack(DURA.ingot(), 4), new OreDictStack(STEEL.plate(), 4), },100); @@ -750,6 +750,35 @@ public class AssemblerRecipes { new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); + makeRecipe(new ComparableStack(ModBlocks.turret_himars, 1), new AStack[] { + new ComparableStack(ModBlocks.machine_battery, 1), + new OreDictStack(STEEL.ingot(), 128), + new OreDictStack(DURA.ingot(), 64), + new OreDictStack(ANY_PLASTIC.ingot(), 64), + new ComparableStack(ModItems.motor_desh, 5), + new ComparableStack(ModItems.circuit_targeting_tier4, 3), + new ComparableStack(ModItems.mechanism_launcher_2, 5), + new ComparableStack(ModBlocks.machine_radar, 1), + new ComparableStack(ModItems.crt_display, 1) + }, 300); + + makeRecipe(new ComparableStack(ModItems.ammo_himars, 1, 0), new AStack[] { + new OreDictStack(STEEL.plate(), 24), + new OreDictStack(ANY_PLASTIC.ingot(), 12), + new OreDictStack(ANY_SMOKELESS.dust(), 48), + new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 6), + new ComparableStack(ModItems.circuit_copper, 6), + new ComparableStack(ModItems.wire_gold, 12) + }, 100); + + makeRecipe(new ComparableStack(ModItems.ammo_himars, 1, 1), new AStack[] { + new OreDictStack(STEEL.plate(), 24), + new OreDictStack(ANY_PLASTIC.ingot(), 6), + new OreDictStack(ANY_SMOKELESS.dust(), 36), + new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), + new ComparableStack(ModItems.circuit_red_copper, 2), + new ComparableStack(ModItems.wire_gold, 8) + }, 100); makeRecipe(new ComparableStack(ModBlocks.machine_silex, 1), new AStack[] { new ComparableStack(Blocks.glass, 12), diff --git a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java index e770043aa..4152a9c40 100644 --- a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java @@ -28,9 +28,6 @@ public class MachineRecipes { //return: FluidType, amount produced, amount required, heat required (°C * 100) public static Object[] getBoilerOutput(FluidType type) { - if(type == Fluids.WATER) return new Object[] { Fluids.STEAM, 500, 5, 10000 }; - if(type == Fluids.STEAM) return new Object[] { Fluids.HOTSTEAM, 5, 50, 30000 }; - if(type == Fluids.HOTSTEAM) return new Object[] { Fluids.SUPERHOTSTEAM, 5, 50, 45000 }; if(type == Fluids.OIL) return new Object[] { Fluids.HOTOIL, 5, 5, 35000 }; if(type == Fluids.CRACKOIL) return new Object[] { Fluids.HOTCRACKOIL, 5, 5, 35000 }; diff --git a/src/main/java/com/hbm/items/tool/ItemOilDetector.java b/src/main/java/com/hbm/items/tool/ItemOilDetector.java index ce1c5fa0c..45d41af10 100644 --- a/src/main/java/com/hbm/items/tool/ItemOilDetector.java +++ b/src/main/java/com/hbm/items/tool/ItemOilDetector.java @@ -3,13 +3,16 @@ package com.hbm.items.tool; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.PlayerInformPacket; +import com.hbm.util.ChatBuilder; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; @@ -77,17 +80,17 @@ public class ItemOilDetector extends Item { oil = true; if(!world.isRemote) { - + if(direct) { - player.addChatMessage(new ChatComponentTranslation(this.getUnlocalizedName() + ".bullseye").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.DARK_GREEN))); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation(this.getUnlocalizedName() + ".bullseye").color(EnumChatFormatting.DARK_GREEN).flush(), MainRegistry.proxy.ID_DETONATOR), (EntityPlayerMP) player); } else if(oil) { - player.addChatMessage(new ChatComponentTranslation(this.getUnlocalizedName() + ".detected").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GOLD))); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation(this.getUnlocalizedName() + ".detected").color(EnumChatFormatting.GOLD).flush(), MainRegistry.proxy.ID_DETONATOR), (EntityPlayerMP) player); } else { - player.addChatMessage(new ChatComponentTranslation(this.getUnlocalizedName() + ".noOil").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation(this.getUnlocalizedName() + ".noOil").color(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_DETONATOR), (EntityPlayerMP) player); } } - world.playSoundAtEntity(player, "hbm:item.techBleep", 1.0F, 1.0F); + world.playSoundAtEntity(player, "hbm:item.techBleep", 1.0F, 1.0F); player.swingItem(); diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java index 24aefdb0e..29ef557c4 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -121,10 +121,20 @@ public class ItemAmmoArty extends Item { list.add(r + "(that is the best skull and crossbones"); list.add(r + "minecraft's unicode has to offer)"); break; + case CARGO: + + if(stack.hasTagCompound() && stack.stackTagCompound.getCompoundTag("cargo") != null) { + ItemStack cargo = ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("cargo")); + list.add(y + cargo.getDisplayName()); + } else { + list.add(r + "Empty"); + } + break; } } - + private IIcon[] icons = new IIcon[itemTypes.length]; + private IIcon iconCargo; @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister reg) { @@ -134,6 +144,18 @@ public class ItemAmmoArty extends Item { for(int i = 0; i < icons.length; i++) { this.icons[i] = reg.registerIcon(RefStrings.MODID + ":" + itemTypes[i].name); } + + this.iconCargo = reg.registerIcon(RefStrings.MODID + ":ammo_arty_cargo_full"); + } + + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack stack) { + + if(stack.getItemDamage() == CARGO && stack.hasTagCompound() && stack.stackTagCompound.getCompoundTag("cargo") != null) { + return this.iconCargo; + } + + return this.getIconFromDamage(stack.getItemDamage()); } @Override diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java index 4809a7c80..0a76f7cd9 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -32,6 +32,7 @@ public class ItemAmmoHIMARS extends Item { this.setHasSubtypes(true); this.setCreativeTab(MainRegistry.weaponTab); this.setTextureName(RefStrings.MODID + ":ammo_rocket"); + this.setMaxStackSize(1); init(); } diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 7039d641b..4b6627a13 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4375)"; + public static final String VERSION = "1.0.27 BETA (4389)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 3bd5870e2..dedc6be3e 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -384,6 +384,7 @@ public class ClientProxy extends ServerProxy { //templates MinecraftForgeClient.registerItemRenderer(ModItems.assembly_template, new ItemRenderTemplate()); MinecraftForgeClient.registerItemRenderer(ModItems.chemistry_template, new ItemRenderTemplate()); + MinecraftForgeClient.registerItemRenderer(ModItems.crucible_template, new ItemRenderTemplate()); //hot stuff MinecraftForgeClient.registerItemRenderer(ModItems.ingot_steel_dusted, new ItemRendererHot()); MinecraftForgeClient.registerItemRenderer(ModItems.ingot_chainsteel, new ItemRendererHot()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 98a15001b..6b1bbd525 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -2,7 +2,6 @@ package com.hbm.main; import java.util.ArrayList; import java.util.List; -import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockGenericStairs; @@ -59,10 +58,12 @@ public class CraftingManager { GameRegistry.addRecipe(new RBMKFuelCraftingHandler()); GameRegistry.addRecipe(new MKUCraftingHandler()); GameRegistry.addRecipe(new ToolboxCraftingHandler()); + GameRegistry.addRecipe(new CargoShellCraftingHandler()); //TODO: find out what this actually did RecipeSorter.register("hbm:rbmk", RBMKFuelCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); RecipeSorter.register("hbm:toolbox", ToolboxCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); + RecipeSorter.register("hbm:cargo", CargoShellCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); RecipeSorter.register("hbm:mku", MKUCraftingHandler.class, RecipeSorter.Category.SHAPED, "after:minecraft:shaped before:minecraft:shapeless"); } diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index 56032d009..717ec9cd5 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -1360,8 +1360,9 @@ public class ItemRenderLibrary { renderers.put(ModItems.ammo_himars, new ItemRenderBase( ) { public void renderInventory() { - GL11.glTranslated(0, -2.5, 0); - GL11.glScaled(4, 4, 4); + GL11.glTranslated(0, -2, 0); + double scale = 2.75D; + GL11.glScaled(scale, scale, scale); GL11.glRotated(System.currentTimeMillis() % 3600 / 10D, 0, 1, 0); } public void renderCommonWithStack(ItemStack item) { @@ -1370,7 +1371,20 @@ public class ItemRenderLibrary { GL11.glRotated(90, 1, 0, 0); HIMARSRocket type = ItemAmmoHIMARS.itemTypes[item.getItemDamage()]; GL11.glShadeModel(GL11.GL_SMOOTH); - bindTexture(type.texture); ResourceManager.turret_himars.renderPart(type.modelType == 0 ? "RocketStandard" : "RocketSingle"); + bindTexture(type.texture); + if(type.modelType == 0) { + GL11.glTranslated(0.75, 0, 0); + ResourceManager.turret_himars.renderPart("RocketStandard"); + GL11.glTranslated(-1.5, 0, 0); + GL11.glTranslated(0, -3.375D, 0); + ResourceManager.turret_himars.renderPart("TubeStandard"); + } else { + GL11.glTranslated(0.75, 0, 0); + ResourceManager.turret_himars.renderPart("RocketSingle"); + GL11.glTranslated(-1.5, 0, 0); + GL11.glTranslated(0, -3.375D, 0); + ResourceManager.turret_himars.renderPart("TubeSingle"); + } GL11.glShadeModel(GL11.GL_FLAT); }}); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 2f6a15989..91a84d522 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -266,7 +266,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro CrucibleRecipe recipe = getLoadedRecipe(); for(MaterialStack material : materials) { - boolean mainStack = recipe != null && getQuantaFromType(recipe.input, material.material) > 0; + boolean mainStack = recipe != null && (getQuantaFromType(recipe.input, material.material) > 0 || getQuantaFromType(recipe.output, material.material) > 0); if(mainStack) { this.addToStack(this.recipeStack, material); @@ -359,6 +359,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro //this allows pouring the ouput material back into the crucible if(recipe != null && getQuantaFromType(recipe.output, mat.material) > 0) { recipeAmount += mat.amount; + matchesRecipe = true; continue; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java index dacc1993f..40e65db2a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -63,7 +63,6 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IFluid if(this.tanks[1].getFill() > 0) { this.sendFluid(); - fillFluidInit(tanks[1].getTankType()); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 4cccb4016..aae146248 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -272,7 +272,7 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser slots[1].stackSize--; - if(slots[1].stackSize <=0) + if(slots[1].stackSize <= 0) slots[1] = null; this.markDirty(); @@ -286,7 +286,16 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return new int[] { 2, 4 }; + return new int[] { 1, 2, 4 }; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + + if(i == 1 && BreederRecipes.getOutput(itemStack) != null) + return true; + + return false; } private void produceByproduct() { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index ed3c69a31..3f17d439b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -173,6 +173,8 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM if(rod.getStackInSlot(0) != null && rod.getStackInSlot(0).getItem() instanceof ItemRBMKRod) { rod.receiveFlux(stream, flux); return 0; + } else { + return flux; } } @@ -190,7 +192,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM return 0; } - //set neutrons to slow + //multiply neutron count with rod setting if(te instanceof TileEntityRBMKControl) { TileEntityRBMKControl control = (TileEntityRBMKControl)te; @@ -227,7 +229,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM int hits = 0; for(int h = 0; h <= limit; h++) { - if(!worldObj.getBlock(x, y, z).isOpaqueCube()) + if(!worldObj.getBlock(x, y + h, z).isOpaqueCube()) hits++; } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java b/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java index 4308103a6..0949504e7 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java @@ -30,7 +30,7 @@ public class TileEntityConverterRfHe extends TileEntityLoadedBase implements IEn } private long subBuffer; - private boolean recursionBrake = false;; + private boolean recursionBrake = false; @Untested @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index cfc551c83..4ad7a19ee 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -160,17 +160,17 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen return mode == MODE_CANNON ? 20D : 50D; } - public int getShellLoaded() { + public ItemStack getShellLoaded() { for(int i = 1; i < 10; i++) { if(slots[i] != null) { if(slots[i].getItem() == ModItems.ammo_arty) { - return slots[i].getItemDamage(); + return slots[i]; } } } - return -1; + return null; } public void conusmeAmmo(Item ammo) { @@ -185,7 +185,7 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen this.markDirty(); } - public void spawnShell(int type) { + public void spawnShell(ItemStack type) { Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); @@ -196,7 +196,15 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, 0.0F, 0.0F); proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, (float) getV0(), 0.0F); proj.setTarget((int) tPos.xCoord, (int) tPos.yCoord, (int) tPos.zCoord); - proj.setType(type); + proj.setType(type.getItemDamage()); + + if(type.getItemDamage() == 8 && type.hasTagCompound()) { + NBTTagCompound cargo = type.stackTagCompound.getCompoundTag("cargo"); + + if(cargo != null) { + proj.setCargo(ItemStack.loadItemStackFromNBT(cargo)); + } + } if(this.mode != this.MODE_CANNON) proj.setWhistle(true); @@ -353,9 +361,9 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen if(timer % delay == 0) { - int conf = this.getShellLoaded(); + ItemStack conf = this.getShellLoaded(); - if(conf != -1) { + if(conf != null) { this.spawnShell(conf); this.conusmeAmmo(ModItems.ammo_arty); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.jeremy_fire", 25.0F, 1.0F); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index 58c0afe31..6e57f56b5 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -68,17 +68,17 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem @Override public double getBarrelLength() { - return 3D; + return 0.5D; } @Override public double getAcceptableInaccuracy() { - return 0; + return 5D; //they're guided missiles so who gives a shit } @Override public double getHeightOffset() { - return 3D; + return 5D; } @Override @@ -303,7 +303,7 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem if(this.hasAmmo() && this.tPos != null) { this.spawnShell(this.typeLoaded); this.ammo--; - this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.jeremy_fire", 25.0F, 1.0F); + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.rocketFlame", 25.0F, 1.0F); } if(this.mode == this.MODE_MANUAL && !this.targetQueue.isEmpty()) { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 6ff8568b3..5f43b32ef 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -10,7 +10,7 @@ achievement.bossMeltdown.desc=Mehr schlecht als recht, aber was will man machen. achievement.bossMeltdown=3,6 Röntgen achievement.bossWorm.desc=Der Fabstaff. Mein Arsch. Jetzt fang an zu rechnen. achievement.bossWorm=Disassembling Balls-O-Tron -achievement.bossUFO.desc=Yo, what do we have here? A huge spacecraft pulling up to the bloockship? +achievement.bossUFO.desc=Yo, what do we have here? A huge spacecraft pulling up to the blockship? achievement.bossUFO=Ayy Lmao achievement.c20_5.desc=??? achievement.c20_5=Kapitel [ZWANZIG KOMMA FÜNF] @@ -76,8 +76,8 @@ achievement.space.desc=Scheitere in jeder möglichen Weise und verschwende 90 Mi achievement.space=Die finale Grenz-ach vergiss es achievement.tasteofblood.desc=ist nicht Teil des Testprotokolls. achievement.tasteofblood=Der Geschmack von Blut -achievement.witchtaunter.desc=Diese komischen Kraturen können dir garnichts! -achievement.witchtaunter=Hexen verstpotten +achievement.witchtaunter.desc=Diese komischen Kreaturen können dir garnichts! +achievement.witchtaunter=Hexen verspotten armor.blastProtection=Explosionsmodifikator: %s armor.cap=Schadensobergrenze: %s @@ -385,6 +385,7 @@ container.turretArty=Greg container.turretChekhov=Tschechows Gewehr container.turretFriendly=Mister Friendly container.turretFritz=Fritz +container.turretHIMARS=Henry container.turretHoward=Howard container.turretJeremy=Jeremy container.turretMaxwell=Maxwell @@ -752,6 +753,7 @@ item.ammo_9mm_chlorophyte.name=9mm Patrone (Grünalgen) item.ammo_9mm_du.name=9mm Patrone (DU) item.ammo_9mm_rocket.name=9mm Rakete item.ammo_arty.name=16" Artilleriegranate +item.ammo_arty_cargo.name=16" Artilleriegranate (Expresslieferung) item.ammo_arty_classic.name=16" Artilleriegranate (Das Factorio-Spezial) item.ammo_arty_he.name=16" Artilleriegranate (HE) item.ammo_arty_mini_nuke.name=16" Mikroatomgranate @@ -787,6 +789,8 @@ item.ammo_grenade_phosphorus.name=40mm Granate (WP) item.ammo_grenade_sleek.name=40mm Granate (IF-F&E) item.ammo_grenade_toxic.name=40mm Granate (Chemisch) item.ammo_grenade_tracer.name=40mm Übungsgranate +item.ammo_himars_standard.name=M28 gelenkte Artillerierakete +item.ammo_himars_single.name=M39A1 gelenkte Artillerierakete item.ammo_mirv.name=Mini-MIRV item.ammo_mirv_high.name=Mini-MIRV (Stark) item.ammo_mirv_low.name=Mini-MIRV (Schwach) @@ -3175,18 +3179,26 @@ tile.bomber.name=Abgestürtzer Bomber tile.book_guide.name=Hbm's Nuclear Tech Mod Handbuch [LEGACY] tile.boxcar.name=Güterwagon tile.brick_asbestos.name=Asbestziegel +tile.brick_asbestos_stairs.name=Asbestziegeltreppe tile.brick_compound.name=Verstärkter Verbund +tile.brick_compound_stairs.name=Verbundtreppe tile.brick_concrete.name=Betonziegel +tile.brick_concrete_stairs.name=Concrete Brick Stairs tile.brick_concrete_broken.name=Gebrochene Betonziegel +tile.brick_concrete_broken_stairs.name=Gebrochene Betonziegeltreppe tile.brick_concrete_cracked.name=Rissige Betonziegel +tile.brick_concrete_cracked_stairs.name=Rissige Betonziegeltreppe tile.brick_concrete_marked.name=Beschriebene Betonziegel tile.brick_concrete_mossy.name=Bemooste Betonziegel -tile.brick_ducrete.name=Ducrete-Ziegel +tile.brick_concrete_mossy.name=Bemooste Betonziegeltreppe +tile.brick_ducrete.name=Ducreteziegel +tile.brick_ducrete_stairs.name=Ducreteziegeltreppe tile.brick_dungeon.name=Berzelianitziegel tile.brick_dungeon_circle.name=Berzelianitkreis tile.brick_dungeon_flat.name=Berzelianitblock tile.brick_dungeon_tile.name=Berzelianitfliese tile.brick_fire.name=Schamottsteinziegel +tile.brick_fire_stairs.name=Schamottsteintreppe tile.brick_jungle.name=Enargitziegel tile.brick_jungle_circle.name=Mechanistenzirkel tile.brick_jungle_cracked.name=Rissige Enargitziegel @@ -3197,7 +3209,16 @@ tile.brick_jungle_mystic.name=Arkane Enargitziegel tile.brick_jungle_ooze.name=Radioaktive Enargitziegel tile.brick_jungle_trap.name=Enargit-Falle tile.brick_light.name=Helle Ziegel +tile.brick_light_stairs.name=Helle Ziegeltreppe tile.brick_obsidian.name=Obsidianziegel +tile.brick_obsidian_stairs.name=Obsidianziegeltreppe +tile.brick_slab.brick_asbestos.name=Asbestziegelstufe +tile.brick_slab.brick_compound.name=Verbundstufe +tile.brick_slab.brick_fire.name=Schamottsteinstufe +tile.brick_slab.brick_light.name=Helle Ziegelstufe +tile.brick_slab.brick_obsidian.name=Obsidianziegelstufe +tile.brick_slab.reinforced_brick.name=Verstärkte Steinstufe +tile.brick_slab.reinforced_stone.name=Verdichtete Steinstufe tile.broadcaster_pc.name=Korrupter Sender tile.burning_earth.name=Brennendes Gras tile.c4.name=C4 @@ -3224,6 +3245,12 @@ tile.cmb_brick_reinforced.name=Verstärkte CMB-Ziegel tile.compact_launcher.name=Kompakt-Startrampe tile.concrete.name=Betonfliese tile.concrete_asbestos.name=Asbestbeton +tile.concrete_asbestos_stairs.name=Asbestbetontreppe +tile.concrete_brick_slab.brick_concrete.name=Betonziegelstufe +tile.concrete_brick_slab.brick_concrete_broken.name=Rissige Betonziegelstufe +tile.concrete_brick_slab.brick_concrete_cracked.name=Gebrochene Betonziegelstufe +tile.concrete_brick_slab.brick_concrete_mossy.name=Bemooste Betonziegelstufe +tile.concrete_brick_slab.brick_ducrete.name=Ducreteziegelstufe tile.concrete_colored.black.name=Schwarzer Beton tile.concrete_colored.blue.name=Blauer Beton tile.concrete_colored.brown.name=Brauner Beton @@ -3241,7 +3268,14 @@ tile.concrete_colored.silver.name=Hellgrauer Beton tile.concrete_colored.white.name=Weißer Beton tile.concrete_colored.yellow.name=Gelber Beton tile.concrete_pillar.name=Stahlbetonsäule +tile.concrete_slab.concrete.name=Betonfliesenstufe +tile.concrete_slab.concrete_asbestos.name=Asbestbetonstufe +tile.concrete_slab.concrete_smooth.name=Betonstufe +tile.concrete_slab.ducrete.name=Ducretefliesenstufe +tile.concrete_slab.ducrete_smooth.name=Ducretestufe tile.concrete_smooth.name=Beton +tile.concrete_stairs.name=Betonfliesentreppe +tile.concrete_smooth_stairs.name=Betontreppe tile.concrete_super.name=Super Beton tile.concrete_super_broken.name=Schimmliger Schutt tile.conveyor.name=Förderband @@ -3324,8 +3358,10 @@ tile.dfc_stabilizer.name=DFC-Stabilisator tile.dirt_dead.name=Tote Erde tile.dirt_oily.name=Ölige Erde tile.drill_pipe.name=Bohrgestänge -tile.ducrete.name=Ducrete-Fliese +tile.ducrete.name=Ducretefliese +tile.ducrete_stairs.name=Ducretefliesentreppe tile.ducrete_smooth.name=Ducrete +tile.ducrete_smooth_stairs.name=Ducretetreppe tile.dummy_block.name=Dummyblock tile.dummy_port.name=Dummyblock (Stromanschluss) tile.dungeon_chain.name=Metallkette @@ -3469,6 +3505,7 @@ tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energiespeicherblock tile.machine_battery_potato.name=Kartoffelbatterieblock tile.machine_boiler.name=Boiler +tile.machine_boiler.desc=Großer Boiler zum Verdampfen von Wasser oder$Erhitzen von Öl. Benötigt externe Hitzequelle.$Wärmestransferrate: ΔT*0.01 TU/t tile.machine_boiler_electric_off.name=Elektrischer Boiler tile.machine_boiler_electric_on.name=Elektrischer Boiler tile.machine_boiler_off.name=Dampfkessel @@ -3743,6 +3780,7 @@ tile.red_pylon.name=Strommasten tile.red_pylon_large.name=Hochspannungsmasten tile.red_wire_coated.name=Geschirmtes rotes Kupferkabel tile.reinforced_brick.name=Verstärkter Stein +tile.reinforced_brick_stairs.name=Verstärkte Steintreppe tile.reinforced_ducrete.name=Verstärkter Ducrete tile.reinforced_glass.name=Verstärktes Glas tile.reinforced_lamp_off.name=Verstärkte Lampe @@ -3750,6 +3788,7 @@ tile.reinforced_lamp_on.name=Verstärkte Lampe tile.reinforced_light.name=Verstärkter Glowstone tile.reinforced_sand.name=Verstärkter Sandstein tile.reinforced_stone.name=Verdichteter Stein +tile.reinforced_stone_stairs.name=Verdichtete Steintreppe tile.rejuvinator.name=Regenerationsmaschine tile.residue.name=Wolkenrückstände tile.safe.name=Panzerschrank @@ -3835,6 +3874,7 @@ tile.turret_cwis.name=Phalanx Mk-15 CIWS tile.turret_flamer.name=Flammenwerfergeschütz tile.turret_friendly.name=Gatlingeschütz "Mister Friendly" tile.turret_fritz.name=Schwered Flammenwerfergeschütz "Fritz" +tile.turret_himars.name=Raketenartilleriegeschütz "Henry" tile.turret_heavy.name=Schweres MG-Geschütz tile.turret_howard.name=Goalkeeper-Zwilling CIWS "Howard" tile.turret_howard_damaged.name=Goalkeeper-Zwilling CIWS "turret_howard_damaged" diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e7dee54f0..94bca60ad 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -576,6 +576,7 @@ container.turretArty=Greg container.turretChekhov=Chekhov's Gun container.turretFriendly=Mister Friendly container.turretFritz=Fritz +container.turretHIMARS=Henry container.turretHoward=Howard container.turretJeremy=Jeremy container.turretMaxwell=Maxwell @@ -980,6 +981,7 @@ item.ammo_9mm_chlorophyte.name=9mm Round (Chlorophyte) item.ammo_9mm_du.name=9mm Round (DU) item.ammo_9mm_rocket.name=9mm Rocket item.ammo_arty.name=16" Artillery Shell +item.ammo_arty_cargo.name=16" Express Delivery Artillery Shell item.ammo_arty_classic.name=16" Artillery Shell (The Factorio Special) item.ammo_arty_he.name=16" High Explosive Artillery Shell item.ammo_arty_mini_nuke.name=16" Micro Nuclear Artillery Shell @@ -1015,6 +1017,8 @@ item.ammo_grenade_phosphorus.name=40mm Grenade (WP) item.ammo_grenade_sleek.name=40mm Grenade (IF-R&D) item.ammo_grenade_toxic.name=40mm Grenade (Chemical) item.ammo_grenade_tracer.name=40mm Training Grenade +item.ammo_himars_standard.name=M28 Guided Artillery Rocket Pod +item.ammo_himars_single.name=M39A1 Guided Artillery Rocket Pod item.ammo_mirv.name=Mini MIRV item.ammo_mirv_high.name=Mini MIRV (High Yield) item.ammo_mirv_low.name=Mini MIRV (Low Yield) @@ -3612,18 +3616,26 @@ tile.bomber.name=Crashed Bomber tile.book_guide.name=Hbm's Nuclear Tech Mod Manual [LEGACY] tile.boxcar.name=Boxcar tile.brick_asbestos.name=Asbestos Bricks +tile.brick_asbestos_stairs.name=Asbestos Brick Stairs tile.brick_compound.name=Compound Mesh +tile.brick_compound_stairs.name=Compound Mesh Stairs tile.brick_concrete.name=Concrete Bricks +tile.brick_concrete_stairs.name=Concrete Brick Stairs tile.brick_concrete_broken.name=Broken Concrete Bricks +tile.brick_concrete_broken_stairs.name=Broken Concrete Brick Stairs tile.brick_concrete_cracked.name=Cracked Concrete Bricks +tile.brick_concrete_cracked_stairs.name=Cracked Concrete Brick Stairs tile.brick_concrete_marked.name=Marked Concrete Bricks tile.brick_concrete_mossy.name=Mossy Concrete Bricks +tile.brick_concrete_mossy_stairs.name=Mossy Concrete Brick Stairs tile.brick_ducrete.name=Ducrete Bricks +tile.brick_ducrete_stairs.name=Ducrete Brick Stairs tile.brick_dungeon.name=Berzelianite Bricks tile.brick_dungeon_circle.name=Berzelianite Cirlce tile.brick_dungeon_flat.name=Berzelianite Block tile.brick_dungeon_tile.name=Berzelianite Tile tile.brick_fire.name=Firebricks +tile.brick_fire_stairs.name=Firebrick Stairs tile.brick_jungle.name=Enargite Bricks tile.brick_jungle_circle.name=Mechanist's Circle tile.brick_jungle_cracked.name=Cracked Enargite Bricks @@ -3634,7 +3646,16 @@ tile.brick_jungle_mystic.name=Arcane Enargite Bricks tile.brick_jungle_ooze.name=Radioactive Enargite Bricks tile.brick_jungle_trap.name=Trapped Enargite Bricks tile.brick_light.name=Light Bricks +tile.brick_light_stairs.name=Light Bricks Stairs tile.brick_obsidian.name=Obsidian Bricks +tile.brick_obsidian_stairs.name=Obsidian Brick Stairs +tile.brick_slab.brick_asbestos.name=Asbestos Brick Slab +tile.brick_slab.brick_compound.name=Compound Mesh Slab +tile.brick_slab.brick_fire.name=Firebrick Slab +tile.brick_slab.brick_light.name=Light Brick Slab +tile.brick_slab.brick_obsidian.name=Obsidian Brick Slab +tile.brick_slab.reinforced_brick.name=Reinforced Stone Slab +tile.brick_slab.reinforced_stone.name=Dense Stone Slab tile.broadcaster_pc.name=Corrupted Broadcaster tile.burning_earth.name=Burning Grass tile.c4.name=C-4 @@ -3661,6 +3682,12 @@ tile.cmb_brick_reinforced.name=Reinforced CMB Bricks tile.compact_launcher.name=Compact Launch Pad tile.concrete.name=Concrete Tile tile.concrete_asbestos.name=Asbestos Concrete +tile.concrete_asbestos_stairs.name=Asbestos Concrete Stairs +tile.concrete_brick_slab.brick_concrete.name=Concrete Brick Slab +tile.concrete_brick_slab.brick_concrete_broken.name=Broken Concrete Brick Slab +tile.concrete_brick_slab.brick_concrete_cracked.name=Cracked Concrete Brick Slab +tile.concrete_brick_slab.brick_concrete_mossy.name=Mossy Concrete Brick Slab +tile.concrete_brick_slab.brick_ducrete.name=Ducrete Brick Slab tile.concrete_colored.black.name=Black Concrete tile.concrete_colored.blue.name=Blue Concrete tile.concrete_colored.brown.name=Brown Concrete @@ -3678,7 +3705,14 @@ tile.concrete_colored.silver.name=Light Gray Concrete tile.concrete_colored.white.name=White Concrete tile.concrete_colored.yellow.name=Yellow Concrete tile.concrete_pillar.name=Rebar Reinforced Concrete Pillar -tile.concrete_smooth.name=Concrete +tile.concrete_slab.concrete.name=Concrete Tile Slab +tile.concrete_slab.concrete_asbestos.name=Asbestos Concrete Slab +tile.concrete_slab.concrete_smooth.name=Concrete Slab +tile.concrete_slab.ducrete.name=Ducrete Tile Slab +tile.concrete_slab.ducrete_smooth.name=Ducrete Slab +tile.concrete_smooth.name=Concrete Stairs +tile.concrete_smooth_stairs.name=Concrete +tile.concrete_stairs.name=Concrete Tile Stairs tile.concrete_super.name=Über Concrete tile.concrete_super_broken.name=Moldy Debris tile.conveyor.name=Conveyor Belt @@ -3763,7 +3797,9 @@ tile.dirt_dead.name=Dead Dirt tile.dirt_oily.name=Oily Dirt tile.drill_pipe.name=Drill Pipe tile.ducrete.name=Ducrete Tile +tile.ducrete_stairs.name=Ducrete Tile Stairs tile.ducrete_smooth.name=Ducrete +tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain @@ -3907,6 +3943,7 @@ tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energy Storage Block tile.machine_battery_potato.name=Potato Battery Block tile.machine_boiler.name=Boiler +tile.machine_boiler.desc=Large boiler that can boil water or heat up oil.$Requires external heat source.$Heat transfer rate: ΔT*0.01 TU/t tile.machine_boiler_electric_off.name=Electric Boiler tile.machine_boiler_electric_on.name=Electric Boiler tile.machine_boiler_off.name=Boiler @@ -4184,6 +4221,7 @@ tile.red_pylon.name=Electricity Pole tile.red_pylon_large.name=Large Electricity Pylon tile.red_wire_coated.name=Coated Red Copper Cable tile.reinforced_brick.name=Reinforced Stone +tile.reinforced_brick_stairs.name=Reinforced Stone Stairs tile.reinforced_ducrete.name=Reinforced Ducrete tile.reinforced_glass.name=Reinforced Glass tile.reinforced_lamp_off.name=Reinforced Lamp @@ -4191,6 +4229,7 @@ tile.reinforced_lamp_on.name=Reinforced Lamp tile.reinforced_light.name=Reinforced Glowstone tile.reinforced_sand.name=Reinforced Sandstone tile.reinforced_stone.name=Dense Stone +tile.reinforced_stone_stairs.name=Dense Stone Stairs tile.rejuvinator.name=Rejuvination Device tile.residue.name=Cloud Residue tile.safe.name=Safe @@ -4277,6 +4316,7 @@ tile.turret_flamer.name=Flamethrower Turret tile.turret_friendly.name=Chaingun Turret "Mister Friendly" tile.turret_fritz.name=Heavy Flamethrower Turret "Fritz" tile.turret_heavy.name=Heavy Machine Gun Turret +tile.turret_himars.name=Rocket Artillery Turret "Henry" tile.turret_howard.name=Goalkeeper Twin Chaingun CIWS "Howard" tile.turret_howard_damaged.name=Goalkeeper Twin Chaingun CIWS "Methusalem" tile.turret_jeremy.name=Autocannon Turret "Jeremy" diff --git a/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo.png b/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo.png index 471ce714d9996b35882e5f6460c8352ac4fd1102..1e5b2b28734bc1be00e7756427c5aaf3fd5b41cc 100644 GIT binary patch delta 323 zcmV-J0lfaV0__5jGk*ajNkljsiGa#oSI5cmw{oeQg?>9`SqA2Xxo9H)at*NR? z^c$2?R!T_}MQk=3F$By2cDo%~YoaJZDP{9K?-c907RDH~)_-0nqOW3%p>10LvMdAW z94V!2UDtjGPDM)DJv2=Nz}@Z2x*lH!v;M&t(cZI&f z_8{0F&pK`$=RDL4m;#aEkE>C@B}f>YfRPM_HO%DYBj9oUCME;m_wTHqUMJ68tZ$c= VkE^20c#Z%7002ovPDHLkV1nWMl|cXi delta 269 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 b&Rsr@#JtStOkv!wA7>j2dvmhs^?&{cB{c{h diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index d99a28e57..3041f9144 100755 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "hbm", "name": "Hbm's Nuclear Tech", "description": "A mod that adds weapons, nuclear themed stuff and machines", - "version":"1.0.27_X4375", + "version":"1.0.27_X4389", "mcversion": "1.7.10", "url": "", "updateUrl": "", From 5f33fa8ee6e69f997c168200c6a00de4f26efeee Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 16 Oct 2022 18:37:21 +0200 Subject: [PATCH 111/111] i suffer --- .../com/hbm/tileentity/machine/TileEntityMachineBoiler.java | 4 ++-- .../tileentity/machine/TileEntityMachineBoilerElectric.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java index 54f3691a0..a9c4ac349 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java @@ -42,8 +42,8 @@ public class TileEntityMachineBoiler extends TileEntity implements ISidedInvento public TileEntityMachineBoiler() { slots = new ItemStack[7]; tanks = new FluidTank[2]; - tanks[0] = new FluidTank(Fluids.WATER, 8000, 0); - tanks[1] = new FluidTank(Fluids.STEAM, 8000, 1); + tanks[0] = new FluidTank(Fluids.OIL, 8000, 0); + tanks[1] = new FluidTank(Fluids.HOTOIL, 8000, 1); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java index b475f959e..4a7323227 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java @@ -48,8 +48,8 @@ public class TileEntityMachineBoilerElectric extends TileEntityLoadedBase implem public TileEntityMachineBoilerElectric() { slots = new ItemStack[7]; tanks = new FluidTank[2]; - tanks[0] = new FluidTank(Fluids.WATER, 16000, 0); - tanks[1] = new FluidTank(Fluids.STEAM, 16000, 1); + tanks[0] = new FluidTank(Fluids.OIL, 16000, 0); + tanks[1] = new FluidTank(Fluids.HOTOIL, 16000, 1); } @Override